1
Fork 0
mirror of https://github.com/Steffo99/estus.git synced 2024-11-22 07:34:19 +00:00
estus/server.py

815 lines
31 KiB
Python
Raw Normal View History

2017-09-12 07:39:18 +00:00
import os
2017-02-02 08:33:54 +00:00
from flask import Flask, session, url_for, redirect, request, render_template, abort
2017-02-01 07:21:18 +00:00
from flask_sqlalchemy import SQLAlchemy
2017-09-12 09:41:13 +00:00
from sqlalchemy.exc import IntegrityError
2017-09-11 10:57:41 +00:00
import bcrypt
2017-09-13 10:48:41 +00:00
import random
2017-02-01 07:21:18 +00:00
app = Flask(__name__)
app.secret_key = os.environ["flask_secret_key"]
2017-02-01 07:21:18 +00:00
# SQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
2017-09-12 07:39:18 +00:00
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
2017-02-01 07:21:18 +00:00
db = SQLAlchemy(app)
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
class User(db.Model):
2017-09-12 09:39:21 +00:00
"""Utente per il login sul sito dell'inventario."""
2017-09-12 07:39:18 +00:00
__tablename__ = "website_users"
2017-02-01 07:21:18 +00:00
uid = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, unique=True, nullable=False)
passwd = db.Column(db.LargeBinary, nullable=False)
2017-02-01 07:21:18 +00:00
def __init__(self, username, passwd):
self.username = username
self.passwd = passwd
def __repr__(self):
return "<User {}>".format(self.username, self.passwd)
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
class Ente(db.Model):
2017-09-12 09:39:21 +00:00
"""Ente (Unione Terre di Castelli, Comune di Vignola...)."""
2017-09-12 07:39:18 +00:00
__tablename__ = "enti"
2017-02-01 07:21:18 +00:00
eid = db.Column(db.Integer, primary_key=True)
2017-09-12 07:40:47 +00:00
nomeente = db.Column(db.String)
nomebreveente = db.Column(db.String)
2017-09-14 09:20:12 +00:00
servizi = db.relationship("Servizio", backref='ente', lazy='dynamic', cascade="delete")
2017-02-01 07:21:18 +00:00
def __init__(self, nomeente, nomebreveente):
self.nomeente = nomeente
self.nomebreveente = nomebreveente
2017-02-01 07:21:18 +00:00
def __repr__(self):
return "<Ente {}>".format(self.nomebreveente)
2017-02-01 07:21:18 +00:00
class Servizio(db.Model):
2017-09-12 09:39:21 +00:00
"""Servizio di un ente (Anagrafe, Ufficio Scuola, Sindaco)."""
2017-09-12 07:39:18 +00:00
__tablename__ = "servizi"
2017-02-01 07:21:18 +00:00
sid = db.Column(db.Integer, primary_key=True)
2017-09-12 07:39:18 +00:00
eid = db.Column(db.Integer, db.ForeignKey('enti.eid'))
2017-09-12 07:40:47 +00:00
nomeservizio = db.Column(db.String)
locazione = db.Column(db.String)
2017-09-14 09:20:12 +00:00
impiegati = db.relationship("Impiegato", backref='servizio', lazy='dynamic', cascade="delete")
2017-02-01 07:21:18 +00:00
2017-09-11 13:56:42 +00:00
def __init__(self, eid, nomeservizio, locazione):
2017-02-01 07:21:18 +00:00
self.eid = eid
self.nomeservizio = nomeservizio
2017-09-11 13:56:42 +00:00
self.locazione = locazione
2017-02-01 07:21:18 +00:00
def __repr__(self):
return "<Servizio {}>".format(self.nomeservizio)
2017-02-01 07:21:18 +00:00
class Impiegato(db.Model):
2017-09-12 09:39:21 +00:00
"""Impiegato in uno dei servizi."""
2017-09-12 07:39:18 +00:00
__tablename__ = "impiegati"
2017-02-01 07:21:18 +00:00
iid = db.Column(db.Integer, primary_key=True)
2017-09-12 07:39:18 +00:00
sid = db.Column(db.Integer, db.ForeignKey('servizi.sid'))
2017-09-12 07:40:47 +00:00
nomeimpiegato = db.Column(db.String)
username = db.Column(db.String)
2017-09-12 07:40:47 +00:00
passwd = db.Column(db.String)
2017-09-14 09:20:12 +00:00
dispositivi = db.relationship("Accesso", backref='impiegato', lazy='dynamic', cascade="delete")
2017-02-01 07:21:18 +00:00
def __init__(self, sid, nomeimpiegato, username, passwd):
2017-02-01 07:21:18 +00:00
self.sid = sid
self.nomeimpiegato = nomeimpiegato
2017-02-01 07:21:18 +00:00
self.username = username
self.passwd = passwd
def __repr__(self):
2017-02-02 08:33:54 +00:00
return "<Impiegato {}>".format(self.nome)
class Dispositivo(db.Model):
2017-09-12 09:39:21 +00:00
"""Dispositivo gestito dal CED registrato nell'inventario."""
2017-09-12 07:39:18 +00:00
__tablename__ = "dispositivi"
2017-02-02 08:33:54 +00:00
did = db.Column(db.Integer, primary_key=True)
2017-09-14 09:20:12 +00:00
accessi = db.relationship("Accesso", backref='dispositivo', lazy='dynamic', cascade="delete")
2017-09-12 07:40:47 +00:00
tipo = db.Column(db.String)
marca = db.Column(db.String)
modello = db.Column(db.String)
inv_ced = db.Column(db.Integer, unique=True)
inv_ente = db.Column(db.Integer, unique=True)
2017-09-12 07:40:47 +00:00
fornitore = db.Column(db.String)
seriale = db.Column(db.String)
ip = db.Column(db.String)
2017-09-12 07:39:18 +00:00
nid = db.Column(db.Integer, db.ForeignKey('reti.nid'))
rete = db.relationship("Rete", backref='dispositivi')
2017-02-02 08:33:54 +00:00
def __init__(self, tipo, marca, modello, inv_ced, inv_ente, fornitore, nid, seriale, ip):
2017-02-02 08:33:54 +00:00
self.tipo = tipo
self.marca = marca
self.modello = modello
self.inv_ced = inv_ced
self.inv_ente = inv_ente
self.fornitore = fornitore
self.nid = nid
2017-09-11 15:05:45 +00:00
self.seriale = seriale
2017-09-14 07:44:04 +00:00
self.ip = ip
2017-02-02 08:33:54 +00:00
def __repr__(self):
return "<Dispositivo {}>".format(self.inv_ced)
class Accesso(db.Model):
2017-09-12 09:39:21 +00:00
"""Tabella di associazione tra dispositivi e impiegati."""
2017-09-12 07:39:18 +00:00
__tablename__ = "assoc_accessi"
iid = db.Column(db.Integer, db.ForeignKey('impiegati.iid'), primary_key=True)
did = db.Column(db.Integer, db.ForeignKey('dispositivi.did'), primary_key=True)
2017-02-02 08:33:54 +00:00
def __init__(self, iid, did):
self.iid = iid
self.did = did
def __repr__(self):
2017-02-03 12:04:11 +00:00
return "<Accesso {} su {}>".format(self.iid, self.did)
2017-02-02 08:33:54 +00:00
2017-02-01 07:21:18 +00:00
2017-09-12 07:39:18 +00:00
class Rete(db.Model):
2017-09-12 09:39:21 +00:00
"""Configurazione di rete di uno o più computer."""
2017-09-12 07:39:18 +00:00
__tablename__ = "reti"
nid = db.Column(db.Integer, primary_key=True)
2017-09-12 07:40:47 +00:00
nome = db.Column(db.String)
network_ip = db.Column(db.String, unique=True, nullable=False)
2017-09-12 07:39:18 +00:00
subnet = db.Column(db.Integer, nullable=False)
2017-09-12 07:40:47 +00:00
primary_dns = db.Column(db.String)
secondary_dns = db.Column(db.String)
2017-09-12 07:39:18 +00:00
def __init__(self, nome, network_ip, subnet, primary_dns, secondary_dns):
2017-09-12 06:26:58 +00:00
self.nome = nome
2017-09-12 07:39:18 +00:00
self.network_ip = network_ip
self.subnet = subnet
self.primary_dns = primary_dns
self.secondary_dns = secondary_dns
def __repr__(self):
return "<Rete {},{}>".format(self.nid, self.nome)
2017-09-11 13:00:04 +00:00
class FakeAccesso:
2017-09-12 09:39:21 +00:00
"""Hackerino usato nel caso in cui non ci sia nessun impiegato assegnato a un dispositivo.
Viva il duck typing!"""
2017-09-11 13:00:04 +00:00
def __init__(self, dispositivo):
self.did = dispositivo.did
self.iid = None
self.dispositivo = dispositivo
def __getitem__(self, key):
if key == 0:
return self.dispositivo
2017-09-12 06:26:58 +00:00
2017-09-13 10:48:41 +00:00
class Pesce:
2017-09-14 07:44:04 +00:00
"""Un pesce? In un inventario!?"""
def __init__(self, name, avgsize=1.0, variation=0.1, link="#"):
2017-09-13 10:48:41 +00:00
self.name = name
2017-09-14 07:44:04 +00:00
self.size = random.gauss(avgsize, variation)
self.color = "{:02x}".format(random.randrange(0, 16777216))
self.position = (random.randrange(0, 1423), random.randrange(52, 600))
self.link = link
def __repr__(self):
return f"<Pesce {self.name}, dimensioni {self.size}, colore #{self.color.hex()}>"
2017-09-13 10:48:41 +00:00
2017-02-01 07:21:18 +00:00
# Funzioni del sito
def login(username, password):
2017-09-12 09:39:21 +00:00
"""Controlla se l'username e la password di un utente del sito sono corrette."""
2017-02-01 07:21:18 +00:00
user = User.query.filter_by(username=username).first()
2017-09-12 09:39:21 +00:00
return user is not None and bcrypt.checkpw(bytes(password, encoding="utf-8"), user.passwd)
2017-02-01 07:21:18 +00:00
2017-09-11 09:43:50 +00:00
2017-09-12 07:39:18 +00:00
def subnet_to_string(integer):
"""Converte una subnet mask in numero in una stringa"""
still_int = (0xFFFFFFFF << (32 - integer)) & 0xFFFFFFFF
return f"{still_int >> 24}.{(still_int >> 16) & 0xFF}.{(still_int >> 8)}.{still_int & 0xFF}"
2017-02-01 07:21:18 +00:00
# Sito
@app.route('/')
def page_home():
2017-09-12 09:39:21 +00:00
"""Pagina principale del sito:
se non sei loggato reindirizza alla pagina del login,
se sei loggato effettua il logout e dopo reindirizza al login"""
2017-02-01 07:21:18 +00:00
if 'username' not in session:
2017-09-14 08:32:27 +00:00
return redirect(url_for('page_login'))
2017-02-01 07:21:18 +00:00
else:
return redirect(url_for('page_dashboard'))
2017-02-01 07:21:18 +00:00
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
@app.route('/login', methods=['GET', 'POST'])
def page_login():
2017-09-12 09:39:21 +00:00
"""Pagina di login:
accetta richieste GET per la visualizzazione della pagina
e richieste POST con form data per il login"""
2017-02-01 07:21:18 +00:00
if request.method == 'GET':
goldfish = url_for("static", filename="goldfish.png")
return render_template("login.htm", goldfish=goldfish)
2017-02-01 07:21:18 +00:00
else:
if login(request.form['username'], request.form['password']):
session['username'] = request.form['username']
session.permanent = request.form.get('remember')
2017-02-01 07:21:18 +00:00
return redirect(url_for('page_dashboard'))
else:
return render_template('error.htm', error="Username o password non validi.")
2017-02-01 07:21:18 +00:00
2017-09-11 09:43:50 +00:00
@app.route('/logout')
def page_logout():
"""Pagina di logout:
slogga l'utente se visitata"""
if 'username' in session:
session.pop('username')
return redirect(url_for('page_login'))
2017-02-01 07:21:18 +00:00
@app.route('/dashboard')
def page_dashboard():
2017-09-12 09:39:21 +00:00
"""Dashboard del sito:
Conteggia i servizi e visualizza la navbar
, è un po' inutile."""
2017-02-02 07:46:15 +00:00
enti = Ente.query.all()
conteggioservizi = dict()
2017-09-12 06:26:58 +00:00
goldfish = url_for("static", filename="goldfish.png")
2017-02-02 07:46:15 +00:00
for ente in enti:
conteggioservizi[ente.nomeente] = Servizio.query.join(Ente).filter_by(eid=ente.eid).count()
conteggioutenti = dict()
for ente in enti:
conteggioutenti[ente.nomeente] = Impiegato.query.join(Servizio).join(Ente).filter_by(eid=ente.eid).count()
2017-09-14 08:32:27 +00:00
return render_template("dashboard.htm", pagetype="main", user=session.get("username"),
conteggioutenti=conteggioutenti, conteggioservizi=conteggioservizi, goldfish=goldfish)
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
@app.route('/ente_add', methods=['GET', 'POST'])
def page_ente_add():
2017-09-12 09:39:21 +00:00
"""Pagina di creazione nuovo ente:
come tutte le altre pagine di creazione del sito,
accetta GET per visualizzare la pagina
e POST con form data per l'aggiunta effettiva."""
2017-02-01 07:21:18 +00:00
if 'username' not in session:
return abort(403)
2017-02-01 07:21:18 +00:00
if request.method == 'GET':
2017-09-14 08:32:27 +00:00
return render_template("ente/add.htm", pagetype="ente", user=session.get("username"))
2017-02-01 07:21:18 +00:00
else:
nuovoent = Ente(request.form['nomeente'], request.form['nomebreveente'])
2017-02-01 07:21:18 +00:00
db.session.add(nuovoent)
db.session.commit()
return redirect(url_for('page_ente_list'))
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
@app.route('/ente_del/<int:eid>')
def page_ente_del(eid):
2017-09-12 09:39:21 +00:00
"""Pagina di cancellazione ente:
accetta richieste GET per cancellare l'ente specificato."""
2017-02-01 07:21:18 +00:00
if 'username' not in session:
return abort(403)
ente = Ente.query.get_or_404(eid)
servizi = Servizio.query.filter_by(eid=ente.eid).all()
for serv in servizi:
impiegati = Impiegato.query.filter_by(sid=serv.sid).all()
for imp in impiegati:
db.session.delete(imp)
db.session.delete(serv)
2017-02-01 07:21:18 +00:00
db.session.delete(ente)
db.session.commit()
return redirect(url_for('page_ente_list'))
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
@app.route('/ente_list')
def page_ente_list():
2017-09-12 09:39:21 +00:00
"""Pagina di elenco degli enti disponibili sul sito."""
2017-02-01 07:21:18 +00:00
if 'username' not in session:
return abort(403)
enti = Ente.query.order_by(Ente.nomeente).all()
2017-09-14 08:32:27 +00:00
return render_template("ente/list.htm", enti=enti, pagetype="ente", user=session.get("username"))
2017-02-01 07:21:18 +00:00
2017-09-11 09:43:50 +00:00
2017-02-01 07:21:18 +00:00
@app.route('/ente_show/<int:eid>', methods=['GET', 'POST'])
def page_ente_show(eid):
if 'username' not in session:
return abort(403)
2017-02-01 07:21:18 +00:00
if request.method == "GET":
ente = Ente.query.get_or_404(eid)
2017-09-14 08:32:27 +00:00
return render_template("ente/show.htm", ente=ente, user=session.get("username"))
2017-02-01 07:21:18 +00:00
else:
ente = Ente.query.get_or_404(eid)
ente.nomeente = request.form["nomeente"]
ente.nomebreveente = request.form["nomebreveente"]
2017-02-01 07:21:18 +00:00
db.session.commit()
return redirect(url_for('page_ente_list'))
2017-09-11 09:43:50 +00:00
@app.route('/serv_add', methods=['GET', 'POST'])
def page_serv_add():
2017-09-12 09:39:21 +00:00
"""Pagina di creazione nuovo servizio:
come tutte le altre pagine di creazione del sito,
accetta GET per visualizzare la pagina
e POST con form data per l'aggiunta effettiva."""
if 'username' not in session:
return abort(403)
if request.method == 'GET':
enti = Ente.query.order_by(Ente.nomeente).all()
2017-09-14 08:32:27 +00:00
return render_template("servizio/add.htm", enti=enti, pagetype="serv", user=session.get("username"))
else:
2017-09-11 13:56:42 +00:00
nuovoserv = Servizio(request.form['eid'], request.form['nomeservizio'], request.form['locazione'])
db.session.add(nuovoserv)
db.session.commit()
return redirect(url_for('page_serv_list'))
2017-09-11 09:43:50 +00:00
@app.route('/serv_del/<int:sid>')
def page_serv_del(sid):
2017-09-12 09:39:21 +00:00
"""Pagina di cancellazione servizio:
accetta richieste GET per cancellare il servizio specificato."""
if 'username' not in session:
return abort(403)
serv = Servizio.query.get_or_404(sid)
impiegati = Impiegato.query.filter_by(sid=serv.sid).all()
for imp in impiegati:
db.session.delete(imp)
db.session.delete(serv)
db.session.commit()
return redirect(url_for('page_serv_list'))
2017-09-11 09:43:50 +00:00
@app.route('/serv_list')
def page_serv_list():
2017-09-12 09:39:21 +00:00
"""Pagina di elenco dei servizi registrati sul sito."""
if 'username' not in session:
return abort(403)
serv = Servizio.query.join(Ente).order_by(Ente.nomeente, Servizio.nomeservizio).all()
2017-09-14 08:32:27 +00:00
return render_template("servizio/list.htm", serv=serv, pagetype="serv", user=session.get("username"))
2017-09-11 13:00:04 +00:00
@app.route('/serv_list/<int:eid>')
def page_serv_list_plus(eid):
2017-09-12 09:39:21 +00:00
"""Pagina di elenco dei servizi registrati sul sito, filtrati per ente."""
2017-09-11 13:00:04 +00:00
if 'username' not in session:
return abort(403)
serv = Servizio.query.join(Ente).filter_by(eid=eid).order_by(Servizio.nomeservizio).all()
2017-09-14 08:32:27 +00:00
return render_template("servizio/list.htm", serv=serv, pagetype="serv", user=session.get("username"))
2017-09-11 13:00:04 +00:00
@app.route('/serv_show/<int:sid>', methods=['GET', 'POST'])
def page_serv_show(sid):
if 'username' not in session:
return abort(403)
if request.method == "GET":
serv = Servizio.query.get_or_404(sid)
enti = Ente.query.all()
2017-09-14 08:32:27 +00:00
return render_template("servizio/show.htm", serv=serv, enti=enti, user=session.get("username"))
else:
serv = Servizio.query.get_or_404(sid)
serv.eid = request.form["eid"]
serv.nomeservizio = request.form["nomeservizio"]
2017-09-11 13:56:42 +00:00
serv.locazione = request.form["locazione"]
db.session.commit()
return redirect(url_for('page_serv_list'))
2017-09-11 09:43:50 +00:00
@app.route('/imp_add', methods=['GET', 'POST'])
def page_imp_add():
2017-09-12 09:39:21 +00:00
"""Pagina di creazione nuovo impiegato:
come tutte le altre pagine di creazione del sito,
accetta GET per visualizzare la pagina
e POST con form data per l'aggiunta effettiva."""
if 'username' not in session:
return abort(403)
if request.method == 'GET':
servizi = Servizio.query.join(Ente).order_by(Ente.nomeente, Servizio.nomeservizio).all()
2017-09-14 08:32:27 +00:00
return render_template("impiegato/add.htm", servizi=servizi, pagetype="imp", user=session.get("username"))
else:
2017-09-11 09:43:50 +00:00
nuovoimp = Impiegato(request.form['sid'], request.form['nomeimpiegato'], request.form['username'],
request.form['passwd'],)
db.session.add(nuovoimp)
db.session.commit()
return redirect(url_for('page_imp_list'))
2017-09-11 09:43:50 +00:00
@app.route('/imp_del/<int:iid>')
def page_imp_del(iid):
"""Pagina di cancellazione impiegato:
accetta richieste GET per cancellare l'impiegato specificato."""
if 'username' not in session:
return abort(403)
imp = Impiegato.query.get_or_404(iid)
db.session.delete(imp)
db.session.commit()
return redirect(url_for('page_imp_list'))
2017-09-11 09:43:50 +00:00
@app.route('/imp_list')
def page_imp_list():
2017-09-12 09:39:21 +00:00
"""Pagina di elenco degli impiegati registrati nell'inventario."""
if 'username' not in session:
return abort(403)
impiegati = Impiegato.query.join(Servizio).join(Ente).order_by(Ente.nomeente, Servizio.nomeservizio, Impiegato.nomeimpiegato).all()
2017-09-14 08:32:27 +00:00
return render_template("impiegato/list.htm", impiegati=impiegati, pagetype="imp", user=session.get("username"))
2017-09-11 09:43:50 +00:00
@app.route('/imp_list/<int:sid>')
def page_imp_list_plus(sid):
2017-09-12 09:39:21 +00:00
"""Pagina di elenco degli impiegati registrati nell'inventario, filtrati per servizio."""
if 'username' not in session:
return abort(403)
impiegati = Impiegato.query.join(Servizio).filter_by(sid=sid).join(Ente).order_by(Impiegato.nomeimpiegato).all()
2017-09-14 08:32:27 +00:00
return render_template("impiegato/list.htm", impiegati=impiegati, user=session.get("username"))
2017-09-11 09:43:50 +00:00
@app.route('/imp_show/<int:iid>', methods=['GET', 'POST'])
def page_imp_show(iid):
if 'username' not in session:
return abort(403)
if request.method == "GET":
imp = Impiegato.query.get_or_404(iid)
servizi = Servizio.query.all()
2017-09-14 08:32:27 +00:00
return render_template("impiegato/show.htm", imp=imp, servizi=servizi, user=session.get("username"))
else:
imp = Impiegato.query.get_or_404(iid)
imp.sid = request.form["sid"]
imp.nomeimpiegato = request.form["nomeimpiegato"]
imp.username = request.form["username"]
imp.passwd = request.form["passwd"]
db.session.commit()
return redirect(url_for('page_imp_list'))
2017-09-11 09:43:50 +00:00
@app.route('/disp_add', methods=['GET', 'POST'])
def page_disp_add():
2017-09-12 09:39:21 +00:00
"""Pagina di creazione nuovo dispositivo:
come tutte le altre pagine di creazione del sito,
accetta GET per visualizzare la pagina
e POST con form data per l'aggiunta effettiva."""
if 'username' not in session:
return abort(403)
if request.method == 'GET':
2017-09-11 14:45:49 +00:00
serial = request.args.get("scanned_barcode")
2017-09-11 09:43:50 +00:00
opzioni = ["Centralino", "Dispositivo generico di rete", "Marcatempo", "PC", "Portatile", "POS", "Router",
"Server", "Stampante di rete", "Switch", "Telefono IP", "Monitor", "Scanner", "Stampante locale"]
reti = Rete.query.order_by(Rete.nome).all()
impiegati = Impiegato.query.order_by(Impiegato.nomeimpiegato).all()
return render_template("dispositivo/add.htm", impiegati=impiegati, opzioni=opzioni, reti=reti,
2017-09-14 08:32:27 +00:00
pagetype="dev", user=session.get("username"), serial=serial)
else:
if request.form["inv_ced"]:
try:
int(request.form["inv_ced"])
except ValueError:
return render_template("error.htm", error="Il campo Inventario CED deve contenere un numero.")
if request.form["inv_ente"]:
try:
int(request.form["inv_ente"])
except ValueError:
return render_template("error.htm", error="Il campo Inventario ente deve contenere un numero.")
2017-09-11 09:43:50 +00:00
nuovodisp = Dispositivo(request.form['tipo'], request.form['marca'], request.form['modello'],
2017-09-12 06:26:58 +00:00
request.form['inv_ced'], request.form['inv_ente'], request.form['fornitore'],
request.form['rete'], request.form['seriale'], request.form['ip'])
db.session.add(nuovodisp)
db.session.commit()
2017-02-03 12:04:11 +00:00
# Trova tutti gli utenti, edizione sporco hack in html
users = list()
while True:
# Trova tutti gli utenti esistenti
userstring = 'utente{}'.format(len(users))
if userstring in request.form:
users.append(request.form[userstring])
else:
break
for user in users:
nuovologin = Accesso(int(user), nuovodisp.did)
db.session.add(nuovologin)
db.session.commit()
return redirect(url_for('page_disp_list'))
2017-09-11 09:43:50 +00:00
@app.route('/disp_del/<int:did>')
def page_disp_del(did):
2017-09-12 09:39:21 +00:00
"""Pagina di cancellazione dispositivo:
accetta richieste GET per cancellare il dispositivo specificato."""
if 'username' not in session:
return abort(403)
disp = Dispositivo.query.get_or_404(did)
for accesso in disp.accessi:
db.session.delete(accesso)
db.session.delete(disp)
db.session.commit()
return redirect(url_for('page_disp_list'))
2017-09-11 09:43:50 +00:00
@app.route('/disp_list')
def page_disp_list():
2017-09-12 09:39:21 +00:00
"""Pagina di elenco dei dispositivi registrati nell'inventario."""
if 'username' not in session:
return abort(403)
2017-02-03 12:04:11 +00:00
accessi = list()
dispositivi = Dispositivo.query.order_by(Dispositivo.inv_ced).all()
2017-02-03 12:04:11 +00:00
for dispositivo in dispositivi:
accesso = Accesso.query.join(Dispositivo).filter_by(did=dispositivo.did).join(Impiegato).all()
2017-09-11 13:00:04 +00:00
if not accesso:
2017-09-11 13:22:44 +00:00
# oh dio mio a cosa stavo pensando viva il duck typing
2017-09-11 13:00:04 +00:00
accessi.append([FakeAccesso(dispositivo)])
else:
accessi.append(accesso)
2017-09-14 08:32:27 +00:00
return render_template("dispositivo/list.htm", accessi=accessi, pagetype="disp", user=session.get("username"))
2017-09-11 09:43:50 +00:00
2017-09-11 13:00:04 +00:00
@app.route('/disp_details/<int:did>')
2017-09-12 09:39:21 +00:00
def page_disp_details(did):
"""Pagina di dettagli di un dispositivo, contenente anche gli utenti che vi hanno accesso."""
2017-09-11 13:00:04 +00:00
if 'username' not in session:
return abort(403)
disp = Dispositivo.query.get_or_404(did)
2017-09-11 13:22:44 +00:00
accessi = Accesso.query.filter_by(did=did).all()
return render_template("dispositivo/details.htm", disp=disp, accessi=accessi, pagetype="disp",
2017-09-14 08:32:27 +00:00
user=session.get("username"))
2017-09-12 10:50:28 +00:00
@app.route('/disp_show/<int:did>', methods=['GET', 'POST'])
def page_disp_show(did):
if 'username' not in session:
return abort(403)
2017-09-12 10:50:28 +00:00
if request.method == 'GET':
disp = Dispositivo.query.get_or_404(did)
accessi = Accesso.query.filter_by(did=did).all()
impiegati = Impiegato.query.order_by(Impiegato.nomeimpiegato).all()
opzioni = ["Centralino", "Dispositivo generico di rete", "Marcatempo", "PC", "Portatile", "POS", "Router",
"Server", "Stampante di rete", "Switch", "Telefono IP", "Monitor", "Scanner", "Stampante locale"]
reti = Rete.query.order_by(Rete.nome).all()
return render_template("dispositivo/show.htm", dispositivo=disp, accessi=accessi, impiegati=impiegati,
2017-09-14 08:32:27 +00:00
pagetype="disp", user=session.get("username"), opzioni=opzioni, reti=reti)
2017-09-12 10:50:28 +00:00
else:
if request.form["inv_ced"]:
try:
int(request.form["inv_ced"])
except ValueError:
return render_template("error.htm", error="Il campo Inventario CED deve contenere un numero.")
if request.form["inv_ente"]:
try:
int(request.form["inv_ente"])
except ValueError:
return render_template("error.htm", error="Il campo Inventario ente deve contenere un numero.")
disp = Dispositivo.query.get_or_404(did)
accessi = Accesso.query.filter_by(did=did).all()
2017-09-12 10:50:28 +00:00
disp.tipo = request.form['tipo']
disp.marca = request.form['marca']
disp.modello = request.form['modello']
disp.inv_ced = int(request.form['inv_ced']) if request.form["inv_ced"] else None
disp.inv_ente = int(request.form['inv_ente']) if request.form["inv_ced"] else None
2017-09-12 10:50:28 +00:00
disp.fornitore = request.form['fornitore']
disp.nid = int(request.form['rete'])
disp.ip = request.form['ip']
2017-09-12 10:50:28 +00:00
# Trova tutti gli utenti, edizione sporco hack in html
users = list()
while True:
# Trova tutti gli utenti esistenti
userstring = 'utente{}'.format(len(users))
if userstring in request.form:
users.append(request.form[userstring])
else:
break
for accesso in accessi:
db.session.delete(accesso)
2017-09-12 10:50:28 +00:00
for user in users:
nuovologin = Accesso(int(user), disp.did)
2017-09-12 10:50:28 +00:00
db.session.add(nuovologin)
db.session.commit()
return redirect(url_for('page_disp_list'))
@app.route('/net_add', methods=['GET', 'POST'])
def page_net_add():
2017-09-12 09:39:21 +00:00
"""Pagina di creazione nuova rete:
come tutte le altre pagine di creazione del sito,
accetta GET per visualizzare la pagina
e POST con form data per l'aggiunta effettiva."""
if 'username' not in session:
return abort(403)
if request.method == 'GET':
2017-09-14 08:32:27 +00:00
return render_template("net/add.htm", pagetype="net", user=session.get("username"))
else:
try:
int(request.form["subnet"])
except ValueError:
return render_template("error.htm", error="Il campo Subnet deve contenere il numero di bit della subnet. "
"(8, 16, 24...)")
2017-09-12 07:39:18 +00:00
nuovonet = Rete(nome=request.form["nome"], network_ip=request.form["network_ip"], subnet=request.form["subnet"],
primary_dns=request.form["primary_dns"], secondary_dns=request.form["secondary_dns"])
db.session.add(nuovonet)
db.session.commit()
return redirect(url_for('page_net_list'))
@app.route('/net_del/<int:nid>')
2017-09-12 07:39:18 +00:00
def page_net_del(nid):
2017-09-12 09:39:21 +00:00
"""Pagina di cancellazione rete:
accetta richieste GET per cancellare la rete specificata."""
if 'username' not in session:
return abort(403)
if Rete.query.count() <= 1:
return render_template("error.htm", error="Non puoi cancellare l'ultima rete rimasta!")
rete = Rete.query.get_or_404(nid)
defaultrete = Rete.query.filter_by(network_ip="0.0.0.0").first()
dispositivi = Dispositivo.query.filter_by(nid=rete.nid).all()
for dispositivo in dispositivi:
dispositivo.nid = defaultrete.nid
db.session.delete(rete)
db.session.commit()
return redirect(url_for('page_net_list'))
@app.route('/net_list')
def page_net_list():
if 'username' not in session:
return abort(403)
reti = Rete.query.order_by(Rete.nome).all()
2017-09-14 08:32:27 +00:00
return render_template("net/list.htm", reti=reti, pagetype="net", user=session.get("username"))
2017-09-11 15:31:20 +00:00
@app.route('/net_details/<int:nid>')
2017-09-12 07:39:18 +00:00
def page_net_details(nid):
2017-09-11 15:31:20 +00:00
if 'username' not in session:
return abort(403)
net = Rete.query.get_or_404(nid)
2017-09-12 07:39:18 +00:00
dispositivi = Dispositivo.query.join(Rete).filter_by(nid=nid).all()
subnet = subnet_to_string(net.subnet)
return render_template("net/details.htm", net=net, subnet=subnet, dispositivi=dispositivi, pagetype="net",
2017-09-14 08:32:27 +00:00
user=session.get("username"))
2017-09-11 15:31:20 +00:00
@app.route('/net_show/<int:nid>', methods=['GET', 'POST'])
def page_net_show(nid):
if 'username' not in session:
return abort(403)
if request.method == 'GET':
net = Rete.query.filter_by(nid=nid).first_or_404()
2017-09-14 08:32:27 +00:00
return render_template("net/show.htm", net=net, pagetype="net", user=session.get("username"))
else:
net = Rete.query.filter_by(nid=nid).first_or_404()
net.nome = request.form['nome']
net.network_ip = request.form['network_ip']
net.subnet = request.form['subnet']
net.primary_dns = request.form['primary_dns']
net.secondary_dns = request.form['secondary_dns']
db.session.commit()
return redirect(url_for('page_net_list'))
@app.route('/user_list')
def page_user_list():
2017-09-12 09:39:21 +00:00
"""Pagina di elenco degli utenti che possono connettersi al sito.
Le password sono hashate."""
if 'username' not in session:
return abort(403)
utenti = User.query.order_by(User.username).all()
2017-09-14 08:32:27 +00:00
return render_template("user/list.htm", utenti=utenti, pagetype="user", user=session.get("username"))
@app.route('/user_del/<int:uid>')
def page_user_del(uid):
2017-09-12 09:39:21 +00:00
"""Pagina di cancellazione impiegato:
accetta richieste GET per cancellare l'utente specificato."""
if 'username' not in session:
return abort(403)
if User.query.count() <= 1:
return render_template("error.htm", error="Non puoi cancellare l'ultimo utente rimasto!")
utente = User.query.get_or_404(uid)
if utente.username == session["username"]:
return render_template("error.htm", error="Non puoi cancellare l'utente con cui sei loggato!")
db.session.delete(utente)
db.session.commit()
return redirect(url_for('page_user_list'))
@app.route('/user_add', methods=['GET', 'POST'])
def page_user_add():
2017-09-12 09:39:21 +00:00
"""Pagina di creazione nuovo utente del sito:
come tutte le altre pagine di creazione del sito,
accetta GET per visualizzare la pagina
e POST con form data per l'aggiunta effettiva.
Le password vengono hashate con bcrypt."""
if 'username' not in session:
return abort(403)
if request.method == 'GET':
2017-09-14 08:32:27 +00:00
return render_template("user/add.htm", pagetype="user", user=session.get("username"))
else:
p = bytes(request.form["passwd"], encoding="utf-8")
cenere = bcrypt.hashpw(p, bcrypt.gensalt())
nuovo = User(request.form['username'], cenere)
db.session.add(nuovo)
db.session.commit()
return redirect(url_for('page_user_list'))
2017-09-13 08:24:59 +00:00
@app.route('/query', methods=['GET', 'POST'])
def page_query():
"""Pagina delle query manuali:
in GET visualizza la pagina per fare una query,
mentre in POST visualizza i risultati."""
if 'username' not in session:
return abort(403)
if request.method == 'GET':
2017-09-14 08:32:27 +00:00
return render_template("query.htm", user=session.get("username"), pagetype="query")
2017-09-13 08:24:59 +00:00
else:
try:
result = db.engine.execute("SELECT" + request.form["query"] + ";")
except Exception as e:
2017-09-14 08:32:27 +00:00
return render_template("query.htm", query=request.form["query"], error=repr(e), user=session.get("username"),
pagetype="query")
2017-09-14 08:32:27 +00:00
return render_template("query.htm", query=request.form["query"], result=result, user=session.get("username"),
pagetype="query")
2017-09-13 08:24:59 +00:00
2017-09-13 10:48:41 +00:00
@app.route('/smecds')
def page_smecds():
"""Pagina che visualizza i credits del sito"""
2017-09-14 08:32:27 +00:00
return render_template("smecds.htm", pagetype="main", user=session.get("username"))
2017-09-13 10:48:41 +00:00
@app.route('/pheesh')
def page_pheesh():
"""Acquario del sito.
I pesci sono generati dinamicamente basandosi sui dati presenti nel database."""
if 'username' not in session:
return abort(403)
2017-09-13 10:48:41 +00:00
enti = Ente.query.all()
servizi = Servizio.query.all()
impiegati = Impiegato.query.all()
dispositivi = Dispositivo.query.all()
reti = Rete.query.all()
utenti = User.query.all()
pesci = []
for obj in enti:
2017-09-14 07:44:04 +00:00
random.seed(hash(obj.nomeente))
pesci.append(Pesce(obj.nomeente, 3, 0.9, f"/ente_list"))
2017-09-13 10:48:41 +00:00
for obj in servizi:
2017-09-14 07:44:04 +00:00
random.seed(hash(obj.nomeservizio))
pesci.append(Pesce(obj.nomeservizio, 2, 0.5, f"/serv_list"))
2017-09-13 10:48:41 +00:00
for obj in reti:
2017-09-14 07:44:04 +00:00
random.seed(hash(obj.nome))
2017-09-14 13:11:07 +00:00
pesci.append(Pesce(f"Rete {obj.nome}", 1.5, 0.4, f"/net_details/{obj.nid}"))
2017-09-13 10:48:41 +00:00
for obj in impiegati:
2017-09-14 07:44:04 +00:00
random.seed(hash(obj.nomeimpiegato))
pesci.append(Pesce(obj.nomeimpiegato, 1, 0.3, f"/imp_list"))
2017-09-13 10:48:41 +00:00
for obj in dispositivi:
2017-09-14 13:11:07 +00:00
random.seed(hash(obj.did))
2017-09-14 13:12:08 +00:00
if obj.marca != "" and obj.modello != "":
2017-09-14 13:11:07 +00:00
pesci.append(Pesce(f"{obj.marca} {obj.modello}", 0.8, 0.2, f"/disp_details/{obj.did}"))
2017-09-14 13:12:08 +00:00
elif obj.seriale != "":
2017-09-14 13:11:07 +00:00
pesci.append(Pesce(f"Dispositivo {obj.seriale}", 0.8, 0.2, f"/disp_details/{obj.did}"))
2017-09-13 10:48:41 +00:00
else:
2017-09-14 07:44:04 +00:00
pesci.append(Pesce(f"Dispositivo {obj.did}", 0.8, 0.2, f"/disp_details/{obj.did}"))
2017-09-13 10:48:41 +00:00
for obj in utenti:
2017-09-14 07:44:04 +00:00
random.seed(hash(obj.username))
pesci.append(Pesce(obj.username, 1.5, 0.1, f"/user_list"))
2017-09-14 08:32:27 +00:00
return render_template("pheesh.htm", user=session.get("username"), pheesh=pesci, footer=False)
@app.errorhandler(400)
def page_400(_):
return render_template('400.htm', user=session.get("username"))
2017-09-13 07:06:59 +00:00
@app.errorhandler(403)
def page_403(_):
2017-09-14 08:32:27 +00:00
return render_template('403.htm', user=session.get("username"))
2017-09-13 07:06:59 +00:00
@app.errorhandler(404)
def page_404(_):
2017-09-14 08:32:27 +00:00
return render_template('404.htm', user=session.get("username"))
2017-09-13 07:06:59 +00:00
@app.errorhandler(500)
def page_500(e):
2017-09-14 08:32:27 +00:00
return render_template('500.htm', e=e, user=session.get("username"))
2017-09-13 07:06:59 +00:00
if __name__ == "__main__":
2017-09-12 09:39:21 +00:00
# Se non esiste il database, crealo e inizializzalo!
2017-09-18 07:11:44 +00:00
if not os.path.isfile("db.sqlite"):
2017-09-12 07:39:18 +00:00
db.create_all()
try:
2017-09-12 09:39:21 +00:00
# L'utente predefinito è "stagista" "smecds".
2017-09-12 07:39:18 +00:00
nuovapassword = bcrypt.hashpw(b"smecds", bcrypt.gensalt())
nuovouser = User('stagista', nuovapassword)
db.session.add(nuovouser)
2017-09-12 09:39:21 +00:00
# Crea una rete nulla da utilizzare quando non ci sono altre reti disponibili
2017-09-12 07:39:18 +00:00
retenulla = Rete(nome="Sconosciuta", network_ip="0.0.0.0", subnet=0, primary_dns="0.0.0.0",
secondary_dns="0.0.0.0")
db.session.add(retenulla)
db.session.commit()
2017-09-12 09:41:13 +00:00
except IntegrityError:
2017-09-12 09:39:21 +00:00
# Se queste operazioni sono già state compiute in precedenza, annullale
2017-09-12 07:39:18 +00:00
db.session.rollback()
2017-09-14 08:01:28 +00:00
app.run()