├── .gitignore ├── config.json ├── xeonpanel.service ├── admin ├── settings.py ├── nodes.py ├── users.py ├── images.py └── servers.py ├── themes └── default │ ├── errors │ ├── 401.html │ ├── 404.html │ └── 503.html │ ├── server │ ├── editfile.html │ ├── layout.html │ ├── configuration.html │ ├── files.html │ └── server.html │ ├── setup │ ├── welcome.html │ ├── setupfinal.html │ └── setupaccount.html │ ├── dashboard │ ├── servers.html │ ├── layout.html │ └── account.html │ ├── admin │ ├── images │ │ ├── createimage.html │ │ ├── images.html │ │ └── viewimage.html │ ├── nodes │ │ ├── viewnode.html │ │ ├── createnode.html │ │ └── nodes.html │ ├── users │ │ ├── users.html │ │ ├── createuser.html │ │ └── viewuser.html │ ├── servers │ │ ├── servers.html │ │ └── createserver.html │ ├── settings.html │ └── layout.html │ └── auth │ ├── login.html │ └── register.html ├── xeonpanel.conf ├── routers ├── dashboard.py ├── gateway.py ├── auth.py ├── setup.py ├── server.py └── api.py ├── README.md ├── schema.sql ├── app.py ├── .github └── workflows │ └── codeql-analysis.yml └── static └── img ├── undraw_set_preferences_kwia.svg └── undraw_preferences_re_49in.svg /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.db 3 | __pycache__/ 4 | *.DS_Store -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme": "default", 3 | "secret": "eanIC!i52Op3O1PSe!0M81WNAjf9@OBa9" 4 | } -------------------------------------------------------------------------------- /xeonpanel.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=XeonPanel service 3 | After=multi-user.target 4 | [Service] 5 | Type=simple 6 | Restart=always 7 | ExecStart=/usr/bin/python3 /etc/xeonpanel/app.py 8 | WorkingDirectory=/etc/xeonpanel 9 | [Install] 10 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /admin/settings.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/admin") 6 | def admin(): 7 | if flask.session: 8 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 9 | return flask.render_template("/admin/settings.html", title="Settings", query=query) 10 | else: 11 | flask.abort(401) 12 | else: 13 | return flask.redirect("/login") -------------------------------------------------------------------------------- /themes/default/errors/401.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 401 4 | 5 | 6 | 7 |
8 |

401

9 |

Unauthorized

10 |
11 | 12 | -------------------------------------------------------------------------------- /themes/default/errors/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 404 4 | 5 | 6 | 7 |
8 |

404

9 |

Page not found

10 |
11 | 12 | -------------------------------------------------------------------------------- /themes/default/errors/503.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 503 4 | 5 | 6 | 7 |
8 |

503

9 |

Server in maintenance

10 |
11 | 12 | -------------------------------------------------------------------------------- /xeonpanel.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name url; 4 | return 301 https://$server_name$request_uri; 5 | } 6 | 7 | server { 8 | listen 443 ssl; 9 | server_name url; 10 | 11 | ssl_certificate /etc/letsencrypt/live/url/fullchain.pem; 12 | ssl_certificate_key /etc/letsencrypt/live/url/privkey.pem; 13 | ssl_trusted_certificate /etc/letsencrypt/live/url/chain.pem; 14 | 15 | location / { 16 | proxy_set_header X-Forwarded-For $remote_addr; 17 | proxy_set_header Host $http_host; 18 | proxy_pass http://127.0.0.1:5000; 19 | } 20 | } -------------------------------------------------------------------------------- /routers/dashboard.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/dashboard") 6 | def dashboard(): 7 | if flask.session: 8 | return flask.render_template( 9 | "/dashboard/servers.html", 10 | title="Your servers", 11 | servers=query("SELECT * FROM servers WHERE owner_id = ?", flask.session["id"]), 12 | panellogo=query('SELECT panel_logo FROM settings')[0][0], 13 | panelname=query('SELECT panel_name FROM settings')[0][0], 14 | usertype=query("SELECT user_type FROM users WHERE id = ?", flask.session["id"])[0][0] 15 | ) 16 | else: 17 | return flask.redirect("/") 18 | 19 | @app.get("/dashboard/account") 20 | def dashboard_account(): 21 | if flask.session: 22 | return flask.render_template("/dashboard/account.html", title="Account settings", query=query) 23 | else: 24 | return flask.redirect("/") -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://cdn.discordapp.com/attachments/986710139585306635/1000086700862738482/dd.png) 2 | With xeonpanel you can run game-servers, bots and docker containers with a fast and responsive UI. Supports extensions and custom theme's 3 | # Installation 4 | To install this panel you need to have curl installed. 5 | Ubuntu 16.04 > supported. DOES NOT RUN WITH WINDOWS 6 | 7 | One command install script 8 | ``` 9 | bash <(curl -s https://raw.githubusercontent.com/XeonPanel/panel/main/install.sh) 10 | ``` 11 | 12 | # Preview 13 | 14 | ![](https://cdn.discordapp.com/attachments/986710139585306635/1000088290810146956/Screenshot_2022-07-22_at_19.13.19.png) 15 | ![](https://cdn.discordapp.com/attachments/986710139585306635/1000088425862529064/Screenshot_2022-07-22_at_19.14.00.png) 16 | ![](https://cdn.discordapp.com/attachments/986710139585306635/1000088515918438460/Screenshot_2022-07-22_at_19.14.23.png) 17 | ![](https://cdn.discordapp.com/attachments/986710139585306635/1000088621040275456/Screenshot_2022-07-22_at_19.14.45.png) 18 | -------------------------------------------------------------------------------- /routers/gateway.py: -------------------------------------------------------------------------------- 1 | import flask, hashlib, sys, time, requests, os 2 | 3 | from __main__ import app, query 4 | 5 | # Panel gateway to Deamon 6 | 7 | # Stop server 8 | @app.post("/gateway//servers//stop") 9 | def stop_server(node_id, server_uuid): 10 | if flask.session: 11 | session = requests.Session() 12 | session.headers.update({ 13 | "Authorization": query("SELECT * FROM nodes WHERE id = ?", node_id)[0][5] 14 | }) 15 | return session.post("http://{}/servers/{}/stop".format(query("SELECT * FROM nodes WHERE id = ?", node_id)[0][4], server_uuid)).json() 16 | 17 | # Start server 18 | @app.post("/gateway//servers//start") 19 | def start_server(node_id, server_uuid): 20 | if flask.session: 21 | session = requests.Session() 22 | session.headers.update({ 23 | "Authorization": query("SELECT * FROM nodes WHERE id = ?", node_id)[0][5] 24 | }) 25 | return session.post("http://{}/servers/{}/start".format(query("SELECT * FROM nodes WHERE id = ?", node_id)[0][4], server_uuid)).json() -------------------------------------------------------------------------------- /admin/nodes.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/admin/nodes") 6 | def nodes(): 7 | if flask.session: 8 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 9 | return flask.render_template("/admin/nodes/nodes.html", title="Nodes", query=query) 10 | else: 11 | flask.abort(401) 12 | else: 13 | return flask.redirect("/login") 14 | 15 | @app.get("/admin/nodes/create") 16 | def create_node(): 17 | if flask.session: 18 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 19 | return flask.render_template("/admin/nodes/createnode.html", title="Nodes", query=query) 20 | else: 21 | flask.abort(401) 22 | else: 23 | return flask.redirect("/login") 24 | 25 | @app.get("/admin/nodes//view") 26 | def view_node(nodeid): 27 | if flask.session: 28 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 29 | if len(query("SELECT * FROM nodes WHERE id = ?", nodeid)): 30 | return flask.render_template("/admin/nodes/viewnode.html", title="Nodes", query=query, nodeid=nodeid) 31 | else: 32 | flask.abort(404) 33 | else: 34 | flask.abort(401) 35 | else: 36 | return flask.redirect("/login") -------------------------------------------------------------------------------- /admin/users.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/admin/users") 6 | def users(): 7 | if flask.session: 8 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 9 | return flask.render_template("/admin/users/users.html", title="Users", query=query) 10 | else: 11 | flask.abort(401) 12 | else: 13 | return flask.redirect("/login") 14 | 15 | @app.get("/admin/users/create") 16 | def create_user(): 17 | if flask.session: 18 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 19 | return flask.render_template("/admin/users/createuser.html", title="Users", query=query) 20 | else: 21 | flask.abort(401) 22 | else: 23 | return flask.redirect("/login") 24 | 25 | @app.get("/admin/users//view") 26 | def view_user(userid): 27 | if flask.session: 28 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 29 | if len(query("SELECT * FROM users WHERE id = ?", userid)): 30 | return flask.render_template("/admin/users/viewuser.html", title="Users", query=query, userid=userid) 31 | else: 32 | flask.abort(404) 33 | else: 34 | flask.abort(401) 35 | else: 36 | return flask.redirect("/login") -------------------------------------------------------------------------------- /admin/images.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/admin/images") 6 | def images(): 7 | if flask.session: 8 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 9 | return flask.render_template("/admin/images/images.html", title="Images", query=query) 10 | else: 11 | flask.abort(401) 12 | else: 13 | return flask.redirect("/login") 14 | 15 | @app.get("/admin/images/create") 16 | def create_image(): 17 | if flask.session: 18 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 19 | return flask.render_template("/admin/images/createimage.html", title="Images", query=query) 20 | else: 21 | flask.abort(401) 22 | else: 23 | return flask.redirect("/login") 24 | 25 | @app.get("/admin/images//view") 26 | def view_image(imageid): 27 | if flask.session: 28 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 29 | if len(query("SELECT * FROM images WHERE id = ?", imageid)): 30 | return flask.render_template("/admin/images/viewimage.html", title="Images", query=query, imageid=imageid) 31 | else: 32 | flask.abort(404) 33 | else: 34 | flask.abort(401) 35 | else: 36 | return flask.redirect("/login") -------------------------------------------------------------------------------- /themes/default/server/editfile.html: -------------------------------------------------------------------------------- 1 | {% extends "/server/layout.html" %} 2 | 3 | {% block content %} 4 | 11 |
12 | 13 | 14 | 15 | 16 |
17 | 28 | {% endblock %} -------------------------------------------------------------------------------- /admin/servers.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/admin/servers") 6 | def servers(): 7 | if flask.session: 8 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 9 | return flask.render_template("/admin/servers/servers.html", title="Servers", query=query) 10 | else: 11 | flask.abort(401) 12 | else: 13 | return flask.redirect("/login") 14 | 15 | @app.get("/admin/servers/create") 16 | def create_server(): 17 | if flask.session: 18 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 19 | return flask.render_template("/admin/servers/createserver.html", title="Servers", query=query) 20 | else: 21 | flask.abort(401) 22 | else: 23 | return flask.redirect("/login") 24 | 25 | @app.get("/admin/servers//view") 26 | def view_server(serverid): 27 | if flask.session: 28 | if query("SELECT * FROM users WHERE id = ?", flask.session["id"])[0][5] == "administrator": 29 | if len(query("SELECT * FROM servers WHERE id = ?", serverid)): 30 | return flask.render_template("/admin/servers/viewserver.html", title="Servers", query=query, serverid=serverid) 31 | else: 32 | flask.abort(404) 33 | else: 34 | flask.abort(401) 35 | else: 36 | return flask.redirect("/login") -------------------------------------------------------------------------------- /themes/default/setup/welcome.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Getting started

