From 0dd4142945a8f80f0075da983c5d8f162b291dda Mon Sep 17 00:00:00 2001 From: Pavel Loginov Date: Fri, 3 Sep 2021 14:07:55 +0600 Subject: [PATCH] v5.2.5.0 Changelog: https://haproxy-wi.org/changelog.py#5_2_5 --- app/create_db.py | 26 ++++++++++++++++++++--- app/db_model.py | 2 ++ app/funct.py | 37 ++++++++++++++++++++------------ app/options.py | 16 +++++++------- app/overview.py | 9 ++++---- app/sql.py | 32 +++++++++++++++++++++++----- app/templates/ovw.html | 48 ++++++++++++++++++++++++------------------ inc/add.js | 10 ++++----- inc/users.js | 2 +- 9 files changed, 122 insertions(+), 60 deletions(-) diff --git a/app/create_db.py b/app/create_db.py index e029c44b..e7c0523b 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -748,7 +748,8 @@ def update_db_v_5_2_5(**kwargs): else: print("An error occurred:", e) else: - print("Updating... DB has been updated to version 5.2.5") + if kwargs.get('silent') != 1: + print("Updating... DB has been updated to version 5.2.5") def update_db_v_5_2_5_1(**kwargs): @@ -758,7 +759,8 @@ def update_db_v_5_2_5_1(**kwargs): except Exception as e: print("An error occurred:", e) else: - print("Updating... DB has been updated to version 5.2.5-1") + if kwargs.get('silent') != 1: + print("Updating... DB has been updated to version 5.2.5-1") def update_db_v_5_2_5_2(**kwargs): @@ -768,7 +770,23 @@ def update_db_v_5_2_5_2(**kwargs): except Exception as e: print("An error occurred:", e) else: - print("Updating... DB has been updated to version 5.2.5-2") + if kwargs.get('silent') != 1: + print("Updating... DB has been updated to version 5.2.5-2") + + +def update_db_v_5_2_5_3(**kwargs): + cursor = conn.cursor() + sql = list() + sql.append("alter table user add column last_login_date timestamp default '0000-00-00 00:00:00'") + sql.append("alter table user add column last_login_ip VARCHAR ( 64 )") + for i in sql: + try: + cursor.execute(i) + except: + pass + else: + if kwargs.get('silent') != 1: + print('Updating... DB has been updated to version 5.2.5-3') def update_ver(): @@ -803,6 +821,7 @@ def update_all(): update_db_v_5_2_5() update_db_v_5_2_5_1() update_db_v_5_2_5_2() + update_db_v_5_2_5_3() update_ver() @@ -830,6 +849,7 @@ def update_all_silent(): update_db_v_5_2_5(silent=1) update_db_v_5_2_5_1(silent=1) update_db_v_5_2_5_2(silent=1) + update_db_v_5_2_5_3(silent=1) update_ver() diff --git a/app/db_model.py b/app/db_model.py index 8a3cbd0c..9ebefcc5 100644 --- a/app/db_model.py +++ b/app/db_model.py @@ -31,6 +31,8 @@ class User(BaseModel): ldap_user = IntegerField(default=0) activeuser = IntegerField(default=1) user_services = CharField(constraints=[SQL('DEFAULT "1 2 3"')]) + last_login_date = DateTimeField(default=datetime.now) + last_login_ip = CharField() class Meta: table_name = 'user' diff --git a/app/funct.py b/app/funct.py index be92834a..ae0cfaf1 100644 --- a/app/funct.py +++ b/app/funct.py @@ -58,6 +58,16 @@ def get_data(log_type, **kwargs): now_utc = datetime.now(timezone(sql.get_setting('time_zone'))) - timedelta(days=kwargs.get('timedelta_minus')) except Exception: now_utc = datetime.now(timezone('UTC')) - timedelta(days=kwargs.get('timedelta_minus')) + elif kwargs.get('timedelta_minutes'): + try: + now_utc = datetime.now(timezone(sql.get_setting('time_zone'))) + timedelta(minutes=kwargs.get('timedelta_minutes')) + except Exception: + now_utc = datetime.now(timezone('UTC')) + timedelta(minutes=kwargs.get('timedelta_minutes')) + elif kwargs.get('timedelta_minutes_minus'): + try: + now_utc = datetime.now(timezone(sql.get_setting('time_zone'))) - timedelta(minutes=kwargs.get('timedelta_minutes_minus')) + except Exception: + now_utc = datetime.now(timezone('UTC')) - timedelta(minutes=kwargs.get('timedelta_minutes_minus')) else: try: now_utc = datetime.now(timezone(sql.get_setting('time_zone'))) @@ -242,7 +252,6 @@ def check_login(**kwargs): sql.delete_old_uuid() if user_uuid is not None: - sql.update_last_act_user(user_uuid.value) if sql.get_user_name_by_uuid(user_uuid.value) is None: print('' % ref) return False @@ -255,6 +264,9 @@ def check_login(**kwargs): else: print('') return False + + user, user_uuid, role, token, servers, user_services = get_users_params() + sql.update_last_act_user(user_uuid.value, token) else: print('' % ref) return False @@ -336,11 +348,11 @@ def ssh_connect(serv): try: if ssh_enable == 1: - cloud = sql.is_cloud() - if cloud != '': - k = paramiko.pkey.load_private_key_file(ssh_key_name, password=cloud) - else: - k = paramiko.pkey.load_private_key_file(ssh_key_name) + # cloud = sql.is_cloud() + # if cloud != '': + # k = paramiko.pkey.load_private_key_file(ssh_key_name, password=cloud) + # else: + k = paramiko.pkey.load_private_key_file(ssh_key_name) ssh.connect(hostname=serv, port=ssh_port, username=ssh_user_name, pkey=k, timeout=11, banner_timeout=200) else: ssh.connect(hostname=serv, port=ssh_port, username=ssh_user_name, password=ssh_user_password, timeout=11, banner_timeout=200) @@ -736,15 +748,14 @@ def install_nginx(serv, **kwargs): def update_haproxy_wi(service): - if service != 'roxy-wi': - try: - if service != 'keep_alive': - service = service.split('_')[0] - except Exception: - pass import distro if distro.id() == 'ubuntu': - cmd = 'sudo apt-get update && sudo apt-get install ' + service +' && sudo systemctl restart ' + service + try: + if service == 'roxy-wi-keep_alive': + service = 'roxy-wi-keep-alive' + except Exception: + pass + cmd = 'sudo -S apt-get update && sudo apt-get install ' + service +' && sudo systemctl restart ' + service else: cmd = 'sudo -S yum -y update ' + service +' && sudo systemctl restart ' + service output, stderr = subprocess_execute(cmd) diff --git a/app/options.py b/app/options.py index 61e76fe9..d47b8ea7 100644 --- a/app/options.py +++ b/app/options.py @@ -281,15 +281,15 @@ if form.getvalue('list_select_id') is not None: if form.getvalue('list_id_for_delete') is not None: haproxy_sock_port = sql.get_setting('haproxy_sock_port') lists_path = sql.get_setting('lists_path') - fullpath = funct.get_config_var('main', 'fullpath') + full_path = funct.get_config_var('main', 'fullpath') ip_id = form.getvalue('list_ip_id_for_delete') ip = form.getvalue('list_ip_for_delete') list_id = form.getvalue('list_id_for_delete') list_name = form.getvalue('list_name') user_group = funct.get_user_group(id=1) - cmd = "sed -i 's!%s$!!' %s/%s/%s/%s" % (ip, fullpath, lists_path, user_group, list_name) - cmd1 = "sed -i '/^$/d' %s/%s/%s/%s" % (fullpath, lists_path, user_group, list_name) + cmd = "sed -i 's!%s$!!' %s/%s/%s/%s" % (ip, full_path, lists_path, user_group, list_name) + cmd1 = "sed -i '/^$/d' %s/%s/%s/%s" % (full_path, lists_path, user_group, list_name) output, stderr = funct.subprocess_execute(cmd) output1, stderr1 = funct.subprocess_execute(cmd1) if output: @@ -2176,11 +2176,11 @@ if form.getvalue('ssh_cert'): ssh_keys = full_dir + name + '.pem' try: - cloud = sql.is_cloud() - if cloud != '': - key.write_private_key_file(ssh_keys, password=cloud) - else: - key.write_private_key_file(ssh_keys) + # cloud = sql.is_cloud() + # if cloud != '': + # key.write_private_key_file(ssh_keys, password=cloud) + # else: + key.write_private_key_file(ssh_keys) except IOError as e: print('error: Cannot save SSH key file. ', str(e)) else: diff --git a/app/overview.py b/app/overview.py index ff4ca1c3..9f7ce1c1 100644 --- a/app/overview.py +++ b/app/overview.py @@ -32,7 +32,7 @@ try: i += 1 - cmd = "ps ax |grep 'metrics_worker\|metrics_waf_worker.py'|grep -v grep|grep '%s' |wc -l" % servers_for_grep + cmd = "ps ax |grep 'metrics_worker\|metrics_waf_worker.py\|metrics_nginx_worker.py'|grep -v grep|grep '%s' |wc -l" % servers_for_grep metrics_worker, stderr = funct.subprocess_execute(cmd) cmd = "ps ax |grep 'checker_worker\|checker_nginx'|grep -v grep |grep '%s' |wc -l" % servers_for_grep checker_worker, stderr = funct.subprocess_execute(cmd) @@ -49,8 +49,8 @@ try: prometheus = '' host = '' else: - users = sql.select_users() - cmd = "ps ax |grep 'metrics_worker\|metrics_waf_worker.py' |grep -v grep |wc -l" + users = sql.select_users(online=1) + cmd = "ps ax |grep 'metrics_worker\|metrics_waf_worker.py\|metrics_nginx_worker.py' |grep -v grep |wc -l" metrics_worker, stderr = funct.subprocess_execute(cmd) cmd = "ps ax |grep 'checker_worker\|checker_nginx' |grep -v grep |wc -l" checker_worker, stderr = funct.subprocess_execute(cmd) @@ -80,7 +80,7 @@ try: cmd = "systemctl is-active roxy-wi-portscanner" port_scanner, stderr = funct.subprocess_execute(cmd) -except: +except Exception as e: role = '' user = '' users = '' @@ -101,6 +101,7 @@ except: is_checker_worker = '' is_metrics_worker = '' token = '' + print(str(e)) template = template.render(h2=1, diff --git a/app/sql.py b/app/sql.py index 3dbd314d..a8da742e 100644 --- a/app/sql.py +++ b/app/sql.py @@ -313,8 +313,18 @@ def select_users(**kwargs): join(UserGroups, on=(User.user_id == UserGroups.user_id)). where(UserGroups.user_group_id == kwargs.get("group")) ) + elif kwargs.get('online') is not None: + query = (User. + select( + User, + Case(0, [(( + User.last_login_date >= funct.get_data('regular', timedelta_minutes_minus=15) + ), 0)], 1).alias('last_login') + ) + ) else: query = User.select().order_by(User.user_id) + try: query_res = query.execute() except Exception as e: @@ -490,15 +500,13 @@ def write_user_uuid(login, user_uuid): def write_user_token(login, user_token): - token_ttl = int(get_setting('token_ttl')) - try: user_id = User.get(User.username == login) except Exception as e: out_error(e) try: - Token.insert(user_id=user_id, token=user_token, exp=funct.get_data('regular', timedelta=token_ttl)).execute() + Token.insert(user_id=user_id, token=user_token, exp=funct.get_data('regular')).execute() except Exception as e: out_error(e) @@ -570,8 +578,9 @@ def delete_uuid(uuid): def delete_old_uuid(): + token_ttl = int(get_setting('token_ttl')) query = UUID.delete().where((UUID.exp < funct.get_data('regular')) | (UUID.exp.is_null(True)) ) - query1 = Token.delete().where((Token.exp < funct.get_data('regular')) | (Token.exp.is_null(True)) ) + query1 = Token.delete().where((Token.exp > funct.get_data('regular', timedelta=token_ttl)) | (Token.exp.is_null(True)) ) try: query.execute() query1.execute() @@ -579,12 +588,25 @@ def delete_old_uuid(): out_error(e) -def update_last_act_user(uuid): +def update_last_act_user(uuid, token): session_ttl = int(get_setting('session_ttl')) + token_ttl = int(get_setting('token_ttl')) + try: + import cgi + import os + ip = cgi.escape(os.environ["REMOTE_ADDR"]) + except Exception: + ip = '' + + user_id = get_user_id_by_uuid(uuid) query = UUID.update(exp=funct.get_data('regular', timedelta=session_ttl)).where(UUID.uuid == uuid) + query1 = Token.update(exp=funct.get_data('regular', timedelta=token_ttl)).where(Token.token == token) + query2 = User.update(last_login_date=funct.get_data('regular'), last_login_ip=ip).where(User.user_id == user_id) try: query.execute() + query1.execute() + query2.execute() except Exception as e: out_error(e) diff --git a/app/templates/ovw.html b/app/templates/ovw.html index 81c4c613..c4473ea4 100644 --- a/app/templates/ovw.html +++ b/app/templates/ovw.html @@ -286,9 +286,16 @@ {% if role <= 2 %} + {% if role == 2 %} + {% set admin_uri = 'servers.py' %} + {% elif role == 1 %} + {% set admin_uri = 'users.py' %} + {% endif %} - + - {% if role == 2 %} - {% set admin_uri = 'servers.py' %} - {% elif role == 1 %} - {% set admin_uri = 'users.py' %} - {% endif %} {% set counter = 0 %} {% for USER in users %} {% set counter = counter + loop.index0 %} {% if counter <= 2 %} -
Login + Login + Groups Role @@ -299,20 +306,18 @@
- - {{ USER.username }} - + + {% if USER.last_login %} + + {% else %} + + {% endif %} + {{ USER.username }} {% for group in users_groups %} @@ -326,9 +331,12 @@ {% else %}