diff --git a/app/create_db.py b/app/create_db.py
index abf8afcc..5231af92 100644
--- a/app/create_db.py
+++ b/app/create_db.py
@@ -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()
diff --git a/app/funct.py b/app/funct.py
index 4a3742a8..eed0504f 100644
--- a/app/funct.py
+++ b/app/funct.py
@@ -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"
diff --git a/app/options.py b/app/options.py
index 6cb4173a..6883c98d 100644
--- a/app/options.py
+++ b/app/options.py
@@ -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)
diff --git a/app/provisioning.py b/app/provisioning.py
new file mode 100644
index 00000000..c7305197
--- /dev/null
+++ b/app/provisioning.py
@@ -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)
diff --git a/app/scripts/terraform/aws_instance.tf b/app/scripts/terraform/aws_instance.tf
new file mode 100644
index 00000000..c6a7bd80
--- /dev/null
+++ b/app/scripts/terraform/aws_instance.tf
@@ -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
+}
diff --git a/app/scripts/terraform/do_instance.tf b/app/scripts/terraform/do_instance.tf
new file mode 100644
index 00000000..60c8de86
--- /dev/null
+++ b/app/scripts/terraform/do_instance.tf
@@ -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
+}
diff --git a/app/scripts/terraform/inventory b/app/scripts/terraform/inventory
new file mode 100644
index 00000000..2fbb50c4
--- /dev/null
+++ b/app/scripts/terraform/inventory
@@ -0,0 +1 @@
+localhost
diff --git a/app/scripts/terraform/templates/aws_vars_template.j2 b/app/scripts/terraform/templates/aws_vars_template.j2
new file mode 100644
index 00000000..a9f0aea3
--- /dev/null
+++ b/app/scripts/terraform/templates/aws_vars_template.j2
@@ -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}}"
diff --git a/app/scripts/terraform/templates/do_vars_template.j2 b/app/scripts/terraform/templates/do_vars_template.j2
new file mode 100644
index 00000000..d097d062
--- /dev/null
+++ b/app/scripts/terraform/templates/do_vars_template.j2
@@ -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}}"
+
diff --git a/app/scripts/terraform/var_generator.yml b/app/scripts/terraform/var_generator.yml
new file mode 100644
index 00000000..da9c3119
--- /dev/null
+++ b/app/scripts/terraform/var_generator.yml
@@ -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"
diff --git a/app/scripts/terraform/variable.tf b/app/scripts/terraform/variable.tf
new file mode 100644
index 00000000..d2d56cd8
--- /dev/null
+++ b/app/scripts/terraform/variable.tf
@@ -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"
+}
\ No newline at end of file
diff --git a/app/sql.py b/app/sql.py
index f111fb5c..a4d20b98 100644
--- a/app/sql.py
+++ b/app/sql.py
@@ -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'
diff --git a/app/templates/ajax/provisioning/aws_edit_dialog.html b/app/templates/ajax/provisioning/aws_edit_dialog.html
new file mode 100644
index 00000000..5923b0f4
--- /dev/null
+++ b/app/templates/ajax/provisioning/aws_edit_dialog.html
@@ -0,0 +1,159 @@
+{% from 'include/input_macros.html' import input, select, checkbox %}
+{% for s in server %}
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+
+
+
+ Server name
+
+
+ {{s.6}}
+
+
+ {{input('aws_edit_group', value=s.10, type='hidden')}}
+ {{input('aws_edit_id', value=s.11, type='hidden')}}
+
+
+ Provider credentials
+ *
+
+
+
+ {% for p in providers %}
+ {% if p.2 == 'aws' %}
+ {% if s.9|int() == p.0|int() %}
+ {{ p.1 }}
+ {% else %}
+ {{ p.1 }}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+ Region
+
+
+ {{s.0}}
+
+
+
+
+
+
+
+ Instance type
+ *
+
+
+ {{input('aws_edit_size', size='30', value=s.1)}}
+
+
+
+
+
+ OS
+ *
+
+
+ {% 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') }}
+
+
+
+
+ SSH key pair name
+ *
+
+
+ {{input('aws_edit_ssh_name', size='30', value=s.5)}}
+ SSH key must exists in region where instance create
+
+
+
+
+
+
+
+ Volume size
+ *
+
+
+ {{input('aws_edit_volume_size', size='30', value=s.4, type='number')}}
+ Size in GB
+
+
+
+ Delete on termination
+
+ {% set checked='checked' %}
+ {% if s.12 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ {{checkbox('aws_edit_delete_on_termination', checked=checked)}}
+ Whether the volume should be destroyed on instance termination
+
+
+
+
+
+
+ Public IP
+
+
+ {% if s.2 == 'true' %}
+ Public IP
+ {% else %}
+ Public IP
+ {% endif %}
+ {% if s.3 == 'true' %}
+ Elastic IP
+ {% else %}
+ Elastic IP
+ {% endif %}
+ {% if s.2 == 'false' and s.3 == 'false' %}
+ None
+ {% else %}
+ None
+ {% endif %}
+
+
+
+
+ {% set checked='checked' %}
+ {% if s.8 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ Firewall
+
+ {{checkbox('aws_edit_firewall', checked=checked)}}
+ HAProxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed
+
+
+
+
+ Be aware: some changes may cause server re-creation. And all your data will be lost
+
+
+
+
+{% endfor %}
\ No newline at end of file
diff --git a/app/templates/ajax/provisioning/do_edit_dialog.html b/app/templates/ajax/provisioning/do_edit_dialog.html
new file mode 100644
index 00000000..852f36e2
--- /dev/null
+++ b/app/templates/ajax/provisioning/do_edit_dialog.html
@@ -0,0 +1,188 @@
+{% from 'include/input_macros.html' import input, select, checkbox %}
+{% for s in server %}
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+
+
+
+ Server name
+
+
+ {{s.6}}
+
+
+ {{input('do_edit_group', value=s.12, type='hidden')}}
+ {{input('do_edit_id', value=s.13, type='hidden')}}
+
+
+ Provider credentials
+ *
+
+
+
+ {% for p in providers %}
+ {% if p.2 == 'do' %}
+ {% if s.11|int() == p.0|int() %}
+ {{ p.1 }}
+ {% else %}
+ {{ p.1 }}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+ Region
+
+
+ {{s.0}}
+
+
+
+
+
+
+
+ Size
+ *
+
+ {{input('do_edit_size', size='30', value=s.1)}}
+
+
+
+ OS
+ *
+
+
+ {% 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') }}
+
+
+
+
+ SSH
+ *
+
+
+
+ {% if s.5 != 'None' %}
+ Set SSH key name
+ {% else %}
+ Set SSH key name
+ {% endif %}
+ {% if s.4 != 'None' %}
+ Set SSH key ids
+ {% else %}
+ Set SSH key ids
+ {% endif %}
+
+
+
+
+
+ SSH key ids
+ *
+
+
+ {{input('do_edit_ssh_ids', size='30', value=s.4)}}
+ List comma separated. Required if SSH key name is empty
+
+
+
+
+ SSH key name
+ *
+
+
+ {{input('do_edit_ssh_name', size='30', value=s.5)}}
+ Required if SSH key ids is empty
+
+
+
+ {% set checked='checked' %}
+ {% if s.10 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ Monitoring
+
+ {{checkbox('do_edit_monitoring', checked=checked)}}
+
+
+
+ {% set checked='checked' %}
+ {% if s.9 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ Backup
+
+ {{checkbox('do_edit_backup', checked=checked)}}
+
+
+
+
+
+
+ {% set checked='checked' %}
+ {% if s.2 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ Private IP
+
+ {{checkbox('do_edit_private_networking', checked=checked)}}
+
+
+
+ {% set checked='checked' %}
+ {% if s.3 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ Floating Ip
+
+ {{checkbox('do_edit_floating_ip', checked=checked)}}
+
+
+
+ {% set checked='checked' %}
+ {% if s.8 == 'false' %}
+ {% set checked='' %}
+ {% endif %}
+ Firewall
+
+ {{checkbox('do_edit_firewall', checked=checked)}}
+ HAProxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed
+
+
+
+
+ Be aware: some changes may cause server re-creation. And all your data will be lost
+
+
+
+
+
+{% endfor %}
\ No newline at end of file
diff --git a/app/templates/ajax/provisioning/providers.html b/app/templates/ajax/provisioning/providers.html
new file mode 100644
index 00000000..02f7914f
--- /dev/null
+++ b/app/templates/ajax/provisioning/providers.html
@@ -0,0 +1,39 @@
+{% for p in providers %}
+
+ {{p.1}}
+
+
+ {% if p.2 == 'do' %}
+ DigitalOcean
+ {% set onclickEditAction = 'editDoProvider' %}
+ {% elif p.2 == 'aws' %}
+ AWS
+ {% set onclickEditAction = 'editAwsProvider' %}
+ {% endif %}
+
+
+ {% if role == 1 %}
+
+ {% for g in groups %}
+ {% if adding %}
+ {% if user_group|int() == g.0|int() %}
+ {{ g.1 }}
+ {% endif %}
+ {% else %}
+ {% if p.3|int() == g.0|int() %}
+ {{ g.1 }}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+ {% else %}
+ user_group
+ {% endif %}
+
+
+
+
+
+
+
+{% endfor %}
\ No newline at end of file
diff --git a/app/templates/ajax/provisioning/provisioned_servers.html b/app/templates/ajax/provisioning/provisioned_servers.html
new file mode 100644
index 00000000..ad38e481
--- /dev/null
+++ b/app/templates/ajax/provisioning/provisioned_servers.html
@@ -0,0 +1,71 @@
+{% for s in servers %}
+
+ {{s.1}}
+
+ {% for p in providers %}
+ {% if p.0|int() == s.2|int() %}
+ {{ p.1 }}
+ {{p.0}}
+ {% endif %}
+ {% endfor %}
+
+ {% if role == 1 %}
+
+ {% for g in groups %}
+ {% if adding %}
+ {% if user_group|int() == g.0|int() %}
+ {{ g.1 }}
+ {{ g.0 }}
+ {% endif %}
+ {% else %}
+ {% if s.4|int() == g.0|int() %}
+ {{ g.1 }}
+ {{ g.0 }}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+ {% else %}
+ {{user_group}}
+ {% endif %}
+
+ {% if s.3 == 'do' %}
+ DigitalOcean
+ {% set onclickEditAction = 'editDoServer' %}
+ {% elif s.3 == 'aws' %}
+ AWS
+ {% set onclickEditAction = 'editAwsServer' %}
+ {% endif %}
+ {{s.3}}
+
+
+ {{s.8}}
+
+
+ {{s.9}}
+
+
+ {{s.10}}
+
+
+ {{s.5}}
+
+
+ {% if s.6 == 'Created ' %}
+ {% set style='сolor: green;' %}
+ {% elif s.6 == 'Error ' %}
+ {% set style='color: red;cursor: help;' %}
+ {% endif %}
+ {{s.6}}
+
+
+ {{s.7}}
+
+
+
+
+
+
+
+
+{% endfor %}
\ No newline at end of file
diff --git a/app/templates/base.html b/app/templates/base.html
index 5e166219..8b55ca0a 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -117,6 +117,7 @@
+
diff --git a/app/templates/include/provisioning/creating_dialogs.html b/app/templates/include/provisioning/creating_dialogs.html
new file mode 100644
index 00000000..913825a5
--- /dev/null
+++ b/app/templates/include/provisioning/creating_dialogs.html
@@ -0,0 +1,332 @@
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+
+
+
+ Server name
+ *
+
+
+ {{input('do_create_server_name', required='required', size='30')}}
+ The name must contain only URL safe characters, and no path separators
+
+
+ {% if role == 1 %}
+
+
+ Group
+ *
+
+
+
+ {% for group in groups %}
+ {{ group.1 }}
+ {% endfor %}
+
+
+
+ {% else %}
+ {{input('do_create_group', value=groups, type='hidden')}}
+ {% endif %}
+
+
+ Provider credentials
+ *
+
+
+
+ {% for p in providers %}
+ {% if p.2 == 'do' %}
+ {{ p.1 }}
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+ Region
+ *
+
+
+ {% 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) }}
+ Not all regions may be active
+
+
+
+
+
+
+
+ Size
+ *
+
+ {{input('do_create_size', required='required', size='30')}}
+
+
+
+ OS
+ *
+
+
+ {% 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) }}
+
+
+
+
+ SSH
+ *
+
+
+
+ Choose SSH
+ Set SSH key name
+ Set SSH key ids
+
+
+
+
+
+ SSH key ids
+ *
+
+
+ {{input('do_create_ssh_ids', size='30')}}
+ List comma separated. Required if SSH key name is empty
+
+
+
+
+ SSH key name
+ *
+
+
+ {{input('do_create_ssh_name', size='30')}}
+ Required if SSH key ids is empty
+
+
+
+ Monitoring
+ {{checkbox('do_create_monitoring', checked='checked')}}
+
+
+ Backup
+ {{checkbox('do_create_backup')}}
+
+
+
+
+
+ Private IP
+ {{checkbox('do_create_private_net', checked='checked')}}
+
+
+ Floating IP
+ {{checkbox('do_create_floating_net')}}If unchecked then will be used public IP
+
+
+ Firewall
+
+ {{checkbox('do_create_firewall', checked='checked')}}
+ HAProxy-WI will create firewall and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be opened
+
+
+
+
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+
+
+
+ Server name
+ *
+
+
+ {{input('aws_create_server_name', required='required', size='30')}}
+ The name must contain only URL safe characters, and no path separators
+
+
+ {% if role == 1 %}
+
+
+ Group
+ *
+
+
+
+ {% for group in groups %}
+ {{ group.1 }}
+ {% endfor %}
+
+
+
+ {% else %}
+ {{input('aws_create_group', value=groups, type='hidden')}}
+ {% endif %}
+
+
+ Provider credentials
+ *
+
+
+
+ {% for p in providers %}
+ {% if p.2 == 'aws' %}
+ {{ p.1 }}
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+ Region
+ *
+
+
+ {% 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) }}
+ Not all regions may be active
+
+
+
+
+
+
+
+ Instance type
+ *
+
+
+ {{input('aws_create_size', required='required', size='30')}}
+
+
+
+
+
+ OS
+ *
+
+
+ {% 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) }}
+
+
+
+
+ SSH key pair name
+ *
+
+
+ {{input('aws_create_ssh_name', size='30')}}
+ SSH key must exists in region where instance create
+
+
+
+
+
+
+
+ Volume size
+ *
+
+
+ {{input('aws_create_volume_size', size='30', value='10', type='number')}}
+ Size in GB
+
+
+
+ Delete on termination
+
+ {{checkbox('aws_create_delete_on_termination', checked='checked')}}
+ Whether the volume should be destroyed on instance termination
+
+
+
+
+
+
+ Public IP
+
+
+ Public IP
+ Elastic IP
+ None
+
+
+
+
+ Firewall
+
+ {{checkbox('aws_create_firewall', checked='checked')}}
+ HAProxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed
+
+
+
+
+
+
+ Creating environment...
+ Creating vars...
+ Validation...
+ Creating workspace...
+ Creating server...
+
+
+
+
+
+
+
+
+ Updating environment...
+ Updating vars...
+ Validation...
+ Updating workspace...
+ Updating server...
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/templates/include/provisioning/providers_dialogs.html b/app/templates/include/provisioning/providers_dialogs.html
new file mode 100644
index 00000000..4fbd0e5c
--- /dev/null
+++ b/app/templates/include/provisioning/providers_dialogs.html
@@ -0,0 +1,142 @@
+{% set providers_for_choose = dict() %}
+{% set providers_for_choose = {'aws':'AWS','do':'DigitalOcean'} %}
+
+ {{ select('add_select_providers', values=providers_for_choose) }}
+
+
+ {{ select('create_select_providers', values=providers_for_choose) }}
+
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+ Provider name
+ *
+
+ {{input('aws_new_name', required='required', size='30')}}
+
+ {% if role == 1 %}
+
+
+ Group
+ *
+
+
+
+ {% for group in groups %}
+ {{ group.1 }}
+ {% endfor %}
+
+
+
+ {% else %}
+ {{input('aws_new_group', value=groups, type='hidden')}}
+ {% endif %}
+
+
+ ACCESS_KEY
+ *
+
+ {{input('aws_new_key', required='required', size='30')}}
+
+
+
+ SECRET_KEY
+ *
+
+ {{input('aws_new_secret', required='required', size='30')}}
+
+
+
+ How to get the AWS access key read
here
+
+
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+ Provider name
+ *
+
+ {{input('do_new_name', required='required', size='30')}}
+
+ {% if role == 1 %}
+
+
+ Group
+ *
+
+
+
+ {% for group in groups %}
+ {{ group.1 }}
+ {% endfor %}
+
+
+
+ {% else %}
+ {{input('do_new_group', value=groups, type='hidden')}}
+ {% endif %}
+
+
+ TOKEN
+ *
+
+ {{input('do_new_token', required='required', size='30')}}
+
+
+
+ How to get the DigitalOcean token read
here
+
+
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+ Provider name
+ *
+
+ {{input('aws_edit_provider_name', required='required', size='30')}}
+
+ {{input('aws_edit_provider_group', value=groups, type='hidden')}}
+ {{input('aws_edit_provider_id', type='hidden')}}
+
+
+ ACCESS_KEY
+ *
+
+ {{input('aws_edit_provider_key', required='required', size='30')}}
+
+
+
+ SECRET_KEY
+ *
+
+ {{input('aws_edit_provider_secret', required='required', size='30')}}
+
+
+
+
+
+ {% include 'include/tr_validate_tips.html' %}
+
+
+ Provider name
+ *
+
+ {{input('do_edit_provider_name', required='required', size='30')}}
+
+ {{input('do_edit_provider_group', value=groups, type='hidden')}}
+ {{input('do_edit_provider_id', type='hidden')}}
+
+
+ TOKEN
+ *
+
+ {{input('do_edit_provider_token', required='required', size='30')}}
+
+
+
\ No newline at end of file
diff --git a/app/templates/provisioning.html b/app/templates/provisioning.html
new file mode 100644
index 00000000..8e24b702
--- /dev/null
+++ b/app/templates/provisioning.html
@@ -0,0 +1,64 @@
+{% extends "base.html" %}
+{% block content %}
+{% from 'include/input_macros.html' import input, select, checkbox %}
+
+
+
+{% include 'include/del_confirm.html' %}
+
+
+
+
+
+
+
+ Name
+ Provider
+ {% if role == 1 %}
+ Group
+ {% endif %}
+ Cloud
+ Region
+ OS
+ IP
+ Instance type
+ Status
+ Created at
+
+
+
+
+
+ {% include 'ajax/provisioning/provisioned_servers.html' %}
+
+
+
+ Add
+
+
+
+
+
+ Name
+ Cloud
+ {% if role == 1 %}
+ Group
+ {% endif %}
+
+
+
+
+
+ {% include 'ajax/provisioning/providers.html' %}
+
+
+
+ Add
+
+
+{% include 'include/provisioning/creating_dialogs.html' %}
+{% include 'include/provisioning/providers_dialogs.html' %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/config_other/httpd/haproxy-wi.conf b/config_other/httpd/haproxy-wi.conf
index dc8a7b73..d0f163f3 100644
--- a/config_other/httpd/haproxy-wi.conf
+++ b/config_other/httpd/haproxy-wi.conf
@@ -35,6 +35,10 @@
Order Deny,Allow
Deny from all
+
+
+ Deny from all
+
Order Deny,Allow
diff --git a/inc/provisioning.css b/inc/provisioning.css
new file mode 100644
index 00000000..1cba701d
--- /dev/null
+++ b/inc/provisioning.css
@@ -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;
+}
\ No newline at end of file
diff --git a/inc/provisioning.js b/inc/provisioning.js
new file mode 100644
index 00000000..cbd4d5ba
--- /dev/null
+++ b/inc/provisioning.js
@@ -0,0 +1,1380 @@
+$( function() {
+ $('#add-provider-button').click(function() {
+ addProvidersChoosing.dialog('open');
+ });
+ $('#create-provider-button').click(function() {
+ createProvidersChoosing.dialog('open');
+ });
+ $('#do_create_ssh_choose').on('selectmenuchange', function (){
+ if ($('#do_create_ssh_choose option:selected').val() == 'ssh_name') {
+ $('#do_create_ssh_name_tr').show();
+ $('#do_create_ssh_ids_tr').hide();
+ } else if ($('#do_create_ssh_choose option:selected').val() == 'ssh_ids') {
+ $('#do_create_ssh_name_tr').hide();
+ $('#do_create_ssh_ids_tr').show();
+ }
+ });
+});
+var addProvidersChoosing = $( "#add_providers_choosing" ).dialog({
+ autoOpen: false,
+ width: 250,
+ modal: true,
+ title: "Add a new provider",
+ buttons: {
+ "Add": function() {
+ addProvider($('#add_select_providers option:selected').val());
+ $( this ).dialog( "close" );
+ clearTips();
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ clearTips();
+ }
+ }
+ });
+var createProvidersChoosing = $( "#create_providers_choosing" ).dialog({
+ autoOpen: false,
+ width: 250,
+ modal: true,
+ title: "Choose provider for provisioning",
+ buttons: {
+ "Choose": function() {
+ CreateServer($('#create_select_providers option:selected').val());
+ $( this ).dialog( "close" );
+ clearTips();
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ clearTips();
+ }
+ }
+ });
+var awsProvider = $( "#aws_provider" ).dialog({
+ autoOpen: false,
+ width: 574,
+ modal: true,
+ title: "Add AWS as provider",
+ buttons: {
+ "Add": function() {
+ addAwsProvider($( this ));
+ clearTips();
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ addProvidersChoosing.dialog('open');
+ clearTips();
+ }
+ }
+});
+var doProvider = $( "#do_provider" ).dialog({
+ autoOpen: false,
+ width: 574,
+ modal: true,
+ title: "Add DigitalOcean as provider",
+ buttons: {
+ "Add": function() {
+ addDoProvider($( this ));
+ clearTips();
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ addProvidersChoosing.dialog('open');
+ clearTips();
+ }
+ }
+});
+var doCreate = $( "#do_create" ).dialog({
+ autoOpen: false,
+ width: 574,
+ modal: true,
+ title: "Create a new Droplet in DigitalOcean",
+ buttons: {
+ "Create": function() {
+ doCreateServer($(this));
+ clearTips();
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ createProvidersChoosing.dialog('open');
+ clearTips();
+ }
+ }
+});
+var awsCreate = $( "#aws_create" ).dialog({
+ autoOpen: false,
+ width: 574,
+ modal: true,
+ title: "Create a new Instance in AWS",
+ buttons: {
+ "Create": function() {
+ awsCreateServer($(this));
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ createProvidersChoosing.dialog('open');
+ clearTips();
+ }
+ }
+});
+var creatingServer = $( "#server_creating" ).dialog({
+ autoOpen: false,
+ height: 420,
+ width: 574,
+ modal: true,
+ title: "Server is creating",
+ buttons: {
+ Close: function() {
+ $( this ).dialog( "close" );
+ $('#wait-mess').show();
+ cleanProvisioningProccess('#server_creating ul li', '#created-mess');
+ remove_button_after_server_created();
+ hideProvisioningError('#creating-error');
+ clearTips();
+ }
+ }
+});
+var editingServer = $( "#server_editing" ).dialog({
+ autoOpen: false,
+ height: 420,
+ width: 574,
+ modal: true,
+ title: "Server is editing",
+ buttons: {
+ Close: function() {
+ $( this ).dialog( "close" );
+ $('#editing-wait-mess').show();
+ cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
+ hideProvisioningError('#editing-error');
+ clearTips();
+ $('#edited-mess').html('');
+ $('#edited-mess').hide();
+ }
+ }
+});
+function addProvider(provider) {
+ if (provider == 'aws') {
+ awsProvider.dialog('open');
+ } else if (provider == 'do') {
+ doProvider.dialog('open');
+ } else {
+ toastr.error('Choose provider before adding');
+ }
+}
+function CreateServer(provider) {
+ if (provider == 'aws') {
+ awsCreate.dialog('open');
+ } else if (provider == 'do') {
+ doCreate.dialog('open');
+ } else {
+ toastr.error('Choose provider before creating server');
+ }
+}
+function doCreateServer(dialog_id) {
+ var valid = true;
+ toastr.clear();
+ allFields = $( [] ).add( $('#do_create_server_name') ).add( $('#do_create_size'))
+ .add( $('#do_create_regions') );
+ allFields.removeClass( "ui-state-error" );
+ valid = valid && checkLength( $('#do_create_server_name'), "Server name", 1 );
+ valid = valid && checkLength( $('#do_create_size'), "Droplet size", 1 );
+ if (valid) {
+ clearTips();
+ dialog_id.dialog('close');
+ startCreatingServer('do');
+ }
+}
+function awsCreateServer(dialog_id) {
+ var valid = true;
+ toastr.clear();
+ allFields = $( [] ).add( $('#aws_create_server_name') ).add( $('#aws_create_size')).add( $('#aws_create_ssh_name'))
+ .add( $('#aws_create_volume_size'));
+ allFields.removeClass( "ui-state-error" );
+ valid = valid && checkLength( $('#aws_create_server_name'), "Server name", 1 );
+ valid = valid && checkLength( $('#aws_create_size'), "Instance type", 1 );
+ valid = valid && checkLength( $('#aws_create_ssh_name'), "SSH key pair name", 1 );
+ valid = valid && checkLength( $('#aws_create_volume_size'), "Volume size", 1 );
+ if(valid) {
+ clearTips();
+ dialog_id.dialog('destroy');
+ startCreatingServer('aws');
+ }
+}
+function awsEditServer(dialog_id, server_id) {
+ var valid = true;
+ toastr.clear();
+ allFields = $( [] ).add( $('#aws_edit_size')).add( $('#aws_edit_ssh_name')).add( $('#aws_edit_volume_size'));
+ allFields.removeClass( "ui-state-error" );
+ valid = valid && checkLength( $('#aws_edit_size'), "Instance type", 1 );
+ valid = valid && checkLength( $('#aws_edit_ssh_name'), "SSH key pair name", 1 );
+ valid = valid && checkLength( $('#aws_edit_volume_size'), "Volume size", 1 );
+ if(valid) {
+ clearTips();
+ dialog_id.dialog('destroy');
+ startEditingServer('aws', server_id);
+ $('#editing-wait-mess').show();
+ }
+
+}
+function startCreatingServer(provider) {
+ $("#wait-mess").html(wait_mess);
+ creatingServer.dialog('open');
+ if (provider == 'aws') {
+ awsInitServer();
+ } else if (provider == 'do') {
+ doInitServer();
+ }
+ $.getScript("/inc/fontawesome.min.js");
+}
+function startEditingServer(provider, server_id) {
+ $("#editing-wait-mess").html(wait_mess);
+ editingServer.dialog('open');
+ if (provider == 'aws') {
+ awsEditInitServer(server_id);
+ } else if (provider == 'do') {
+ doEditInitServer(server_id);
+ }
+ $.getScript("/inc/fontawesome.min.js");
+}
+function awsInitServer() {
+ $('#creating-init').addClass('proccessing');
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awsinit: 1,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
+ } else {
+ showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress');
+ awsVarsServer();
+ }
+ }
+ } );
+}
+function awsVarsServer() {
+ var aws_create_floating_net = 'false';
+ var aws_create_firewall = 'false';
+ var aws_create_public_ip = 'false';
+ var aws_create_delete_on_termination = 'false';
+ if ($('#aws_create_firewall').is(':checked')) {
+ aws_create_firewall = 'true';
+ }
+ if ($('#aws_create_delete_on_termination').is(':checked')) {
+ aws_create_delete_on_termination = 'true';
+ }
+ if ($('#aws_create_public_ip option:selected').val() == 'public') {
+ aws_create_public_ip = 'true';
+ } else if ($('#aws_create_public_ip option:selected').val() == 'elastic') {
+ aws_create_floating_net = 'true';
+ }
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awsvars: $('#aws_create_server_name').val(),
+ aws_create_group: $('#aws_create_group').val(),
+ aws_create_provider: $('#aws_create_provider').val(),
+ aws_create_regions: $('#aws_create_regions').val(),
+ aws_create_size: $('#aws_create_size').val(),
+ aws_create_oss: $('#aws_create_oss').val(),
+ aws_create_ssh_name: $('#aws_create_ssh_name').val(),
+ aws_create_volume_size: $('#aws_create_volume_size').val(),
+ delete_on_termination: delete_on_termination,
+ aws_create_floating_net: aws_create_floating_net,
+ aws_create_firewall: aws_create_firewall,
+ aws_create_public_ip: aws_create_public_ip,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
+ } else {
+ showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress');
+ awsValidateServer();
+ }
+ }
+ } );
+}
+function awsValidateServer() {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awsvalidate: $('#aws_create_server_name').val(),
+ aws_create_group: $('#aws_create_group').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
+ } else {
+ showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress');
+ awsWorkspaceServer();
+ }
+ }
+ } );
+}
+function awsWorkspaceServer() {
+ var aws_create_floating_net = 'false';
+ var aws_create_firewall = 'false';
+ var aws_create_public_ip = 'false';
+ var aws_create_delete_on_termination = 'false';
+ if ($('#aws_create_firewall').is(':checked')) {
+ aws_create_firewall = 'true';
+ }
+ if ($('#aws_create_delete_on_termination').is(':checked')) {
+ aws_create_delete_on_termination = 'true';
+ }
+ if ($('#aws_create_public_ip option:selected').val() == 'public') {
+ aws_create_public_ip = 'true';
+ } else if ($('#aws_create_public_ip option:selected').val() == 'elastic') {
+ aws_create_floating_net = 'true';
+ }
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awsworkspace: $('#aws_create_server_name').val(),
+ aws_create_group: $('#aws_create_group').val(),
+ aws_create_provider: $('#aws_create_provider option:selected').val(),
+ aws_create_regions: $('#aws_create_regions').val(),
+ aws_create_size: $('#aws_create_size').val(),
+ aws_create_oss: $('#aws_create_oss option:selected').val(),
+ aws_create_ssh_name: $('#aws_create_ssh_name').val(),
+ aws_create_volume_size: $('#aws_create_volume_size').val(),
+ aws_create_delete_on_termination: aws_create_delete_on_termination,
+ aws_create_floating_net: aws_create_floating_net,
+ aws_create_firewall: aws_create_firewall,
+ aws_create_public_ip: aws_create_public_ip,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ var server_id = $('#ajax-provisioning-body tr td span:regex(id, sever-ip-)').last().attr('id').split('-')[2]
+ showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
+ $('#sever-status-'+server_id).text('Error');
+ $('#sever-status-'+server_id).attr('title', data);
+ $('#sever-status-'+server_id).css('color', 'red');
+ } else {
+ showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress');
+ common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data);
+ awsProvisiningServer();
+ }
+ }
+ } );
+}
+function awsProvisiningServer() {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awsprovisining: $('#aws_create_server_name').val(),
+ aws_create_group: $('#aws_create_group').val(),
+ aws_create_provider: $('#aws_create_provider').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ var server_id = $('#ajax-provisioning-body tr td span:regex(id, sever-ip-)').last().attr('id').split('-')[2]
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
+ $('#sever-status-'+server_id).text('Error');
+ $('#sever-status-'+server_id).attr('title', data);
+ $('#sever-status-'+server_id).css('color', 'red');
+ } else {
+ showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress');
+ $('#wait-mess').hide();
+ $('#created-mess').html('Server has been created. Server IPs are:' + data);
+ $('#created-mess').show();
+ $('#sever-status-'+server_id).text('Created');
+ $('#sever-ip'+server_id).text(data);
+ add_button_after_server_created();
+ }
+ }
+ } );
+}
+function awsEditInitServer(server_id) {
+ $('#editing-init').addClass('proccessing');
+ $('#server-'+server_id).css('background-color', '#fff3cd');
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awsinit: 1,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
+ $('#server-'+server_id).css('background-color', '#fff');
+ add_button_after_server_edited(server_id)
+ } else {
+ showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress');
+ awsEditingVarsServer(server_id);
+ }
+ }
+ } );
+}
+function awsEditingVarsServer(server_id, dialog_id) {
+ var aws_edit_floating_net = 'false';
+ var aws_editing_firewall = 'false';
+ var aws_edit_public_ip = 'false';
+ var aws_edit_delete_on_termination = 'false';
+ if ($('#aws_edit_firewall').is(':checked')) {
+ aws_editing_firewall = 'true';
+ }
+ if ($('#aws_edit_delete_on_termination').is(':checked')) {
+ aws_edit_delete_on_termination = 'true';
+ }
+ if ($('#aws_edit_public_ip option:selected').val() == 'public') {
+ aws_edit_public_ip = 'true';
+ } else if ($('#aws_edit_public_ip option:selected').val() == 'elastic') {
+ aws_edit_floating_net = 'true';
+ }
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awseditvars: $('#aws_edit_server_name').text(),
+ aws_editing_group: $('#aws_edit_group').val(),
+ aws_editing_provider: $('#aws_edit_id_provider option:selected').val(),
+ aws_editing_regions: $('#aws_edit_region').text(),
+ aws_editing_size: $('#aws_edit_size').val(),
+ aws_editing_oss: $('#aws_edit_oss option:selected').val(),
+ aws_editing_ssh_name: $('#aws_edit_ssh_name').val(),
+ aws_editing_volume_size: $('#aws_edit_volume_size').val(),
+ aws_editing_delete_on_termination: aws_edit_delete_on_termination,
+ aws_editing_floating_net: aws_edit_floating_net,
+ aws_editing_firewall: aws_editing_firewall,
+ aws_editing_public_ip: aws_edit_public_ip,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
+ $('#server-'+server_id).css('background-color', '#fff');
+ add_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress');
+ awsEditValidateServer(server_id);
+ }
+ }
+ } );
+}
+function awsEditValidateServer(server_id) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awseditvalidate: $('#aws_edit_server_name').text(),
+ aws_edit_group: $('#aws_edit_group').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
+ $('#server-'+server_id).css('background-color', '#fff');
+ add_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress');
+ awsEditWorkspaceServer(server_id);
+ }
+ }
+ } );
+}
+function awsEditWorkspaceServer(server_id) {
+ var aws_edit_floating_net = 'false';
+ var aws_editing_firewall = 'false';
+ var aws_edit_public_ip = 'false';
+ var aws_edit_delete_on_termination = 'false';
+ if ($('#aws_edit_firewall').is(':checked')) {
+ aws_editing_firewall = 'true';
+ }
+ if ($('#aws_edit_delete_on_termination').is(':checked')) {
+ aws_edit_delete_on_termination = 'true';
+ }
+ if ($('#aws_edit_public_ip option:selected').val() == 'public') {
+ aws_edit_public_ip = 'true';
+ } else if ($('#aws_edit_public_ip option:selected').val() == 'elastic') {
+ aws_edit_floating_net = 'true';
+ }
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awseditworkspace: $('#aws_edit_server_name').text(),
+ aws_editing_group: $('#aws_edit_group').val(),
+ aws_editing_provider: $('#aws_edit_id_provider option:selected').val(),
+ aws_editing_regions: $('#aws_edit_region').text(),
+ aws_editing_size: $('#aws_edit_size').val(),
+ aws_editing_oss: $('#aws_edit_oss option:selected').val(),
+ aws_editing_ssh_name: $('#aws_edit_ssh_name').val(),
+ aws_editing_volume_size: $('#aws_edit_volume_size').val(),
+ aws_editing_delete_on_termination: aws_edit_delete_on_termination,
+ aws_editing_floating_net: aws_edit_floating_net,
+ aws_editing_firewall: aws_editing_firewall,
+ aws_editing_public_ip: aws_edit_public_ip,
+ server_id: server_id,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
+ showEditProvisioningError(data, server_id);
+ add_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress');
+ $('#sever-status-'+server_id).text('Editing');
+ $('#sever-status-'+server_id).css('color', '#000');
+ awsEditProvisiningServer(server_id);
+ }
+ }
+ } );
+}
+function awsEditProvisiningServer(server_id, dialog_id) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ awseditingprovisining: $('#aws_edit_server_name').text(),
+ aws_edit_group: $('#aws_edit_group').val(),
+ aws_edit_provider: $('#aws_edit_id_provider option:selected').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
+ showEditProvisioningError(data, server_id);
+ add_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress');
+ $('#editing-wait-mess').hide();
+ $('#edited-mess').html('Server has been changed. IPs are: ' + data);
+ $('#edited-mess').show();
+ $('#sever-status-'+server_id).text('Created');
+ $('#sever-size-'+server_id).text($('#aws_edit_size').val());
+ $('#sever-os-'+server_id).text($('#aws_edit_oss').val());
+ $('#server-'+server_id).css('background-color', '#fff');
+ $('#sever-status-'+server_id).css('color', '#000');
+ $('#sever-ip-'+server_id).text(data);
+ }
+ }
+ } );
+}
+function confirmDeleteProvisionedServer(id) {
+ $( "#dialog-confirm" ).dialog({
+ resizable: false,
+ height: "auto",
+ width: 400,
+ modal: true,
+ title: "Are you sure you want to delete " +$('#server-name-'+id).text() + "?",
+ buttons: {
+ "Delete": function() {
+ $( this ).dialog( "close" );
+ deleteProvisionedServer(id);
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ }
+ }
+ });
+}
+function deleteProvisionedServer(id) {
+ $("#server-"+id).css("background-color", "#f2dede");
+ $.ajax( {
+ url: "options.py",
+ data: {
+ provisiningdestroyserver: id,
+ servername: $('#server-name-'+id).text(),
+ type: $('#server-cloud-'+id).text(),
+ provider_id: $('#server-provider-'+id).text(),
+ group: $('#server-group-'+id).text(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if(data == "ok ") {
+ $("#server-"+id).remove();
+ } else if (data.indexOf('error: ') != '-1') {
+ toastr.error(data);
+ } else if (data.indexOf('warning: ') != '-1') {
+ toastr.clear();
+ toastr.warning(data);
+ }
+ }
+ } );
+}
+function editAwsServer(id) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ editAwsServer: id,
+ editAwsGroup: $('#server-group-'+id).text(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if (data.indexOf('error: ') != '-1') {
+ toastr.error(data);
+ } else if (data.indexOf('warning: ') != '-1') {
+ toastr.clear();
+ toastr.warning(data);
+ } else {
+ $('#ajax').html(data);
+ var awsEdit = $( "#aws_edit" ).dialog({
+ autoOpen: false,
+ width: 576,
+ modal: true,
+ title: "Editing AWS server: " + $('#server-name-'+id).text(),
+ close: function( event, ui ) {$( this ).dialog( "destroy" );},
+ buttons: {
+ "Edit": function() {
+ awsEditServer($(this), id);
+ },
+ Cancel: function() {
+ $( this ).dialog( "destroy" );
+ clearTips();
+ }
+ }
+ });
+ $( "select" ).selectmenu();
+ $( "input[type=checkbox]" ).checkboxradio();
+ $.getScript("/inc/fontawesome.min.js");
+ awsEdit.dialog('open');
+ }
+ }
+ } );
+}
+function editDoServer(id) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ editDoServer: id,
+ editDoGroup: $('#server-group-'+id).text(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if (data.indexOf('error: ') != '-1') {
+ toastr.error(data);
+ } else if (data.indexOf('warning: ') != '-1') {
+ toastr.clear();
+ toastr.warning(data);
+ } else {
+ $('#ajax').html(data);
+ var doEdit = $( "#do_edit" ).dialog({
+ autoOpen: false,
+ width: 576,
+ modal: true,
+ title: "Editing Do server: " + $('#server-name-'+id).text(),
+ close: function( event, ui ) {$( this ).dialog( "destroy" );},
+ buttons: {
+ "Edit": function() {
+ doEditServer($(this), id);
+ },
+ Cancel: function() {
+ $( this ).dialog( "destroy" );
+ clearTips();
+ }
+ }
+ });
+ $( "select" ).selectmenu();
+ $( "input[type=checkbox]" ).checkboxradio();
+ $.getScript("/inc/fontawesome.min.js");
+ doEdit.dialog('open');
+ }
+ }
+ } );
+}
+function add_button_after_server_created() {
+ var buttons = creatingServer.dialog("option", "buttons");
+ $.extend(buttons, { Back: function() {
+ $( this ).dialog( "close" );
+ awsCreate.dialog( "open" );
+ cleanProvisioningProccess('#server_creating ul li', '#created-mess');
+ $('#wait-mess').show();
+ $('#edited-mess').html('');
+ $('#edited-mess').hide();
+ hideProvisioningError('#creating-error');
+ } });
+ creatingServer.dialog("option", "buttons", buttons);
+}
+function add_do_button_after_server_created() {
+ var buttons = creatingServer.dialog("option", "buttons");
+ $.extend(buttons, { Back: function() {
+ $( this ).dialog( "close" );
+ doCreate.dialog( "open" );
+ cleanProvisioningProccess('#server_creating ul li', '#created-mess');
+ $('#wait-mess').show();
+ $('#edited-mess').html('');
+ $('#edited-mess').hide();
+ hideProvisioningError('#creating-error');
+ } });
+ creatingServer.dialog("option", "buttons", buttons);
+}
+function add_button_after_server_edited(server_id) {
+ var buttons = editingServer.dialog("option", "buttons");
+ $.extend(buttons, { Back: function() {
+ $( this ).dialog( "close" );
+ editAwsServer(server_id)
+ cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
+ $('#wait-mess').show();
+ $('#edited-mess').html('');
+ $('#edited-mess').hide();
+ hideProvisioningError('#editing-error');
+ } });
+ editingServer.dialog("option", "buttons", buttons);
+}
+function add_do_button_after_server_edited(server_id) {
+ var buttons = editingServer.dialog("option", "buttons");
+ $.extend(buttons, { Back: function() {
+ $( this ).dialog( "close" );
+ editDoServer(server_id);
+ cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
+ $('#wait-mess').show();
+ $('#edited-mess').html('');
+ $('#edited-mess').hide();
+ hideProvisioningError('#editing-error');
+ } });
+ editingServer.dialog("option", "buttons", buttons);
+}
+function remove_button_after_server_created() {
+ creatingServer.dialog("option",{buttons:{ Close: function() {
+ $( this ).dialog( "close" );
+ $('#creating-error').hide();
+ $('#wait-mess').show();
+ cleanProvisioningProccess('#server_creating ul li', 'created-mess');
+ clearTips();
+ }}}
+ );
+}
+function hideProvisioningError(error_id) {
+ $(error_id).html('');
+ $(error_id).hide();
+}
+function showProvisioningError(data, step_id, prev_step_id, wait_mess, error_id, progress_id, cloud, step, server_id) {
+ $(wait_mess).hide();
+ $(error_id).html(data);
+ $(error_id).show();
+ $(prev_step_id).removeClass('proccessing');
+ $(step_id).addClass('processing_error');
+ $(progress_id).val('0');
+ if(cloud == 'aws') {
+ add_button_after_server_created();
+ } else if (cloud == 'do') {
+ add_do_button_after_server_created();
+ }
+ $.getScript("/inc/fontawesome.min.js");
+}
+function showEditProvisioningError(data, server_id){
+ $('#server-'+server_id).css('background-color', '#fff');
+ $('#sever-status-'+server_id).text('Error');
+ $('#sever-status-'+server_id).attr('title', data);
+ $('#sever-status-'+server_id).css('color', 'red');
+ $('#sever-status-'+server_id).css('cursor', 'help');
+}
+function showProvisioningProccess(prev_step_id, step_id, next_step_id, progress_value, progress_id) {
+ $(prev_step_id).removeClass('proccessing');
+ $(step_id).addClass('proccessing_done');
+ $(step_id).removeClass('proccessing');
+ $(next_step_id).addClass('proccessing');
+ $(progress_id).val(progress_value);
+ $.getScript("/inc/fontawesome.min.js");
+}
+function cleanProvisioningProccess(div_id, success_div) {
+ $(success_div).hide();
+ $(div_id).each(function () {
+ $(this).removeClass('proccessing_done');
+ $(this).removeClass('processing_error');
+ $(this).removeClass('proccessing');
+ });
+ $.getScript("/inc/fontawesome.min.js");
+}
+function addDoProvider(dialog_id) {
+ var valid = true;
+ toastr.clear();
+ allFields = $( [] ).add( $('#do_new_name') ).add( $('#do_new_group')).add( $('#do_new_token') );
+ allFields.removeClass( "ui-state-error" );
+ valid = valid && checkLength( $('#do_new_name'), "Provider name", 1 );
+ valid = valid && checkLength( $('#do_new_group'), "Group", 1 );
+ valid = valid && checkLength( $('#do_new_token'), "Token", 1 );
+ if (valid) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ do_new_name: $('#do_new_name').val(),
+ do_new_group: $('#do_new_group').val(),
+ do_new_token: $('#do_new_token').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if (data.indexOf('error:') != '-1') {
+ toastr.error(data);
+ } else {
+ var getId = new RegExp('[0-9]+');
+ var id = data.match(getId);
+ $('select:regex(id, do_create_provider)').append('' +$('#do_new_name').val()+' ').selectmenu("refresh");
+ common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data);
+ }
+ }
+ } );
+ }
+}
+function addAwsProvider(dialog_id) {
+ var valid = true;
+ toastr.clear();
+ allFields = $( [] ).add( $('#aws_new_name') ).add( $('#aws_new_key') ).add( $('#aws_new_secret') );
+ allFields.removeClass( "ui-state-error" );
+ valid = valid && checkLength( $('#aws_new_name'), "Provider name", 1 );
+ valid = valid && checkLength( $('#aws_new_key'), "ACCESS_KEY", 1 );
+ valid = valid && checkLength( $('#aws_new_secret'), "SECRET_KEY", 1 );
+ if (valid) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ aws_new_name: $('#aws_new_name').val(),
+ aws_new_group: $('#aws_new_group').val(),
+ aws_new_key: $('#aws_new_key').val(),
+ aws_new_secret: $('#aws_new_secret').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if (data.indexOf('error:') != '-1') {
+ toastr.error(data);
+ } else {
+ var getId = new RegExp('[0-9]+');
+ var id = data.match(getId);
+ $('select:regex(id, aws_create_provider)').append('' +$('#aws_new_name').val()+' ').selectmenu("refresh");
+ common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data);
+ }
+ }
+ } );
+ }
+}
+function confirmDeleteProvider(id) {
+ $( "#dialog-confirm" ).dialog({
+ width: 400,
+ modal: true,
+ title: "Are you sure you want to delete " +$('#provider-name-'+id).val() + "?",
+ buttons: {
+ "Delete": function() {
+ $( this ).dialog( "close" );
+ removeProvider(id);
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ }
+ }
+ });
+}
+function removeProvider(id) {
+ $("#provider-"+id).css("background-color", "#f2dede");
+ $.ajax( {
+ url: "options.py",
+ data: {
+ providerdel: id,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if(data == "Ok ") {
+ $("#provider-"+id).remove();
+ } else if (data.indexOf('error:') != '-1') {
+ toastr.error(data);
+ }
+ }
+ } );
+}
+var doEditProvider = $( "#do_edit_provider" ).dialog({
+ autoOpen: false,
+ width: 574,
+ modal: true,
+ title: "Editing DigitalOcean provider",
+ buttons: {
+ "Edit": function() {
+ doEditProviderSave();
+ $( this ).dialog( "close" );
+ },
+ Cancel: function() {
+ $( this ).dialog( "close" );
+ clearTips();
+ }
+ }
+});
+function editDoProvider(id) {
+ $('#do_edit_provider_id').val(id);
+ name = $('#provider-name-'+id).text();
+ $('#do_edit_provider_name').val(name);
+ doEditProvider.dialog('open');
+}
+function doEditProviderSave() {
+ id = $('#do_edit_provider_id').val();
+ token = $('#do_edit_provider_token').val();
+ new_name = $('#do_edit_provider_name').val();
+ $.ajax( {
+ url: "options.py",
+ data: {
+ edit_do_provider: id,
+ edit_do_provider_name: new_name,
+ edit_do_provider_token: token,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if(data == "ok ") {
+ $("#provider-name-"+id).text(new_name);
+ $("#provider-"+id).addClass( "update", 1000 );
+ setTimeout(function() {
+ $( "#provider-"+id ).removeClass( "update" );
+ }, 2500 );
+ } else if (data.indexOf('error:') != '-1') {
+ toastr.error(data);
+ }
+ }
+ } );
+}
+var awsEditProvider = $("#aws_edit_provider").dialog({
+ autoOpen: false,
+ width: 574,
+ modal: true,
+ title: "Editing AWS provider",
+ buttons: {
+ "Edit": function () {
+ awsEditProviderSave($(this));
+ $( this ).dialog( "close" );
+ },
+ Cancel: function () {
+ $(this).dialog("close");
+ clearTips();
+ }
+ }
+});
+function editAwsProvider(id) {
+ $('#aws_edit_provider_id').val(id);
+ name = $('#provider-name-' + id).text();
+ $('#aws_edit_provider_name').val(name);
+ awsEditProvider.dialog('open');
+}
+function awsEditProviderSave() {
+ id = $('#aws_edit_provider_id').val();
+ new_name = $('#aws_edit_provider_name').val();
+ key = $('#aws_edit_provider_key').val();
+ secret = $('#aws_edit_provider_secret').val();
+ $.ajax( {
+ url: "options.py",
+ data: {
+ edit_aws_provider: id,
+ edit_aws_provider_name: new_name,
+ edit_aws_provider_key: key,
+ edit_aws_provider_secret: secret,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g,' ');
+ if(data == "ok ") {
+ $("#provider-name-"+id).text(new_name);
+ $("#provider-"+id).addClass( "update", 1000 );
+ setTimeout(function() {
+ $( "#provider-"+id ).removeClass( "update" );
+ }, 2500 );
+ } else if (data.indexOf('error:') != '-1') {
+ toastr.error(data);
+ }
+ }
+ } );
+}
+function doEditServer(dialog_id, server_id) {
+ var valid = true;
+ toastr.clear();
+ allFields = $( [] ).add( $('#do_edit_size'));
+ allFields.removeClass( "ui-state-error" );
+ valid = valid && checkLength( $('#do_edit_size'), "Droplet size", 1 );
+ if (valid) {
+ clearTips();
+ dialog_id.dialog('destroy');
+ startEditingServer('do', server_id);
+ $('#editing-wait-mess').show();
+ }
+}
+function doInitServer() {
+ $('#creating-init').addClass('proccessing');
+ $.ajax( {
+ url: "options.py",
+ data: {
+ doinit: 1,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'do');
+ } else {
+ showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress');
+ doVarsServer();
+ }
+ }
+ } );
+}
+
+function doEditInitServer(server_id) {
+ $('#editing-init').addClass('proccessing');
+ $('#server-'+server_id).css('background-color', '#fff3cd');
+ $.ajax( {
+ url: "options.py",
+ data: {
+ doinit: 1,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
+ $('#server-'+server_id).css('background-color', '#fff');
+ add_do_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress');
+ doEditVarsServer(server_id);
+ }
+ }
+ } );
+}
+function doEditVarsServer(server_id) {
+ var do_edit_private_net = 'false';
+ var do_edit_floating_net = 'false';
+ var do_edit_monitoring = 'false';
+ var do_edit_backup = 'false';
+ var do_edit_firewall = 'false';
+ if ($('#do_edit_private_networking').is(':checked')) {
+ do_edit_private_net = 'true';
+ }
+ if ($('#do_edit_floating_ip').is(':checked')) {
+ do_edit_floating_net = 'true';
+ }
+ if ($('#do_edit_monitoring').is(':checked')) {
+ do_edit_monitoring = 'true';
+ }
+ if ($('#do_edit_backup').is(':checked')) {
+ do_edit_backup = 'true';
+ }
+ if ($('#do_edit_firewall').is(':checked')) {
+ do_edit_firewall = 'true';
+ }
+ $.ajax({
+ url: "options.py",
+ data: {
+ doeditvars: $('#do_edit_server_name').text(),
+ do_edit_group: $('#do_edit_group').val(),
+ do_edit_provider: $('#do_edit_id_provider').val(),
+ do_edit_regions: $('#do_edit_regions').text(),
+ do_edit_size: $('#do_edit_size').val(),
+ do_edit_oss: $('#do_edit_oss').val(),
+ do_edit_ssh_name: $('#do_edit_ssh_name').val(),
+ do_edit_ssh_ids: $('#do_edit_ssh_ids').val(),
+ do_edit_backup: do_edit_backup,
+ do_edit_private_net: do_edit_private_net,
+ do_edit_floating_net: do_edit_floating_net,
+ do_edit_monitoring: do_edit_monitoring,
+ do_edit_firewall: do_edit_firewall,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function (data) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
+ $('#server-'+server_id).css('background-color', '#fff');
+ add_do_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress');
+ doEditValidateServer(server_id)
+ }
+ }
+ });
+}
+function doEditValidateServer(server_id) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ doeditvalidate: $('#do_edit_server_name').text(),
+ do_edit_group: $('#do_edit_group').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
+ $('#server-'+server_id).css('background-color', '#fff');
+ add_do_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress');
+ doEditWorkspaceServer(server_id);
+ }
+ }
+ } );
+}
+function doEditWorkspaceServer(server_id) {
+ var do_edit_private_net = 'false';
+ var do_edit_floating_net = 'false';
+ var do_edit_monitoring = 'false';
+ var do_edit_backup = 'false';
+ var do_edit_firewall = 'false';
+ if ($('#do_edit_private_networking').is(':checked')) {
+ do_edit_private_net = 'true';
+ }
+ if ($('#do_edit_floating_ip').is(':checked')) {
+ do_edit_floating_net = 'true';
+ }
+ if ($('#do_edit_monitoring').is(':checked')) {
+ do_edit_monitoring = 'true';
+ }
+ if ($('#do_edit_backup').is(':checked')) {
+ do_edit_backup = 'true';
+ }
+ if ($('#do_edit_firewall').is(':checked')) {
+ do_edit_firewall = 'true';
+ }
+ $.ajax({
+ url: "options.py",
+ data: {
+ doeditworkspace: $('#do_edit_server_name').text(),
+ do_edit_group: $('#do_edit_group').val(),
+ do_edit_provider: $('#do_edit_id_provider').val(),
+ do_edit_regions: $('#do_edit_regions').text(),
+ do_edit_size: $('#do_edit_size').val(),
+ do_edit_oss: $('#do_edit_oss').val(),
+ do_edit_ssh_name: $('#do_edit_ssh_name').val(),
+ do_edit_ssh_ids: $('#do_edit_ssh_ids').val(),
+ do_edit_private_net: do_edit_private_net,
+ do_edit_floating_net: do_edit_floating_net,
+ do_edit_monitoring: do_edit_monitoring,
+ do_edit_backup: do_edit_backup,
+ do_edit_firewall: do_edit_firewall,
+ server_id: server_id,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
+ showEditProvisioningError(data, server_id);
+ add_do_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress');
+ $('#sever-status-'+server_id).text('Editing');
+ $('#sever-status-'+server_id).css('color', '#000');
+ doEditProvisiningServer(server_id);
+ }
+ }
+ } );
+}
+function doEditProvisiningServer(server_id) {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ doeditprovisining: $('#do_edit_server_name').text(),
+ do_edit_group: $('#do_edit_group').val(),
+ do_edit_provider: $('#do_edit_id_provider').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
+ showEditProvisioningError(data, server_id);
+ add_do_button_after_server_edited(server_id);
+ } else {
+ showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress');
+ $('#editing-wait-mess').hide();
+ $('#edited-mess').html('Server has been changed. IPs are: ' + data);
+ $('#edited-mess').show();
+ $('#sever-status-'+server_id).text('Created');
+ $('#sever-size-'+server_id).text($('#aws_edit_size').val());
+ $('#sever-os-'+server_id).text($('#aws_edit_oss').val());
+ $('#server-'+server_id).css('background-color', '#fff');
+ $('#sever-ip-'+server_id).text(data);
+ }
+ }
+ } );
+}
+function doVarsServer() {
+ var do_create_private_net = 'false';
+ var do_create_floating_net = 'false';
+ var do_create_monitoring = 'false';
+ var do_create_backup = 'false';
+ var do_create_firewall = 'false';
+ if ($('#do_create_private_net').is(':checked')) {
+ do_create_private_net = 'true';
+ }
+ if ($('#do_create_floating_net').is(':checked')) {
+ do_create_floating_net = 'true';
+ }
+ if ($('#do_create_monitoring').is(':checked')) {
+ do_create_monitoring = 'true';
+ }
+ if ($('#do_create_backup').is(':checked')) {
+ do_create_backup = 'true';
+ }
+ if ($('#do_create_backup').is(':checked')) {
+ do_create_firewall = 'true';
+ }
+ $.ajax({
+ url: "options.py",
+ data: {
+ dovars: $('#do_create_server_name').val(),
+ do_create_group: $('#do_create_group').val(),
+ do_create_provider: $('#do_create_provider').val(),
+ do_create_regions: $('#do_create_regions').val(),
+ do_create_size: $('#do_create_size').val(),
+ do_create_oss: $('#do_create_oss').val(),
+ do_create_ssh_name: $('#do_create_ssh_name').val(),
+ do_create_ssh_ids: $('#do_create_ssh_ids').val(),
+ do_create_backup: do_create_backup,
+ do_create_private_net: do_create_private_net,
+ do_create_floating_net: do_create_floating_net,
+ do_create_monitoring: do_create_monitoring,
+ do_create_firewall: do_create_firewall,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function (data) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'do');
+ } else {
+ showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress');
+ doValidateServer();
+ }
+ }
+ });
+}
+function doValidateServer() {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ dovalidate: $('#do_create_server_name').val(),
+ do_create_group: $('#do_create_group').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1') {
+ showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'do');
+ } else {
+ showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress');
+ doWorkspaceServer();
+ }
+ }
+ } );
+}
+function doWorkspaceServer() {
+ var do_create_private_net = 'false';
+ var do_create_floating_net = 'false';
+ var do_create_monitoring = 'false';
+ var do_create_backup = 'false';
+ var do_create_firewall = 'false';
+ if ($('#do_create_private_net').is(':checked')) {
+ do_create_private_net = 'true';
+ }
+ if ($('#do_create_floating_net').is(':checked')) {
+ do_create_floating_net = 'true';
+ }
+ if ($('#do_create_monitoring').is(':checked')) {
+ do_create_monitoring = 'true';
+ }
+ if ($('#do_create_backup').is(':checked')) {
+ do_create_backup = 'true';
+ }
+ if ($('#do_create_backup').is(':checked')) {
+ do_create_firewall = 'true';
+ }
+ $.ajax({
+ url: "options.py",
+ data: {
+ doworkspace: $('#do_create_server_name').val(),
+ do_create_group: $('#do_create_group').val(),
+ do_create_provider: $('#do_create_provider').val(),
+ do_create_regions: $('#do_create_regions').val(),
+ do_create_size: $('#do_create_size').val(),
+ do_create_oss: $('#do_create_oss').val(),
+ do_create_ssh_name: $('#do_create_ssh_name').val(),
+ do_create_ssh_ids: $('#do_create_ssh_ids').val(),
+ do_create_backup: do_create_backup,
+ do_create_private_net: do_create_private_net,
+ do_create_floating_net: do_create_floating_net,
+ do_create_monitoring: do_create_monitoring,
+ do_create_firewall: do_create_firewall,
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'do');
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().text('Error');
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().attr('title', data);
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().css('color', 'red');
+ } else {
+ showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress');
+ common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data);
+ doProvisiningServer();
+ }
+ }
+ } );
+}
+function doProvisiningServer() {
+ $.ajax( {
+ url: "options.py",
+ data: {
+ doprovisining: $('#do_create_server_name').val(),
+ do_create_group: $('#do_create_group').val(),
+ do_create_provider: $('#do_create_provider').val(),
+ token: $('#token').val()
+ },
+ type: "POST",
+ success: function( data ) {
+ data = data.replace(/\s+/g, ' ');
+ if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
+ showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'do');
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().text('Error');
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().attr('title', data);
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().css('color', 'red');
+ } else {
+ showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress');
+ $('#wait-mess').hide();
+ $('#created-mess').html('Server has been created. Server IPs are: ' + data);
+ $('#created-mess').show();
+ $('#ajax-provisioning-body tr td span:regex(id, sever-status-)').last().text('Created');
+ $('#ajax-provisioning-body tr td span:regex(id, sever-ip-)').last().text(data);
+ add_do_button_after_server_created();
+ }
+ }
+ } );
+}
\ No newline at end of file
diff --git a/inc/script.js b/inc/script.js
index a49346de..cf305cbe 100644
--- a/inc/script.js
+++ b/inc/script.js
@@ -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",