Changelog: https://roxy-wi.org/changelog#6_2_2
pull/343/head
Pavel Loginov 2022-10-17 13:22:58 +03:00
parent a177053314
commit 498153ef1a
18 changed files with 618 additions and 361 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ roxy-wi.db
configs
keys
log
.DS_Store

View File

@ -961,7 +961,7 @@ def update_db_v_6_2_1():
except Exception as e:
print("An error occurred:", e)
else:
print("Updating... DB has been updated to version 6.2.1.0")
print("Updating... DB has been updated to version 6.2.2.0")
def update_ver():

View File

@ -5,6 +5,8 @@ import re
import json
import http.cookies
import distro
import modules.roxy_wi_tools as roxy_wi_tools
get_config_var = roxy_wi_tools.GetConfigVar()
@ -115,7 +117,6 @@ def get_user_group(**kwargs) -> str:
def logging(server_ip: str, action: str, **kwargs) -> None:
import sql
import distro
login = ''
cur_date = get_data('logs')
@ -335,13 +336,10 @@ def page_for_admin(level=1) -> None:
return
def return_ssh_keys_path(server_ip: str, **kwargs):
def return_ssh_keys_path(server_ip: str, **kwargs) -> dict:
import sql
lib_path = get_config_var.get_config_var('main', 'lib_path')
ssh_enable = ''
ssh_user_name = ''
ssh_user_password = ''
ssh_key_name = ''
ssh_settings = {}
if kwargs.get('id'):
sshs = sql.select_ssh(id=kwargs.get('id'))
@ -349,26 +347,24 @@ def return_ssh_keys_path(server_ip: str, **kwargs):
sshs = sql.select_ssh(serv=server_ip)
for ssh in sshs:
ssh_enable = ssh.enable
ssh_user_name = ssh.username
ssh_user_password = ssh.password
ssh_key_name = f'{lib_path}/keys/{ssh.name}.pem'
ssh_settings.setdefault('enabled', ssh.enable)
ssh_settings.setdefault('user', ssh.username)
ssh_settings.setdefault('password', ssh.password)
ssh_settings.setdefault('key', f'{lib_path}/keys/{ssh.name}.pem')
return ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name
ssh_port = [str(server[10]) for server in sql.select_servers(server=server_ip)]
ssh_settings.setdefault('port', ssh_port[0])
return ssh_settings
def ssh_connect(server_ip):
import sql
from modules import ssh_connection
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = return_ssh_keys_path(server_ip)
servers = sql.select_servers(server=server_ip)
ssh_port = 22
ssh_settings = return_ssh_keys_path(server_ip)
for server in servers:
ssh_port = server[10]
ssh = ssh_connection.SshConnection(server_ip, ssh_port, ssh_user_name, ssh_user_password, ssh_enable, ssh_key_name)
ssh = ssh_connection.SshConnection(server_ip, ssh_settings['port'], ssh_settings['user'],
ssh_settings['password'], ssh_settings['enabled'], ssh_settings['key'])
return ssh
@ -629,15 +625,8 @@ def install_haproxy(server_ip, **kwargs):
haproxy_ver = kwargs.get('hapver')
server_for_installing = kwargs.get('server')
docker = kwargs.get('docker')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = return_ssh_keys_path(server_ip)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=server_ip)
for server in servers:
ssh_port = str(server[10])
proxy_serv = ''
ssh_settings = return_ssh_keys_path(server_ip)
os.system("cp scripts/%s ." % script)
@ -646,17 +635,15 @@ def install_haproxy(server_ip, **kwargs):
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
syn_flood_protect = '1' if kwargs.get('syn_flood') == "1" else ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SOCK_PORT=" + hap_sock_p
+ " STAT_PORT=" + stats_port + " STAT_FILE=" + server_state_file + " DOCKER=" + docker
+ " SSH_PORT=" + ssh_port + " STATS_USER=" + stats_user + " CONT_NAME=" + container_name + " HAP_DIR=" + haproxy_dir
+ " STATS_PASS='" + stats_password + "' HAPVER=" + haproxy_ver + " SYN_FLOOD=" + syn_flood_protect
+ " HOST=" + server_ip + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SOCK_PORT={hap_sock_p} STAT_PORT={stats_port} "
f"STAT_FILE={server_state_file} DOCKER={docker} SSH_PORT={ssh_settings['port']} STATS_USER={stats_user} "
f"CONT_NAME={container_name} HAP_DIR={haproxy_dir} STATS_PASS='{stats_password}' HAPVER={haproxy_ver} "
f"SYN_FLOOD={syn_flood_protect} HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' "
f"KEY={ssh_settings['key']}"
]
output, error = subprocess_execute(commands[0])
@ -673,7 +660,7 @@ def install_haproxy(server_ip, **kwargs):
sql.insert_or_update_service_setting(server_id, 'haproxy', 'dockerized', '1')
sql.insert_or_update_service_setting(server_id, 'haproxy', 'restart', '1')
os.system("rm -f %s" % script)
os.remove(script)
def waf_install(server_ip):
@ -683,23 +670,18 @@ def waf_install(server_ip):
haproxy_dir = sql.get_setting('haproxy_dir')
ver = check_haproxy_version(server_ip)
service = ' WAF'
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = return_ssh_keys_path(server_ip)
ssh_port = '22'
if ssh_enable == 0:
ssh_key_name = ''
proxy_serv = ''
ssh_settings = return_ssh_keys_path(server_ip)
os.system("cp scripts/%s ." % script)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " HAPROXY_PATH=" + haproxy_dir
+ " VERSION='" + ver + "' SSH_PORT=" + ssh_port + " HOST=" + server_ip
+ " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} HAPROXY_PATH={haproxy_dir} VERSION='{ver}' "
f"SSH_PORT={ssh_settings['port']} HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' "
f"KEY={ssh_settings['key']}"
]
output, error = subprocess_execute(commands[0])
@ -708,7 +690,7 @@ def waf_install(server_ip):
sql.insert_waf_metrics_enable(server_ip, "0")
sql.insert_waf_rules(server_ip)
os.system("rm -f %s" % script)
os.remove(script)
def waf_nginx_install(server_ip):
@ -717,23 +699,17 @@ def waf_nginx_install(server_ip):
proxy = sql.get_setting('proxy')
nginx_dir = sql.get_setting('nginx_dir')
service = ' WAF'
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = return_ssh_keys_path(server_ip)
ssh_port = '22'
if ssh_enable == 0:
ssh_key_name = ''
proxy_serv = ''
ssh_settings = return_ssh_keys_path(server_ip)
os.system("cp scripts/%s ." % script)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " NGINX_PATH=" + nginx_dir
+ " SSH_PORT=" + ssh_port + " HOST=" + server_ip
+ " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} NGINX_PATH={nginx_dir} SSH_PORT={ssh_settings['port']} "
f"HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = subprocess_execute(commands[0])
@ -742,7 +718,7 @@ def waf_nginx_install(server_ip):
sql.insert_nginx_waf_rules(server_ip)
sql.insert_waf_nginx_server(server_ip)
os.system("rm -f %s" % script)
os.remove(script)
def install_nginx(server_ip, **kwargs):
@ -758,30 +734,21 @@ def install_nginx(server_ip, **kwargs):
proxy = sql.get_setting('proxy')
docker = kwargs.get('docker')
container_name = sql.get_setting('nginx_container_name')
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = return_ssh_keys_path(server_ip)
ssh_port = '22'
if ssh_enable == 0:
ssh_key_name = ''
proxy_serv = ''
ssh_settings = return_ssh_keys_path(server_ip)
os.system("cp scripts/%s ." % script)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
servers = sql.select_servers(server=server_ip)
for server in servers:
ssh_port = str(server[10])
syn_flood_protect = '1' if form.getvalue('syn_flood') == "1" else ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " STATS_USER=" + stats_user
+ " STATS_PASS='" + stats_password + "' SSH_PORT=" + ssh_port + " CONFIG_PATH=" + config_path + " CONT_NAME=" + container_name
+ " STAT_PORT=" + stats_port + " STAT_PAGE=" + stats_page + " SYN_FLOOD=" + syn_flood_protect + " DOCKER=" + docker
+ " nginx_dir=" + nginx_dir + " HOST=" + server_ip + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} STATS_USER={stats_user} STATS_PASS='{stats_password}' "
f"SSH_PORT={ssh_settings['port']} CONFIG_PATH={config_path} CONT_NAME={container_name} STAT_PORT={stats_port} "
f"STAT_PAGE={stats_page} SYN_FLOOD={syn_flood_protect} DOCKER={docker} nginx_dir={nginx_dir} HOST={server_ip} "
f"USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = subprocess_execute(commands[0])
@ -797,11 +764,10 @@ def install_nginx(server_ip, **kwargs):
sql.insert_or_update_service_setting(server_id, 'nginx', 'dockerized', '1')
sql.insert_or_update_service_setting(server_id, 'nginx', 'restart', '1')
os.system("rm -f %s" % script)
os.remove(script)
def update_roxy_wi(service):
import distro
restart_service = ''
if distro.id() == 'ubuntu':
@ -1273,8 +1239,7 @@ def show_roxy_log(
serv = value
break
else:
print('Haha')
return
return 'Haha'
if serv == 'backup.log':
awk_column = 2
@ -1286,35 +1251,35 @@ def show_roxy_log(
return show_log(output, grep=grep)
def roxy_wi_log(**kwargs) -> str:
def roxy_wi_log(**kwargs) -> list:
log_path = get_config_var.get_config_var('main', 'log_path')
if kwargs.get('log_id'):
selects = get_files(log_path, "log")
for key, value in selects:
log_file = kwargs.get('file') + ".log"
log_file = f"{kwargs.get('file')}.log"
if log_file == value:
return key
else:
user_group_id = get_user_group(id=1)
if user_group_id != 1:
user_group = get_user_group()
group_grep = '|grep "group: ' + user_group + '"'
group_grep = f'|grep "group: {user_group}"'
else:
group_grep = ''
cmd = "find " + log_path + "/roxy-wi-* -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- " \
"| head -1 |awk '{print $4}' |xargs tail" + group_grep + "|sort -r"
cmd = f"find {log_path}/roxy-wi-* -type f -exec stat --format '%Y :%y %n' '{{}}' \; | sort -nr | cut -d: -f2- " \
f"| head -1 |awk '{{print $4}}' |xargs tail {group_grep}|sort -r"
try:
output, stderr = subprocess_execute(cmd)
return output
except Exception:
return ''
return ['']
def show_ip(stdout):
for line in stdout:
if "Permission denied" in line:
print('error: ' + line)
print(f'error: {line}')
else:
print(line)
@ -1447,6 +1412,7 @@ def return_nice_path(return_path: str) -> str:
and 'keepalived' not in return_path
):
return 'error: The path must contain the name of the service. Check it in Roxy-WI settings'
if return_path[-1] != '/':
return_path += '/'
@ -1582,6 +1548,8 @@ def get_users_params(**kwargs):
servers = sql.get_dick_permit(disable=0)
elif kwargs.get('haproxy'):
servers = sql.get_dick_permit(haproxy=1)
elif kwargs.get('service'):
servers = sql.get_dick_permit(service=kwargs.get('service'))
else:
servers = sql.get_dick_permit()
@ -1642,7 +1610,7 @@ def check_service(server_ip, service_name):
return ssh_command(server_ip, commands)
def get_service_version(server_ip, service_name):
def get_service_version(server_ip: str, service_name: str) -> str:
server_ip = is_ip_or_dns(server_ip)
if service_name == 'haproxy_exporter':
commands = ["/opt/prometheus/exporters/haproxy_exporter --version 2>&1 |head -1|awk '{print $3}'"]
@ -1650,6 +1618,8 @@ def get_service_version(server_ip, service_name):
commands = ["/opt/prometheus/exporters/nginx_exporter 2>&1 |head -1 |awk -F\"=\" '{print $2}'|awk '{print $1}'"]
elif service_name == 'node_exporter':
commands = ["node_exporter --version 2>&1 |head -1|awk '{print $3}'"]
elif service_name == 'apache_exporter':
commands = ["/opt/prometheus/exporters/apache_exporter --version 2>&1 |head -1|awk '{print $3}'"]
ver = ssh_command(server_ip, commands)
@ -1660,7 +1630,6 @@ def get_service_version(server_ip, service_name):
def get_services_status():
import distro
services = []
is_in_docker = is_docker()
services_name = {
@ -1678,10 +1647,12 @@ def get_services_status():
}
for s, v in services_name.items():
if is_in_docker:
cmd = "sudo supervisorctl status " + s + "|awk '{print $2}'"
cmd = f"sudo supervisorctl status {s}|awk '{{print $2}}'"
else:
cmd = "systemctl is-active %s" % s
cmd = f"systemctl is-active {s}"
status, stderr = subprocess_execute(cmd)
if s != 'roxy-wi-keep_alive':
service_name = s.split('_')[0]
if s == 'grafana-server':
@ -1695,9 +1666,9 @@ def get_services_status():
cmd = "prometheus --version 2>&1 |grep prometheus|awk '{print $3}'"
else:
if distro.id() == 'ubuntu':
cmd = "apt list --installed 2>&1 |grep " + service_name + "|awk '{print $2}'|sed 's/-/./'"
cmd = f"apt list --installed 2>&1 |grep {service_name}|awk '{{print $2}}'|sed 's/-/./'"
else:
cmd = "rpm -q " + service_name + "|awk -F\"" + service_name + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
cmd = f"rpm -q {service_name}|awk -F\"{service_name}\" '{{print $2}}' |awk -F\".noa\" '{{print $1}}' |sed 's/-//1' |sed 's/-/./'"
service_ver, stderr = subprocess_execute(cmd)
try:
@ -2073,9 +2044,9 @@ def send_email(email_to: str, subject: str, message: str) -> None:
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)
logging('localhost', f'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)
logging('localhost', f'error: unable to send email: {e}', haproxywi=1)
def send_email_to_server_group(subject: str, mes: str, group_id: int) -> None:
@ -2087,7 +2058,7 @@ def send_email_to_server_group(subject: str, mes: str, group_id: int) -> None:
for user_email in users_email:
send_email(user_email.email, subject, mes)
except Exception as e:
logging('localhost', 'error: unable to send email: ' + str(e), haproxywi=1)
logging('localhost', f'error: unable to send email: {e}', haproxywi=1)
def alert_routing(

View File

@ -5,6 +5,7 @@ import sys
import json
import http.cookies
import requests
from jinja2 import Environment, FileSystemLoader
import funct
@ -121,7 +122,7 @@ if serv and form.getvalue('ssl_cert'):
except Exception as e:
funct.logging('localhost', e.args[0], haproxywi=1)
try:
os.system("mv %s %s" % (name, cert_local_dir))
os.rename(name, cert_local_dir)
except OSError as e:
funct.logging('localhost', e.args[0], haproxywi=1)
@ -456,17 +457,17 @@ if form.getvalue('action_hap') is not None and serv is not None:
if is_docker == '1':
container_name = sql.get_setting('haproxy_container_name')
commands = ["sudo docker %s %s" % (action, container_name)]
commands = [f"sudo docker {action} {container_name}"]
else:
haproxy_enterprise = sql.select_service_setting(server_id, 'haproxy', 'haproxy_enterprise')
if haproxy_enterprise == '1':
haproxy_service_name = "hapee-2.0-lb"
commands = ["sudo systemctl %s %s" % (action, haproxy_service_name)]
commands = [f"sudo systemctl {action} {haproxy_service_name}"]
funct.ssh_command(serv, commands)
funct.logging(serv, 'Service has been ' + action + 'ed', haproxywi=1, login=1, keep_history=1,
funct.logging(serv, f'Service has been {action}ed', haproxywi=1, login=1, keep_history=1,
service='haproxy')
print("success: HAProxy has been %s" % action)
print(f"success: HAProxy has been {action}")
else:
print("error: Bad config, check please")
@ -651,17 +652,17 @@ if form.getvalue('show_userlists'):
except Exception as e:
funct.logging('localhost', str(e), haproxywi=1)
try:
cfg = configs_dir + serv + "-" + funct.get_data('config') + '.' + format_file
cfg = f'{configs_dir}{serv}-{funct.get_data("config")}.{format_file}'
except Exception as e:
funct.logging('localhost', ' Cannot generate a cfg path ' + str(e), haproxywi=1)
funct.logging('localhost', f' Cannot generate a cfg path {e}', haproxywi=1)
try:
error = funct.get_config(serv, cfg)
except Exception as e:
funct.logging('localhost', ' Cannot download a config ' + str(e), haproxywi=1)
funct.logging('localhost', f' Cannot download a config {e}', haproxywi=1)
try:
sections = funct.get_userlists(cfg)
except Exception as e:
funct.logging('localhost', ' Cannot get Userlists from the config file ' + str(e), haproxywi=1)
funct.logging('localhost', f' Cannot get Userlists from the config file {e}', haproxywi=1)
sections = 'error: Cannot get Userlists'
print(sections)
@ -704,20 +705,19 @@ if act == "overview":
except Exception:
waf_len = 0
if haproxy == 1:
cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Process_num"' % (
serv2, sql.get_setting('haproxy_sock_port'))
if haproxy:
cmd = f'echo "show info" |nc {serv2} {sql.get_setting("haproxy_sock_port")} -w 1|grep -e "Process_num"'
haproxy_process = funct.server_status(funct.subprocess_execute(cmd))
if nginx == 1:
nginx_cmd = 'echo "something" |nc %s %s -w 1' % (serv2, sql.get_setting('nginx_stats_port'))
if nginx:
nginx_cmd = f'echo "something" |nc {serv2} {sql.get_setting("nginx_stats_port")} -w 1'
nginx_process = funct.server_status(funct.subprocess_execute(nginx_cmd))
if apache == 1:
apache_cmd = 'echo "something" |nc %s %s -w 1' % (serv2, sql.get_setting('apache_stats_port'))
if apache:
apache_cmd = f'echo "something" |nc {serv2} {sql.get_setting("apache_stats_port")} -w 1'
apache_process = funct.server_status(funct.subprocess_execute(apache_cmd))
if keepalived == 1:
if keepalived:
command = ["ps ax |grep keepalived|grep -v grep|wc -l|tr -d '\n'"]
try:
keepalived_process = funct.ssh_command(serv2, command)
@ -893,8 +893,6 @@ if act == "overviewServers":
ioloop.close()
if form.getvalue('action'):
import requests
haproxy_user = sql.get_setting('stats_user')
haproxy_pass = sql.get_setting('stats_password')
stats_port = sql.get_setting('stats_port')
@ -919,8 +917,6 @@ if form.getvalue('action'):
auth=(haproxy_user, haproxy_pass))
if serv is not None and act == "stats":
import requests
if form.getvalue('service') == 'nginx':
haproxy_user = sql.get_setting('nginx_stats_user')
haproxy_pass = sql.get_setting('nginx_stats_password')
@ -1004,7 +1000,7 @@ if form.getvalue('viewlogs') is not None:
if funct.check_user_group():
out = funct.show_roxy_log(serv=viewlog, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1,
minut1=minut1, service='internal')
print(out)
print(out)
if serv is not None and act == "showMap":
import networkx as nx
@ -1017,10 +1013,9 @@ if serv is not None and act == "showMap":
haproxy_config_path = sql.get_setting('haproxy_config_path')
hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
date = funct.get_data('config')
cfg = hap_configs_dir + serv + "-" + date + ".cfg"
cfg = f'{hap_configs_dir}{serv}-{date}.cfg'
print('<center>')
print("<h4>Map from %s</h4><br />" % serv)
print(f'<center><h4 style="margin-bottom: 0;">Map from {serv}</h4>')
error = funct.get_config(serv, cfg)
if error:
@ -1028,7 +1023,8 @@ if serv is not None and act == "showMap":
try:
conf = open(cfg, "r")
except IOError:
print('error: Can\'t read import config file')
print('error: Cannot read import config file')
sys.exit()
G = nx.DiGraph()
node = ""
@ -1090,8 +1086,8 @@ if serv is not None and act == "showMap":
sections['backends'][node]['servers'][line_new[0]] = {line_new[0]: backend_server_port}
except Exception:
pass
os.system("/bin/rm -f " + cfg)
conf.close()
os.remove(cfg)
i, k, j = 0, 0, 0
backend_servers_len_dict = 1
@ -1215,11 +1211,8 @@ if serv is not None and act == "showMap":
except Exception as e:
print(str(e))
cmd = "rm -f " + os.path.dirname(os.getcwd()) + "/map*.png && mv map.png " + os.path.dirname(
os.getcwd()) + "/map" + date + ".png"
output, stderr = funct.subprocess_execute(cmd)
print(stderr)
print('<img src="/map%s.png" alt="map">' % date)
os.system(f"rm -f {os.path.dirname(os.getcwd())}/map*.png && mv map.png {os.path.dirname(os.getcwd())}/map{date}.png")
print(f'<img src="/map{date}.png" alt="map"></center>')
if form.getvalue('servaction') is not None:
server_state_file = sql.get_setting('server_state_file')
@ -1227,22 +1220,23 @@ if form.getvalue('servaction') is not None:
enable = funct.checkAjaxInput(form.getvalue('servaction'))
backend = funct.checkAjaxInput(form.getvalue('servbackend'))
cmd = 'echo "{} {}" |sudo socat stdio {}'.format(enable, backend, haproxy_sock)
cmd = f'echo "{enable} {backend}" |sudo socat stdio {haproxy_sock}'
if form.getvalue('save') == "on":
save_command = 'echo "show servers state" | sudo socat {} stdio > {}'.format(haproxy_sock, server_state_file)
save_command = f'echo "show servers state" | sudo socat {haproxy_sock} stdio > {server_state_file}'
command = [cmd + ';' + save_command]
else:
command = [cmd]
if enable != "show":
funct.logging(serv, 'Has been ' + enable + 'ed ' + backend, login=1, keep_history=1, service='haproxy')
funct.logging(serv, f'Has been {enable}ed {backend}', login=1, keep_history=1, service='haproxy')
print(
'<center><h3>You %s %s on HAProxy %s. <a href="statsview.py?serv=%s" title="View stat" target="_blank">Look it</a> or <a href="runtimeapi.py" title="Runtime API">Edit something else</a></h3><br />' % (
enable, backend, serv, serv))
f'<center><h3>You {enable} {backend} on HAProxy {serv}. <a href="statsview.py?serv={serv}" '
f'title="View stat" target="_blank">Look it</a> or <a href="runtimeapi.py" '
f'title="Runtime API">Edit something else</a></h3><br />')
print(funct.ssh_command(serv, command, show_log="1"))
action = 'runtimeapi.py ' + enable + ' ' + backend
action = f'runtimeapi.py {enable} {backend}'
funct.logging(serv, action)
if act == "showCompareConfigs":
@ -1344,9 +1338,10 @@ if serv is not None and act == "configShow":
is_serv_protected=is_serv_protected,
is_restart=is_restart)
print(template)
conf.close()
if form.getvalue('configver') is None:
os.system("/bin/rm -f " + cfg)
os.remove(cfg)
if act == 'configShowFiles':
service = form.getvalue('service')
@ -1396,31 +1391,19 @@ if form.getvalue('master'):
script = "install_keepalived.sh"
proxy = sql.get_setting('proxy')
keepalived_path_logs = sql.get_setting('keepalived_path_logs')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(master)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=master)
for server in servers:
ssh_port = str(server[10])
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(master)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
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) + " HAPROXY=" + haproxy
+ " NGINX=" + nginx + " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + "' KEY=" + str(
ssh_key_name)
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} router_id={router_id} "
f"ETH={ETH} IP={IP} MASTER=MASTER ETH_SLAVE={ETH_SLAVE} keepalived_path_logs={keepalived_path_logs} "
f"RETURN_TO_MASTER={return_to_master} SYN_FLOOD={syn_flood} HOST={master} HAPROXY={haproxy} NGINX={nginx} "
f"USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
@ -1437,6 +1420,7 @@ if form.getvalue('master'):
hostname + '-VIP', IP, group_id, '1', '1', '0', cred_id, ssh_port, 'VRRP IP for ' + master, haproxy,
nginx, '0', firewall
)
os.remove(script)
if form.getvalue('master_slave'):
master = form.getvalue('master_slave')
@ -1451,36 +1435,25 @@ if form.getvalue('master_slave'):
script = "install_keepalived.sh"
proxy = sql.get_setting('proxy')
keepalived_path_logs = sql.get_setting('keepalived_path_logs')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(slave)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=slave)
for server in servers:
ssh_port = str(server[10])
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(slave)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
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
+ " HAPROXY=" + HAPROXY + " NGINX=" + nginx + " HOST=" + str(slave) + " USER=" + str(
ssh_user_name) + " PASS='" + str(ssh_user_password)
+ "' KEY=" + str(ssh_key_name)
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} router_id={router_id} ETH={ETH} "
f"IP={IP} MASTER=BACKUP ETH_SLAVE={ETH_SLAVE} keepalived_path_logs={keepalived_path_logs} HAPROXY={HAPROXY} "
f"NGINX={nginx} HOST={slave} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'slave Keepalived')
os.system("rm -f %s" % script)
os.remove(script)
sql.update_server_master(master, slave)
sql.update_keepalived(slave)
@ -1496,34 +1469,25 @@ if form.getvalue('masteradd'):
script = "install_keepalived.sh"
proxy = sql.get_setting('proxy')
keepalived_path_logs = sql.get_setting('keepalived_path_logs')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(master)
if ssh_enable == 0:
ssh_key_name = ''
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(master)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
os.system("cp scripts/%s ." % script)
servers = sql.select_servers(server=master)
for server in servers:
ssh_port = str(server[10])
os.system(f"cp scripts/{script} .")
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SSH_PORT=" + ssh_port + " ETH=" + ETH
+ " SLAVE_ETH=" + SLAVE_ETH + " keepalived_path_logs=" + keepalived_path_logs + " RETURN_TO_MASTER=" + return_to_master
+ " IP=" + str(IP) + " MASTER=MASTER" + " RESTART=" + kp + " ADD_VRRP=1 HOST=" + str(
master) + " router_id=" + router_id
+ " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + "' KEY=" + str(ssh_key_name)
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={ETH} SLAVE_ETH={SLAVE_ETH} "
f"keepalived_path_logs={keepalived_path_logs} RETURN_TO_MASTER={return_to_master} IP={IP} MASTER=MASTER "
f"RESTART={kp} ADD_VRRP=1 HOST={master} router_id={router_id} USER={ssh_settings['user']} "
f"PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'master VRRP address')
os.remove(script)
if form.getvalue('masteradd_slave'):
master = form.getvalue('masteradd_slave')
@ -1536,36 +1500,25 @@ if form.getvalue('masteradd_slave'):
script = "install_keepalived.sh"
proxy = sql.get_setting('proxy')
keepalived_path_logs = sql.get_setting('keepalived_path_logs')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(slave)
if ssh_enable == 0:
ssh_key_name = ''
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(slave)
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
os.system("cp scripts/%s ." % script)
servers = sql.select_servers(server=slave)
for server in servers:
ssh_port = str(server[10])
os.system(f"cp scripts/{script} .")
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv
+ " SSH_PORT=" + ssh_port + " ETH=" + ETH + " SLAVE_ETH=" + SLAVE_ETH + " keepalived_path_logs=" + keepalived_path_logs
+ " IP=" + str(IP) + " MASTER=BACKUP" + " RESTART=" + kp + " ADD_VRRP=1 HOST=" + str(
slave) + " router_id=" + router_id
+ " USER=" + str(ssh_user_name) + " PASS='" + str(ssh_user_password) + "' KEY=" + str(ssh_key_name)
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={ETH} SLAVE_ETH={SLAVE_ETH} "
f"keepalived_path_logs={keepalived_path_logs} IP={IP} MASTER=BACKUP RESTART={kp} ADD_VRRP=1 HOST={slave} "
f"router_id={router_id} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'slave VRRP address')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('master_slave_hap'):
master = form.getvalue('master_slave_hap')
@ -1592,16 +1545,15 @@ if form.getvalue('master_slave_nginx'):
if form.getvalue('install_grafana'):
script = "install_grafana.sh"
proxy = sql.get_setting('proxy')
proxy_serv = ''
host = os.environ.get('HTTP_HOST', '')
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
commands = ["chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv]
commands = [f"chmod +x {script} && ./{script} PROXY={proxy_serv}"]
output, error = funct.subprocess_execute(commands[0])
@ -1623,7 +1575,7 @@ if form.getvalue('install_grafana'):
print(
f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('haproxy_exp_install'):
serv = form.getvalue('haproxy_exp_install')
@ -1636,17 +1588,9 @@ if form.getvalue('haproxy_exp_install'):
stats_password = sql.get_setting('stats_password')
stat_page = sql.get_setting('stats_page')
proxy = sql.get_setting('proxy')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(serv)
ssh_settings = funct.return_ssh_keys_path(serv)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=serv)
for server in servers:
ssh_port = str(server[10])
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
@ -1654,93 +1598,76 @@ if form.getvalue('haproxy_exp_install'):
proxy_serv = ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv
+ " STAT_PORT=" + str(stats_port) + " STAT_FILE=" + server_state_file
+ " SSH_PORT=" + ssh_port + " STAT_PAGE=" + stat_page + " VER=" + ver + " EXP_PROM=" + ext_prom
+ " STATS_USER=" + stats_user + " STATS_PASS='" + stats_password + "' HOST=" + serv
+ " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} STAT_PORT={stats_port} STAT_FILE={server_state_file}"
f" SSH_PORT={ssh_settings['port']} STAT_PAGE={stat_page} VER={ver} EXP_PROM={ext_prom} STATS_USER={stats_user}"
f" STATS_PASS='{stats_password}' HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'HAProxy exporter')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('nginx_exp_install'):
serv = form.getvalue('nginx_exp_install')
ver = form.getvalue('exporter_v')
ext_prom = form.getvalue('ext_prom')
script = "install_nginx_exporter.sh"
stats_user = sql.get_setting('nginx_stats_user')
stats_password = sql.get_setting('nginx_stats_password')
stats_port = sql.get_setting('nginx_stats_port')
stats_page = sql.get_setting('nginx_stats_page')
if form.getvalue('nginx_exp_install') or form.getvalue('apache_exp_install'):
if form.getvalue('nginx_exp_install'):
service = 'nginx'
elif form.getvalue('apache_exp_install'):
service = 'apache'
serv = funct.is_ip_or_dns(form.getvalue('serv'))
ver = funct.checkAjaxInput(form.getvalue('exporter_v'))
ext_prom = funct.checkAjaxInput(form.getvalue('ext_prom'))
script = f"install_{service}_exporter.sh"
stats_user = sql.get_setting(f'{service}_stats_user')
stats_password = sql.get_setting(f'{service}_stats_password')
stats_port = sql.get_setting(f'{service}_stats_port')
stats_page = sql.get_setting(f'{service}_stats_page')
proxy = sql.get_setting('proxy')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(serv)
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(serv)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=serv)
for server in servers:
ssh_port = str(server[10])
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv
+ " STAT_PORT=" + str(stats_port) + " SSH_PORT=" + ssh_port + " STAT_PAGE=" + stats_page
+ " STATS_USER=" + stats_user + " STATS_PASS='" + stats_password + "' HOST=" + serv + " VER=" + ver
+ " EXP_PROM=" + ext_prom + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} STAT_PORT={stats_port} SSH_PORT={ssh_settings['port']} STAT_PAGE={stats_page}"
f" STATS_USER={stats_user} STATS_PASS='{stats_password}' HOST={serv} VER={ver} EXP_PROM={ext_prom} USER={ssh_settings['user']} "
f" PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'Nginx exporter')
funct.show_installation_output(error, output, f'{service.title()} exporter')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('node_exp_install'):
serv = form.getvalue('node_exp_install')
ver = form.getvalue('exporter_v')
ext_prom = form.getvalue('ext_prom')
serv = funct.is_ip_or_dns(form.getvalue('node_exp_install'))
ver = funct.checkAjaxInput(form.getvalue('exporter_v'))
ext_prom = funct.checkAjaxInput(form.getvalue('ext_prom'))
script = "install_node_exporter.sh"
proxy = sql.get_setting('proxy')
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(serv)
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(serv)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=serv)
for server in servers:
ssh_port = str(server[10])
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SSH_PORT=" + ssh_port
+ " VER=" + ver + " EXP_PROM=" + ext_prom + " HOST=" + serv + " USER=" + ssh_user_name
+ " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} "
f"HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'Node exporter')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupupdate'):
serv = form.getvalue('server')
@ -1753,8 +1680,7 @@ if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupup
update = form.getvalue('backupupdate')
description = form.getvalue('description')
script = 'backup.sh'
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path('localhost', id=int(cred))
ssh_settings = funct.return_ssh_keys_path('localhost', id=int(cred))
if deljob:
time = ''
@ -1768,16 +1694,11 @@ if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupup
print('warning: Backup job for %s already exists' % serv)
sys.exit()
servers = sql.select_servers(server=serv)
for server in servers:
ssh_port = str(server[10])
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
commands = [
"chmod +x " + script + " && ./" + script + " HOST=" + rserver + " SERVER=" + serv
+ " TYPE=" + backup_type + " SSH_PORT=" + ssh_port + " TIME=" + time
+ " RPATH=" + rpath + " DELJOB=" + deljob + " USER=" + str(ssh_user_name) + " KEY=" + str(ssh_key_name)
f"chmod +x {script} && ./{script} HOST={rserver} SERVER={serv} TYPE={backup_type} SSH_PORT={ssh_settings['port']} "
f"TIME={time} RPATH={rpath} DELJOB={deljob} USER={ssh_settings['user']} KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
@ -1813,6 +1734,8 @@ if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupup
print('Ok')
funct.logging('backup ', ' a backup job for server ' + serv + ' has been updated', haproxywi=1, login=1)
os.remove(script)
if form.getvalue('git_backup'):
server_id = form.getvalue('server')
service_id = form.getvalue('git_service')
@ -1830,19 +1753,13 @@ if form.getvalue('git_backup'):
service_name = sql.select_service_name_by_id(service_id).lower()
service_config_dir = sql.get_setting(service_name + '_dir')
script = 'git_backup.sh'
ssh_port = 22
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path('localhost', id=int(cred))
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path('localhost', id=int(cred))
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
servers = sql.select_servers(server=server_ip)
for server in servers:
ssh_port = str(server[10])
if repo is None or git_init == '0':
repo = ''
@ -1850,10 +1767,9 @@ if form.getvalue('git_backup'):
branch = 'main'
commands = [
"chmod +x " + script + " && ./" + script + " HOST=" + server_ip + " DELJOB=" + deljob
+ " SERVICE=" + service_name + " INIT=" + git_init + " SSH_PORT=" + ssh_port + " PERIOD=" + period
+ " REPO=" + repo + " BRANCH=" + branch + " CONFIG_DIR=" + service_config_dir
+ " PROXY=" + proxy_serv + " USER=" + str(ssh_user_name) + " KEY=" + str(ssh_key_name)
f"chmod +x {script} && ./{script} HOST={server_ip} DELJOB={deljob} SERVICE={service_name} INIT={git_init} "
f"SSH_PORT={ssh_settings['port']} PERIOD={period} REPO={repo} BRANCH={branch} CONFIG_DIR={service_config_dir} "
f"PROXY={proxy_serv} USER={ssh_settings['user']} KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
@ -1887,7 +1803,7 @@ if form.getvalue('git_backup'):
else:
if sql.delete_git(form.getvalue('git_backup')):
print('Ok')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('install_nginx'):
funct.install_nginx(form.getvalue('install_nginx'), docker=form.getvalue('docker'))
@ -1914,7 +1830,7 @@ if form.getvalue('update_roxy_wi'):
'roxy-wi-socket',
'roxy-wi-prometheus-exporter']
if service not in services:
print('error: ' + service + ' is not part of Roxy-WI')
print(f'error: {service} is not part of Roxy-WI')
sys.exit()
funct.update_roxy_wi(service)
@ -2094,7 +2010,7 @@ if form.getvalue('get_nginx_v'):
if is_dockerized == '1':
container_name = sql.get_setting('nginx_container_name')
cmd = ["docker exec -it " + container_name + " /usr/sbin/nginx -v 2>&1|awk '{print $3}'"]
cmd = [f"docker exec -it {container_name} /usr/sbin/nginx -v 2>&1|awk '{{print $3}}'"]
else:
cmd = ['sudo /usr/sbin/nginx -v']
print(funct.ssh_command(serv, cmd))
@ -2108,44 +2024,45 @@ if form.getvalue('get_exporter_v'):
if form.getvalue('bwlists'):
lib_path = get_config.get_config_var('main', 'lib_path')
list_path = lib_path + "/" + sql.get_setting('lists_path') + "/" + form.getvalue('group') + "/" + form.getvalue(
'color') + "/" + form.getvalue('bwlists')
color = funct.checkAjaxInput(form.getvalue('color'))
group = funct.checkAjaxInput(form.getvalue('group'))
bwlists = funct.checkAjaxInput(form.getvalue('bwlists'))
list_path = f"{lib_path}/{sql.get_setting('lists_path')}/{group}/{color}/{bwlist}"
try:
file = open(list_path, "r")
file_read = file.read()
file.close()
print(file_read)
except IOError:
print('error: Cat\'n read ' + form.getvalue('color') + ' list , ')
print(f"error: Cannot read {color} list")
if form.getvalue('bwlists_create'):
color = form.getvalue('color')
color = funct.checkAjaxInput(form.getvalue('color'))
lib_path = get_config.get_config_var('main', 'lib_path')
list_name = form.getvalue('bwlists_create').split('.')[0]
list_name += '.lst'
list_path = lib_path + "/" + sql.get_setting('lists_path') + "/" + form.getvalue(
'group') + "/" + color + "/" + list_name
list_name = f"{form.getvalue('bwlists_create').split('.')[0]}.lst"
list_path = f"{lib_path}/{sql.get_setting('lists_path')}/{form.getvalue('group')}/{color}/{list_name}"
try:
open(list_path, 'a').close()
print('success: ')
try:
funct.logging(serv, 'has been created ' + color + ' list ' + list_name, haproxywi=1, login=1)
funct.logging(serv, f'A new list {color} {list_name} has been created', haproxywi=1, login=1)
except Exception:
pass
except IOError as e:
print('error: Cannot create new ' + color + ' list. %s , ' % e)
print(f'error: Cannot create a new {color} list. {e}, ')
if form.getvalue('bwlists_save'):
color = form.getvalue('color')
bwlists_save = form.getvalue('bwlists_save')
color = funct.checkAjaxInput(form.getvalue('color'))
group = funct.checkAjaxInput(form.getvalue('group'))
bwlists_save = funct.checkAjaxInput(form.getvalue('bwlists_save'))
lib_path = get_config.get_config_var('main', 'lib_path')
list_path = lib_path + "/" + sql.get_setting('lists_path') + "/" + form.getvalue(
'group') + "/" + color + "/" + bwlists_save
list_path = f"{lib_path}/{sql.get_setting('lists_path')}/{group}/{color}/{bwlists_save}"
try:
with open(list_path, "w") as file:
file.write(form.getvalue('bwlists_content'))
except IOError as e:
print('error: Cannot save ' + color + ' list. %s , ' % e)
print(f'error: Cannot save {color} list. {e}')
path = sql.get_setting('haproxy_dir') + "/" + color
servers = []
@ -2163,8 +2080,8 @@ if form.getvalue('bwlists_save'):
servers.append(s[2])
for serv in servers:
funct.ssh_command(serv, ["sudo mkdir " + path])
funct.ssh_command(serv, ["sudo chown $(whoami) " + path])
funct.ssh_command(serv, [f"sudo mkdir {path}"])
funct.ssh_command(serv, [f"sudo chown $(whoami) {path}"])
error = funct.upload(serv, path + "/" + bwlists_save, list_path, dir='fullpath')
if error:
@ -2172,7 +2089,7 @@ if form.getvalue('bwlists_save'):
else:
print('success: Edited ' + color + ' list was uploaded to ' + serv + ' , ')
try:
funct.logging(serv, 'has been edited the ' + color + ' list ' + bwlists_save, haproxywi=1, login=1)
funct.logging(serv, f'Has been edited the {color} list {bwlists_save}', haproxywi=1, login=1)
except Exception:
pass
@ -2184,9 +2101,9 @@ if form.getvalue('bwlists_save'):
haproxy_service_name = "haproxy"
if form.getvalue('bwlists_restart') == 'restart':
funct.ssh_command(serv, ["sudo systemctl restart " + haproxy_service_name])
funct.ssh_command(serv, [f"sudo systemctl restart {haproxy_service_name}"])
elif form.getvalue('bwlists_restart') == 'reload':
funct.ssh_command(serv, ["sudo systemctl reload " + haproxy_service_name])
funct.ssh_command(serv, [f"sudo systemctl reload {haproxy_service_name}"])
if form.getvalue('bwlists_delete'):
color = form.getvalue('color')
@ -2939,13 +2856,11 @@ if form.getvalue('showBytes') is not None:
bin_bout.append(cout[0])
env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
template = env.get_template('ajax/bin_bout.html')
template = template.render(bin_bout=bin_bout, serv=serv)
template = template.render(bin_bout=bin_bout, serv=serv, service='haproxy')
print(template)
if form.getvalue('nginxConnections'):
import requests
serv = form.getvalue('nginxConnections')
serv = funct.is_ip_or_dns(form.getvalue('nginxConnections'))
port = sql.get_setting('nginx_stats_port')
user = sql.get_setting('nginx_stats_user')
password = sql.get_setting('nginx_stats_password')
@ -2967,7 +2882,30 @@ if form.getvalue('nginxConnections'):
template = template.render(bin_bout=bin_bout, serv=serv, service='nginx')
print(template)
else:
print('error: cannot connect to Nginx stat page')
print('error: cannot connect to NGINX stat page')
if form.getvalue('apachekBytes'):
serv = funct.is_ip_or_dns(form.getvalue('apachekBytes'))
port = sql.get_setting('apache_stats_port')
user = sql.get_setting('apache_stats_user')
password = sql.get_setting('apache_stats_password')
page = sql.get_setting('apache_stats_page')
bin_bout = []
url = f'http://{serv}:{port}/{page}?auto'
r = requests.get(url, auth=(user, password))
if r.status_code == 200:
for line in r.text.split('\n'):
if 'ReqPerSec' in line or 'BytesPerSec' in line:
bin_bout.append(line.split(' ')[1])
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('ajax/bin_bout.html')
template = template.render(bin_bout=bin_bout, serv=serv, service='apache')
print(template)
else:
print('error: cannot connect to Apache stat page')
if form.getvalue('waf_rule_id'):
enable = funct.checkAjaxInput(form.getvalue('waf_en'))
@ -3029,27 +2967,18 @@ if form.getvalue('lets_domain'):
ssl_path = sql.get_setting('cert_path')
haproxy_dir = sql.get_setting('haproxy_dir')
script = "letsencrypt.sh"
ssh_port = "22"
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(serv)
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(serv)
if ssh_enable == 0:
ssh_key_name = ''
servers = sql.select_servers(server=serv)
for server in servers:
ssh_port = str(server[10])
os.system("cp scripts/%s ." % script)
os.system(f"cp scripts/{script} .")
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
commands = [
"chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " haproxy_dir=" + haproxy_dir
+ " DOMAIN=" + lets_domain + " EMAIL=" + lets_email + " SSH_PORT=" + ssh_port + " SSL_PATH=" + ssl_path
+ " HOST=" + serv + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name
f"chmod +x {script} && ./{script} PROXY={proxy_serv} haproxy_dir={haproxy_dir} DOMAIN={lets_domain} "
f"EMAIL={lets_email} SSH_PORT={ssh_settings['port']} SSL_PATH={ssl_path} HOST={serv} USER={ ssh_settings['user']} "
f"PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
@ -3071,7 +3000,7 @@ if form.getvalue('lets_domain'):
else:
print('success: Certificate has been created')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('uploadovpn'):
name = funct.checkAjaxInput(form.getvalue('ovpnname'))
@ -3194,7 +3123,8 @@ if form.getvalue('geoip_install'):
service = form.getvalue('geoip_service')
proxy = sql.get_setting('proxy')
maxmind_key = sql.get_setting('maxmind_key')
ssh_enable, ssh_user_name, ssh_user_password, ssh_key_name = funct.return_ssh_keys_path(serv)
proxy_serv = ''
ssh_settings = funct.return_ssh_keys_path(serv)
if service in ('haproxy', 'nginx'):
service_dir = funct.return_nice_path(sql.get_setting(f'{service}_dir'))
@ -3203,28 +3133,22 @@ if form.getvalue('geoip_install'):
print('warning: select a server and service first')
sys.exit()
if ssh_enable == 0:
ssh_key_name = ''
ssh_port = [ str(server[10]) for server in sql.select_servers(server=serv) ]
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
else:
proxy_serv = ''
os.system(f"cp scripts/{script} .")
commands = [
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_port[0]} UPDATE={geoip_update} maxmind_key={maxmind_key} "
f"service_dir={service_dir} HOST={serv} USER={ssh_user_name} PASS={ssh_user_password} KEY={ssh_key_name}"
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} UPDATE={geoip_update} "
f"maxmind_key={maxmind_key} service_dir={service_dir} HOST={serv} USER={ssh_settings['user']} "
f"PASS={ssh_settings['password']} KEY={ssh_settings['key']}"
]
output, error = funct.subprocess_execute(commands[0])
funct.show_installation_output(error, output, 'GeoLite2 Database')
os.system("rm -f %s" % script)
os.remove(script)
if form.getvalue('nettools_icmp_server_from'):
server_from = form.getvalue('nettools_icmp_server_from')

