Revert "profile filetype checks"

This commit is contained in:
Jason Bruce 2024-07-02 13:57:11 -04:00 committed by GitHub
parent 2e756178dc
commit 0958eddbfb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 64 additions and 84 deletions

1
.gitignore vendored
View File

@ -8,4 +8,3 @@ thumbs.db
#storage/profiles
#config.py
.idea/*
.DS_Store

View File

@ -8,7 +8,6 @@ import json
import bottle
import gevent
import geventwebsocket
#from bottle import post, get
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
@ -17,7 +16,6 @@ from geventwebsocket import WebSocketError
try:
sys.dont_write_bytecode = True
import config
sys.dont_write_bytecode = False
except:
print ("Could not import config file.")
@ -29,7 +27,7 @@ log = logging.getLogger("kiln-controller")
log.info("Starting kiln controller")
script_dir = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, script_dir + "/lib/")
sys.path.insert(0, script_dir + '/lib/')
profile_path = config.kiln_profiles_directory
from oven import SimulatedOven, RealOven, Profile
@ -47,34 +45,33 @@ ovenWatcher = OvenWatcher(oven)
# this ovenwatcher is used in the oven class for restarts
oven.set_ovenwatcher(ovenWatcher)
@app.route("/")
@app.route('/')
def index():
return bottle.redirect("/picoreflow/index.html")
return bottle.redirect('/picoreflow/index.html')
@app.get("/api/stats")
@app.get('/api/stats')
def handle_api():
log.info("/api/stats command received")
if hasattr(oven, "pid"):
if hasattr(oven.pid, "pidstats"):
if hasattr(oven,'pid'):
if hasattr(oven.pid,'pidstats'):
return json.dumps(oven.pid.pidstats)
@app.post("/api")
@app.post('/api')
def handle_api():
log.info("/api is alive")
# run a kiln schedule
if bottle.request.json["cmd"] == "run":
wanted = bottle.request.json["profile"]
log.info("api requested run of profile = %s" % wanted)
if bottle.request.json['cmd'] == 'run':
wanted = bottle.request.json['profile']
log.info('api requested run of profile = %s' % wanted)
# start at a specific minute in the schedule
# for restarting and skipping over early parts of a schedule
startat = 0
if "startat" in bottle.request.json:
startat = bottle.request.json["startat"]
startat = 0;
if 'startat' in bottle.request.json:
startat = bottle.request.json['startat']
# get the wanted profile/kiln schedule
profile = find_profile(wanted)
@ -87,59 +84,54 @@ def handle_api():
oven.run_profile(profile,startat=startat)
ovenWatcher.record(profile)
if bottle.request.json["cmd"] == "stop":
if bottle.request.json['cmd'] == 'stop':
log.info("api stop command received")
oven.abort_run()
if bottle.request.json["cmd"] == "memo":
if bottle.request.json['cmd'] == 'memo':
log.info("api memo command received")
memo = bottle.request.json["memo"]
memo = bottle.request.json['memo']
log.info("memo=%s" % (memo))
# get stats during a run
if bottle.request.json["cmd"] == "stats":
if bottle.request.json['cmd'] == 'stats':
log.info("api stats command received")
if hasattr(oven, "pid"):
if hasattr(oven.pid, "pidstats"):
if hasattr(oven,'pid'):
if hasattr(oven.pid,'pidstats'):
return json.dumps(oven.pid.pidstats)
return { "success" : True }
def find_profile(wanted):
"""
'''
given a wanted profile name, find it and return the parsed
json profile object or None.
"""
'''
#load all profiles from disk
profiles = get_profiles()
json_profiles = json.loads(profiles)
# find the wanted profile
for profile in json_profiles:
if profile["name"] == wanted:
if profile['name'] == wanted:
return profile
return None
@app.route("/picoreflow/:filename#.*#")
@app.route('/picoreflow/:filename#.*#')
def send_static(filename):
log.debug("serving %s" % filename)
return bottle.static_file(
filename,
root=os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), "public"),
)
return bottle.static_file(filename, root=os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), "public"))
def get_websocket_from_request():
env = bottle.request.environ
wsock = env.get("wsgi.websocket")
wsock = env.get('wsgi.websocket')
if not wsock:
abort(400, "Expected WebSocket request.")
abort(400, 'Expected WebSocket request.')
return wsock
@app.route("/control")
@app.route('/control')
def handle_control():
wsock = get_websocket_from_request()
log.info("websocket (control) opened")
@ -151,7 +143,7 @@ def handle_control():
msgdict = json.loads(message)
if msgdict.get("cmd") == "RUN":
log.info("RUN command received")
profile_obj = msgdict.get("profile")
profile_obj = msgdict.get('profile')
if profile_obj:
profile_json = json.dumps(profile_obj)
profile = Profile(profile_json)
@ -177,7 +169,7 @@ def handle_control():
log.info("websocket (control) closed")
@app.route("/storage")
@app.route('/storage')
def handle_storage():
wsock = get_websocket_from_request()
log.info("websocket (storage) opened")
@ -198,14 +190,14 @@ def handle_storage():
wsock.send(get_profiles())
elif msgdict.get("cmd") == "DELETE":
log.info("DELETE command received")
profile_obj = msgdict.get("profile")
profile_obj = msgdict.get('profile')
if delete_profile(profile_obj):
msgdict["resp"] = "OK"
wsock.send(json.dumps(msgdict))
#wsock.send(get_profiles())
elif msgdict.get("cmd") == "PUT":
log.info("PUT command received")
profile_obj = msgdict.get("profile")
profile_obj = msgdict.get('profile')
#force = msgdict.get('force', False)
force = True
if profile_obj:
@ -223,7 +215,7 @@ def handle_storage():
log.info("websocket (storage) closed")
@app.route("/config")
@app.route('/config')
def handle_config():
wsock = get_websocket_from_request()
log.info("websocket (config) opened")
@ -236,7 +228,7 @@ def handle_config():
log.info("websocket (config) closed")
@app.route("/status")
@app.route('/status')
def handle_status():
wsock = get_websocket_from_request()
ovenWatcher.add_observer(wsock)
@ -253,39 +245,31 @@ def handle_status():
def get_profiles():
try:
profile_files = os.listdir(profile_path)
profile_files.sort()
except:
profile_files = []
profiles = []
for filename in profile_files:
if filename.startswith("._"):
pass
else:
if filename.endswith(".json"):
with open(os.path.join(profile_path, filename), "r") as f:
with open(os.path.join(profile_path, filename), 'r') as f:
profiles.append(json.load(f))
else:
pass
return json.dumps(profiles)
def save_profile(profile, force=False):
profile_json = json.dumps(profile)
filename = profile["name"] + ".json"
filename = profile['name']+".json"
filepath = os.path.join(profile_path, filename)
if not force and os.path.exists(filepath):
log.error("Could not write, %s already exists" % filepath)
return False
with open(filepath, "w+") as f:
with open(filepath, 'w+') as f:
f.write(profile_json)
f.close()
log.info("Wrote %s" % filepath)
return True
def delete_profile(profile):
profile_json = json.dumps(profile)
filename = profile["name"] + ".json"
filename = profile['name']+".json"
filepath = os.path.join(profile_path, filename)
os.remove(filepath)
log.info("Deleted %s" % filepath)
@ -293,15 +277,11 @@ def delete_profile(profile):
def get_config():
return json.dumps(
{
"temp_scale": config.temp_scale,
return json.dumps({"temp_scale": config.temp_scale,
"time_scale_slope": config.time_scale_slope,
"time_scale_profile": config.time_scale_profile,
"kwh_rate": config.kwh_rate,
"currency_type": config.currency_type,
}
)
"currency_type": config.currency_type})
def main():
@ -309,7 +289,8 @@ def main():
port = config.listening_port
log.info("listening on %s:%d" % (ip, port))
server = WSGIServer((ip, port), app, handler_class=WebSocketHandler)
server = WSGIServer((ip, port), app,
handler_class=WebSocketHandler)
server.serve_forever()