Make an actually working server, hopefully
60
README.md
|
@ -50,19 +50,56 @@ Running A Production Server
|
|||
|
||||
XXX: Update this
|
||||
|
||||
How to set it up
|
||||
How to install it
|
||||
--------------------
|
||||
|
||||
It's made to be virtualized,
|
||||
so you can run multiple contests at once if you want.
|
||||
If you were to want to run it out of `/opt/koth`,
|
||||
If you were to want to run it out of `/srv/moth`,
|
||||
do the following:
|
||||
|
||||
$ mkdir -p /opt/koth/mycontest
|
||||
$ ./install /opt/koth/mycontest
|
||||
$ cp kothd /opt/koth
|
||||
$ mothinst=/srv/moth/mycontest
|
||||
$ mkdir -p $mothinst
|
||||
$ install.sh $mothinst
|
||||
|
||||
Yay, you've got it set up.
|
||||
Yay, you've got it installed.
|
||||
|
||||
How to run a contest
|
||||
------------------------
|
||||
|
||||
`mothd` runs through every contest on your server every few seconds,
|
||||
and does housekeeping tasks that make the contest "run".
|
||||
If you stop `mothd`, people can still play the contest,
|
||||
but their points won't show up on the scoreboard.
|
||||
|
||||
A handy side-effect here is that if you need to meddle with the points log,
|
||||
you can just kill `mothd`,
|
||||
do you work,
|
||||
then bring `mothd` back up.
|
||||
|
||||
$ cp src/mothd /srv/moth
|
||||
$ /srv/moth/mothd
|
||||
|
||||
You're also going to need a web server if you want people to be able to play.
|
||||
|
||||
|
||||
How to run a web server
|
||||
-----------------------------
|
||||
|
||||
Your web server needs to serve up files for you contest out of
|
||||
`$mothinst/www`.
|
||||
|
||||
If you don't want to fuss around with setting up a full-featured web server,
|
||||
you can use `tcpserver` and `eris`,
|
||||
which is what we use to run our contests.
|
||||
|
||||
`tcpserver` is part of the `uscpi-tcp` package in Ubuntu.
|
||||
You can also use busybox's `tcpsvd` (my preference, but a PITA on Ubuntu).
|
||||
|
||||
`eris` can be obtained at https://woozle.org/neale/g.cgi/net/eris/about/
|
||||
|
||||
$ mothinst=/srv/moth/mycontest
|
||||
$ $mothinst/bin/httpd
|
||||
|
||||
|
||||
Installing Puzzle Categories
|
||||
|
@ -71,16 +108,7 @@ Installing Puzzle Categories
|
|||
Puzzle categories are distributed in a different way than the server.
|
||||
After setting up (see above), just run
|
||||
|
||||
$ /opt/koth/mycontest/bin/install-category /path/to/my/category
|
||||
|
||||
|
||||
Running It
|
||||
-------------
|
||||
|
||||
Get your web server to serve up files from
|
||||
`/opt/koth/mycontest/www`.
|
||||
|
||||
Then run `/opt/koth/kothd`.
|
||||
$ /srv/koth/mycontest/bin/install-category /path/to/my/category
|
||||
|
||||
|
||||
Permissions
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
# Starts a standalone server using tcpsvd and eris
|
||||
|
||||
echo "Figuring out web user..."
|
||||
for www in www-data http tc _ _www; do
|
||||
id $www && break
|
||||
done
|
||||
if [ $www = _ ]; then
|
||||
echo "Unable to determine httpd user on this system. Dying."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd $(dirname $0)/../www
|
||||
tcpserver -RHI localhost -u $www -g $www 0 80 eris -c -.
|
||||
|
|
@ -7,6 +7,8 @@ else
|
|||
fi
|
||||
basedir=$(pwd)
|
||||
|
||||
printf "Updating moth instance in %s\n" $(pwd)
|
||||
|
||||
# Do nothing if `disabled` is present
|
||||
if [ -f disabled ]; then
|
||||
exit
|
|
@ -36,7 +36,7 @@ def page(title, body):
|
|||
<html>
|
||||
<head>
|
||||
<title>{title}</title>
|
||||
<link rel="stylesheet" href="/files/src/www/res/style.css">
|
||||
<link rel="stylesheet" href="/files/www/res/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>{title}</h1>
|
||||
|
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 144 B After Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 197 KiB |
|
@ -0,0 +1,75 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<title>Welcome</title>
|
||||
<link rel="stylesheet" href="style.css" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<h1><img src="images/tf6.png" alt="Cyber FIRE"></h1>
|
||||
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="register.html">Register</a></li>
|
||||
<li><a href="puzzles.html">Puzzles</a></li>
|
||||
<li><a href="scoreboard.html">Scoreboard</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<section>
|
||||
<h2>Getting Started</h2>
|
||||
|
||||
<p>
|
||||
Here is what you need to do:
|
||||
</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<a href="register.html">Register</a> your team.
|
||||
This only needs to happen once per team,
|
||||
so if somebody else on your team has already done it,
|
||||
you don't need to.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
Get an <a href="puzzles.html">overview of puzzles</a>,
|
||||
and start working on something.
|
||||
The list of open puzzles changes over time,
|
||||
you need to reload the page to get the current version!
|
||||
</li>
|
||||
|
||||
<li>
|
||||
Check the <a href="scoreboard.html">scoreboard</a>
|
||||
in another tab,
|
||||
to see how your team is doing.
|
||||
</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Reading Material</h2>
|
||||
|
||||
<p>
|
||||
Stuck? Taking a break?
|
||||
Here are some things to read.
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="credits.html">Credits</a></li>
|
||||
<li>
|
||||
<a href="scoring.html">About Scoring</a>
|
||||
explains how we calculate scores,
|
||||
and why.
|
||||
Reading this will help you formulate a strategy to win.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section id="sponsors">
|
||||
<img src="images/lanl.png" alt="Los Alamos National Laboratory">
|
||||
<img src="images/doe.png" alt="US Department Of Energy">
|
||||
<img src="images/sandia.png" alt="Sandia National Laboratories">
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
|
@ -4,7 +4,13 @@
|
|||
<title>Open Puzzles</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css" type="text/css">
|
||||
<script src="puzzles.js" onload="init()" async></script>
|
||||
<link rel="stylesheet" href="res/style.css">
|
||||
<link rel="icon" href="res/luna-moth.svg" type="image/svg+xml">
|
||||
<link rel="icon" href="res/luna-moth.png" type="image/png">
|
||||
|
||||
<script src="res/common.js"></script>
|
||||
<script src="res/terminal.js"></script>
|
||||
<script src="res/puzzles.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Open Puzzles</h1>
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
@ -31,11 +31,12 @@ function puzzlesRefresh(term, obj) {
|
|||
if (points == 0) {
|
||||
i.textContent = "‡";
|
||||
} else {
|
||||
var a = createElement('span');
|
||||
var a = createElement('a');
|
||||
i.appendChild(a);
|
||||
a.className = "link";
|
||||
a.textContent = points;
|
||||
a.addEventListener("click", loadPuzzle.bind(undefined, cat, id, points));
|
||||
a.href = cat + "/" + id + "/index.html";
|
||||
// a.addEventListener("click", loadPuzzle.bind(undefined, cat, id, points));
|
||||
}
|
||||
}
|
||||
|