From 47dfa23d216b5d39c3b762cc304be8e9d725f4e9 Mon Sep 17 00:00:00 2001 From: Aidaho12 Date: Mon, 16 Apr 2018 13:01:44 +0600 Subject: [PATCH] v2.0 Meet Haproxy-wi 2.0! Now with DB and Admin web interface! Life has become easier, life has become more cheerful! --- README.md | 13 +- cgi-bin/add.py | 15 +- cgi-bin/config.py | 1 - cgi-bin/configver.py | 7 +- cgi-bin/create_db.py | 66 +++++++ cgi-bin/delver.py | 2 +- cgi-bin/edit.py | 9 +- cgi-bin/funct.py | 106 +++-------- cgi-bin/groups | 3 - cgi-bin/listserv.py | 7 - cgi-bin/login.py | 25 +-- cgi-bin/logs.py | 9 +- cgi-bin/options.py | 2 +- cgi-bin/ovw.py | 71 ++++---- cgi-bin/sql.py | 412 ++++++++++++++++++++++++++++++++++++++++++ cgi-bin/users | 3 - cgi-bin/users.py | 165 +++++++++++++++++ cgi-bin/viewsttats.py | 46 +++-- image/11.jpeg | Bin 0 -> 230617 bytes inc/awesome.css | 30 +++ inc/script.js | 17 +- inc/style.css | 18 +- inc/users.js | 212 ++++++++++++++++++++++ 23 files changed, 1028 insertions(+), 211 deletions(-) create mode 100644 cgi-bin/create_db.py delete mode 100644 cgi-bin/groups delete mode 100644 cgi-bin/listserv.py create mode 100644 cgi-bin/sql.py delete mode 100644 cgi-bin/users create mode 100644 cgi-bin/users.py create mode 100644 image/11.jpeg create mode 100644 inc/users.js diff --git a/README.md b/README.md index 646c34ed..458a1ec1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +#Meet Haproxy-wi 2.0! Now with DB and Admin web interface! Life has become easier, life has become more cheerful! + # Haproxy web interface A simple web interface(user-frendly web GUI) for managing Haproxy servers. Leave your [feedback](https://github.com/Aidaho12/haproxy-wi/issues) @@ -37,10 +39,19 @@ For Apache just do virtualhost with cgi-bin. ![alt text](image/7.jpeg "Overview page") # Settings -Edit $HOME_HAPROXY-WI/cgi-bin/listserv.py, add your HAproxy servers. +``` +cd $HOME_HAPROXY-WI/cgi-bin/ +chmod +x *.py +``` + +Run create_db.py for DB createing Edit $HOME_HAPROXY-WI/cgi-bin/haproxy-webintarface.config with your env +Login http://haproxy-wi-server/users.py, and add: users, groups and servers. Default: admin/admin + +![alt text](image/11.jpeg "Admin area") + Copy ssh key on all HAproxy servers For Runtime API enable state file on HAproxt servers and need install socat on all haproxy servers: diff --git a/cgi-bin/add.py b/cgi-bin/add.py index 51282b88..74cbb1d2 100644 --- a/cgi-bin/add.py +++ b/cgi-bin/add.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import html import cgi -import listserv as listhap import os import funct +import sql import paramiko import configparser import http.cookies @@ -23,6 +23,7 @@ funct.page_for_admin(level = 1) haproxy_configs_server = config.get('configs', 'haproxy_configs_server') hap_configs_dir = config.get('configs', 'haproxy_save_configs_dir') form = cgi.FieldStorage() +listhap = sql.get_dick_permit() if form.getvalue('mode') is not None: serv = form.getvalue('serv') @@ -141,8 +142,8 @@ print('
' '' '
Note: If you reconfigure First server, second will reconfigured automatically
' @@ -261,8 +262,8 @@ print('' '' '
Note: If you reconfigure First server, second will reconfigured automatically
' @@ -345,8 +346,8 @@ print('' '' '
Note: If you reconfigure First server, second will reconfigured automatically
' diff --git a/cgi-bin/config.py b/cgi-bin/config.py index f86f2e46..bd240c7b 100644 --- a/cgi-bin/config.py +++ b/cgi-bin/config.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import html import cgi -import listserv as listhap import os import http.cookies import configparser diff --git a/cgi-bin/configver.py b/cgi-bin/configver.py index 099d1d7f..0f1944e4 100644 --- a/cgi-bin/configver.py +++ b/cgi-bin/configver.py @@ -51,7 +51,7 @@ if serv is not None and form.getvalue('open') is not None: print('') print('' % serv) print('') - print('

') + print('') Select = form.getvalue('Select') @@ -65,7 +65,10 @@ if serv is not None and form.getvalue('open') is not None: print('' % serv) print('' % configver) print('') - print('') + print('') + print('

' + 'Expand all' + '

') funct.show_config(configver) print('