11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 |

Welcome to your Xeon panel, this is the setup page. Click next to setup your panel.

22 | Next 23 |
24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /themes/default/setup/setupfinal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Installation completed

11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 |

Xeon panel is now installed on your system.

22 |
23 | Finish 24 |
25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /schema.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS "users" ( 2 | "id" INTEGER UNIQUE, 3 | "name" VARCHAR(255), 4 | "email" VARCHAR(255), 5 | "password" VARCHAR(255), 6 | "token" VARCHAR(255), 7 | "user_type" VARCHAR(255), 8 | PRIMARY KEY("id" AUTOINCREMENT) 9 | ); 10 | 11 | CREATE TABLE IF NOT EXISTS "settings" ( 12 | "panel_name" VARCHAR(255), 13 | "panel_logo" VARCHAR(255) 14 | ); 15 | 16 | CREATE TABLE IF NOT EXISTS "nodes" ( 17 | "id" INTEGER UNIQUE, 18 | "name" VARCHAR(255), 19 | "memory" VARCHAR(255), 20 | "disk" VARCHAR(255), 21 | "ip" VARCHAR(255), 22 | "token" VARCHAR(255), 23 | PRIMARY KEY("id" AUTOINCREMENT) 24 | ); 25 | 26 | CREATE TABLE IF NOT EXISTS "servers" ( 27 | "id" INTEGER UNIQUE, 28 | "name" VARCHAR(255), 29 | "memory" VARCHAR(255), 30 | "disk" VARCHAR(255), 31 | "ip_port" VARCHAR(255), 32 | "node_id" VARCHAR(255), 33 | "image_id" VARCHAR(255), 34 | "owner_id" VARCHAR(255), 35 | "suspended" INTEGER, 36 | "uuid" VARCHAR(255), 37 | "startup" VARCHAR(255), 38 | "image" VARCHAR(255), 39 | "subusers" VARCHAR(255), 40 | PRIMARY KEY("id" AUTOINCREMENT) 41 | ); 42 | 43 | CREATE TABLE IF NOT EXISTS "images" ( 44 | "id" INTEGER UNIQUE, 45 | "name" VARCHAR(255), 46 | "startup" VARCHAR(255), 47 | "image" VARCHAR(255), 48 | PRIMARY KEY("id" AUTOINCREMENT) 49 | ); 50 | 51 | CREATE TABLE IF NOT EXISTS "images" ( 52 | "id" INTEGER UNIQUE, 53 | "name" VARCHAR(255), 54 | "startup" VARCHAR(255), 55 | "image" VARCHAR(255), 56 | PRIMARY KEY("id" AUTOINCREMENT) 57 | ); 58 | 59 | CREATE TABLE IF NOT EXISTS "image_variables" ( 60 | "id" INTEGER UNIQUE, 61 | "name" VARCHAR(255), 62 | "variable" VARCHAR(255), 63 | "image_id" VARCHAR(255), 64 | PRIMARY KEY("id" AUTOINCREMENT) 65 | ); 66 | 67 | CREATE TABLE IF NOT EXISTS "server_variables" ( 68 | "id" INTEGER UNIQUE, 69 | "data" VARCHAR(255), 70 | "image_id" VARCHAR(255), 71 | "server_id" VARCHAR(255), 72 | "variable_id" VARCHAR(255), 73 | PRIMARY KEY("id" AUTOINCREMENT) 74 | ); -------------------------------------------------------------------------------- /themes/default/dashboard/servers.html: -------------------------------------------------------------------------------- 1 | {% extends "/dashboard/layout.html" %} 2 | 3 | {% block content %} 4 | {% if servers %} 5 | 32 | {% else %} 33 |

34 | You don't have any servers 35 |

