Pavel Loginov 2021-02-15 12:10:00 +06:00
parent 1e14b128a5
commit 6732903e5a
24 changed files with 3586 additions and 156 deletions

View File

@ -97,6 +97,7 @@ def create_table(**kwargs):
port INTEGER NOT NULL DEFAULT 22,
`desc` varchar(64),
active INTEGER NOT NULL DEFAULT 0,
keepalived INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
);
CREATE TABLE IF NOT EXISTS `role` (
@ -105,10 +106,10 @@ def create_table(**kwargs):
`description` VARCHAR ( 255 ),
PRIMARY KEY(`id`)
);
INSERT INTO `role` (name, description) VALUES ('admin','Can do everything'),
INSERT INTO `role` (name, description) VALUES
('admin','Can do everything'),
('editor','Can edit configs'),
('guest','Read only access');
('guest','Read only access');
CREATE TABLE IF NOT EXISTS `groups` (
`id` INTEGER NOT NULL,
`name` VARCHAR ( 80 ),
@ -136,7 +137,41 @@ def create_table(**kwargs):
CREATE TABLE IF NOT EXISTS `backups` (`id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `rhost` VARCHAR ( 120 ), `rpath` VARCHAR ( 120 ), `type` VARCHAR ( 120 ), `time` VARCHAR ( 120 ), cred INTEGER, `description` VARCHAR ( 120 ), PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS `waf` (`server_id` INTEGER UNIQUE, metrics INTEGER);
CREATE TABLE IF NOT EXISTS `waf_metrics` (`serv` varchar(64), conn INTEGER, `date` DATETIME default '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS user_groups(user_id INTEGER NOT NULL, user_group_id INTEGER NOT NULL, UNIQUE(user_id,user_group_id));
CREATE TABLE IF NOT EXISTS user_groups(user_id INTEGER NOT NULL, user_group_id INTEGER NOT NULL, UNIQUE(user_id,user_group_id));
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 ),
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`)
);
"""
try:
cur.executescript(sql)
@ -150,7 +185,7 @@ def create_table(**kwargs):
else:
return True
else:
try:
try:
for line in open("haproxy-wi.db.sql"):
cur.execute(line)
except sqltool.Error as e:
@ -162,8 +197,8 @@ def create_table(**kwargs):
return True
cur.close()
con.close()
def update_db_v_31(**kwargs):
con, cur = get_cur()
sql = list()
@ -174,6 +209,7 @@ def update_db_v_31(**kwargs):
sql.append("INSERT INTO settings (param, value, section, `desc`) values('token_ttl', '5', 'main', 'Time to live users tokens. In days');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('tmp_config_path', '/tmp/', 'main', 'Temp store configs, for check. Path must exist');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('cert_path', '/etc/ssl/certs/', 'main', 'Path to SSL dir. Folder owner must be a user which set in the SSH settings. Path must exist');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ssl_local_path', 'certs', 'main', 'Path to dir for local save SSL certs. This is a relative path, begins with $HOME_HAPROXY-WI/app/');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('lists_path', 'lists', 'main', 'Path to black/white lists. This is a relative path, begins with $HOME_HAPROXY-WI');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('local_path_logs', '/var/log/haproxy.log', 'logs', 'Logs save locally, enabled by default');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('syslog_server_enable', '0', 'logs', 'If exist syslog server for HAproxy logs, enable this option');")
@ -197,7 +233,7 @@ def update_db_v_31(**kwargs):
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_base', '', 'ldap', 'Base domain. Example: dc=domain, dc=com');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_domain', '', 'ldap', 'Domain for login, that after @, like user@domain.com, without user@');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_class_search', 'user', 'ldap', 'Class to search user');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_user_attribute', 'sAMAccountName', 'ldap', 'User\'s attribute for search');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_user_attribute', 'sAMAccountName', 'ldap', 'User attribute for searching');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_search_field', 'mail', 'ldap', 'Field where user e-mail saved');")
for i in sql:
@ -212,12 +248,12 @@ def update_db_v_31(**kwargs):
return True
cur.close()
con.close()
def update_db_v_3_4_5_2(**kwargs):
con, cur = get_cur()
sql = """CREATE TABLE IF NOT EXISTS `version` (`version` varchar(64)); """
try:
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
@ -231,8 +267,8 @@ def update_db_v_3_4_5_2(**kwargs):
return True
cur.close()
con.close()
def update_db_v_3_4_5_22(**kwargs):
con, cur = get_cur()
if mysql_enable == '0':
@ -246,125 +282,8 @@ def update_db_v_3_4_5_22(**kwargs):
print('Cannot insert version %s' % e)
cur.close()
con.close()
def update_db_v_3_4_7(**kwargs):
con, cur = get_cur()
sql = """CREATE TABLE IF NOT EXISTS `options` ( `id` INTEGER NOT NULL, `options` VARCHAR ( 64 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`)); """
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: id' or e == "1060 (42S21): Duplicate column name 'id' ":
print('Updating... go to version 2.6')
else:
print("DB was update to 3.4.7")
return False
else:
return True
cur.close()
con.close()
def update_db_v_3_5_3(**kwargs):
con, cur = get_cur()
sql = """CREATE TABLE IF NOT EXISTS `saved_servers` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `description` VARCHAR ( 120 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`)); """
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: id' or e == "1060 (42S21): Duplicate column name 'id' ":
print('DB was update to 3.5.3')
else:
print("DB was update to 3.5.3")
return False
else:
return True
cur.close()
con.close()
def update_db_v_3_8_1(**kwargs):
con, cur = get_cur()
sql = list()
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_class_search', 'user', 'ldap', 'Class to search user');")
sql.append("INSERT INTO settings (param, value, section, `desc`) values('ldap_user_attribute', 'sAMAccountName', 'ldap', 'User attribute for search');")
for i in sql:
try:
cur.execute(i)
con.commit()
except sqltool.Error:
pass
else:
if kwargs.get('silent') != 1:
print('Updating... go to version 3.12.0.0')
cur.close()
con.close()
def update_db_v_3_12(**kwargs):
con, cur = get_cur()
sql = """CREATE TABLE IF NOT EXISTS `backups` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `rhost` VARCHAR ( 120 ), `rpath` VARCHAR ( 120 ), `type` VARCHAR ( 120 ), `time` VARCHAR ( 120 ), cred INTEGER, `description` VARCHAR ( 120 ), PRIMARY KEY(`id`)); """
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: id' or e == "1060 (42S21): Duplicate column name 'id' ":
print('Updating... go to version 3.12.1.0')
else:
print("Updating... go to version 3.12.1.0")
return False
else:
return True
cur.close()
con.close()
def update_db_v_3_12_1(**kwargs):
con, cur = get_cur()
sql = """INSERT INTO settings (param, value, section, `desc`) values('ssl_local_path', 'certs', 'main', 'Path to dir for local save SSL certs. This is a relative path, begins with $HOME_HAPROXY-WI/app/'); """
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: param' or e == "1060 (42S21): Duplicate column name 'param' ":
print('Updating... go to version 3.12.1.0')
else:
print("Updating... go to version 3.12.1.0")
return False
else:
return True
cur.close()
con.close()
def update_db_v_3_13(**kwargs):
con, cur = get_cur()
sql = """
ALTER TABLE `servers` ADD COLUMN keepalived INTEGER NOT NULL DEFAULT 0;
"""
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: keepalived' or e == " 1060 (42S21): Duplicate column name 'keepalived' ":
print('Updating... go to version 4.0.0')
else:
print("An error occurred:", e)
else:
print("Updating... go to version 4.0.0")
cur.close()
con.close()
def update_db_v_4(**kwargs):
con, cur = get_cur()
sql = list()
@ -389,14 +308,14 @@ def update_db_v_4(**kwargs):
cur.close()
con.close()
def update_db_v_41(**kwargs):
con, cur = get_cur()
sql = """
ALTER TABLE `servers` ADD COLUMN nginx INTEGER NOT NULL DEFAULT 0;
"""
try:
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
@ -410,7 +329,7 @@ def update_db_v_41(**kwargs):
cur.close()
con.close()
def update_db_v_42(**kwargs):
con, cur = get_cur()
@ -1064,30 +983,89 @@ def update_db_v_4_5_9(**kwargs):
con.close()
def update_db_v_5(**kwargs):
con, cur = get_cur()
sql = """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 ),
PRIMARY KEY(`id`)
);
"""
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.0.0')
else:
print("Updating... DB has been updated to version 5.0.0")
cur.close()
con.close()
def update_db_v_51(**kwargs):
con, cur = get_cur()
sql = """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`)
); """
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.0.0')
else:
print("Updating... DB has been updated to version 5.0.0")
cur.close()
con.close()
def update_ver():
con, cur = get_cur()
sql = """update version set version = '4.5.9.0'; """
try:
sql = """update version set version = '5.0.0.0'; """
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
print('Cannot update version')
cur.close()
con.close()
def update_all():
update_db_v_31()
update_db_v_3_4_5_2()
if funct.check_ver() is None:
update_db_v_3_4_5_22()
update_db_v_3_4_7()
update_db_v_3_5_3()
update_db_v_3_8_1()
update_db_v_3_12()
update_db_v_3_12_1()
update_db_v_3_13()
update_db_v_4()
update_db_v_41()
update_db_v_42()
@ -1107,20 +1085,16 @@ def update_all():
update_db_v_4_5_8_1()
update_db_v_4_5_8_2()
update_db_v_4_5_9()
update_db_v_5()
update_db_v_51()
update_ver()
def update_all_silent():
update_db_v_31(silent=1)
update_db_v_3_4_5_2(silent=1)
if funct.check_ver() is None:
update_db_v_3_4_5_22()
update_db_v_3_4_7(silent=1)
update_db_v_3_5_3(silent=1)
update_db_v_3_8_1(silent=1)
update_db_v_3_12(silent=1)
update_db_v_3_12_1(silent=1)
update_db_v_3_13(silent=1)
update_db_v_4(silent=1)
update_db_v_41(silent=1)
update_db_v_42(silent=1)
@ -1140,9 +1114,11 @@ def update_all_silent():
update_db_v_4_5_8_1(silent=1)
update_db_v_4_5_8_2(silent=1)
update_db_v_4_5_9(silent=1)
update_db_v_5(silent=1)
update_db_v_51(silent=1)
update_ver()
if __name__ == "__main__":
create_table()
update_all()

View File

@ -98,6 +98,9 @@ def logging(serv, action, **kwargs):
elif kwargs.get('keep_alive') == 1:
mess = get_data('date_in_log') + action + "\n"
log = open(log_path + "/keep_alive-"+get_data('logs')+".log", "a")
elif kwargs.get('port_scanner') == 1:
mess = get_data('date_in_log') + action + "\n"
log = open(log_path + "/port_scanner-"+get_data('logs')+".log", "a")
elif kwargs.get('haproxywi') == 1:
if kwargs.get('login'):
mess = get_data('date_in_log') + " from " + ip + " user: " + login + ", group: " + user_group + ", " + \
@ -105,6 +108,10 @@ def logging(serv, action, **kwargs):
else:
mess = get_data('date_in_log') + " " + action + " from " + ip + "\n"
log = open(log_path + "/haproxy-wi-"+get_data('logs')+".log", "a")
elif kwargs.get('provisioning') == 1:
mess = get_data('date_in_log') + " from " + ip + " user: " + login + ", group: " + user_group + ", " + \
action + "\n"
log = open(log_path + "/provisioning-"+get_data('logs')+".log", "a")
else:
mess = get_data('date_in_log') + " from " + ip + " user: " + login + ", group: " + user_group + ", " + \
action + " for: " + serv + "\n"

View File

@ -2303,3 +2303,472 @@ if form.getvalue('show_versions'):
if form.getvalue('get_group_name_by_id'):
print(sql.get_group_name_by_id(form.getvalue('get_group_name_by_id')))
if form.getvalue('do_new_name') or form.getvalue('aws_new_name'):
funct.check_user_group()
is_add = False
if form.getvalue('do_new_name'):
provider_name = form.getvalue('do_new_name')
provider_group = form.getvalue('do_new_group')
provider_token = form.getvalue('do_new_token')
if sql.add_provider_do(provider_name, provider_group, provider_token):
is_add = True
elif form.getvalue('aws_new_name'):
provider_name = form.getvalue('aws_new_name')
provider_group = form.getvalue('aws_new_group')
provider_token = form.getvalue('aws_new_key')
provider_secret = form.getvalue('aws_new_secret')
if sql.add_provider_aws(provider_name, provider_group, provider_token, provider_secret):
is_add = True
if is_add:
from jinja2 import Environment, FileSystemLoader
import http.cookies
import os
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_uuid = cookie.get('uuid')
role_id = sql.get_user_role_by_uuid(user_uuid.value)
if role_id == 1:
groups = sql.select_groups()
else:
groups = ''
env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
template = env.get_template('ajax/provisioning/providers.html')
template = template.render(providers=sql.select_providers(provider_group, key=provider_token), role=role_id, groups=groups, user_group=provider_group, adding=1)
print(template)
if form.getvalue('providerdel'):
funct.check_user_group()
if sql.delete_provider(form.getvalue('providerdel')):
print('Ok')
funct.logging('localhost', 'Provider has been deleted', provisioning=1)
if form.getvalue('awsinit') or form.getvalue('doinit'):
funct.check_user_group()
cmd = 'cd scripts/terraform/ && sudo terraform init -upgrade'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
print('error: '+stderr)
else:
if "Terraform initialized in an empty directory" in output[0]:
print('error: There is not need modules')
elif "mkdir .terraform: permission denied" in output[0]:
print('error: Cannot init. Check permission to folder')
print(output[0])
if form.getvalue('awsvars') or form.getvalue('awseditvars'):
if form.getvalue('awsvars'):
awsvars = form.getvalue('awsvars')
group = form.getvalue('aws_create_group')
provider = form.getvalue('aws_create_provider')
region = form.getvalue('aws_create_regions')
size = form.getvalue('aws_create_size')
oss = form.getvalue('aws_create_oss')
ssh_name = form.getvalue('aws_create_ssh_name')
volume_size = form.getvalue('aws_create_volume_size')
delete_on_termination = form.getvalue('aws_create_delete_on_termination')
floating_ip = form.getvalue('aws_create_floating_net')
firewall = form.getvalue('aws_create_firewall')
public_ip = form.getvalue('aws_create_public_ip')
elif form.getvalue('awseditvars'):
awsvars = form.getvalue('awseditvars')
group = form.getvalue('aws_editing_group')
provider = form.getvalue('aws_editing_provider')
region = form.getvalue('aws_editing_regions')
size = form.getvalue('aws_editing_size')
oss = form.getvalue('aws_editing_oss')
ssh_name = form.getvalue('aws_editing_ssh_name')
volume_size = form.getvalue('aws_editing_volume_size')
delete_on_termination = form.getvalue('aws_editing_delete_on_termination')
floating_ip = form.getvalue('aws_editing_floating_net')
firewall = form.getvalue('aws_editing_firewall')
public_ip = form.getvalue('aws_editing_public_ip')
aws_key, aws_secret = sql.select_aws_provider(provider)
cmd = 'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={} ' \
'group={} size={} os={} floating_ip={} volume_size={} server_name={} AWS_ACCESS_KEY={} ' \
'AWS_SECRET_KEY={} firewall={} public_ip={} ssh_name={} delete_on_termination={} ' \
'cloud=aws"'.format(region, group, size, oss, floating_ip, volume_size, awsvars, aws_key, aws_secret,
firewall, public_ip, ssh_name, delete_on_termination)
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
print('error: ' + stderr)
else:
print('ok')
if form.getvalue('dovars') or form.getvalue('doeditvars'):
if form.getvalue('dovars'):
dovars = form.getvalue('dovars')
group = form.getvalue('do_create_group')
provider = form.getvalue('do_create_provider')
region = form.getvalue('do_create_regions')
size = form.getvalue('do_create_size')
oss = form.getvalue('do_create_oss')
ssh_name = form.getvalue('do_create_ssh_name')
ssh_ids = form.getvalue('do_create_ssh_ids')
backup = form.getvalue('do_create_backup')
privet_net = form.getvalue('do_create_private_net')
floating_ip = form.getvalue('do_create_floating_net')
monitoring = form.getvalue('do_create_monitoring')
firewall = form.getvalue('do_create_firewall')
elif form.getvalue('doeditvars'):
dovars = form.getvalue('doeditvars')
group = form.getvalue('do_edit_group')
provider = form.getvalue('do_edit_provider')
region = form.getvalue('do_edit_regions')
size = form.getvalue('do_edit_size')
oss = form.getvalue('do_edit_oss')
ssh_name = form.getvalue('do_edit_ssh_name')
ssh_ids = form.getvalue('do_edit_ssh_ids')
backup = form.getvalue('do_edit_backup')
privet_net = form.getvalue('do_edit_private_net')
floating_ip = form.getvalue('do_edit_floating_net')
monitoring = form.getvalue('do_edit_monitoring')
firewall = form.getvalue('do_edit_firewall')
token = sql.select_do_provider(provider)
cmd = 'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={} ' \
'group={} size={} os={} floating_ip={} ssh_ids={} server_name={} token={} backup={} monitoring={} ' \
'privet_net={} firewall={} floating_ip={} ssh_name={} cloud=do"'.format(region, group, size, oss, floating_ip,
ssh_ids, dovars, token, backup, monitoring,
privet_net, firewall, floating_ip, ssh_name)
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
print('error: ' + stderr)
else:
print(cmd)
print(output)
if form.getvalue('dovalidate') or form.getvalue('doeditvalidate'):
if form.getvalue('dovalidate'):
workspace = form.getvalue('dovalidate')
group = form.getvalue('do_create_group')
elif form.getvalue('doeditvalidate'):
workspace = form.getvalue('doeditvalidate')
group = form.getvalue('do_edit_group')
cmd = 'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.do_module -var-file vars/' + workspace + '_'+group+'_do.tfvars'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
print('error: ' + stderr)
else:
print('ok')
if form.getvalue('doworkspace'):
workspace = form.getvalue('doworkspace')
group = form.getvalue('do_create_group')
provider = form.getvalue('do_create_provider')
region = form.getvalue('do_create_regions')
size = form.getvalue('do_create_size')
oss = form.getvalue('do_create_oss')
ssh_name = form.getvalue('do_create_ssh_name')
ssh_ids = form.getvalue('do_create_ssh_ids')
backup = form.getvalue('do_create_backup')
privet_net = form.getvalue('do_create_private_net')
floating_ip = form.getvalue('do_create_floating_net')
monitoring = form.getvalue('do_create_monitoring')
firewall = form.getvalue('do_create_firewall')
cmd = 'cd scripts/terraform/ && sudo terraform workspace new ' + workspace + '_' + group + '_do'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
stderr = stderr.strip()
stderr = repr(stderr)
stderr = stderr.replace("'", "")
stderr = stderr.replace("\'", "")
sql.update_provisioning_server_status('Error', group, workspace, provider)
sql.update_provisioning_server_error(stderr, group, workspace, provider)
print('error: ' + stderr)
else:
if sql.add_server_do(region, size, privet_net, floating_ip, ssh_ids, ssh_name, workspace, oss, firewall, monitoring,
backup, provider, group, 'Creating'):
from jinja2 import Environment, FileSystemLoader
user, user_id, role, token, servers = funct.get_users_params()
new_server = sql.select_provisioned_servers(new=workspace, group=group, type='do')
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('ajax/provisioning/provisioned_servers.html')
template = template.render(servers=new_server,
groups=sql.select_groups(),
user_group=group,
providers=sql.select_providers(group),
role=role,
adding=1)
print(template)
if form.getvalue('doeditworkspace'):
workspace = form.getvalue('doeditworkspace')
group = form.getvalue('do_edit_group')
provider = form.getvalue('do_edit_provider')
region = form.getvalue('do_edit_regions')
size = form.getvalue('do_edit_size')
oss = form.getvalue('do_edit_oss')
ssh_name = form.getvalue('do_edit_ssh_name')
ssh_ids = form.getvalue('do_edit_ssh_ids')
backup = form.getvalue('do_edit_backup')
privet_net = form.getvalue('do_edit_private_net')
floating_ip = form.getvalue('do_edit_floating_net')
monitoring = form.getvalue('do_edit_monitoring')
firewall = form.getvalue('do_edit_firewall')
server_id = form.getvalue('server_id')
if sql.update_server_do(size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider,
group, 'Creating', server_id):
cmd = 'cd scripts/terraform/ && sudo terraform workspace select ' + workspace + '_' + group + '_do'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
stderr = stderr.strip()
stderr = repr(stderr)
stderr = stderr.replace("'", "")
stderr = stderr.replace("\'", "")
sql.update_provisioning_server_status('Error', group, workspace, provider)
sql.update_provisioning_server_error(stderr, group, workspace, provider)
print('error: ' + stderr)
else:
print(cmd)
print(output)
if form.getvalue('awsvalidate') or form.getvalue('awseditvalidate'):
if form.getvalue('awsvalidate'):
workspace = form.getvalue('awsvalidate')
group = form.getvalue('aws_create_group')
elif form.getvalue('awseditvalidate'):
workspace = form.getvalue('awseditvalidate')
group = form.getvalue('aws_edit_group')
cmd = 'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.aws_module -var-file vars/' + workspace + '_'+group+'_aws.tfvars'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
print('error: ' + stderr)
else:
print('ok')
if form.getvalue('awsworkspace'):
workspace = form.getvalue('awsworkspace')
group = form.getvalue('aws_create_group')
provider = form.getvalue('aws_create_provider')
region = form.getvalue('aws_create_regions')
size = form.getvalue('aws_create_size')
oss = form.getvalue('aws_create_oss')
ssh_name = form.getvalue('aws_create_ssh_name')
volume_size = form.getvalue('aws_create_volume_size')
delete_on_termination = form.getvalue('aws_create_delete_on_termination')
floating_ip = form.getvalue('aws_create_floating_net')
firewall = form.getvalue('aws_create_firewall')
public_ip = form.getvalue('aws_create_public_ip')
cmd = 'cd scripts/terraform/ && sudo terraform workspace new ' + workspace + '_' + group + '_aws'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
stderr = stderr.strip()
stderr = repr(stderr)
stderr = stderr.replace("'", "")
stderr = stderr.replace("\'", "")
sql.update_provisioning_server_status('Error', group, workspace, provider)
sql.update_provisioning_server_error(stderr, group, workspace, provider)
print('error: ' + stderr)
else:
if sql.add_server_aws(region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall,
provider, group, 'Creating', delete_on_termination):
from jinja2 import Environment, FileSystemLoader
user, user_id, role, token, servers = funct.get_users_params()
new_server = sql.select_provisioned_servers(new=workspace, group=group, type='aws')
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('ajax/provisioning/provisioned_servers.html')
template = template.render(servers=new_server,
groups=sql.select_groups(),
user_group=group,
providers=sql.select_providers(group),
role=role,
adding=1)
print(template)
if form.getvalue('awseditworkspace'):
workspace = form.getvalue('awseditworkspace')
group = form.getvalue('aws_editing_group')
provider = form.getvalue('aws_editing_provider')
region = form.getvalue('aws_editing_regions')
size = form.getvalue('aws_editing_size')
oss = form.getvalue('aws_editing_oss')
ssh_name = form.getvalue('aws_editing_ssh_name')
volume_size = form.getvalue('aws_editing_volume_size')
delete_on_termination = form.getvalue('aws_editing_delete_on_termination')
floating_ip = form.getvalue('aws_editing_floating_net')
firewall = form.getvalue('aws_editing_firewall')
public_ip = form.getvalue('aws_editing_public_ip')
server_id = form.getvalue('server_id')
if sql.update_server_aws(region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, provider, group, 'Editing', server_id, delete_on_termination):
try:
cmd = 'cd scripts/terraform/ && sudo terraform workspace select ' + workspace + '_' + group + '_aws'
output, stderr = funct.subprocess_execute(cmd)
except Exception as e:
print('error: ' +str(e))
if stderr != '':
stderr = stderr.strip()
stderr = repr(stderr)
stderr = stderr.replace("'", "")
stderr = stderr.replace("\'", "")
sql.update_provisioning_server_error(stderr, group, workspace, provider)
print('error: ' + stderr)
else:
print('ok')
if form.getvalue('awsprovisining') or form.getvalue('awseditingprovisining') or form.getvalue('doprovisining') or form.getvalue('doeditprovisining'):
funct.check_user_group()
if form.getvalue('awsprovisining'):
workspace = form.getvalue('awsprovisining')
group = form.getvalue('aws_create_group')
provider_id = form.getvalue('aws_create_provider')
action = 'created'
cloud = 'aws'
state_name = 'aws_instance'
elif form.getvalue('awseditingprovisining'):
workspace = form.getvalue('awseditingprovisining')
group = form.getvalue('aws_edit_group')
provider_id = form.getvalue('aws_edit_provider')
action = 'modified'
cloud = 'aws'
state_name = 'aws_instance'
elif form.getvalue('doprovisining'):
workspace = form.getvalue('doprovisining')
group = form.getvalue('do_create_group')
provider_id = form.getvalue('do_create_provider')
action = 'created'
cloud = 'do'
state_name = 'digitalocean_droplet'
elif form.getvalue('doeditprovisining'):
workspace = form.getvalue('doeditprovisining')
group = form.getvalue('do_edit_group')
provider_id = form.getvalue('do_edit_provider')
action = 'modified'
cloud = 'do'
state_name = 'digitalocean_droplet'
tfvars = workspace + '_'+group+'_' + cloud + '.tfvars'
cmd = 'cd scripts/terraform/ && sudo terraform apply -auto-approve -no-color -input=false -target=module.' + cloud + '_module -var-file vars/' + tfvars
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
stderr = stderr.strip()
stderr = repr(stderr)
stderr = stderr.replace("'", "")
stderr = stderr.replace("\'", "")
sql.update_provisioning_server_status('Error', group, workspace, provider_id)
sql.update_provisioning_server_error(stderr, group, workspace, provider_id)
print('error: '+stderr)
else:
if cloud == 'aws':
cmd = 'cd scripts/terraform/ && sudo terraform state show module.aws_module.aws_eip.floating_ip[0]|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
cmd = 'cd scripts/terraform/ && sudo terraform state show module.' + cloud + '_module.' + state_name + '.hapwi|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"'
else:
cmd = 'cd scripts/terraform/ && sudo terraform state show module.' + cloud + '_module.' + state_name + '.hapwi|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"'
output, stderr = funct.subprocess_execute(cmd)
ips = ''
for ip in output:
ips += ip
ips += ' '
print(ips)
sql.update_provisioning_server_status('Created', group, workspace, provider_id, update_ip=ips)
funct.logging('localhost', 'Server ' + workspace + ' has been ' + action, provisioning=1)
if form.getvalue('provisiningdestroyserver'):
funct.check_user_group()
server_id = form.getvalue('provisiningdestroyserver')
workspace = form.getvalue('servername')
group = form.getvalue('group')
cloud_type = form.getvalue('type')
provider_id = form.getvalue('provider_id')
tf_workspace = workspace + '_' + group + '_' + cloud_type
cmd = 'cd scripts/terraform/ && sudo terraform workspace select ' + tf_workspace
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
stderr = stderr.strip()
stderr = repr(stderr)
stderr = stderr.replace("'", "")
stderr = stderr.replace("\'", "")
sql.update_provisioning_server_status('Error', group, workspace, provider_id)
sql.update_provisioning_server_error(stderr, group, workspace, provider_id)
print('error: ' + stderr)
else:
cmd = 'cd scripts/terraform/ && sudo terraform destroy -auto-approve -no-color -target=module.'+cloud_type+'_module -var-file vars/' + tf_workspace + '.tfvars'
output, stderr = funct.subprocess_execute(cmd)
if stderr != '':
print('error: ' + stderr)
else:
cmd = 'cd scripts/terraform/ && sudo terraform workspace select default && sudo terraform workspace delete -force ' + tf_workspace
output, stderr = funct.subprocess_execute(cmd)
print('ok')
funct.logging('localhost', 'Server has been destroyed', provisioning=1)
sql.delete_provisioned_servers(server_id)
if form.getvalue('editAwsServer'):
funct.check_user_group()
server_id = form.getvalue('editAwsServer')
user_group = form.getvalue('editAwsGroup')
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('ajax/provisioning/aws_edit_dialog.html')
template = template.render(server=sql.select_aws_server(server_id=server_id), providers=sql.select_providers(user_group))
print(template)
if form.getvalue('editDoServer'):
funct.check_user_group()
server_id = form.getvalue('editDoServer')
user_group = form.getvalue('editDoGroup')
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('ajax/provisioning/do_edit_dialog.html')
template = template.render(server=sql.select_do_server(server_id=server_id), providers=sql.select_providers(user_group))
print(template)
if form.getvalue('edit_do_provider'):
funct.check_user_group()
provider_id = form.getvalue('edit_do_provider')
new_name = form.getvalue('edit_do_provider_name')
new_token = form.getvalue('edit_do_provider_token')
if sql.update_do_provider(new_name, new_token, provider_id):
print('ok')
funct.logging('localhost', 'Provider has been renamed. New name is ' + new_name, provisioning=1)
if form.getvalue('edit_aws_provider'):
funct.check_user_group()
provider_id = form.getvalue('edit_aws_provider')
new_name = form.getvalue('edit_aws_provider_name')
new_key = form.getvalue('edit_aws_provider_key')
new_secret = form.getvalue('edit_aws_provider_secret')
if sql.update_aws_provider(new_name, new_key, new_secret, provider_id):
print('ok')
funct.logging('localhost', 'Provider has been renamed. New name is ' + new_name, provisioning=1)

31
app/provisioning.py Normal file
View File

@ -0,0 +1,31 @@
#!/usr/bin/env python3
import funct
import sql
from jinja2 import Environment, FileSystemLoader
env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('provisioning.html')
form = funct.form
print('Content-type: text/html\n')
funct.check_login()
funct.page_for_admin(level=2)
try:
user, user_id, role, token, servers = funct.get_users_params()
if role == 1:
groups=sql.select_groups()
else:
groups=funct.get_user_group(id=1)
user_group = funct.get_user_group(id=1)
except Exception as e:
print(str(e))
output_from_parsed_template = template.render(title="Servers provisioning",
role=role,
user=user,
groups=groups,
user_group=user_group,
servers=sql.select_provisioned_servers(),
providers=sql.select_providers(user_group),
token=token)
print(output_from_parsed_template)

View File

@ -0,0 +1,16 @@
module "aws_module" {
source = "github.com/Aidaho12/haproxy-wi-terraform-modules?ref=aws"
region = var.region
instance_type = var.instance_type
public_ip = var.public_ip
floating_ip = var.floating_ip
volume_size = var.volume_size
delete_on_termination = var.delete_on_termination
name = var.name
os = var.os
ssh_key_name = var.ssh_key_name
firewall = var.firewall
AWS_ACCESS_KEY = var.AWS_ACCESS_KEY
AWS_SECRET_KEY = var.AWS_SECRET_KEY
}

View File

@ -0,0 +1,16 @@
module "do_module" {
source = "github.com/Aidaho12/haproxy-wi-terraform-modules?ref=digitalocean"
region = var.region
size = var.size
private_networking = var.private_networking
floating_ip = var.floating_ip
ssh_key_name = var.ssh_key_name
name = var.name
os = var.os
ssh_ids = var.ssh_ids
firewall = var.firewall
backup = var.backup
monitoring = var.monitoring
token = var.token
}

View File

@ -0,0 +1 @@
localhost

View File

@ -0,0 +1,16 @@
region = "{{region}}"
instance_type = "{{size}}"
public_ip = {% if public_ip == 'true' %}true{%else%}false{%endif%}
floating_ip = {% if floating_ip == 'true' %}true{%else%}false{%endif%}
delete_on_termination = {% if delete_on_termination == 'true' %}true{%else%}false{%endif%}
volume_size = {{volume_size}}
name = "{{server_name}}"
os = "{{os}}"
ssh_key_name = "{{ssh_name}}"
firewall = {% if firewall == 'true' %}true{%else%}false{%endif%}
AWS_ACCESS_KEY = "{{AWS_ACCESS_KEY}}"
AWS_SECRET_KEY = "{{AWS_SECRET_KEY}}"

View File

@ -0,0 +1,21 @@
region = "{{region}}"
size = "{{size}}"
private_networking = {% if privet_net == 'true' %}true{%else%}false{%endif%}
floating_ip = {% if floating_ip == 'true' %}true{%else%}false{%endif%}
name = "{{server_name}}"
os = "{{os}}"
ssh_key_name = "{{ssh_name}}"
ssh_ids = [{% if ssh_ids != 'None' %}{% for s in ssh_ids.split(',') %}{% if s != '' %}"{{s}}",{% endif %}{% endfor %}{% endif %}]
firewall = {% if firewall == 'true' %}true{%else%}false{%endif%}
backup = {% if backup == 'true' %}true{%else%}false{%endif%}
privet_net = {% if privet_net == 'true' %}true{%else%}false{%endif%}
monitoring = {% if monitoring == 'true' %}true{%else%}false{%endif%}
token = "{{token}}"

View File

@ -0,0 +1,20 @@
- hosts: localhost
gather_facts: no
connection: local
tasks:
- name: Create vars directory
file:
path: vars
state: directory
- name: Create aws var file
template:
src: templates/aws_vars_template.j2
dest: "vars/{{server_name}}_{{group}}_{{cloud}}.tfvars"
when: cloud == "aws"
- name: Create do var file
template:
src: templates/do_vars_template.j2
dest: "vars/{{server_name}}_{{group}}_{{cloud}}.tfvars"
when: cloud == "do"

View File

@ -0,0 +1,46 @@
variable "region" {}
variable "instance_type" {
default = "123"
}
variable "public_ip" {
default = false
}
variable "floating_ip" {}
variable "volume_size" {
default = "123"
}
variable "delete_on_termination" {
default = false
}
variable "name" {}
variable "os" {}
variable "ssh_key_name" {}
variable "firewall" {}
variable "AWS_ACCESS_KEY" {
default = "123"
}
variable "AWS_SECRET_KEY" {
default = "123"
}
variable "size" {
default = "123"
}
variable "private_networking" {
default = false
}
variable "ssh_ids" {
default = ""
}
variable "backup" {
default = false
}
variable "privet_net" {
default = false
}
variable "monitoring" {
default = false
}
variable "token" {
default = "123"
}

View File

@ -210,7 +210,6 @@ def add_setting_for_new_group(group_id):
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('local_path_logs', '/var/log/haproxy.log', 'logs', 'Logs save locally, enabled by default','" + group_id + "');")
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('syslog_server_enable', '0', 'logs', 'If exist syslog server for HAproxy logs, enable this option','" + group_id + "');")
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('syslog_server', '0', 'logs', 'IP address syslog server','" + group_id + "');")
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('log_time_storage', '14', 'logs', 'Time of storage of logs of user activity, in days','" + group_id + "');")
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('stats_user', 'admin', 'haproxy', 'Username for Stats web page HAproxy','" + group_id + "');")
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('stats_password', 'password', 'haproxy', 'Password for Stats web page HAproxy','" + group_id + "');")
sql.append("INSERT INTO settings (param, value, section, `desc`, `group`) values('stats_port', '8085', 'haproxy', 'Port Stats web page HAproxy','" + group_id + "');")
@ -2427,6 +2426,375 @@ def select_geoip_country_codes():
return cur.fetchall()
def add_provider_do(provider_name, provider_group, provider_token):
con, cur = get_cur()
sql = """ insert into providers_creds (name, type, `group`, key) values ('%s', 'do', '%s', '%s')""" % (provider_name, provider_group, provider_token)
try:
cur.execute(sql)
return True
except sqltool.Error as e:
funct.out_error(e)
return False
finally:
cur.close()
con.close()
def add_provider_aws(provider_name, provider_group, provider_key, provider_secret):
con, cur = get_cur()
sql = """ insert into providers_creds (name, type, `group`, key, secret) values ('%s', 'aws', '%s', '%s', '%s')""" % (provider_name, provider_group, provider_key, provider_secret)
try:
cur.execute(sql)
return True
except sqltool.Error as e:
funct.out_error(e)
return False
finally:
cur.close()
con.close()
def select_providers(user_group, **kwargs):
con, cur = get_cur()
if user_group == 1:
user_group = ''
if kwargs.get('key'):
user_group += " where key = '%s' " % kwargs.get('key')
else:
user_group = "where `group` = '%s'" % user_group
if kwargs.get('key'):
user_group += " and key = '%s' " % kwargs.get('key')
sql = """ select * from providers_creds %s""" % user_group
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
finally:
cur.close()
con.close()
def delete_provider(provider_id):
con, cur = get_cur()
sql = """ delete from providers_creds where id = '%s'""" % provider_id
try:
cur.execute(sql)
return True
except sqltool.Error as e:
funct.out_error(e)
return False
finally:
cur.close()
con.close()
def add_server_aws(region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, provider_id, group_id, status, delete_on_termination):
con, cur = get_cur()
if mysql_enable == '1':
sql = """ insert into provisioned_servers
(region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, provider_id, group_id, type, status, date, delete_on_termination)
values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 'aws', '%s', now()), '%s'""" % (
region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, provider_id,
group_id, status, delete_on_termination)
else:
sql = """ insert into provisioned_servers
(region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, provider_id, group_id, type, status, date, delete_on_termination)
values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 'aws', '%s', datetime('now', 'localtime'), '%s')""" % (
region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, provider_id,
group_id, status, delete_on_termination)
try:
cur.execute(sql)
return True
except sqltool.Error as e:
funct.out_error(e)
return False
finally:
cur.close()
con.close()
def add_server_do(region, size, privet_net, floating_ip, ssh_ids, ssh_key_name, name, oss, firewall, monitoring, backup, provider_id, group_id, status):
con, cur = get_cur()
if mysql_enable == '1':
sql = """ insert into provisioned_servers
(region, instance_type, private_networking, floating_ip, ssh_ids, ssh_key_name, name, os, firewall, monitoring, backup, provider_id, group_id, type, status, date)
values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 'do', '%s', now())""" % (
region, size, privet_net, floating_ip, ssh_ids, ssh_key_name, name, oss, firewall, monitoring, backup, provider_id,
group_id, status)
else:
sql = """ insert into provisioned_servers
(region, instance_type, private_networking, floating_ip, ssh_ids, ssh_key_name, name, os, firewall, monitoring, backup, provider_id, group_id, type, status, date)
values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 'do', '%s', datetime('now', 'localtime'))""" % (
region, size, privet_net, floating_ip, ssh_ids, ssh_key_name, name, oss, firewall, monitoring, backup, provider_id,
group_id, status)
try:
cur.execute(sql)
return True
except sqltool.Error as e:
funct.out_error(e)
return False
finally:
cur.close()
con.close()
def select_aws_server(server_id):
con, cur = get_cur()
sql = """ select region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, provider_id, group_id, id, delete_on_termination
from provisioned_servers where id = '%s' """ % server_id
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
finally:
cur.close()
con.close()
def select_do_server(server_id):
con, cur = get_cur()
sql = """ select region, instance_type, private_networking, floating_ip, ssh_ids, ssh_key_name, name, os, firewall, backup, monitoring, provider_id, group_id, id
from provisioned_servers where id = '%s' """ % server_id
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
finally:
cur.close()
con.close()
def update_provisioning_server_status(status, user_group_id, name, provider_id, **kwargs):
con, cur = get_cur()
sql = """ update provisioned_servers set status = '%s ' where group_id = '%s'
and name = '%s' and provider_id = '%s' """ % (status, user_group_id, name, provider_id)
if kwargs.get('update_ip'):
sql = """ update provisioned_servers set
status = '%s',
IP = '%s'
where group_id = '%s'
and name = '%s' and provider_id = '%s' """ % (status, kwargs.get('update_ip'), user_group_id, name, provider_id)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
cur.close()
con.close()
def update_provisioning_server_error(status, user_group_id, name, provider_id):
con, cur = get_cur()
sql = """ update provisioned_servers set last_error = '%s ' where group_id = '%s'
and name = '%s' and provider_id = '%s' """ % (status, user_group_id, name, provider_id)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
cur.close()
con.close()
def update_server_aws(region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, provider, group, status, server_id, delete_on_termination):
con, cur = get_cur()
sql = """ update provisioned_servers set
region = '%s',
instance_type = '%s',
public_ip = '%s',
floating_ip = '%s',
volume_size = '%s',
ssh_key_name = '%s',
name = '%s',
os = '%s',
firewall = '%s',
provider_id = '%s',
group_id = '%s',
status = '%s',
delete_on_termination = '%s'
where id = '%s' """ % (region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, provider, group, status, delete_on_termination, server_id)
try:
cur.execute(sql)
con.commit()
return True
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
return False
finally:
cur.close()
con.close()
def update_server_do(size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider,
group, status, server_id):
con, cur = get_cur()
sql = """ update provisioned_servers set
instance_type = '%s',
private_networking = '%s',
floating_ip = '%s',
ssh_ids = '%s',
ssh_key_name = '%s',
os = '%s',
firewall = '%s',
monitoring = '%s',
backup = '%s',
provider_id = '%s',
group_id = '%s',
status = '%s'
where id = '%s' """ % (
size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider, group, status, server_id)
try:
cur.execute(sql)
con.commit()
return True
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
return False
finally:
cur.close()
con.close()
def delete_provisioned_servers(server_id):
con, cur = get_cur()
sql = """ delete from provisioned_servers where id = '%s' """ % server_id
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
cur.close()
con.close()
def select_provisioned_servers(**kwargs):
con, cur = get_cur()
sql = """select id, name, provider_id, type, group_id, instance_type, status, date, region, os, IP, last_error from provisioned_servers"""
if kwargs.get('all'):
sql = """select * from provisioned_servers where id = '%s' """ % kwargs.get('all')
if kwargs.get('new'):
sql = """select id, name, provider_id, type, group_id, instance_type, status, date, region, os, IP, last_error from provisioned_servers
where name = '%s' and group_id = '%s' and type = '%s' """ % (kwargs.get('new'), kwargs.get('group'), kwargs.get('type'))
try:
cur.execute(sql)
except sqltool.Error as e:
funct.out_error(e)
else:
return cur.fetchall()
cur.close()
con.close()
def select_aws_provider(provider_id):
con, cur = get_cur()
sql = """ select key, secret from providers_creds where id = '%s'""" % provider_id
try:
cur.execute(sql)
except sqltool.Error as e:
cur.close()
con.close()
return ""
else:
for p in cur.fetchall():
aws_key = p[0]
aws_secret = p[1]
cur.close()
con.close()
return aws_key, aws_secret
def select_do_provider(provider_id):
con, cur = get_cur()
sql = """ select key from providers_creds where id = '%s'""" % provider_id
try:
cur.execute(sql)
except sqltool.Error as e:
cur.close()
con.close()
return ""
else:
for p in cur.fetchall():
token = p[0]
cur.close()
con.close()
return token
def update_do_provider(new_name, new_token, provider_id):
con, cur = get_cur()
sql = """ update providers_creds set
name = '%s',
key = '%s'
where id = '%s' """ % (new_name, new_token, provider_id)
try:
cur.execute(sql)
con.commit()
return True
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
return False
finally:
cur.close()
con.close()
def update_aws_provider(new_name, new_key, new_secret, provider_id):
con, cur = get_cur()
sql = """ update providers_creds set
name = '%s',
key = '%s',
secret = '%s'
where id = '%s' """ % (new_name, new_key, new_secret, provider_id)
try:
cur.execute(sql)
con.commit()
return True
except sqltool.Error as e:
funct.out_error(e)
con.rollback()
return False
finally:
cur.close()
con.close()
form = funct.form
error_mess = 'error: All fields must be completed'

View File

@ -0,0 +1,159 @@
{% from 'include/input_macros.html' import input, select, checkbox %}
{% for s in server %}
<div id="aws_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview provisioning_table">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td colspan="2" class="headers">
<b>General information</b>
</td>
</tr>
<tr>
<td class="padding20">
Server name
</td>
<td>
<span id="aws_edit_server_name">{{s.6}}</span>
</td>
</tr>
{{input('aws_edit_group', value=s.10, type='hidden')}}
{{input('aws_edit_id', value=s.11, type='hidden')}}
<tr>
<td class="padding20">
Provider credentials
<span class="need-field">*</span>
</td>
<td>
<select id="aws_edit_id_provider">
{% for p in providers %}
{% if p.2 == 'aws' %}
{% if s.9|int() == p.0|int() %}
<option value="{{ p.0 }}" selected>{{ p.1 }}</option>
{% else %}
<option value="{{ p.0 }}">{{ p.1 }}</option>
{% endif %}
{% endif %}
{% endfor %}
</select>
</td>
</tr>
<tr>
<td class="padding20">
Region
</td>
<td>
<span id="aws_edit_region">{{s.0}}</span>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Instance</b>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Instance type
<span class="need-field">*</span>
</td>
<td>
{{input('aws_edit_size', size='30', value=s.1)}}
<div class="tooltip tooltipTop tooltipTd">
Instance types list is <a href="https://aws.amazon.com/ec2/instance-types/" title="Instance types list" target="_blank">here</a>
</div>
</td>
</tr>
<tr>
<td class="padding20">
OS
<span class="need-field">*</span>
</td>
<td>
{% set oss = dict() %}
{% set oss = {'centos-7':'Centos 7 x64','ubuntu-18.04':'Ubuntu 18.04 x64','ubuntu-18.10':'Ubuntu 18.10 x64',
'debian-10':'Debian 10 x86','debian-9':'Debian 9 x86','rhel-7':'RHEL 7 x86','rhel-8':'RHEL 8 x86',
'amazon-2_lts':'Amazon Linux 2 x86'} %}
{{ select('aws_edit_oss', values=oss, first=s.7, disabled='false') }}
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
SSH key pair name
<span class="need-field">*</span>
</td>
<td>
{{input('aws_edit_ssh_name', size='30', value=s.5)}}
<div class="tooltip tooltipTop tooltipTd">SSH key must exists in region where instance create</div>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Volume</b>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Volume size
<span class="need-field">*</span>
</td>
<td>
{{input('aws_edit_volume_size', size='30', value=s.4, type='number')}}
<div class="tooltip tooltipTop tooltipTd">Size in GB</div>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">Delete on termination</td>
<td>
{% set checked='checked' %}
{% if s.12 == 'false' %}
{% set checked='' %}
{% endif %}
{{checkbox('aws_edit_delete_on_termination', checked=checked)}}
<div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Network</b>
</td>
</tr>
<tr>
<td class="padding20">Public IP</td>
<td>
<select id="aws_edit_public_ip">
{% if s.2 == 'true' %}
<option value="public" selected>Public IP</option>
{% else %}
<option value="public">Public IP</option>
{% endif %}
{% if s.3 == 'true' %}
<option value="elastic" selected>Elastic IP</option>
{% else %}
<option value="elastic">Elastic IP</option>
{% endif %}
{% if s.2 == 'false' and s.3 == 'false' %}
<option value="none" selected>None</option>
{% else %}
<option value="none">None</option>
{% endif %}
</select>
</td>
</tr>
<tr>
{% set checked='checked' %}
{% if s.8 == 'false' %}
{% set checked='' %}
{% endif %}
<td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
<td>
{{checkbox('aws_edit_firewall', checked=checked)}}
<div class="tooltip tooltipTop tooltipTd">HAProxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div>
</td>
</tr>
<tr>
<td colspan="2">
<p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p>
</td>
</tr>
</table>
</div>
{% endfor %}

View File

@ -0,0 +1,188 @@
{% from 'include/input_macros.html' import input, select, checkbox %}
{% for s in server %}
<div id="do_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview provisioning_table">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td colspan="2" class="headers">
<b>General information</b>
</td>
</tr>
<tr>
<td class="padding20">
Server name
</td>
<td>
<span id="do_edit_server_name">{{s.6}}</span>
</td>
</tr>
{{input('do_edit_group', value=s.12, type='hidden')}}
{{input('do_edit_id', value=s.13, type='hidden')}}
<tr>
<td class="padding20">
Provider credentials
<span class="need-field">*</span>
</td>
<td>
<select id="do_edit_id_provider">
{% for p in providers %}
{% if p.2 == 'do' %}
{% if s.11|int() == p.0|int() %}
<option value="{{ p.0 }}" selected>{{ p.1 }}</option>
{% else %}
<option value="{{ p.0 }}">{{ p.1 }}</option>
{% endif %}
{% endif %}
{% endfor %}
</select>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Region
</td>
<td>
<span id="do_edit_regions">{{s.0}}</span>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Instance</b>
</td>
</tr>
<tr>
<td class="padding20">
Size
<span class="need-field">*</span>
</td>
<td>{{input('do_edit_size', size='30', value=s.1)}}</td>
</tr>
<tr>
<td class="padding20">
OS
<span class="need-field">*</span>
</td>
<td>
{% set oss = dict() %}
{% set oss = {'centos-7-x64':'Centos 7 x64', 'centos-8-x64':'Centos 8 x64','ubuntu-18-04-x64':'Ubuntu 18.04 x64','ubuntu-20-04-x64':'Ubuntu 20.04 x64',
'ubuntu-20-10-x64':'Ubuntu 20.10 x64','debian-10-x64':'Debian 10 x86','debian-9-x64':'Debian 9 x86'} %}
{{ select('do_edit_oss', values=oss, first=s.7, disabled='false') }}
</td>
</tr>
<tr>
<td class="padding20">
SSH
<span class="need-field">*</span>
</td>
<td>
<select id="do_edit_ssh_choose">
{% if s.5 != 'None' %}
<option value="ssh_name" selected>Set SSH key name</option>
{% else %}
<option value="ssh_name">Set SSH key name</option>
{% endif %}
{% if s.4 != 'None' %}
<option value="ssh_ids" selected>Set SSH key ids</option>
{% else %}
<option value="ssh_ids">Set SSH key ids</option>
{% endif %}
</select>
</td>
</tr>
<tr id="do_edit_ssh_ids_tr" {% if s.4 == 'None' %}style="display: none;"{% endif %}>
<td class="padding20 padding-top20">
SSH key ids
<span class="need-field">*</span>
</td>
<td>
{{input('do_edit_ssh_ids', size='30', value=s.4)}}
<div class="tooltip tooltipTop tooltipTd">List comma separated. Required if SSH key name is empty</div>
</td>
</tr>
<tr id="do_edit_ssh_name_tr" {% if s.5 == 'None' %}style="display: none;"{% endif %}>
<td class="padding20 padding-top20">
SSH key name
<span class="need-field">*</span>
</td>
<td>
{{input('do_edit_ssh_name', size='30', value=s.5)}}
<div class="tooltip tooltipTop tooltipTd">Required if SSH key ids is empty</div>
</td>
</tr>
<tr>
{% set checked='checked' %}
{% if s.10 == 'false' %}
{% set checked='' %}
{% endif %}
<td class="padding20">Monitoring</td>
<td>
{{checkbox('do_edit_monitoring', checked=checked)}}
</td>
</tr>
<tr>
{% set checked='checked' %}
{% if s.9 == 'false' %}
{% set checked='' %}
{% endif %}
<td class="padding20">Backup</td>
<td>
{{checkbox('do_edit_backup', checked=checked)}}
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Network</b>
</td>
</tr>
<tr>
{% set checked='checked' %}
{% if s.2 == 'false' %}
{% set checked='' %}
{% endif %}
<td class="padding20">Private IP</td>
<td>
{{checkbox('do_edit_private_networking', checked=checked)}}
</td>
</tr>
<tr>
{% set checked='checked' %}
{% if s.3 == 'false' %}
{% set checked='' %}
{% endif %}
<td class="padding20">Floating Ip</td>
<td>
{{checkbox('do_edit_floating_ip', checked=checked)}}
</td>
</tr>
<tr>
{% set checked='checked' %}
{% if s.8 == 'false' %}
{% set checked='' %}
{% endif %}
<td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
<td>
{{checkbox('do_edit_firewall', checked=checked)}}
<div class="tooltip tooltipTop tooltipTd">HAProxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div>
</td>
</tr>
<tr>
<td colspan="2">
<p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p>
</td>
</tr>
</table>
<script>
$( function() {
$('#do_edit_ssh_choose').on('selectmenuchange', function (){
if ($('#do_edit_ssh_choose option:selected').val() == 'ssh_name') {
$('#do_edit_ssh_name_tr').show();
$('#do_edit_ssh_ids_tr').hide();
} else if ($('#do_edit_ssh_choose option:selected').val() == 'ssh_ids') {
$('#do_edit_ssh_name_tr').hide();
$('#do_edit_ssh_ids_tr').show();
}
});
});
</script>
</div>
{% endfor %}

View File

@ -0,0 +1,39 @@
{% for p in providers %}
<tr id="provider-{{p.0}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newprovider{% endif %}">
<td class="padding10 first-collumn"><span id="provider-name-{{p.0}}">{{p.1}}</span></td>
<td style="width: {% if role != 1 %}100{% else %} 10{% endif %}%;">
<span id="provider-type-{{p.0}}">
{% if p.2 == 'do' %}
DigitalOcean
{% set onclickEditAction = 'editDoProvider' %}
{% elif p.2 == 'aws' %}
AWS
{% set onclickEditAction = 'editAwsProvider' %}
{% endif %}
</span>
</td>
{% if role == 1 %}
<td style="width: 100%">
{% for g in groups %}
{% if adding %}
{% if user_group|int() == g.0|int() %}
<span id="provider-group-{{p.0}}">{{ g.1 }}</span>
{% endif %}
{% else %}
{% if p.3|int() == g.0|int() %}
<span id="provider-group-{{p.0}}">{{ g.1 }}</span>
{% endif %}
{% endif %}
{% endfor %}
</td>
{% else %}
<span id="provider-group-{{p.0}}" style="display: none;">user_group</span>
{% endif %}
<td>
<a class="edit" onclick="{{onclickEditAction}}({{p.0}})" title="Edit provider {{p.1}}" style="cursor: pointer;"></a>
</td>
<td>
<a class="delete" onclick="confirmDeleteProvider({{p.0}})" title="Delete provider {{p.1}}" style="cursor: pointer;"></a>
</td>
</tr>
{% endfor %}

View File

@ -0,0 +1,71 @@
{% for s in servers %}
<tr id="server-{{s.0}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newserver{% endif %}">
<td class="padding10 first-collumn"><span id="server-name-{{s.0}}">{{s.1}}</span></td>
<td>
{% for p in providers %}
{% if p.0|int() == s.2|int() %}
<span>{{ p.1 }}</span>
<span id="server-provider-{{s.0}}" style="display: none;">{{p.0}}</span>
{% endif %}
{% endfor %}
</td>
{% if role == 1 %}
<td>
{% for g in groups %}
{% if adding %}
{% if user_group|int() == g.0|int() %}
{{ g.1 }}
<span id="server-group-{{s.0}}" style="display: none;">{{ g.0 }}</span>
{% endif %}
{% else %}
{% if s.4|int() == g.0|int() %}
{{ g.1 }}
<span id="server-group-{{s.0}}" style="display: none;">{{ g.0 }}</span>
{% endif %}
{% endif %}
{% endfor %}
</td>
{% else %}
<span id="server-group-{{s.0}}" style="display: none;">{{user_group}}</span>
{% endif %}
<td>
{% if s.3 == 'do' %}
DigitalOcean
{% set onclickEditAction = 'editDoServer' %}
{% elif s.3 == 'aws' %}
AWS
{% set onclickEditAction = 'editAwsServer' %}
{% endif %}
<span id="server-cloud-{{s.0}}" style="display: none;">{{s.3}}</span>
</td>
<td>
{{s.8}}
</td>
<td>
<span id="sever-os-{{s.0}}">{{s.9}}</span>
</td>
<td>
<span id="sever-ip-{{s.0}}">{{s.10}}</span>
</td>
<td>
<span id="sever-size-{{s.0}}">{{s.5}}</span>
</td>
<td>
{% if s.6 == 'Created ' %}
{% set style='сolor: green;' %}
{% elif s.6 == 'Error ' %}
{% set style='color: red;cursor: help;' %}
{% endif %}
<span id="sever-status-{{s.0}}" title="Last error: {{s.11}}" style="font-weight: bold;{{style}}">{{s.6}}</span>
</td>
<td>
{{s.7}}
</td>
<td>
<a class="edit" onclick="{{onclickEditAction}}({{s.0}})" title="Edit server {{s.1}}" style="cursor: pointer;"></a>
</td>
<td>
<a class="delete" onclick="confirmDeleteProvisionedServer({{s.0}})" title="Delete server {{s.1}}" style="cursor: pointer;"></a>
</td>
</tr>
{% endfor %}

View File

@ -117,6 +117,7 @@
<li><a href="/app/servers.py#settings" title="Servers: Manage HAProxy-WI settings - HAProxy-WI" class="settings head-submenu">Settings</a></li>
<li><a href="/app/servers.py#installproxy" title="Servers: Proxy service installation - HAProxy-WI" class="hap-menu head-submenu">Proxy installation</a> </li>
<li><a href="/app/servers.py#installmon" title="Servers: Monitoring service installation - HAProxy-WI" class="hap1 head-submenu">Monitoring installation</a> </li>
<li><a href="/app/provisioning.py" title="Servers: Provisioning - HAProxy-WI" class="hap1 head-submenu">Server provisioning</a> </li>
<li><a href="/app/viewlogs.py?type=2" title="Servers: View internal logs - HAProxy-WI" class="logs head-submenu">Internal logs</a></li>
<li><a href="/app/servers.py#backup" title="Servers: Backup configs - HAProxy-WI" class="backup head-submenu">Backups</a> </li>
</ul>

View File

@ -0,0 +1,332 @@
<div id="do_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview provisioning_table">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td colspan="2" class="headers">
<b>General information</b>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Server name
<span class="need-field">*</span>
</td>
<td>
{{input('do_create_server_name', required='required', size='30')}}
<div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div>
</td>
</tr>
{% if role == 1 %}
<tr>
<td class="padding20">
Group
<span class="need-field">*</span>
</td>
<td>
<select id="do_create_group">
{% for group in groups %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endfor %}
</select>
</td>
</tr>
{% else %}
{{input('do_create_group', value=groups, type='hidden')}}
{% endif %}
<tr>
<td class="padding20">
Provider credentials
<span class="need-field">*</span>
</td>
<td>
<select id="do_create_provider">
{% for p in providers %}
{% if p.2 == 'do' %}
<option value="{{ p.0 }}">{{ p.1 }}</option>
{% endif %}
{% endfor %}
</select>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Region
<span class="need-field">*</span>
</td>
<td>
{% set regions = dict() %}
{% set regions = {'nyc1':'New York 1','nyc2':'New York 2','nyc3':'New York 3',
'ams1':'Amsterdam 1','ams2':'Amsterdam 2','ams3':'Amsterdam 3',
'sfo1':'San Francisco 1','sfo2':'San Francisco 2','sfo3':'San Francisco 3',
'sgp1':'Singapore 1','lon1':'London 1','fra1':'Frankfurt 1','tor1':'Toronto 1', 'blr1':'Bangalore 1'} %}
{{ select('do_create_regions', values=regions) }}
<div class="tooltip tooltipTop tooltipTd">Not all regions may be active</div>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Instance</b>
</td>
</tr>
<tr>
<td class="padding20">
Size
<span class="need-field">*</span>
</td>
<td>{{input('do_create_size', required='required', size='30')}}</td>
</tr>
<tr>
<td class="padding20">
OS
<span class="need-field">*</span>
</td>
<td>
{% set oss = dict() %}
{% set oss = {'centos-7-x64':'Centos 7 x64', 'centos-8-x64':'Centos 8 x64','ubuntu-18-04-x64':'Ubuntu 18.04 x64','ubuntu-20-04-x64':'Ubuntu 20.04 x64',
'ubuntu-20-10-x64':'Ubuntu 20.10 x64','debian-10-x64':'Debian 10 x86','debian-9-x64':'Debian 9 x86'} %}
{{ select('do_create_oss', values=oss) }}
</td>
</tr>
<tr>
<td class="padding20">
SSH
<span class="need-field">*</span>
</td>
<td>
<select id="do_create_ssh_choose">
<option value="none" disabled selected>Choose SSH</option>
<option value="ssh_name">Set SSH key name</option>
<option value="ssh_ids">Set SSH key ids</option>
</select>
</td>
</tr>
<tr id="do_create_ssh_ids_tr" style="display: none;">
<td class="padding20 padding-top20"">
SSH key ids
<span class="need-field">*</span>
</td>
<td>
{{input('do_create_ssh_ids', size='30')}}
<div class="tooltip tooltipTop tooltipTd">List comma separated. Required if SSH key name is empty</div>
</td>
</tr>
<tr id="do_create_ssh_name_tr" style="display: none;">
<td class="padding20 padding-top20">
SSH key name
<span class="need-field">*</span>
</td>
<td>
{{input('do_create_ssh_name', size='30')}}
<div class="tooltip tooltipTop tooltipTd">Required if SSH key ids is empty</div>
</td>
</tr>
<tr>
<td class="padding20">Monitoring</td>
<td>{{checkbox('do_create_monitoring', checked='checked')}}</td>
</tr>
<tr>
<td class="padding20">Backup</td>
<td>{{checkbox('do_create_backup')}}</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Network</b>
</td>
</tr>
<tr>
<td class="padding20">Private IP</td>
<td>{{checkbox('do_create_private_net', checked='checked')}}</td>
</tr>
<tr>
<td class="padding20 padding-top20">Floating IP</td>
<td>{{checkbox('do_create_floating_net')}}<div class="tooltip tooltipTop tooltipTd">If unchecked then will be used public IP</div></td>
</tr>
<tr>
<td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
<td>
{{checkbox('do_create_firewall', checked='checked')}}
<div class="tooltip tooltipTop tooltipTd">HAProxy-WI will create firewall and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be opened</div>
</td>
</tr>
</table>
</div>
<div id="aws_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview provisioning_table">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td colspan="2" class="headers">
<b>General information</b>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Server name
<span class="need-field">*</span>
</td>
<td>
{{input('aws_create_server_name', required='required', size='30')}}
<div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div>
</td>
</tr>
{% if role == 1 %}
<tr>
<td class="padding20">
Group
<span class="need-field">*</span>
</td>
<td>
<select id="aws_create_group">
{% for group in groups %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endfor %}
</select>
</td>
</tr>
{% else %}
{{input('aws_create_group', value=groups, type='hidden')}}
{% endif %}
<tr>
<td class="padding20">
Provider credentials
<span class="need-field">*</span>
</td>
<td>
<select id="aws_create_provider">
{% for p in providers %}
{% if p.2 == 'aws' %}
<option value="{{ p.0 }}">{{ p.1 }}</option>
{% endif %}
{% endfor %}
</select>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Region
<span class="need-field">*</span>
</td>
<td>
{% set regions = dict() %}
{% set regions = {'us-east-1':'US East (N. Virginia)','us-east-2':'US East (Ohio)','us-west-1':'US West (N. California)',
'us-west-2':'US West (Oregon)','af-south-1':'Africa (Cape Town)','ap-east-1':'Asia Pacific (Hong Kong)',
'ap-south-1':'Asia Pacific (Mumbai)','ap-northeast-2':'Asia Pacific (Seoul)','ap-southeast-1':'Asia Pacific (Singapore)',
'ap-southeast-2':'Asia Pacific (Sydney)','ap-northeast-1':'Asia Pacific (Tokyo)','ca-central-1':'Canada (Central)',
'eu-central-1':'Europe (Frankfurt)', 'eu-west-1':'Europe (Ireland)', 'eu-west-2':'Europe (London)',
'eu-south-1':'Europe (Milan)', 'eu-west-3':'Europe (Paris)', 'eu-north-1':'Europe (Stockholm)',
'me-south-1':'Middle East (Bahrain)', 'sa-east-1':'South America (São Paulo)'} %}
{{ select('aws_create_regions', values=regions) }}
<div class="tooltip tooltipTop tooltipTd">Not all regions may be active</div>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Instance</b>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Instance type
<span class="need-field">*</span>
</td>
<td>
{{input('aws_create_size', required='required', size='30')}}
<div class="tooltip tooltipTop tooltipTd">
Instance types list is <a href="https://aws.amazon.com/ec2/instance-types/" title="Instance types list" target="_blank">here</a>
</div>
</td>
</tr>
<tr>
<td class="padding20">
OS
<span class="need-field">*</span>
</td>
<td>
{% set oss = dict() %}
{% set oss = {'centos-7':'Centos 7 x64','ubuntu-18.04':'Ubuntu 18.04 x64','ubuntu-18.10':'Ubuntu 18.10 x64',
'debian-10':'Debian 10 x86','debian-9':'Debian 9 x86','rhel-7':'RHEL 7 x86','rhel-8':'RHEL 8 x86',
'amazon-2_lts':'Amazon Linux 2 x86'} %}
{{ select('aws_create_oss', values=oss) }}
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
SSH key pair name
<span class="need-field">*</span>
</td>
<td>
{{input('aws_create_ssh_name', size='30')}}
<div class="tooltip tooltipTop tooltipTd">SSH key must exists in region where instance create</div>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Volume</b>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">
Volume size
<span class="need-field">*</span>
</td>
<td>
{{input('aws_create_volume_size', size='30', value='10', type='number')}}
<div class="tooltip tooltipTop tooltipTd">Size in GB</div>
</td>
</tr>
<tr>
<td class="padding20 padding-top20">Delete on termination</td>
<td>
{{checkbox('aws_create_delete_on_termination', checked='checked')}}
<div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div>
</td>
</tr>
<tr>
<td colspan="2" class="headers">
<b>Network</b>
</td>
</tr>
<tr>
<td class="padding20">Public IP</td>
<td>
<select id="aws_create_public_ip">
<option value="public">Public IP</option>
<option value="elastic">Elastic IP</option>
<option value="none">None</option>
</select>
</td>
</tr>
<tr>
<td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
<td>
{{checkbox('aws_create_firewall', checked='checked')}}
<div class="tooltip tooltipTop tooltipTd">HAProxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div>
</td>
</tr>
</table>
</div>
<div id="server_creating" style="display: none;">
<ul style="padding: 20px 20px 0px 20px;font-size: 15px;">
<li id="creating-init" class="server-creating">Creating environment...</li>
<li id="creating-vars" class="server-creating">Creating vars...</li>
<li id="creating-validate" class="server-creating">Validation...</li>
<li id="creating-workspace" class="server-creating">Creating workspace...</li>
<li id="creating-server" class="server-creating">Creating server...</li>
</ul>
<div id="wait-mess"></div>
<div id="created-mess" class="alert alert-success" style="display:none;"></div>
<div id="creating-error" class="alert alert-danger" style="display:none;"></div>
<progress id="creating-progress" value="0" max="100"></progress>
</div>
<div id="server_editing" style="display: none;">
<ul style="padding: 20px 20px 0px 20px;font-size: 15px;">
<li id="editing-init" class="server-creating">Updating environment...</li>
<li id="editing-vars" class="server-creating">Updating vars...</li>
<li id="editing-validate" class="server-creating">Validation...</li>
<li id="editing-workspace" class="server-creating">Updating workspace...</li>
<li id="editing-server" class="server-creating">Updating server...</li>
</ul>
<div id="editing-wait-mess"></div>
<div id="edited-mess" class="alert alert-success" style="display:none;"></div>
<div id="editing-error" class="alert alert-danger" style="display:none;"></div>
<progress id="editing-progress" value="0" max="100"></progress>
</div>

View File

@ -0,0 +1,142 @@
{% set providers_for_choose = dict() %}
{% set providers_for_choose = {'aws':'AWS','do':'DigitalOcean'} %}
<div id="add_providers_choosing" style="display: none;">
{{ select('add_select_providers', values=providers_for_choose) }}
</div>
<div id="create_providers_choosing" style="display: none;">
{{ select('create_select_providers', values=providers_for_choose) }}
</div>
<div id="aws_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td class="padding20">
Provider name
<span class="need-field">*</span>
</td>
<td>{{input('aws_new_name', required='required', size='30')}}</td>
</tr>
{% if role == 1 %}
<tr>
<td class="padding20">
Group
<span class="need-field">*</span>
</td>
<td>
<select id="aws_new_group">
{% for group in groups %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endfor %}
</select>
</td>
</tr>
{% else %}
{{input('aws_new_group', value=groups, type='hidden')}}
{% endif %}
<tr>
<td class="padding20">
ACCESS_KEY
<span class="need-field">*</span>
</td>
<td>{{input('aws_new_key', required='required', size='30')}}</td>
</tr>
<tr>
<td class="padding20">
SECRET_KEY
<span class="need-field">*</span>
</td>
<td>{{input('aws_new_secret', required='required', size='30')}}</td>
</tr>
</table>
<div class="alert alert-info">
How to get the AWS access key read <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html" target="_blank"><b>here</b></a>
</div>
</div>
<div id="do_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td class="padding20">
Provider name
<span class="need-field">*</span>
</td>
<td>{{input('do_new_name', required='required', size='30')}}</td>
</tr>
{% if role == 1 %}
<tr>
<td class="padding20">
Group
<span class="need-field">*</span>
</td>
<td>
<select id="do_new_group">
{% for group in groups %}
<option value="{{ group.0 }}">{{ group.1 }}</option>
{% endfor %}
</select>
</td>
</tr>
{% else %}
{{input('do_new_group', value=groups, type='hidden')}}
{% endif %}
<tr>
<td class="padding20">
TOKEN
<span class="need-field">*</span>
</td>
<td>{{input('do_new_token', required='required', size='30')}}</td>
</tr>
</table>
<div class="alert alert-info">
How to get the DigitalOcean token read <a href="https://www.digitalocean.com/docs/apis-clis/api/create-personal-access-token" target="_blank"><b>here</b></a>
</div>
</div>
<div id="aws_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td class="padding20">
Provider name
<span class="need-field">*</span>
</td>
<td>{{input('aws_edit_provider_name', required='required', size='30')}}</td>
</tr>
{{input('aws_edit_provider_group', value=groups, type='hidden')}}
{{input('aws_edit_provider_id', type='hidden')}}
<tr>
<td class="padding20">
ACCESS_KEY
<span class="need-field">*</span>
</td>
<td>{{input('aws_edit_provider_key', required='required', size='30')}}</td>
</tr>
<tr>
<td class="padding20">
SECRET_KEY
<span class="need-field">*</span>
</td>
<td>{{input('aws_edit_provider_secret', required='required', size='30')}}</td>
</tr>
</table>
</div>
<div id="do_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
<table class="overview">
{% include 'include/tr_validate_tips.html' %}
<tr>
<td class="padding20">
Provider name
<span class="need-field">*</span>
</td>
<td>{{input('do_edit_provider_name', required='required', size='30')}}</td>
</tr>
{{input('do_edit_provider_group', value=groups, type='hidden')}}
{{input('do_edit_provider_id', type='hidden')}}
<tr>
<td class="padding20">
TOKEN
<span class="need-field">*</span>
</td>
<td>{{input('do_edit_provider_token', required='required', size='30')}}</td>
</tr>
</table>
</div>

View File

@ -0,0 +1,64 @@
{% extends "base.html" %}
{% block content %}
{% from 'include/input_macros.html' import input, select, checkbox %}
<link href="/inc/provisioning.css" rel="stylesheet">
<script src="/inc/users.js"></script>
<script src="/inc/fontawesome.min.js"></script>
{% include 'include/del_confirm.html' %}
<div id="tabs">
<ul>
<li><a href="#provisioning" title="Server provisioning - HAProxy-WI">Provisioning</a></li>
<li><a href="#providers" title="Providers settings - HAProxy-WI">Providers</a></li>
{% include 'include/login.html' %}
</ul>
<ul id='browse_histroy'></ul>
<div id="provisioning">
<table class="overview" id="ajax-provisioning">
<thead>
<tr class="overviewHead">
<th class="padding10 first-collumn">Name</th>
<th>Provider</th>
{% if role == 1 %}
<th>Group</th>
{% endif %}
<th>Cloud</th>
<th>Region</th>
<th>OS</th>
<th>IP</th>
<th>Instance type</th>
<th>Status</th>
<th>Created at</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody id="ajax-provisioning-body">
{% include 'ajax/provisioning/provisioned_servers.html' %}
</tbody>
</table>
<br /><span class="add-button" title="Create a new server" id="create-provider-button">+ Add</span>
</div>
<div id="providers">
<table class="overview" id="ajax-providers">
<thead>
<tr class="overviewHead">
<th class="padding10 first-collumn">Name</th>
<th>Cloud</th>
{% if role == 1 %}
<th>Group</th>
{% endif %}
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{% include 'ajax/provisioning/providers.html' %}
</tbody>
</table>
<br /><span class="add-button" title="Add a new provider" id="add-provider-button">+ Add</span>
</div>
</div>
{% include 'include/provisioning/creating_dialogs.html' %}
{% include 'include/provisioning/providers_dialogs.html' %}
<script src="/inc/provisioning.js"></script>
{% endblock %}

View File

@ -35,6 +35,10 @@
Order Deny,Allow
Deny from all
</Directory>
<Directory /var/www/haproxy-wi/app/scripts/terraform/>
Deny from all
</Directory>
<FilesMatch "\.cfg$">
Order Deny,Allow

63
inc/provisioning.css Normal file
View File

@ -0,0 +1,63 @@
.padding20{ width: 160px;}
.server-creating {padding-bottom: 10px;}
.proccessing_done {color: green;}
.proccessing, .processing_error {font-weight: bold; color: green;}
.proccessing::before {
display: none;
font-family: "Font Awesome 5 Solid";
content: "\f35a";
}
.processing .fa-arrow-alt-circle-right {
padding-right: 10px !important;
margin-bottom: -1px !important;
}
.processing_error .svg-inline--fa {
padding-right: 10px !important;
margin-bottom: -1px !important;
}
.processing_error { color: red;}
.processing_error::before {
display: none;
font-family: "Font Awesome 5 Solid";
content: "\f06a";
}
#creating-progress, #editing-progress {
clear: both;
width: 100%;
height: 10px;
}
progress {
border-radius: 5px;
}
progress::-webkit-progress-bar {
background-color: #ddd;
border-radius: 5px;
}
progress::-webkit-progress-value {
background-color: #5d9ceb;
border-radius: 5px;
}
progress::-moz-progress-bar {
background-color: #5d9ceb;
border-radius: 5px;
}
.alert-danger {
margin-bottom: 10px;
margin-top: 0;
}
.headers {
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
color: #aaa;
background-color: #eee;
}
.validateTips {
margin: 0;
}
.provisioning_table {
width: 99%;
}
.provisioning_table tr:last-of-type {
border: none;
}

1380
inc/provisioning.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1261,7 +1261,7 @@ async function waitConsumer() {
if (cur_url[0] != 'servers.py#installproxy' && cur_url[0] != 'servers.py#installmon' &&
cur_url[0] != 'users.py#installmon' && cur_url[0] != 'ha.py' && cur_url[0] != 'users.py#updatehapwi' &&
cur_url[0] != 'add.py?service=nginx#ssl' && cur_url[0] != 'add.py#ssl' && cur_url[0] != 'servers.py#geolite2'
&& cur_url[0] != 'login.py' && sessionStorage.getItem('disabled_alert') === null && localStorage.getItem('disabled_alert') === null) {
&& cur_url[0] != 'login.py?ref=/app/overview.py' && sessionStorage.getItem('disabled_alert') === null && localStorage.getItem('disabled_alert') === null) {
NProgress.configure({showSpinner: false});
$.ajax({
url: "options.py",