web
- show config and logs in webserver
This commit is contained in:
parent
4f4709776b
commit
f60220f302
6 changed files with 172 additions and 14 deletions
|
@ -3,4 +3,5 @@ beautifulsoup4==4.11.1
|
||||||
urllib3==1.26.9
|
urllib3==1.26.9
|
||||||
sqlalchemy==1.4.36
|
sqlalchemy==1.4.36
|
||||||
sqlalchemy_utils==0.38.2
|
sqlalchemy_utils==0.38.2
|
||||||
python-dateutil==2.8.2
|
python-dateutil==2.8.2
|
||||||
|
Flask==2.1.2
|
|
@ -25,8 +25,8 @@ def choose_user_agent():
|
||||||
]
|
]
|
||||||
return user_agents[randrange(0, len(user_agents))]
|
return user_agents[randrange(0, len(user_agents))]
|
||||||
|
|
||||||
class ConfigReader(ConfigParser):
|
|
||||||
|
|
||||||
|
class ConfigReader(ConfigParser):
|
||||||
|
|
||||||
required_values = {
|
required_values = {
|
||||||
'DEFAULT': {
|
'DEFAULT': {
|
||||||
|
@ -44,6 +44,10 @@ class ConfigReader(ConfigParser):
|
||||||
},
|
},
|
||||||
'NOTIFICATIONS': {
|
'NOTIFICATIONS': {
|
||||||
'pushover.enabled': ('true', 'false'),
|
'pushover.enabled': ('true', 'false'),
|
||||||
|
},
|
||||||
|
'WEB': {
|
||||||
|
'web.enabled': ('true', 'false'),
|
||||||
|
'web.port': '%s' % (value_range(1, 65535))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default_values = {
|
default_values = {
|
||||||
|
@ -68,7 +72,10 @@ class ConfigReader(ConfigParser):
|
||||||
'pushover.enabled': 'false',
|
'pushover.enabled': 'false',
|
||||||
'pushover.token': '',
|
'pushover.token': '',
|
||||||
'pushover.user_key': '',
|
'pushover.user_key': '',
|
||||||
|
},
|
||||||
|
'WEB': {
|
||||||
|
'web.enabled': 'false',
|
||||||
|
'web.port': '9647'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
deprecated_values = {
|
deprecated_values = {
|
||||||
|
|
36
src/run.py
36
src/run.py
|
@ -2,6 +2,8 @@ import threading
|
||||||
from random import randint
|
from random import randint
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
|
from pygtail import Pygtail
|
||||||
|
|
||||||
import log
|
import log
|
||||||
from ConfigReader import ConfigReader, ConfigException
|
from ConfigReader import ConfigReader, ConfigException
|
||||||
from SteamGifts import SteamGifts, SteamGiftsException
|
from SteamGifts import SteamGifts, SteamGiftsException
|
||||||
|
@ -15,21 +17,32 @@ logger = log.get_logger(__name__)
|
||||||
class WebServerThread(threading.Thread):
|
class WebServerThread(threading.Thread):
|
||||||
|
|
||||||
def run_webserver(self):
|
def run_webserver(self):
|
||||||
import http.server
|
from flask import Flask
|
||||||
import socketserver
|
from flask import render_template
|
||||||
|
|
||||||
PORT = 8000
|
app = Flask(__name__)
|
||||||
|
|
||||||
class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
|
@app.route("/")
|
||||||
def do_GET(self):
|
def config():
|
||||||
self.path = 'index.html'
|
with open('../config/config.ini', 'r') as f:
|
||||||
return http.server.SimpleHTTPRequestHandler.do_GET(self)
|
content = f.read()
|
||||||
|
return render_template('configuration.html', config=content)
|
||||||
|
|
||||||
Handler = MyHttpRequestHandler
|
@app.route("/log")
|
||||||
|
def logs():
|
||||||
|
return render_template('log.html')
|
||||||
|
|
||||||
with socketserver.TCPServer(("", PORT), Handler) as httpd:
|
@app.route("/stream")
|
||||||
print("Http Server Serving at port", PORT)
|
def stream():
|
||||||
httpd.serve_forever()
|
def generate():
|
||||||
|
with open('../config/debug.log') as f:
|
||||||
|
while True:
|
||||||
|
yield f.read()
|
||||||
|
sleep(10)
|
||||||
|
|
||||||
|
return app.response_class(generate(), mimetype='text/plain')
|
||||||
|
|
||||||
|
app.run(port=9647)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
# Variable that stores the exception, if raised by someFunction
|
# Variable that stores the exception, if raised by someFunction
|
||||||
|
@ -138,6 +151,7 @@ def run():
|
||||||
|
|
||||||
w = WebServerThread()
|
w = WebServerThread()
|
||||||
w.setName("WebServer")
|
w.setName("WebServer")
|
||||||
|
# if the giveaway thread dies then this daemon thread will die by definition
|
||||||
w.setDaemon(True)
|
w.setDaemon(True)
|
||||||
w.start()
|
w.start()
|
||||||
|
|
||||||
|
|
76
src/static/css/main.css
Normal file
76
src/static/css/main.css
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Formatting the header area
|
||||||
|
*/
|
||||||
|
header {
|
||||||
|
background-color: #DFB887;
|
||||||
|
height: 35px;
|
||||||
|
width: 100%;
|
||||||
|
opacity: .9;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
header h1.logo {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 1.7em;
|
||||||
|
color: #fff;
|
||||||
|
text-transform: uppercase;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
header h1.logo:hover {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Centering the body content
|
||||||
|
*/
|
||||||
|
.container {
|
||||||
|
width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
div.home {
|
||||||
|
padding: 10px 0 30px 0;
|
||||||
|
background-color: #E6E6FA;
|
||||||
|
-webkit-border-radius: 6px;
|
||||||
|
-moz-border-radius: 6px;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
div.about {
|
||||||
|
padding: 10px 0 30px 0;
|
||||||
|
background-color: #E6E6FA;
|
||||||
|
-webkit-border-radius: 6px;
|
||||||
|
-moz-border-radius: 6px;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 3em;
|
||||||
|
margin-top: 40px;
|
||||||
|
text-align: center;
|
||||||
|
letter-spacing: -2px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 1.7em;
|
||||||
|
font-weight: 100;
|
||||||
|
margin-top: 30px;
|
||||||
|
text-align: center;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.menu {
|
||||||
|
float: right;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
.menu li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
.menu li + li {
|
||||||
|
margin-left: 35px;
|
||||||
|
}
|
||||||
|
.menu li a {
|
||||||
|
color: #444;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
25
src/templates/configuration.html
Normal file
25
src/templates/configuration.html
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Flask app</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="logo">Steamgifts Bot</h1>
|
||||||
|
<strong><nav>
|
||||||
|
<ul class="menu">
|
||||||
|
<li><a href="{{ url_for('config') }}">Config</a></li>
|
||||||
|
<li><a href="{{ url_for('logs') }}">Logs</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav></strong>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container">
|
||||||
|
<pre>{{config}}</pre>
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
35
src/templates/log.html
Normal file
35
src/templates/log.html
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Flask app</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="logo">Steamgifts Bot</h1>
|
||||||
|
<strong><nav>
|
||||||
|
<ul class="menu">
|
||||||
|
<li><a href="{{ url_for('config') }}">Config</a></li>
|
||||||
|
<li><a href="{{ url_for('logs') }}">Logs</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav></strong>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container">
|
||||||
|
<pre id="output"></pre>
|
||||||
|
<script>
|
||||||
|
var output = document.getElementById('output');
|
||||||
|
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('GET', '{{ url_for('stream') }}');
|
||||||
|
xhr.send();
|
||||||
|
output.textContent = xhr.responseText;
|
||||||
|
|
||||||
|
setInterval(function() {
|
||||||
|
output.textContent = xhr.responseText;
|
||||||
|
}, 10000);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue