Files
powerfulcomputermanager/admin/admin.py

275 lines
10 KiB
Python

#!/usr/bin/python3
from flask import Flask, url_for, render_template, request, Response,redirect,make_response
import os
import jinja2
import requests
import hashlib #SHA256
import json
import base64
import configparser
from datetime import datetime
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
BUILD=1
APIC_VER=2
# Load config to comunicate with API or use default
try:
config = configparser.ConfigParser()
config.read(os.path.relpath('..\\client\\configpcm.ini'))
c_server = config['General']['server']
except:
c_server = "https://127.0.0.1:3333" #Default server api address
app = Flask(__name__,static_url_path="/assets", static_folder='assets', template_folder="templates")
def returnvalueapi(suburl,field="Name"):
global c_server
passha256=request.cookies.get('admin_logued')
if 'Password=' in suburl:
twopart = ""
elif '?' in suburl:
twopart = '&Password='+str(passha256)
else:
twopart = '?Password='+str(passha256)
r=(requests.post(c_server+suburl+twopart, verify=False).text).replace("\'", "\"").replace('\\"',"'").replace(': None',': "None"')
try:
#print(suburl+twopart+"->"+r)
jsonobj = json.loads(r)
return jsonobj[field]
except:
print('Error: '+str(r))
return str({'TEXT':r,'RESULT':'ERROR'})
def returnTable(suburl,field=["Name"]):
global c_server
passha256=request.cookies.get('admin_logued')
if isinstance(field,str):
if field != 'ASIS': # Do not touch if it says that we have to return table AS IS
field=[field] # Convert to list
if 'Password=' in suburl:
twopart = ""
elif '?' in suburl:
twopart = '&Password='+str(passha256)
else:
twopart= '?Password='+str(passha256)
try:
r=(requests.post(c_server+suburl+twopart, verify=False).text).replace("\'", "\"").replace('\\"',"'").replace(': None',': "None"')
jsonobj = json.loads(r)
if field == 'ASIS':
return jsonobj
else:
listitems = []
for ite in jsonobj: # Run in array from json
to = []
for i in field:
to.append(str(ite[i]))
listitems.append(to)
return listitems
except:
return None
@app.route("/admin",methods=['GET'])
@app.route("/admin/",methods=['GET'])
def pAdminIndex(): #Admin Index page
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
table = returnTable("/get/computers",['ID_C','Name','RAM','CPUName','SOVersion','SOCaption','HDD','LastConnection','RAMFree'])
for lista in table:
lista.append(returnTable("/get/groups?ComputerID="+lista[0],["Name"])) #lista[9]¿
if lista[6] is not None:
try:
lista[6]=json.loads(base64.b64decode(lista[6]).decode('UTF-8'))
except:
lista[6]=json.loads(str("{}"))
else:
lista[6]=json.loads(str("{}"))
#print (lista[6])
try:
lista[7] = datetime.fromtimestamp(int(lista[7])).strftime('%Y-%m-%d %H:%M:%S') # LastConnection
except:
lista[7] = "Never"
return render_template('/adminindex.tmpl', title="Admin Dashboard",tablecomputers=table)
@app.route("/admin/addcomputer",methods=['GET'])
def pAdminAddcomputer():
computeradd=request.args.get('computeradd')
if computeradd is not None:
r = returnvalueapi("/add/computer?ComputerName="+computeradd,field="RESULT")
if r == "OK":
return redirect('/admin')
else:
return "ERROR"
else:
return redirect('/admin')
@app.route("/admin/delcomputer",methods=['GET'])
def pAdminDelcomputer():
computerdel=request.args.get('computerdel')
r = returnvalueapi("/del/computer?ComputerID="+computerdel,field="RESULT")
if r == "OK":
return redirect('/admin')
else:
return "ERROR"
@app.route("/admin/computer",methods=['GET'])
def pAdminComputer(): #Admin see one group
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
computerid=request.args.get('ID_C')
if computerid is not None and computerid.isnumeric():
computername = returnvalueapi('/get/computers?ComputerID='+str(computerid),"Name")
groups = returnTable("/get/groups?ComputerName="+str(computername),['ID_G','Name'])
#####IT DOESNT HAVE TEMPLATE CREATED
return render_template('/admincomputer.tmpl', title="Computer "+computername,computerid=computerid,computername=computername,groups=groups)
return redirect('/admin')
@app.route("/admin/groups",methods=['GET'])
def pAdminGroups(): #Admin Index groups
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
table = returnTable("/get/groups",['ID_G','Name'])
for lista in table:
lista.append(returnTable("/get/computersgrp?GroupID="+lista[0],['ID_C','Name'])) #lista[3]¿
lista.append(returnTable("/get/cookgrp?GroupID="+lista[0],['CookName'])) #lista[4]¿
return render_template('/admingroups.tmpl', title="Groups",tablegroups=table)
@app.route("/admin/group",methods=['GET'])
def pAdminGroup(): #Admin see one group
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
groupid=request.args.get('ID_G')
if groupid is not None and groupid.isnumeric():
groupname=returnvalueapi('/get/groups?GroupID='+str(groupid),"Name")
computers = returnTable("/get/computers",['ID_C','Name'])
datagroup = (returnTable("/get/computersgrp?GroupID="+groupid,['ID_C','Name'])) #lista[0]¿
tem = (returnTable("/get/cookgrp?GroupID="+groupid,['CookName'])) #lista[1]¿
cooksdata = []
for cook in tem:
to = []
to.append(cook[0])
to.append(returnvalueapi('/get/lastrevisioncook?CookName='+cook[0],"Revision"))
to.append(returnTable("/get/statuscook?CookName="+cook[0],'ASIS'))
cooksdata.append(to)
tem = (returnTable("/get/cookall",'ASIS')) #Lista de todas las recetas
allcooks = []
for cook in tem['CookName']:
to = []
to.append(cook)
to.append(returnvalueapi('/get/lastrevisioncook?CookName='+cook,"Revision"))
allcooks.append(to)
return render_template('/admingroup.tmpl', title="Group "+groupname,groupname=groupname,groupid=groupid,datagroup=datagroup,cooksdata=cooksdata,computers=computers,allcooks=allcooks)
return redirect('/admin/groups')
@app.route("/admin/group/addcook",methods=['GET'])
def pAdminGroupAddcook(): #Add cook form enter
cooktoadd=request.args.get('cooknameadd')
groupid=request.args.get('groupid')
if cooktoadd != None and groupid != None:
r = returnvalueapi("/add/cookgrp?CookName="+cooktoadd+"&GroupID="+groupid,field="RESULT")
if r == "OK":
return redirect('/admin/group?ID_G='+groupid)
@app.route("/admin/group/addcomputer",methods=['GET'])
def pAdminGroupAddcomputer(): #Add computer form enter
computertoadd=request.args.get('computeridadd')
groupid=request.args.get('groupid')
if computertoadd != None and groupid != None:
r = returnvalueapi("/add/grpcomputer?ComputerID="+computertoadd+"&GroupID="+groupid,field="RESULT")
if r == "OK":
return redirect('/admin/group?ID_G='+groupid)
@app.route("/admin/group/delcomputer",methods=['GET'])
def pAdminGroupDelcomputer(): #Add computer form enter
computertodel=request.args.get('computernamedel')
groupid=request.args.get('groupid')
if computertodel != None and groupid != None:
r = returnvalueapi("/del/grpcomputer?ComputerName="+computertodel+"&GroupID="+groupid,field="RESULT")
if r == "OK":
return redirect('/admin/group?ID_G='+groupid)
else:
return redirect('/admin/group?ID_G='+groupid)
@app.route("/admin/cook",methods=['GET'])
def pAdminCook(): #Admin Index groups
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
cookname=request.args.get('CookName')
if cookname != None:
groupscook=returnTable('/get/grpcook?CookName='+str(cookname),['Name'])
allgroups=returnTable('/get/groups',['ID_G','Name'])
return render_template('/admincook.tmpl', title="Cook "+cookname,cookname=cookname,allgroups=allgroups,groupscook=groupscook)
@app.route("/admin/cook/addgroup",methods=['GET'])
def pAdminCookAddgroup(): # Add cook to group
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
cookname=request.args.get('cooknameadd')
groupid=request.args.get('groupidadd')
if cookname != None and groupid != None:
returnvalueapi('/add/cookgrp?CookName='+cookname+'&GroupID='+groupid,'RESULT')
return redirect('/admin/cook?CookName='+cookname)
else:
return "Error of arguments"
@app.route("/admin/cook/delgroup",methods=['GET'])
def pAdminCookDelgroup(): # Add cook to group
if returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE') != '0':
return render_template('/login.tmpl', title="Login")
cookname=request.args.get('cooknamedel')
groupname=request.args.get('groupnamedel')
if cookname != None and groupname != None:
ret = returnvalueapi('/del/cookgrp?CookName='+cookname+'&GroupName='+groupname,'RESULT')
if ret != '0':
return "Error "+str(ret)
return redirect('/admin/cook?CookName='+cookname)
else:
return "Error of arguments"
@app.route("/",methods=['GET'])
def pIndex(): #Index page
howispasswd=returnvalueapi('/check/password?Password='+str(request.cookies.get('admin_logued')),'EXITCODE')
if howispasswd == '0': # Logued
return redirect(url_for('pAdminIndex'))
if howispasswd == '1' or howispasswd == '2': # Has to login
return render_template('/login.tmpl')
if howispasswd == '3': # No password yet
return 'Yet to do it..'
@app.route("/login",methods=['GET','POST'])
def pLogin(): #Login
if request.values.get('password'):
trpass = hashlib.sha256(request.values.get('password').encode()).hexdigest()
#print(returnvalueapi('/check/password?Password='+trpass,'EXITCODE'))
if returnvalueapi('/check/password?Password='+trpass,'EXITCODE') == '0':
res = make_response(redirect(url_for('pAdminIndex')))
res.set_cookie("admin_logued",value=trpass)
return res
else:
return render_template('/login.tmpl')
else:
return render_template('/login.tmpl')
print("Build: "+str(BUILD))
print("API Client Compatible Version: "+str(APIC_VER))
app.run(debug=True,port=3434,ssl_context='adhoc',host='0.0.0.0',threaded=True) #Default is port 3434