View File

@ -0,0 +1,24 @@
- hosts: "{{ variable_host }}"
become: yes
become_method: sudo
tasks:
- name: Set SSH port
set_fact:
ansible_port: "{{SSH_PORT}}"
- name: Open stat port for iptables
iptables:
chain: INPUT
destination_port: "9117"
jump: ACCEPT
protocol: tcp
ignore_errors: yes
roles:
- role: apache_exporter
environment:
http_proxy: "{{PROXY}}"
https_proxy: "{{PROXY}}"
vars:
apache_exporter_scrape_uri: 'http://{{STATS_USER}}:{{STATS_PASS}}@{{variable_host}}:{{STAT_PORT}}/{{STAT_PAGE}}'

View File

@ -0,0 +1,8 @@
---
apache_exporter_version: 0.6.0
apache_exporter_telemetry_address: "0.0.0.0:9117"
apache_exporter_telemetry_endpoint: "/metrics"
apache_exporter_incecure: "false"
stats_page: "stats"
apache_exporter_scrape_uri: "http://{{host}}/{{stats_page}}?auto"
prometheus_exporter_dir: "/opt/prometheus/exporters"

View File

@ -0,0 +1,7 @@
---
- name: restart apache exporter
become: true
systemd:
daemon_reload: true
name: apache_exporter
state: restarted

