forked from mrjones-plip/timekpr-next-remote
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtimekpr-next-web.py
More file actions
117 lines (95 loc) · 3.96 KB
/
Copy pathtimekpr-next-web.py
File metadata and controls
117 lines (95 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import main
import json
import conf, re, os
from fabric import Connection
from paramiko.ssh_exception import AuthenticationException
from flask import Flask, render_template, request, send_from_directory
app = Flask(__name__)
def validate_request(computer, user):
if computer not in conf.trackme:
return {'result': "fail", "message": "computer not in config"}
if user not in conf.trackme[computer]:
return {'result': "fail", "message": "user not in computer in config"}
else:
return {'result': "success", "message": "valid user and computer"}
@app.route("/config")
def config():
return main.get_config()
@app.route("/")
def index():
return render_template("index.html")
@app.route("/get_usage/<computer>/<user>")
def get_usage(computer, user):
if validate_request(computer, user)['result'] == "fail":
return validate_request(computer, user), 500
ssh = main.get_connection(computer)
usage = main.get_usage(user, computer, ssh)
return {'result': usage['result'], "time_left": usage['time_left'], "time_spent": usage['time_spent']}, 200
@app.route("/increase_time/<computer>/<user>/<seconds>")
def increase_time(computer, user, seconds):
if validate_request(computer, user)['result'] == "fail":
return validate_request(computer, user), 500
ssh = main.get_connection(computer)
if main.increase_time(seconds, ssh, user, computer):
usage = main.get_usage(user, computer, ssh)
return {'result': "success", "time_left": usage['time_left'], "time_spent": usage['time_spent']}, 200
else:
return {'result': "fail"}, 500
@app.route("/decrease_time/<computer>/<user>/<seconds>")
def decrease_time(computer, user, seconds):
if validate_request(computer, user)['result'] == "fail":
return validate_request(computer, user), 500
ssh = main.get_connection(computer)
if main.decrease_time(seconds, ssh, user, computer):
usage = main.get_usage(user, computer, ssh)
return {'result': "success", "time_left": usage['time_left'], "time_spent": usage['time_spent']}, 200
else:
return {'result': "fail"}, 500
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico',mimetype='image/vnd.microsoft.icon')
def get_user_config_path(username):
return f"/var/lib/timekpr/config/timekpr.{username}.conf"
@app.route('/limits/<username>', methods=['GET'])
def get_limits(username):
path = get_user_config_path(username)
limits = {}
try:
with open(path, "r") as f:
for line in f:
if match := re.match(r"ALLOWED_HOURS_(\d)\s*=\s*(.+)", line):
day, hours = match.groups()
limits[day] = hours.strip()
except Exception as e:
return json.dumps({"error": str(e)}), 500
return json.dumps(limits), 200
@app.route('/limits/<username>', methods=['POST'])
def set_limits(username):
data = request.json
path = get_user_config_path(username)
try:
with open(path, "r") as f:
lines = f.readlines()
new_lines = []
for line in lines:
if match := re.match(r"ALLOWED_HOURS_(\d)\s*=", line):
day = match.group(1)
if day in data:
new_lines.append(f"ALLOWED_HOURS_{day} = {data[day]}\n")
else:
new_lines.append(line)
else:
new_lines.append(line)
with open(path, "w") as f:
f.writelines(new_lines)
except Exception as e:
return json.dumps({"error": str(e)}), 500
return json.dumps({"status": "ok"}), 200
@app.route('/get_limit/<computer>/<username>', methods=['GET'])
def get_limit(computer, username):
# Логика для получения лимита
limit = get_limit_from_database_or_file(computer, username)
return jsonify({"limit": limit})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)