Pavel Loginov 2021-09-03 14:07:55 +06:00
parent cd36944153
commit 0dd4142945
9 changed files with 122 additions and 60 deletions

View File

@ -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()

View File

@ -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'

View File

@ -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('<meta http-equiv="refresh" content="0; url=login.py?ref=%s">' % ref)
return False
@ -255,6 +264,9 @@ def check_login(**kwargs):
else:
print('<meta http-equiv="refresh" content="0; url=overview.py">')
return False
user, user_uuid, role, token, servers, user_services = get_users_params()
sql.update_last_act_user(user_uuid.value, token)
else:
print('<meta http-equiv="refresh" content="0; url=login.py?ref=%s">' % 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)

View File

@ -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:

View File

@ -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,

View File

@ -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)

View File

@ -286,9 +286,16 @@
</tr>
</table>
{% if role <= 2 %}
{% if role == 2 %}
{% set admin_uri = 'servers.py' %}
{% elif role == 1 %}
{% set admin_uri = 'users.py' %}
{% endif %}
<table class="overview-wi">
<tr class="overviewHead">
<td class="padding10 first-collumn-wi">Login</td>
<td class="padding10 first-collumn-wi">
<a href="{{admin_uri}}#users" title="Manage users" class="logs_link">Login</a>
</td>
<td class="second-collumn">Groups</td>
<td>Role</td>
<td>
@ -299,20 +306,18 @@
</span>
</td>
</tr>
{% 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 %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi">
<a href="{{admin_uri}}#users" title="Edit user" class="logs_link div-pic">
{{ USER.username }}
</a>
<td class="padding10 first-collumn-wi">
{% if USER.last_login %}
<span class="serverUp" style="margin-right: 5px;" title="{{USER.username}} is online"></span>
{% else %}
<span class="serverNone" style="margin-right: 5px;" title="{{USER.username}} is offline"></span>
{% endif %}
{{ USER.username }}
</td>
<td class="third-collumn-wi">
{% for group in users_groups %}
@ -326,9 +331,12 @@
{% else %}
<tr style="display: none;" class="show-users {{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi">
<a href="users.py#users" title="Edit user" class="logs_link div-pic">
{{ USER.username }}
</a>
{% if USER.last_login %}
<span class="serverUp" style="margin-right: 5px;" title="{{USER.username}} is online"></span>
{% else %}
<span class="serverNone" style="margin-right: 5px;" title="{{USER.username}} is offline"></span>
{% endif %}
{{ USER.username }}
</td>
<td class="third-collumn-wi">
{% for group in users_groups %}
@ -346,7 +354,9 @@
{% if role <= 1 %}
<table class="overview-wi">
<tr class="overviewHead">
<td class="padding10 first-collumn-wi">Group</td>
<td class="padding10 first-collumn-wi">
<a href="users.py#groups" title="Manage groups" class="logs_link">Group</a>
</td>
<td class="second-collumn" style="width: 40%">Description</td>
<td>
<span class="add-button-wi">
@ -362,18 +372,14 @@
{% if counter <= 2 %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi">
<a href="users.py#groups" title="Edit groups" class="logs_link div-pic">
{{ group.name }}
</a>
{{ group.name }}
</td>
<td class="third-collumn-wi" colspan="2">{{ group.description }}</td>
</tr>
{% else %}
<tr style="display: none;" class="show-groups {{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi">
<a href="users.py#groups" title="Edit groups" class="logs_link div-pic">
{{ group.name }}
</a>
<td class="padding10 first-collumn-wi">
{{ group.name }}
</td>
<td class="third-collumn-wi" colspan="2">{{ group.description }}</td>
</tr>

View File

@ -1527,7 +1527,7 @@ function createList(color) {
},
type: "POST",
success: function( data ) {
if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('Errno') != '-1') {
toastr.error(data);
} else if (data.indexOf('Info') != '-1' ){
toastr.clear();
@ -1591,8 +1591,8 @@ function editList(list, color) {
}
function saveList(action, list, color) {
var serv = $( "#serv-"+color+"-list option:selected" ).val();
if (serv == 'Choose server') {
toastr.warning('Choose a server before updating');
if (serv == '------') {
toastr.warning('Select a server before updating');
} else {
$.ajax({
url: "options.py",
@ -1611,7 +1611,7 @@ function saveList(action, list, color) {
for (i = 0; i < data.length; i++) {
if (data[i]) {
if (data[i].indexOf('error: ') != '-1') {
if (data[i].indexOf('error: ') != '-1' || data[i].indexOf('Errno') != '-1') {
toastr.error(data[i]);
} else {
toastr.success(data[i]);
@ -1638,7 +1638,7 @@ function deleteList(list, color) {
},
type: "POST",
success: function (data) {
if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('Errno') != '-1') {
toastr.error(data);
} else if (data.indexOf('Info') != '-1' ){
toastr.clear();

View File

@ -2117,7 +2117,7 @@ function updateService(service) {
toastr.error(data);
} else if (data.indexOf('Complete!') != '-1'){
toastr.clear();
toastr.success('Update was success!');
toastr.success(service + ' has been updated');
} else if (data.indexOf('Unauthorized') != '-1') {
toastr.clear();
toastr.error('It seems like Unauthorized in the Roxy-WI repository. How to get Roxy-WI auth you can read <b><a href="https://haproxy-wi.org/installation.py" title="How to get Roxy-WI auth">hear</a></b>');