View File

@ -0,0 +1,81 @@
---
- include: preflight.yml
- name: Create the Apache Exporter group
become: true
group:
name: "{{ __apache_exporter_group }}"
state: present
system: true
- name: Create the Apache Exporter user
become: true
user:
name: "{{ __apache_exporter_user }}"
groups: "{{ __apache_exporter_group }}"
append: true
shell: /usr/sbin/nologin
system: true
createhome: false
home: /
- name: Distribution Directory
become: true
become_user: root
file:
path: "{{ prometheus_exporter_dir }}"
owner: root
group: root
mode: "u=rwx,go=rx"
state: directory
- name: Download apache_exporter binary to local folder
get_url:
url: "https://github.com/Lusitaniae/apache_exporter/releases/download/v{{ apache_exporter_version }}/apache_exporter-{{ apache_exporter_version }}.linux-{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}.tar.gz"
dest: "/tmp/apache_exporter-{{ apache_exporter_version }}.linux-{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}.tar.gz"
checksum: "sha256:{{ __apache_exporter_checksum }}"
register: _download_binary
until: _download_binary is succeeded
retries: 5
delay: 2
delegate_to: localhost
check_mode: false
- name: Unpack apache_exporter binary
unarchive:
src: "/tmp/apache_exporter-{{ apache_exporter_version }}.linux-{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}.tar.gz"
dest: "/tmp"
creates: "/tmp/apache_exporter-{{ apache_exporter_version }}.linux-{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}/apache_exporter"
delegate_to: localhost
check_mode: false
- name: Propagate apache_exporter binaries
become: true
copy:
src: "/tmp/apache_exporter-{{ apache_exporter_version }}.linux-{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}/apache_exporter"
dest: "/opt/prometheus/exporters/apache_exporter"
mode: 0755
owner: root
group: root
notify:
- restart apache exporter
when: not ansible_check_mode
- name: Copy the apache_exporter systemd service file
become: true
template:
src: apache_exporter.service.j2
dest: /etc/systemd/system/apache_exporter.service
owner: root
group: root
mode: 0644
no_log: true
notify:
- restart apache exporter
- name: Ensure apache_exporter is enabled on boot
become: true
systemd:
name: apache_exporter
state: started
enabled: true

