From 48c6ca0aa247a52e1f33423d82fbc65b296fc79b Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 23 Sep 2010 18:23:00 -0600 Subject: [PATCH] Modularize + lots of fixes --- Makefile | 12 ------- bin/run-ctf | 37 --------------------- mcp/Makefile | 32 ++++++++++++++++++ {bin => mcp/bin}/register | 2 +- mcp/bin/run-ctf | 55 +++++++++++++++++++++++++++++++ {bin => mcp/bin}/scoreboard | 3 +- {bin => mcp/bin}/teams.sh | 3 ++ mcp/service/eth0/run | 5 +++ mcp/service/mathopd/mathopd.conf | 41 +++++++++++++++++++++++ mcp/service/mathopd/run | 3 ++ mcp/service/mcp/log/run | 3 ++ mcp/service/mcp/run | 4 +++ mcp/service/tokend/log/run | 3 ++ mcp/service/tokend/run | 4 +++ mcp/setup | 8 +++++ {src => mcp/src}/Makefile | 0 {src => mcp/src}/claim.cgi.c | 4 +-- {src => mcp/src}/common.c | 55 +++++++++++++++++++++---------- {src => mcp/src}/common.h | 4 ++- {src => mcp/src}/in.tokend.c | 8 ++--- {src => mcp/src}/pointscli.c | 0 {src => mcp/src}/puzzler.cgi.c | 7 ++-- {src => mcp/src}/puzzles.cgi.c | 6 ++-- {src => mcp/src}/src.mk | 0 {src => mcp/src}/xxtea.c | 0 {src => mcp/src}/xxtea.h | 0 test.sh => mcp/test.sh | 6 ++-- {www => mcp/www}/ctf.css | 0 {www => mcp/www}/grunge.png | Bin {www => mcp/www}/index.html | 10 ++++-- {www => mcp/www}/register.html | 0 {www => mcp/www}/scoreboard.js | 0 {www => mcp/www}/scoring.html | 0 33 files changed, 227 insertions(+), 88 deletions(-) delete mode 100644 Makefile delete mode 100755 bin/run-ctf create mode 100644 mcp/Makefile rename {bin => mcp/bin}/register (97%) create mode 100755 mcp/bin/run-ctf rename {bin => mcp/bin}/scoreboard (98%) rename {bin => mcp/bin}/teams.sh (85%) create mode 100755 mcp/service/eth0/run create mode 100644 mcp/service/mathopd/mathopd.conf create mode 100755 mcp/service/mathopd/run create mode 100755 mcp/service/mcp/log/run create mode 100755 mcp/service/mcp/run create mode 100755 mcp/service/tokend/log/run create mode 100755 mcp/service/tokend/run create mode 100755 mcp/setup rename {src => mcp/src}/Makefile (100%) rename {src => mcp/src}/claim.cgi.c (92%) rename {src => mcp/src}/common.c (92%) rename {src => mcp/src}/common.h (90%) rename {src => mcp/src}/in.tokend.c (93%) rename {src => mcp/src}/pointscli.c (100%) rename {src => mcp/src}/puzzler.cgi.c (89%) rename {src => mcp/src}/puzzles.cgi.c (95%) rename {src => mcp/src}/src.mk (100%) rename {src => mcp/src}/xxtea.c (100%) rename {src => mcp/src}/xxtea.h (100%) rename test.sh => mcp/test.sh (95%) rename {www => mcp/www}/ctf.css (100%) rename {www => mcp/www}/grunge.png (100%) rename {www => mcp/www}/index.html (83%) rename {www => mcp/www}/register.html (100%) rename {www => mcp/www}/scoreboard.js (100%) rename {www => mcp/www}/scoring.html (100%) diff --git a/Makefile b/Makefile deleted file mode 100644 index 65a9e15..0000000 --- a/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -SUBDIRS = src - -all: build - -include $(addsuffix /*.mk, $(SUBDIRS)) - -test: build - ./test.sh - -build: $(addsuffix -build, $(SUBDIRS)) -clean: $(addsuffix -clean, $(SUBDIRS)) - diff --git a/bin/run-ctf b/bin/run-ctf deleted file mode 100755 index 5198c64..0000000 --- a/bin/run-ctf +++ /dev/null @@ -1,37 +0,0 @@ -#! /bin/sh - -# First argument is seconds between running everything -period=${1:-60} - -CTF_BASE=${CTF_BASE:-/srv/ctf} export CTF_BASE - -POINTS=$CTF_BASE/points.log -SCOREBOARD=$CTF_BASE/www/scoreboard.html -PUZZLES=$CTF_BASE/www/puzzles.html - -while true; do - start=$(date +%s) - next=$(expr $start + $period) - - # Collect any new points - for fn in $CTF_BASE/points.new/*; do - [ -f $fn ] || continue - cat $fn >> $POINTS || break - rm $fn - done - - if [ $POINTS -nt $SCOREBOARD ]; then - $CTF_BASE/sbin/scoreboard < $POINTS > $SCOREBOARD.new - mv $SCOREBOARD.new $SCOREBOARD - fi - - if [ $CTF_BASE/puzzler.db -nt $PUZZLES ]; then - $CTF_BASE/sbin/puzzles.cgi > $PUZZLES.new - mv $PUZZLES.new $PUZZLES - fi - - now=$(date +%s) - if [ $now -lt $next ]; then - sleep $(expr $next - $now) - fi -done \ No newline at end of file diff --git a/mcp/Makefile b/mcp/Makefile new file mode 100644 index 0000000..432727f --- /dev/null +++ b/mcp/Makefile @@ -0,0 +1,32 @@ +SUBDIRS = src +PKGDIR = pkg +PACKAGE = mcp.pkg + +all: package + +package: $(PACKAGE) + +$(PACKAGE): build + mkdir -p $(PKGDIR) + + cp setup $(PKGDIR) + + find bin -not -name '*~' | cpio -p $(PKGDIR) + cp src/in.tokend src/pointscli $(PKGDIR)/bin + + find service -not -name '*~' -not -name '#*' | cpio -p $(PKGDIR) + + find www -not -name '*~' -not -name '#*' | cpio -p $(PKGDIR) + cp src/puzzler.cgi src/puzzles.cgi src/claim.cgi $(PKGDIR)/www + + mksquashfs $(PKGDIR) $(PACKAGE) -all-root -noappend + + +include $(addsuffix /*.mk, $(SUBDIRS)) + +test: build + ./test.sh + +build: $(addsuffix -build, $(SUBDIRS)) +clean: $(addsuffix -clean, $(SUBDIRS)) + rm -rf $(PKGDIR) $(PACKAGE) diff --git a/bin/register b/mcp/bin/register similarity index 97% rename from bin/register rename to mcp/bin/register index 6aad0b5..efdaecc 100755 --- a/bin/register +++ b/mcp/bin/register @@ -8,7 +8,7 @@ fi # Don't overwrite files set -C -base=${CTF_BASE:-/srv/ctf} +base=${CTF_BASE:-/var/lib/ctf} # Assign a color. I spent two days selecting this color pallette for # people with protanopia. Please don't change these colors. diff --git a/mcp/bin/run-ctf b/mcp/bin/run-ctf new file mode 100755 index 0000000..bbb99bf --- /dev/null +++ b/mcp/bin/run-ctf @@ -0,0 +1,55 @@ +#! /bin/sh + +# First argument is seconds between running everything +period=${1:-60} + +BIN=${CTF_BASE:-/opt/mcp}/bin +WWW=${CTF_BASE:-/var}/www +STATE=${CTF_BASE:-/var/lib/ctf} + +NEWPOINTS=$STATE/points.new +POINTS=$STATE/points.log +SCOREBOARD=$WWW/scoreboard.html +PUZZLES=$WWW/puzzles.html +TEAMS=$WWW/teams.html + +mkdir -p $NEWPOINTS $STATE/teams/names $STATE/teams/colors +touch $POINTS +if ! [ -f $SCOREBOARD ]; then + $BIN/scoreboard < $POINTS > $SCOREBOARD +done + +while true; do + start=$(date +%s) + next=$(expr $start + $period) + + # Collect any new points + for fn in $NEWPOINTS/*; do + [ -f $fn ] || continue + cat $fn >> $POINTS || break + rm $fn + done + + # Render scoreboard + if [ $POINTS -nt $SCOREBOARD ]; then + $BIN/scoreboard < $POINTS > $SCOREBOARD.new + mv $SCOREBOARD.new $SCOREBOARD + fi + + # Render puzzles list + if [ $STATE/puzzler.db -nt $PUZZLES ]; then + $WWW/puzzles.cgi > $PUZZLES.new + mv $PUZZLES.new $PUZZLES + fi + + # Render team names + if [ $STATE/teams/names -nt $TEAMS ]; then + $BIN/teams.sh > $TEAMS.new + mv $TEAMS.new $TEAMS + fi + + now=$(date +%s) + if [ $now -lt $next ]; then + sleep $(expr $next - $now) + fi +done \ No newline at end of file diff --git a/bin/scoreboard b/mcp/bin/scoreboard similarity index 98% rename from bin/scoreboard rename to mcp/bin/scoreboard index 216ea03..4d39475 100755 --- a/bin/scoreboard +++ b/mcp/bin/scoreboard @@ -2,7 +2,8 @@ ## ## -## I'm not happy with how this code looks. I've +## I'm not super happy with how this code looks. Rest assured, though, +## the C version would look far, far worse. ## ## diff --git a/bin/teams.sh b/mcp/bin/teams.sh similarity index 85% rename from bin/teams.sh rename to mcp/bin/teams.sh index 65db033..08985e9 100755 --- a/bin/teams.sh +++ b/mcp/bin/teams.sh @@ -1,5 +1,7 @@ #! /bin/sh +cd /var/lib/ctf/teams/names + escape () { sed 's/&/\&/g;s//\>/g' } @@ -27,6 +29,7 @@ done echo "" cat <Use your team's token to claim points.

EOF \ No newline at end of file diff --git a/mcp/service/eth0/run b/mcp/service/eth0/run new file mode 100755 index 0000000..91b9f5c --- /dev/null +++ b/mcp/service/eth0/run @@ -0,0 +1,5 @@ +#! /bin/sh -e + +ifconfig eth0 10.0.0.1 netmask 255.0.0.0 + +exec inotifyd true $(pwd):x diff --git a/mcp/service/mathopd/mathopd.conf b/mcp/service/mathopd/mathopd.conf new file mode 100644 index 0000000..8f746ef --- /dev/null +++ b/mcp/service/mathopd/mathopd.conf @@ -0,0 +1,41 @@ +Umask 026 + +Log /dev/stdout +ErrorLog /dev/stderr + +User nobody +StayRoot On + +Tuning { + Timeout 5 + ScriptTimeout 5 +} + +Control { + ScriptUser ctf + + Types { + application/javascript { .js } + text/html { .html } + text/plain { .txt } + text/css { .css } + image/png { .png } + image/jpeg { .jpg } + image/gif { .gif } + application/octet-stream { * } + } + Specials { + CGI { .cgi } + } + IndexNames { index.html } +} + +Server { + Virtual { + AnyHost + Control { + Alias / + Location /var/www + } + } +} diff --git a/mcp/service/mathopd/run b/mcp/service/mathopd/run new file mode 100755 index 0000000..e7cbb21 --- /dev/null +++ b/mcp/service/mathopd/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec mathopd -n -f ./mathopd.conf >> /var/log/mathopd.log 2>> /var/log/mathopd.error.log diff --git a/mcp/service/mcp/log/run b/mcp/service/mcp/log/run new file mode 100755 index 0000000..90a73e6 --- /dev/null +++ b/mcp/service/mcp/log/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec logger -t mcp diff --git a/mcp/service/mcp/run b/mcp/service/mcp/run new file mode 100755 index 0000000..890966b --- /dev/null +++ b/mcp/service/mcp/run @@ -0,0 +1,4 @@ +#! /bin/sh + +exec 2>&1 +exec /opt/mcp/bin/run-ctf diff --git a/mcp/service/tokend/log/run b/mcp/service/tokend/log/run new file mode 100755 index 0000000..404f1ce --- /dev/null +++ b/mcp/service/tokend/log/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec logger -t tokend diff --git a/mcp/service/tokend/run b/mcp/service/tokend/run new file mode 100755 index 0000000..3da11f9 --- /dev/null +++ b/mcp/service/tokend/run @@ -0,0 +1,4 @@ +#! /bin/sh + +exec 2>&1 +exec tcpsvd -u ctf 0 1 /opt/mcp/bin/in.tokend diff --git a/mcp/setup b/mcp/setup new file mode 100755 index 0000000..788ab89 --- /dev/null +++ b/mcp/setup @@ -0,0 +1,8 @@ +#! /bin/sh + +## Set up this package + +hostname mcp + +cp -r service/* /var/service +cp -r www /var diff --git a/src/Makefile b/mcp/src/Makefile similarity index 100% rename from src/Makefile rename to mcp/src/Makefile diff --git a/src/claim.cgi.c b/mcp/src/claim.cgi.c similarity index 92% rename from src/claim.cgi.c rename to mcp/src/claim.cgi.c index d684da3..760ffcf 100644 --- a/src/claim.cgi.c +++ b/mcp/src/claim.cgi.c @@ -48,7 +48,7 @@ main(int argc, char *argv[]) /* Does the token exist? */ - if (! fgrepx(token, srv_path("tokens.db"))) { + if (! fgrepx(token, state_path("tokens.db"))) { cgi_page("Token does not exist", ""); } @@ -69,7 +69,7 @@ main(int argc, char *argv[]) my_snprintf(line, sizeof(line), "%s %s", team, token); award_and_log_uniquely(team, category, 1, - "tokens.db", line); + state_path("tokens.db"), line); } } diff --git a/src/common.c b/mcp/src/common.c similarity index 92% rename from src/common.c rename to mcp/src/common.c index 878c447..1cfc9f9 100644 --- a/src/common.c +++ b/mcp/src/common.c @@ -299,29 +299,51 @@ my_snprintf(char *buf, size_t buflen, char *fmt, ...) } } -char * -srv_path(char const *fmt, ...) +static char * +mkpath(char const *base, char const *fmt, va_list ap) { char relpath[PATH_MAX]; static char path[PATH_MAX]; - char *srv; + char const *var; int len; - va_list ap; - va_start(ap, fmt); len = vsnprintf(relpath, sizeof(relpath) - 1, fmt, ap); - va_end(ap); relpath[sizeof(relpath) - 1] = '\0'; - srv = getenv("CTF_BASE"); - if (! srv) { - srv = "/srv/ctf"; + var = getenv("CTF_BASE"); + if (! var) { + var = base; } - my_snprintf(path, sizeof(path), "%s/%s", srv, relpath); + my_snprintf(path, sizeof(path), "%s/%s", var, relpath); return path; } +char * +state_path(char const *fmt, ...) +{ + va_list ap; + char *ret; + + va_start(ap, fmt); + ret = mkpath("/var/lib/ctf", fmt, ap); + va_end(ap); + return ret; +} + +char * +package_path(char const *fmt, ...) +{ + va_list ap; + char *ret; + + va_start(ap, fmt); + ret = mkpath("/opt", fmt, ap); + va_end(ap); + return ret; +} + + int team_exists(char const *teamhash) { @@ -341,7 +363,7 @@ team_exists(char const *teamhash) } /* stat seems to be the preferred way to check for existence. */ - ret = stat(srv_path("teams/names/%s", teamhash), &buf); + ret = stat(state_path("teams/names/%s", teamhash), &buf); if (-1 == ret) { return 0; } @@ -397,9 +419,9 @@ award_points(char const *teamhash, token log. */ - filename = srv_path("points.new/%d.%d.%s.%s.%ld", - now, getpid(), - teamhash, category, points); + filename = state_path("points.new/%d.%d.%s.%s.%ld", + now, getpid(), + teamhash, category, points); fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666); if (-1 == fd) { @@ -424,11 +446,10 @@ void award_and_log_uniquely(char const *team, char const *category, long points, - char const *dbfile, + char const *dbpath, char const *line) { - char *dbpath = srv_path(dbfile); - int fd; + int fd; /* Make sure they haven't already claimed these points */ if (fgrepx(line, dbpath)) { diff --git a/src/common.h b/mcp/src/common.h similarity index 90% rename from src/common.h rename to mcp/src/common.h index 8488271..a411fb3 100644 --- a/src/common.h +++ b/mcp/src/common.h @@ -7,6 +7,7 @@ #define CAT_MAX 40 #define TOKEN_MAX 40 + int cgi_init(char *global_argv[]); size_t cgi_item(char *str, size_t maxlen); void cgi_head(char *title); @@ -17,7 +18,8 @@ void cgi_error(char *fmt, ...); int fgrepx(char const *needle, char const *filename); int my_snprintf(char *buf, size_t buflen, char *fmt, ...); -char *srv_path(char const *fmt, ...); +char *state_path(char const *fmt, ...); +char *package_path(char const *fmt, ...); int team_exists(char const *teamhash); int award_points(char const *teamhacsh, char const *category, diff --git a/src/in.tokend.c b/mcp/src/in.tokend.c similarity index 93% rename from src/in.tokend.c rename to mcp/src/in.tokend.c index f86a626..b86b125 100644 --- a/src/in.tokend.c +++ b/mcp/src/in.tokend.c @@ -94,7 +94,7 @@ main(int argc, char *argv[]) int fd; size_t len; - fd = open(srv_path("token.keys/%s", service), O_RDONLY); + fd = open(state_path("token.keys/%.*s", (int)servicelen, service), O_RDONLY); if (-1 == fd) { write(1, "!nosvc", 6); return 0; @@ -123,8 +123,8 @@ main(int argc, char *argv[]) /* Append digest to service name. */ tokenlen = (size_t)snprintf(token, sizeof(token), - "%*s:%s", - servicelen, service, digest); + "%.*s:%s", + (int)servicelen, service, digest); } /* Write that token out now. */ @@ -133,7 +133,7 @@ main(int argc, char *argv[]) int ret; do { - fd = open(srv_path("tokens.db"), O_WRONLY | O_CREAT, 0666); + fd = open(state_path("tokens.db"), O_WRONLY | O_CREAT, 0666); if (-1 == fd) break; ret = lockf(fd, F_LOCK, 0); diff --git a/src/pointscli.c b/mcp/src/pointscli.c similarity index 100% rename from src/pointscli.c rename to mcp/src/pointscli.c diff --git a/src/puzzler.cgi.c b/mcp/src/puzzler.cgi.c similarity index 89% rename from src/puzzler.cgi.c rename to mcp/src/puzzler.cgi.c index 235a110..7741465 100644 --- a/src/puzzler.cgi.c +++ b/mcp/src/puzzler.cgi.c @@ -59,10 +59,9 @@ main(int argc, char *argv[]) { char needle[400]; - my_snprintf(needle, sizeof(needle), - "%ld %s", points, answer); + my_snprintf(needle, sizeof(needle), "%ld %s", points, answer); if (! fgrepx(needle, - srv_path("packages/%s/answers.txt", category))) { + package_path("%s/answers.txt", category))) { cgi_page("Wrong answer", ""); } } @@ -73,7 +72,7 @@ main(int argc, char *argv[]) my_snprintf(line, sizeof(line), "%s %s %ld", team, category, points); award_and_log_uniquely(team, category, points, - "puzzler.db", line); + state_path("puzzler.db"), line); } cgi_page("Points awarded", diff --git a/src/puzzles.cgi.c b/mcp/src/puzzles.cgi.c similarity index 95% rename from src/puzzles.cgi.c rename to mcp/src/puzzles.cgi.c index 9f07af2..6012245 100644 --- a/src/puzzles.cgi.c +++ b/mcp/src/puzzles.cgi.c @@ -58,7 +58,7 @@ main(int argc, char *argv[]) } { - FILE *f = fopen(srv_path("puzzler.db"), "r"); + FILE *f = fopen(state_path("puzzler.db"), "r"); char cat[CAT_MAX]; char points_str[11]; long points; @@ -91,7 +91,7 @@ main(int argc, char *argv[]) if (f) fclose(f); } - srv = opendir(srv_path("packages")); + srv = opendir(package_path("")); if (NULL == srv) { cgi_error("Cannot opendir(\"/srv\")"); } @@ -115,7 +115,7 @@ main(int argc, char *argv[]) well just barge ahead and watch for errors. */ /* Open /srv/ctf/$cat/puzzles/ */ - puzzles = opendir(srv_path("packages/%s/puzzles", cat)); + puzzles = opendir(package_path("%s/puzzles", cat)); if (NULL == puzzles) { continue; } diff --git a/src/src.mk b/mcp/src/src.mk similarity index 100% rename from src/src.mk rename to mcp/src/src.mk diff --git a/src/xxtea.c b/mcp/src/xxtea.c similarity index 100% rename from src/xxtea.c rename to mcp/src/xxtea.c diff --git a/src/xxtea.h b/mcp/src/xxtea.h similarity index 100% rename from src/xxtea.h rename to mcp/src/xxtea.h diff --git a/test.sh b/mcp/test.sh similarity index 95% rename from test.sh rename to mcp/test.sh index c8dba07..76b0268 100755 --- a/test.sh +++ b/mcp/test.sh @@ -14,14 +14,14 @@ mkdir -p $CTF_BASE/points.new # Set up some packages for cat in cat1 cat2 cat3; do - mkdir -p $CTF_BASE/packages/$cat - cat >$CTF_BASE/packages/$cat/answers.txt <$CTF_BASE/$cat/answers.txt <Scoreboard
  • - Puzzles + Puzzles +
  • +
  • + Teams
  • Claim Token
    - team:
    - token: + team: + token: +
    diff --git a/www/register.html b/mcp/www/register.html similarity index 100% rename from www/register.html rename to mcp/www/register.html diff --git a/www/scoreboard.js b/mcp/www/scoreboard.js similarity index 100% rename from www/scoreboard.js rename to mcp/www/scoreboard.js diff --git a/www/scoring.html b/mcp/www/scoring.html similarity index 100% rename from www/scoring.html rename to mcp/www/scoring.html