36 | {% endif %} 37 | {% endblock %} 38 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import flask, os, sqlite3, json 2 | 3 | app = flask.Flask("Xeonpanel", template_folder="themes/{}".format(json.loads(open("config.json", "r").read())["theme"])) 4 | app.config["MAINTENANCE_MODE"] = False 5 | app.config["DEVELOPMENT_MODE"] = True 6 | app.config["SECRET_KEY"] = json.loads(open("config.json", "r").read())["secret"] 7 | 8 | def query(sql, *parameter): 9 | conn = sqlite3.connect("database.db", check_same_thread=False) 10 | cursor = conn.cursor() 11 | data = cursor.execute(sql, (parameter)).fetchall() 12 | conn.commit() 13 | return data 14 | 15 | if not os.path.isfile("database.db"): 16 | import routers.setup 17 | else: 18 | @app.get("/setup/finish") 19 | def setup_reboot_server(): 20 | return flask.redirect("/") 21 | 22 | import routers.dashboard, routers.auth, routers.api, routers.server 23 | import admin.settings, admin.nodes, admin.servers, admin.images, admin.users 24 | 25 | @app.before_request 26 | def maintenance(): 27 | if app.config["MAINTENANCE_MODE"]: 28 | flask.abort(503) 29 | else: 30 | if not "/setup" in flask.request.path: 31 | if not "/static" in flask.request.path: 32 | if not os.path.isfile("database.db"): 33 | return flask.redirect("/setup/getting-started") 34 | elif "/setup/reboot" in flask.request.path: 35 | return flask.redirect("/") 36 | 37 | @app.errorhandler(503) 38 | def error_503(error): 39 | return flask.render_template("/errors/503.html") 40 | 41 | @app.errorhandler(404) 42 | def error_404(error): 43 | return flask.render_template("/errors/404.html") 44 | 45 | @app.errorhandler(401) 46 | def error_401(error): 47 | return flask.render_template("/errors/401.html") 48 | 49 | @app.get("/logout") 50 | def logout(): 51 | if flask.session: 52 | if flask.request.args["csrf"] == flask.session["csrf_token"]: 53 | flask.session.clear() 54 | return flask.redirect("/") 55 | 56 | @app.get("/") 57 | def main(): 58 | if flask.session: 59 | return flask.redirect("/dashboard") 60 | else: 61 | return flask.redirect("/login") 62 | 63 | if app.config["DEVELOPMENT_MODE"]: 64 | app.run(debug=True, host="0.0.0.0", port=5000) 65 | else: 66 | app.run(debug=False, host="0.0.0.0", port=5000) 67 | -------------------------------------------------------------------------------- /routers/auth.py: -------------------------------------------------------------------------------- 1 | import flask, os, hashlib 2 | 3 | from __main__ import app, query 4 | 5 | @app.get("/login") 6 | def getlogin(): 7 | return flask.render_template("/auth/login.html", title="Login") 8 | 9 | @app.get("/register") 10 | def getregister(): 11 | return flask.render_template("/auth/register.html", title="Register") 12 | 13 | @app.post("/login") 14 | def postlogin(): 15 | if flask.request.form.get("email") and flask.request.form.get("password"): 16 | data = query("SELECT * FROM users WHERE email = ? and password = ?", flask.request.form.get("email"), hashlib.sha256(flask.request.form.get("password").encode("utf-8")).hexdigest()) 17 | if len(data): 18 | flask.session["username"] = data[0][1] 19 | flask.session["email"] = data[0][2] 20 | flask.session["id"] = data[0][0] 21 | flask.session["token"] = data[0][4] 22 | flask.session["csrf_token"] = os.urandom(250).hex() 23 | return flask.jsonify({"status": "succes"}) 24 | else: 25 | return flask.jsonify({"status": "error", "message": "Email or password invalid"}) 26 | else: 27 | return flask.jsonify({"status": "error", "message": "Please fill in all fields"}) 28 | 29 | @app.post("/register") 30 | def postregister(): 31 | if flask.request.form.get("email") and flask.request.form.get("password") and flask.request.form.get("username"): 32 | data = query( 33 | "SELECT * FROM users WHERE email = ? or name = ?", 34 | flask.request.form.get("email"), flask.request.form.get("username") 35 | ) 36 | if len(data): 37 | return flask.jsonify({"status": "error", "message": "Username or email already exists"}) 38 | else: 39 | query( 40 | "INSERT INTO users (name, email, password, token, user_type) VALUES (?, ?, ?, ?, ?)", 41 | flask.request.form.get("username"), 42 | flask.request.form.get("email"), 43 | hashlib.sha256( 44 | flask.request.form.get("password").encode("utf-8") 45 | ).hexdigest(), 46 | os.urandom(50).hex(), 47 | "user" 48 | ) 49 | return flask.jsonify({"status": "succes"}) 50 | else: 51 | return flask.jsonify({"status": "error", "message": "Please fill in all fields"}) 52 | -------------------------------------------------------------------------------- /themes/default/setup/setupaccount.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Getting started

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 | -------------------------------------------------------------------------------- /routers/setup.py: -------------------------------------------------------------------------------- 1 | import flask, os, time, sys, sqlite3, hashlib 2 | 3 | from __main__ import app 4 | 5 | @app.post("/setup/register-admin") 6 | def setup_register_admin(): 7 | conn = sqlite3.connect("database.db", check_same_thread=False) 8 | cursor = conn.cursor() 9 | cursor.executescript(open("schema.sql").read()) 10 | conn.commit() 11 | cursor.execute("INSERT INTO settings (panel_name, panel_logo) VALUES ('Xeonpanel', 'https://cdn.discordapp.com/attachments/986710139585306635/1000086700862738482/dd.png')") 12 | cursor.execute( 13 | "INSERT INTO users (name, email, password, token, user_type) VALUES (?, ?, ?, ?, ?)", 14 | ( 15 | flask.request.form.get("username"), 16 | flask.request.form.get("email"), 17 | hashlib.sha256( 18 | flask.request.form.get("password").encode("utf-8") 19 | ).hexdigest(), 20 | os.urandom(50).hex(), 21 | "administrator" 22 | ) 23 | ) 24 | conn.commit() 25 | cursor.execute( 26 | "INSERT INTO images (name, startup, image) VALUES ('Python bot', 'python -m pip install -U [[PIP_PACKAGES]]; python /home/container/[[PYTHON_FILE]]', 'python:latest')" 27 | ) 28 | conn.commit() 29 | cursor.execute( 30 | "INSERT INTO image_variables (name, variable, image_id) VALUES ('Python file', 'PYTHON_FILE', '1')" 31 | ) 32 | conn.commit() 33 | cursor.execute( 34 | "INSERT INTO image_variables (name, variable, image_id) VALUES ('Python packages', 'PIP_PACKAGES', '1')" 35 | ) 36 | conn.commit() 37 | cursor.execute( 38 | "INSERT INTO images (name, startup, image) VALUES ('Nodejs bot', 'npm install [[NODE_PACKAGES]]; node /home/container/[[NODE_FILE]]', 'node:latest')" 39 | ) 40 | conn.commit() 41 | cursor.execute( 42 | "INSERT INTO image_variables (name, variable, image_id) VALUES ('Node file', 'NODE_FILE', '2')" 43 | ) 44 | conn.commit() 45 | cursor.execute( 46 | "INSERT INTO image_variables (name, variable, image_id) VALUES ('Node packages', 'NODE_PACKAGES', '2')" 47 | ) 48 | conn.commit() 49 | return flask.redirect("/setup/setup-final") 50 | 51 | @app.get("/setup/finish") 52 | def setup_reboot_server(): 53 | time.sleep(1) 54 | os.execv(sys.executable, ["python"] + sys.argv) 55 | 56 | @app.get("/setup/setup-final") 57 | def setup_final(): 58 | return flask.render_template( 59 | "/setup/setupfinal.html", 60 | title="Installing" 61 | ) 62 | 63 | @app.get("/setup/getting-started") 64 | def setup_getting_started(): 65 | return flask.render_template( 66 | "/setup/welcome.html", 67 | title="Getting Started" 68 | ) 69 | 70 | @app.get("/setup/setup-account") 71 | def setup_account(): 72 | return flask.render_template( 73 | "/setup/setupaccount.html", 74 | title="Setup Account" 75 | ) 76 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "main" ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ "main" ] 20 | schedule: 21 | - cron: '36 23 * * 1' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'python' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v3 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | 52 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 53 | # queries: security-extended,security-and-quality 54 | 55 | 56 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 57 | # If this step fails, then you should remove it and run the build manually (see below) 58 | - name: Autobuild 59 | uses: github/codeql-action/autobuild@v2 60 | 61 | # ℹ️ Command-line programs to run using the OS shell. 62 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 63 | 64 | # If the Autobuild fails above, remove it and uncomment the following three lines. 65 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 66 | 67 | # - run: | 68 | # echo "Run, Build Application using script" 69 | # ./location_of_script_within_repo/buildscript.sh 70 | 71 | - name: Perform CodeQL Analysis 72 | uses: github/codeql-action/analyze@v2 73 | -------------------------------------------------------------------------------- /themes/default/admin/images/createimage.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