View File

@ -0,0 +1,7 @@
---
- name: "Get checksum for {{ go_arch_map[ansible_architecture] | default(ansible_architecture) }} architecture"
set_fact:
__apache_exporter_checksum: "{{ item.split(' ')[0] }}"
with_items:
- "{{ lookup('url', 'https://github.com/Lusitaniae/apache_exporter/releases/download/v' + apache_exporter_version + '/sha256sums.txt', wantlist=True) | list }}"
when: "('linux-' + (go_arch_map[ansible_architecture] | default(ansible_architecture)) + '.tar.gz') in item"

View File

@ -0,0 +1,20 @@
{{ ansible_managed | comment }}
[Unit]
Description=Prometheus Apache Exporter
After=network.target
[Service]
Type=simple
User={{ __apache_exporter_user }}
Group={{ __apache_exporter_group }}
ExecStart={{ prometheus_exporter_dir }}/apache_exporter \
--telemetry.address {{ apache_exporter_telemetry_address|default("0.0.0.0:9117") }} \
--scrape_uri {{ apache_exporter_scrape_uri|default("http://localhost/server-status/?auto") }} \
--telemetry.endpoint {{ apache_exporter_telemetry_endpoint|default("/metrics") }} \
SyslogIdentifier=apache_exporter
Restart=always
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,10 @@
---
go_arch_map:
i386: '386'
x86_64: 'amd64'
aarch64: 'arm64'
armv7l: 'armv7'
armv6l: 'armv6'
__apache_exporter_user: apache-exp
__apache_exporter_group: apache-exp

