#!/usr/bin/env python from flask import Flask, render_template, send_from_directory, request import argparse import os from helpers import sysstatus from helpers import netif from helpers import tor import config app = Flask(__name__) @app.route('/') def status(): status = dict() status['system'] = sysstatus.get_system_status() status['resources'] = sysstatus.get_resources_status() status['wan'] = netif.get_wan_status() status['lan'] = netif.get_lan_status() status['wifi'] = netif.get_wifi_status() status['tor'] = tor.get_tor_status() return render_template('home.html', settings=None, status=status) @app.route('/administer/', methods=['GET', 'POST']) def administer(): return render_template('administer.html', settings=None, status=None) @app.route('/reboot/', methods=['GET', 'POST']) def administer(): if request.method == 'GET': return render_template('reboot.html', status=None) elif request.form.has_key('confirm'): # XXX: execute reboot return render_template('reboot.html', status='rebooting') else: # XXX: flashing introduces cookies #flash("Didn't confirm, not rebooting", "warning") return render_template('reboot.html', status=None) @app.route('/wan/', methods=['GET', 'POST']) def wan(): msg = list() status = dict(wan=netif.get_wan_status()) if not status['wan']: msg.append(("error", "Interface not detected, can not be configured."),) return render_template('wan.html', form=None, status=status, messages=msg, formerr=None) if request.method == 'GET': form = netif.get_wan_settings() return render_template('wan.html', form=form, status=status, formerr=None) # Got this far, need to validated form formerr = dict() if request.form['ipv4method'] == 'disabled': pass # no further validation elif request.form['ipv4method'] == 'dhcp': pass # no further validation elif request.form['ipv4method'] == 'static': if not netif.is_valid_ipv4(request.form['ipv4addr']): formerr['ipv4addr'] = "Not a valid IPv4 address" if not netif.is_valid_ipv4mask(request.form['ipv4netmask']): formerr['ipv4netmask'] = "Not a valid IPv4 netmask" if not netif.is_valid_ipv4(request.form['ipv4gateway']): formerr['ipv4gateway'] = "Not a valid IPv4 address" else: ke = KeyError("Invalid net config method: %s" % form['ipv4method']) print ke raise ke if len(formerr.keys()) > 0: msg.append(("error", "Please correct the validation issues below"),) else: # Ok, we have a valid form, now to commit it try: netif.save_wan_settings(request.form) msg.append(("success", "Configuration saved! Check logs for any errors"),) except IOError, ioerr: msg.append(("error", "Was unable to commit changes... permissions problem? \"%s\"" \ % ioerr)) return render_template('wan.html', form=request.form, status=status, formerr=formerr, messages=msg) @app.route('/lan/', methods=['GET', 'POST']) def lan(): msg = list() status = dict() status['lan'] = netif.get_lan_status() if not status['lan']: msg.append(("error", "Interface not detected, can not be configured."),) return render_template('lan.html', form=None, status=status, messages=msg, formerr=None) if request.method == 'GET': form = netif.get_lan_settings() return render_template('lan.html', form=form, status=status, formerr=None) # Got this far, need to validated form formerr = dict() if request.form['ipv4method'] == 'disabled': pass # no further validation elif request.form['ipv4method'] == 'static': if not netif.is_valid_ipv4(request.form['ipv4addr']): formerr['ipv4addr'] = "Not a valid IPv4 address" if not netif.is_valid_ipv4mask(request.form['ipv4netmask']): formerr['ipv4netmask'] = "Not a valid IPv4 netmask" if not netif.is_valid_ipv4(request.form['ipv4gateway']): formerr['ipv4gateway'] = "Not a valid IPv4 address" else: ke = KeyError("Invalid method: %s" % form['ipv4method']) print ke raise ke if len(formerr.keys()) > 0: msg.append(("error", "Please correct the validation issues below"),) else: # Ok, we have a valid form, now to commit it try: netif.save_lan_settings(request.form) msg.append(("success", "Configuration saved! Check logs for any errors"),) except IOError, ioerr: msg.append(("error", "Was unable to commit changes... permissions problem? \"%s\"" \ % ioerr)) return render_template('lan.html', form=request.form, status=status, formerr=formerr, messages=msg) @app.route('/wifi/', methods=['GET', 'POST']) def wifi(): status = dict() status['wifi'] = netif.get_wifi_status() if not status['wifi']: msg.append(("error", "Interface not detected, can not be configured."),) return render_template('wifi.html', form=None, status=status, messages=msg, formerr=None) if request.method == 'GET': form = netif.get_wifi_settings() return render_template('wifi.html', form=form, status=status, formerr=None) # Got this far, need to validated form formerr = dict() if request.form['ipv4method'] == 'disabled': pass # no further validation elif request.form['ipv4method'] == 'static': if not netif.is_valid_ipv4(request.form['ipv4addr']): formerr['ipv4addr'] = "Not a valid IPv4 address" if not netif.is_valid_ipv4mask(request.form['ipv4netmask']): formerr['ipv4netmask'] = "Not a valid IPv4 netmask" if not netif.is_valid_ipv4(request.form['ipv4gateway']): formerr['ipv4gateway'] = "Not a valid IPv4 address" else: ke = KeyError("Invalid method: %s" % form['ipv4method']) print ke raise ke if len(formerr.keys()) > 0: msg.append(("error", "Please correct the validation issues below"),) else: # Ok, we have a valid form, now to commit it try: netif.save_wifi_settings(request.form) msg.append(("success", "Configuration saved! Check logs for any errors"),) except IOError, ioerr: msg.append(("error", "Was unable to commit changes... permissions problem? \"%s\"" \ % ioerr)) return render_template('wifi.html', form=request.form, status=status, formerr=formerr, messages=msg) return render_template('wifi.html', settings=None, status=None) @app.route('/tor/', methods=['GET', 'POST']) def torpage(): msg = list() return render_template('tor.html', settings=None, status=None, form=request.form, formerr=None, messages=msg) @app.route('/logs/', methods=['GET']) def logs(): logs = dict() logs['dmesg'] = sysstatus.get_dmesg() logs['syslog'] = sysstatus.get_syslog() logs['authlog'] = sysstatus.get_authlog() return render_template('logs.html', logs=logs) @app.route('/processes/', methods=['GET']) def processes(): process_list = sysstatus.get_process_list() return render_template('processes.html', process_list=process_list) @app.route('/favicon.ico') def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico', mimetype='image/vnd.microsoft.icon') @app.route('/robots.txt') def robots(): return send_from_directory(os.path.join(app.root_path, 'static'), 'robots.txt', mimetype='text/plain') if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--debug', action='store_true', help="enable debugging interface") args = parser.parse_args() app.run(debug=args.debug)