Create image

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 | Create Image 48 |
49 |
50 |
51 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/nodes/viewnode.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

Deploy token

22 |
23 |
24 |
25 |
26 | $cd /etc/deamon && python3 app.py --token {{ query("SELECT * FROM nodes WHERE id = ?", nodeid)[0][5] }} 27 |
28 |
29 |
30 |
31 | Copy Command 32 | 54 |
55 |
56 |
57 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/users/users.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 |

Users

21 | Create Node 22 |
23 |
24 |
25 | 26 | 27 | 28 | 31 | 34 | 37 | 40 | 41 | 42 | 43 | {% if query("SELECT * FROM users ORDER BY id ASC") %} 44 | {% for user in query("SELECT * FROM users ORDER BY id ASC") %} 45 | 46 | 49 | 52 | 55 | 58 | 59 | {% endfor %} 60 | {% endif %} 61 | 62 |
29 | Username 30 | 32 | Email 33 | 35 | User Type 36 | 38 | Settings 39 |
47 | {{ user[1] }} 48 | 50 | {{ user[2] }} 51 | 53 | {{ user[5] }} 54 | 56 | Manage user 57 |
63 |
64 |
65 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/images/images.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 |

Server Images

21 | Create Node 22 |
23 |
24 |
25 | 26 | 27 | 28 | 31 | 34 | 37 | 40 | 41 | 42 | 43 | {% if query("SELECT * FROM images ORDER BY id ASC") %} 44 | {% for image in query("SELECT * FROM images ORDER BY id ASC") %} 45 | 46 | 49 | 52 | 55 | 58 | 59 | {% endfor %} 60 | {% endif %} 61 | 62 |
29 | Name 30 | 32 | Docker Image 33 | 35 | Startup Command 36 | 38 | Settings 39 |
47 | {{ image[1] }} 48 | 50 | {{ image[3] }} 51 | 53 | {{ image[2] }} 54 | 56 | Manage image 57 |
63 |
64 |
65 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/users/createuser.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

Create user

22 |
23 |
24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 36 |
37 |
38 | 39 | 40 |
41 |
42 | 43 | 47 |
48 |
49 | 50 |
51 |
52 |
53 |
54 | Create User 55 |
56 |
57 |
58 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/nodes/createnode.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

Create node

22 |
23 |
24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 36 |
37 |
38 | 39 |
40 | 41 |
MB
42 |
43 |
44 |
45 | 46 |
47 | 48 |
MB
49 |
50 |
51 |
52 | 53 |
54 |
55 |
56 |
57 | Create Node 58 |
59 |
60 |
61 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/dashboard/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 | 61 |
62 | {% block content %} 63 | {% endblock %} 64 |
65 | 66 | -------------------------------------------------------------------------------- /themes/default/auth/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |

Login in to your account

13 |
14 |
15 |
16 | 47 |
48 |
49 | 50 | 51 |
52 |
53 | 54 | 55 |
56 |
57 |
58 |
59 |
60 | Register 61 | Login 62 |
63 |
64 | 65 | -------------------------------------------------------------------------------- /themes/default/admin/users/viewuser.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

View user

22 |
23 |
24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 36 |
37 |
38 | 39 | 40 |
41 |
42 | 43 | 52 |
53 |
54 | 55 |
56 |
57 |
58 |
59 | Update User 60 |
61 |
62 |
63 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/servers/servers.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 |

Servers

21 | Create Node 22 |
23 |
24 |
25 | 26 | 27 | 28 | 31 | 34 | 37 | 40 | 43 | 46 | 47 | 48 | 49 | {% if query("SELECT * FROM servers ORDER BY id ASC") %} 50 | {% for server in query("SELECT * FROM servers ORDER BY id ASC") %} 51 | 52 | 55 | 58 | 61 | 64 | 67 | 70 | 71 | {% endfor %} 72 | {% endif %} 73 | 74 |
29 | Name 30 | 32 | Memory 33 | 35 | Storage 36 | 38 | Owner 39 | 41 | Connection 42 | 44 | Settings 45 |
53 | {{ server[1] }} 54 | 56 | {{ server[2] }}MB 57 | 59 | {{ server[3] }}MB 60 | 62 | {{ query("SELECT * FROM users WHERE id = ?", server[7])[0][2] }} 63 | 65 | {{ server[4] }} 66 | 68 | Manage server 69 |
75 |
76 |
77 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/auth/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |

Register a account

15 |
16 |
17 |
18 | 50 |
51 |
52 | 53 | 54 |
55 |
56 | 57 | 58 |
59 |
60 | 61 | 62 |
63 |
64 |
65 |
66 |
67 | Register 68 |
69 |
70 | 71 | -------------------------------------------------------------------------------- /themes/default/admin/nodes/nodes.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 |

Nodes

