def create_app(configfile=None): app = Flask(__name__) AppConfig(app, configfile) # Flask-Appconfig is not necessary, but # highly recommend =) # https://github.com/mbr/flask-appconfig Bootstrap(app) login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' #NoSQL Backend backend = FileBackend("/tmp/wakeonlan.db") backend.create_index(Device, fields={'id': 1}, unique=True) #TEST Devices alldevices = backend.filter(Device, {}) if len(alldevices) == 0: try: pc1 = Device({ "id": "001122334411", "name": "PC 1", "mac": "00:11:22:33:44:11", "ip": "192.168.222.111", 'status': '' }) backend.save(pc1) pc2 = Device({ "id": "001122334422", "name": "PC 2", "mac": "00:11:22:33:44:22", "ip": "192.168.222.112", 'status': '' }) backend.save(pc2) pc3 = Device({ "id": "001122334433", "name": "Router", "mac": "00:11:22:33:44:33", "ip": "192.168.222.1", 'status': '' }) backend.save(pc3) backend.commit() except: backend.revert() pass # in a real app, these should be configured through Flask-Appconfig app.config['SECRET_KEY'] = 'devkey' # app.config['RECAPTCHA_PUBLIC_KEY'] = \ # '6Lfol9cSAAAAADAkodaYl9wvQCwBMr3qGR_PPHcw' def getDeviceById(id): device = None try: device = backend.get(Device, {'id': id}) except: pass return device def pingDeviceById(id): #Get Device device = backend.get(Device, {'id': id}) if device: #Get Device's IP ip = device['ip'] result = pingDeviceByIp(ip) #Update Status UP/Down/'' if result == 0: device['status'] = 'UP' else: device['status'] = 'DOWN' backend.save(device) return result return None def wolDeviceById(id): #Get Device device = backend.get(Device, {'id': id}) if device: #WoL for Device MAC mac = device['mac'] wolDeviceByMac(mac) return None @login_manager.user_loader def user_loader(user_id): """Given *user_id*, return the associated User object. :param unicode user_id: user_id (email) user to retrieve """ user_entry = User.getById(user_id) if user_entry is not None: user = User(user_entry[0], user_entry[1]) return user else: return None @app.route('/', methods=('GET', 'POST')) @login_required def index(): form = ExampleForm() form.validate_on_submit() # to get error messages to the browser # flash('critical message', 'critical') # flash('error message', 'error') # flash('warning message', 'warning') # flash('info message', 'info') # flash('debug message', 'debug') # flash('different message', 'different') # flash('uncategorized message') alldevices = None alldevices = backend.filter(Device, {}).sort('name') #app.logger.info('Devices: %s' % (len(alldevices) ) ) return render_template('index.html', form=form, devices=alldevices) @app.route('/login', methods=('GET', 'POST')) def login(): if request.method == 'GET': form = LoginForm() form.validate_on_submit() # to get error messages to the browser return render_template('login.html', form=form) username = request.form['username'] password = request.form['password'] user_entry = User.get(username, password) if user_entry is None: flash('Username or Passord is invalid', 'error') return redirect(url_for('login')) user = User(user_entry[0], user_entry[1]) login_user(user, remember=True) return redirect(request.args.get('next') or url_for('index')) @app.route("/logout", methods=["GET"]) @login_required def logout(): """Logout the current user.""" user = current_user user.authenticated = False logout_user() return redirect(url_for('login')) @app.route('/addDevice', methods=('GET', 'POST')) @login_required def addDevice(): if request.method == 'GET': form = AddDeviceForm() form.validate_on_submit() # to get error messages to the browser return render_template('add_device.html', form=form) name = request.form['name'] mac = request.form['mac'] ip = request.form['ip'] id = mac.replace(':', '') try: newDevice = Device({ "id": id, "name": name, "mac": mac, "ip": ip, 'status': '' }) backend.save(newDevice) backend.commit() except: flash('Error creating new Device', 'error') pass return redirect(url_for('index')) @app.route('/editListDevice', methods=('GET', 'POST')) @login_required def editListDevice(): alldevices = None alldevices = backend.filter(Device, {}).sort('name') return render_template('list_device.html', devices=alldevices) @app.route('/pingDevice/<deviceId>', methods=('GET', 'POST')) @login_required def pingDevice(deviceId): app.logger.info('pingDevice: %s' % (deviceId)) device = getDeviceById(deviceId) result = pingDeviceById(deviceId) app.logger.info('pingDevice: %s' % (result)) if result is None: flash('Ping - Error on device %s' % (device['name']), 'error') elif result == 0: flash('Device %s is UP' % (device['name']), 'info') else: flash('Device %s is DOWN' % (device['name']), 'error') return redirect(url_for('index')) @app.route('/wolDevice/<deviceId>', methods=('GET', 'POST')) @login_required def wolDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId)) device = getDeviceById(deviceId) result = wolDeviceById(deviceId) if device: flash('WoL sent to %s' % (device['name']), 'info') else: flash('WoL error', 'error') return redirect(url_for('index')) @app.route('/deleteDevice/<deviceId>', methods=('GET', 'POST')) @login_required def deleteDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId)) device = getDeviceById(deviceId) try: backend.delete(device) backend.commit() flash('%s Deleted' % (device['name']), 'info') except: flash('Delete error', 'error') pass return redirect(url_for('editListDevice')) return app
def create_app(configfile=None): app = Flask(__name__) AppConfig(app, configfile) # Flask-Appconfig is not necessary, but # highly recommend =) # https://github.com/mbr/flask-appconfig Bootstrap(app) login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view='login' #NoSQL Backend backend = FileBackend("/tmp/wakeonlan.db") backend.create_index(Device, fields={'id':1}, unique=True) #TEST Devices alldevices = backend.filter(Device, {}) if len(alldevices) == 0 : try: pc1 = Device({"id" : "001122334411", "name" : "PC 1", "mac" : "00:11:22:33:44:11", "ip":"192.168.222.111", 'status' : ''}) backend.save(pc1) pc2 = Device({"id" : "001122334422","name" : "PC 2", "mac" : "00:11:22:33:44:22", "ip":"192.168.222.112", 'status' : ''}) backend.save(pc2) pc3 = Device({"id" : "001122334433","name" : "Router", "mac" : "00:11:22:33:44:33", "ip":"192.168.222.1", 'status' : ''}) backend.save(pc3) backend.commit() except: backend.revert() pass # in a real app, these should be configured through Flask-Appconfig app.config['SECRET_KEY'] = 'devkey' # app.config['RECAPTCHA_PUBLIC_KEY'] = \ # '6Lfol9cSAAAAADAkodaYl9wvQCwBMr3qGR_PPHcw' def getDeviceById(id): device = None try: device = backend.get(Device, {'id':id}) except: pass return device def pingDeviceById(id): #Get Device device = backend.get(Device, {'id':id}) if device: #Get Device's IP ip = device['ip'] result = pingDeviceByIp(ip) #Update Status UP/Down/'' if result==0: device['status'] = 'UP' else: device['status'] = 'DOWN' backend.save(device) return result return None def wolDeviceById(id): #Get Device device = backend.get(Device, {'id':id}) if device: #WoL for Device MAC mac = device['mac'] wolDeviceByMac(mac) return None @login_manager.user_loader def user_loader(user_id): """Given *user_id*, return the associated User object. :param unicode user_id: user_id (email) user to retrieve """ user_entry = User.getById(user_id) if user_entry is not None: user = User(user_entry[0], user_entry[1]) return user else: return None @app.route('/', methods=('GET', 'POST')) @login_required def index(): form = ExampleForm() form.validate_on_submit() # to get error messages to the browser # flash('critical message', 'critical') # flash('error message', 'error') # flash('warning message', 'warning') # flash('info message', 'info') # flash('debug message', 'debug') # flash('different message', 'different') # flash('uncategorized message') alldevices = None alldevices = backend.filter(Device, {}).sort('name') #app.logger.info('Devices: %s' % (len(alldevices) ) ) return render_template('index.html', form=form, devices = alldevices) @app.route('/login', methods=('GET', 'POST')) def login(): if request.method == 'GET': form = LoginForm() form.validate_on_submit() # to get error messages to the browser return render_template('login.html', form=form) username = request.form['username'] password = request.form['password'] user_entry = User.get(username, password) if user_entry is None: flash('Username or Passord is invalid', 'error') return redirect(url_for('login')) user = User(user_entry[0], user_entry[1]) login_user(user, remember=True) return redirect(request.args.get('next') or url_for('index')) @app.route("/logout", methods=["GET"]) @login_required def logout(): """Logout the current user.""" user = current_user user.authenticated = False logout_user() return redirect(url_for('login')) @app.route('/addDevice', methods=('GET', 'POST')) @login_required def addDevice(): if request.method == 'GET': form = AddDeviceForm() form.validate_on_submit() # to get error messages to the browser return render_template('add_device.html', form=form) name = request.form['name'] mac = request.form['mac'] ip = request.form['ip'] id = mac.replace(':','') try: newDevice = Device({"id" : id, "name" : name, "mac" : mac, "ip":ip, 'status' : ''}) backend.save(newDevice) backend.commit() except: flash('Error creating new Device', 'error') pass return redirect(url_for('index')) @app.route('/editListDevice', methods=('GET', 'POST')) @login_required def editListDevice(): alldevices = None alldevices = backend.filter(Device, {}).sort('name') return render_template('list_device.html', devices = alldevices) @app.route('/pingDevice/<deviceId>', methods=('GET', 'POST')) @login_required def pingDevice(deviceId): app.logger.info('pingDevice: %s' % (deviceId ) ) device = getDeviceById(deviceId) result = pingDeviceById(deviceId) app.logger.info('pingDevice: %s' % (result ) ) if result is None: flash('Ping - Error on device %s' % (device['name']), 'error') elif result == 0: flash('Device %s is UP' % (device['name']), 'info') else: flash('Device %s is DOWN' % (device['name']), 'error') return redirect(url_for('index')) @app.route('/wolDevice/<deviceId>', methods=('GET', 'POST')) @login_required def wolDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId ) ) device = getDeviceById(deviceId) result = wolDeviceById(deviceId) if device: flash('WoL sent to %s' % (device['name']), 'info') else: flash('WoL error', 'error') return redirect(url_for('index')) @app.route('/deleteDevice/<deviceId>', methods=('GET', 'POST')) @login_required def deleteDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId ) ) device = getDeviceById(deviceId) try: backend.delete(device) backend.commit() flash('%s Deleted' % (device['name']), 'info') except: flash('Delete error', 'error') pass return redirect(url_for('editListDevice')) return app