From df507602279c2f512156e64d55cf5721e62cfeed Mon Sep 17 00:00:00 2001 From: ABelliqueux Date: Fri, 21 Oct 2022 15:01:55 +0200 Subject: [PATCH] Move rssi script to folder, add config files --- app.py | 2 +- configs/nginx/default | 21 + configs/sudoers.d/010_power_nopasswd | 2 + configs/systemd/cmd_serve.service | 12 + configs/systemd/vlc.service | 11 + configs/vlc/httprequests.lua | 559 +++++++++++++++++++++++++++ get_rssi.sh | 7 + utils/cleanup.sh | 15 + 8 files changed, 628 insertions(+), 1 deletion(-) create mode 100644 configs/nginx/default create mode 100644 configs/sudoers.d/010_power_nopasswd create mode 100644 configs/systemd/cmd_serve.service create mode 100755 configs/systemd/vlc.service create mode 100644 configs/vlc/httprequests.lua create mode 100755 get_rssi.sh create mode 100755 utils/cleanup.sh diff --git a/app.py b/app.py index d6bc418..6790c4f 100755 --- a/app.py +++ b/app.py @@ -60,7 +60,7 @@ def allowed_file(filename): # Get Wifi signal level def getRSSI(): - signal = subprocess.run( local_bin + "get_rssi.sh", capture_output=True) + signal = subprocess.run( "./get_rssi.sh", capture_output=True) print(signal) signal = str(signal.stdout, 'UTF-8').strip("-").strip("\n") return signal diff --git a/configs/nginx/default b/configs/nginx/default new file mode 100644 index 0000000..d87a8a6 --- /dev/null +++ b/configs/nginx/default @@ -0,0 +1,21 @@ +# Cmd server +server { + listen 8888 ssl; + ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; + ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; + location / { + client_max_body_size 100M; + proxy_pass http://127.0.0.1:5000; + proxy_set_header X-Real-IP $remote_addr; + } +} +# VLC server +server { + listen 8887 ssl; + ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; + ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; + location / { + proxy_pass http://127.0.0.1:5001; + proxy_set_header X-Real-IP $remote_addr; + } +} diff --git a/configs/sudoers.d/010_power_nopasswd b/configs/sudoers.d/010_power_nopasswd new file mode 100644 index 0000000..12b1531 --- /dev/null +++ b/configs/sudoers.d/010_power_nopasswd @@ -0,0 +1,2 @@ +Cmnd_Alias SHUTDOWN=/usr/sbin/reboot, /usr/sbin/poweroff +pil ALL=(ALL) NOPASSWD: SHUTDOWN diff --git a/configs/systemd/cmd_serve.service b/configs/systemd/cmd_serve.service new file mode 100644 index 0000000..004f8d3 --- /dev/null +++ b/configs/systemd/cmd_serve.service @@ -0,0 +1,12 @@ +[Unit] +Description=Pilpil Command Server +After=network.target + +[Service] +User=pil +WorkingDirectory=/home/pil/pilpil-client +ExecStart=/home/pil/pilpil-client/app.py +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/configs/systemd/vlc.service b/configs/systemd/vlc.service new file mode 100755 index 0000000..e1139d0 --- /dev/null +++ b/configs/systemd/vlc.service @@ -0,0 +1,11 @@ +[Unit] +Description=VLC http service + +[Service] +User=pil +ExecStart=/usr/bin/cvlc --quiet -I http --no-osd --http-password=secret --http-host=127.0.0.1 --http-port=5001 +WorkingDirectory=/home/pil +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/configs/vlc/httprequests.lua b/configs/vlc/httprequests.lua new file mode 100644 index 0000000..b2398e0 --- /dev/null +++ b/configs/vlc/httprequests.lua @@ -0,0 +1,559 @@ +--[==========================================================================[ + httprequests.lua: code for processing httprequests commands and output +--[==========================================================================[ + Copyright (C) 2007 the VideoLAN team + $Id$ + + Authors: Antoine Cellerier + Rob Jonson + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +--]==========================================================================] + +module("httprequests",package.seeall) + +local common = require ("common") +local dkjson = require ("dkjson") + + + +--Round the number to the specified precision +function round(what, precision) + if type(what) == "string" then + what = common.us_tonumber(what) + end + if type(what) == "number" then + return math.floor(what*math.pow(10,precision)+0.5) / math.pow(10,precision) + end + return nil +end + +--split text where it matches the delimiter +function strsplit(text, delimiter) + local strfind = string.find + local strsub = string.sub + local tinsert = table.insert + local list = {} + local pos = 1 + if strfind("", delimiter, 1) then -- this would result in endless loops + error("delimiter matches empty string!") + end + local i=1 + while 1 do + local first, last = strfind(text, delimiter, pos) + if first then -- found? + tinsert(list,i, strsub(text, pos, first-1)) + pos = last+1 + else + tinsert(list,i, strsub(text, pos)) + break + end + i = i+1 + end + return list +end + +--main function to process commands sent with the request + +processcommands = function () + + local input = _GET['input'] + local command = _GET['command'] + local id = tonumber(_GET['id'] or -1) + local val = _GET['val'] + local options = _GET['option'] + local band = tonumber(_GET['band']) + local name = _GET['name'] + local duration = tonumber(_GET['duration']) + if type(options) ~= "table" then -- Deal with the 0 or 1 option case + options = { options } + end + + if command == "in_play" then + --[[ + vlc.msg.err( "" ) + for a,b in ipairs(options) do + vlc.msg.err(b) + end + vlc.msg.err( "" ) + --]] + vlc.playlist.add({{path=vlc.strings.make_uri(input),options=options,name=name,duration=duration}}) + elseif command == "addsubtitle" then + vlc.input.add_subtitle (val) + elseif command == "in_enqueue" then + vlc.playlist.enqueue({{path=vlc.strings.make_uri(input),options=options,name=name,duration=duration}}) + elseif command == "pl_play" then + if id == -1 then + vlc.playlist.play() + else + vlc.playlist.gotoitem(id) + end + elseif command == "pl_pause" then + if vlc.playlist.status() == "stopped" then + if id == -1 then + vlc.playlist.play() + else + vlc.playlist.gotoitem(id) + end + else + vlc.playlist.pause() + end + elseif command == "pl_forcepause" then + if vlc.playlist.status() == "playing" then + vlc.playlist.pause() + end + elseif command == "pl_forceresume" then + if vlc.playlist.status() == "paused" then + vlc.playlist.pause() + end + elseif command == "pl_stop" then + vlc.playlist.stop() + elseif command == "pl_next" then + vlc.playlist.next() + elseif command == "pl_previous" then + vlc.playlist.prev() + elseif command == "pl_delete" then + vlc.playlist.delete(id) + elseif command == "pl_empty" then + vlc.playlist.clear() + elseif command == "pl_sort" then + vlc.playlist.sort( val, id > 0 ) + elseif command == "pl_move" then + vlc.playlist.move( id, tonumber(val) or -1) + elseif command == "pl_random" then + vlc.playlist.random() + elseif command == "pl_loop" then + --if loop is set true, then repeat needs to be set false + if vlc.playlist.loop() then + vlc.playlist.repeat_("off") + end + elseif command == "pl_repeat" then + --if repeat is set true, then loop needs to be set false + if vlc.playlist.repeat_() then + vlc.playlist.loop("off") + end + elseif command == "pl_sd" then + if vlc.sd.is_loaded(val) then + vlc.sd.remove(val) + else + vlc.sd.add(val) + end + elseif command == "fullscreen" then + if vlc.object.vout() then + vlc.video.fullscreen() + end + elseif command == "snapshot" then + common.snapshot() + elseif command == "volume" then + common.volume(val) + elseif command == "seek" then + common.seek(val) + elseif command == "key" then + common.hotkey("key-"..val) + elseif command == "audiodelay" then + if vlc.object.input() and val then + val = common.us_tonumber(val) + vlc.var.set(vlc.object.input(),"audio-delay",val * 1000000) + end + elseif command == "rate" then + val = common.us_tonumber(val) + if vlc.object.input() and val >= 0 then + vlc.var.set(vlc.object.input(),"rate",val) + end + elseif command == "subdelay" then + if vlc.object.input() then + val = common.us_tonumber(val) + vlc.var.set(vlc.object.input(),"spu-delay",val * 1000000) + end + elseif command == "aspectratio" then + if vlc.object.vout() then + vlc.var.set(vlc.object.vout(),"aspect-ratio",val) + end + elseif command == "preamp" then + val = common.us_tonumber(val) + vlc.equalizer.preampset(val) + elseif command == "equalizer" then + val = common.us_tonumber(val) + vlc.equalizer.equalizerset(band,val) + elseif command == "enableeq" then + if val == '0' then vlc.equalizer.enable(false) else vlc.equalizer.enable(true) end + elseif command == "setpreset" then + vlc.equalizer.setpreset(val) + elseif command == "title" then + vlc.var.set(vlc.object.input(), "title", val) + elseif command == "chapter" then + vlc.var.set(vlc.object.input(), "chapter", val) + elseif command == "audio_track" then + vlc.var.set(vlc.object.input(), "audio-es", val) + elseif command == "video_track" then + vlc.var.set(vlc.object.input(), "video-es", val) + elseif command == "subtitle_track" then + vlc.var.set(vlc.object.input(), "spu-es", val) + end + + local input = nil + local command = nil + local id = nil + local val = nil + +end + +--utilities for formatting output + +function xmlString(s) + if (type(s)=="string") then + return vlc.strings.convert_xml_special_chars(s) + elseif (type(s)=="number") then + return common.us_tostring(s) + else + return tostring(s) + end +end + +--dkjson outputs numbered tables as arrays +--so we don't need the array indicators +function removeArrayIndicators(dict) + local newDict=dict + + for k,v in pairs(dict) do + if (type(v)=="table") then + local arrayEntry=v._array + if arrayEntry then + v=arrayEntry + end + + dict[k]=removeArrayIndicators(v) + end + end + + return newDict +end + +printTableAsJson = function (dict) + dict=removeArrayIndicators(dict) + + local output=dkjson.encode (dict, { indent = true }) + print(output) +end + +local printXmlKeyValue = function (k,v,indent) + print("\n") + for i=1,indent do print(" ") end + if (k) then + print("<"..k..">") + end + + if (type(v)=="table") then + printTableAsXml(v,indent+2) + else + print(xmlString(v)) + end + + if (k) then + xs=xmlString(k) + space_loc=string.find(xs," ") + if space_loc == nil then + print("") + else + xs=string.sub(xs,1,space_loc) + print("") + end + end +end + +printTableAsXml = function (dict,indent) + for k,v in pairs(dict) do + printXmlKeyValue(k,v,indent) + end +end + +--[[ +function logTable(t,pre) +local pre = pre or "" +for k,v in pairs(t) do +vlc.msg.err(pre..tostring(k).." : "..tostring(v)) +if type(v) == "table" then +a(v,pre.." ") +end +end +end +--]] + +--main accessors + +getplaylist = function () + local p + + if _GET["search"] then + if _GET["search"] ~= "" then + _G.search_key = _GET["search"] + else + _G.search_key = nil + end + local key = vlc.strings.decode_uri(_GET["search"]) + p = vlc.playlist.search(key) + else + p = vlc.playlist.get() + end + + --logTable(p) --Uncomment to debug + + return p +end + +parseplaylist = function (item) + if item.flags.disabled then return end + + if (item.children) then + local result={} + local name = (item.name or "") + + result["type"]="node" + result.id=tostring(item.id) + result.name=tostring(name) + result.ro=item.flags.ro and "ro" or "rw" + + --store children in an array + --we use _array as a proxy for arrays + result.children={} + result.children._array={} + + for _, child in ipairs(item.children) do + local nextChild=parseplaylist(child) + table.insert(result.children._array,nextChild) + end + + return result + else + local result={} + local name, path = item.name or "" + local path = item.path or "" + local current_item_id = vlc.playlist.current() + + -- Is the item the one currently played + if(current_item_id ~= nil) then + if(current_item_id == item.id) then + result.current = "current" + end + end + + result["type"]="leaf" + result.id=tostring(item.id) + result.uri=tostring(path) + result.name=name + result.ro=item.flags.ro and "ro" or "rw" + result.duration=math.floor(item.duration) + + return result + end + +end + +playlisttable = function () + + local basePlaylist=getplaylist() + + return parseplaylist(basePlaylist) +end + +getbrowsetable = function () + + --paths are returned as an array of elements + local result = { element = { _array = {} } } + + local dir + --uri takes precedence, but fall back to dir + if _GET["uri"] then + if _GET["uri"] == "file://~" then + dir = "~" + else + local uri = string.gsub(_GET["uri"], "[?#].*$", "") + if not string.match(uri, "/$") then + uri = uri.."/" + end + dir = vlc.strings.make_path(common.realpath(uri)) + end + elseif _GET["dir"] then + dir = _GET["dir"] + + -- "" dir means listing all drive letters e.g. "A:\", "C:\"... + --however the opendir() API won't resolve "X:\.." to that behavior, + --so we offer this resolution as "backwards compatibility" + if string.match(dir, '^[a-zA-Z]:[\\/]*%.%.$') or + string.match(dir, '^[a-zA-Z]:[\\/]*%.%.[\\/]') then + dir = "" + end + + if dir ~= "" and dir ~= "~" then + dir = dir.."/" --luckily Windows accepts '/' as '\' + end + end + if not dir then + return result + end + + if dir == "~" then + dir = vlc.config.homedir().."/" + end + + local d = vlc.net.opendir(dir) + table.sort(d) + + --FIXME: this is the wrong place to do this, but this still offers + --some useful mitigation: see #25021 + if #d == 0 and dir ~= "" then + table.insert(d, "..") + end + + for _,f in pairs(d) do + if f == ".." or not string.match(f,"^%.") then + local path = dir..f + local element={} + + local s = vlc.net.stat(path) + if (s) then + for k,v in pairs(s) do + element[k]=v + end + else + element["type"]="unknown" + end + element["path"]=path + element["name"]=f + + local uri=vlc.strings.make_uri(path) + if uri then + element["uri"]=common.realpath(uri) + end + + table.insert(result.element._array,element) + end + end + + return result; +end + + +getstatus = function (includecategories) + + + local input = vlc.object.input() + local item = vlc.input.item() + local playlist = vlc.object.playlist() + local vout = vlc.object.vout() + local aout = vlc.object.aout() + + local s ={} + + --update api version when new data/commands added + s.apiversion=3 + s.version=vlc.misc.version() + s.volume=vlc.volume.get() + + if input then + s.time=math.floor(vlc.var.get(input,"time") / 1000000) + s.position=vlc.var.get(input,"position") + s.currentplid=vlc.playlist.current() + s.audiodelay=vlc.var.get(input,"audio-delay") / 1000000 + s.rate=vlc.var.get(input,"rate") + s.subtitledelay=vlc.var.get(input,"spu-delay") / 1000000 + else + s.time=0 + s.position=0 + s.currentplid=-1 + s.audiodelay=0 + s.rate=1 + s.subtitledelay=0 + end + + if item then + s.length=math.floor(item:duration()) + else + s.length=0 + end + + if vout then + s.fullscreen=vlc.var.get(vout,"fullscreen") + s.aspectratio=vlc.var.get(vout,"aspect-ratio"); + if s.aspectratio=="" then s.aspectratio = "default" end + else + s.fullscreen=0 + end + + if aout then + local filters=vlc.var.get(aout,"audio-filter") + local temp=strsplit(filters,":") + s.audiofilters={} + local id=0 + for i,j in pairs(temp) do + s.audiofilters['filter_'..id]=j + id=id+1 + end + end + + s.videoeffects={} + s.videoeffects.hue=round(vlc.config.get("hue"),2) + s.videoeffects.brightness=round(vlc.config.get("brightness"),2) + s.videoeffects.contrast=round(vlc.config.get("contrast"),2) + s.videoeffects.saturation=round(vlc.config.get("saturation"),2) + s.videoeffects.gamma=round(vlc.config.get("gamma"),2) + + s.state=vlc.playlist.status() + s.random=vlc.var.get(playlist,"random") + s.loop=vlc.var.get(playlist,"loop") + s["repeat"]=vlc.var.get(playlist,"repeat") + + s.equalizer={} + s.equalizer.preamp=round(vlc.equalizer.preampget(),2) + s.equalizer.bands=vlc.equalizer.equalizerget() + if s.equalizer.bands ~= null then + for k,i in pairs(s.equalizer.bands) do s.equalizer.bands[k]=round(i,2) end + s.equalizer.presets=vlc.equalizer.presets() + end + + if (includecategories and item) then + s.information={} + s.information.category={} + s.information.category.meta=item:metas() + + local info = item:info() + for k, v in pairs(info) do + local streamTable={} + for k2, v2 in pairs(v) do + local tag = string.gsub(k2," ","_") + streamTable[tag]=v2 + end + + s.information.category[k]=streamTable + end + + s.stats={} + + local statsdata = item:stats() + for k,v in pairs(statsdata) do + local tag = string.gsub(k,"_","") + s.stats[tag]=v + end + + s.information.chapter=vlc.var.get(input, "chapter") + s.information.title=vlc.var.get(input, "title") + + s.information.chapters=vlc.var.get_list(input, "chapter") + s.information.titles=vlc.var.get_list(input, "title") + + end + return s +end + diff --git a/get_rssi.sh b/get_rssi.sh new file mode 100755 index 0000000..0f04c93 --- /dev/null +++ b/get_rssi.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# $1 is a device + +#AP_MAC="$(arp -i wlan0 | tail -1 | awk '{print $3}')" +#iw dev $1 station get $AP_MAC | grep signal: | awk '{print $2}' +#cat /proc/net/wireless | grep wl | awk {'gsub(/:/, "", $1);print $1;gsub(/\./, "", $4);print$4'} +cat /proc/net/wireless | grep wl | awk {'gsub(/\./, "", $4);print$4'} diff --git a/utils/cleanup.sh b/utils/cleanup.sh new file mode 100755 index 0000000..3ab56a2 --- /dev/null +++ b/utils/cleanup.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# +# Empty a few folders +sudo rm -rf /home/pil/.ssh/authorized_keys /home/pil/Videos/* /etc/ssl/private/nginx-selfsigned.key /etc/ssl/certs/nginx-selfsigned.crt +# hostname : Change hostname +echo "pilpil" | sudo tee /etc/hostname +# hosts : Replace with hostname +sudo sed -i 's/\(127.0.1.1\t\).*/\1pilpil/' /etc/hosts +# dhcpcd.conf : Remove 2 last lines +sudo sed -i "$(( $(wc -l < /etc/dhcpcd.conf) - 2 +1 )),$ d" /etc/dhcpcd.conf +# sshd_config : Remove 3 last lines +sudo sed -i "$(( $(wc -l < /etc/ssh/sshd_config) - 3 +1 )),$ d" /etc/ssh/sshd_config +# wpa_supplicant.conf : subs SSID and PW +sudo sed -i 's/\(ssid=\"\).*/\1pilpil\"/' /etc/wpa_supplicant/wpa_supplicant.conf +sudo sed -i 's/\(psk=\"\).*/\1poilpoil\"/' /etc/wpa_supplicant/wpa_supplicant.conf