2014-10-01 16:42:40 +00:00
|
|
|
import os
|
2014-07-25 15:17:50 +00:00
|
|
|
import textwrap
|
|
|
|
|
2014-05-08 16:59:35 +00:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
2014-10-01 16:42:40 +00:00
|
|
|
from orchestra.apps.orchestration import ServiceController
|
|
|
|
from orchestra.apps.resources import ServiceMonitor
|
2014-05-08 16:59:35 +00:00
|
|
|
|
2014-10-01 16:42:40 +00:00
|
|
|
from . import settings
|
2014-05-08 16:59:35 +00:00
|
|
|
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
class SystemUserBackend(ServiceController):
|
2014-09-30 16:06:42 +00:00
|
|
|
verbose_name = _("System user")
|
|
|
|
model = 'systemusers.SystemUser'
|
2014-11-14 16:52:54 +00:00
|
|
|
actions = ('save', 'delete', 'grant_permission')
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def save(self, user):
|
|
|
|
context = self.get_context(user)
|
|
|
|
groups = ','.join(self.get_groups(user))
|
|
|
|
context['groups_arg'] = '--groups %s' % groups if groups else ''
|
|
|
|
self.append(textwrap.dedent("""
|
|
|
|
if [[ $( id %(username)s ) ]]; then
|
|
|
|
usermod %(username)s --password '%(password)s' --shell %(shell)s %(groups_arg)s
|
|
|
|
else
|
2014-10-02 15:58:27 +00:00
|
|
|
useradd %(username)s --home %(home)s --password '%(password)s' --shell %(shell)s %(groups_arg)s
|
2014-10-01 16:42:40 +00:00
|
|
|
fi
|
|
|
|
mkdir -p %(home)s
|
|
|
|
chown %(username)s.%(username)s %(home)s""" % context
|
|
|
|
))
|
2014-10-28 09:51:27 +00:00
|
|
|
for member in settings.SYSTEMUSERS_DEFAULT_GROUP_MEMBERS:
|
|
|
|
context['member'] = member
|
|
|
|
self.append('usermod -a -G %(username)s %(member)s' % context)
|
|
|
|
if not user.is_main:
|
|
|
|
self.append('usermod -a -G %(username)s %(mainusername)s' % context)
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
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 || true" % context)
|
|
|
|
self.append("userdel %(username)s || true" % context)
|
|
|
|
self.append("groupdel %(username)s || true" % context)
|
2014-10-17 10:04:47 +00:00
|
|
|
self.delete_home(context, user)
|
|
|
|
|
2014-11-14 16:52:54 +00:00
|
|
|
def grant_permission(self, user):
|
|
|
|
context = self.get_context(user)
|
|
|
|
# TODO setacl
|
|
|
|
|
2014-10-17 10:04:47 +00:00
|
|
|
def delete_home(self, context, user):
|
2014-10-02 15:58:27 +00:00
|
|
|
if user.is_main:
|
|
|
|
# TODO delete instead of this shit
|
2014-10-07 13:08:59 +00:00
|
|
|
context['deleted'] = context['home'].rstrip('/') + '.deleted'
|
2014-10-02 15:58:27 +00:00
|
|
|
self.append("mv %(home)s %(deleted)s" % context)
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def get_groups(self, user):
|
|
|
|
if user.is_main:
|
2014-10-02 15:58:27 +00:00
|
|
|
return user.account.systemusers.exclude(username=user.username).values_list('username', flat=True)
|
2014-10-28 09:51:27 +00:00
|
|
|
return list(user.groups.values_list('username', flat=True))
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def get_context(self, user):
|
|
|
|
context = {
|
2014-11-18 17:47:26 +00:00
|
|
|
'object_id': user.pk,
|
2014-10-01 16:42:40 +00:00
|
|
|
'username': user.username,
|
|
|
|
'password': user.password if user.active else '*%s' % user.password,
|
|
|
|
'shell': user.shell,
|
|
|
|
'mainusername': user.username if user.is_main else user.account.username,
|
2014-10-02 15:58:27 +00:00
|
|
|
'home': user.get_home()
|
2014-10-01 16:42:40 +00:00
|
|
|
}
|
|
|
|
return context
|
|
|
|
|
|
|
|
|
|
|
|
class SystemUserDisk(ServiceMonitor):
|
|
|
|
model = 'systemusers.SystemUser'
|
|
|
|
resource = ServiceMonitor.DISK
|
2014-11-18 17:47:26 +00:00
|
|
|
verbose_name = _('Systemuser disk')
|
|
|
|
|
|
|
|
def prepare(self):
|
2014-11-21 13:53:39 +00:00
|
|
|
super(SystemUserDisk, self).prepare()
|
2014-11-18 17:47:26 +00:00
|
|
|
self.append(textwrap.dedent("""\
|
|
|
|
function monitor () {
|
|
|
|
{ du -bs "$1" || echo 0; } | awk {'print $1'}
|
|
|
|
}"""
|
|
|
|
))
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def monitor(self, user):
|
|
|
|
context = self.get_context(user)
|
2014-11-18 17:47:26 +00:00
|
|
|
if user.is_main or os.path.normpath(user.home) == user.get_base_home():
|
|
|
|
self.append("echo %(object_id)s $(monitor %(home)s)" % context)
|
|
|
|
else:
|
|
|
|
# Home appears to be included in other user home
|
|
|
|
self.append("echo %(object_id)s 0" % context)
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def get_context(self, user):
|
2014-11-18 17:47:26 +00:00
|
|
|
return {
|
|
|
|
'object_id': user.pk,
|
|
|
|
'home': user.home,
|
|
|
|
}
|
2014-05-08 16:59:35 +00:00
|
|
|
|
2014-07-09 16:17:43 +00:00
|
|
|
|
2014-10-01 16:42:40 +00:00
|
|
|
class FTPTraffic(ServiceMonitor):
|
2014-09-30 16:06:42 +00:00
|
|
|
model = 'systemusers.SystemUser'
|
2014-10-01 16:42:40 +00:00
|
|
|
resource = ServiceMonitor.TRAFFIC
|
2014-11-20 15:34:59 +00:00
|
|
|
verbose_name = _('Systemuser FTP traffic')
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def prepare(self):
|
2014-11-21 13:53:39 +00:00
|
|
|
super(FTPTraffic, self).prepare()
|
2014-10-27 17:34:14 +00:00
|
|
|
current_date = self.current_date.strftime("%Y-%m-%d %H:%M:%S %Z")
|
|
|
|
self.append(textwrap.dedent("""\
|
2014-10-01 16:42:40 +00:00
|
|
|
function monitor () {
|
|
|
|
OBJECT_ID=$1
|
2014-11-20 15:34:59 +00:00
|
|
|
INI_DATE=$(date "+%%Y%%m%%d%%H%%M%%S" -d "$2")
|
|
|
|
END_DATE=$(date '+%%Y%%m%%d%%H%%M%%S' -d '%(current_date)s')
|
2014-10-01 16:42:40 +00:00
|
|
|
USERNAME="$3"
|
|
|
|
LOG_FILE="$4"
|
2014-11-20 15:34:59 +00:00
|
|
|
{
|
|
|
|
grep "UPLOAD\|DOWNLOAD" "${LOG_FILE}" \\
|
|
|
|
| grep " \\[${USERNAME}\\] " \\
|
|
|
|
| awk -v ini="${INI_DATE}" -v end="${END_DATE}" '
|
|
|
|
BEGIN {
|
|
|
|
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
|
|
|
|
}' || [[ $? == 1 ]] && true
|
|
|
|
} | xargs echo ${OBJECT_ID}
|
2014-10-01 16:42:40 +00:00
|
|
|
}""" % current_date))
|
|
|
|
|
|
|
|
def monitor(self, user):
|
|
|
|
context = self.get_context(user)
|
|
|
|
self.append(
|
2014-11-20 15:34:59 +00:00
|
|
|
'monitor {object_id} "{last_date}" "{username}" {log_file}'.format(**context)
|
2014-10-27 17:34:14 +00:00
|
|
|
)
|
2014-10-01 16:42:40 +00:00
|
|
|
|
|
|
|
def get_context(self, user):
|
|
|
|
return {
|
2014-10-27 17:34:14 +00:00
|
|
|
'log_file': '%s{,.1}' % settings.SYSTEMUSERS_FTP_LOG_PATH,
|
2014-10-27 17:52:42 +00:00
|
|
|
'last_date': self.get_last_date(user.pk).strftime("%Y-%m-%d %H:%M:%S %Z"),
|
2014-10-01 16:42:40 +00:00
|
|
|
'object_id': user.pk,
|
|
|
|
'username': user.username,
|
|
|
|
}
|