View File

@ -0,0 +1,54 @@
#!/bin/bash
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
PROXY) PROXY=${VALUE} ;;
HOST) HOST=${VALUE} ;;
USER) USER=${VALUE} ;;
PASS) PASS=${VALUE} ;;
KEY) KEY=${VALUE} ;;
VER) VER=${VALUE} ;;
EXP_PROM) EXP_PROM=${VALUE} ;;
STAT_PORT) STAT_PORT=${VALUE} ;;
STAT_PAGE) STAT_PAGE=${VALUE} ;;
STATS_USER) STATS_USER=${VALUE} ;;
STATS_PASS) STATS_PASS=${VALUE} ;;
SSH_PORT) SSH_PORT=${VALUE} ;;
*)
esac
done
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False
export ACTION_WARNINGS=False
export LOCALHOST_WARNING=False
export COMMAND_WARNINGS=False
PWD=`pwd`
PWD=$PWD/scripts/ansible/
echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
if [[ $KEY == "" ]]; then
ansible-playbook $PWD/roles/apache_exporter.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT apache_exporter_version=$VER" -i $PWD/$HOST
else
ansible-playbook $PWD/roles/apache_exporter.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT apache_exporter_version=$VER" -i $PWD/$HOST
fi
if [ $? -gt 0 ]
then
echo "error: Can't install Apache exporter <br /><br />"
exit 1
fi
if [ "$EXP_PROM" == 0 ]
then
if ! sudo grep -Fxq " - $HOST:9117" /etc/prometheus/prometheus.yml; then
sudo echo " - $HOST:9117" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null
sudo systemctl reload prometheus 2>> /dev/null
fi
fi
rm -f $PWD/$HOST