') funct.get_button("Just save", value="save") diff --git a/cgi-bin/create_db.py b/cgi-bin/create_db.py new file mode 100644 index 00000000..179a61b6 --- /dev/null +++ b/cgi-bin/create_db.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +import sqlite3 as sqlite + +def get_cur(): + con = sqlite.connect("haproxy-wi.db", isolation_level=None) + cur = con.cursor() + return con, cur + +def create_table(): + con, cur = get_cur() + sql = """ + BEGIN TRANSACTION; + CREATE TABLE IF NOT EXISTS `user` ( + `id` INTEGER NOT NULL, + `username` VARCHAR ( 64 ) UNIQUE, + `email` VARCHAR ( 120 ) UNIQUE, + `password` VARCHAR ( 128 ), + `role` VARCHAR ( 128 ), + `groups` VARCHAR ( 120 ), + PRIMARY KEY(`id`) + ); + INSERT INTO `user` (username, email, password, role, groups) VALUES ('admin','admin@localhost','admin','admin','1'), + ('editor','editor@localhost','editor','editor','1'), + ('guest','guest@localhost','guest','guest','1'); + CREATE TABLE IF NOT EXISTS `servers` ( + `id` INTEGER NOT NULL, + `hostname` VARCHAR ( 64 ) UNIQUE, + `ip` VARCHAR ( 64 ) UNIQUE, + `groups` VARCHAR ( 64 ), + PRIMARY KEY(`id`) + ); + CREATE TABLE IF NOT EXISTS `roles_users` ( + `user_id` INTEGER, + `role_id` INTEGER, + FOREIGN KEY(`user_id`) REFERENCES `user`(`id`), + FOREIGN KEY(`role_id`) REFERENCES `role`(`id`) + ); + CREATE TABLE IF NOT EXISTS `role` ( + `id` INTEGER NOT NULL, + `name` VARCHAR ( 80 ) UNIQUE, + `description` VARCHAR ( 255 ), + PRIMARY KEY(`id`) + ); + INSERT INTO `role` (name, description) VALUES ('admin','Can do everything'), + ('editor','Can edit configs'), + ('guest','Read only access'); + CREATE TABLE IF NOT EXISTS `groups` ( + `id` INTEGER NOT NULL, + `name` VARCHAR ( 80 ) UNIQUE, + `description` VARCHAR ( 255 ), + PRIMARY KEY(`id`) + ); + INSERT INTO `groups` (name, description) VALUES ('All','All servers enter in this group'); + COMMIT; + """ + + try: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + print("DB was created") + cur.close() + con.close() + +create_table() \ No newline at end of file diff --git a/cgi-bin/delver.py b/cgi-bin/delver.py index 23dd0924..5818115a 100644 --- a/cgi-bin/delver.py +++ b/cgi-bin/delver.py @@ -19,7 +19,7 @@ config.read(path_config) hap_configs_dir = config.get('configs', 'haproxy_save_configs_dir') -funct.page_for_admin(level = 2) +funct.page_for_admin(level = 1) funct.chooseServer("delver.py", "Delete Versions HAproxy config", "n") if serv is not None and form.getvalue('open') is not None: diff --git a/cgi-bin/edit.py b/cgi-bin/edit.py index a6d18739..6933792c 100644 --- a/cgi-bin/edit.py +++ b/cgi-bin/edit.py @@ -2,6 +2,7 @@ import html import cgi import funct +import sql form = cgi.FieldStorage() serv = form.getvalue('serv') @@ -13,19 +14,19 @@ funct.check_config() print('

Runtime API

