187 lines
6.6 KiB
Python
187 lines
6.6 KiB
Python
import os
|
|
|
|
@app.route("/roles")
|
|
@login_required
|
|
def roles():
|
|
env = "prod"
|
|
host = os.uname()[1]
|
|
roles = client.run("pillar.items",client="local", tgt=host)[host]["roles"]
|
|
print(roles)
|
|
#add servers that have each role
|
|
dname = "/srv/salt/" + env + "/pillars/servers/roles/server/"
|
|
for role in roles:
|
|
roles[role]["servers"]=[]
|
|
for fname in os.listdir(dname):
|
|
f = open(dname+fname,"r")
|
|
lines = f.readlines()
|
|
f.close()
|
|
sname = os.path.splitext(fname)[0]
|
|
print(sname)
|
|
for line in lines:
|
|
role = line.replace("-","").replace("\n","").strip()
|
|
if role != "roles:" and role != "grains:":
|
|
roles[role]["servers"].append(sname)
|
|
print(roles)
|
|
|
|
usr = session.get('username')
|
|
from subprocess import check_output
|
|
grpstr = check_output(["groups", usr])
|
|
groups = grpstr.split(" : ")[1].split()
|
|
maintainers = [usr]
|
|
for grp in groups:
|
|
maintainers.append("%"+grp+"%")
|
|
print(maintainers)
|
|
return render_template('roles.html', roles=roles, mnts=maintainers)
|
|
|
|
@app.route("/role_add/<role>")
|
|
@login_required
|
|
def role_add(role):
|
|
env = "prod"
|
|
#we need to create a file at pillars/maintainer/roles/[role].sls for this page. it should have the current user as initial maintainer
|
|
#Only do if file doesn't already exist
|
|
fname = "/srv/salt/" + env + "/pillars/roles/maintainer/" + role + ".sls"
|
|
if not (os.path.exists(fname)):
|
|
f = open(fname,"w")
|
|
f.write("roles:\n")
|
|
f.write(" "+role+":\n")
|
|
f.write(" maintainer:\n")
|
|
user = session.get('username')
|
|
f.write(" - "+user+"\n")
|
|
f.close()
|
|
#We need to add role to pillars/maintainer/roles/init.sls
|
|
fname = "/srv/salt/" + env + "/pillars/roles/maintainer/init.sls"
|
|
if (os.path.exists(fname)):
|
|
f = open(fname,"a")
|
|
f.write(" - roles.maintainer." + role + "\n")
|
|
f.close()
|
|
return redirect("/roles",302)
|
|
|
|
@app.route("/role_del/<role>")
|
|
@login_required
|
|
def role_del(role):
|
|
if is_role_maintainer(role):
|
|
env = "prod"
|
|
#We need to remove role from pillars/maintainer/roles/init.sls
|
|
fname = "/srv/salt/" + env + "/pillars/roles/maintainer/init.sls"
|
|
if (os.path.exists(fname)):
|
|
f = open(fname,"r")
|
|
lines = f.readlines()
|
|
f.close()
|
|
f = open(fname,"w")
|
|
for line in lines:
|
|
if line != " - roles.maintainer." + role + "\n":
|
|
f.write(line)
|
|
f.close()
|
|
#we need to remove maintainer file for the role if it exists
|
|
fname = "/srv/salt/" + env + "/pillars/roles/maintainer/" + role + ".sls"
|
|
if (os.path.exists(fname)):
|
|
os.remove(fname)
|
|
#We need to remove references to the role next
|
|
dname = "/srv/salt/" + env + "/pillars/servers/roles/server/"
|
|
for fname in os.listdir(dname):
|
|
f = open(dname+fname,"r")
|
|
lines = f.readlines()
|
|
f.close()
|
|
f = open(dname+fname,"w")
|
|
for line in lines:
|
|
if line != " - " + role + "\n":
|
|
f.write(line)
|
|
f.close()
|
|
return redirect("/roles",302)
|
|
|
|
@app.route("/role/<role>")
|
|
@login_required
|
|
def role_display(role):
|
|
#build json object
|
|
env = "prod"
|
|
rjson = {}
|
|
dname = "/srv/salt/" + env + "/pillars/roles/"
|
|
for folder in os.listdir(dname):
|
|
print(folder)
|
|
if os.path.isdir(dname + folder):
|
|
#grab matching file
|
|
fname = dname + folder + "/" + role + ".sls"
|
|
rjson[folder]=[]
|
|
if os.path.exists(fname):
|
|
f = open(fname,"r")
|
|
lines = f.readlines()
|
|
f.close()
|
|
for line in lines:
|
|
#add maintainers
|
|
if folder == "maintainer":
|
|
item = line.replace("-","").replace("\n","").strip()
|
|
if item != "roles:" and item != role+":" and item != "maintainer:":
|
|
rjson[folder].append(item)
|
|
else:
|
|
#add everything else
|
|
line=line.rstrip()
|
|
rjson[folder].append(line)
|
|
dname = "/srv/salt/" + env + "/pillars/servers/roles/server/"
|
|
rjson["servers"]=[]
|
|
for fname in os.listdir(dname):
|
|
f = open(dname+fname,"r")
|
|
lines = f.readlines()
|
|
f.close()
|
|
sname = os.path.splitext(fname)[0]
|
|
print(sname)
|
|
for line in lines:
|
|
thisrole = line.replace("-","").replace("\n","").strip()
|
|
if role == thisrole:
|
|
rjson["servers"].append(sname)
|
|
rjson["name"] = role
|
|
print(rjson)
|
|
return render_template('role_display.html', rjson=rjson, is_mnt=is_role_maintainer(rjson["name"]))
|
|
|
|
@app.route("/role_add_server/<role>/<server>")
|
|
@login_required
|
|
def role_add_server(role, server):
|
|
if is_server_maintainer(server):
|
|
env = "prod"
|
|
#We need to add role to pillars/servers/roles/server/<server>.sls
|
|
fname = "/srv/salt/" + env + "/pillars/servers/roles/server/" + server + ".sls"
|
|
print(fname)
|
|
print(server)
|
|
print(role)
|
|
if (os.path.exists(fname)):
|
|
f = open(fname,"a")
|
|
f.write(" - " + role + "\n")
|
|
f.close()
|
|
return redirect("/role/" + role,302)
|
|
|
|
@app.route("/role_rem_server/<role>/<server>")
|
|
@login_required
|
|
def role_rem_server(role, server):
|
|
if is_server_maintainer(server):
|
|
env = "prod"
|
|
#We need to remove role from pillars/servers/roles/server/<server>.sls
|
|
fname = "/srv/salt/" + env + "/pillars/servers/roles/server/" + server + ".sls"
|
|
print(fname)
|
|
print(server)
|
|
print(role)
|
|
if (os.path.exists(fname)):
|
|
f = open(fname,"r")
|
|
lines = f.readlines()
|
|
f.close()
|
|
f = open(fname,"w")
|
|
for line in lines:
|
|
if line != " - " + role + "\n":
|
|
f.write(line)
|
|
f.close()
|
|
return redirect("/role/" + role,302)
|
|
|
|
def is_role_maintainer(role):
|
|
host = os.uname()[1]
|
|
maintainers = client.run("pillar.items",client="local", tgt=host)[host]["roles"][role]["maintainer"]
|
|
usr = session.get('username')
|
|
from subprocess import check_output
|
|
grpstr = check_output(["groups", usr])
|
|
groups = grpstr.split(" : ")[1].split()
|
|
is_maintainer = False
|
|
if usr in maintainers:
|
|
is_maintainer = True
|
|
else:
|
|
for grp in groups:
|
|
if "%"+grp+"%" in maintainers:
|
|
is_maintainer = True
|
|
break
|
|
return is_maintainer
|