122 lines
4.4 KiB
Python
122 lines
4.4 KiB
Python
|
import textwrap
|
||
|
|
||
|
from django.utils import timezone
|
||
|
from django.utils.translation import ugettext_lazy as _
|
||
|
|
||
|
from orchestra.apps.orchestration import ServiceController
|
||
|
from orchestra.apps.resources import ServiceMonitor
|
||
|
|
||
|
from . import settings
|
||
|
|
||
|
# TODO create a base backend for SystemUsers!
|
||
|
|
||
|
class MainUserBackend(ServiceController):
|
||
|
verbose_name = _("Main user")
|
||
|
model = 'accounts.Account'
|
||
|
ignore_fields = ['last_login']
|
||
|
|
||
|
def save(self, user):
|
||
|
context = self.get_context(user)
|
||
|
self.append(textwrap.dedent("""
|
||
|
if [[ $( id %(username)s ) ]]; then
|
||
|
usermod --password '%(password)s' %(username)s
|
||
|
else
|
||
|
useradd %(username)s --password '%(password)s' --shell %(shell)s
|
||
|
fi
|
||
|
mkdir -p %(home)s
|
||
|
chown %(username)s.%(username)s %(home)s""" % context
|
||
|
))
|
||
|
|
||
|
def delete(self, user):
|
||
|
context = self.get_context(user)
|
||
|
self.append("{ sleep 2 && killall -u %(username)s -s KILL; } &" % context)
|
||
|
self.append("killall -u %(username)s" % context)
|
||
|
self.append("userdel %(username)s" % context)
|
||
|
|
||
|
def get_context(self, user):
|
||
|
context = {
|
||
|
'username': user.username,
|
||
|
'password': user.password if user.is_active else '*%s' % user.password,
|
||
|
'shell': getattr(user, 'shell', settings.ACCOUNTS_DEFAULT_SHELL)
|
||
|
}
|
||
|
context['home'] = settings.ACCOUNTS_HOME % context
|
||
|
return context
|
||
|
|
||
|
|
||
|
class MainUserDisk(ServiceMonitor):
|
||
|
model = 'accounts.Account'
|
||
|
resource = ServiceMonitor.DISK
|
||
|
verbose_name = _('Main user disk')
|
||
|
|
||
|
def monitor(self, user):
|
||
|
context = self.get_context(user)
|
||
|
self.append("du -s %(home)s | xargs echo %(object_id)s" % context)
|
||
|
|
||
|
def get_context(self, user):
|
||
|
context = SystemUserBackend().get_context(user)
|
||
|
context['object_id'] = user.pk
|
||
|
return context
|
||
|
|
||
|
|
||
|
class MainFTPTraffic(ServiceMonitor):
|
||
|
model = 'accounts.Account'
|
||
|
resource = ServiceMonitor.TRAFFIC
|
||
|
verbose_name = _('Main FTP traffic')
|
||
|
|
||
|
def prepare(self):
|
||
|
current_date = timezone.localtime(self.current_date)
|
||
|
current_date = current_date.strftime("%Y%m%d%H%M%S")
|
||
|
self.append(textwrap.dedent("""
|
||
|
function monitor () {
|
||
|
OBJECT_ID=$1
|
||
|
INI_DATE=$2
|
||
|
USERNAME="$3"
|
||
|
LOG_FILE="$4"
|
||
|
grep "UPLOAD\|DOWNLOAD" "${LOG_FILE}" \\
|
||
|
| grep " \\[${USERNAME}\\] " \\
|
||
|
| awk -v ini="${INI_DATE}" '
|
||
|
BEGIN {
|
||
|
end = "%s"
|
||
|
sum = 0
|
||
|
months["Jan"] = "01"
|
||
|
months["Feb"] = "02"
|
||
|
months["Mar"] = "03"
|
||
|
months["Apr"] = "04"
|
||
|
months["May"] = "05"
|
||
|
months["Jun"] = "06"
|
||
|
months["Jul"] = "07"
|
||
|
months["Aug"] = "08"
|
||
|
months["Sep"] = "09"
|
||
|
months["Oct"] = "10"
|
||
|
months["Nov"] = "11"
|
||
|
months["Dec"] = "12"
|
||
|
} {
|
||
|
# log: Fri Jul 11 13:23:17 2014
|
||
|
split($4, t, ":")
|
||
|
# line_date = year month day hour minute second
|
||
|
line_date = $5 months[$2] $3 t[1] t[2] t[3]
|
||
|
if ( line_date > ini && line_date < end)
|
||
|
split($0, l, "\\", ")
|
||
|
split(l[3], b, " ")
|
||
|
sum += b[1]
|
||
|
} END {
|
||
|
print sum
|
||
|
}
|
||
|
' | xargs echo ${OBJECT_ID}
|
||
|
}""" % current_date))
|
||
|
|
||
|
def monitor(self, user):
|
||
|
context = self.get_context(user)
|
||
|
self.append(
|
||
|
'monitor %(object_id)i %(last_date)s "%(username)s" "%(log_file)s"' % context)
|
||
|
|
||
|
def get_context(self, user):
|
||
|
last_date = timezone.localtime(self.get_last_date(user.pk))
|
||
|
return {
|
||
|
'log_file': settings.ACCOUNTS_FTP_LOG_PATH,
|
||
|
'last_date': last_date.strftime("%Y%m%d%H%M%S"),
|
||
|
'object_id': user.pk,
|
||
|
'username': user.username,
|
||
|
}
|
||
|
|