' '' '' - '' + '' '' '' '' '' '' '' - '' '' diff --git a/cgi-bin/funct.py b/cgi-bin/funct.py index 181b29da..ec91ec8c 100644 --- a/cgi-bin/funct.py +++ b/cgi-bin/funct.py @@ -3,10 +3,10 @@ import os import paramiko import http.cookies from paramiko import SSHClient -import listserv as listhap from datetime import datetime from pytz import timezone import configparser +import sql def check_config(): path_config = "haproxy-webintarface.config" @@ -63,10 +63,7 @@ def check_login(**kwargs): login = cookie.get('login') role = cookie.get('role') ref = os.environ.get("SCRIPT_NAME") - - if kwargs.get("admins_area") == "1" and role.value != "2": - print('') - + if login is None: print('' % ref) @@ -76,15 +73,15 @@ def is_admin(**kwargs): level = kwargs.get("level") if role is None: - role = 0 + role = 3 else: role = int(role.value) if level is None: - level = 2 + level = 1 try: - if level <= role: + if role <= level: return True else: return False @@ -164,6 +161,7 @@ def links(): '' @@ -173,25 +171,34 @@ def links(): '') - if is_admin(level = 1): + if is_admin(level = 2): print('
  • Versions' '
      ' '
    • Upload
    • ') if is_admin(): print('
    • Delete
    • ') - if is_admin(level = 1): + if is_admin(level = 2): print('
    ' '
  • ') show_login_links() + if is_admin(): + print('
  • Admin area' + '' + '
  • ') print('' '' - '' + '' '') def show_login_links(): @@ -488,69 +495,22 @@ def ssh_command(serv, commands, **kwargs): print(stderr.read().decode(encoding='UTF-8')) -def get_group_permit(): - import json - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - login = cookie.get('login') - USERS = fullpath + '/cgi-bin/users' - - try: - with open(USERS, "r") as user: - pass - except IOError: - print("Can't load users DB") - - for f in open(USERS, 'r'): - users = json.loads(f) - if login.value in users['login']: - group = users['group'] - - GROUPS = fullpath + '/cgi-bin/groups' - try: - with open(GROUPS, "r") as user: - pass - except IOError: - print("Can't load groups DB") - - for f in open(GROUPS, 'r'): - groups = json.loads(f) - if group in groups['name']: - list = groups['lists'] - break - else: - list = "" - - return list - -def get_dick_after_permit(): - list_serv = get_group_permit() - - if list_serv == "all": - from listserv import listhap as listhap - elif list_serv == "web": - from listserv import web as listhap - elif list_serv == "mysql": - from listserv import mysql as listhap - else: - from listserv import no_group as listhap - - return listhap - def choose_only_select(serv, **kwargs): - listhap = get_dick_after_permit() + listhap = sql.get_dick_permit() if kwargs.get("servNew"): servNew = kwargs.get("servNew") else: servNew = "" - - for i in sorted(listhap): - if listhap.get(i) == serv or listhap.get(i) == servNew: + + + for i in listhap: + if i[2] == serv or i[2] == servNew: selected = 'selected' else: selected = '' - print('' % (listhap.get(i), selected, i)) + print('' % (i[2], selected, i[1])) def chooseServer(formName, title, note, **kwargs): servNew = form.getvalue('serNew') @@ -575,20 +535,4 @@ def chooseServer(formName, title, note, **kwargs): if note == "y": print('

    Note: If you reconfigure First server, second will reconfigured automatically

    ') print('') - -def choose_server_with_vip(serv): - listhap.listhap = merge_two_dicts(listhap.listhap, listhap.listhap_vip) - for i in sorted(listhap.listhap): - if listhap.listhap.get(i) == serv: - selected = 'selected' - else: - selected = '' - print('' % (listhap.listhap.get(i), selected, i)) -def merge_two_dicts(x, y): - z = x.copy() - z.update(y) - return z - - - diff --git a/cgi-bin/groups b/cgi-bin/groups deleted file mode 100644 index 14a46c95..00000000 --- a/cgi-bin/groups +++ /dev/null @@ -1,3 +0,0 @@ -{ "name": "all", "lists": "all" } -{ "name": "mysql", "lists": "mysql" } -{ "name": "web", "lists": "web" } \ No newline at end of file diff --git a/cgi-bin/listserv.py b/cgi-bin/listserv.py deleted file mode 100644 index 181b72ce..00000000 --- a/cgi-bin/listserv.py +++ /dev/null @@ -1,7 +0,0 @@ -listhap= { - 'haproxy1': '172.28.0.1', - 'haproxy2': '172.28.0.2' - } -list_hap_vip = { - 'haproxy-vip': '172.28.0.3' - } diff --git a/cgi-bin/login.py b/cgi-bin/login.py index c13ac953..0c077026 100644 --- a/cgi-bin/login.py +++ b/cgi-bin/login.py @@ -4,20 +4,13 @@ import html import os import funct import http.cookies -import json +import sql cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) form = cgi.FieldStorage() ref = form.getvalue('ref') login = form.getvalue('login') password = form.getvalue('pass') -USERS = '/var/www/haproxy-wi/cgi-bin/users' - -try: - with open(USERS, "r") as user: - pass -except IOError: - print("Can't load users DB") def login_page(error): if error == "error": @@ -49,15 +42,15 @@ if login is None: login_page("n") if login is not None and password is not None: - for f in open(USERS, 'r'): - users = json.loads(f) - if login in users['login'] and password == users['password']: - if users['role'] == "admin": - role = 2 - elif users['role'] == "editor": + USERS = sql.select_users() + for users in USERS: + if login in users[1] and password == users[3]: + if users[4] == "admin": role = 1 + elif users[4] == "editor": + role = 2 else: - role = 0 + role = 3 c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) c["login"] = login c["login"]["path"] = "/cgi-bin/" @@ -65,7 +58,7 @@ if login is not None and password is not None: c["role"] = role c["role"]["path"] = "/cgi-bin/" c["role"]["expires"] = "Wed May 18 03:33:20 2033" - c["group"] = users['group'] + c["group"] = users[4] c["group"]["path"] = "/cgi-bin/" c["group"]["expires"] = "Wed May 18 03:33:20 2033" print(c) diff --git a/cgi-bin/logs.py b/cgi-bin/logs.py index 7ed9aac3..c31a349d 100644 --- a/cgi-bin/logs.py +++ b/cgi-bin/logs.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import html import cgi -import listserv as listhap import funct import configparser @@ -19,13 +18,13 @@ config.read(path_config) funct.get_auto_refresh("HAproxy logs") print('
    ServerServerDisable/Enable server or output any informationCommandSave change
    ' + '' '
    ' '
    ' @@ -40,7 +41,7 @@ print('' '' '' '' - '' + '' '' 'Enter' '
    ' '' - '' + '' '' '' '' '' '' - '' % rows) -print('' - '' '' diff --git a/cgi-bin/options.py b/cgi-bin/options.py index 6a20357d..5f3be826 100644 --- a/cgi-bin/options.py +++ b/cgi-bin/options.py @@ -165,7 +165,7 @@ if serv is not None and act == "configShow": funct.get_config(serv, cfg) - print('') + print('') print("

    Config from %s

    " % serv) print('

    ' 'Expand all' diff --git a/cgi-bin/ovw.py b/cgi-bin/ovw.py index 540eecf4..d4f19f43 100644 --- a/cgi-bin/ovw.py +++ b/cgi-bin/ovw.py @@ -3,6 +3,7 @@ import configparser import json import os import cgi +import sql path_config = "haproxy-webintarface.config" config = configparser.ConfigParser() @@ -18,23 +19,17 @@ hap_configs_dir = config.get('configs', 'haproxy_save_configs_dir') form = cgi.FieldStorage() def get_overview(): - USERS = cgi_path + '/users' - - try: - with open(USERS, "r") as user: - pass - except IOError: - print("Can't load users DB") + USERS = sql.select_users() print('

    ServerServerNumber rowsEx for grep
    ' + '' '
    ' '
    ' % grep) +print('' % grep) print('' + '' 'Show' '
    ') if funct.is_admin(): print('' - '' - '' - '' + '' + '' + '' + '') print('
    LoginGroup' - 'Role' - '' + 'LoginEmailGroupRole' '' '' 'Show all' @@ -45,55 +40,59 @@ def get_overview(): i = 0 style = "" - for f in open(USERS, 'r'): + for users in USERS: i = i + 1 - users = json.loads(f) if i is 4: style = 'style="display: none;" class="show-users"' - print('
    ' + users['login'] +'') - print(users['group']+'') - print(users['role']) + print('
    ' + users[1] +'') + print(users[2]+'') + GROUPS = sql.select_user_name_group(users[5]) + for group in GROUPS: + print(group) + print('') + print(users[4]) print('
    ') print('' '' - '' + '' '' '' - '' + '' '') - listhap = funct.get_dick_after_permit() + listhap = sql.get_dick_permit() commands = [ "ps -Af |grep [h]aproxy |wc -l" ] commands1 = [ "ls -l %s |awk '{ print $6\" \"$7\" \"$8}'" % haproxy_config_path ] - for i in sorted(listhap): - print('') print('
    ServerServer' 'HAproxy status' '' 'Action' '' + '' 'Last edit' '
    %s' % (i, i, i)) - funct.ssh_command(listhap.get(i), commands, server_status="1") + for server in listhap: + print('
    %s' % (server[1], server[1], server[1])) + funct.ssh_command(server[2], commands, server_status="1") print('') if funct.is_admin(): - print('start' % listhap.get(i)) - print('start' % listhap.get(i)) - print('restart' % listhap.get(i)) - print('show' % listhap.get(i)) - print('edit' % listhap.get(i)) - print('compare' % listhap.get(i)) - print('map' % listhap.get(i)) + print('start' % server[2]) + print('start' % server[2]) + print('restart' % server[2]) + print('show' % server[2]) + print('edit' % server[2]) + print('compare' % server[2]) + print('map' % server[2]) print('') - funct.ssh_command(listhap.get(i), commands1) + funct.ssh_command(server[2], commands1) print('
    ' '' - '' '') + for server in sorted(listhap): + print('') print('') print('
    Server' + '' 'HAproxy info' '' @@ -106,12 +105,12 @@ def get_overview(): "haproxy -v |head -1", status_command + "|grep Active | sed 's/^[ \t]*//'" ] commands1 = [ "top -u haproxy -b -n 1" ] - for i in sorted(listhap): - print('

    ' + i + ':

    ' + server[1] + ':

    Total listen/frontend/backend:
    ')
    -		funct.ssh_command(listhap.get(i), commands)
    +		funct.ssh_command(server[2], commands)
     		print('
    ')
    -		funct.ssh_command(listhap.get(i), commands1)
    +		funct.ssh_command(server[2], commands1)
     		print('
    ') diff --git a/cgi-bin/sql.py b/cgi-bin/sql.py new file mode 100644 index 00000000..d230e4cc --- /dev/null +++ b/cgi-bin/sql.py @@ -0,0 +1,412 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*-" +import sqlite3 as sqlite +import cgi + +def get_cur(): + con = sqlite.connect("haproxy-wi.db", isolation_level=None) + cur = con.cursor() + return con, cur + +def add_user(user, email, password, role, group): + con, cur = get_cur() + sql = """INSERT INTO user (username, email, password, role, groups) VALUES ('%s', '%s', '%s', '%s', '%s')""" % (user, email, password, role, group) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + cur.close() + con.close() + +def update_user(user, email, password, role, group, id): + con, cur = get_cur() + sql = """update user set username = '%s', + email = '%s', + password = '%s', + role = '%s', + groups = '%s' + where id = '%s'""" % (user, email, password, role, group, id) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + cur.close() + con.close() + +def delete_user(id): + con, cur = get_cur() + sql = """delete from user where id = '%s'""" % (id) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return True + cur.close() + +def add_group(name, description): + con, cur = get_cur() + sql = """INSERT INTO groups (name, description) VALUES ('%s', '%s')""" % (name, description) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + cur.close() + con.close() + +def delete_group(id): + con, cur = get_cur() + sql = """delete from groups where id = '%s'""" % (id) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return True + cur.close() + +def update_group(name, descript, id): + con, cur = get_cur() + sql = """ + update groups set + name = '%s', + description = '%s' + where id = '%s'; + """ % (name, descript, id) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + cur.close() + con.close() + +def add_server(hostname, ip, group): + con, cur = get_cur() + sql = """INSERT INTO servers (hostname, ip, groups) VALUES ('%s', '%s', '%s')""" % (hostname, ip, group) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + cur.close() + con.close() + +def delete_server(id): + con, cur = get_cur() + sql = """delete from servers where id = '%s'""" % (id) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return True + cur.close() + con.close() + +def update_server(hostname, ip, group, id): + con, cur = get_cur() + sql = """update servers set + hostname = '%s', + ip = '%s', + groups = '%s' + where id = '%s'""" % (hostname, ip, group, id) + try: + with con: + cur.executescript(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + cur.close() + con.close() + +def select_users(**kwargs): + con, cur = get_cur() + sql = """select * from user ORDER BY id""" + if kwargs.get("user") is not None: + sql = """select * from user where username='%s' """ % kwargs.get("user") + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchall() + cur.close() + con.close() + +def select_groups(**kwargs): + con, cur = get_cur() + sql = """select * from groups ORDER BY id""" + if kwargs.get("group") is not None: + sql = """select * from groups where name='%s' """ % kwargs.get("group") + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchall() + cur.close() + con.close() + +def select_user_name_group(id): + con, cur = get_cur() + sql = """select name from groups where id='%s' """ % id + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchone() + cur.close() + con.close() + +def get_groups_select(id, **kwargs): + print('') + +def select_servers(**kwargs): + con, cur = get_cur() + sql = """select * from servers ORDER BY id""" + if kwargs.get("server") is not None: + sql = """select * from servers where hostname='%s' """ % kwargs.get("server") + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchall() + cur.close() + con.close() + +def get_dick_permit(): + import http.cookies + import os + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + login = cookie.get('login') + con, cur = get_cur() + sql = """ select * from user where username = '%s' """ % login.value + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + for group in cur: + if group[5] == '1': + sql = """ select * from servers """ + else: + sql = """ select * from servers where groups = '%s' """ % group[5] + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchall() + cur.close() + con.close() + +def show_update_servers(): + SERVERS = select_servers() + print('' + 'Hostname' + 'IP' + 'Group' + '' + '') + for server in SERVERS: + print('' % server[0]) + print('' % (server[0], server[1], server[0])) + print('' % (server[0], server[2])) + print('') + get_groups_select("123", selected=server[3]) + print('') + print('' % server[0]) + print('') + +def show_update_user(user): + USERS = select_users(user=user) + for users in USERS: + print('' % users[0]) + print('' % (users[0], users[1])) + print('' % (users[0], users[3])) + print('' % (users[0], users[2])) + print('') + need_id_role = "role-%s" % users[0] + get_roles_select(need_id_role, selected=users[4]) + print('') + print('') + need_id_group = "usergroup-%s" % users[0] + get_groups_select(need_id_group, selected=users[5]) + print('') + print('' % users[0]) + print('' % users[0]) + print('') + +def show_update_server(server): + SERVERS = select_servers(server=server) + for server in SERVERS: + print('' % server[0]) + print('' % (server[0], server[1], server[0])) + print('' % (server[0], server[2])) + print('') + get_groups_select("123", selected=server[3]) + print('') + print('' % users[0]) + print('' % server[0]) + print('') + +def show_update_group(group): + GROUPS = select_groups(group=group) + for group in GROUPS: + print('' % group[0]) + print('' % (group[0], group[1])) + print('' % (group[0], group[2])) + print('') + print('') + print('') + +def select_roles(**kwargs): + con, cur = get_cur() + sql = """select * from role ORDER BY id""" + if kwargs.get("role") is not None: + sql = """select * from role where name='%s' """ % kwargs.get("group") + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchall() + cur.close() + con.close() + +def select_roles(**kwargs): + con, cur = get_cur() + sql = """select * from role ORDER BY id""" + if kwargs.get("roles") is not None: + sql = """select * from role where name='%s' """ % kwargs.get("roles") + try: + cur.execute(sql) + except sqlite.Error as e: + print("An error occurred:", e.args[0]) + else: + return cur.fetchall() + cur.close() + con.close() + +def get_roles_select(id, **kwargs): + print('') +form = cgi.FieldStorage() + +if form.getvalue('newusername') is not None: + email = form.getvalue('newemail') + password = form.getvalue('newpassword') + role = form.getvalue('newrole') + group = form.getvalue('newgroupuser') + new_user = form.getvalue('newusername') + if password is None or role is None or group is None: + print('Content-type: text/html\n') + print("All fields must be completed") + else: + print('Content-type: text/html\n') + add_user(new_user, email, password, role, group) + show_update_user(new_user) + +if form.getvalue('updateuser') is not None: + email = form.getvalue('email') + password = form.getvalue('password') + role = form.getvalue('role') + group = form.getvalue('usergroup') + new_user = form.getvalue('updateuser') + id = form.getvalue('id') + if password is None or role is None or group is None: + print('Content-type: text/html\n') + print("All fields must be completed") + else: + print('Content-type: text/html\n') + update_user(new_user, email, password, role, group, id) + +if form.getvalue('userdel') is not None: + print('Content-type: text/html\n') + if delete_user(form.getvalue('userdel')): + print("Ok") + +if form.getvalue('newserver') is not None: + hostname = form.getvalue('newserver') + ip = form.getvalue('newip') + group = form.getvalue('newservergroup') + if ip is None or group is None: + print('Content-type: text/html\n') + print("All fields must be completed") + else: + print('Content-type: text/html\n') + add_server(hostname, ip, group) + show_update_server(hostname) + +if form.getvalue('serverdel') is not None: + print('Content-type: text/html\n') + if delete_server(form.getvalue('serverdel')): + print("Ok") + +if form.getvalue('newgroup') is not None: + newgroup = form.getvalue('newgroup') + desc = form.getvalue('newdesc') + print('Content-type: text/html\n') + add_group(newgroup, desc) + show_update_group(newgroup) + +if form.getvalue('groupdel') is not None: + print('Content-type: text/html\n') + if delete_group(form.getvalue('groupdel')): + print("Ok") + +if form.getvalue('updategroup') is not None: + name = form.getvalue('updategroup') + descript = form.getvalue('descript') + id = form.getvalue('id') + if name is None: + print('Content-type: text/html\n') + print("All fields must be completed") + else: + print('Content-type: text/html\n') + update_group(name, descript, id) + +if form.getvalue('updateserver') is not None: + name = form.getvalue('updateserver') + ip = form.getvalue('ip') + group = form.getvalue('servergroup') + id = form.getvalue('id') + if name is None or ip is None: + print('Content-type: text/html\n') + print("All fields must be completed") + else: + print('Content-type: text/html\n') + update_server(name, ip, group, id) + \ No newline at end of file diff --git a/cgi-bin/users b/cgi-bin/users deleted file mode 100644 index 79692c13..00000000 --- a/cgi-bin/users +++ /dev/null @@ -1,3 +0,0 @@ -{ "login": "admin", "password": "admin", "role": "admin", "group": "all" } -{ "login": "Editor", "password": "Editor@123", "role": "editor", "group": "all" } -{ "login": "Guest", "password": "Guest@123", "role": "guest", "group": "all" } diff --git a/cgi-bin/users.py b/cgi-bin/users.py new file mode 100644 index 00000000..214c623f --- /dev/null +++ b/cgi-bin/users.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +import html +import cgi +import sys +import os +import funct +import sql + +funct.head("Admin area: users manage") +funct.check_config() +funct.check_login() +funct.page_for_admin() + +form = cgi.FieldStorage() + +USERS = sql.select_users() +GROUPS = sql.select_groups() +SERVERS = sql.select_servers() +ROLES = sql.select_roles() + +print('' + '
    ' + '' + '
    ' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '') + +for users in USERS: + print('' % users[0]) + print('' % (users[0], users[1])) + print('' % (users[0], users[3])) + print('' % (users[0], users[2])) + print('') + print('') + print('' % users[0]) + print('' % users[0]) + print('') +print('
    Login namePasswordEmailRoleGroup
    ') + need_id_role = "role-%s" % users[0] + sql.get_roles_select(need_id_role, selected=users[4]) + print('') + need_id_group = "usergroup-%s" % users[0] + sql.get_groups_select(need_id_group, selected=users[5]) + print('
    ' + '
    + Add') + +print('

    ' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '') +print('') + +print('
    ' + '' + '' + '' + '' + '' + '' + '') +for group in GROUPS: + print('' % group[0]) + print('' % (group[0], group[1])) + print('' % (group[0], group[2])) + print('' % group[0]) + print('' % group[0]) + print('') +print('
    NameDesciption
    ' + '
    + Add') + +print('

    ' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' +'' +'
    ' +'
    ' + '' + '' + '' + '' + '' + '' + '' + '') + +for server in SERVERS: + print('' % server[0]) + print('' % (server[0], server[1])) + print('' % (server[0], server[2])) + print('') + print('' % server[0]) + print('' % server[0]) + print('') +print('
    HostnameIPGroup
    ') + need_id_group = "servergroup-%s" % server[0] + sql.get_groups_select(need_id_group, selected=server[3]) + print('
    ' + '
    + Add' + '

    ' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '') +print('') + +print('
    ' + '' + '' + '' + '' + '' + '' + '') +for role in ROLES: + print('' % role[0]) + print('' % ( role[1])) + print('' % (role[2])) + print('') + +print('
    NameDesciption
    %s%s
    ') \ No newline at end of file diff --git a/cgi-bin/viewsttats.py b/cgi-bin/viewsttats.py index 4bf4b5a7..f15671c8 100644 --- a/cgi-bin/viewsttats.py +++ b/cgi-bin/viewsttats.py @@ -3,7 +3,7 @@ import html import cgi import requests import funct -import listserv as listhap +import sql import configparser from requests_toolbelt.utils import dump @@ -18,14 +18,29 @@ haproxy_pass = config.get('haproxy', 'password') stats_port = config.get('haproxy', 'stats_port') stats_page = config.get('haproxy', 'stats_page') -listhap.listhap = funct.merge_two_dicts(listhap.listhap, listhap.listhap_vip) - form = cgi.FieldStorage() serv = form.getvalue('serv') if serv is None: - first_serv = sorted(list(listhap.listhap.values())) - serv = first_serv[0] + first_serv = sql.get_dick_permit() + for i in first_serv: + serv = i[2] + break + +print('
    ') + +funct.get_auto_refresh("HAproxy statistics") + +print('
    ' + '
    ' + '' + 'Show' + '
    ') try: response = requests.get('http://%s:%s/%s' % (serv, stats_port, stats_page), auth=(haproxy_user, haproxy_pass)) @@ -42,25 +57,6 @@ except requests.exceptions.Timeout as errt: except requests.exceptions.RequestException as err: print ("OOps: Something Else",err) -for i in listhap.listhap: - if listhap.listhap.get(i) == serv: - servname = i - -print('
    ') - -funct.get_auto_refresh("HAproxy statistics") - -print('
    ' - '
    ' - '' - 'Show' - '
    ') - data = response.content print('
    ') print(data.decode('utf-8')) @@ -68,4 +64,4 @@ print('
    ') funct.head("Stats HAproxy configs") print('
    ') - +funct.footer() diff --git a/image/11.jpeg b/image/11.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c5cde35e4579636adbb8dbe7d951089eaac3cd58 GIT binary patch literal 230617 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

    vI`eC7|+lt(w$*Dkgj5bZjx~LNvG(_PdNiB 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 '); - $( "#add-user" ).click( function(){ - $( "#users-table" ).append(input); - }); -} ); - -function removeUser(id) { - document.getElementById(id).parentNode.removeChild(document.getElementById(id)); - return false; -} \ No newline at end of file +}); \ No newline at end of file diff --git a/inc/style.css b/inc/style.css index 9c006c3d..70de6513 100644 --- a/inc/style.css +++ b/inc/style.css @@ -146,7 +146,7 @@ pre { } .configShow, .diff { margin-left: 16%; - height: 78%; + //height: 78%; overflow: auto; width: 70%; border: 1px solid #DCDCDC; @@ -278,9 +278,6 @@ pre { padding-left: 15px; font-size: 15px; } -.first-collumn { - width: 200px; -} .serverUp, .serverDown { padding: 3px; border-radius: 3px; @@ -305,9 +302,12 @@ pre { } .padding10 { padding: 10px; - padding-left: 15px; + padding-left: 0px; border: none; - width: 25%; + width: 23%; +} +.first-collumn { + padding-left: 15px; } .ro { border: none; @@ -397,6 +397,9 @@ pre { border-radius: 5px !important; color: #fff !important; } +.ui-tabs-nav { + padding-left: 20px !important; + } a { background-color: transparent; } @@ -499,6 +502,9 @@ a:focus { margin-right: -15px; margin-left: -15px; } +.update { + background-color: rgb(0,168,107) !important; +} label { display: inline-block; diff --git a/inc/users.js b/inc/users.js new file mode 100644 index 00000000..3c74f18b --- /dev/null +++ b/inc/users.js @@ -0,0 +1,212 @@ +$( function() { + $('#add-user').click(function() { + $.ajax( { + url: "sql.py", + data: { + newusername: $('#new-username').val(), + newpassword: $('#new-password').val(), + newemail: $('#new-email').val(), + newrole: $('#new-role').val(), + newgroupuser: $('#new-group').val() + }, + type: "GET", + success: function( data ) { + if (data == "All fields must be completed ") { + alert(data); + } else { + $("#ajax-users").append(data); + $( "#ajax-users tr td" ).addClass( "update", 1000, callbackUser ); + $.getScript(url); + } + } + } ); + }); + $('#add-group').click(function() { + $.ajax( { + url: "sql.py", + data: { + newgroup: $('#new-group-add').val(), + newdesc: $('#new-desc').val(), + }, + type: "GET", + success: function( data ) { + $("#ajax-group").append(data); + $( "#ajax-group tr td" ).addClass( "update", 1000, callbackGroup ); + window.location.reload(); + } + } ); + }); + $('#add-server').click(function() { + $.ajax( { + url: "sql.py", + data: { + newserver: $('#new-server-add').val(), + newip: $('#new-ip').val(), + newservergroup: $('#new-server-group-add').val(), + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if (data == "All fields must be completed ") { + alert(data); + } else { + $("#ajax-servers").append(data); + $( "#ajax-servers tr td" ).addClass( "update", 1000, callback ); + $.getScript(url); + } + } + } ); + }); + + function callbackUser() { + setTimeout(function() { + $( "#ajax-users tr td" ).removeClass( "update" ); + }, 2500 ); + } + function callback() { + setTimeout(function() { + $( "#ajax-servers tr td" ).removeClass( "update" ); + }, 2500 ); + } + + function callbackGroup() { + setTimeout(function() { + $( "#ajax-group tr td" ).removeClass( "update" ); + }, 2500 ); + } + + $('#add-user-button').click(function() { + if ($('#user-add-table').css('display', 'none')) { + $('#user-add-table').show("blind", "fast"); + } + }); + $('#add-group-button').click(function() { + if ($('#group-add-table').css('display', 'none')) { + $('#group-add-table').show("blind", "fast"); + } + }); + $('#add-server-button').click(function() { + if ($('#server-add-table').css('display', 'none')) { + $('#server-add-table').show("blind", "fast"); + } + }); + +} ); +function removeUser(id) { + $("#user-"+id).css("background-color", "#f36223"); + $.ajax( { + url: "sql.py", + data: { + userdel: id, + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if(data == "Ok ") { + $("#user-"+id).remove(); + } + } + } ); + } +function removeServer(id) { + $("#server-"+id).css("background-color", "#f36223"); + $.ajax( { + url: "sql.py", + data: { + serverdel: id, + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if(data == "Ok ") { + $("#server-"+id).remove(); + } + } + } ); + } +function removeGroup(id) { + $("#group-"+id).css("background-color", "#f36223"); + $.ajax( { + url: "sql.py", + data: { + groupdel: id, + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if(data == "Ok ") { + $("#group-"+id).remove(); + } + } + } ); + } +function updateUser(id) { + $.ajax( { + url: "sql.py", + data: { + updateuser: $('#login-'+id).val(), + password: $('#password-'+id).val(), + email: $('#email-'+id).val(), + role: $('#role-'+id).val(), + usergroup: $('#usergroup-'+id+' option:selected' ).val(), + id: id + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if (data == "All fields must be completed ") { + alert(data); + } else { + $("#user-"+id).addClass( "update", 1000 ); + setTimeout(function() { + $( "#user-"+id ).removeClass( "update" ); + }, 2500 ); + } + } + } ); +} +function updateGroup(id) { + $.ajax( { + url: "sql.py", + data: { + updategroup: $('#name-'+id).val(), + descript: $('#descript-'+id).val(), + id: id + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if (data == "All fields must be completed ") { + alert(data); + } else { + $("#group-"+id).addClass( "update", 1000 ); + setTimeout(function() { + $( "#group-"+id ).removeClass( "update" ); + }, 2500 ); + } + } + } ); +} +function updateServer(id) { + $.ajax( { + url: "sql.py", + data: { + updateserver: $('#hostname-'+id).val(), + ip: $('#ip-'+id).val(), + servergroup: $('#servergroup-'+id+' option:selected' ).val(), + id: id + }, + type: "GET", + success: function( data ) { + data = data.replace(/\s+/g,' '); + if (data == "All fields must be completed ") { + alert(data); + } else { + $("#server-"+id).addClass( "update", 1000 ); + setTimeout(function() { + $( "#server-"+id ).removeClass( "update" ); + }, 2500 ); + } + } + } ); +} \ No newline at end of file