21 | Create Node 22 |
23 |
24 |
25 | 26 | 27 | 28 | 31 | 34 | 37 | 40 | 43 | 46 | 47 | 48 | 49 | {% if query("SELECT * FROM nodes ORDER BY id ASC") %} 50 | {% for node in query("SELECT * FROM nodes ORDER BY id ASC") %} 51 | 52 | 55 | 65 | 68 | 71 | 74 | 77 | 80 | 81 | {% endfor %} 82 | {% endif %} 83 | 84 |
29 | Status 30 | 32 | Name 33 | 35 | Memory 36 | 38 | Storage 39 | 41 | Connection 42 | 44 | Settings 45 |
53 | 54 | 66 | {{ node[1] }} 67 | 69 | {{ node[2] }}MB 70 | 72 | {{ node[3] }}MB 73 | 75 | {{ node[4] }} 76 | 78 | Manage node 79 |
85 |
86 |
87 | {% endblock %} -------------------------------------------------------------------------------- /routers/server.py: -------------------------------------------------------------------------------- 1 | 2 | import flask, requests, json 3 | 4 | from __main__ import app, query 5 | 6 | @app.get("/dashboard/server/") 7 | def server(serverid): 8 | if flask.session: 9 | if len(query("SELECT * FROM servers WHERE owner_id = ? and id = ?", flask.session["id"], serverid)): 10 | data = query("SELECT * FROM servers WHERE id = ?", serverid)[0] 11 | imageid = data[6] 12 | startup = data[10] 13 | if len(query("SELECT * FROM server_variables WHERE server_id = ?", serverid)): 14 | variables = [] 15 | for variable in query("SELECT * FROM image_variables WHERE image_id = ?", imageid): 16 | variables.append(variable[2]) 17 | if any(x in startup for x in variables): 18 | for variable in variables: 19 | variableid = query("SELECT * FROM image_variables WHERE image_id = ? and variable = ?", imageid, variable)[0][0] 20 | if len(query("SELECT * FROM server_variables WHERE server_id = ? and image_id = ? and variable_id = ?", serverid, imageid, variableid)): 21 | startup = startup.replace("[[{}]]".format(variable), query("SELECT * FROM server_variables WHERE server_id = ? and image_id = ? and variable_id = ?", serverid, imageid, variableid)[0][1]) 22 | else: 23 | startup = startup.replace("[[{}]]".format(variable), "") 24 | return flask.render_template("/server/server.html", title="Console", query=query, serverid=serverid, startup=startup) 25 | else: 26 | flask.abort(401) 27 | else: 28 | return flask.redirect("/login") 29 | 30 | @app.get("/dashboard/server//files") 31 | @app.get("/dashboard/server//files/") 32 | def server_files(serverid, **dir): 33 | if flask.session: 34 | if len(query("SELECT * FROM servers WHERE owner_id = ? and id = ?", flask.session["id"], serverid)): 35 | if dir: 36 | subpath = dir["dir"] 37 | path = "/home/container/{}".format(dir["dir"]) 38 | else: 39 | subpath = "/" 40 | path = "/home/container" 41 | return flask.render_template("/server/files.html", title="File Manager", query=query, serverid=serverid, json=json, path=path, subpath=subpath) 42 | else: 43 | flask.abort(401) 44 | else: 45 | return flask.redirect("/login") 46 | 47 | @app.get("/dashboard/server//configuration") 48 | def server_configuration(serverid): 49 | if flask.session: 50 | if len(query("SELECT * FROM servers WHERE owner_id = ? and id = ?", flask.session["id"], serverid)): 51 | data = query("SELECT * FROM servers WHERE id = ?", serverid)[0] 52 | imageid = data[6] 53 | startup = data[10] 54 | if len(query("SELECT * FROM server_variables WHERE server_id = ?", serverid)): 55 | variables = [] 56 | for variable in query("SELECT * FROM image_variables WHERE image_id = ?", imageid): 57 | variables.append(variable[2]) 58 | if any(x in startup for x in variables): 59 | for variable in variables: 60 | variableid = query("SELECT * FROM image_variables WHERE image_id = ? and variable = ?", imageid, variable)[0][0] 61 | if len(query("SELECT * FROM server_variables WHERE server_id = ? and image_id = ? and variable_id = ?", serverid, imageid, variableid)): 62 | startup = startup.replace("[[{}]]".format(variable), query("SELECT * FROM server_variables WHERE server_id = ? and image_id = ? and variable_id = ?", serverid, imageid, variableid)[0][1]) 63 | else: 64 | startup = startup.replace("[[{}]]".format(variable), "") 65 | return flask.render_template("/server/configuration.html", title="Configuration", query=query, serverid=serverid, startup=startup) 66 | else: 67 | flask.abort(401) 68 | else: 69 | return flask.redirect("/login") 70 | 71 | @app.get("/dashboard/server//files/edit/") 72 | def edit_file(serverid, **dir): 73 | if flask.session: 74 | if len(query("SELECT * FROM servers WHERE owner_id = ? and id = ?", flask.session["id"], serverid)): 75 | payload = { 76 | "user_token": flask.session["token"], 77 | "file": dir["dir"] 78 | } 79 | file = requests.get("https://{}:8080/api/servers/{}/files/edit".format(query("SELECT * FROM nodes WHERE id = ?", query("SELECT * FROM servers WHERE id = ?", serverid)[0][5])[0][4], query("SELECT * FROM servers WHERE id = ?", serverid)[0][9]), data=payload).text 80 | return flask.render_template("/server/editfile.html", title="Edit File", query=query, content=file, serverid=serverid, path=dir["dir"]) 81 | else: 82 | flask.abort(401) 83 | else: 84 | return flask.redirect("/login") -------------------------------------------------------------------------------- /themes/default/admin/servers/createserver.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

Create server

