draft work
This commit is contained in:
parent
1fe5df7aef
commit
7ba18be952
|
@ -12,6 +12,7 @@ static_files=/path/to/static/files
|
||||||
host=localhost
|
host=localhost
|
||||||
port=8000
|
port=8000
|
||||||
debug=True
|
debug=True
|
||||||
|
fqdn=factorio.socialnerds.org
|
||||||
|
|
||||||
[factorio]
|
[factorio]
|
||||||
path=/path/to/factorio/servers
|
path=/path/to/factorio/servers
|
||||||
|
|
|
@ -41,15 +41,16 @@ def log_in(username, password):
|
||||||
# get a list of server dicts
|
# get a list of server dicts
|
||||||
def get_servers():
|
def get_servers():
|
||||||
pass
|
pass
|
||||||
return [{ "name": "Creative fun", "version": "0.14.20", "status": "online" },
|
return [{ "name": "Creative fun", "version": "0.14.20", "status": "online", "port": "43564" },
|
||||||
{ "name": "Mad enemies", "version": "0.14.19", "status": "offline" }]
|
{ "name": "Mad enemies", "version": "0.14.19", "status": "offline", "port": "65432" },
|
||||||
|
{ "name": "Mad enemies2", "version": "0.14.19", "status": "offline", "port": "65431" }]
|
||||||
|
|
||||||
|
|
||||||
# routing
|
# routing
|
||||||
|
|
||||||
# render main page
|
# render main page
|
||||||
@get('/')
|
@get('/')
|
||||||
def home():
|
def view_home():
|
||||||
username = logged_in()
|
username = logged_in()
|
||||||
message = request.get_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
message = request.get_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||||
secret=config['DEFAULT']['cookie_secret'])
|
secret=config['DEFAULT']['cookie_secret'])
|
||||||
|
@ -70,7 +71,7 @@ def home():
|
||||||
|
|
||||||
# get login credentials
|
# get login credentials
|
||||||
@post('/login')
|
@post('/login')
|
||||||
def post_login():
|
def login():
|
||||||
username = request.forms.get('username')
|
username = request.forms.get('username')
|
||||||
password = request.forms.get('password')
|
password = request.forms.get('password')
|
||||||
if log_in(username, password):
|
if log_in(username, password):
|
||||||
|
@ -90,7 +91,6 @@ def post_login():
|
||||||
|
|
||||||
# delete cookie
|
# delete cookie
|
||||||
@get('/logout')
|
@get('/logout')
|
||||||
@get('/logout/')
|
|
||||||
def logout():
|
def logout():
|
||||||
if logged_in():
|
if logged_in():
|
||||||
response.delete_cookie(config['DEFAULT']['cookie_name'])
|
response.delete_cookie(config['DEFAULT']['cookie_name'])
|
||||||
|
@ -108,6 +108,42 @@ def logout():
|
||||||
def send_static(filename):
|
def send_static(filename):
|
||||||
return static_file(filename, root=config['DEFAULT']['static_files'])
|
return static_file(filename, root=config['DEFAULT']['static_files'])
|
||||||
|
|
||||||
|
# render server page
|
||||||
|
@get('/server/<port:int>')
|
||||||
|
def view_server(port):
|
||||||
|
username = logged_in()
|
||||||
|
message = request.get_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||||
|
secret=config['DEFAULT']['cookie_secret'])
|
||||||
|
if username:
|
||||||
|
servers = get_servers()
|
||||||
|
server = [ server for server in servers if int(server['port']) == int(port) ]
|
||||||
|
if server:
|
||||||
|
return template('server',
|
||||||
|
app_name=config['DEFAULT']['app_name'],
|
||||||
|
server=server[0],
|
||||||
|
username=username,
|
||||||
|
fqdn=config['server']['fqdn'],
|
||||||
|
message=message)
|
||||||
|
else:
|
||||||
|
message = { "message": "Server does not exist", "alert": "danger" }
|
||||||
|
response.set_cookie(config['DEFAULT']['cookie_name'] + "_message",
|
||||||
|
message,
|
||||||
|
secret=config['DEFAULT']['cookie_secret'],
|
||||||
|
max_age=5,
|
||||||
|
path="/")
|
||||||
|
redirect("/")
|
||||||
|
else:
|
||||||
|
redirect("/")
|
||||||
|
|
||||||
|
|
||||||
|
# create new server
|
||||||
|
@get('/create')
|
||||||
|
def create_server():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# run webserver
|
# run webserver
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 15 KiB |
|
@ -1,71 +1,66 @@
|
||||||
<!DOCTYPE html>
|
%include('header.tpl', app_name=app_name, message=message)
|
||||||
<html lang="en">
|
<!-- Begin page content -->
|
||||||
<head>
|
<div class="container">
|
||||||
<meta charset="utf-8">
|
<div class="row">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<div class="col-sm-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<h1>Servers</h1>
|
||||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
|
||||||
<meta name="description" content="">
|
|
||||||
<meta name="author" content="">
|
|
||||||
<link rel="icon" href="/static/favicon.ico">
|
|
||||||
|
|
||||||
<title>{{ app_name }}</title>
|
|
||||||
|
|
||||||
<!-- Bootstrap core CSS -->
|
|
||||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- Custom styles for this template -->
|
|
||||||
<link href="/static/css/sticky-footer.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<p>
|
|
||||||
%if message:
|
|
||||||
<div class="alert alert-{{ message['alert'] }} alert-dismissible" role="alert">
|
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
|
||||||
{{ message['message'] }}.
|
|
||||||
</div>
|
</div>
|
||||||
%end
|
<div class="col-sm-4 text-xs-right">
|
||||||
</p>
|
<div class="btn-group">
|
||||||
|
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
{{ username }}
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<a class="dropdown-item" href="/">Server overview</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item" href="#">Create server</a>
|
||||||
|
<a class="dropdown-item" href="#">Create server from .zip</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item" href="/logout">Logout</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Begin page content -->
|
|
||||||
<div class="container">
|
|
||||||
<div class="mt-1">
|
|
||||||
<h1>{{ app_name }}</h1>
|
|
||||||
</div>
|
</div>
|
||||||
<p class="lead">{{ username }} (<a href="/logout">logout</a>)</p>
|
</div>
|
||||||
<p>This is your Factorio server control panel.</p>
|
</div>
|
||||||
<p>It is <a href="https://en.wikipedia.org/wiki/Free_software">free software</a> and its code is hosted <a href="https://socialg.it/david/factoriocp">here</a>.</p>
|
<p class="lead">Control your <a href="http://factorio.com">Factorio</a> game servers from here.</p>
|
||||||
|
|
||||||
|
<table class="table table-hover">
|
||||||
<h2>Servers</h2>
|
<thead>
|
||||||
<hr>
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Version</th>
|
||||||
|
<th>Port</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th class="text-xs-right">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
%for server in servers:
|
%for server in servers:
|
||||||
%if server['status'] == "online":
|
%if server['status'] == "online":
|
||||||
<h4>{{ server['name'] }} <span class="tag tag-success">{{ server['status'] }}</span></h4>
|
<tr>
|
||||||
|
<th>{{ server['name'] }}</th>
|
||||||
|
<td>{{ server['version'] }}</td>
|
||||||
|
<td>{{ server['port'] }}</td>
|
||||||
|
<td><span class="tag tag-success">{{ server['status'] }}</span></td>
|
||||||
|
<td class="text-xs-right">
|
||||||
|
<a href="/stop/{{ server['port' ]}}" type="button" class="btn btn-outline-danger btn-sm">Stop</a>
|
||||||
|
<a href="/server/{{ server['port'] }}" type="button" class="btn btn-outline-primary btn-sm">Edit</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
%else:
|
%else:
|
||||||
<h4>{{ server['name'] }} <span class="tag tag-danger">{{ server['status'] }}</span></h4>
|
<tr>
|
||||||
|
<th>{{ server['name'] }}</th>
|
||||||
|
<td>{{ server['version'] }}</td>
|
||||||
|
<td>{{ server['port'] }}</td>
|
||||||
|
<td><span class="tag tag-danger">{{ server['status'] }}</span></td>
|
||||||
|
<td class="text-xs-right">
|
||||||
|
<a href="/start/{{ server['port'] }}" type="button" class="btn btn-outline-success btn-sm">Start</a>
|
||||||
|
<a href="/delete/{{ server['port'] }}" type="button" class="btn btn-outline-danger btn-sm">Delete</a>
|
||||||
|
<a href="/server/{{ server['port'] }}" type="button" class="btn btn-outline-primary btn-sm">Edit</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
%end
|
%end
|
||||||
Version: <b>{{ server['version'] }}</b>
|
|
||||||
<br><br>
|
|
||||||
%end
|
%end
|
||||||
</div>
|
</tbody>
|
||||||
|
</table>
|
||||||
<footer class="footer">
|
</div> <!-- Page content -->
|
||||||
<div class="container">
|
%include('footer.tpl', username=username)
|
||||||
<span class="text-muted">factoriocp v0.1</span>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<!-- Bootstrap core JavaScript
|
|
||||||
================================================== -->
|
|
||||||
<!-- Placed at the end of the document so the pages load faster -->
|
|
||||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
|
||||||
<script>window.jQuery || document.write('<script src="/static/js/vendor/jquery.min.js"><\/script>')</script>
|
|
||||||
<script src="/static/js/bootstrap.min.js"></script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-muted">
|
||||||
|
factoriocp v0.1
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript
|
||||||
|
================================================== -->
|
||||||
|
<!-- Placed at the end of the document so the pages load faster -->
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||||
|
<script>window.jQuery || document.write('<script src="/static/js/vendor/jquery.min.js"><\/script>')</script>
|
||||||
|
<script src="/static/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,31 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="author" content="">
|
||||||
|
<link rel="icon" href="/static/favicon.ico">
|
||||||
|
|
||||||
|
<title>{{ app_name }}</title>
|
||||||
|
|
||||||
|
<!-- Bootstrap core CSS -->
|
||||||
|
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Custom styles for this template -->
|
||||||
|
<link href="/static/css/sticky-footer.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Begin alert message -->
|
||||||
|
<div class="container">
|
||||||
|
<p>
|
||||||
|
%if message:
|
||||||
|
<div class="alert alert-{{ message['alert'] }} alert-dismissible" role="alert">
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
{{ message['message'] }}.
|
||||||
|
</div>
|
||||||
|
%end
|
||||||
|
</p>
|
||||||
|
</div> <!-- alert message -->
|
|
@ -20,15 +20,7 @@
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div class="container">
|
<!-- Begin page content -->
|
||||||
|
|
||||||
%if message:
|
|
||||||
<div class="alert alert-{{ message['alert'] }} alert-dismissible" role="alert">
|
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
|
||||||
{{ message['message'] }}.
|
|
||||||
</div>
|
|
||||||
%end
|
|
||||||
</div>
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<form class="form-signin" action="/login" method="post">
|
<form class="form-signin" action="/login" method="post">
|
||||||
<h2 class="form-signin-heading">{{ app_name }}</h2>
|
<h2 class="form-signin-heading">{{ app_name }}</h2>
|
||||||
|
@ -39,10 +31,7 @@
|
||||||
<p>For security reasons every session will expire {{ int(cookie_max_age/60) }} minutes after login.</p>
|
<p>For security reasons every session will expire {{ int(cookie_max_age/60) }} minutes after login.</p>
|
||||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Login</button>
|
<button class="btn btn-lg btn-primary btn-block" type="submit">Login</button>
|
||||||
</form>
|
</form>
|
||||||
|
</div> <!-- Page content -->
|
||||||
|
|
||||||
|
|
||||||
</div> <!-- /container -->
|
|
||||||
|
|
||||||
<!-- Bootstrap core JavaScript
|
<!-- Bootstrap core JavaScript
|
||||||
================================================== -->
|
================================================== -->
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
%include('header.tpl', app_name=app_name, message=message)
|
||||||
|
<!-- Begin page content -->
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-8">
|
||||||
|
%if server['status'] == "online":
|
||||||
|
<h1>{{ server['name'] }}<sup><span class="tag tag-success tag-sm">Online</span></sup></h1>
|
||||||
|
%else:
|
||||||
|
<h1>{{ server['name'] }}<sup><span class="tag tag-danger tag-sm">Offline</span></sup></h1>
|
||||||
|
%end
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 text-xs-right">
|
||||||
|
<div class="btn-group">
|
||||||
|
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
{{ username }}
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<a class="dropdown-item" href="/">Server overview</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item" href="#">Create server</a>
|
||||||
|
<a class="dropdown-item" href="#">Create server from .zip</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item" href="/logout">Logout</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="lead">Some fon server description goes here.</p>
|
||||||
|
|
||||||
|
<table class="table">
|
||||||
|
<tr>
|
||||||
|
<th>Address</th>
|
||||||
|
<th>Version</th>
|
||||||
|
<th class="text-xs-right">Actions</th>
|
||||||
|
</tr>
|
||||||
|
%if server['status'] == "online":
|
||||||
|
<tr>
|
||||||
|
<td><code>{{ fqdn }}:{{ server['port'] }}</code></td>
|
||||||
|
<td><code>{{ server['version'] }}</code></td>
|
||||||
|
<td class="text-xs-right">
|
||||||
|
<a href="/stop/{{ server['port'] }}" type="button" class="btn btn-outline-danger btn-sm">Stop</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
%else:
|
||||||
|
<tr>
|
||||||
|
<td><code>{{ fqdn }}:{{ server['port'] }}</code></td>
|
||||||
|
<td><code>{{ server['version'] }}</code></td>
|
||||||
|
<td class="text-xs-right">
|
||||||
|
<a href="/start" type="button" class="btn btn-outline-success btn-sm">Start</a>
|
||||||
|
<a href="/delete/{{ server['port'] }}" type="button" class="btn btn-outline-danger btn-sm">Delete</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
%end
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Settings</h4>
|
||||||
|
<hr>
|
||||||
|
<form class="form-inline">
|
||||||
|
<input>
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Backups</h4>
|
||||||
|
<hr>
|
||||||
|
<form class="form-inline">
|
||||||
|
<input>
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Mods</h4>
|
||||||
|
<hr>
|
||||||
|
<form class="form-inline">
|
||||||
|
<input>
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Screenshots</h4>
|
||||||
|
<hr>
|
||||||
|
<form class="form-inline">
|
||||||
|
<input>
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Console</h4>
|
||||||
|
<hr>
|
||||||
|
<form class="form-inline">
|
||||||
|
<input>
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
</div> <!-- Page content -->
|
||||||
|
%include('footer.tpl', username=username)
|
Reference in New Issue