mirror of https://github.com/Aidaho12/haproxy-wi
				
				
				
			v2.4
More security! Redesigned authorization system Small change and bugspull/19/head
							parent
							
								
									d26d949105
								
							
						
					
					
						commit
						4a121235b8
					
				| 
						 | 
				
			
			@ -24,7 +24,7 @@ ssh_user_name = config.get('ssh', 'ssh_user_name')
 | 
			
		|||
hap_configs_dir = config.get('configs', 'haproxy_save_configs_dir')
 | 
			
		||||
haproxy_config_path  = config.get('haproxy', 'haproxy_config_path')
 | 
			
		||||
 | 
			
		||||
funct.chooseServer("configshow.py", "Show HAproxy config", "n", onclick="showConfig()")
 | 
			
		||||
funct.chooseServer("configshow.py", "Get Running Config", "n", onclick="showConfig()")
 | 
			
		||||
 | 
			
		||||
print('<div id="ajax">')
 | 
			
		||||
if serv is not None and form.getvalue('open') is not None :
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,20 +108,24 @@ def create_table():
 | 
			
		|||
		 ('guest','Read only access');
 | 
			
		||||
		
 | 
			
		||||
		CREATE TABLE IF NOT EXISTS `groups` (
 | 
			
		||||
		`id`	INTEGER NOT NULL,
 | 
			
		||||
		`name`	VARCHAR ( 80 ) UNIQUE,
 | 
			
		||||
		`description`	VARCHAR ( 255 ),
 | 
			
		||||
		PRIMARY KEY(`id`)
 | 
			
		||||
			`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');	
 | 
			
		||||
		
 | 
			
		||||
		CREATE TABLE IF NOT EXISTS `servers` (
 | 
			
		||||
		`id`	INTEGER NOT NULL,
 | 
			
		||||
		`hostname`	VARCHAR ( 64 ) UNIQUE,
 | 
			
		||||
		`ip`	VARCHAR ( 64 ) UNIQUE,
 | 
			
		||||
		`groups`	VARCHAR ( 64 ),
 | 
			
		||||
		PRIMARY KEY(`id`)
 | 
			
		||||
			`id`	INTEGER NOT NULL,
 | 
			
		||||
			`hostname`	VARCHAR ( 64 ) UNIQUE,
 | 
			
		||||
			`ip`	VARCHAR ( 64 ) UNIQUE,
 | 
			
		||||
			`groups`	VARCHAR ( 64 ),
 | 
			
		||||
			PRIMARY KEY(`id`)
 | 
			
		||||
		);		
 | 
			
		||||
		CREATE TABLE IF NOT EXISTS `uuid` (
 | 
			
		||||
			`user_id`	INTEGER NOT NULL,
 | 
			
		||||
			`uuid`	varchar ( 64 )
 | 
			
		||||
		);
 | 
			
		||||
		"""
 | 
			
		||||
		try:
 | 
			
		||||
			cur.executescript(sql)
 | 
			
		||||
| 
						 | 
				
			
			@ -144,7 +148,7 @@ def create_table():
 | 
			
		|||
	cur.close() 
 | 
			
		||||
	con.close()
 | 
			
		||||
	
 | 
			
		||||
def update_db_v_2_0_1():
 | 
			
		||||
def update_db_v_2_0_1(**kwargs):
 | 
			
		||||
	con, cur = get_cur()
 | 
			
		||||
	sql = """
 | 
			
		||||
	ALTER TABLE `servers` ADD COLUMN type_ip INTEGER NOT NULL DEFAULT 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -152,19 +156,19 @@ def update_db_v_2_0_1():
 | 
			
		|||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		if e.args[0] == 'duplicate column name: type_ip':
 | 
			
		||||
			print('Updating... go to version 2.0.1.1<br />')
 | 
			
		||||
			return False
 | 
			
		||||
		else:
 | 
			
		||||
			print("An error occurred:", e)
 | 
			
		||||
			return False
 | 
			
		||||
		if kwargs.get('silent') != 1:
 | 
			
		||||
			if e.args[0] == 'duplicate column name: type_ip':
 | 
			
		||||
				print('Updating... go to version 2.0.1.1<br />')
 | 
			
		||||
			else:
 | 
			
		||||
				print("An error occurred:", e)
 | 
			
		||||
		return False
 | 
			
		||||
	else:
 | 
			
		||||
		print("DB was update to 2.0.1<br />")
 | 
			
		||||
		return True
 | 
			
		||||
	cur.close() 
 | 
			
		||||
	con.close()
 | 
			
		||||
 | 
			
		||||
def update_db_v_2_0_1_1():
 | 
			
		||||
def update_db_v_2_0_1_1(**kwargs):
 | 
			
		||||
	con, cur = get_cur()
 | 
			
		||||
	sql = """
 | 
			
		||||
	ALTER TABLE `servers` ADD COLUMN enable INTEGER NOT NULL DEFAULT 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -172,19 +176,19 @@ def update_db_v_2_0_1_1():
 | 
			
		|||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		if e.args[0] == 'duplicate column name: enable' or e == "1060 (42S21): Duplicate column name 'enable' ":
 | 
			
		||||
			print('Updating... go to version 2.0.5<br />')
 | 
			
		||||
			return False
 | 
			
		||||
		else:
 | 
			
		||||
			print("An error occurred:", e)
 | 
			
		||||
			return False
 | 
			
		||||
		if kwargs.get('silent') != 1:
 | 
			
		||||
			if e.args[0] == 'duplicate column name: enable' or e == "1060 (42S21): Duplicate column name 'enable' ":
 | 
			
		||||
				print('Updating... go to version 2.0.5<br />')
 | 
			
		||||
			else:
 | 
			
		||||
				print("An error occurred:", e)
 | 
			
		||||
		return False
 | 
			
		||||
	else:
 | 
			
		||||
		print("DB was update to 2.0.1.1<br />")
 | 
			
		||||
		return True
 | 
			
		||||
	cur.close() 
 | 
			
		||||
	con.close()
 | 
			
		||||
	
 | 
			
		||||
def update_db_v_2_0_5():
 | 
			
		||||
def update_db_v_2_0_5(**kwargs):
 | 
			
		||||
	con, cur = get_cur()
 | 
			
		||||
	sql = """
 | 
			
		||||
	ALTER TABLE `servers` ADD COLUMN master INTEGER NOT NULL DEFAULT 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -192,22 +196,51 @@ def update_db_v_2_0_5():
 | 
			
		|||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		if e.args[0] == 'duplicate column name: master':
 | 
			
		||||
			print('Already updated. No run more. Thx =^.^=')
 | 
			
		||||
			return False
 | 
			
		||||
		else:
 | 
			
		||||
			print("An error occurred:", e)
 | 
			
		||||
			return False
 | 
			
		||||
		if kwargs.get('silent') != 1:
 | 
			
		||||
			if e.args[0] == 'duplicate column name: master':
 | 
			
		||||
				print('Already updated. No run more. Thx =^.^=')
 | 
			
		||||
			else:
 | 
			
		||||
				print("An error occurred:", e)
 | 
			
		||||
		return False
 | 
			
		||||
	else:
 | 
			
		||||
		print("DB was update to 2.0.5<br />")
 | 
			
		||||
		return True
 | 
			
		||||
	cur.close() 
 | 
			
		||||
	con.close()
 | 
			
		||||
	
 | 
			
		||||
def update_db_v_2_4(**kwargs):
 | 
			
		||||
	con, cur = get_cur()
 | 
			
		||||
	sql = """
 | 
			
		||||
	CREATE TABLE IF NOT EXISTS `uuid` (`user_id` INTEGER NOT NULL, `uuid` varchar ( 64 ) );
 | 
			
		||||
	"""
 | 
			
		||||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print(kwargs.get('silent'))
 | 
			
		||||
		if kwargs.get('silent') != 1:
 | 
			
		||||
			if e.args[0] == 'duplicate column name: user_id':
 | 
			
		||||
				print('Already updated. No run more. Thx =^.^=')
 | 
			
		||||
			else:
 | 
			
		||||
				print("An error occurred:", e)
 | 
			
		||||
		return False
 | 
			
		||||
	else:
 | 
			
		||||
		if kwargs.get('silent') != 1:
 | 
			
		||||
			print("DB was update to 2.4 <br />")
 | 
			
		||||
		return True
 | 
			
		||||
	cur.close() 
 | 
			
		||||
	con.close()
 | 
			
		||||
	
 | 
			
		||||
def update_all():
 | 
			
		||||
	update_db_v_2_0_1()
 | 
			
		||||
	update_db_v_2_0_1_1()
 | 
			
		||||
	update_db_v_2_0_5()
 | 
			
		||||
	update_db_v_2_4()
 | 
			
		||||
	
 | 
			
		||||
def update_all_silent():
 | 
			
		||||
	update_db_v_2_0_1(silent=1)
 | 
			
		||||
	update_db_v_2_0_1_1(silent=1)
 | 
			
		||||
	update_db_v_2_0_5(silent=1)
 | 
			
		||||
	update_db_v_2_4(silent=1)
 | 
			
		||||
		
 | 
			
		||||
#if check_db():	
 | 
			
		||||
#	create_table()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										33
									
								
								app/funct.py
								
								
								
								
							
							
						
						
									
										33
									
								
								app/funct.py
								
								
								
								
							| 
						 | 
				
			
			@ -68,23 +68,27 @@ def telegram_send_mess(mess):
 | 
			
		|||
	bot.send_message(chat_id=channel_name, text=mess)
 | 
			
		||||
	
 | 
			
		||||
def check_login(**kwargs):
 | 
			
		||||
	import sql
 | 
			
		||||
	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
	login = cookie.get('login')
 | 
			
		||||
	role = cookie.get('role')
 | 
			
		||||
	user_uuid = cookie.get('uuid')
 | 
			
		||||
	ref = os.environ.get("SCRIPT_NAME")
 | 
			
		||||
 | 
			
		||||
	if login is None:
 | 
			
		||||
	if user_uuid is not None:
 | 
			
		||||
		if sql.get_user_name_by_uuid(user_uuid.value) is None:
 | 
			
		||||
			print('<meta http-equiv="refresh" content="0; url=login.py?ref=%s">' % ref)
 | 
			
		||||
	else:
 | 
			
		||||
		print('<meta http-equiv="refresh" content="0; url=login.py?ref=%s">' % ref)
 | 
			
		||||
				
 | 
			
		||||
def is_admin(**kwargs):
 | 
			
		||||
	import sql
 | 
			
		||||
	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
	role = cookie.get('role')
 | 
			
		||||
	level = kwargs.get("level")
 | 
			
		||||
	
 | 
			
		||||
	if role is None:
 | 
			
		||||
	user_id = cookie.get('uuid')
 | 
			
		||||
	try:
 | 
			
		||||
		role = sql.get_user_role_by_uuid(user_id.value)
 | 
			
		||||
	except:
 | 
			
		||||
		role = 3
 | 
			
		||||
	else:
 | 
			
		||||
		role = int(role.value)
 | 
			
		||||
		pass
 | 
			
		||||
	level = kwargs.get("level")
 | 
			
		||||
		
 | 
			
		||||
	if level is None:
 | 
			
		||||
		level = 1
 | 
			
		||||
| 
						 | 
				
			
			@ -206,17 +210,18 @@ def links():
 | 
			
		|||
				'</li>')
 | 
			
		||||
	print('</ul>'
 | 
			
		||||
		  '</nav>'
 | 
			
		||||
		  '<div class="copyright-menu">HAproxy-WI v2.3.1</div>'
 | 
			
		||||
		  '<div class="copyright-menu">HAproxy-WI v2.4</div>'
 | 
			
		||||
		  '</div>')	
 | 
			
		||||
 | 
			
		||||
def show_login_links():
 | 
			
		||||
	import sql
 | 
			
		||||
	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
	login = cookie.get('login')
 | 
			
		||||
	user_id = cookie.get('uuid')
 | 
			
		||||
	
 | 
			
		||||
	if login is None:
 | 
			
		||||
	if user_id is None:
 | 
			
		||||
		print('<li><a href=/app/login.py? title="Login" class="login">Login</a></li>')	
 | 
			
		||||
	else:
 | 
			
		||||
		print('<li><a href=/app/login.py?logout=logout title="Logout, user name: %s" class="login">Logout</a></li>' % login.value)
 | 
			
		||||
		print('<li><a href=/app/login.py?logout=logout title="Logout, user name: %s" class="login">Logout</a></li>' % sql.get_user_name_by_uuid(user_id.value))
 | 
			
		||||
		  
 | 
			
		||||
def footer():
 | 
			
		||||
	print('</center></div>'
 | 
			
		||||
| 
						 | 
				
			
			@ -573,7 +578,7 @@ def ssh_command(serv, commands, **kwargs):
 | 
			
		|||
		else:
 | 
			
		||||
			print('<div style="margin: -10px;">'+stdout.read().decode(encoding='UTF-8')+'</div>')
 | 
			
		||||
			
 | 
			
		||||
		print(stderr.read().decode(encoding='UTF-8')+"<br/>")
 | 
			
		||||
		print(stderr.read().decode(encoding='UTF-8'))
 | 
			
		||||
		
 | 
			
		||||
	ssh.close()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ print('<script src="/inc/users.js"></script>'
 | 
			
		|||
			'<td>Slave</td>'
 | 
			
		||||
			'<td>VRRP interface</td>'
 | 
			
		||||
			'<td>VRRP IP</td>'
 | 
			
		||||
			'<td><span title="Will be installed the latest version that you have in the repository">Install HAProxy(?)</span></td>'
 | 
			
		||||
			'<td><span title="Haproxy-WI will try install haproxy-1.18.5, if it does not work then haproxy-1.15">Install HAProxy(?)</span></td>'
 | 
			
		||||
			'<td></td>'
 | 
			
		||||
		'</tr>'
 | 
			
		||||
		'<tr>'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,8 @@ log_path = ${fullpath}/log/
 | 
			
		|||
cert_local_dir = ${cgi_path}/certs/
 | 
			
		||||
time_zone = UTC
 | 
			
		||||
proxy = 
 | 
			
		||||
#Time to live users sessions. In days
 | 
			
		||||
session_ttl = 5
 | 
			
		||||
 | 
			
		||||
[configs]
 | 
			
		||||
#Server for save configs from HAproxy servers
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +39,8 @@ local_path_logs = /var/log/haproxy.log
 | 
			
		|||
#If exist syslog server for HAproxy logs
 | 
			
		||||
syslog_server_enable = 0
 | 
			
		||||
syslog_server = 
 | 
			
		||||
#Time of storage of logs of user activity, in days
 | 
			
		||||
log_time_storage = 14
 | 
			
		||||
 | 
			
		||||
[telegram]
 | 
			
		||||
#Send log message to telegram channel
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ print('<script src="/inc/users.js"></script>'
 | 
			
		|||
		'</td>'
 | 
			
		||||
		'<td class="padding10 first-collumn">'
 | 
			
		||||
			'<select id="haproxyaddserv">'
 | 
			
		||||
				'<option disable selected>Choose master</option>')
 | 
			
		||||
				'<option disable selected>Choose server</option>')
 | 
			
		||||
funct.choose_only_select(serv)
 | 
			
		||||
print('</select>'
 | 
			
		||||
		'</td>'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										59
									
								
								app/login.py
								
								
								
								
							
							
						
						
									
										59
									
								
								app/login.py
								
								
								
								
							| 
						 | 
				
			
			@ -7,6 +7,9 @@ import funct
 | 
			
		|||
import http.cookies
 | 
			
		||||
import sql
 | 
			
		||||
import create_db
 | 
			
		||||
import datetime
 | 
			
		||||
import uuid
 | 
			
		||||
from configparser import ConfigParser, ExtendedInterpolation
 | 
			
		||||
 | 
			
		||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
form = cgi.FieldStorage()
 | 
			
		||||
| 
						 | 
				
			
			@ -14,17 +17,23 @@ ref = form.getvalue('ref')
 | 
			
		|||
login = form.getvalue('login')
 | 
			
		||||
password = form.getvalue('pass')
 | 
			
		||||
 | 
			
		||||
path_config = "haproxy-webintarface.config"
 | 
			
		||||
config = ConfigParser(interpolation=ExtendedInterpolation())
 | 
			
		||||
config.read(path_config)	
 | 
			
		||||
 | 
			
		||||
def login_page(error):
 | 
			
		||||
	if error == "error":
 | 
			
		||||
		funct.head("Login page")
 | 
			
		||||
		printError = "<h2>Login page. Enter please</h2><br /><br /><b style='color: red'>Somthing wrong :( I'm sad about this, but try again!</b><br /><br />"
 | 
			
		||||
	else:
 | 
			
		||||
		printError = "<h2>Login page. Enter please</h2><br /><br />"	
 | 
			
		||||
		
 | 
			
		||||
	
 | 
			
		||||
	if create_db.check_db():
 | 
			
		||||
		if create_db.create_table():
 | 
			
		||||
			print('<div class="alert alert-success">DB was created<br />')
 | 
			
		||||
			create_db.update_all()
 | 
			
		||||
			print('<br />Now you can login, default: admin/admin</div>')
 | 
			
		||||
	create_db.update_all_silent()
 | 
			
		||||
	
 | 
			
		||||
	ref = form.getvalue('ref')
 | 
			
		||||
	if ref is None:
 | 
			
		||||
| 
						 | 
				
			
			@ -38,40 +47,46 @@ def login_page(error):
 | 
			
		|||
	print('<button type="submit" name="Login" value="Enter">Sign Up</button>')
 | 
			
		||||
	print('</form></center>')
 | 
			
		||||
	
 | 
			
		||||
	try:
 | 
			
		||||
		if config.get('main', 'session_ttl'):
 | 
			
		||||
			session_ttl = config.getint('main', 'session_ttl')
 | 
			
		||||
	except:
 | 
			
		||||
		print('<center><div class="alert alert-danger">Can not find "session_ttl" parametr. Check into config, "main" section</div>')	
 | 
			
		||||
	
 | 
			
		||||
if form.getvalue('logout') is not None:
 | 
			
		||||
	print("Set-cookie: login=; expires=Wed May 18 03:33:20 2003; path=/app/; httponly")
 | 
			
		||||
	print("Set-cookie: role=; expires=Wed May 18 03:33:20 2003; path=/app/; httponly")
 | 
			
		||||
	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
	user_id = cookie.get('uuid')
 | 
			
		||||
	try:
 | 
			
		||||
		sql.delete_uuid(user_id.value)
 | 
			
		||||
	except:
 | 
			
		||||
		pass
 | 
			
		||||
	print("Set-cookie: uuid=; expires=Wed May 18 03:33:20 2003; path=/app/; httponly")
 | 
			
		||||
	print("Content-type: text/html\n")
 | 
			
		||||
	print('<meta http-equiv="refresh" content="0; url=/overview.py">')
 | 
			
		||||
	print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
 | 
			
		||||
	
 | 
			
		||||
if login is None:		
 | 
			
		||||
	funct.head("Login page")
 | 
			
		||||
	login_page("n")
 | 
			
		||||
	
 | 
			
		||||
if login is not None and password is not None:
 | 
			
		||||
	if form.getvalue('ref') is None:
 | 
			
		||||
		ref = "/index.html"	
 | 
			
		||||
		
 | 
			
		||||
	USERS = sql.select_users()
 | 
			
		||||
	session_ttl = config.getint('main', 'session_ttl')
 | 
			
		||||
	expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl)
 | 
			
		||||
	user_uuid = str(uuid.uuid4())
 | 
			
		||||
	
 | 
			
		||||
	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 = 3
 | 
			
		||||
			c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
			c["login"] = login
 | 
			
		||||
			c["login"]["path"] = "/app/"
 | 
			
		||||
			c["login"]["expires"] = "Wed May 18 03:33:20 2033"
 | 
			
		||||
			c["role"] = role
 | 
			
		||||
			c["role"]["path"] = "/app/"
 | 
			
		||||
			c["role"]["expires"] = "Wed May 18 03:33:20 2033"
 | 
			
		||||
			c["group"] = users[4]
 | 
			
		||||
			c["group"]["path"] = "/app/"
 | 
			
		||||
			c["group"]["expires"] = "Wed May 18 03:33:20 2033"
 | 
			
		||||
			c["uuid"] = user_uuid
 | 
			
		||||
			c["uuid"]["path"] = "/app/"
 | 
			
		||||
			c["uuid"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
 | 
			
		||||
			print(c)
 | 
			
		||||
			if form.getvalue('ref') is None:
 | 
			
		||||
				ref = "/index.html"		
 | 
			
		||||
			print("Content-type: text/html\n")
 | 
			
		||||
			sql.write_user_uuid(login, user_uuid)
 | 
			
		||||
				
 | 
			
		||||
			print("Content-type: text/html\n")			
 | 
			
		||||
			print('<html><head><title>Redirecting</title><meta charset="UTF-8">')
 | 
			
		||||
			print('<link href="/style.css" rel="stylesheet">')
 | 
			
		||||
			print('<meta http-equiv="refresh" content="0; url=%s">' % ref)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,6 +89,10 @@ if form.getvalue('ip') is not None and serv is not None:
 | 
			
		|||
	commands = [ "ip a |grep inet |egrep -v  '::1' |awk '{ print $2  }' |awk -F'/' '{ print $1  }'" ]
 | 
			
		||||
	funct.ssh_command(serv, commands, ip="1")
 | 
			
		||||
	
 | 
			
		||||
if form.getvalue('showif'):
 | 
			
		||||
	commands = ["ip link|grep 'UP' | awk '{print $2}'  |awk -F':' '{print $1}'"]
 | 
			
		||||
	funct.ssh_command(serv, commands, ip="1")
 | 
			
		||||
	
 | 
			
		||||
if form.getvalue('action') is not None and serv is not None:
 | 
			
		||||
	serv = form.getvalue('serv')
 | 
			
		||||
	action = form.getvalue('action')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -81,10 +81,11 @@ def get_overview():
 | 
			
		|||
			print('<a id="%s" class="start" title="Start HAproxy service" onclick = "if (! confirm(\'Start service?\')) return false;"><img src=/image/pic/start.png alt="start" class="icon"></a>' % server[2])
 | 
			
		||||
			print('<a id="%s" class="stop" title="Stop HAproxy service" onclick = "return confirm(\'Stop service?\')"><img src=/image/pic/stop.png alt="start" class="icon"></a>' % server[2])
 | 
			
		||||
			print('<a id="%s" class="restart" title="Restart HAproxy service" onclick = "if (! confirm(\'Restart service?\')) return false;"><img src=/image/pic/update.png alt="restart" class="icon"></a>' % server[2])
 | 
			
		||||
		print('<a href="/app/configshow.py?serv=%s&open=open#conf"  title="Show config"><img src=/image/pic/show.png alt="show" class="icon"></a>' % server[2])
 | 
			
		||||
		print('<a href="/app/config.py?serv=%s&open=open#conf"  title="Edit config"><img src=/image/pic/edit.png alt="edit" class="icon"></a>' % server[2])
 | 
			
		||||
		print('<a href="/app/diff.py?serv=%s&open=open#diff"  title="Compare config"><img src=/image/pic/compare.png alt="compare" class="icon"></a>' % server[2])
 | 
			
		||||
		print('<a href="/app/map.py?serv=%s&open=open#map"  title="Map listen/frontend/backend"><img src=/image/pic/map.png alt="map" class="icon"></a>' % server[2])
 | 
			
		||||
		if funct.is_admin(level = 2):
 | 
			
		||||
			print('<a href="/app/configshow.py?serv=%s&open=open#conf"  title="Show config"><img src=/image/pic/show.png alt="show" class="icon"></a>' % server[2])
 | 
			
		||||
			print('<a href="/app/config.py?serv=%s&open=open#conf"  title="Edit config"><img src=/image/pic/edit.png alt="edit" class="icon"></a>' % server[2])
 | 
			
		||||
			print('<a href="/app/diff.py?serv=%s&open=open#diff"  title="Compare config"><img src=/image/pic/compare.png alt="compare" class="icon"></a>' % server[2])
 | 
			
		||||
			print('<a href="/app/map.py?serv=%s&open=open#map"  title="Map listen/frontend/backend"><img src=/image/pic/map.png alt="map" class="icon"></a>' % server[2])
 | 
			
		||||
		print('</td><td>')
 | 
			
		||||
		funct.ssh_command(server[2], commands1)
 | 
			
		||||
		print('</td><td></td></tr>')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										66
									
								
								app/sql.py
								
								
								
								
							
							
						
						
									
										66
									
								
								app/sql.py
								
								
								
								
							| 
						 | 
				
			
			@ -168,14 +168,14 @@ def update_server_master(master, slave):
 | 
			
		|||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
 | 
			
		||||
		print('<span class="alert alert-danger" id="error">An error occurred: ' + e + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
 | 
			
		||||
	for id in cur.fetchall():
 | 
			
		||||
		sql = """ update servers set master = '%s' where ip = '%s' """ % (id[0], slave)
 | 
			
		||||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
		con.commit()
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
 | 
			
		||||
		print('<span class="alert alert-danger" id="error">An error occurred: ' + e + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
 | 
			
		||||
		con.rollback()
 | 
			
		||||
	cur.close()    
 | 
			
		||||
	con.close()
 | 
			
		||||
| 
						 | 
				
			
			@ -289,13 +289,69 @@ def get_enable_checkbox(id, **kwargs):
 | 
			
		|||
	cur.close()    
 | 
			
		||||
	con.close() 
 | 
			
		||||
	
 | 
			
		||||
def write_user_uuid(login, user_uuid):
 | 
			
		||||
	con, cur = create_db.get_cur()
 | 
			
		||||
	sql = """ select id from user where username = '%s' """ % login
 | 
			
		||||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
 | 
			
		||||
	for id in cur.fetchall():
 | 
			
		||||
		sql = """ insert into uuid (user_id, uuid) values('%s', '%s') """ % (id[0], user_uuid)
 | 
			
		||||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
		con.commit()
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print('<span class="alert alert-danger" id="error">An error occurred: ' + e + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
 | 
			
		||||
		con.rollback()
 | 
			
		||||
	cur.close()    
 | 
			
		||||
	con.close()
 | 
			
		||||
	
 | 
			
		||||
def delete_uuid(uuid):
 | 
			
		||||
	con, cur = create_db.get_cur()
 | 
			
		||||
	sql = """ delete from uuid where uuid = '%s' """ % uuid
 | 
			
		||||
	try:
 | 
			
		||||
		cur.execute(sql)		
 | 
			
		||||
		con.commit()
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		pass
 | 
			
		||||
	cur.close()    
 | 
			
		||||
	con.close() 
 | 
			
		||||
	
 | 
			
		||||
def get_user_name_by_uuid(uuid):
 | 
			
		||||
	con, cur = create_db.get_cur()
 | 
			
		||||
	sql = """ select user.username from user left join uuid as uuid on user.id = uuid.user_id where uuid.uuid = '%s' """ % uuid
 | 
			
		||||
	try:
 | 
			
		||||
		cur.execute(sql)		
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print("An error occurred:", e)
 | 
			
		||||
	else:
 | 
			
		||||
		for user_id in cur.fetchall():
 | 
			
		||||
			return user_id[0]
 | 
			
		||||
	cur.close()    
 | 
			
		||||
	con.close() 
 | 
			
		||||
	
 | 
			
		||||
def get_user_role_by_uuid(uuid):
 | 
			
		||||
	con, cur = create_db.get_cur()
 | 
			
		||||
	sql = """ select role.id from user left join uuid as uuid on user.id = uuid.user_id left join role on role.name = user.role where uuid.uuid = '%s' """ % uuid
 | 
			
		||||
	try:
 | 
			
		||||
		cur.execute(sql)		
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print("An error occurred:", e)
 | 
			
		||||
	else:
 | 
			
		||||
		for user_id in cur.fetchall():
 | 
			
		||||
			return user_id[0]
 | 
			
		||||
	cur.close()    
 | 
			
		||||
	con.close() 
 | 
			
		||||
	
 | 
			
		||||
def get_dick_permit(**kwargs):
 | 
			
		||||
	import http.cookies
 | 
			
		||||
	import os
 | 
			
		||||
	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 | 
			
		||||
	login = cookie.get('login')
 | 
			
		||||
	user_id = cookie.get('uuid')
 | 
			
		||||
	
 | 
			
		||||
	con, cur = create_db.get_cur()
 | 
			
		||||
	sql = """ select * from user where username = '%s' """ % login.value
 | 
			
		||||
	sql = """ select * from user where username = '%s' """ % get_user_name_by_uuid(user_id.value)
 | 
			
		||||
	if kwargs.get('virt'):
 | 
			
		||||
		type_ip = "" 
 | 
			
		||||
	else:
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +359,7 @@ def get_dick_permit(**kwargs):
 | 
			
		|||
	try:    
 | 
			
		||||
		cur.execute(sql)
 | 
			
		||||
	except sqltool.Error as e:
 | 
			
		||||
		print("An error occurred:", e.args[0])
 | 
			
		||||
		print("An error occurred:", e)
 | 
			
		||||
	else:
 | 
			
		||||
		for group in cur:
 | 
			
		||||
			if group[5] == '1':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ import os, sys
 | 
			
		|||
import funct
 | 
			
		||||
from configparser import ConfigParser, ExtendedInterpolation
 | 
			
		||||
import glob
 | 
			
		||||
import datetime
 | 
			
		||||
 | 
			
		||||
form = cgi.FieldStorage()
 | 
			
		||||
viewlog = form.getvalue('viewlogs')
 | 
			
		||||
| 
						 | 
				
			
			@ -21,18 +22,30 @@ config.read(path_config)
 | 
			
		|||
try:
 | 
			
		||||
	if config.get('main', 'log_path'):
 | 
			
		||||
		log_path = config.get('main', 'log_path')
 | 
			
		||||
		time_storage = config.getint('logs', 'log_time_storage')
 | 
			
		||||
except:
 | 
			
		||||
	print('<center><div class="alert alert-danger">Can not find "log_path" parametr. Check into config</div>')	
 | 
			
		||||
	print('<center><div class="alert alert-danger">Can not find "log_path" and "log_time_storage" parametrs. Check into config</div>')	
 | 
			
		||||
try:
 | 
			
		||||
	os.chdir(log_path)
 | 
			
		||||
except IOError:
 | 
			
		||||
	print('<center><div class="alert alert-danger">No such file or directory: "%s". Please check log_path in config and exist directory</div>' % log_path)
 | 
			
		||||
	print('<center><div class="alert alert-danger">No such file or directory: "%s". Please check "log_path" in config and exist directory</div>' % log_path)
 | 
			
		||||
	sys.exit()
 | 
			
		||||
	
 | 
			
		||||
print('<script src="/inc/users.js"></script>'
 | 
			
		||||
		'<a name="top"></a>'
 | 
			
		||||
		'<center><h3>Choose log file</h3><br />')
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
	time_storage_hours = time_storage * 24
 | 
			
		||||
	for dirpath, dirnames, filenames in os.walk(log_path):
 | 
			
		||||
		for file in filenames:
 | 
			
		||||
			curpath = os.path.join(dirpath, file)
 | 
			
		||||
			file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
 | 
			
		||||
			if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours):
 | 
			
		||||
				os.remove(curpath)
 | 
			
		||||
except:
 | 
			
		||||
	print('<center><div class="alert alert-danger" style="margin: 0; margin-bottom: 10px;">Can\'t delete old logs file. <br> Please check "log_time_storage" in config and <br>exist directory </div>')
 | 
			
		||||
	pass
 | 
			
		||||
	
 | 
			
		||||
print('<select id="viewlogs">'
 | 
			
		||||
			'<option disabled selected>Choose log</option>')
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ print('<br />'
 | 
			
		|||
			'<select autofocus required name="serv" id="serv">'
 | 
			
		||||
				'<option disabled>Choose server</option>')
 | 
			
		||||
 | 
			
		||||
funct.choose_only_select(serv, master_slave=1)
 | 
			
		||||
funct.choose_only_select(serv, virt=1)
 | 
			
		||||
 | 
			
		||||
print('</select>'		
 | 
			
		||||
		'<a class="ui-button ui-widget ui-corner-all" id="show" title="Show stats" onclick="showStats()">Show</a>'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,15 @@
 | 
			
		|||
var url = "/inc/script.js";
 | 
			
		||||
var cur_url = window.location.href.split('/').pop();
 | 
			
		||||
cur_url = cur_url.split('?');
 | 
			
		||||
var intervalId;
 | 
			
		||||
 | 
			
		||||
function autoRefreshStyle(autoRefresh) {
 | 
			
		||||
	var margin;
 | 
			
		||||
	if (cur_url[0] == "overview.py") {
 | 
			
		||||
		if(autoRefresh < 60000) {
 | 
			
		||||
			autoRefresh = 60000;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	autoRefresh = autoRefresh / 1000;
 | 
			
		||||
	if ( autoRefresh == 60) {
 | 
			
		||||
		timeRange = " minute"
 | 
			
		||||
| 
						 | 
				
			
			@ -44,10 +54,6 @@ function setRefreshInterval(interval) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var url = "/inc/script.js";
 | 
			
		||||
var cur_url = window.location.href.split('/').pop();
 | 
			
		||||
cur_url = cur_url.split('?');
 | 
			
		||||
var intervalId;
 | 
			
		||||
function startSetInterval(interval) {	
 | 
			
		||||
	if (cur_url[0] == "logs.py") {
 | 
			
		||||
		intervalId = setInterval('showLog()', interval);
 | 
			
		||||
| 
						 | 
				
			
			@ -56,6 +62,9 @@ function startSetInterval(interval) {
 | 
			
		|||
		intervalId = setInterval('showStats()', interval);
 | 
			
		||||
		showStats()
 | 
			
		||||
	} else if (cur_url[0] == "overview.py") {
 | 
			
		||||
		if(interval < 60000) {
 | 
			
		||||
			interval = 60000;
 | 
			
		||||
		}
 | 
			
		||||
		intervalId = setInterval('showOverview()', interval);
 | 
			
		||||
		showOverview(); 
 | 
			
		||||
	} else if (cur_url[0] == "viewlogs.py") {
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +106,6 @@ function showOverview() {
 | 
			
		|||
		type: "GET",
 | 
			
		||||
		success: function( data ) {
 | 
			
		||||
			$("#ajax").html(data);
 | 
			
		||||
			$.getScript(url);
 | 
			
		||||
		}					
 | 
			
		||||
	} );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -308,7 +316,7 @@ $( function() {
 | 
			
		|||
	});
 | 
			
		||||
 | 
			
		||||
    var location = window.location.href;
 | 
			
		||||
    var cur_url = '/cgi-bin/' + location.split('/').pop();
 | 
			
		||||
    var cur_url = '/app/' + location.split('/').pop();
 | 
			
		||||
	cur_url = cur_url.split('?');
 | 
			
		||||
		
 | 
			
		||||
    $('.menu li').each(function () {
 | 
			
		||||
| 
						 | 
				
			
			@ -656,6 +664,40 @@ $( function() {
 | 
			
		|||
		autoFocus: true,
 | 
			
		||||
		minLength: -1
 | 
			
		||||
	});
 | 
			
		||||
	$( "#interface" ).autocomplete({
 | 
			
		||||
		source: function( request, response ) {
 | 
			
		||||
			$.ajax( {
 | 
			
		||||
				url: "options.py",
 | 
			
		||||
				data: {
 | 
			
		||||
					showif:1,
 | 
			
		||||
					serv: $("#master").val()
 | 
			
		||||
				},
 | 
			
		||||
				success: function( data ) {
 | 
			
		||||
					data = data.replace(/\s+/g,' ');
 | 
			
		||||
					response(data.split(" "));
 | 
			
		||||
				}						
 | 
			
		||||
			} );
 | 
			
		||||
		},
 | 
			
		||||
		autoFocus: true,
 | 
			
		||||
		minLength: -1
 | 
			
		||||
	});
 | 
			
		||||
	$( "#interface-add" ).autocomplete({
 | 
			
		||||
		source: function( request, response ) {
 | 
			
		||||
			$.ajax( {
 | 
			
		||||
				url: "options.py",
 | 
			
		||||
				data: {
 | 
			
		||||
					showif:1,
 | 
			
		||||
					serv: $("#master").val()
 | 
			
		||||
				},
 | 
			
		||||
				success: function( data ) {
 | 
			
		||||
					data = data.replace(/\s+/g,' ');
 | 
			
		||||
					response(data.split(" "));
 | 
			
		||||
				}						
 | 
			
		||||
			} );
 | 
			
		||||
		},
 | 
			
		||||
		autoFocus: true,
 | 
			
		||||
		minLength: -1
 | 
			
		||||
	});
 | 
			
		||||
	$( "#ssl_key_upload" ).click(function() {
 | 
			
		||||
		$('.alert-danger').remove();
 | 
			
		||||
		$.ajax( {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ $( function() {
 | 
			
		|||
			}
 | 
			
		||||
		} );	
 | 
			
		||||
	});
 | 
			
		||||
	$('.alert-danger').remove();	
 | 
			
		||||
	//$('.alert-danger').remove();	
 | 
			
		||||
 | 
			
		||||
	$('#add-user').click(function() {
 | 
			
		||||
		$('#error').remove();	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue