Pavel Loginov 2021-04-17 23:38:08 +06:00
parent 08b21981df
commit 5e7115f9d9
17 changed files with 598 additions and 73 deletions

View File

@ -204,6 +204,7 @@ def create_table(**kwargs):
`create_date` DATETIME default '0000-00-00 00:00:00',
`expire_date` DATETIME default '0000-00-00 00:00:00'
);
CREATE TABLE IF NOT EXISTS `slack` (`id` integer primary key autoincrement, `token` VARCHAR (64), `chanel_name` INTEGER NOT NULL DEFAULT 1, `groups` INTEGER NOT NULL DEFAULT 1);
"""
try:
cur.executescript(sql)
@ -1219,6 +1220,29 @@ def update_db_v_5_1_0_1(**kwargs):
con.close()
def update_db_v_5_1_1(**kwargs):
con, cur = get_cur()
sql = """CREATE TABLE IF NOT EXISTS `slack` (
`id` integer primary key autoincrement,
`token` VARCHAR (64),
`chanel_name` INTEGER NOT NULL DEFAULT 1,
`groups` INTEGER NOT NULL DEFAULT 1
);
"""
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: version' or e == "1060 (42S21): Duplicate column name 'version' ":
print('Updating... DB has been updated to version 5.1.1')
else:
print("Updating... DB has been updated to version 5.1.1")
cur.close()
con.close()
def update_ver():
con, cur = get_cur()
sql = """update version set version = '5.1.1.0'; """
@ -1263,6 +1287,7 @@ def update_all():
update_db_v_5_0_1()
update_db_v_5_1_0()
update_db_v_5_1_0_1()
update_db_v_5_1_1()
update_ver()
@ -1298,6 +1323,7 @@ def update_all_silent():
update_db_v_5_1_0_13(silent=1)
update_db_v_5_1_0(silent=1)
update_db_v_5_1_0_1(silent=1)
update_db_v_5_1_1(silent=1)
update_ver()

View File

@ -136,6 +136,8 @@ def telegram_send_mess(mess, **kwargs):
telegrams = sql.get_telegram_by_id(kwargs.get('telegram_channel_id'))
else:
telegrams = sql.get_telegram_by_ip(kwargs.get('ip'))
slack_send_mess(mess, ip=kwargs.get('ip'))
proxy = sql.get_setting('proxy')
for telegram in telegrams:
@ -157,7 +159,36 @@ def telegram_send_mess(mess, **kwargs):
print(str(e))
logging('localhost', str(e), haproxywi=1)
def slack_send_mess(mess, **kwargs):
import sql
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
if kwargs.get('slack_channel_id'):
slacks = sql.get_slack_by_id(kwargs.get('slack_channel_id'))
else:
slacks = sql.get_slack_by_ip(kwargs.get('ip'))
proxy = sql.get_setting('proxy')
for slack in slacks:
slack_token = slack[1]
channel_name = slack[2]
if proxy is not None and proxy != '' and proxy != 'None':
proxies = dict(https=proxy, http=proxy)
client = WebClient(token=slack_token, proxies=proxies)
else:
client = WebClient(token=slack_token)
try:
client.chat_postMessage(channel='#'+channel_name, text=mess)
except SlackApiError as e:
print('error: ' + str(e))
logging('localhost', str(e), haproxywi=1)
def check_login():
import sql
import http.cookies

View File

@ -27,4 +27,5 @@ CREATE TABLE IF NOT EXISTS port_scanner_ports (`serv` varchar(64), user_group_id
CREATE TABLE IF NOT EXISTS port_scanner_history (`serv` varchar(64), port INTEGER NOT NULL, status varchar(64), service_name varchar(64), `date` DATETIME default '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS providers_creds (`id` INTEGER NOT NULL, `name` VARCHAR ( 64 ), `type` VARCHAR ( 64 ), `group` VARCHAR ( 64 ), `key` VARCHAR ( 64 ), `secret` VARCHAR ( 64 ), `create_date` DATETIME default '0000-00-00 00:00:00', `edit_date` DATETIME default '0000-00-00 00:00:00', PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS provisioned_servers (`id` INTEGER NOT NULL, `region` VARCHAR ( 64 ), `instance_type` VARCHAR ( 64 ), `public_ip` INTEGER, `floating_ip` INTEGER, `volume_size` INTEGER, `backup` INTEGER, `monitoring` INTEGER, `private_networking` INTEGER, `ssh_key_name` VARCHAR ( 64 ), `ssh_ids` VARCHAR ( 64 ), `name` VARCHAR ( 64 ), `os` VARCHAR ( 64 ), `firewall` INTEGER, `provider_id` INTEGER, `type` VARCHAR ( 64 ), `status` VARCHAR ( 64 ), `group_id` INTEGER NOT NULL, `date` DATETIME default '0000-00-00 00:00:00', `IP` VARCHAR ( 64 ), `last_error` VARCHAR ( 256 ), `delete_on_termination` INTEGER, PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS api_tokens (`token` varchar(64), `user_name` varchar(64), `user_group_id` INTEGER NOT NULL, `user_role` INTEGER NOT NULL, `create_date` DATETIME default '0000-00-00 00:00:00', `expire_date` DATETIME default '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS api_tokens (`token` varchar(64), `user_name` varchar(64), `user_group_id` INTEGER NOT NULL, `user_role` INTEGER NOT NULL, `create_date` DATETIME default '0000-00-00 00:00:00', `expire_date` DATETIME default '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS `slack` (`id` integer primary key autoincrement, `token` VARCHAR (64), `chanel_name` INTEGER NOT NULL DEFAULT 1, `groups` INTEGER NOT NULL DEFAULT 1);

View File

@ -11,6 +11,7 @@ serv = form.getvalue("serv")
act = form.getvalue("act")
if (form.getvalue('new_metrics') or
form.getvalue('new_http_metrics') or
form.getvalue('new_waf_metrics') or
form.getvalue('metrics_hapwi_ram') or
form.getvalue('metrics_hapwi_cpu')):
@ -458,6 +459,30 @@ if act == "overviewHapserverBackends":
template = template.render(backends=sections, serv=serv, service=service)
print(template)
if form.getvalue('show_userlists'):
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
format_file = 'cfg'
try:
sections = funct.get_userlists(configs_dir + funct.get_files(dir=configs_dir, format=format_file)[0])
except Exception as e:
funct.logging('localhost', str(e), haproxywi=1)
try:
cfg = configs_dir + serv + "-" + funct.get_data('config') + '.' + format_file
except Exception as e:
funct.logging('localhost', ' Cannot generate cfg path ' + str(e), haproxywi=1)
try:
error = funct.get_config(serv, cfg)
except Exception as e:
funct.logging('localhost', ' Cannot download config ' + str(e), haproxywi=1)
try:
sections = funct.get_userlists(cfg)
except Exception as e:
funct.logging('localhost', ' Cannot get Userlists from config file ' + str(e), haproxywi=1)
sections = 'error: Cannot get Userlists'
print(sections)
if act == "overviewHapservers":
if form.getvalue('service') == 'nginx':
config_path = sql.get_setting('nginx_config_path')
@ -881,7 +906,7 @@ if serv is not None and form.getvalue('right') is not None:
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
else:
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
cmd = 'diff -ub %s%s %s%s' % (configs_dir, left, configs_dir, right)
cmd = 'diff -pub %s%s %s%s' % (configs_dir, left, configs_dir, right)
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
template = env.get_template('ajax/compare.html')
@ -1380,6 +1405,40 @@ if form.getvalue('new_metrics'):
print(json.dumps(metrics))
if form.getvalue('new_http_metrics'):
serv = form.getvalue('server')
time_range = form.getvalue('time_range')
metric = sql.select_metrics_http(serv, time_range=time_range)
metrics = {'chartData': {}}
metrics['chartData']['labels'] = {}
labels = ''
http_2xx = ''
http_3xx = ''
http_4xx = ''
http_5xx = ''
server = ''
for i in metric:
label = str(i[5])
label = label.split(' ')[1]
labels += label + ','
http_2xx += str(i[1]) + ','
http_3xx += str(i[2]) + ','
http_4xx += str(i[3]) + ','
http_5xx += str(i[4]) + ','
server = str(i[0])
metrics['chartData']['labels'] = labels
metrics['chartData']['http_2xx'] = http_2xx
metrics['chartData']['http_3xx'] = http_3xx
metrics['chartData']['http_4xx'] = http_4xx
metrics['chartData']['http_5xx'] = http_5xx
metrics['chartData']['server'] = server
import json
print(json.dumps(metrics))
if form.getvalue('new_waf_metrics'):
serv = form.getvalue('server')
time_range = form.getvalue('time_range')
@ -1892,6 +1951,26 @@ if form.getvalue('newtelegram'):
print(output_from_parsed_template)
funct.logging(channel, ' has created a new Telegram channel ', haproxywi=1, login=1)
if form.getvalue('newslack'):
token = form.getvalue('newslack')
channel = form.getvalue('chanel')
group = form.getvalue('slackgroup')
page = form.getvalue('page')
page = page.split("#")[0]
if token is None or channel is None or group is None:
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(),
slacks=sql.select_slack(token=token), page=page)
print(output_from_parsed_template)
funct.logging(channel, ' has created a new Slack channel ', haproxywi=1, login=1)
if form.getvalue('telegramdel') is not None:
telegramdel = form.getvalue('telegramdel')
telegram = sql.select_telegram(id=telegramdel)
@ -1901,6 +1980,15 @@ if form.getvalue('telegramdel') is not None:
print("Ok")
funct.logging(telegram_name, ' has deleted the Telegram channel ', haproxywi=1, login=1)
if form.getvalue('slackdel') is not None:
slackdel = form.getvalue('slackdel')
slack = sql.select_slack(id=slackdel)
for t in slack:
slack_name = t[1]
if sql.delete_slack(slackdel):
print("Ok")
funct.logging(slack_name, ' has deleted the Slack channel ', haproxywi=1, login=1)
if form.getvalue('updatetoken') is not None:
token = form.getvalue('updatetoken')
channel = form.getvalue('updategchanel')
@ -1910,7 +1998,18 @@ if form.getvalue('updatetoken') is not None:
print(error_mess)
else:
sql.update_telegram(token, channel, group, user_id)
funct.logging('group ' + group, ' telegram token has updated channel: ' + channel, haproxywi=1, login=1)
funct.logging('group ' + group, ' Telegram token has updated channel: ' + channel, haproxywi=1, login=1)
if form.getvalue('update_slack_token') is not None:
token = form.getvalue('update_slack_token')
channel = form.getvalue('updategchanel')
group = form.getvalue('updateslackgroup')
user_id = form.getvalue('id')
if token is None or channel is None or group is None:
print(error_mess)
else:
sql.update_slack(token, channel, group, user_id)
funct.logging('group ' + group, ' Slack token has updated channel: ' + channel, haproxywi=1, login=1)
if form.getvalue('updatesettings') is not None:
settings = form.getvalue('updatesettings')
@ -3155,12 +3254,15 @@ if form.getvalue('loadchecker'):
if page == 'servers.py':
user_group = funct.get_user_group(id=1)
telegrams = sql.get_user_telegram_by_group(user_group)
slacks = sql.get_user_slack_by_group(user_group)
else:
telegrams = sql.select_telegram()
slacks = sql.select_slack()
template = template.render(services=services,
telegrams=telegrams,
groups=groups,
slacks=slacks,
page=page)
print(template)
@ -3174,6 +3276,7 @@ if form.getvalue('load_update_hapwi'):
smon_ver = funct.check_new_version(service='smon')
metrics_ver = funct.check_new_version(service='metrics')
keep_ver = funct.check_new_version(service='keep')
portscanner_ver = funct.check_new_version(service='portscanner')
services = funct.get_services_status()
template = template.render(services=services,
@ -3181,6 +3284,7 @@ if form.getvalue('load_update_hapwi'):
checker_ver=checker_ver,
smon_ver=smon_ver,
metrics_ver=metrics_ver,
portscanner_ver=portscanner_ver,
keep_ver=keep_ver)
print(template)
@ -3216,3 +3320,8 @@ if form.getvalue('check_telegram'):
telegram_id = form.getvalue('check_telegram')
mess = 'Test message from HAProxy-WI'
funct.telegram_send_mess(mess, telegram_channel_id=telegram_id)
if form.getvalue('check_slack'):
slack_id = form.getvalue('check_slack')
mess = 'Test message from HAProxy-WI'
funct.slack_send_mess(mess, slack_channel_id=slack_id)

View File

@ -841,6 +841,45 @@ def get_telegram_by_id(id):
con.close()
def get_user_slack_by_group(group):
con, cur = get_cur()
sql = """ select slack.* from slack where groups = '%s' """ % group
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
cur.close()
con.close()
def get_slack_by_ip(ip):
con, cur = get_cur()
sql = """ select slack.* from slack left join servers as serv on serv.groups = slack.groups where serv.ip = '%s' """ % ip
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
cur.close()
con.close()
def get_slack_by_id(id):
con, cur = get_cur()
sql = """ select * from slack where id = '%s' """ % id
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
cur.close()
con.close()
def get_dick_permit(**kwargs):
import http.cookies
import os
@ -1071,21 +1110,6 @@ def check_exists_backup(server):
con.close()
def insert_new_telegram(token, chanel, group):
con, cur = get_cur()
sql = """insert into telegram(`token`, `chanel_name`, `groups`) values ('%s', '%s', '%s') """ % (token, chanel, group)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
con.rollback()
else:
return True
cur.close()
con.close()
def delete_telegram(id):
con, cur = get_cur()
sql = """ delete from telegram where id = %s """ % (id)
@ -1127,7 +1151,7 @@ def insert_new_telegram(token, chanel, group):
cur.execute(sql)
con.commit()
except sqltool.Error as e:
print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
funct.out_error(e)
con.rollback()
else:
return True
@ -1152,6 +1176,72 @@ def update_telegram(token, chanel, group, id):
con.close()
def delete_slack(id):
con, cur = get_cur()
sql = """ delete from slack where id = %s """ % (id)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
else:
return True
cur.close()
con.close()
def select_slack(**kwargs):
con, cur = get_cur()
sql = """select * from slack """
if kwargs.get('group'):
sql = """select * from slack where groups = '%s' """ % kwargs.get('group')
if kwargs.get('token'):
sql = """select * from slack where token = '%s' """ % kwargs.get('token')
if kwargs.get('id'):
sql = """select * from slack where id = '%s' """ % kwargs.get('id')
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
cur.close()
con.close()
def insert_new_slack(token, chanel, group):
con, cur = get_cur()
sql = """insert into slack(`token`, `chanel_name`, `groups`) values ('%s', '%s', '%s') """ % (token, chanel, group)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
else:
return True
cur.close()
con.close()
def update_slack(token, chanel, group, id):
con, cur = get_cur()
sql = """ update slack set
`token` = '%s',
`chanel_name` = '%s',
`groups` = '%s'
where id = '%s' """ % (token, chanel, group, id)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
cur.close()
con.close()
def insert_new_option(option, group):
con, cur = get_cur()
sql = """insert into options(`options`, `groups`) values ('%s', '%s') """ % (option, group)
@ -1293,19 +1383,6 @@ def insert_mentrics(serv, curr_con, cur_ssl_con, sess_rate, max_sess_rate):
con.close()
# def select_waf_metrics_enable(id):
# con, cur = get_cur()
# sql = """ select waf.metrics from waf left join servers as serv on waf.server_id = serv.id where server_id = '%s' """ % id
# try:
# cur.execute(sql)
# except sqltool.Error as e:
# funct.out_error(e)
# else:
# return cur.fetchall()
# cur.close()
# con.close()
def select_waf_metrics_enable_server(ip):
con, cur = get_cur()
sql = """ select waf.metrics from waf left join servers as serv on waf.server_id = serv.id where ip = '%s' """ % ip
@ -1585,6 +1662,7 @@ def delete_mentrics():
con.close()
def select_metrics(serv, **kwargs):
con, cur = get_cur()

View File

@ -1,30 +1,29 @@
</center>
<div class="out">
<div class="diff">
{% set plus = [] %}
{% set minus = [] %}
{% set total_change = 0 %}
{% for line in stdout %}
{% set plus = [] %}
{% set minus = [] %}
{% set total_change = 0 %}
{% for line in stdout -%}
{%- if loop.index0 == 0 -%}
<div class="diffHead">{{ line }}<br />
{%- elif loop.index0 == 1 %}
{{ line }}</div>
{% elif line.startswith('-') and loop.index0 > 1 %}
<div class="lineDiffMinus">{{ line }}</div>
{% do minus.append(1) %}
{% elif line.startswith('+') and loop.index0 > 2 %}
<div class="lineDiffPlus">{{ line }}</div>
{% do plus.append(1) %}
{% elif line.startswith('@') %}
<div class="lineDog">{{ line }}</div>
{% else %}
<div class="lineDiff">{{ line }}</div>
{%- endif %}
{% endfor %}
{% if loop.index0 == 0 %}
<div class="diffHead">{{ line }}<br />
{% elif loop.index0 == 1 %}
{{ line }}</div>
{% elif line.startswith('-') and loop.index0 > 1 %}
<div class="lineDiffMinus">{{ line }}</div>
{% do minus.append(1) %}
{% elif line.startswith('+') and loop.index0 > 2 %}
<div class="lineDiffPlus">{{ line }}</div>
{% do plus.append(1) %}
{% elif line.startswith('@') %}
<div class="lineDog">{{ line }}</div>
{% else %}
<div class="lineDiff">{{ line }}</div>
{% endif %}
{% endfor %}
{% set total_change = minus + plus %}
<div class="diffHead">Total change: {{ total_change|length }}, additions: {{ plus|length }} & deletions: {{ minus|length }} </div>
{% set total_change = minus + plus %}
<div class="diffHead">
Total change: {{ total_change|length }}, additions: {{ plus|length }} & deletions: {{ minus|length }}
</div>
</div>
</div>

View File

@ -3,6 +3,7 @@
{% if s.0 == 'checker_haproxy' %}
{% if s.3 != '* is not installed' and s.3 != '' %}
<table id="checker_table" class="overview">
<caption><h3>Add Telegram channel</h3></caption>
<tr class="overviewHead" style="width: 50%;">
<td class="padding10 first-collumn" style="width: 25%;">
<span title="Token that has given @father_bot">Token</span>
@ -53,10 +54,63 @@
</table>
<br /><span class="add-button" title="Add telegram channel" id="add-telegram-button">+ Add</span>
<br /><br />
<table id="checker_slack_table" class="overview">
<caption><h3>Add Slack channel</h3></caption>
<tr class="overviewHead" style="width: 50%;">
<td class="padding10 first-collumn" style="width: 25%;">
<span title="Token that has given with APP registration">Token</span>
</td>
<td style="width: 20%;">Channel name</td>
{% if page != "servers.py" %}
<td style="width: 25%;">Group</td>
{% endif %}
<td style="width: 100%;"></td>
<td></td>
<td></td>
</tr>
{% for slack in slacks %}
<tr id="slack-table-{{slack.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn">
{% set id = 'slack-token-' + slack.0|string() %}
{{ input(id, value=slack.1, size='30') }}
</td>
<td>
{% set id = 'slack-chanel-' + slack.0|string() %}
{{ input(id, value=slack.2, size='30') }}
</td>
{% if page != "servers.py" %}
<td>
<select id="slackgroup-{{slack.0}}" name="slackgroup-{{slack.0}}">
<option disabled selected>Choose group</option>
{% for group in groups %}
{% if slack.3|string() == group.0|string() %}
<option value="{{ group.0 }}" selected>{{ group.1 }}</option>
{% else %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endif %}
{% endfor %}
</select>
</td>
{% endif %}
<td>
<button title="Send test message" onclick="checkSlack({{slack.0}})">Test</button>
</td>
<td>
<a class="add" onclick="cloneSlack({{slack.0}})" id="clone-{{slack.0}}" title="Clone {{slack.2}}" style="cursor: pointer;"></a>
</td>
<td>
<a class="delete" onclick="confirmDeleteSlack({{slack.0}})" title="Delete channel {{slack.2}}" style="cursor: pointer;"></a>
</td>
</tr>
{% endfor %}
</table>
<br /><span class="add-button" title="Add Slack channel" id="add-slack-button">+ Add</span>
<br /><br />
<div id="ajax-telegram"></div>
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
You can read the description of all parameters <a href="https://haproxy-wi.org/description.py?description=checker" title="Servers description" target="_blank">here</a>
and How to create and use Telegram bot in this <a href="https://haproxy-wi.org/howto.py?howto=checker" title="How to create Telegram bot and use it with HAProxy-WI" target="_blank">article</a>
You can read the description of all parameters <a href="https://haproxy-wi.org/description.py?description=checker" title="Servers description" target="_blank">here</a>,
How to create and use Telegram bot in this <a href="https://haproxy-wi.org/howto.py?howto=checker" title="How to create Telegram bot and use it with HAProxy-WI" target="_blank">article</a>,
How to create and use Slack APP in this <a href="https://haproxy-wi.org/howto.py?howto=slack" title="How to create Slack APP and use it with HAProxy-WI" target="_blank">article</a>
</div>
{% else %}
<center>

View File

@ -0,0 +1,33 @@
{% for slack in slacks %}
<tr style="width: 50%;" id="slack-table-{{slack.0}}" class="newgroup">
<td class="padding10 first-collumn">
<input type="text" id="slack-token-{{slack.0}}" class="form-control" value="{{slack.1}}">
<input type="hidden" id="slackgroup-{{slack.0}}" name="slackgroup-{{slack.0}}">
</td>
<td>
<input type="text" id="slack-chanel-{{slack.0}}" class="form-control" value="{{slack.2}}">
</td>
{% if page != "servers.py" %}
<td>
<select id="slackgroup-{{slack.0}}" name="slackgroup-{{slack.0}}">
{% for group in groups %}
{% if slack.3 == group.0 %}
<option value="{{ group.0 }}" selected>{{ group.1 }}</option>
{% else %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endif %}
{% endfor %}
</select>
</td>
{% endif %}
<td>
<button title="Send test message" onclick="checkSlack({{slack.0}})">Test</button>
</td>
<td>
<a class="add" onclick="cloneSlack({{slack.0}})" id="clone-{{slack.0}}" title="Clone {{slack.2}}" style="cursor: pointer;"></a>
</td>
<td>
<a class="delete" onclick="confirmDeleteSlack({{slack.0}})" style="cursor: pointer;"></a>
</td>
</tr>
{% endfor %}

View File

@ -20,6 +20,9 @@
</select>
</td>
{% endif %}
<td>
<button title="Send test message" onclick="checkTelegram({{telegram.0}})">Test</button>
</td>
<td>
<a class="add" onclick="cloneTelegram({{telegram.0}})" id="clone-{{telegram.0}}" title="Clone {{telegram.2}}" style="cursor: pointer;"></a>
</td>

View File

@ -1,13 +1,10 @@
{% from 'include/input_macros.html' import input %}
<form action="diff.py#diff" method="post">
<center>
<h4>
<span style="padding: 20px;">Choose left</span>
<span style="padding: 110px;">Choose right</span>
</h4>
<form action="" method="post">
<div style="text-align: center;margin-top: 20px;">
<h4>Comparing config files</h4>
<p>
<select autofocus required name="left" id="left">
<option disabled selected>Choose version</option>
<option disabled selected>Select an older</option>
{% for file in return_files %}
{% if file == left %}
<option value="{{ file }}" selected>{{ file.split('-', maxsplit=1)[1] }}</option>
@ -18,7 +15,7 @@
</select>
<select autofocus required name="right" id="right">
<option disabled selected>Choose version</option>
<option disabled selected>Select a newer</option>
{% for file in return_files %}
<option value="{{ file }}">{{ file.split('-', maxsplit=1)[1] }}</option>
{% endfor %}
@ -27,5 +24,5 @@
{{ input('open', type='hidden', value='open') }}
<a class="ui-button ui-widget ui-corner-all" id="show" title="Compare" onclick="showCompare()">Show</a>
</p>
</center>
</div>
</form>

View File

@ -34,7 +34,7 @@
<tr id="server-{{server.0}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newserver{% endif %}">
<td class="padding10 first-collumn">
{% set id = 'hostname-' + server.0|string() %}
{{ input(id, value=server.1, size='10') }}
{{ input(id, value=server.1, size='15') }}
</td>
<td>
<span id="ip-{{server.0}}" style="margin-right: 6px;">{{server.2}}</span>

View File

@ -189,6 +189,42 @@
{% endif %}
</table>
</div>
<div id="slack-add-table" style="display: none;">
<table>
{% include 'include/tr_validate_tips.html' %}
<tr>
<td class="padding20">
<span title="Token that has given with APP registration">Token</span>
<span class="need-field">*</span>
</td>
<td>
{{ input('slack-token-add', size='30') }}
</td>
</tr>
<tr>
<td class="padding20">
Channel name
<span class="need-field">*</span>
</td>
<td>
{{ input('slack-chanel-add') }}
</td>
</tr>
{% if page != "servers.py" %}
<tr>
<td class="padding20">Group</td>
<td>
<select id="new-slack-group-add" name="new-slack-group-add">
<option disabled selected value="0">Choose group</option>
{% for group in groups %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endfor %}
</select>
</td>
</tr>
{% endif %}
</table>
</div>
<div id="backup-add-table" title="Add a new backup job " style="display: none;">
<table class="overview">
{% include 'include/tr_validate_tips.html' %}

View File

@ -2,4 +2,5 @@ pyTelegramBotAPI==3.6.3
networkx==2.1
matplotlib==2.1.2
mysql-connector-python==8.0.11
paramiko-ng>=2.5.0
paramiko-ng>=2.5.0
slack-sdk>=3.4.0

View File

@ -4,3 +4,4 @@ networkx==2.1
matplotlib==2.1.2
mysql-connector-python==8.0.11
paramiko-ng>=2.5.0
slack-sdk>=3.4.0

View File

@ -255,9 +255,11 @@ pre {
.lineDog {
background-color: #dbedff;
margin-bottom: 10px;
padding: 7px;
}
.lineDiffMinus, .lineDiffPlus, .lineDog, .lineDiff {
.lineDiffMinus, .lineDiffPlus, .lineDiff {
padding-left: 15px;
white-space: pre;
}
.lineDiffMinus {
background-color: #ffdce0;

View File

@ -428,6 +428,9 @@ $( function() {
$('#add-telegram-button').click(function() {
addTelegramDialog.dialog('open');
});
$('#add-slack-button').click(function() {
addSlackDialog.dialog('open');
});
var addTelegramDialog = $( "#telegram-add-table" ).dialog({
autoOpen: false,
resizable: false,
@ -453,6 +456,31 @@ $( function() {
}
}
});
var addSlackDialog = $( "#slack-add-table" ).dialog({
autoOpen: false,
resizable: false,
height: "auto",
width: 600,
modal: true,
title: "Create a new Slack channel",
show: {
effect: "fade",
duration: 200
},
hide: {
effect: "fade",
duration: 200
},
buttons: {
"Add": function () {
addSlack(this);
},
Cancel: function () {
$(this).dialog("close");
clearTips();
}
}
});
$('#add-backup-button').click(function() {
addBackupDialog.dialog('open');
});
@ -572,6 +600,14 @@ $( function() {
var id = $(this).attr('id').split('-');
updateTelegram(id[1])
});
$( "#checker_slack_table input" ).change(function() {
var id = $(this).attr('id').split('-');
updateSlack(id[2])
});
$( "#checker_slack_table select" ).on('selectmenuchange',function() {
var id = $(this).attr('id').split('-');
updateSlack(id[1])
});
$( "#ajax-backup-table input" ).change(function() {
var id = $(this).attr('id').split('-');
updateBackup(id[2])
@ -1014,6 +1050,38 @@ function addTelegram(dialog_id) {
} );
}
}
function addSlack(dialog_id) {
var valid = true;
toastr.clear();
allFields = $( [] ).add( $('#slack-token-add') ).add( $('#slack-chanel-add') )
allFields.removeClass( "ui-state-error" );
valid = valid && checkLength( $('#slack-token-add'), "token", 1 );
valid = valid && checkLength( $('#slack-chanel-add'), "channel name", 1 );
if(valid) {
toastr.clear();
$.ajax( {
url: "options.py",
data: {
newslack: $('#slack-token-add').val(),
chanel: $('#slack-chanel-add').val(),
slackgroup: $('#new-slack-group-add').val(),
page: cur_url[0].split('#')[0],
token: $('#token').val()
},
type: "POST",
success: function( data ) {
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else {
common_ajax_action_after_success(dialog_id, 'newgroup', 'checker_slack_table', data);
$( "input[type=submit], button" ).button();
$( "input[type=checkbox]" ).checkboxradio();
$( "select" ).selectmenu();
}
}
} );
}
}
function addBackup(dialog_id) {
var valid = true;
toastr.clear();
@ -1186,6 +1254,24 @@ function confirmDeleteTelegram(id) {
}
});
}
function confirmDeleteSlack(id) {
$( "#dialog-confirm" ).dialog({
resizable: false,
height: "auto",
width: 400,
modal: true,
title: "Are you sure you want to delete " +$('#slack-chanel-'+id).val() + "?",
buttons: {
"Delete": function() {
$( this ).dialog( "close" );
removeSlack(id);
},
Cancel: function() {
$( this ).dialog( "close" );
}
}
});
}
function confirmDeleteBackup(id) {
$( "#dialog-confirm" ).dialog({
resizable: false,
@ -1283,6 +1369,11 @@ function cloneTelegram(id) {
$('#telegram-token-add').val($('#telegram-token-'+id).val())
$('#telegram-chanel-add').val($('#telegram-chanel-'+id).val())
}
function cloneSlack(id) {
$( "#slack" ).trigger( "click" );
$('#slack').val($('#slack-token-'+id).val())
$('#slack').val($('#slack-chanel-'+id).val())
}
function cloneBackup(id) {
$( "#add-backup-button" ).trigger( "click" );
$('#rserver').val($('#backup-rserver-'+id).val())
@ -1396,6 +1487,25 @@ function removeTelegram(id) {
}
} );
}
function removeSlack(id) {
$("#slack-table-"+id).css("background-color", "#f2dede");
$.ajax( {
url: "options.py",
data: {
slackdel: id,
token: $('#token').val()
},
type: "POST",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if(data == "Ok ") {
$("#slack-table-"+id).remove();
} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
toastr.error(data);
}
}
} );
}
function removeBackup(id) {
$("#backup-table-"+id).css("background-color", "#f2dede");
$.ajax( {
@ -1650,6 +1760,32 @@ function updateTelegram(id) {
}
} );
}
function updateSlack(id) {
toastr.clear();
$.ajax( {
url: "options.py",
data: {
update_slack_token: $('#slack-token-'+id).val(),
updategchanel: $('#slack-chanel-'+id).val(),
updateslackgroup: $('#slackgroup-'+id).val(),
id: id,
token: $('#token').val()
},
type: "POST",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
toastr.error(data);
} else {
toastr.clear();
$("#slack-table-"+id).addClass( "update", 1000 );
setTimeout(function() {
$( "#slack-table-"+id ).removeClass( "update" );
}, 2500 );
}
}
} );
}
function updateBackup(id) {
toastr.clear();
if ($( "#backup-type-"+id+" option:selected" ).val() == "Choose server" || $('#backup-rserver-'+id).val() == '' || $('#backup-rpath-'+id).val() == '') {
@ -2251,4 +2387,21 @@ function checkTelegram(telegram_id) {
}
} );
}
function checkSlack(slack_id) {
$.ajax({
url: "options.py",
data: {
check_slack: slack_id,
token: $('#token').val()
},
type: "POST",
success: function (data) {
data = data.replace(/\s+/g, ' ');
if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
toastr.error(data);
} else {
toastr.success('Test message has been sent');
}
}
} );
}

View File

@ -8,3 +8,4 @@ matplotlib>=2.1.2
future>=0.13.1
mysql-connector-python>=8.0.11
jinja2>=2.10.1
slack-sdk>=3.4.0