aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjwansek <eddie.atten.ea29@gmail.com>2021-02-02 12:24:06 +0000
committerjwansek <eddie.atten.ea29@gmail.com>2021-02-02 12:24:06 +0000
commit1dac1ee189bdcf70a5dd933d5f6a69a15d5a8d7e (patch)
tree0bff6312d7e3bcc364d7632da708f74d15cbd0f3
parent6eb416ac7784ce08b6959e3db06ccd404736516f (diff)
downloadeda.gay-1dac1ee189bdcf70a5dd933d5f6a69a15d5a8d7e.tar.gz
eda.gay-1dac1ee189bdcf70a5dd933d5f6a69a15d5a8d7e.zip
added the program files for the first time
-rw-r--r--.gitignore2
-rw-r--r--app.py35
-rw-r--r--database.py33
-rw-r--r--example.conf32
-rw-r--r--requirements.txt5
-rw-r--r--services.py68
-rw-r--r--static/style.css108
-rw-r--r--templates/discord.html5
-rw-r--r--templates/index.html31
-rw-r--r--templates/template.html47
10 files changed, 366 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index b6e4761..777952b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+edaweb.conf
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
diff --git a/app.py b/app.py
new file mode 100644
index 0000000..b52cd0b
--- /dev/null
+++ b/app.py
@@ -0,0 +1,35 @@
+import configparser
+import database
+import flask
+
+app = flask.Flask(__name__)
+CONFIG = configparser.ConfigParser()
+CONFIG.read("edaweb.conf")
+
+def get_template_items(title, db):
+ return {
+ "links": db.get_header_links(),
+ "image": db.get_image("telegrampic"),
+ "title": title,
+ "articles": db.get_header_articles()
+ }
+
+@app.route("/")
+def index():
+ with database.Database() as db:
+ return flask.render_template(
+ "index.html",
+ **get_template_items("edaweb.co.uk", db)
+ )
+
+@app.route("/discord")
+def discord():
+ with database.Database() as db:
+ return flask.render_template(
+ "discord.html",
+ **get_template_items("Discord", db),
+ discord = CONFIG["discord"]["username"]
+ )
+
+if __name__ == "__main__":
+ app.run(host = "0.0.0.0", debug = True)
diff --git a/database.py b/database.py
new file mode 100644
index 0000000..05e8a7e
--- /dev/null
+++ b/database.py
@@ -0,0 +1,33 @@
+import pymysql
+import app
+
+class Database:
+ def __enter__(self):
+ self.__connection = pymysql.connect(
+ **app.CONFIG["mysql"],
+ charset = "utf8mb4"
+ )
+ return self
+
+ def __exit__(self, type, value, traceback):
+ self.__connection.close()
+
+ def get_header_links(self):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("SELECT name, link FROM headerLinks ORDER BY name;")
+ return cursor.fetchall()
+
+ def get_image(self, imageName):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("SELECT alt, url FROM images WHERE imageName = %s;", (imageName, ))
+ return cursor.fetchone()
+
+ def get_header_articles(self):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("SELECT articleName, link FROM headerArticles;")
+ return cursor.fetchall()
+
+
+if __name__ == "__main__":
+ with Database() as db:
+ print(db.get_header_articles()) \ No newline at end of file
diff --git a/example.conf b/example.conf
new file mode 100644
index 0000000..bd16037
--- /dev/null
+++ b/example.conf
@@ -0,0 +1,32 @@
+[mysql]
+host = 192.168.0.40
+; port = 3306 ; ConfigParser will parse this as a string (not int) which will cause pymysql to moan
+user = webro
+passwd = ***********
+db = edaweb
+
+[nitter]
+url = 192.168.0.40
+port = 7777
+
+[docker]
+url = 192.168.0.40
+port = 4550
+
+[pihole]
+url = 192.168.0.25
+
+[qbittorrent]
+url = 192.168.0.25
+port = 8080
+user = admin
+passwd = ***********
+
+[transmission]
+url = 192.168.0.25
+port = 9091
+user = admin
+passwd = ***********
+
+[discord]
+username = @jwnskanzkwk#9757 \ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..0fed313
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,5 @@
+Flask==1.1.2
+PyMySQL==1.0.2
+docker==4.4.1
+python-qbittorrent==0.4.2
+transmission-clutch \ No newline at end of file
diff --git a/services.py b/services.py
new file mode 100644
index 0000000..16268ef
--- /dev/null
+++ b/services.py
@@ -0,0 +1,68 @@
+import qbittorrent
+import docker
+import clutch
+import app
+import json
+
+def humanbytes(B):
+ 'Return the given bytes as a human friendly KB, MB, GB, or TB string'
+ B = float(B)
+ KB = float(1024)
+ MB = float(KB ** 2) # 1,048,576
+ GB = float(KB ** 3) # 1,073,741,824
+ TB = float(KB ** 4) # 1,099,511,627,776
+
+ if B < KB:
+ return '{0} {1}'.format(B,'Bytes' if 0 == B > 1 else 'Byte')
+ elif KB <= B < MB:
+ return '{0:.2f} KB'.format(B/KB)
+ elif MB <= B < GB:
+ return '{0:.2f} MB'.format(B/MB)
+ elif GB <= B < TB:
+ return '{0:.2f} GB'.format(B/GB)
+ elif TB <= B:
+ return '{0:.2f} TB'.format(B/TB)
+
+def get_docker_stats():
+ client = docker.DockerClient(base_url = "tcp://%s:%s" % (app.CONFIG["docker"]["url"], app.CONFIG["docker"]["port"]))
+ return {
+ container.name: container.status
+ for container in client.containers.list(all = True)
+ }
+
+def get_qbit_stats():
+ numtorrents = 0
+ bytes_dl = 0
+ bytes_up = 0
+ qb = qbittorrent.Client('http://%s:%s/' % (app.CONFIG["qbittorrent"]["url"], app.CONFIG["qbittorrent"]["port"]))
+ qb.login(username = app.CONFIG["qbittorrent"]["user"], password = app.CONFIG["qbittorrent"]["passwd"])
+
+ for torrent in qb.torrents():
+ numtorrents += 1
+ bytes_up += torrent["uploaded"]
+ bytes_dl += torrent["downloaded"]
+
+ return {
+ "bytes_dl": humanbytes(bytes_dl),
+ "bytes_up": humanbytes(bytes_up),
+ "num": numtorrents,
+ "ratio": bytes_up / bytes_dl
+ }
+
+def get_trans_stats():
+ client = clutch.client.Client(
+ address = "http://%s:%s/transmission/rpc" % (app.CONFIG["transmission"]["url"], app.CONFIG["transmission"]["port"]),
+ username = app.CONFIG["transmission"]["user"],
+ password = app.CONFIG["transmission"]["passwd"]
+ )
+ stats = json.loads(client.session.stats().json())
+ return {
+ "bytes_dl": humanbytes(stats["arguments"]["cumulative_stats"]["downloaded_bytes"]),
+ "bytes_up": humanbytes(stats["arguments"]["cumulative_stats"]["uploaded_bytes"]),
+ "num": stats["arguments"]["torrent_count"],
+ "ratio": stats["arguments"]["cumulative_stats"]["uploaded_bytes"] / stats["arguments"]["cumulative_stats"]["downloaded_bytes"]
+ }
+
+
+if __name__ == "__main__":
+ print(get_trans_stats()) \ No newline at end of file
diff --git a/static/style.css b/static/style.css
new file mode 100644
index 0000000..952d3ca
--- /dev/null
+++ b/static/style.css
@@ -0,0 +1,108 @@
+html {
+ background-color: black;
+ font-family: Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif;
+}
+
+body {
+ /* background: linear-gradient(red,orange,yellow,green,blue,indigo,violet); */
+ margin-left: 0px;
+ margin-right: 0px;
+ margin-bottom: 0px;
+ position: relative;
+ background: black;
+}
+
+#wrapper {
+ background-color: #f1f3f3;
+ max-width: 974px;
+ min-width: 850px;
+ margin: auto;
+ margin-top: -10px;
+}
+
+header {
+ background-color: #8fbce7;
+}
+
+
+#headerflex {
+ display: flex;
+}
+
+#headers {
+ flex-grow: 1;
+}
+
+header nav {
+ flex-grow: 1;
+ display: inline;
+}
+
+#links {
+ text-align: center;
+ font-size: x-small;
+}
+
+header span nav ul {
+ background-color: black;
+}
+
+header span nav ul li a {
+ color: white;
+}
+
+nav ul {
+ margin: 0;
+ padding: 0;
+}
+
+nav li {
+ display: inline-block;
+ list-style-type: none;
+}
+
+nav a {
+ text-decoration: none;
+ display: block;
+ padding: 5px 6px 5px 6px;
+ color: black;
+}
+
+#TheTitle {
+ text-decoration: none;
+ color: black;
+}
+
+#TheTitle h1 {
+ padding-left: 6px;
+}
+
+#articles {
+ text-align: left;
+ background-color: white;
+}
+
+header img {
+ max-height: 110px;
+}
+
+body div article {
+ padding-left: 6px;
+}
+
+footer {
+ background-color: gray;
+ padding: 3px;
+}
+
+@media (max-width: 1023px) {
+ body {
+ margin: 0;
+ padding: 0;
+ }
+
+ #wrapper {
+ min-width: 100%;
+ margin-top: 0;
+ }
+}
diff --git a/templates/discord.html b/templates/discord.html
new file mode 100644
index 0000000..b4504a2
--- /dev/null
+++ b/templates/discord.html
@@ -0,0 +1,5 @@
+{% extends "template.html" %}
+{% block content %}
+ <p>You can contact me on discord (telegram preferred):</p>
+ <h1>{{discord}}</h1>
+ {% endblock %} \ No newline at end of file
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..93138d0
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,31 @@
+{% extends "template.html" %}
+{% block content %}
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ <p>Haiiiiiiii, this is the index page uwu</p>
+ {% endblock %} \ No newline at end of file
diff --git a/templates/template.html b/templates/template.html
new file mode 100644
index 0000000..d6c1a0b
--- /dev/null
+++ b/templates/template.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+ <head>
+ <link rel='stylesheet' href="{{url_for('static', filename='style.css')}}">
+ </head>
+ <body>
+ <div id=wrapper>
+ <header>
+ <span>
+ <nav id=links>
+ <ul>
+ {% for name, link in links %}
+ <li>
+ <a href={{link}}>{{name}}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ </nav>
+ </span>
+ <div id=headerflex>
+ <div id=headers>
+ <a href="/" id=TheTitle><h1>{{title}}</h1></a>
+ <nav id=articles>
+ <ul>
+ {% for name, link in articles %}
+ <li>
+ <a href={{link}}>{{name}}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ </nav>
+ </div>
+ <a href="/">
+ <img alt={{image[0]}} src={{image[1]}}>
+ </a>
+ </div>
+ </header>
+ <article>
+ {% block content %}
+ {% endblock %}
+ </article>
+ <footer>
+ <p>Web design is my passion</p>
+ </footer>
+ </div>
+ </body>
+</html> \ No newline at end of file