salt/states/roles/maintain/saltpad/modules/servers.py

121 lines
4.1 KiB
Python

@app.route("/servers")
@login_required
def servers():
env = "prod"
host = os.uname()[1]
accepted = client.run('key.list_all', client='wheel')['data']['return']['minions']
print(accepted)
#add maintainers for each server
dname = "/srv/salt/" + env + "/pillars/servers/maintainer/server/"
servers={}
for server in accepted:
servers[server]={}
servers[server]["maintainer"]=[]
servers[server]["roles"]=[]
print(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:
maintainer = line.replace("-","").replace("\n","").strip()
if maintainer != "maintainer:":
servers[sname]["maintainer"].append(maintainer)
#add roles for each server
dname = "/srv/salt/" + env + "/pillars/servers/roles/server/"
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:":
servers[sname]["roles"].append(role)
print(servers)
return render_template('servers.html', servers=servers)
@app.route("/servers/<server>")
@login_required
def server_display(server):
env = "prod"
host = os.uname()[1]
aroles = client.run("pillar.items",client="local", tgt=host)[host]["roles"]
sroles=[]
dname = "/srv/salt/" + env + "/pillars/servers/roles/server/"
fname = server + ".sls"
f = open(dname+fname,"r")
lines = f.readlines()
f.close()
for line in lines:
role = line.replace("-","").replace("\n","").strip()
if role != "roles:" and role != "grains:":
sroles.append(role)
del aroles[role]
return render_template('server_display.html', server=server, aroles=aroles, sroles=sroles,is_mnt=is_server_maintainer(server))
@app.route("/server_add_role/<server>/<role>")
@login_required
def server_add_role(server, role):
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("/servers/" + server,302)
@app.route("/server_rem_role/<server>/<role>")
@login_required
def server_rem_role(server, role):
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("/servers/" + server,302)
def is_server_maintainer(server):
env = "prod"
fname = "/srv/salt/" + env + "/pillars/servers/maintainer/server/"+server+".sls"
f = open(fname,"r")
lines = f.readlines()
f.close()
maintainers = []
for line in lines:
maintainer = line.replace("-","").replace("\n","").strip()
if maintainer != "maintainer:":
maintainers.append(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