22 |
23 |
24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 36 |
37 |
38 | 39 | 44 |
45 |
46 | 47 | 52 |
53 |
54 |
55 |
56 | 57 | 58 |
59 |
60 | 61 | 62 |
63 |
64 | 65 |
66 | 67 |
MB
68 |
69 |
70 |
71 | 72 |
73 | 74 |
MB
75 |
76 |
77 |
78 | 79 |
80 |
81 |
82 |
83 | Create Server 84 |
85 |
86 |
87 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/dashboard/account.html: -------------------------------------------------------------------------------- 1 | {% extends "/dashboard/layout.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |

Update password

8 |
9 |
10 |
11 |
12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 21 |
22 | 23 |
24 |
25 |
26 |
27 |
28 | {% if get_flashed_messages() %} 29 |
30 | {% if get_flashed_messages(with_categories=true)[0][0] == "error" %} 31 |

{{ get_flashed_messages(with_categories=true)[0][1] }}

32 | {% endif %} 33 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 34 |

{{ get_flashed_messages(with_categories=true)[0][1] }}

35 | {% endif %} 36 | Update Password 37 |
38 | {% else %} 39 |
40 | Update Password 41 |
42 | {% endif %} 43 |
44 |
45 |
46 |
47 |

Update username

48 |
49 |
50 |
51 |
52 | 53 |
54 |
55 | 56 | 57 |
58 |
59 | 60 | 61 |
62 | 63 |
64 |
65 |
66 |
67 |
68 | {% if get_flashed_messages() %} 69 |
70 | {% if get_flashed_messages(with_categories=true)[0][0] == "error" %} 71 |

{{ get_flashed_messages(with_categories=true)[0][1] }}

72 | {% endif %} 73 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 74 |

{{ get_flashed_messages(with_categories=true)[0][1] }}

75 | {% endif %} 76 | Update Username 77 |
78 | {% else %} 79 |
80 | Update Username 81 |
82 | {% endif %} 83 |
84 |
85 |
86 | {% endblock %} -------------------------------------------------------------------------------- /static/img/undraw_set_preferences_kwia.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /themes/default/admin/settings.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |

Panel settings

8 |
9 |
10 |
11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 |
23 |
24 | Update Settings 25 |
26 |
27 |
28 |
29 |
30 |
31 |

Panel controls

32 |
33 |
34 | Restart Server 35 | 59 | Factory Reset 60 | 85 |
86 |
87 |
88 |
89 | {% endblock %} 90 | -------------------------------------------------------------------------------- /themes/default/admin/images/viewimage.html: -------------------------------------------------------------------------------- 1 | {% extends "/admin/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 7 |
8 | {{ get_flashed_messages(with_categories=true)[0][1] }} 9 |
10 | {% else %} 11 |
12 | {{ get_flashed_messages(with_categories=true)[0][1] }} 13 |
14 | {% endif %} 15 | {% endif %} 16 |
17 |
18 |
19 |
20 | 21 |

View image

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 | Add Variable 56 | Update Image 57 |
58 |
59 |
60 |
61 | {% if query("SELECT * FROM image_variables WHERE image_id = ? ORDER BY id ASC", imageid) %} 62 | {% for variable in query("SELECT * FROM image_variables WHERE image_id = ? ORDER BY id ASC", imageid) %} 63 |
64 |
65 |
66 | 67 |

{{ variable[1] }}

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 | 97 |
98 |
99 | {% endfor %} 100 | {% endif %} 101 |
102 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/admin/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 44 | {% if query("SELECT * FROM users WHERE id = ?", session["id"])[0][5] == "administrator" %} 45 |
46 | 130 |
131 |
132 |
133 | {% block content %} 134 | {% endblock %} 135 |
136 |
137 | {% endif %} 138 | 139 | -------------------------------------------------------------------------------- /themes/default/server/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ title }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 59 |
60 |
61 | {% if title == "Console" %} 62 | 63 |
64 | 65 |
66 |
67 | {% else %} 68 | 69 |
70 | 71 |
72 |
73 | {% endif %} 74 | {% if title == "File Manager" or title == "Edit File" %} 75 | 76 |
77 | 78 |
79 |
80 | {% else %} 81 | 82 |
83 | 84 |
85 |
86 | {% endif %} 87 | {% if title == "Configuration" %} 88 | 89 |
90 | 91 |
92 |
93 | {% else %} 94 | 95 |
96 | 97 |
98 |
99 | {% endif %} 100 | {% if title == "Edit File" %} 101 | 129 | 130 |
131 | 132 |
133 |
134 | {% endif %} 135 |
136 |
137 |
138 |
139 |
140 | 141 |
142 |
143 | 154 | {% block content %} 155 | {% endblock %} 156 |
157 |
158 | 159 | -------------------------------------------------------------------------------- /themes/default/server/configuration.html: -------------------------------------------------------------------------------- 1 | {% extends "/server/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | {% if get_flashed_messages(with_categories=true) %} 6 |
7 | {% if get_flashed_messages(with_categories=true)[0][0] == "succes" %} 8 |
9 | {{ get_flashed_messages(with_categories=true)[0][1] }} 10 |
11 | {% else %} 12 |
13 | {{ get_flashed_messages(with_categories=true)[0][1] }} 14 |
15 | {% endif %} 16 |
17 | {% endif %} 18 |
19 |
20 |
21 |

Reinstall server

22 |
23 |
24 |
25 | 26 | 27 |
28 | 37 |
38 | 39 |
40 |
41 |
42 | Reinstall Server 43 | 63 |
64 |
65 |
66 |
67 |

Server name

68 |
69 |
70 | 115 | 116 |
117 |
118 | Update Name 119 |
120 |
121 |
122 |
123 |
124 |
125 |

Startup command

126 |
127 |
128 |

129 | {{ startup }} 130 |

131 |
132 |
133 |
134 |
135 |
136 |
137 | {% for variable in query("SELECT * FROM image_variables WHERE image_id = ?", query("SELECT * FROM servers WHERE id = ?", serverid)[0][6]) %} 138 |
139 |
140 |
141 |

{{ variable[1] }}

142 |
143 |
144 | {% set imageid = query("SELECT * FROM servers WHERE id = ?", serverid)[0][6] %} 145 | {% set variableid = variable[0] %} 146 |
147 | {% if query('SELECT * FROM server_variables WHERE server_id = ? and image_id = ? and variable_id = ?', serverid, imageid, variableid) | length > 0 %} 148 | 149 | {% else %} 150 | 151 | {% endif %} 152 |
153 |
154 |
155 | Update Variable 156 |
157 |
158 |
159 | {% endfor %} 160 |
161 |
162 | {% endblock %} -------------------------------------------------------------------------------- /static/img/undraw_preferences_re_49in.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /themes/default/server/files.html: -------------------------------------------------------------------------------- 1 | i{% extends "/server/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | 11 |
12 |
13 |
14 |

{{ path }}

15 | 35 |
36 | 37 | 38 | 39 | 40 |
41 |
42 | Create Directory 43 | 69 | Create File 70 | 96 | Upload File 97 |
98 |
99 |
100 | 176 |
177 |
178 |
179 | {% endblock %} -------------------------------------------------------------------------------- /themes/default/server/server.html: -------------------------------------------------------------------------------- 1 | {% extends "/server/layout.html" %} 2 | 3 | {% block content %} 4 |
5 | 11 |
12 |
13 |
14 | 126 |
127 | 128 | 129 | 130 |
131 |
132 |
133 | 134 |
135 |
136 |

IP Address

137 |

{{ query("SELECT * FROM servers WHERE id = ?", serverid)[0][4] }}

138 |
139 |
140 |
141 |
142 | 143 |
144 |
145 |

Memory Usage

146 |

0.0MB / {{ query("SELECT * FROM servers WHERE id = ?", serverid)[0][2] }}MB

147 |
148 |
149 |
150 |
151 | 152 |
153 |
154 |

Disk Usage

155 |

0.0MB / {{ query("SELECT * FROM servers WHERE id = ?", serverid)[0][3] }}MB

156 |
157 |
158 |
159 |
160 |
161 |
162 | 202 |
203 |
204 | 205 | 206 | 218 |
219 |
220 |
221 |
222 |
223 | {% endblock %} -------------------------------------------------------------------------------- /routers/api.py: -------------------------------------------------------------------------------- 1 | import flask, hashlib, sys, time, requests, os 2 | 3 | from __main__ import app, query 4 | 5 | @app.post("/api/password//update") 6 | def api_update_password(userid): 7 | if flask.session: 8 | if flask.request.form.get("csrf_token") == flask.session["csrf_token"]: 9 | data = query( 10 | "SELECT * FROM users WHERE password = ? and id = ?", 11 | hashlib.sha256( 12 | flask.request.form.get("password").encode("utf-8") 13 | ).hexdigest(), 14 | userid 15 | ) 16 | if len(data): 17 | query( 18 | "UPDATE users SET password = ? WHERE password = ? and id = ?", 19 | hashlib.sha256( 20 | flask.request.form.get("new_password").encode("utf-8") 21 | ).hexdigest(), 22 | hashlib.sha256( 23 | flask.request.form.get("password").encode("utf-8") 24 | ).hexdigest(), 25 | userid 26 | ) 27 | flask.flash("Password updated succesfully", "succes") 28 | return flask.redirect("/dashboard/account") 29 | else: 30 | flask.flash("Password invalid", "error") 31 | return flask.redirect("/dashboard/account") 32 | else: 33 | flask.flash("Something went wrong", "error") 34 | return flask.redirect("/dashboard/account") 35 | else: 36 | flask.abort(401) 37 | 38 | @app.post("/api/username//update") 39 | def api_update_username(userid): 40 | if flask.session: 41 | if flask.request.form.get("csrf_token") == flask.session["csrf_token"]: 42 | data = query( 43 | "SELECT * FROM users WHERE password = ? and id = ?", 44 | hashlib.sha256( 45 | flask.request.form.get("password").encode("utf-8") 46 | ).hexdigest(), 47 | userid 48 | ) 49 | if len(data): 50 | query( 51 | "UPDATE users SET name = ? WHERE password = ? and id = ?", 52 | flask.request.form.get("username"), 53 | hashlib.sha256( 54 | flask.request.form.get("password").encode("utf-8") 55 | ).hexdigest(), 56 | userid 57 | ) 58 | flask.session["username"] = flask.request.form.get("username") 59 | flask.flash("Username updated succesfully", "succes") 60 | return flask.redirect("/dashboard/account") 61 | else: 62 | flask.flash("Password invalid", "error") 63 | return flask.redirect("/dashboard/account") 64 | else: 65 | flask.flash("Something went wrong", "error") 66 | return flask.redirect("/dashboard/account") 67 | else: 68 | flask.abort(401) 69 | 70 | @app.post("/api/admin/settings/update") 71 | def api_update_settings(): 72 | if flask.session: 73 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 74 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 75 | if len(data): 76 | if data[0][5] == "administrator": 77 | query("UPDATE settings SET panel_name = ?", flask.request.form.get("panel_name"),) 78 | query("UPDATE settings SET panel_logo = ?", flask.request.form["panel_logo"],) 79 | flask.flash("Updated succesfully", "succes") 80 | return flask.redirect("/admin") 81 | else: 82 | flask.abort(401) 83 | else: 84 | flask.flash("Something went wrong", "error") 85 | return flask.redirect("/admin") 86 | else: 87 | flask.abort(401) 88 | else: 89 | return flask.redirect("/login") 90 | 91 | @app.post("/api/admin/reboot") 92 | def api_reboot_server(): 93 | if flask.session: 94 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 95 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 96 | if len(data): 97 | if data[0][5] == "administrator": 98 | if data[0][0] == 1: 99 | time.sleep(3) 100 | os.execv(sys.executable, ["python"] + sys.argv) 101 | else: 102 | flask.flash("Only the master user can restart the panel", "error") 103 | return flask.redirect("/admin") 104 | else: 105 | flask.flash("Something went wrong", "error") 106 | return flask.redirect("/admin") 107 | else: 108 | flask.abort(401) 109 | else: 110 | flask.abort(401) 111 | else: 112 | return flask.redirect("/login") 113 | 114 | @app.post("/api/admin/reset") 115 | def api_factory_reset(): 116 | if flask.session: 117 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 118 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 119 | if len(data): 120 | if data[0][5] == "administrator": 121 | if data[0][0] == 1: 122 | os.remove("database.db") 123 | os.execv(sys.executable, ["python"] + sys.argv) 124 | else: 125 | flask.flash("Only the master user can reset the panel", "error") 126 | return flask.redirect("/admin") 127 | else: 128 | flask.flash("Something went wrong", "error") 129 | return flask.redirect("/admin") 130 | else: 131 | flask.abort(401) 132 | else: 133 | flask.abort(401) 134 | else: 135 | return flask.redirect("/login") 136 | 137 | @app.post("/api/admin/nodes/create") 138 | def api_create_node(): 139 | if flask.session: 140 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 141 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 142 | if len(data): 143 | if data[0][5] == "administrator": 144 | query( 145 | "INSERT INTO nodes (name, memory, disk, ip, token) VALUES (?, ?, ?, ?, ?)", 146 | flask.request.form.get("name"), 147 | flask.request.form.get("memory"), 148 | flask.request.form.get("disk"), 149 | flask.request.form.get("ip"), 150 | os.urandom(38).hex() 151 | ) 152 | flask.flash("Node created succesfully", "succes") 153 | return flask.redirect("/admin/nodes") 154 | else: 155 | flask.flash("Something went wrong", "error") 156 | return flask.redirect("/admin/nodes") 157 | else: 158 | flask.flash("Something went wrong", "error") 159 | return flask.redirect("/admin/nodes") 160 | else: 161 | flask.abort(401) 162 | else: 163 | return flask.redirect("/login") 164 | 165 | @app.post("/api/admin/users/create") 166 | def api_create_user(): 167 | if flask.session: 168 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 169 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 170 | if len(data): 171 | if data[0][5] == "administrator": 172 | if len(query("SELECT * FROM users WHERE name = ? or email = ?", flask.request.form.get("username"), flask.request.form.get("email"))): 173 | flask.flash("User already exists", "error") 174 | return flask.redirect("/admin/users") 175 | else: 176 | query( 177 | "INSERT INTO users (name, email, password, token, user_type) VALUES (?, ?, ?, ?, ?)", 178 | flask.request.form.get("username"), 179 | flask.request.form.get("email"), 180 | hashlib.sha256( 181 | flask.request.form.get("password").encode("utf-8") 182 | ).hexdigest(), 183 | os.urandom(250).hex(), 184 | flask.request.form.get("user_type") 185 | ) 186 | flask.flash("User created succesfully", "succes") 187 | return flask.redirect("/admin/users") 188 | else: 189 | flask.abort(401) 190 | else: 191 | flask.flash("Something went wrong", "error") 192 | return flask.redirect("/admin/users") 193 | else: 194 | flask.abort(401) 195 | else: 196 | return flask.redirect("/login") 197 | 198 | @app.post("/api/admin/users//update") 199 | def api_update_user(userid): 200 | if flask.session: 201 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 202 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form["token"]) 203 | if len(data): 204 | if data[0][5] == "administrator": 205 | if len(query("SELECT * FROM users WHERE id = ?", userid)): 206 | if int(userid) == 1: 207 | flask.flash("Cannot update master user", "error") 208 | return flask.redirect("/admin/users") 209 | else: 210 | if flask.request.form.get("password"): 211 | query( 212 | "UPDATE users SET name = ?, email = ?, password = ?, user_type = ? WHERE id = ?", 213 | flask.request.form.get("username"), 214 | flask.request.form.get("email"), 215 | flask.request.form.get("password"), 216 | flask.request.form.get("user_type"), 217 | userid 218 | ) 219 | else: 220 | query( 221 | "UPDATE users SET name = ?, email = ?, user_type = ? WHERE id = ?", 222 | flask.request.form.get("username"), 223 | flask.request.form.get("email"), 224 | flask.request.form.get("user_type"), 225 | userid 226 | ) 227 | flask.flash("User updated succesfully", "succes") 228 | return flask.redirect("/admin/users") 229 | else: 230 | flask.abort(404) 231 | else: 232 | flask.flash("Something went wrong", "error") 233 | return flask.redirect("/admin/users") 234 | else: 235 | flask.flash("Something went wrong", "error") 236 | return flask.redirect("/admin/users") 237 | else: 238 | flask.abort(403) 239 | else: 240 | return flask.redirect("/login") 241 | 242 | @app.post("/api/admin/images/create") 243 | def api_create_image(): 244 | if flask.session: 245 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 246 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 247 | if len(data): 248 | if data[0][5] == "administrator": 249 | query( 250 | "INSERT INTO images (name, startup, image) VALUES (?, ?, ?)", 251 | flask.request.form.get("image_name"), 252 | flask.request.form.get("startup_command"), 253 | flask.request.form.get("docker_image") 254 | ) 255 | flask.flash("Image created succesfully", "succes") 256 | return flask.redirect("/admin/images") 257 | else: 258 | flask.flash("Something went wrong", "error") 259 | return flask.redirect("/admin/images") 260 | else: 261 | flask.flash("Something went wrong", "error") 262 | return flask.redirect("/admin/images") 263 | else: 264 | flask.abort(401) 265 | else: 266 | return flask.redirect("/login") 267 | 268 | @app.post("/api/admin/servers/create") 269 | def api_create_server(): 270 | if flask.session: 271 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 272 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 273 | if len(data): 274 | if data[0][5] == "administrator": 275 | if len(query("SELECT * FROM servers WHERE ip_port = ?", "{}:{}".format(query("SELECT * FROM nodes WHERE id = ?", flask.request.form.get("server_node"))[0][4], flask.request.form.get("server_port")))): 276 | flask.flash("This port is already used", "error") 277 | return flask.redirect("/admin/servers") 278 | try: 279 | server_uuid = os.urandom(13).hex() 280 | payload = { 281 | "system_token": query("SELECT * FROM nodes WHERE id = ?", flask.request.form.get("server_node"))[0][5], 282 | "user_token": flask.request.form.get("token"), 283 | "port": flask.request.form.get("server_port"), 284 | "memory": flask.request.form.get("server_memory") 285 | } 286 | if requests.post("https://{}:8080/api/servers/{}/create".format(query("SELECT * FROM nodes WHERE id = ?", flask.request.form.get("server_node"))[0][4], server_uuid), data=payload).text == "server created": 287 | query ( 288 | "INSERT INTO servers (name, memory, disk, ip_port, node_id, image_id, owner_id, suspended, uuid, image, startup) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 289 | flask.request.form.get("server_name"), 290 | flask.request.form.get("server_memory"), 291 | flask.request.form.get("server_storage"), 292 | "{}:{}".format(query("SELECT * FROM nodes WHERE id = ?", flask.request.form.get("server_node"))[0][4], flask.request.form.get("server_port")), 293 | flask.request.form.get("server_node"), 294 | flask.request.form.get("server_image"), 295 | flask.request.form.get("server_owner"), 296 | 0, 297 | server_uuid, 298 | query("SELECT * FROM images WHERE id = ?", flask.request.form.get("server_image"))[0][3], 299 | query("SELECT * FROM images WHERE id = ?", flask.request.form.get("server_image"))[0][2] 300 | ) 301 | flask.flash("Server created succesfully", "succes") 302 | return flask.redirect("/admin/servers") 303 | else: 304 | flask.flash("Something went wrong", "error") 305 | return flask.redirect("/admin/servers") 306 | except: 307 | flask.flash("The node is currently offline", "error") 308 | return flask.redirect("/admin/servers") 309 | else: 310 | flask.flash("Something went wrong", "error") 311 | return flask.redirect("/admin/servers") 312 | else: 313 | flask.flash("Something went wrong", "error") 314 | return flask.redirect("/admin/servers") 315 | else: 316 | flask.abort(403) 317 | else: 318 | return flask.redirect("/login") 319 | 320 | @app.post("/api/admin/images//update") 321 | def api_update_image(imageid): 322 | if flask.session: 323 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 324 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 325 | if len(data): 326 | if data[0][5] == "administrator": 327 | query( 328 | "UPDATE images SET name = ?, startup = ?, image = ? WHERE id = ?", 329 | flask.request.form.get("image_name"), 330 | flask.request.form.get("startup_command"), 331 | flask.request.form.get("docker_image"), 332 | imageid 333 | ) 334 | flask.flash("Image updated succesfully", "succes") 335 | return flask.redirect("/admin/images/{}/view".format(imageid)) 336 | else: 337 | flask.abort(401) 338 | else: 339 | flask.flash("Something went wrong", "error") 340 | return flask.redirect("/admin/images/{}/view".format(imageid)) 341 | else: 342 | flask.abort(401) 343 | else: 344 | return flask.redirect("/login") 345 | 346 | @app.post("/api/admin/images//variables/create") 347 | def api_create_variable(imageid): 348 | if flask.session: 349 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 350 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 351 | if len(data): 352 | if data[0][5] == "administrator": 353 | query( 354 | "INSERT INTO image_variables (name, variable, image_id) VALUES (?, ?, ?)", 355 | flask.request.form.get("variable_name"), 356 | flask.request.form.get("variable"), 357 | imageid 358 | ) 359 | flask.flash("Variable created succesfully", "succes") 360 | return flask.redirect("/admin/images/{}/view".format(imageid)) 361 | else: 362 | flask.flash("Something went wrong", "error") 363 | return flask.redirect("/admin/images/{}/view".format(imageid)) 364 | else: 365 | flask.flash("Something went wrong", "error") 366 | return flask.redirect("/admin/images/{}/view".format(imageid)) 367 | else: 368 | flask.abort(403) 369 | else: 370 | return flask.redirect("/login") 371 | 372 | @app.post("/api/admin/images//variables//update") 373 | def api_update_variable(imageid, variableid): 374 | if flask.session: 375 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 376 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 377 | if len(data): 378 | if data[0][5] == "administrator": 379 | query( 380 | "UPDATE image_variables SET name = ?, variable = ? WHERE id = ?", 381 | flask.request.form.get("variable_name"), 382 | flask.request.form.get("variable"), 383 | variableid 384 | ) 385 | flask.flash("Variable updated succesfully", "succes") 386 | return flask.redirect("/admin/images/{}/view".format(imageid)) 387 | else: 388 | flask.abort(401) 389 | else: 390 | flask.flash("Something went wrong", "error") 391 | return flask.redirect("/admin/images/{}/view".format(imageid)) 392 | else: 393 | flask.abort(401) 394 | else: 395 | return flask.redirect("/login") 396 | 397 | @app.post("/api/admin/images//variables//delete") 398 | def api_delete_variable(imageid, variableid): 399 | if flask.session: 400 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 401 | data = query("SELECT * FROM users WHERE token = ?", flask.request.form.get("token")) 402 | if len(data): 403 | if data[0][5] == "administrator": 404 | query("DELETE FROM image_variables WHERE id = ? and image_id = ?", variableid, imageid) 405 | flask.flash("Variable deleted succesfully", "succes") 406 | return flask.redirect("/admin/images/{}/view".format(imageid)) 407 | else: 408 | flask.flash("Something went wrong", "error") 409 | return flask.redirect("/admin/images/{}/view".format(imageid)) 410 | else: 411 | flask.abort(401) 412 | else: 413 | flask.abort(401) 414 | else: 415 | return flask.redirect("/login") 416 | 417 | @app.post("/api/servers//variables/update") 418 | def api_update_server_variable(serverid): 419 | if flask.session: 420 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 421 | data = query("SELECT * FROM servers WHERE id = ? and owner_id = ?", serverid, flask.session["id"]) 422 | if len(data): 423 | if len(query("SELECT * FROM server_variables WHERE server_id = ? and image_id = ? and variable_id = ?", serverid, flask.request.form.get("image_id"), flask.request.form.get("variable_id"))): 424 | query("UPDATE server_variables SET data = ? WHERE server_id = ? and image_id = ? and variable_id = ?", flask.request.form.get("variable_data"), serverid, flask.request.form.get("image_id"), flask.request.form.get("variable_id")) 425 | return flask.redirect("/dashboard/server/{}/configuration".format(serverid)) 426 | else: 427 | query("INSERT INTO server_variables (data, image_id, server_id, variable_id) VALUES (?, ?, ?, ?)", flask.request.form.get("variable_data"), flask.request.form.get("image_id"), serverid, flask.request.form.get("variable_id")) 428 | return flask.redirect("/dashboard/server/{}/configuration".format(serverid)) 429 | else: 430 | flask.abort(404) 431 | else: 432 | flask.abort(401) 433 | else: 434 | return flask.redirect("/login") 435 | 436 | @app.post("/api/servers//reinstall") 437 | def api_reinstall_server(serverid): 438 | if flask.session: 439 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 440 | data = query("SELECT * FROM servers WHERE id = ? and owner_id = ?", serverid, flask.session["id"]) 441 | if len(data): 442 | startup_command = query("SELECT * FROM images WHERE id = ?", flask.request.form.get("server_image"))[0][2] 443 | docker_image = query("SELECT * FROM images WHERE id = ?", flask.request.form.get("server_image"))[0][3] 444 | imageid = query("SELECT * FROM servers WHERE id = ?", serverid)[0][6] 445 | query("DELETE FROM server_variables WHERE image_id = ? and server_id = ?", imageid, serverid) 446 | query("UPDATE servers SET image_id = ?, startup = ?, image = ? WHERE id = ?", flask.request.form.get("server_image"), startup_command, docker_image, serverid) 447 | flask.flash("Server reinstall completed succesfully", "succes") 448 | return flask.redirect("/dashboard/server/{}/configuration".format(serverid)) 449 | else: 450 | flask.abort(404) 451 | else: 452 | flask.abort(401) 453 | else: 454 | return flask.redirect("/login") 455 | 456 | @app.post("/api/servers//rename") 457 | def api_rename_server(serverid): 458 | if flask.session: 459 | if flask.session["csrf_token"] == flask.request.form.get("csrf_token"): 460 | data = query("SELECT * FROM servers WHERE id = ? and owner_id = ?", serverid, flask.session["id"]) 461 | if len(data): 462 | query("UPDATE servers SET name = ? WHERE id = ?", flask.request.form.get("server_name"), serverid) 463 | flask.flash("Server name changed succesfully", "succes") 464 | return flask.redirect("/dashboard/server/{}/configuration".format(serverid)) 465 | else: 466 | flask.abort(404) 467 | else: 468 | flask.abort(401) 469 | else: 470 | return flask.redirect("/login") 471 | --------------------------------------------------------------------------------