#!/usr/bin/env python # -*- coding: utf-8 -*- import os, time, subprocess, threading, toml from flask import Flask, flash, request, redirect, url_for # HTTP auth from flask_httpauth import HTTPBasicAuth from werkzeug.security import generate_password_hash, check_password_hash # FILE UPLOAD from werkzeug.utils import secure_filename app = Flask(__name__) # l10n import gettext LOCALE = os.getenv('LANG', 'en') _ = gettext.translation('template', localedir='locales', languages=[LOCALE]).gettext app.config.from_file("defaults.toml", load=toml.load) config_locations = ["./", "~/.", "~/.config/"] for location in config_locations: # Optional config files, ~ is expanded to $HOME on *nix, %USERPROFILE% on windows # ~ app.config.from_file("videopi.toml", load=toml.load, silent=True) if app.config.from_file(os.path.expanduser( location + "pilpil-client.toml"), load=toml.load, silent=True): print( _("Found configuration file in {}").format( os.path.expanduser(location) ) ) #UPLOAD_FOLDER = os.path.expanduser('~/Videos') #ALLOWED_EXTENSIONS = {'avi', 'mkv', 'mp4'} UPLOAD_FOLDER = os.path.expanduser(app.config['DEFAULT']['media_folder_local']) ALLOWED_EXTENSIONS = app.config['DEFAULT']['media_exts'] HTTP_SECRET = str(app.config['DEFAULT']['auth']) DEBUG = app.config['DEFAULT']['debug'] #HTTPS #ASSETS_DIR = os.path.dirname(os.path.abspath(__file__)) # HTTP Serve from waitress import serve #app.secret_key = b'flafoudi' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # Max upload size 100M ( see nginx default also ) app.config['MAX_CONTENT_LENGTH'] = 100 * 1000 * 1000 auth = HTTPBasicAuth() users = { "": generate_password_hash(HTTP_SECRET), } @auth.verify_password def verify_password(username, password): if username in users and check_password_hash(users.get(username), password): return username signal = 0 # Check file extension is allowed def allowed_file(filename): # Check for dot in filename if "." in filename: # Split from right at first dot to find ext and allow files with "." in name if filename.rsplit(".",1)[-1] in ALLOWED_EXTENSIONS: return True # Get Wifi signal level def getRSSI(): signal = subprocess.run( "./get_rssi.sh", capture_output=True) print(signal) signal = str(signal.stdout, 'UTF-8').strip("-").strip("\n") return signal def ledSetup(): os.system('echo none | sudo tee /sys/class/leds/led0/trigger') os.system('echo none | sudo tee /sys/class/leds/led1/trigger') led(0, 0) led(1, 0) def led( led_id, state ): # 0 : off, 1: on os.system('echo ' + str(state) + ' | sudo tee /sys/class/leds/led' + str(led_id) +'/brightness') # Blink the Pi led to allow identification def blinkPy(): # Blink 10 times for j in range(16): led(0, 1) led(1, 0) time.sleep(.2) led(0, 0) led(1, 1) time.sleep(.2) # restore default behavior led(0, 0) led(1, 0) return "OK" def threadBlink(): th=threading.Thread(target=blinkPy) th.start() @app.route("/") @auth.login_required def main(): return _("Nothing to see here !") @app.route("/rssi") @auth.login_required def rssi(): return getRSSI() @app.route("/blink") @auth.login_required def blink(): threadBlink() return _("Blinkin") @app.route("/reboot") @auth.login_required def reboot(): stdout = subprocess.run(["sudo", "/usr/sbin/reboot"], capture_output=True) print(stdout) return _("Rebooting...") @app.route("/poweroff") @auth.login_required def shutdown(): stdout = subprocess.run(["sudo", "/usr/sbin/poweroff"], capture_output=True) print(stdout) return _("Shutting down...") # File upload @app.route('/upload', methods=['GET', 'POST']) @auth.login_required def upload_file(): if request.method == 'POST': # check if the post request has the file part if 'file' not in request.files: return _("No file part: {}").format(str(request.files)) file = request.files['file'] # If the user does not select a file, the browser submits an # empty file without a filename. if file.filename == '': return _("No selected file") if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(UPLOAD_FOLDER, filename)) return _("File saved in {}").format(UPLOAD_FOLDER) return "OK" if __name__ == '__main__': # Turn ACT and POW leds off on start # ~ ledSetup() # app.run() serve(app, host='127.0.0.1', port=5000, url_scheme='https')