diff --git a/app/add.py b/app/add.py index 5d77ed14..81aeba53 100644 --- a/app/add.py +++ b/app/add.py @@ -41,8 +41,8 @@ if all(v is None for v in [ if not os.path.exists(black_dir): os.makedirs(black_dir) - white_lists = funct.get_files(dir=white_dir, format="lst") - black_lists = funct.get_files(dir=black_dir, format="lst") + white_lists = funct.get_files(white_dir, "lst") + black_lists = funct.get_files(black_dir, "lst") template = template.render( title="Add: ", role=role, user=user, selects=servers, add=form.getvalue('add'), conf_add=form.getvalue('conf'), diff --git a/app/config.py b/app/config.py index 6bb4b188..f6215b1c 100644 --- a/app/config.py +++ b/app/config.py @@ -32,7 +32,7 @@ except Exception as e: if service in ('haproxy', 'nginx', 'keepalived', 'apache'): service_desc = sql.select_service(service) if funct.check_login(service=service_desc.service_id): - title = f"Working with {service_desc.service} configuration files" + title = f"{service_desc.service} config view page" action = f"config.py?service={service_desc.slug}" configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir') file_format = 'conf' @@ -60,6 +60,8 @@ if serv is not None and form.getvalue('open') is not None and form.getvalue('new is_serv_protected = sql.is_serv_protected(serv) server_id = sql.select_server_id_by_ip(serv) is_restart = sql.select_service_setting(server_id, service, 'restart') + service_desc = sql.select_service(service) + title = f'{service_desc.service} config edit page' if service == 'keepalived': error = funct.get_config(serv, cfg, keepalived=1) diff --git a/app/create_db.py b/app/create_db.py index 765d9860..af07b24d 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -988,7 +988,7 @@ def update_db_v_6_1_4(): def update_ver(): - query = Version.update(version='6.1.4.0') + query = Version.update(version='6.1.5.0') try: query.execute() except Exception: diff --git a/app/db_model.py b/app/db_model.py index a3dc6825..0305c2d4 100644 --- a/app/db_model.py +++ b/app/db_model.py @@ -561,6 +561,17 @@ class WafNginx(BaseModel): constraints = [SQL('UNIQUE (server_id)')] +class ServiceStatus(BaseModel): + server_id = ForeignKeyField(Server, on_delete='Cascade') + service_id = IntegerField() + service_check = CharField() + status = IntegerField(constraints=[SQL('DEFAULT 1')]) + + class Meta: + table_name = 'services_statuses' + constraints = [SQL('UNIQUE (server_id, service_id, service_check)')] + + def create_tables(): with conn: conn.create_tables([User, Server, Role, Telegram, Slack, UUID, Token, ApiToken, Groups, UserGroups, ConfigVersion, @@ -568,4 +579,4 @@ def create_tables(): PortScannerSettings, PortScannerPorts, PortScannerHistory, ProvidersCreds, ServiceSetting, ProvisionedServers, MetricsHttpStatus, SMON, WafRules, Alerts, GeoipCodes, NginxMetrics, SystemInfo, Services, UserName, GitSetting, CheckerSetting, ApacheMetrics, ProvisionParam, - WafNginx]) + WafNginx, ServiceStatus]) diff --git a/app/funct.py b/app/funct.py index 47bf8670..628ae19c 100644 --- a/app/funct.py +++ b/app/funct.py @@ -3,6 +3,8 @@ import cgi import os import sys import re +import json +import http.cookies def is_ip_or_dns(server_from_request: str) -> str: @@ -58,7 +60,7 @@ def get_config_var(sec, var): return config.get(sec, var) except Exception: print('Content-type: text/html\n') - print('
Check the config file. Presence section %s and parameter %s
' % (sec, var)) + print(f'
Check the config file. Presence section {sec} and parameter {var}
') return @@ -108,7 +110,6 @@ def get_data(log_type, **kwargs): def get_user_group(**kwargs): import sql - import http.cookies user_group = '' try: @@ -130,7 +131,6 @@ def get_user_group(**kwargs): def logging(server_ip, action, **kwargs): import sql - import http.cookies import distro login = '' @@ -288,7 +288,6 @@ def slack_send_mess(mess, **kwargs): def check_login(**kwargs): import sql - import http.cookies user_uuid = None cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) try: @@ -325,7 +324,6 @@ def get_user_id(**kwargs): if kwargs.get('login'): return sql.get_user_id_by_username(kwargs.get('login')) - import http.cookies cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') @@ -337,7 +335,6 @@ def get_user_id(**kwargs): def is_admin(**kwargs): import sql - import http.cookies cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_id = cookie.get('uuid') try: @@ -364,8 +361,7 @@ def page_for_admin(**kwargs): if not is_admin(level=give_level): print('') - import sys - sys.exit() + return def return_ssh_keys_path(server_ip, **kwargs): @@ -439,6 +435,7 @@ def ssh_connect(server_ip): def get_config(server_ip, cfg, **kwargs): import sql + config_path = '' if kwargs.get("keepalived") or kwargs.get("service") == 'keepalived': config_path = sql.get_setting('keepalived_config_path') @@ -479,7 +476,6 @@ def get_config(server_ip, cfg, **kwargs): def diff_config(oldcfg, cfg, **kwargs): - import http.cookies import sql cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) log_path = get_config_var('main', 'log_path') @@ -628,7 +624,7 @@ def get_backends_from_config(server_ip, backends=''): format_cfg = 'cfg' try: - cfg = configs_dir + get_files(dir=configs_dir, format=format_cfg)[0] + cfg = configs_dir + get_files(configs_dir, format_cfg)[0] except Exception as e: logging('localhost', str(e), haproxywi=1) try: @@ -987,9 +983,9 @@ def upload_and_restart(server_ip, cfg, **kwargs): config_path = sql.get_setting('haproxy_config_path') tmp_file = sql.get_setting('tmp_config_path') + "/" + get_data('config') + ".cfg" - is_docker = sql.select_service_setting(server_id, service, 'dockerized') + is_dockerized = sql.select_service_setting(server_id, service, 'dockerized') - if is_docker == '1': + if is_dockerized == '1': service_cont_name = service + '_container_name' container_name = sql.get_setting(service_cont_name) reload_command = " && sudo docker kill -s HUP " + container_name @@ -1035,7 +1031,7 @@ def upload_and_restart(server_ip, cfg, **kwargs): else: commands = [move_config + reload_or_restart_command] elif service == "nginx": - if is_docker == '1': + if is_dockerized == '1': check_config = "sudo docker exec -it exec " + container_name + " nginx -t " else: check_config = "sudo nginx -t " @@ -1049,7 +1045,7 @@ def upload_and_restart(server_ip, cfg, **kwargs): if sql.return_firewall(server_ip): commands[0] += open_port_firewalld(cfg, server_ip=server_ip, service='nginx') elif service == "apache": - if is_docker == '1': + if is_dockerized == '1': check_config = "sudo docker exec -it exec " + container_name + " sudo apachectl configtest " else: check_config = "sudo apachectl configtest " @@ -1069,7 +1065,7 @@ def upload_and_restart(server_ip, cfg, **kwargs): else: commands = [check_and_move + reload_or_restart_command] else: - if is_docker == '1': + if is_dockerized == '1': check_config = "sudo docker exec -it " + container_name + " haproxy -c -f " + tmp_file else: check_config = "sudo " + service_name + " -c -f " + tmp_file @@ -1224,10 +1220,10 @@ def open_port_firewalld(cfg, server_ip, **kwargs): def check_haproxy_config(server_ip): import sql server_id = sql.select_server_id_by_ip(server_ip=server_ip) - is_docker = sql.select_service_setting(server_id, 'haproxy', 'dockerized') + is_dockerized = sql.select_service_setting(server_id, 'haproxy', 'dockerized') config_path = sql.get_setting('haproxy_config_path') - if is_docker == '1': + if is_dockerized == '1': container_name = sql.get_setting('haproxy_container_name') commands = ["sudo docker exec -it " + container_name + " haproxy -q -c -f " + config_path] else: @@ -1301,7 +1297,10 @@ def show_finding_in_config(stdout: str, **kwargs) -> str: return out -def show_haproxy_log(serv, rows=10, waf='0', grep=None, hour='00', minut='00', hour1='24', minut1='00', service='haproxy', **kwargs): +def show_haproxy_log( + serv, rows='10', waf='0', grep=None, hour='00', + minut='00', hour1='24', minut1='00', service='haproxy', **kwargs +) -> str: import sql exgrep = form.getvalue('exgrep') log_file = form.getvalue('file') @@ -1379,7 +1378,7 @@ def show_haproxy_log(serv, rows=10, waf='0', grep=None, hour='00', minut='00', h user_grep = '' log_path = get_config_var('main', 'log_path') - logs_files = get_files(log_path, format="log") + logs_files = get_files(log_path, "log") for key, value in logs_files: if int(serv) == key: @@ -1403,7 +1402,7 @@ def roxy_wi_log(**kwargs): log_path = get_config_var('main', 'log_path') if kwargs.get('log_id'): - selects = get_files(log_path, format="log") + selects = get_files(log_path, "log") for key, value in selects: log_file = kwargs.get('file') + ".log" if log_file == value: @@ -1495,7 +1494,6 @@ def subprocess_execute(cmd): def show_backends(server_ip, **kwargs): - import json import sql hap_sock_p = sql.get_setting('haproxy_sock_port') cmd = 'echo "show backend" |nc %s %s' % (server_ip, hap_sock_p) @@ -1520,22 +1518,22 @@ def show_backends(server_ip, **kwargs): return ret -def get_files(dir=get_config_var('configs', 'haproxy_save_configs_dir'), format='cfg'): +def get_files(folder=get_config_var('configs', 'haproxy_save_configs_dir'), file_format='cfg'): import glob - if format == 'log': + if file_format == 'log': file = [] else: file = set() return_files = set() i = 0 - for files in sorted(glob.glob(os.path.join(dir, '*.' + format + '*'))): - if format == 'log': + for files in sorted(glob.glob(os.path.join(folder, '*.' + file_format + '*'))): + if file_format == 'log': file += [(i, files.split('/')[5])] else: file.add(files.split('/')[-1]) i += 1 files = file - if format == 'cfg' or format == 'conf': + if file_format == 'cfg' or file_format == 'conf': for file in files: ip = file.split("-") if serv == ip[0]: @@ -1593,20 +1591,23 @@ def check_new_version(service): if proxy is not None and proxy != '' and proxy != 'None': proxy_dict = {"https": proxy, "http": proxy} response = requests.get(f'https://roxy-wi.org/version/get/{service}', timeout=1, proxies=proxy_dict) - requests.get(f'https://roxy-wi.org/version/send/{current_ver}', timeout=1, proxies=proxy_dict) - response_status = requests.get(f'https://roxy-wi.org/user-name/{user_name}', timeout=1, proxies=proxy_dict) + if service == 'roxy-wi': + requests.get(f'https://roxy-wi.org/version/send/{current_ver}', timeout=1, proxies=proxy_dict) + response_status = requests.get(f'https://roxy-wi.org/user-name/{user_name}', timeout=1, proxies=proxy_dict) else: response = requests.get(f'https://roxy-wi.org/version/get/{service}', timeout=1) - requests.get(f'https://roxy-wi.org/version/send/{current_ver}', timeout=1) - response_status = requests.get(f'https://roxy-wi.org/user-name/{user_name}', timeout=1) + if service == 'roxy-wi': + requests.get(f'https://roxy-wi.org/version/send/{current_ver}', timeout=1) + response_status = requests.get(f'https://roxy-wi.org/user-name/{user_name}', timeout=1) res = response.content.decode(encoding='UTF-8') - try: - status = response_status.content.decode(encoding='UTF-8') - status = status.split(' ') - sql.update_user_status(status[0], status[1].strip(), status[2].strip()) - except Exception: - pass + if service == 'roxy-wi': + try: + status = response_status.content.decode(encoding='UTF-8') + status = status.split(' ') + sql.update_user_status(status[0], status[1].strip(), status[2].strip()) + except Exception: + pass except requests.exceptions.RequestException as e: logging('localhost', ' ' + str(e), haproxywi=1) @@ -1655,7 +1656,6 @@ def get_hash(value): def get_users_params(**kwargs): - import http.cookies import sql cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) @@ -1667,6 +1667,11 @@ def get_users_params(**kwargs): user_services = sql.select_user_services(user_id) token = sql.get_token(user_uuid.value) except Exception: + user = '' + role = '' + user_uuid = '' + user_services = '' + token = '' print('') if kwargs.get('virt') and kwargs.get('haproxy'): @@ -1693,8 +1698,6 @@ def check_user_group(**kwargs): user_uuid = kwargs.get('user_uuid') user_id = sql.get_user_id_by_uuid(user_uuid) else: - import http.cookies - import os cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') group = cookie.get('group') @@ -1825,7 +1828,6 @@ def is_service_active(server_ip: str, service_name: str): def get_system_info(server_ip: str) -> bool: - import json import sql server_ip = is_ip_or_dns(server_ip) if server_ip == '': @@ -2083,7 +2085,6 @@ def send_message_to_rabbit(message: str, **kwargs) -> None: def is_restarted(server_ip, action): import sql - import http.cookies cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') @@ -2094,7 +2095,7 @@ def is_restarted(server_ip, action): sys.exit() -def is_not_allowed_to_restart(server_id: int, service: str) -> bool: +def is_not_allowed_to_restart(server_id: int, service: str) -> None: import sql is_restart = sql.select_service_setting(server_id, service, 'restart') @@ -2159,11 +2160,11 @@ def send_email(email_to: str, subject: str, message: str) -> None: msg['To'] = email_to try: - smtpObj = SMTP(mail_smtp_host, mail_smtp_port) + smtp_obj = SMTP(mail_smtp_host, mail_smtp_port) if mail_ssl: - smtpObj.starttls() - smtpObj.login(mail_smtp_user, mail_smtp_password) - smtpObj.send_message(msg) + smtp_obj.starttls() + smtp_obj.login(mail_smtp_user, mail_smtp_password) + smtp_obj.send_message(msg) logging('localhost', 'An email has been sent to ' + email_to, haproxywi=1) except Exception as e: logging('localhost', 'error: unable to send email: ' + str(e), haproxywi=1) @@ -2182,8 +2183,8 @@ def send_email_to_server_group(subject: str, mes: str, group_id: int) -> None: def alert_routing( - server_ip: str, service_id: int, group_id: int, level: str, mes: str, alert_type: str) -> None: - import json + server_ip: str, service_id: int, group_id: int, level: str, mes: str, alert_type: str +) -> None: import sql subject: str = level + ': ' + mes diff --git a/app/hapservers.py b/app/hapservers.py index 90778140..d7661bc0 100644 --- a/app/hapservers.py +++ b/app/hapservers.py @@ -20,10 +20,11 @@ serv = funct.is_ip_or_dns(form.getvalue('serv')) service = funct.checkAjaxInput(form.getvalue('service')) autorefresh = 0 servers_waf = () -title = "HAProxy servers overview" +title = '' cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l" keep_alive, stderr = funct.subprocess_execute(cmd) is_restart = '' +service_desc = '' restart_settings = '' if service in ('haproxy', 'nginx', 'keepalived', 'apache'): @@ -177,6 +178,6 @@ template = template.render( h2=1, autorefresh=autorefresh, title=title, role=role, user=user, servers=servers_with_status1, keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_services, docker_settings=docker_settings, user_status=user_status, user_plan=user_plan, servers_waf=servers_waf, - restart_settings=restart_settings, token=token + restart_settings=restart_settings, service_desc=service_desc, token=token ) print(template) diff --git a/app/options.py b/app/options.py index d1ce43ed..28807db1 100644 --- a/app/options.py +++ b/app/options.py @@ -2,6 +2,10 @@ # -*- coding: utf-8 -*- import os import sys +import json +import http.cookies + +from jinja2 import Environment, FileSystemLoader import funct import sql @@ -249,8 +253,6 @@ if form.getvalue('table_serv_select') is not None: print(funct.get_all_stick_table()) if form.getvalue('table_select') is not None: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) table = form.getvalue('table_select') @@ -302,8 +304,6 @@ if form.getvalue('list_serv_select') is not None: print(output) if form.getvalue('list_select_id') is not None: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) template = env.get_template('ajax/list.html') @@ -378,8 +378,6 @@ if form.getvalue('list_ip_for_add') is not None: service='haproxy') if form.getvalue('sessions_select') is not None: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) serv = funct.checkAjaxInput(form.getvalue('sessions_select')) @@ -592,8 +590,6 @@ if form.getvalue('action_service') is not None: funct.logging('localhost', ' The service ' + serv + ' has been ' + action + 'ed', haproxywi=1, login=1) if act == "overviewHapserverBackends": - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('haproxyservers_backends.html') service = form.getvalue('service') @@ -608,7 +604,7 @@ if act == "overviewHapserverBackends": if service != 'nginx' and service != 'apache': try: - sections = funct.get_sections(configs_dir + funct.get_files(dir=configs_dir, format=format_file)[0], service=service) + sections = funct.get_sections(configs_dir + funct.get_files(configs_dir, format_file)[0], service=service) except Exception as e: funct.logging('localhost', str(e), haproxywi=1) @@ -639,7 +635,7 @@ if form.getvalue('show_userlists'): format_file = 'cfg' try: - sections = funct.get_userlists(configs_dir + funct.get_files(dir=configs_dir, format=format_file)[0]) + sections = funct.get_userlists(configs_dir + funct.get_files(configs_dir, format_file)[0]) except Exception as e: funct.logging('localhost', str(e), haproxywi=1) try: @@ -673,8 +669,6 @@ if act == "overviewHapservers": if act == "overview": import asyncio - import http.cookies - from jinja2 import Environment, FileSystemLoader async def async_get_overview(serv1, serv2, user_uuid, server_id): user_id = sql.get_user_id_by_uuid(user_uuid) @@ -753,9 +747,6 @@ if act == "overview": ioloop.close() if act == "overviewwaf": - import http.cookies - - from jinja2 import Environment, FileSystemLoader env = Environment( loader=FileSystemLoader('templates/ajax'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'] @@ -846,8 +837,6 @@ if act == "overviewServers": return server_status async def get_runner_overviewServers(**kwargs): - import http.cookies - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax'), extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) template = env.get_template('overviewServers.html') @@ -933,8 +922,6 @@ if serv is not None and act == "stats": data = response.content if form.getvalue('service') == 'nginx': - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/nginx_stats.html') @@ -1226,8 +1213,6 @@ if form.getvalue('servaction') is not None: funct.logging(serv, action) if act == "showCompareConfigs": - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/show_compare_configs.html') left = form.getvalue('left') @@ -1247,8 +1232,6 @@ if act == "showCompareConfigs": print(template) if serv is not None and form.getvalue('right') is not None: - from jinja2 import Environment, FileSystemLoader - left = funct.checkAjaxInput(form.getvalue('left')) right = funct.checkAjaxInput(form.getvalue('right')) @@ -1273,8 +1256,6 @@ if serv is not None and form.getvalue('right') is not None: print(stderr) if serv is not None and act == "configShow": - import http.cookies - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') role_id = sql.get_user_role_by_uuid(user_uuid.value) @@ -1317,9 +1298,6 @@ if serv is not None and act == "configShow": is_serv_protected = sql.is_serv_protected(serv) server_id = sql.select_server_id_by_ip(serv) is_restart = sql.select_service_setting(server_id, service, 'restart') - - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True, trim_blocks=True, lstrip_blocks=True, extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) template = env.get_template('config_show.html') @@ -1351,8 +1329,6 @@ if act == 'configShowFiles': print(return_files) sys.exit() return_files += ' ' + sql.get_setting(service + '_config_path') - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/show_configs_files.html') template = template.render(serv=serv, service=service, return_files=return_files, @@ -1366,7 +1342,6 @@ if act == 'showRemoteLogFiles': if 'error: ' in return_files: print(return_files) sys.exit() - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/show_log_files.html') @@ -1408,8 +1383,8 @@ if form.getvalue('master'): commands = [ "chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SSH_PORT=" + ssh_port + " router_id=" + router_id + " ETH=" + ETH + " IP=" + str(IP) + " MASTER=MASTER" + " ETH_SLAVE=" + ETH_SLAVE + " keepalived_path_logs=" + keepalived_path_logs - + " RETURN_TO_MASTER=" + return_to_master + " SYN_FLOOD=" + syn_flood + " HOST=" + str(master) - + " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + "' KEY=" + str(ssh_key_name) + + " RETURN_TO_MASTER=" + return_to_master + " SYN_FLOOD=" + syn_flood + " HOST=" + str(master) + " HAPROXY=" + haproxy + + " NGINX=" + nginx + " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + "' KEY=" + str(ssh_key_name) ] output, error = funct.subprocess_execute(commands[0]) @@ -1433,6 +1408,8 @@ if form.getvalue('master_slave'): ETH_SLAVE = form.getvalue('slave_interface') IP = form.getvalue('vrrpip') syn_flood = form.getvalue('syn_flood') + haproxy = form.getvalue('hap') + nginx = form.getvalue('nginx') router_id = form.getvalue('router_id') script = "install_keepalived.sh" proxy = sql.get_setting('proxy') @@ -1457,7 +1434,7 @@ if form.getvalue('master_slave'): commands = [ "chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SSH_PORT=" + ssh_port + " router_id=" + router_id + " ETH=" + ETH + " IP=" + IP + " MASTER=BACKUP" + " ETH_SLAVE=" + ETH_SLAVE + " keepalived_path_logs=" + keepalived_path_logs - + " HOST=" + str(slave) + " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + + " HAPROXY=" + HAPROXY + " NGINX=" + nginx + " HOST=" + str(slave) + " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + "' KEY=" + str(ssh_key_name) ] @@ -1575,6 +1552,7 @@ if form.getvalue('master_slave_nginx'): if form.getvalue('install_grafana'): script = "install_grafana.sh" proxy = sql.get_setting('proxy') + host = os.environ.get('HTTP_HOST', '') os.system("cp scripts/%s ." % script) @@ -1589,10 +1567,9 @@ if form.getvalue('install_grafana'): if error: funct.logging('localhost', error, haproxywi=1) - import socket print( - 'success: Grafana and Prometheus servers were installed. You can find Grafana on http://' + socket.gethostname() + ':3000
') + f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000
') else: for line in output: if any(s in line for s in ("Traceback", "FAILED")): @@ -1603,10 +1580,8 @@ if form.getvalue('install_grafana'): print(output) break else: - import socket - print( - 'success: Grafana and Prometheus servers were installed. You can find Grafana on http://' + socket.gethostname() + ':3000
') + f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000
') os.system("rm -f %s" % script) @@ -1778,8 +1753,6 @@ if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupup else: if not deljob and not update: if sql.insert_backup_job(serv, rserver, rpath, backup_type, time, cred, description): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('new_backup.html') template = template.render( @@ -1858,8 +1831,6 @@ if form.getvalue('git_backup'): server_id=server_id, service_id=service_id, repo=repo, branch=branch, period=period, cred=cred, description=description ): - from jinja2 import Environment, FileSystemLoader - gits = sql.select_gits(server_id=server_id, service_id=service_id) sshs = sql.select_ssh() @@ -1914,7 +1885,6 @@ if form.getvalue('table_metrics'): metrics = sql.select_service_table_metrics(service) else: metrics = sql.select_table_metrics() - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('table_metrics.html') @@ -1923,8 +1893,6 @@ if form.getvalue('table_metrics'): print(template) if form.getvalue('metrics_hapwi_ram'): - import json - ip = form.getvalue('ip') metrics = {'chartData': {}} rams = '' @@ -1956,8 +1924,6 @@ if form.getvalue('metrics_hapwi_cpu'): 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) import psutil cpus_list = psutil.cpu_times_percent(interval=1, percpu=False) @@ -1979,8 +1945,6 @@ if form.getvalue('metrics_hapwi_cpu'): metrics['chartData']['cpus'] = cpus - import json - print(json.dumps(metrics)) if form.getvalue('new_metrics'): @@ -2011,8 +1975,6 @@ if form.getvalue('new_metrics'): metrics['chartData']['sess_rate'] = sess_rate metrics['chartData']['server'] = hostname + ' (' + server + ')' - import json - print(json.dumps(metrics)) if form.getvalue('new_http_metrics'): @@ -2046,8 +2008,6 @@ if form.getvalue('new_http_metrics'): metrics['chartData']['http_5xx'] = http_5xx metrics['chartData']['server'] = hostname + ' (' + server + ')' - import json - print(json.dumps(metrics)) if any((form.getvalue('new_nginx_metrics'), form.getvalue('new_apache_metrics'), form.getvalue('new_waf_metrics'))): @@ -2080,8 +2040,6 @@ if any((form.getvalue('new_nginx_metrics'), form.getvalue('new_apache_metrics'), metrics['chartData']['curr_con'] = curr_con metrics['chartData']['server'] = hostname + ' (' + serv + ')' - import json - print(json.dumps(metrics)) if form.getvalue('get_hap_v'): @@ -2225,7 +2183,7 @@ if form.getvalue('bwlists_delete'): if form.getvalue('get_lists'): lib_path = funct.get_config_var('main', 'lib_path') list_path = lib_path + "/" + sql.get_setting('lists_path') + "/" + form.getvalue('group') + "/" + form.getvalue('color') - lists = funct.get_files(dir=list_path, format="lst") + lists = funct.get_files(list_path, "lst") for l in lists: print(l) @@ -2296,8 +2254,6 @@ if form.getvalue('newuser') is not None: if funct.check_user_group(): if funct.is_admin(level=role_id): if sql.add_user(new_user, email, password, role, activeuser, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/new_user.html') @@ -2424,8 +2380,6 @@ if form.getvalue('newserver') is not None: user_status, user_plan = 0, 0 funct.logging('localhost', 'Cannot get a user plan: ' + str(e), haproxywi=1) - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/new_server.html') @@ -2504,8 +2458,6 @@ if form.getvalue('newgroup') is not None: print(error_mess) else: if sql.add_group(newgroup, desc): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax/'), autoescape=True) template = env.get_template('/new_group.html') @@ -2550,8 +2502,6 @@ if form.getvalue('new_ssh'): print(error_mess) else: if sql.insert_new_ssh(name, enable, group, username, password): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/new_ssh.html') output_from_parsed_template = template.render(groups=sql.select_groups(), sshs=sql.select_ssh(name=name), @@ -2621,13 +2571,14 @@ if form.getvalue('ssh_cert'): key = paramiko.pkey.load_private_key(form.getvalue('ssh_cert')) except Exception as e: print('error: Cannot save SSH key file: ', str(e)) + sys.exit() lib_path = funct.get_config_var('main', 'lib_path') full_dir = lib_path + '/keys/' ssh_keys = name + '.pem' try: - split_name = name.split('_')[1] + check_split = name.split('_')[1] split_name = True except Exception: split_name = False @@ -2644,6 +2595,7 @@ if form.getvalue('ssh_cert'): key.write_private_key_file(ssh_keys) except Exception as e: print('error: Cannot save SSH key file: ', str(e)) + sys.exit() else: print('success: SSH key has been saved into: %s ' % ssh_keys) @@ -2666,8 +2618,6 @@ if form.getvalue('newtelegram'): print(error_mess) else: if sql.insert_new_telegram(token, channel, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/new_telegram.html') output_from_parsed_template = template.render(groups=sql.select_groups(), @@ -2686,8 +2636,6 @@ if form.getvalue('newslack'): print(error_mess) else: if sql.insert_new_slack(token, channel, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/new_slack.html') output_from_parsed_template = template.render(groups=sql.select_groups(), @@ -2751,7 +2699,6 @@ if form.getvalue('getuserservices'): services = sql.select_services() for g in u_g: groups.append(g.user_group_id) - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/show_user_services.html') @@ -2764,7 +2711,6 @@ if form.getvalue('getusergroups'): u_g = sql.select_user_groups(user_id) for g in u_g: groups.append(g.user_group_id) - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/show_user_groups.html') @@ -2801,16 +2747,11 @@ if form.getvalue('changeUserCurrentGroupId') is not None: print('error: Cannot change group') 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') group_id = sql.get_user_id_by_uuid(user_id.value) groups = sql.select_user_groups_with_names(group_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=group_id) @@ -2846,7 +2787,6 @@ if form.getvalue('newsmon') is not None: last_id = sql.insert_smon(server, port, enable, http, uri, body, group, desc, telegram, slack, user_group) if last_id: - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/show_new_smon.html') template = template.render( @@ -2868,9 +2808,6 @@ if form.getvalue('smondel') is not None: if form.getvalue('showsmon') is not None: user_group = funct.get_user_group(id=1) sort = form.getvalue('sort') - - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/smon_dashboard.html') template = template.render(smon=sql.smon_list(user_group), sort=sort) @@ -2916,17 +2853,14 @@ if form.getvalue('showBytes') is not None: bit_in, stderr = funct.subprocess_execute(cmd) bin_bout.append(bit_in[0]) cmd = "echo 'show stat' |nc {} {} |cut -d ',' -f 1-2,10|grep -E '[0-9]'|awk -F',' '{{sum+=$3;}}END{{print sum;}}'".format(serv, port) - bout, stderr = funct.subprocess_execute(cmd) + bout, stderr1 = funct.subprocess_execute(cmd) bin_bout.append(bout[0]) cmd = "echo 'show stat' |nc {} {} |cut -d ',' -f 1-2,5|grep -E '[0-9]'|awk -F',' '{{sum+=$3;}}END{{print sum;}}'".format(serv, port) - cin, stderr = funct.subprocess_execute(cmd) + cin, stderr2 = funct.subprocess_execute(cmd) bin_bout.append(cin[0]) cmd = "echo 'show stat' |nc {} {} |cut -d ',' -f 1-2,8|grep -E '[0-9]'|awk -F',' '{{sum+=$3;}}END{{print sum;}}'".format(serv, port) - cout, stderr = funct.subprocess_execute(cmd) + cout, stderr3 = funct.subprocess_execute(cmd) bin_bout.append(cout[0]) - - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/bin_bout.html') template = template.render(bin_bout=bin_bout, serv=serv) @@ -2951,8 +2885,6 @@ if form.getvalue('nginxConnections'): if num == 2: bin_bout.append(line.split(' ')[3]) - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/bin_bout.html') template = template.render(bin_bout=bin_bout, serv=serv, service='nginx') @@ -3139,8 +3071,6 @@ if form.getvalue('scan_ports') is not None: if stderr != '': print(stderr) else: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/scan_ports.html') template = template.render(ports=stdout, info=stdout1) @@ -3165,9 +3095,6 @@ if form.getvalue('viewFirewallRules') is not None: IN_public_allow = funct.ssh_command(serv, cmd1, raw=1) output_chain = funct.ssh_command(serv, cmd2, raw=1) - - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/firewall_rules.html') template = template.render(input=input_chain2, IN_public_allow=IN_public_allow, output=output_chain) @@ -3352,8 +3279,6 @@ if form.getvalue('portscanner_history_server_id'): print('ok') if form.getvalue('show_versions'): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/check_version.html') template = template.render(versions=funct.versions()) @@ -3392,10 +3317,6 @@ if any((form.getvalue('do_new_name'), form.getvalue('aws_new_name'), form.getval is_add = True if is_add: - from jinja2 import Environment, FileSystemLoader - import http.cookies - import os - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') role_id = sql.get_user_role_by_uuid(user_uuid.value) @@ -3570,9 +3491,6 @@ if form.getvalue('doworkspace'): region, size, privet_net, floating_ip, ssh_ids, ssh_name, workspace, oss, firewall, monitoring, backup, provider, group, 'Creating' ): - - from jinja2 import Environment, FileSystemLoader - user, user_id, role, token, servers, user_services = funct.get_users_params() new_server = sql.select_provisioned_servers(new=workspace, group=group, type='do') params = sql.select_provisioning_params() @@ -3666,9 +3584,6 @@ if form.getvalue('awsworkspace'): region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, provider, group, 'Creating', delete_on_termination, volume_type ): - - from jinja2 import Environment, FileSystemLoader - user, user_id, role, token, servers, user_services = funct.get_users_params() new_server = sql.select_provisioned_servers(new=workspace, group=group, type='aws') params = sql.select_provisioning_params() @@ -3940,9 +3855,6 @@ if form.getvalue('gcoreworkspace'): project, region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall, provider, group, 'Creating', delete_on_termination, volume_type ): - - from jinja2 import Environment, FileSystemLoader - user, user_id, role, token, servers, user_services = funct.get_users_params() new_server = sql.select_provisioned_servers(new=workspace, group=group, type='gcore') params = sql.select_provisioning_params() @@ -4003,8 +3915,6 @@ if form.getvalue('editAwsServer'): params = sql.select_provisioning_params() providers = sql.select_providers(int(user_group)) server = sql.select_gcore_server(server_id=server_id) - from jinja2 import Environment, FileSystemLoader - env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/aws_edit_dialog.html') template = template.render(server=server, providers=providers, params=params) @@ -4017,8 +3927,6 @@ if form.getvalue('editGcoreServer'): params = sql.select_provisioning_params() providers = sql.select_providers(int(user_group)) server = sql.select_gcore_server(server_id=server_id) - from jinja2 import Environment, FileSystemLoader - env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/gcore_edit_dialog.html') template = template.render(server=server, providers=providers, params=params) @@ -4031,8 +3939,6 @@ if form.getvalue('editDoServer'): params = sql.select_provisioning_params() providers = sql.select_providers(int(user_group)) server = sql.select_do_server(server_id=server_id) - from jinja2 import Environment, FileSystemLoader - env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/do_edit_dialog.html') template = template.render(server=server, providers=providers, params=params) @@ -4071,7 +3977,6 @@ if form.getvalue('edit_aws_provider'): funct.logging('localhost', 'Provider has been renamed. New name is ' + new_name, provisioning=1) if form.getvalue('loadservices'): - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/load_services.html') services = funct.get_services_status() @@ -4080,7 +3985,6 @@ if form.getvalue('loadservices'): print(template) if form.getvalue('loadchecker'): - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/load_telegram.html') services = funct.get_services_status() @@ -4134,7 +4038,6 @@ if form.getvalue('loadchecker'): print(template) if form.getvalue('load_update_hapwi'): - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/load_updatehapwi.html') @@ -4159,7 +4062,6 @@ if form.getvalue('load_update_hapwi'): if form.getvalue('loadopenvpn'): import distro - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/load_openvpn.html') openvpn_configs = '' @@ -4197,9 +4099,6 @@ if form.getvalue('check_slack'): funct.slack_send_mess(mess, slack_channel_id=slack_id) if form.getvalue('check_rabbitmq_alert'): - import json - import http.cookies - try: cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_group_id = cookie.get('group') @@ -4216,7 +4115,6 @@ if form.getvalue('check_rabbitmq_alert'): print(f'error: Cannot send a message {error}') if form.getvalue('check_email_alert'): - import http.cookies subject = 'test message' message = 'Test message from Roxy-WI' @@ -4251,7 +4149,7 @@ if form.getvalue('getoption'): for i in options: a[v] = i.options v = v + 1 - import json + print(json.dumps(a)) @@ -4262,8 +4160,6 @@ if form.getvalue('newtoption'): print(error_mess) else: if sql.insert_new_option(option, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/new_option.html') @@ -4299,7 +4195,7 @@ if form.getvalue('getsavedserver'): a[v]['value'] = i.server a[v]['desc'] = i.description v = v + 1 - import json + print(json.dumps(a)) @@ -4311,8 +4207,6 @@ if form.getvalue('newsavedserver'): print(error_mess) else: if sql.insert_new_savedserver(savedserver, description, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/new_saved_servers.html') @@ -4335,8 +4229,6 @@ if form.getvalue('savedserverdel') is not None: print("Ok") if form.getvalue('show_users_ovw') is not None: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('/show_users_ovw.html') @@ -4356,8 +4248,6 @@ if form.getvalue('show_users_ovw') is not None: if form.getvalue('serverSettings') is not None: server_id = form.getvalue('serverSettings') service = form.getvalue('serverSettingsService') - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/show_service_settings.html') @@ -4459,9 +4349,7 @@ if act == 'showListOfVersion': if service == 'haproxy': files = funct.get_files() else: - files = funct.get_files(dir=configs_dir, format='conf') - - from jinja2 import Environment, FileSystemLoader + files = funct.get_files(configs_dir, 'conf') env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) @@ -4487,7 +4375,6 @@ if act == 'getSystemInfo': print('error: IP or DNS name is not valid') sys.exit() - from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) env.globals['string_to_dict'] = funct.string_to_dict @@ -4518,8 +4405,6 @@ if act == 'updateSystemInfo': sql.delete_system_info(server_id) - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) env.globals['string_to_dict'] = funct.string_to_dict @@ -4550,7 +4435,9 @@ if act == 'findInConfigs': print(return_find) if act == 'check_service': - import http.cookies + import socket + from contextlib import closing + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') user_id = sql.get_user_id_by_uuid(user_uuid.value) @@ -4571,9 +4458,6 @@ if act == 'check_service': print('down') if '2' in user_services: if service == 'nginx': - import socket - from contextlib import closing - nginx_stats_port = sql.get_setting('nginx_stats_port') with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: @@ -4588,9 +4472,6 @@ if act == 'check_service': print('down') if '4' in user_services: if service == 'apache': - import socket - from contextlib import closing - apache_stats_port = sql.get_setting('apache_stats_port') with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: @@ -4605,8 +4486,6 @@ if act == 'check_service': print('down' + str(e)) if form.getvalue('show_sub_ovw'): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/show_sub_ovw.html') template = template.render(sub=sql.select_user_all()) diff --git a/app/overview.py b/app/overview.py index f0d8e8f7..3b6bed5b 100644 --- a/app/overview.py +++ b/app/overview.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os +import psutil import funct import sql @@ -13,57 +14,50 @@ print('Content-type: text/html\n') funct.check_login() +grafana = 0 +metrics_worker = 0 +checker_worker = 0 +is_checker_worker = 0 +is_metrics_worker = 0 +servers_group = [] +host = os.environ.get('HTTP_HOST', '') + try: user, user_id, role, token, servers, user_services = funct.get_users_params() groups = sql.select_groups() user_group = funct.get_user_group(id=1) if (role == 2 or role == 3) and int(user_group) != 1: - servers_for_grep = '' - i = 1 - servers_len = len(servers) - for s in servers: - if i != servers_len: - servers_for_grep += s[2] + '\|' - else: - servers_for_grep += s[2] + servers_group.append(s[2]) - i += 1 + is_checker_worker = len(sql.select_all_alerts(group=user_group)) + is_metrics_worker = len(sql.select_servers_metrics_for_master(group=user_group)) - cmd = "ps ax |grep '[m]etrics_worker\|[m]etrics_waf_worker.py\|[m]etrics_nginx_worker.py'|grep '%s' |wc -l" % servers_for_grep - metrics_worker, stderr = funct.subprocess_execute(cmd) - cmd = "ps ax |grep '[c]hecker_worker\|[c]hecker_nginx\|[c]hecker_apache\|[c]hecker_keepalived'|grep -v grep |grep '%s' |wc -l" % servers_for_grep - checker_worker, stderr = funct.subprocess_execute(cmd) - i = 0 - for s in sql.select_all_alerts(group=user_group): - i += 1 - is_checker_worker = i - is_metrics_workers = sql.select_servers_metrics_for_master(group=user_group) - i = 0 - for s in is_metrics_workers: - i += 1 - is_metrics_worker = i - grafana = '' - prometheus = '' - host = '' - else: - cmd = "ps ax |grep '[m]etrics_worker\|[m]etrics_waf_worker.py\|[m]etrics_nginx_worker.py' |wc -l" - metrics_worker, stderr = funct.subprocess_execute(cmd) - cmd = "ps ax |grep '[c]hecker_worker\|[c]hecker_nginx\|[c]hecker_apache\|[c]hecker_keepalived' |wc -l" - checker_worker, stderr = funct.subprocess_execute(cmd) - i = 0 - for s in sql.select_all_alerts(): - i += 1 - is_checker_worker = i - is_metrics_workers = sql.select_servers_metrics_for_master() - i = 0 - for s in is_metrics_workers: - i += 1 - is_metrics_worker = i - cmd = "ps ax |egrep [g]rafana|wc -l" - grafana, stderr = funct.subprocess_execute(cmd) - host = os.environ.get('HTTP_HOST', '') + for pids in psutil.pids(): + if pids < 300: + continue + try: + pid = psutil.Process(pids) + cmdline_out = pid.cmdline() + if len(cmdline_out) > 2: + if 'checker_' in cmdline_out[1]: + if len(servers_group) > 0: + if cmdline_out[2] in servers_group: + checker_worker += 1 + else: + checker_worker += 1 + elif 'metrics_' in cmdline_out[1]: + if len(servers_group) > 0: + if cmdline_out[2] in servers_group: + metrics_worker += 1 + else: + metrics_worker += 1 + if len(servers_group) == 0: + if 'grafana' in cmdline_out[1]: + grafana += 1 + except psutil.NoSuchProcess: + pass cmd = "systemctl is-active roxy-wi-metrics" metrics_master, stderr = funct.subprocess_execute(cmd) @@ -78,41 +72,32 @@ try: cmd = "systemctl is-active roxy-wi-socket" socket, stderr = funct.subprocess_execute(cmd) -except Exception: +except Exception as e: role = '' user = '' - users = '' groups = '' roles = '' metrics_master = '' - metrics_worker = '' checker_master = '' - checker_worker = '' keep_alive = '' smon = '' - grafana = '' socket = '' - versions = '' - haproxy_wi_log = '' servers = '' stderr = '' - is_checker_worker = '' - is_metrics_worker = '' token = '' - + print(str(e)) rendered_template = template.render( h2=1, autorefresh=1, title="Overview", role=role, user=user, groups=groups, roles=sql.select_roles(), - metrics_master=''.join(metrics_master), metrics_worker=''.join(metrics_worker), checker_master=''.join(checker_master), - checker_worker=''.join(checker_worker), keep_alive=''.join(keep_alive), smon=''.join(smon), - port_scanner=''.join(port_scanner), grafana=''.join(grafana), socket=''.join(socket), - roxy_wi_log_id=funct.roxy_wi_log(log_id=1, file="roxy-wi-", with_date=1), - metrics_log_id=funct.roxy_wi_log(log_id=1, file="metrics", with_date=1), - checker_log_id=funct.roxy_wi_log(log_id=1, file="checker", with_date=1), + metrics_master=''.join(metrics_master), metrics_worker=metrics_worker, checker_master=''.join(checker_master), + checker_worker=checker_worker, keep_alive=''.join(keep_alive), smon=''.join(smon), + port_scanner=''.join(port_scanner), grafana=grafana, socket=''.join(socket), + roxy_wi_log_id=funct.roxy_wi_log(log_id=1, file="roxy-wi-"), + metrics_log_id=funct.roxy_wi_log(log_id=1, file="metrics"), + checker_log_id=funct.roxy_wi_log(log_id=1, file="checker"), keep_alive_log_id=funct.roxy_wi_log(log_id=1, file="keep_alive"), - socket_log_id=funct.roxy_wi_log(log_id=1, file="socket"), - metrics_error_log_id=funct.roxy_wi_log(log_id=1, file="metrics-error"), error=stderr, - haproxy_wi_log=funct.roxy_wi_log(), servers=servers, is_checker_worker=is_checker_worker, + socket_log_id=funct.roxy_wi_log(log_id=1, file="socket"), error=stderr, + roxy_wi_log=funct.roxy_wi_log(), servers=servers, is_checker_worker=is_checker_worker, is_metrics_worker=is_metrics_worker, host=host, user_services=user_services, token=token ) print(rendered_template) diff --git a/app/scripts/ansible/roles/keepalived/handlers/main.yml b/app/scripts/ansible/roles/keepalived/handlers/main.yml index cacb44d5..ae1aa8dc 100644 --- a/app/scripts/ansible/roles/keepalived/handlers/main.yml +++ b/app/scripts/ansible/roles/keepalived/handlers/main.yml @@ -1,6 +1,3 @@ --- -- name: restart keepalived - service: name=keepalived state=restarted - - name: restart rsyslog service: name=restart state=restarted diff --git a/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 b/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 index 18564299..74520a6a 100644 --- a/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 +++ b/app/scripts/ansible/roles/keepalived/templates/keepalived.conf.j2 @@ -1,9 +1,14 @@ global_defs { router_id LVS_DEVEL } +{%- if NGINX == '1' %} +{% set check_service = 'nginx' %} +{% else %} +{% set check_service = 'haproxy' %} +{% endif %} #health-check for keepalive -vrrp_script chk_haproxy { - script "systemctl is-active --quiet haproxy" +vrrp_script chk_service { + script "systemctl is-active --quiet {{ check_service }}" interval 2 weight 3 } @@ -16,7 +21,7 @@ vrrp_instance VI_1 { #check if we are still running track_script { - chk_haproxy + chk_service } advert_int 1 diff --git a/app/scripts/install_keepalived.sh b/app/scripts/install_keepalived.sh index 23bbf17a..29b90b1e 100644 --- a/app/scripts/install_keepalived.sh +++ b/app/scripts/install_keepalived.sh @@ -21,6 +21,8 @@ do RETURN_TO_MASTER) RETURN_TO_MASTER=${VALUE} ;; ADD_VRRP) ADD_VRRP=${VALUE} ;; SSH_PORT) SSH_PORT=${VALUE} ;; + HAPROXY) HAPROXY=${VALUE} ;; + NGINX) NGINX=${VALUE} ;; *) esac done @@ -36,9 +38,9 @@ PWD=$PWD/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/keepalived.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH ETH_SLAVE=$ETH_SLAVE keepalived_path_logs=$keepalived_path_logs IP=$IP RESTART=$RESTART RETURN_TO_MASTER=$RETURN_TO_MASTER ADD_VRRP=$ADD_VRRP router_id=$router_id SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/keepalived.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH ETH_SLAVE=$ETH_SLAVE keepalived_path_logs=$keepalived_path_logs IP=$IP RESTART=$RESTART RETURN_TO_MASTER=$RETURN_TO_MASTER ADD_VRRP=$ADD_VRRP router_id=$router_id HAPROXY=$HAPROXY NGINX=$NGINX SSH_PORT=$SSH_PORT" -i $PWD/$HOST else - ansible-playbook $PWD/roles/keepalived.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH ETH_SLAVE=$ETH_SLAVE keepalived_path_logs=$keepalived_path_logs IP=$IP RESTART=$RESTART RETURN_TO_MASTER=$RETURN_TO_MASTER ADD_VRRP=$ADD_VRRP router_id=$router_id SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/keepalived.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH ETH_SLAVE=$ETH_SLAVE keepalived_path_logs=$keepalived_path_logs IP=$IP RESTART=$RESTART RETURN_TO_MASTER=$RETURN_TO_MASTER ADD_VRRP=$ADD_VRRP router_id=$router_id HAPROXY=$HAPROXY NGINX=$NGINX SSH_PORT=$SSH_PORT" -i $PWD/$HOST fi if [ $? -gt 0 ] diff --git a/app/sql.py b/app/sql.py index 343217c5..0e98da5a 100755 --- a/app/sql.py +++ b/app/sql.py @@ -1554,7 +1554,7 @@ def insert_new_waf_rule(rule_name: str, rule_file: str, rule_description: str, s out_error(e) else: return last_id - + def delete_waf_server(server_id): @@ -3765,3 +3765,27 @@ def select_service(slug: str) -> str: return 'there is no service' else: return query_res + + +def select_checker_service_status(server_id: int, service_id: int, service_check: str) -> int: + try: + service_check_status = ServiceStatus.get( + (ServiceStatus.server_id == server_id) + & (ServiceStatus.service_id == service_id) + & (ServiceStatus.service_check == service_check) + ).status + except Exception as e: + return out_error(e) + else: + return service_check_status + + +def inset_or_update_service_status( + server_id: int, service_id: int, service_check: str, status: int +) -> None: + try: + ServiceStatus.insert( + server_id=server_id, service_id=service_id, service_check=service_check, status=status + ).on_conflict('replace').execute() + except Exception as e: + out_error(e) diff --git a/app/templates/ajax/config_show.html b/app/templates/ajax/config_show.html index 9c464c56..77aeff1c 100644 --- a/app/templates/ajax/config_show.html +++ b/app/templates/ajax/config_show.html @@ -3,7 +3,7 @@

