diff --git a/app/add.py b/app/add.py index bdcce6d3..7b361ed2 100644 --- a/app/add.py +++ b/app/add.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# -*- coding: utf-8 -*- import os import funct import sql @@ -20,7 +21,9 @@ funct.page_for_admin(level = 2) try: user, user_id, role, token, servers = funct.get_users_params() - user_group = sql.get_user_group_by_uuid(user_id.value) + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + group = cookie.get('group') + user_group = group.value except: pass diff --git a/app/create_db.py b/app/create_db.py index ad5197e8..0591dc66 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -131,6 +131,7 @@ def create_table(**kwargs): CREATE TABLE IF NOT EXISTS `backups` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `rhost` VARCHAR ( 120 ), `rpath` VARCHAR ( 120 ), `type` VARCHAR ( 120 ), `time` VARCHAR ( 120 ), cred INTEGER, `description` VARCHAR ( 120 ), PRIMARY KEY(`id`)); CREATE TABLE IF NOT EXISTS `waf` (`server_id` INTEGER UNIQUE, metrics INTEGER); CREATE TABLE IF NOT EXISTS `waf_metrics` (`serv` varchar(64), conn INTEGER, `date` DATETIME default '0000-00-00 00:00:00'); + CREATE TABLE IF NOT EXISTS user_groups(user_id INTEGER NOT NULL, user_group_id INTEGER NOT NULL, UNIQUE(user_id,user_group_id)); """ try: cur.executescript(sql) @@ -451,9 +452,51 @@ def update_db_v_4_2_3(**kwargs): con.close() +def update_db_v_4_3(**kwargs): + con, cur = get_cur() + sql = """ + CREATE TABLE IF NOT EXISTS user_groups(user_id INTEGER NOT NULL, user_group_id INTEGER NOT NULL, UNIQUE(user_id,user_group_id)); + """ + try: + cur.execute(sql) + con.commit() + except sqltool.Error as e: + if kwargs.get('silent') != 1: + if e.args[0] == 'duplicate column name: haproxy' or e == " 1060 (42S21): Duplicate column name 'haproxy' ": + print('Updating... go to version 4.3.0') + else: + print("An error occurred:", e) + return False + else: + return True + cur.close() + con.close() + + +def update_db_v_4_3_1(**kwargs): + con, cur = get_cur() + sql = """ + insert OR IGNORE into user_groups(user_id, user_group_id) select id, groups from user; + """ + try: + cur.execute(sql) + con.commit() + except sqltool.Error as e: + if kwargs.get('silent') != 1: + if e.args[0] == 'duplicate column name: haproxy' or e == " 1060 (42S21): Duplicate column name 'haproxy' ": + print('DB was update to 4.3.0') + else: + print("An error occurred:", e) + return False + else: + return True + cur.close() + con.close() + + def update_ver(**kwargs): con, cur = get_cur() - sql = """update version set version = '4.2.3.0'; """ + sql = """update version set version = '4.3.0.0'; """ try: cur.execute(sql) con.commit() @@ -478,6 +521,8 @@ def update_all(): update_db_v_41() update_db_v_42() update_db_v_4_2_3() + update_db_v_4_3() + update_db_v_4_3_1() update_ver() @@ -496,6 +541,8 @@ def update_all_silent(): update_db_v_41(silent=1) update_db_v_42(silent=1) update_db_v_4_2_3(silent=1) + update_db_v_4_3(silent=1) + update_db_v_4_3_1(silent=1) update_ver() diff --git a/app/funct.py b/app/funct.py index 2e740410..f280fa6f 100644 --- a/app/funct.py +++ b/app/funct.py @@ -975,8 +975,8 @@ def check_group(group, role_id): import sql cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_id = cookie.get('uuid') - user_group = sql.get_user_group_by_uuid(user_id.value) - if user_group == group or user_group == '1' or role_id == 1: + id = sql.get_user_id_by_uuid(user_id.value) + if sql.select_user_groups(id, check_id=group) or role_id == 1: return True else: logging('localhost', ' has tried to actions in not own group ', haproxywi=1, login=1) diff --git a/app/haproxy-wi.db.sql b/app/haproxy-wi.db.sql index 0ccf2375..1da71cfb 100644 --- a/app/haproxy-wi.db.sql +++ b/app/haproxy-wi.db.sql @@ -19,4 +19,5 @@ CREATE TABLE IF NOT EXISTS `options` ( `id` INTEGER NOT NULL, `options` VARCHAR CREATE TABLE IF NOT EXISTS `saved_servers` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `description` VARCHAR ( 120 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`)); CREATE TABLE IF NOT EXISTS `backups` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `rhost` VARCHAR ( 120 ), `rpath` VARCHAR ( 120 ), `time` VARCHAR ( 120 ), cred INTEGER, `description` VARCHAR ( 120 ), PRIMARY KEY(`id`)); CREATE TABLE IF NOT EXISTS `waf` (`server_id` INTEGER UNIQUE, metrics INTEGER); -CREATE TABLE IF NOT EXISTS `waf_metrics` (`serv` varchar(64), conn INTEGER, `date` DATETIME default '0000-00-00 00:00:00'); \ No newline at end of file +CREATE TABLE IF NOT EXISTS `waf_metrics` (`serv` varchar(64), conn INTEGER, `date` DATETIME default '0000-00-00 00:00:00'); +CREATE TABLE IF NOT EXISTS user_groups(user_id INTEGER NOT NULL, user_group_id INTEGER NOT NULL, UNIQUE(user_id,user_group_id)); \ No newline at end of file diff --git a/app/login.py b/app/login.py index 65764a37..75bd0a50 100644 --- a/app/login.py +++ b/app/login.py @@ -30,14 +30,21 @@ def send_cookie(login): expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl) user_uuid = str(uuid.uuid4()) user_token = str(uuid.uuid4()) + sql.write_user_uuid(login, user_uuid) + sql.write_user_token(login, user_token) + + id = sql.get_user_id_by_uuid(user_uuid) + user_groups = sql.select_user_groups(id, limit=1) c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) c["uuid"] = user_uuid c["uuid"]["path"] = "/" c["uuid"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") + c["group"] = user_groups + c["group"]["path"] = "/" + c["group"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") print(c) - sql.write_user_uuid(login, user_uuid) - sql.write_user_token(login, user_token) + try: funct.logging('locahost', ' '+sql.get_user_name_by_uuid(user_uuid)+' log in', haproxywi=1) except: diff --git a/app/options.py b/app/options.py index 6f00bec9..902573bb 100644 --- a/app/options.py +++ b/app/options.py @@ -8,7 +8,7 @@ form = funct.form serv = form.getvalue('serv') act = form.getvalue('act') -if form.getvalue('new_metrics') or form.getvalue('new_waf_metrics'): +if form.getvalue('new_metrics') or form.getvalue('new_waf_metrics') or form.getvalue('metrics_hapwi_ram') or form.getvalue('metrics_hapwi_cpu'): print('Content-type: application/json\n') else: print('Content-type: text/html\n') @@ -275,10 +275,6 @@ if act == "overviewServers": import asyncio async def async_get_overviewServers(serv1, serv2, service): server_status = () - if service == 'haproxy': - commands = [ "top -u haproxy -b -n 1" ] - else: - commands = [ "top -u nginx -b -n 1" ] if service == 'haproxy': cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Ver\|CurrConns\|Maxco\|MB\|Uptime:"' % (serv2, sql.get_setting('haproxy_sock_port')) @@ -295,7 +291,7 @@ if act == "overviewServers": else: out1 = '' - server_status = (serv1,serv2, out1, funct.ssh_command(serv2, commands)) + server_status = (serv1,serv2, out1) return server_status async def get_runner_overviewServers(**kwargs): @@ -325,18 +321,6 @@ if act == "overviewServers": ioloop.close() - -if act == "overviewHapwi": - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('/overviewHapwi.html') - cmd = "top -b -n 1 |head -12" - server_status, stderr = funct.subprocess_execute(cmd) - - template = template.render(server_status=server_status,stderr=stderr) - print(template) - - if form.getvalue('action'): import requests @@ -1119,6 +1103,50 @@ if form.getvalue('table_metrics'): print(template) +if form.getvalue('metrics_hapwi_ram'): + ip = form.getvalue('ip') + metrics = {} + metrics['chartData'] = {} + rams = '' + + if ip == '1': + cmd = "free -m |grep Mem |awk '{print $3,$4,$5,$6,$7}'" + metric, error = funct.subprocess_execute(cmd) + else: + commands = [ "free -m |grep Mem |awk '{print $3,$4,$5,$6,$7}'" ] + metric, error = funct.subprocess_execute(commands[0]) + + for i in metric: + rams = i + + metrics['chartData']['rams'] = rams + + import json + print(json.dumps(metrics)) + + +if form.getvalue('metrics_hapwi_cpu'): + ip = form.getvalue('ip') + metrics = {} + metrics['chartData'] = {} + cpus = '' + + if ip == '1': + cmd = "top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'" + metric, error = funct.subprocess_execute(cmd) + else: + commands = [ "top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'" ] + metric, error = funct.subprocess_execute(commands[0]) + + for i in metric: + cpus = i + + metrics['chartData']['cpus'] = cpus + + import json + print(json.dumps(metrics)) + + if form.getvalue('new_metrics'): serv = form.getvalue('server') metric = sql.select_metrics(serv) @@ -1322,7 +1350,7 @@ if form.getvalue('newuser') is not None: if funct.check_group(group, role_id): if funct.is_admin(level=role_id): - if sql.add_user(new_user, email, password, role, group, activeuser): + if sql.add_user(new_user, email, password, role, activeuser): from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/new_user.html') @@ -1343,6 +1371,7 @@ if form.getvalue('userdel') is not None: for u in user: username = u[1] if sql.delete_user(userdel): + sql.delete_user_groups(userdel) funct.logging(username, ' has deleted user ', haproxywi=1, login=1) print("Ok") @@ -1358,7 +1387,7 @@ if form.getvalue('updateuser') is not None: if funct.check_group(group, role_id): if funct.is_admin(level=role_id): - sql.update_user(new_user, email, role, group, id, activeuser) + sql.update_user(new_user, email, role, id, activeuser) funct.logging(new_user, ' has updated user ', haproxywi=1, login=1) else: funct.logging(new_user, ' tried to privilege escalation', haproxywi=1, login=1) @@ -1629,3 +1658,44 @@ if form.getvalue('updatesettings') is not None: if sql.update_setting(settings, val): funct.logging('value '+val, ' changed settings '+settings, haproxywi=1, login=1) print("Ok") + + +if form.getvalue('getusergroups'): + id = form.getvalue('getusergroups') + groups = [] + u_g = sql.select_user_groups(id=id) + for g in u_g: + groups.append(g[0]) + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) + template = env.get_template('/show_user_groups.html') + template = template.render(groups=sql.select_groups(), user_groups=groups,id=id) + print(template) + + +if form.getvalue('changeUserGroupId') is not None: + id = form.getvalue('changeUserGroupId') + groups = form.getvalue('changeUserGroups') + user = form.getvalue('changeUserGroupsUser') + if sql.delete_user_groups(id): + for group in groups: + if group[0] == ',': + continue + sql.update_user_groups(groups=group[0], id=id) + + funct.logging('localhost', ' has upgraded groups for user: '+user, haproxywi=1, login=1) + + +if form.getvalue('getcurrentusergroup') is not None: + import http.cookies + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + user_id = cookie.get('uuid') + group = cookie.get('group') + id = sql.get_user_id_by_uuid(user_id.value) + groups = sql.select_user_groups_with_names(id=id) + + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) + template = env.get_template('/show_user_current_group.html') + template = template.render(groups=groups, group=group.value,id=id) + print(template) \ No newline at end of file diff --git a/app/overview.py b/app/overview.py index 07b4da50..ef76e27c 100644 --- a/app/overview.py +++ b/app/overview.py @@ -67,7 +67,6 @@ except: is_checker_worker = '' is_metrics_worker = '' token = '' - host = '' template = template.render(h2 = 1, @@ -77,6 +76,7 @@ template = template.render(h2 = 1, user = user, users = users, groups = groups, + users_groups = sql.select_user_groups_with_names(1, all=1), roles = sql.select_roles(), metrics_master = ''.join(metrics_master), metrics_worker = ''.join(metrics_worker), diff --git a/app/servers.py b/app/servers.py index 28270134..47de8af5 100644 --- a/app/servers.py +++ b/app/servers.py @@ -13,6 +13,10 @@ try: user, user_id, role, token, servers = funct.get_users_params() ldap_enable = sql.get_setting('ldap_enable') grafana, stderr = funct.subprocess_execute("service grafana-server status |grep Active |awk '{print $1}'") + import http.cookies, os + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + group = cookie.get('group') + user_group = group.value except: pass @@ -20,12 +24,12 @@ except: output_from_parsed_template = template.render(title = "Servers manage", role = role, user = user, - users = sql.select_users(), + users = sql.select_users(group=user_group), groups = sql.select_groups(), servers = sql.get_dick_permit(virt=1, disable=0), roles = sql.select_roles(), masters = sql.select_servers(get_master_servers=1, uuid=user_id.value), - group = sql.get_user_group_by_uuid(user_id.value), + group = user_group, sshs = sql.select_ssh(), telegrams = sql.get_user_telegram_by_uuid(user_id.value), token = token, diff --git a/app/sql.py b/app/sql.py index 795df584..e1a21db0 100644 --- a/app/sql.py +++ b/app/sql.py @@ -31,12 +31,12 @@ def get_cur(): return con, cur -def add_user(user, email, password, role, group, activeuser): +def add_user(user, email, password, role, activeuser): con, cur = get_cur() if password != 'aduser': - sql = """INSERT INTO user (username, email, password, role, groups, activeuser) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')""" % (user, email, funct.get_hash(password), role, group, activeuser) + sql = """INSERT INTO user (username, email, password, role, activeuser) VALUES ('%s', '%s', '%s', '%s', '%s')""" % (user, email, funct.get_hash(password), role, activeuser) else: - sql = """INSERT INTO user (username, email, role, groups, ldap_user, activeuser) VALUES ('%s', '%s', '%s', '%s', '1', '%s')""" % (user, email, role, group, activeuser) + sql = """INSERT INTO user (username, email, role, ldap_user, activeuser) VALUES ('%s', '%s', '%s', '1', '%s')""" % (user, email, role, activeuser) try: cur.execute(sql) con.commit() @@ -49,14 +49,47 @@ def add_user(user, email, password, role, group, activeuser): cur.close() con.close() -def update_user(user, email, role, group, id, activeuser): + +def update_user(user, email, role, id, activeuser): con, cur = get_cur() sql = """update user set username = '%s', email = '%s', - role = '%s', - groups = '%s', + role = '%s', activeuser = '%s' - where id = '%s'""" % (user, email, role, group, activeuser, id) + where id = '%s'""" % (user, email, role, activeuser, id) + try: + cur.execute(sql) + con.commit() + except sqltool.Error as e: + funct.out_error(e) + con.rollback() + return False + else: + return True + cur.close() + con.close() + + +def update_user_groups(groups, id): + con, cur = get_cur() + sql = """insert into user_groups(user_id, user_group_id) values('%s', '%s')""" % (id, groups) + try: + cur.execute(sql) + con.commit() + except sqltool.Error as e: + funct.out_error(e) + con.rollback() + return False + else: + return True + cur.close() + con.close() + + +def delete_user_groups(id): + con, cur = get_cur() + sql = """delete from user_groups + where user_id = '%s'""" % (id) try: cur.execute(sql) con.commit() @@ -252,6 +285,9 @@ def select_users(**kwargs): sql = """select * from user where username='%s' """ % kwargs.get("user") if kwargs.get("id") is not None: sql = """select * from user where id='%s' """ % kwargs.get("id") + if kwargs.get("group") is not None: + sql = """ select user.* from user left join user_groups as groups on user.id = groups.user_id where groups.user_group_id = '%s' group by id; + """ % kwargs.get("group") try: cur.execute(sql) except sqltool.Error as e: @@ -259,7 +295,57 @@ def select_users(**kwargs): else: return cur.fetchall() cur.close() - con.close() + con.close() + + +def select_user_groups(id, **kwargs): + con, cur = get_cur() + sql = """select user_group_id from user_groups where user_id = '%s' """ % id + if kwargs.get("limit") is not None: + sql = """select user_group_id from user_groups where user_id = '%s' limit 1 """ % id + if kwargs.get("check_id") is not None: + sql = """select * from user_groups where user_id='%s' and user_group_id = '%s' """ % (id, kwargs.get("check_id")) + try: + cur.execute(sql) + except sqltool.Error as e: + funct.out_error(e) + else: + if kwargs.get("check_id") is not None: + for g in cur.fetchall(): + if g[0] is None: + return False + else: + return True + elif kwargs.get("limit") is not None: + for g in cur.fetchall(): + return g[0] + else: + return cur.fetchall() + cur.close() + con.close() + + +def select_user_groups_with_names(id, **kwargs): + con, cur = get_cur() + if kwargs.get("all") is not None: + sql = """select user_groups.user_id, groups.name from user_groups + left join groups as groups on user_groups.user_group_id = groups.id """ + else: + sql = """select user_groups.user_group_id, groups.name from user_groups + left join groups as groups on user_groups.user_group_id = groups.id + where user_groups.user_id = '%s' """ % id + try: + cur.execute(sql) + except sqltool.Error as e: + funct.out_error(e) + else: + if kwargs.get("limit") is not None: + for g in cur.fetchall(): + return g[0] + else: + return cur.fetchall() + cur.close() + con.close() def select_groups(**kwargs): @@ -398,6 +484,7 @@ def get_token(uuid): cur.close() con.close() + def delete_uuid(uuid): con, cur = get_cur() sql = """ delete from uuid where uuid = '%s' """ % uuid @@ -409,6 +496,7 @@ def delete_uuid(uuid): cur.close() con.close() + def delete_old_uuid(): con, cur = get_cur() if mysql_enable == '1': @@ -427,6 +515,7 @@ def delete_old_uuid(): cur.close() con.close() + def update_last_act_user(uuid): con, cur = get_cur() session_ttl = get_setting('session_ttl') @@ -444,6 +533,7 @@ def update_last_act_user(uuid): cur.close() con.close() + def get_user_name_by_uuid(uuid): con, cur = get_cur() sql = """ select user.username from user left join uuid as uuid on user.id = uuid.user_id where uuid.uuid = '%s' """ % uuid @@ -457,6 +547,20 @@ def get_user_name_by_uuid(uuid): cur.close() con.close() + +def get_user_id_by_uuid(uuid): + con, cur = get_cur() + sql = """ select user.id from user left join uuid as uuid on user.id = uuid.user_id where uuid.uuid = '%s' """ % uuid + try: + cur.execute(sql) + except sqltool.Error as e: + funct.out_error(e) + else: + for user_id in cur.fetchall(): + return user_id[0] + cur.close() + con.close() + def get_user_role_by_uuid(uuid): con, cur = get_cur() @@ -487,19 +591,6 @@ def get_role_id_by_name(name): cur.close() con.close() - -def get_user_group_by_uuid(uuid): - con, cur = get_cur() - sql = """ select user.groups from user left join uuid as uuid on user.id = uuid.user_id where uuid.uuid = '%s' """ % uuid - try: - cur.execute(sql) - except sqltool.Error as e: - funct.out_error(e) - else: - for user_id in cur.fetchall(): - return user_id[0] - cur.close() - con.close() def get_user_telegram_by_uuid(uuid): con, cur = get_cur() @@ -513,6 +604,7 @@ def get_user_telegram_by_uuid(uuid): cur.close() con.close() + def get_telegram_by_ip(ip): con, cur = get_cur() sql = """ select telegram.* from telegram left join servers as serv on serv.groups = telegram.groups where serv.ip = '%s' """ % ip @@ -525,22 +617,25 @@ def get_telegram_by_ip(ip): cur.close() con.close() + def get_dick_permit(**kwargs): import http.cookies import os - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') + if kwargs.get('username'): + user = kwargs.get('username') + grp = '1' + else: + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + user_id = cookie.get('uuid') + group = cookie.get('group') + grp = group.value + user = get_user_id_by_uuid(user_id.value) disable = '' haproxy = '' nginx = '' keepalived = '' ip = '' - con, cur = get_cur() - if kwargs.get('username'): - sql = """ select * from user where username = '%s' """ % kwargs.get('username') - else: - sql = """ select * from user where username = '%s' """ % get_user_name_by_uuid(user_id.value) if kwargs.get('virt'): type_ip = "" else: @@ -555,18 +650,15 @@ def get_dick_permit(**kwargs): nginx = "and nginx = 1" if kwargs.get('keepalived'): nginx = "and keepalived = 1" - - try: - cur.execute(sql) - except sqltool.Error as e: - print("An error occurred:", e) - else: - for group in cur: - if group[5] == '1': - sql = """ select * from servers where enable = 1 %s %s %s """ % (disable, type_ip, nginx) - else: - sql = """ select * from servers where groups like '%{group}%' and (enable = 1 {disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} - """.format(group=group[5], disable=disable, type_ip=type_ip, ip=ip, haproxy=haproxy, nginx=nginx, keepalived=keepalived) + + if select_user_groups(user, check_id=grp): + con, cur = get_cur() + if grp == '1': + sql = """ select * from servers where enable = 1 %s %s %s """ % (disable, type_ip, nginx) + else: + sql = """ select * from servers where groups like '%{group}%' and (enable = 1 {disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} + """.format(group=grp, disable=disable, type_ip=type_ip, ip=ip, haproxy=haproxy, nginx=nginx, keepalived=keepalived) + try: cur.execute(sql) except sqltool.Error as e: @@ -574,8 +666,11 @@ def get_dick_permit(**kwargs): else: return cur.fetchall() - cur.close() - con.close() + cur.close() + con.close() + else: + print('Atata!') + def is_master(ip, **kwargs): @@ -1171,18 +1266,18 @@ def select_servers_metrics_for_master(): def select_servers_metrics(uuid, **kwargs): con, cur = get_cur() - sql = """ select * from user where username = '%s' """ % get_user_name_by_uuid(uuid) - - try: - cur.execute(sql) - except sqltool.Error as e: - print("An error occurred:", e) - else: - for group in cur: - if group[5] == '1': - sql = """ select ip from servers where enable = 1 and metrics = '1' """ - else: - sql = """ select ip from servers where groups like '%{group}%' and metrics = '1'""".format(group=group[5]) + import http.cookies + import os + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + user_id = cookie.get('uuid') + group = cookie.get('group') + group = group.value + id = get_user_id_by_uuid(user_id.value) + if select_user_groups(id, check_id=group) is not None: + if group == '1': + sql = """ select ip from servers where enable = 1 and metrics = '1' """ + else: + sql = """ select ip from servers where groups like '%{group}%' and metrics = '1'""".format(group=group) try: cur.execute(sql) except sqltool.Error as e: @@ -1195,19 +1290,18 @@ def select_servers_metrics(uuid, **kwargs): def select_table_metrics(uuid): con, cur = get_cur() - groups = "" - sql = """ select * from user where username = '%s' """ % get_user_name_by_uuid(uuid) - - try: - cur.execute(sql) - except sqltool.Error as e: - print("An error occurred:", e) - else: - for group in cur: - if group[5] == '1': - groups = "" - else: - groups = "and servers.groups like '%{group}%' ".format(group=group[5]) + import http.cookies + import os + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + user_id = cookie.get('uuid') + group = cookie.get('group') + group = group.value + id = get_user_id_by_uuid(user_id.value) + if select_user_groups(id, check_id=group) is not None: + if group == '1': + groups = "" + else: + groups = "and servers.groups like '%{group}%' ".format(group=group) if mysql_enable == '1': sql = """ select ip.ip, hostname, avg_sess_1h, avg_sess_24h, avg_sess_3d, max_sess_1h, max_sess_24h, max_sess_3d, avg_cur_1h, avg_cur_24h, avg_cur_3d, max_con_1h, max_con_24h, max_con_3d from diff --git a/app/templates/admin.html b/app/templates/admin.html index 9e3414aa..e6c6f100 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -53,16 +53,7 @@ - + @@ -603,6 +594,9 @@ {% include 'include/change_pass_form.html' %} + + } + {% endfor %} + {% for server in backups %} + $("#backup-time-{{ server.0}}" ).selectmenu({ + width: 100 + }); + $("#backup-type-{{server.0}}" ).selectmenu({ + width: 130 + }); + $("#backup-credentials-{{server.0}}" ).selectmenu({ + width: 150 + }); + {% endfor %} + }); + {% endblock %} \ No newline at end of file diff --git a/app/templates/ajax/new_user.html b/app/templates/ajax/new_user.html index 8a125203..9fd9a91e 100644 --- a/app/templates/ajax/new_user.html +++ b/app/templates/ajax/new_user.html @@ -16,16 +16,7 @@ {% if page != "servers.py" %} {% if page != "servers.py#users" %} - + {% endif %} {% endif %} diff --git a/app/templates/ajax/overviewServers.html b/app/templates/ajax/overviewServers.html index 94299417..7fcc0a7b 100644 --- a/app/templates/ajax/overviewServers.html +++ b/app/templates/ajax/overviewServers.html @@ -1,5 +1,5 @@ {%- for service in service_status -%} -
+
{% if service_page == 'nginx' %}
{% else %} @@ -18,13 +18,16 @@
{% endif %} {% if service_page == 'nginx' %} -
+
{% else %} -
+
{% endif %} -
-{{ service.3 }}
-		
-
+
+ +
+
+ +
+
{% endfor %} \ No newline at end of file diff --git a/app/templates/ajax/show_user_current_group.html b/app/templates/ajax/show_user_current_group.html new file mode 100644 index 00000000..0b3c8d7e --- /dev/null +++ b/app/templates/ajax/show_user_current_group.html @@ -0,0 +1,15 @@ + + + + +
+ +
\ No newline at end of file diff --git a/app/templates/ajax/show_user_groups.html b/app/templates/ajax/show_user_groups.html new file mode 100644 index 00000000..464980f3 --- /dev/null +++ b/app/templates/ajax/show_user_groups.html @@ -0,0 +1,70 @@ + + + + + + +
Choose groups + +
\ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 894e63f3..2e0e8180 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -259,12 +259,15 @@
+ diff --git a/app/templates/hapservers.html b/app/templates/hapservers.html index bf47f31b..de0f5ea4 100644 --- a/app/templates/hapservers.html +++ b/app/templates/hapservers.html @@ -30,6 +30,22 @@ host = host.replace(/\./g, '\\.'); hostnamea.push(host) {% endfor %} + $( function() { + $( ".sortable" ).sortable({ + revert: true, + placeholder: "ui-state-highlight" + }); + $( ".sortable" ).disableSelection(); + + $( ".sortable" ).sortable({ + stop: function(event, ui) { + var itemOrder = $('.sortable').sortable("toArray"); + for (var i = 0; i < itemOrder.length; i++) { + console.log("Position: " + i + " ID: " + itemOrder[i]); + } + } + }); + });
{% if servers|length == 0 %} diff --git a/app/templates/include/login.html b/app/templates/include/login.html index 7bc347ee..e03efbf8 100644 --- a/app/templates/include/login.html +++ b/app/templates/include/login.html @@ -1,4 +1,5 @@ {% if user %} + {% else %} diff --git a/app/templates/metrics.html b/app/templates/metrics.html index 7341ac0e..82d9081c 100644 --- a/app/templates/metrics.html +++ b/app/templates/metrics.html @@ -30,6 +30,14 @@ th, tr, td { {% endfor %} + -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/app/templates/servers.html b/app/templates/servers.html index 42c67cb6..c480e083 100644 --- a/app/templates/servers.html +++ b/app/templates/servers.html @@ -35,7 +35,6 @@ {% for user in users %} - {% if user.5 == group %} {% include 'include/admin_users.html' %} @@ -59,7 +58,6 @@ - {% endif %} {% endfor %}
+ Add diff --git a/app/viewlogs.py b/app/viewlogs.py index 384d4054..f4824e93 100644 --- a/app/viewlogs.py +++ b/app/viewlogs.py @@ -41,6 +41,10 @@ try: for dirpath, dirnames, filenames in os.walk(log_path): for file in filenames: curpath = os.path.join(dirpath, file) + try: + funct.subprocess_execute('sudo chown apache:apache '+curpath) + except: + pass file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath)) if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours): os.remove(curpath) diff --git a/inc/awesome.css b/inc/awesome.css index 2ba4dc34..a7b70c16 100644 --- a/inc/awesome.css +++ b/inc/awesome.css @@ -229,4 +229,9 @@ display: none; font-family: "Font Awesome 5 Solid"; content: "\f2f1"; +} +.menu-bar::before { + display: none; + font-family: "Font Awesome 5 Solid"; + content: "\f0c9"; } \ No newline at end of file diff --git a/inc/metrics.js b/inc/metrics.js index 4db7517a..57feb706 100644 --- a/inc/metrics.js +++ b/inc/metrics.js @@ -151,5 +151,132 @@ function loadMetrics() { } }); } +function getChartDataHapWiRam(ip) { + $.ajax({ + url: "options.py", + data: { + metrics_hapwi_ram: '1', + ip: ip, + token: $('#token').val() + }, + beforeSend: function() { + $('#ram').html('') + }, + type: "POST", + success: function (result) { + var data = []; + data.push(result.chartData.rams); + renderChartHapWiRam(data); + } + }); +} +function renderChartHapWiRam(data) { + var ctx = 'ram' + var myChart = new Chart(ctx, { + type: 'pie', + data: { + labels: ['used','free','shared','buff/cache','avaliable'], + datasets: [ + { + data: data[0].split(' '), + backgroundColor: [ + '#ff6384', + '#36a2eb', + '#ff9f40', + '#ffcd56', + '#4bc0c0', + + ] + } + ] + }, + options: { + maintainAspectRatio: false, + title: { + display: true, + text: "RAM usage in Mb", + fontSize: 15, + padding: 0, + }, + legend: { + display: true, + align: 'start', + position: 'left', + labels: { + fontColor: 'rgb(255, 99, 132)', + defaultFontSize: 2, + fontColor: 'black', + defaultFontFamily: 'BlinkMacSystemFont', + boxWidth: 13, + padding: 5 + }, + } + } + }); +} +function getChartDataHapWiCpu(ip) { + $.ajax({ + url: "options.py", + data: { + metrics_hapwi_cpu: '1', + ip: ip, + token: $('#token').val() + }, + type: "POST", + success: function (result) { + var data = []; + data.push(result.chartData.cpus); + + renderChartHapWiCpu(data); + } + }); +} + +function renderChartHapWiCpu(data) { + var ctx = 'cpu' + var myChart = new Chart(ctx, { + type: 'pie', + data: { + labels: ['user','sys','nice','idle','wait','hi','si','steal'], + datasets: [ + { + data: data[0].split(' '), + backgroundColor: [ + '#ff6384', + '#36a2eb', + '#ff9f40', + '#ffcd56', + '#4bc0c0', + '#5d9ceb', + '#4bc0c0', + + ] + } + ] + }, + options: { + maintainAspectRatio: false, + title: { + display: true, + text: "CPU usage in %", + fontSize: 15, + padding: 0, + }, + legend: { + display: true, + position: 'left', + align: 'end', + labels: { + fontColor: 'rgb(255, 99, 132)', + defaultFontSize: 2, + defaultFontFamily: 'BlinkMacSystemFont', + fontColor: 'black', + boxWidth: 13, + padding: 5 + }, + } + } + }); +} diff --git a/inc/overview.js b/inc/overview.js index 356eba0e..8ad61eec 100644 --- a/inc/overview.js +++ b/inc/overview.js @@ -1,20 +1,8 @@ var cur_url = window.location.href.split('/').pop(); cur_url = cur_url.split('?'); function showOverviewHapWI() { - $.ajax( { - url: "options.py", - data: { - act: "overviewHapwi", - token: $('#token').val() - }, - beforeSend: function() { - $('#ajaxHapwi').html('') - }, - type: "POST", - success: function( data ) { - $("#ajaxHapwi").html(data); - } - } ); + getChartDataHapWiCpu('1') + getChartDataHapWiRam('1') } function showHapservers(serv, hostnamea, service) { var i; @@ -113,35 +101,38 @@ function showOverviewServer(name,ip,id, service) { $("#div-pannel-"+id).insertBefore('#up-pannel') $("#ajax-server-"+id).html(data); $.getScript("/inc/fontawesome.min.js") + getChartDataHapWiRam() + getChartDataHapWiCpu() + } + } ); + +} +function ajaxActionServers(action, id) { + var bad_ans = 'Bad config, check please'; + $.ajax( { + url: "options.py", + data: { + action_hap: action, + serv: id, + token: $('#token').val() + }, + success: function( data ) { + data = data.replace(/\s+/g,' '); + if( data == 'Bad config, check please ' ) { + alert(data); + } else { + if (cur_url[0] == "hapservers.py") { + location.reload() + } else { + setTimeout(showOverview(ip, hostnamea), 2000) + } + } + }, + error: function(){ + alert(w.data_error); } } ); } -function ajaxActionServers(action, id) { - var bad_ans = 'Bad config, check please'; - $.ajax( { - url: "options.py", - data: { - action_hap: action, - serv: id, - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - if( data == 'Bad config, check please ' ) { - alert(data); - } else { - if (cur_url[0] == "hapservers.py") { - location.reload() - } else { - setTimeout(showOverview(ip, hostnamea), 2000) - } - } - }, - error: function(){ - alert(w.data_error); - } - } ); - } function ajaxActionNginxServers(action, id) { var bad_ans = 'Bad config, check please'; $.ajax( { diff --git a/inc/script.js b/inc/script.js index a1c0dae8..858e81a9 100644 --- a/inc/script.js +++ b/inc/script.js @@ -664,6 +664,41 @@ $( function() { $("#label_select_all").text("Select all"); } }); + $('#changeCurrentGroup').click(function() { + $.ajax( { + url: "options.py", + data: { + getcurrentusergroup: 1, + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + if (data.indexOf('danger') != '-1') { + $("#ajax").html(data); + } else { + $('.alert-danger').remove(); + $('#current-user-groups-form').html(data); + $( "select" ).selectmenu(); + $( "#current-user-groups-dialog" ).dialog({ + resizable: false, + height: "auto", + width: 290, + modal: true, + title: "Change a new current group", + buttons: { + "Change": function() { + $( this ).dialog( "close" ); + changeCurrentGroupF(); + }, + Cancel: function() { + $( this ).dialog( "close" ); + } + } + }); + } + } + } ); + }); $('#runtimeapiform').submit(function() { showRuntime(); @@ -901,3 +936,9 @@ function listHistroy() { } createHistroy() listHistroy() + +function changeCurrentGroupF(){ + Cookies.remove('group'); + Cookies.set('group', $('#newCurrentGroup').val(), { path: '/app' }); + location.reload(); +} \ No newline at end of file diff --git a/inc/style.css b/inc/style.css index 23e2eebe..aacb61fe 100644 --- a/inc/style.css +++ b/inc/style.css @@ -659,6 +659,9 @@ caption { color: #777; text-align: left; } +caption h3 { + font-size: 1.2em; +} td,th { padding: 0; text-align: left; @@ -1026,17 +1029,14 @@ label { width: 100px; } } -.loading, .loading_full_page, .loading_hapwi_overview { - width: 100px; - height: 100px; +.loading, .loading_full_page { + width: 50px; + height: 50px; margin-left: 100%; } .loading_full_page { margin-left: 45%; } -.loading_hapwi_overview{ - margin-left: 40%; -} .loading_small { width: 39px; height: 39px; diff --git a/inc/users.js b/inc/users.js index 4e6c1b3a..001322b0 100644 --- a/inc/users.js +++ b/inc/users.js @@ -835,7 +835,11 @@ function addUser() { }); } else { $('.alert-danger').remove(); - $("#ajax-users").append(data); + $("#ajax-users").append(data); + var getId = new RegExp('[0-9]+'); + var id = data.match(getId); + console.log(id[0]) + addUserGroup(id[0]); } } } ); @@ -1306,12 +1310,7 @@ function removeBackup(id) { function updateUser(id) { $('.alert-danger').remove(); cur_url[0] = cur_url[0].split('#')[0] - console.log(cur_url[0]) - if (cur_url[0] != "servers.py") { - var usergroup = $('#usergroup-'+id+' option:selected' ).val(); - } else { - var usergroup = $('#usergroup-'+id ).val(); - } + var usergroup = Cookies.get('group'); var activeuser = 0; if ($('#activeuser-'+id).is(':checked')) { activeuser = '1'; @@ -1636,6 +1635,9 @@ function checkSshConnect(ip) { function openChangeUserPasswordDialog(id) { changeUserPasswordDialog(id); } +function openChangeUserGroupDialog(id) { + changeUserGroupDialog(id); +} function changeUserPasswordDialog(id) { $( "#user-change-password-table" ).dialog({ autoOpen: true, @@ -1698,4 +1700,75 @@ function changeUserPassword(id, d) { } } ); } +} +function changeUserGroupDialog(id) { + $.ajax( { + url: "options.py", + data: { + getusergroups: id, + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + if (data.indexOf('danger') != '-1') { + $("#ajax").html(data); + } else { + $('.alert-danger').remove(); + $('#change-user-groups-form').html(data); + $( "#change-user-groups-dialog" ).dialog({ + resizable: false, + height: "auto", + width: 450, + modal: true, + title: "Change "+$('#login-'+id).val()+" groups", + buttons: { + "Save": function() { + $( this ).dialog( "close" ); + changeUserGroup(id); + }, + Cancel: function() { + $( this ).dialog( "close" ); + } + } + }); + } + } + } ); +} +function changeUserGroup(id) { + var groups = $('#usergroup-'+id).val().toString(); + $.ajax( { + url: "options.py", + data: { + changeUserGroupId: id, + changeUserGroups: groups, + changeUserGroupsUser: $('#login-'+id).val(), + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + $("#user-"+id).addClass( "update", 1000 ); + setTimeout(function() { + $( "#user-"+id ).removeClass( "update" ); + }, 2500 ); + } + } ); +} +function addUserGroup(id) { + $.ajax( { + url: "options.py", + data: { + changeUserGroupId: id, + changeUserGroups: $('#new-group').val(), + changeUserGroupsUser: 'new', + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + $("#user-"+id).addClass( "update", 1000 ); + setTimeout(function() { + $( "#user-"+id ).removeClass( "update" ); + }, 2500 ); + } + } ); } \ No newline at end of file