View File

@ -1,4 +1,4 @@
{% if service != 'nginx' %}
{% if service == 'haproxy' %}
<div class="bin_bout" id="show_bin_bout">
<div class="server-name">
Bytes in
@ -39,6 +39,7 @@
</div>
</div>
{% endif %}
{% if service == 'nginx' or service == 'haproxy' %}
<div id="sessions" class="bin_bout">
<div class="server-name">
Current ses
@ -59,4 +60,36 @@
<div class="bytes" id="total_sess">
{{bin_bout.3}}
</div>
</div>
</div>
{% endif %}
{% if service == 'apache' %}
<div class="bin_bout" id="show_bin_bout">
<div class="server-name">
ReqPerSec
<span class="update-icon" style="font-size: 13px; margin-top: 8px;">
<a onclick="showApachekBytes('{{ serv }}')" title="Refresh">
<span class="service-reload"></span>
</a>
</span>
</div>
<div class="bytes" id="bin">
{{bin_bout.0}}
</div>
<div class="server-name">
BytesPerSec
</div>
<div class="bytes" id="bout">
{% set total = bin_bout.1|int / 1024 %}
{% set metric = 'Kb' %}
{% if total > 1000 %}
{% set total = total / 1024 %}
{% set metric = 'Mb' %}
{% endif %}
{% if total > 1000 %}
{% set total = total / 1024 %}
{% set metric = 'Gb' %}
{% endif %}
{{total|round(2)}} {{metric}}
</div>
</div>
{% endif %}

