/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 |
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 |
16 |
17 |
18 |
19 |
20 |
21 |
Xeon panel is now installed on your system.
22 |
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 |
6 | {% for server in servers %}
7 |
30 | {% endfor %}
31 |
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 |
16 |
17 |
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 |
45 |
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 |
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 |
24 |
25 |
26 |
27 |
28 |
29 | Username
30 |
31 |
32 | Email
33 |
34 |
35 | User Type
36 |
37 |
38 | Settings
39 |
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 |
47 | {{ user[1] }}
48 |
49 |
50 | {{ user[2] }}
51 |
52 |
53 | {{ user[5] }}
54 |
55 |
56 | Manage user
57 |
58 |
59 | {% endfor %}
60 | {% endif %}
61 |
62 |
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 |
24 |
25 |
26 |
27 |
28 |
29 | Name
30 |
31 |
32 | Docker Image
33 |
34 |
35 | Startup Command
36 |
37 |
38 | Settings
39 |
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 |
47 | {{ image[1] }}
48 |
49 |
50 | {{ image[3] }}
51 |
52 |
53 | {{ image[2] }}
54 |
55 |
56 | Manage image
57 |
58 |
59 | {% endfor %}
60 | {% endif %}
61 |
62 |
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 |
52 |
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 |
55 |
60 |
61 | {% endblock %}
--------------------------------------------------------------------------------
/themes/default/dashboard/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ title }}
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
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 |
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 |
57 |
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 |
24 |
25 |
26 |
27 |
28 |
29 | Name
30 |
31 |
32 | Memory
33 |
34 |
35 | Storage
36 |
37 |
38 | Owner
39 |
40 |
41 | Connection
42 |
43 |
44 | Settings
45 |
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 |
53 | {{ server[1] }}
54 |
55 |
56 | {{ server[2] }}MB
57 |
58 |
59 | {{ server[3] }}MB
60 |
61 |
62 | {{ query("SELECT * FROM users WHERE id = ?", server[7])[0][2] }}
63 |
64 |
65 | {{ server[4] }}
66 |
67 |
68 | Manage server
69 |
70 |
71 | {% endfor %}
72 | {% endif %}
73 |
74 |
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 |
66 |
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 |
24 |
25 |
26 |
27 |
28 |
29 | Status
30 |
31 |
32 | Name
33 |
34 |
35 | Memory
36 |
37 |
38 | Storage
39 |
40 |
41 | Connection
42 |
43 |
44 | Settings
45 |
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 |
53 |
54 |
55 |
65 |
66 | {{ node[1] }}
67 |
68 |
69 | {{ node[2] }}MB
70 |
71 |
72 | {{ node[3] }}MB
73 |
74 |
75 | {{ node[4] }}
76 |
77 |
78 | Manage node
79 |
80 |
81 | {% endfor %}
82 | {% endif %}
83 |
84 |
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 |
81 |
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 |
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 |
42 | {% endif %}
43 |
44 |
45 |
46 |
47 |
Update username
48 |
49 |
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 |
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 |
22 |
27 |
28 |
29 |
30 |
31 |
Panel controls
32 |
33 |
34 |
Restart Server
35 |
36 |
37 |
38 |
Confirmation
39 |
40 |
41 |
44 |
Are you sure you want to restart this panel?
45 |
46 |
57 |
58 |
59 |
Factory Reset
60 |
61 |
62 |
63 |
Confirmation
64 |
65 |
66 |
69 |
Are you sure you want to reset this panel?
70 |
All data will be lost.
71 |
72 |
83 |
84 |
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 |
53 |
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 |
92 |
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 |
47 |
48 |
63 |
105 |
120 |
128 |
129 |
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 |
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 |
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 |
41 |
42 |
Reinstall Server
43 |
44 |
45 |
46 |
Reinstall server
47 |
48 |
49 |
52 |
Are you sure you want to reinstall this server?
53 |
Some data may be lost
54 |
55 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
Server name
68 |
69 |
70 |
115 |
116 |
117 |
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 |
154 |
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 |
6 |
7 |
8 |
Could not connect to server, node offline
9 |
10 |
11 |
12 |
13 |
14 |
{{ path }}
15 |
35 |
41 |
98 |
99 |
100 |
176 |
177 |
178 |
179 | {% endblock %}
--------------------------------------------------------------------------------
/themes/default/server/server.html:
--------------------------------------------------------------------------------
1 | {% extends "/server/layout.html" %}
2 |
3 | {% block content %}
4 |
5 |
6 |
7 |
8 |
Could not connect to server, node offline
9 |
10 |
11 |
12 |
13 |
14 |
126 |
127 | Start
128 | Restart
129 | Stop
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.0 MB / {{ query("SELECT * FROM servers WHERE id = ?", serverid)[0][2] }}MB
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
Disk Usage
155 |
0.0 MB / {{ query("SELECT * FROM servers WHERE id = ?", serverid)[0][3] }}MB
156 |
157 |
158 |
159 |
160 |
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 |
--------------------------------------------------------------------------------