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 %} + +{% 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 %} + +{% 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 %} + + {% 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 }} + + {% endif %} + {% endfor %} + + {% if role == 1 %} + + {% for g in groups %} + {% if adding %} + {% if user_group|int() == g.0|int() %} + {{ g.1 }} + + {% endif %} + {% else %} + {% if s.4|int() == g.0|int() %} + {{ g.1 }} + + {% endif %} + {% endif %} + {% endfor %} + + {% else %} + + {% endif %} + + {% if s.3 == 'do' %} + DigitalOcean + {% set onclickEditAction = 'editDoServer' %} + {% elif s.3 == 'aws' %} + AWS + {% set onclickEditAction = 'editAwsServer' %} + {% endif %} + + + + {{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 @@
  • Settings
  • Proxy installation
  • Monitoring installation
  • +
  • Server provisioning
  • Internal logs
  • Backups
  • 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 @@ + + + + \ 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'} %} + + + + + + \ 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' %} +
    + + +
    + + + + + + {% if role == 1 %} + + {% endif %} + + + + + + + + + + + + + {% include 'ajax/provisioning/provisioned_servers.html' %} + +
    NameProviderGroupCloudRegionOSIPInstance typeStatusCreated at
    +
    + Add +
    +
    + + + + + + {% if role == 1 %} + + {% endif %} + + + + + + {% include 'ajax/provisioning/providers.html' %} + +
    NameCloudGroup
    +
    + 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('').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('').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",