Make an actually working server, hopefully
60
README.md
|
@ -50,19 +50,56 @@ Running A Production Server
|
||||||
|
|
||||||
XXX: Update this
|
XXX: Update this
|
||||||
|
|
||||||
How to set it up
|
How to install it
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
It's made to be virtualized,
|
It's made to be virtualized,
|
||||||
so you can run multiple contests at once if you want.
|
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:
|
do the following:
|
||||||
|
|
||||||
$ mkdir -p /opt/koth/mycontest
|
$ mothinst=/srv/moth/mycontest
|
||||||
$ ./install /opt/koth/mycontest
|
$ mkdir -p $mothinst
|
||||||
$ cp kothd /opt/koth
|
$ 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
|
Installing Puzzle Categories
|
||||||
|
@ -71,18 +108,9 @@ Installing Puzzle Categories
|
||||||
Puzzle categories are distributed in a different way than the server.
|
Puzzle categories are distributed in a different way than the server.
|
||||||
After setting up (see above), just run
|
After setting up (see above), just run
|
||||||
|
|
||||||
$ /opt/koth/mycontest/bin/install-category /path/to/my/category
|
$ /srv/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`.
|
|
||||||
|
|
||||||
|
|
||||||
Permissions
|
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
|
fi
|
||||||
basedir=$(pwd)
|
basedir=$(pwd)
|
||||||
|
|
||||||
|
printf "Updating moth instance in %s\n" $(pwd)
|
||||||
|
|
||||||
# Do nothing if `disabled` is present
|
# Do nothing if `disabled` is present
|
||||||
if [ -f disabled ]; then
|
if [ -f disabled ]; then
|
||||||
exit
|
exit
|
|
@ -36,7 +36,7 @@ def page(title, body):
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
<link rel="stylesheet" href="/files/src/www/res/style.css">
|
<link rel="stylesheet" href="/files/www/res/style.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>{title}</h1>
|
<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>
|
<title>Open Puzzles</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
<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>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Open Puzzles</h1>
|
<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) {
|
if (points == 0) {
|
||||||
i.textContent = "‡";
|
i.textContent = "‡";
|
||||||
} else {
|
} else {
|
||||||
var a = createElement('span');
|
var a = createElement('a');
|
||||||
i.appendChild(a);
|
i.appendChild(a);
|
||||||
a.className = "link";
|
a.className = "link";
|
||||||
a.textContent = points;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|