{% if role <= 3 %} {% if not is_serv_protected or role <= 2 %} - Edit + Edit {% if service == 'haproxy' %} Add {% elif service == 'keepalived' %} @@ -11,7 +11,7 @@ {% endif %} {% endif %} {% endif %} - Expand all + Expand all

@@ -382,4 +382,26 @@ {% endif %}
Note: If you reconfigure Master server, Slave will be reconfigured automatically
- {% endif %} \ No newline at end of file + {% endif %} + diff --git a/app/templates/ajax/table_metrics.html b/app/templates/ajax/table_metrics.html index d7ced4c5..9273dd87 100644 --- a/app/templates/ajax/table_metrics.html +++ b/app/templates/ajax/table_metrics.html @@ -1,4 +1,5 @@ + {% if service == 'haproxy' %} @@ -37,4 +38,30 @@ {% endfor %} + {% else %} + + + + + + + + + + + + + + {% for state in table_stat %} + + + + + + + + + + {% endfor %} + {% endif %}
Server Average sessions{{ state.13 }}
ServerAverage connectionsPeak connections
1 hour24 hours3 days1 hour24 hours3 days
{{ state.1 }}{{ state.2 }}{{ state.3 }}{{ state.4 }}{{ state.5 }}{{ state.6 }}{{ state.7 }}
\ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index fa02219f..18ae05ee 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -1,6 +1,6 @@ - {{title}} - Roxy-WI + {{title}} @@ -49,6 +49,7 @@ +
@@ -70,13 +71,13 @@
  • Configs
  • Stats
  • Logs
  • -
  • Runtime API
  • +
  • Runtime API
  • Metrics
  • {% if role <= 3 %} -
  • Add proxy
  • +
  • Add proxy
  • Versions
  • -
  • SSL
  • -
  • Lists
  • +
  • SSL
  • +
  • Lists
  • WAF
  • {% endif %} @@ -93,7 +94,7 @@
  • Metrics
  • {% if role <= 3 %}
  • Versions
  • -
  • SSL
  • +
  • SSL
  • WAF
  • {% endif %} @@ -110,7 +111,7 @@
  • Metrics
  • {% if role <= 3 %}
  • Versions
  • -
  • SSL
  • +
  • SSL
  • {% endif %} @@ -121,7 +122,7 @@ Keepalived
    {% endif %} {% endblock %} diff --git a/app/templates/ha.html b/app/templates/ha.html index f10e62c1..e5ec19c9 100644 --- a/app/templates/ha.html +++ b/app/templates/ha.html @@ -130,7 +130,7 @@
    - Read How to create high available cluster + Read How to create high available cluster
    diff --git a/app/viewlogs.py b/app/viewlogs.py index e666edcb..a5cad7d8 100644 --- a/app/viewlogs.py +++ b/app/viewlogs.py @@ -54,12 +54,9 @@ try: except Exception: pass -try: - user, user_id, role, token, servers, user_services = funct.get_users_params() -except Exception: - pass +user, user_id, role, token, servers, user_services = funct.get_users_params() -selects = funct.get_files(log_path, format="log") +selects = funct.get_files(log_path, "log") if form.getvalue('type') is None: selects.append(['fail2ban.log', 'fail2ban.log']) selects.append(['roxy-wi.error.log', 'error.log']) diff --git a/config_other/httpd/roxy-wi.conf b/config_other/httpd/roxy-wi.conf index 95dbfa9b..d2e816f9 100644 --- a/config_other/httpd/roxy-wi.conf +++ b/config_other/httpd/roxy-wi.conf @@ -2,20 +2,21 @@ AddDefaultCharset UTF-8 SetEnv PYTHONIOENCODING utf8 - SSLEngine on + SSLEngine on SSLCertificateFile /var/www/haproxy-wi/app/certs/haproxy-wi.crt SSLCertificateKeyFile /var/www/haproxy-wi/app/certs/haproxy-wi.key ServerName haproxy-wi.example.com ErrorLog /var/log/httpd/roxy-wi.error.log CustomLog /var/log/httpd/roxy-wi.access.log combined - TimeOut 600 - LimitRequestLine 16380 + TimeOut 600 + LimitRequestLine 16380 + + RewriteEngine On + RewriteCond %{HTTP:Upgrade} =websocket [NC] + RewriteRule /(.*) ws://localhost:8765/ [P,L] + ProxyPassReverse / http://localhost:8765/ - RewriteEngine On - RewriteCond %{HTTP:Upgrade} =websocket [NC] - RewriteRule /(.*) ws://localhost:8765/ [P,L] - ProxyPassReverse / http://localhost:8765/ WSGIDaemonProcess api display-name=%{GROUP} user=apache group=apache processes=1 threads=5 WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi @@ -23,7 +24,7 @@ ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/" - AllowOverride FileInfo + AllowOverride FileInfo DirectoryIndex overview.py Options +ExecCGI AddHandler cgi-script .py @@ -31,46 +32,30 @@ Allow from all - + Options +ExecCGI -Indexes +MultiViews - Order Deny,Allow - Deny from all + Order Deny,Allow + Deny from all - - Options +ExecCGI -Indexes +MultiViews - Order Deny,Allow - Deny from all - - - - Deny from all + + Deny from all - - Deny from all + + Deny from all - - Order Deny,Allow - Deny from all - + + Header set X-XSS-Protection: 1; + Header set X-Frame-Options: deny + Header set X-Content-Type-Options: nosniff + Header set Strict-Transport-Security: max-age=3600; + Header set Cache-Control no-cache + Header set Expires: 0 - - Order Deny,Allow - Deny from all - - - - Header set X-XSS-Protection: 1; - Header set X-Frame-Options: deny - Header set X-Content-Type-Options: nosniff - Header set Strict-Transport-Security: max-age=3600; - Header set Cache-Control no-cache - Header set Expires: 0 - - - Header set Cache-Control "max-age=86400, public" - + + Header set Cache-Control "max-age=86400, public" + diff --git a/config_other/httpd/roxy-wi_deb.conf b/config_other/httpd/roxy-wi_deb.conf index df0ed9cc..7a4bf49b 100644 --- a/config_other/httpd/roxy-wi_deb.conf +++ b/config_other/httpd/roxy-wi_deb.conf @@ -38,12 +38,6 @@ Deny from all - - Options +ExecCGI -Indexes +MultiViews - Order Deny,Allow - Deny from all - - Deny from all @@ -52,26 +46,16 @@ Deny from all - - Order Deny,Allow - Deny from all - + + Header set X-XSS-Protection: 1; + Header set X-Frame-Options: deny + Header set X-Content-Type-Options: nosniff + Header set Strict-Transport-Security: max-age=3600; + Header set Cache-Control no-cache + Header set Expires: 0 - - Order Deny,Allow - Deny from all - - - - Header set X-XSS-Protection: 1; - Header set X-Frame-Options: deny - Header set X-Content-Type-Options: nosniff - Header set Strict-Transport-Security: max-age=3600; - Header set Cache-Control no-cache - Header set Expires: 0 - - - Header set Cache-Control "max-age=86400, public" + + Header set Cache-Control "max-age=86400, public" diff --git a/inc/add.js b/inc/add.js index 50d9d1bc..4970be13 100644 --- a/inc/add.js +++ b/inc/add.js @@ -1491,7 +1491,7 @@ function view_ssl(id) { } ); } function deleteSsl(id) { - if(!checkIsServerFiled('#serv5')) return false;; + if(!checkIsServerFiled('#serv5')) return false; $.ajax( { url: "options.py", data: { @@ -1629,68 +1629,59 @@ function editList(list, color) { } function saveList(action, list, color) { var serv = $( "#serv-"+color+"-list option:selected" ).val(); - if (serv == '------') { - toastr.warning('Select a server before updating'); - } else { - $.ajax({ - url: "options.py", - data: { - bwlists_save: list, - serv: serv, - bwlists_content: $('#edit_lists').val(), - color: color, - group: $('#group').val(), - bwlists_restart: action, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.split(" , "); - - for (i = 0; i < data.length; i++) { - if (data[i]) { - if (data[i].indexOf('error: ') != '-1' || data[i].indexOf('Errno') != '-1') { - toastr.error(data[i]); - } else { - toastr.success(data[i]); - } + if(!checkIsServerFiled(serv)) return false; + $.ajax({ + url: "options.py", + data: { + bwlists_save: list, + serv: serv, + bwlists_content: $('#edit_lists').val(), + color: color, + group: $('#group').val(), + bwlists_restart: action, + token: $('#token').val() + }, + type: "POST", + success: function (data) { + data = data.split(" , "); + for (i = 0; i < data.length; i++) { + if (data[i]) { + if (data[i].indexOf('error: ') != '-1' || data[i].indexOf('Errno') != '-1') { + toastr.error(data[i]); + } else { + toastr.success(data[i]); } } } - }); - } + } + }); } function deleteList(list, color) { var serv = $( "#serv-"+color+"-list option:selected" ).val(); - if (serv == '------') { - toastr.warning('Choose a server before deleting'); - } else { - $.ajax({ - url: "options.py", - data: { - bwlists_delete: list, - serv: serv, - color: color, - group: $('#group').val(), - token: $('#token').val() - }, - type: "POST", - success: function (data) { - if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('Errno') != '-1') { - toastr.error(data); - } else if (data.indexOf('Info') != '-1' ){ - toastr.clear(); - toastr.info(data); - } else if (data.indexOf('success') != '-1' ) { - toastr.clear(); - toastr.success('List has been deleted'); - setTimeout(function () { - location.reload(); - }, 2500); - } + if(!checkIsServerFiled(serv)) return false; + $.ajax({ + url: "options.py", + data: { + bwlists_delete: list, + serv: serv, + color: color, + group: $('#group').val(), + token: $('#token').val() + }, + type: "POST", + success: function (data) { + if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('Errno') != '-1') { + toastr.error(data); + } else if (data.indexOf('Info') != '-1' ){ + toastr.clear(); + toastr.info(data); + } else if (data.indexOf('success') != '-1' ) { + toastr.clear(); + toastr.success('List has been deleted'); + setTimeout(function () {location.reload();}, 2500); } - }); - } + } + }); } function generateConfig(form_name) { var frm = $('#'+form_name); @@ -1901,7 +1892,7 @@ var acl_option = '

    Set-header\n' + '\n' + 'value\n' + - '\n' + + '\n' + '' + '

    ' function make_actions_for_adding_acl_rule(section_id) { @@ -1969,34 +1960,31 @@ function makeid(length) { } function showUserlists() { var serv = $( "#existing_userlist_serv option:selected" ).val(); - if (serv == 'Choose server') { - toastr.warning('Choose a server before'); - } else { - $.ajax({ - url: "options.py", - data: { - show_userlists: 1, - serv: serv, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { - toastr.error(data); - } else { - $('#existing_userlist_tr').show(); - $('#existing_userlist_ajax').text(''); - data = data.split(","); - for (i = 0; i < data.length; i++) { - var existing_userlist_ajax = $.find("#existing_userlist_ajax"); - existing_userlist_ajax = existing_userlist_ajax[0].id; - data[i] = escapeHtml(data[i]); - $('#'+existing_userlist_ajax).append(''+data[i]+' '); - } + if(!checkIsServerFiled(serv)) return false; + $.ajax({ + url: "options.py", + data: { + show_userlists: 1, + serv: serv, + token: $('#token').val() + }, + type: "POST", + success: function (data) { + if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { + toastr.error(data); + } else { + $('#existing_userlist_tr').show(); + $('#existing_userlist_ajax').text(''); + data = data.split(","); + for (i = 0; i < data.length; i++) { + var existing_userlist_ajax = $.find("#existing_userlist_ajax"); + existing_userlist_ajax = existing_userlist_ajax[0].id; + data[i] = escapeHtml(data[i]); + $('#'+existing_userlist_ajax).append(''+data[i]+' '); } } - }); - } + } + }); } function changePortCheckFromServerPort() { $('[name=server_port]').on('input', function (){ diff --git a/inc/hotkeys.js b/inc/hotkeys.js new file mode 100644 index 00000000..e7701f39 --- /dev/null +++ b/inc/hotkeys.js @@ -0,0 +1,204 @@ +/*jslint browser: true*/ +/*jslint jquery: true*/ + +/* + * jQuery Hotkeys Plugin + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Based upon the plugin by Tzury Bar Yochay: + * https://github.com/tzuryby/jquery.hotkeys + * + * Original idea by: + * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ + */ + +/* + * One small change is: now keys are passed by object { keys: '...' } + * Might be useful, when you want to pass some other data to your handler + */ + +(function(jQuery) { + + jQuery.hotkeys = { + version: "0.2.0", + + specialKeys: { + 8: "backspace", + 9: "tab", + 10: "return", + 13: "return", + 16: "shift", + 17: "ctrl", + 18: "alt", + 19: "pause", + 20: "capslock", + 27: "esc", + 32: "space", + 33: "pageup", + 34: "pagedown", + 35: "end", + 36: "home", + 37: "left", + 38: "up", + 39: "right", + 40: "down", + 45: "insert", + 46: "del", + 59: ";", + 61: "=", + 96: "0", + 97: "1", + 98: "2", + 99: "3", + 100: "4", + 101: "5", + 102: "6", + 103: "7", + 104: "8", + 105: "9", + 106: "*", + 107: "+", + 109: "-", + 110: ".", + 111: "/", + 112: "f1", + 113: "f2", + 114: "f3", + 115: "f4", + 116: "f5", + 117: "f6", + 118: "f7", + 119: "f8", + 120: "f9", + 121: "f10", + 122: "f11", + 123: "f12", + 144: "numlock", + 145: "scroll", + 173: "-", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'" + }, + + shiftNums: { + "`": "~", + "1": "!", + "2": "@", + "3": "#", + "4": "$", + "5": "%", + "6": "^", + "7": "&", + "8": "*", + "9": "(", + "0": ")", + "-": "_", + "=": "+", + ";": ": ", + "'": "\"", + ",": "<", + ".": ">", + "/": "?", + "\\": "|" + }, + + // excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url + textAcceptingInputTypes: [ + "text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", + "datetime-local", "search", "color", "tel"], + + // default input types not to bind to unless bound directly + textInputTypes: /textarea|input|select/i, + + options: { + filterInputAcceptingElements: true, + filterTextInputs: true, + filterContentEditable: true + } + }; + + function keyHandler(handleObj) { + if (typeof handleObj.data === "string") { + handleObj.data = { + keys: handleObj.data + }; + } + + // Only care when a possible input has been specified + if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string") { + return; + } + + var origHandler = handleObj.handler, + keys = handleObj.data.keys.toLowerCase().split(" "); + + handleObj.handler = function(event) { + // Don't fire in text-accepting inputs that we didn't directly bind to + if (this !== event.target && + (jQuery.hotkeys.options.filterInputAcceptingElements && + jQuery.hotkeys.textInputTypes.test(event.target.nodeName) || + (jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr('contenteditable')) || + (jQuery.hotkeys.options.filterTextInputs && + jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) { + return; + } + + var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[event.which], + character = String.fromCharCode(event.which).toLowerCase(), + modif = "", + possible = {}; + + jQuery.each(["alt", "ctrl", "shift"], function(index, specialKey) { + + if (event[specialKey + 'Key'] && special !== specialKey) { + modif += specialKey + '+'; + } + }); + + // metaKey is triggered off ctrlKey erronously + if (event.metaKey && !event.ctrlKey && special !== "meta") { + modif += "meta+"; + } + + if (event.metaKey && special !== "meta" && modif.indexOf("alt+ctrl+shift+") > -1) { + modif = modif.replace("alt+ctrl+shift+", "hyper+"); + } + + if (special) { + possible[modif + special] = true; + } + else { + possible[modif + character] = true; + possible[modif + jQuery.hotkeys.shiftNums[character]] = true; + + // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" + if (modif === "shift+") { + possible[jQuery.hotkeys.shiftNums[character]] = true; + } + } + + for (var i = 0, l = keys.length; i < l; i++) { + if (possible[keys[i]]) { + return origHandler.apply(this, arguments); + } + } + }; + } + + jQuery.each(["keydown", "keyup", "keypress"], function() { + jQuery.event.special[this] = { + add: keyHandler + }; + }); + +})(jQuery || this.jQuery || window.jQuery); diff --git a/inc/metrics.js b/inc/metrics.js index a614c030..573fc5c9 100644 --- a/inc/metrics.js +++ b/inc/metrics.js @@ -322,10 +322,15 @@ function getApacheChartData(server) { }); } function loadMetrics() { + var service = findGetParameter('service'); + if (!service) { + service = 'haproxy'; + } $.ajax({ url: "options.py", data: { table_metrics: '1', + service: service, token: $('#token').val() }, beforeSend: function() { diff --git a/inc/overview.js b/inc/overview.js index f91e3c88..9b5bfabf 100644 --- a/inc/overview.js +++ b/inc/overview.js @@ -395,7 +395,7 @@ function confirmAjaxAction(action, service, id) { buttons: { "Sure": function() { $( this ).dialog( "close" ); - if(service == "hap") { + if(service == "haproxy") { ajaxActionServers(action, id); if(action == "restart" || action == "reload") { if(localStorage.getItem('restart')) { diff --git a/inc/script.js b/inc/script.js index d583c2e1..a5054f7c 100644 --- a/inc/script.js +++ b/inc/script.js @@ -466,7 +466,7 @@ function showMap() { } else { toastr.clear(); $("#ajax").html(data); - window.history.pushState("Show map", "Show map", cur_url[0] + '?serv=' + $("#serv").val() + '&showMap'); + window.history.pushState("Show map", "Show map", cur_url[0] + '?service=haproxy&serv=' + $("#serv").val() + '&showMap'); } } } ); @@ -724,34 +724,6 @@ function viewLogs() { } } $( function() { - NProgress.configure({showSpinner: false}); - $.ajax( { - url: "options.py", - data: { - show_versions: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - $('#version').html(data); - var showUpdates = $( "#show-updates" ).dialog({ - autoOpen: false, - width: 600, - modal: true, - title: 'There is a new version Roxy-WI', - buttons: { - Close: function() { - $( this ).dialog( "close" ); - clearTips(); - } - } - }); - $('#show-updates-button').click(function() { - showUpdates.dialog('open'); - }); - } - } ); - NProgress.configure({showSpinner: true}); $('a').click(function(e) { try { var cur_path = window.location.pathname; @@ -1535,3 +1507,33 @@ function returnNiceCheckingConfig(data) { toastr.success('' + server_name2 + ' Configuration file is valid'); } } +function show_version() { + NProgress.configure({showSpinner: false}); + $.ajax( { + url: "options.py", + data: { + show_versions: 1, + token: $('#token').val() + }, + type: "POST", + success: function( data ) { + $('#version').html(data); + var showUpdates = $( "#show-updates" ).dialog({ + autoOpen: false, + width: 600, + modal: true, + title: 'There is a new Roxy-WI version', + buttons: { + Close: function() { + $( this ).dialog( "close" ); + clearTips(); + } + } + }); + $('#show-updates-button').click(function() { + showUpdates.dialog('open'); + }); + } + } ); + NProgress.configure({showSpinner: true}); +}