View File

@ -68,11 +68,11 @@
function showMetrics() {
{%- if service == 'haproxy' %}
{%- for s in servers %}
{%- if s.8.0.9 %}
getChartData(server_ip)
getHttpChartData(server_ip)
getWafChartData(server_ip)
{% endif %}
{%- if s.8.0.9 %}
getChartData(server_ip)
getHttpChartData(server_ip)
getWafChartData(server_ip)
{% endif %}
{% endfor %}
{% endif %}
showOverviewServer('{{s.1}}', server_ip, '{{s.0}}', '{{service}}');
@ -82,6 +82,7 @@
getNginxChartData(server_ip)
{% endif %}
{%- elif service == 'apache' %}
showApachekBytes(server_ip)
{% if s.8.0.27 %}
getApacheChartData(server_ip)
{% endif %}

View File

@ -93,6 +93,37 @@
</td>
</tr>
</table>
<table>
<caption><h3>Install Apache Exporter</h3></caption>
<tr class="overviewHead">
<td class="padding10 first-collumn">Current installation</td>
<td class="padding10 first-collumn" style="width: 30%;">Available Versions</td>
<td class="help_cursor" style="width: 20%;" title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter">External Prometheus</td>
<td class="padding10 first-collumn" style="width: 30%;">Server</td>
<td></td>
<td></td>
</tr>
<tr>
<td id="cur_apache_exp_ver" class="padding10 first-collumn"></td>
<td class="padding10 first-collumn" style="width: 20%;">
{% set values = dict() %}
{% set values = {'0.7.0':'0.7.0', '0.8.0':'0.8.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0'} %}
{{ select('apacheexpver', values=values, selected='0.10.0') }}
</td>
<td style="padding-left: 53px;">{{ checkbox('apache_ext_prom', title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter") }}</td>
<td class="padding10 first-collumn">
<select autofocus required name="apache_exp_addserv" id="apache_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
<td>
<span class="ui-button ui-widget ui-corner-all" id="apache_exp_install" title="Install Apache Exporter">Install</span>
</td>
</tr>
</table>
<table style="margin-top: 20px">
<caption><h3>Install Node Exporter</h3></caption>
<tr class="overviewHead">

View File

@ -4,3 +4,4 @@ pyTelegramBotAPI>=3.6.3
slack-sdk>=3.4.0
distro>=1.2.0
retry>=0.9.2
psutil>=5.9.1

View File

@ -518,6 +518,28 @@ function showNginxConnections(serv) {
}
} );
}
function showApachekBytes(serv) {
$.ajax( {
url: "options.py",
data: {
apachekBytes: serv,
token: $('#token').val()
},
type: "POST",
beforeSend: function() {
$("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />');
},
success: function( data ) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else {
$("#bin_bout").html(data);
$.getScript("/inc/fontawesome.min.js")
}
}
} );
}
function showUsersOverview() {
$.ajax( {
url: "options.py",

View File

@ -166,7 +166,8 @@ $( function() {
$.ajax( {
url: "options.py",
data: {
nginx_exp_install: $('#nginx_exp_addserv').val(),
nginx_exp_install: 1,
serv: $('#nginx_exp_addserv').val(),
exporter_v: $('#nginxexpver').val(),
ext_prom: ext_prom,
token: $('#token').val()
@ -180,7 +181,7 @@ $( function() {
} else if (data.indexOf('success') != '-1' ){
toastr.clear();
toastr.success(data);
$('#cur_nginx_exp_ver').text('Nginx exporter is installed');
$('#cur_nginx_exp_ver').text('NGINX exporter is installed');
$("#nginx_exp_addserv").trigger( "selectmenuchange" );
} else if (data.indexOf('Info') != '-1' ){
toastr.clear();
@ -192,6 +193,43 @@ $( function() {
}
} );
});
$('#apache_exp_install').click(function() {
$("#ajaxmon").html('')
$("#ajaxmon").html(wait_mess);
var ext_prom = 0;
if ($('#apache_ext_prom').is(':checked')) {
ext_prom = '1';
}
$.ajax( {
url: "options.py",
data: {
apache_exp_install: 1,
serv: $('#apache_exp_addserv').val(),
exporter_v: $('#apacheexpver').val(),
ext_prom: ext_prom,
token: $('#token').val()
},
type: "POST",
success: function( data ) {
data = data.replace(/\s+/g,' ');
$("#ajaxmon").html('');
if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
toastr.error(data);
} else if (data.indexOf('success') != '-1' ){
toastr.clear();
toastr.success(data);
$('#cur_apache_exp_ver').text('Apache exporter is installed');
$("#apache_exp_addserv").trigger( "selectmenuchange" );
} else if (data.indexOf('Info') != '-1' ){
toastr.clear();
toastr.info(data);
} else {
toastr.clear();
toastr.info(data);
}
}
} );
});
$('#node_exp_install').click(function() {
$("#ajaxmon").html('')
$("#ajaxmon").html(wait_mess);
@ -315,7 +353,7 @@ $( function() {
toastr.clear();
toastr.error(data);
} else if(data == 'no' || data == '') {
$('#cur_nginx_exp_ver').text('Nginx exporter has not been installed');
$('#cur_nginx_exp_ver').text('NGINX exporter has not been installed');
} else {
$('#cur_nginx_exp_ver').text(data);
$('#cur_nginx_exp_ver').css('font-weight', 'bold');
@ -323,6 +361,29 @@ $( function() {
}
} );
});
$( "#apache_exp_addserv" ).on('selectmenuchange',function() {
$.ajax( {
url: "options.py",
data: {
get_exporter_v: 'apache_exporter',
serv: $('#apache_exp_addserv option:selected').val(),
token: $('#token').val()
},
type: "POST",
success: function( data ) {
data = data.replace(/^\s+|\s+$/g,'');
if (data.indexOf('error:') != '-1') {
toastr.clear();
toastr.error(data);
} else if(data == 'no' || data == '') {
$('#cur_apache_exp_ver').text('Apache exporter has not been installed');
} else {
$('#cur_apache_exp_ver').text(data);
$('#cur_apache_exp_ver').css('font-weight', 'bold');
}
}
} );
});
$( "#node_exp_addserv" ).on('selectmenuchange',function() {
$.ajax( {
url: "options.py",
@ -1060,6 +1121,7 @@ function addServer(dialog_id) {
$('select:regex(id, backup-server)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
$('select:regex(id, haproxy_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
$('select:regex(id, nginx_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
$('select:regex(id, apache_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
$('select:regex(id, node_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
}
}