forked from github/server
order processing and other scripts
This commit is contained in:
parent
75b7ac3064
commit
ce347a95c9
|
@ -0,0 +1,72 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from sys import argv, exit
|
||||
from string import join
|
||||
from os import access, R_OK
|
||||
from os import system
|
||||
|
||||
gamename='Eressea'
|
||||
|
||||
if(len(argv) >= 3):
|
||||
gamename=argv[2]
|
||||
|
||||
template="""#!/bin/bash
|
||||
#PATH=$PATH:$HOME/bin
|
||||
|
||||
addr=%(email)s
|
||||
[ $# -ge 1 ] && addr=$1
|
||||
[ -z $addr ] || send-%(compression)s-report $addr '%(gamename)s Report #%(turn)s' %(files)s
|
||||
"""
|
||||
|
||||
turn = argv[1]
|
||||
try:
|
||||
infile = file("reports.txt", "r")
|
||||
except:
|
||||
print "%s: reports.txt file does not exist" % (argv[0], )
|
||||
exit(0)
|
||||
|
||||
for line in infile.readlines():
|
||||
settings = line[:-1].split(":")
|
||||
options = { "turn" : turn}
|
||||
options["gamename"] = gamename
|
||||
for setting in settings:
|
||||
try:
|
||||
key, value = setting.split("=")
|
||||
options[key] = value
|
||||
except:
|
||||
print "Invalid input line", line
|
||||
if not options.has_key("reports"):
|
||||
continue
|
||||
reports = options["reports"].split(",")
|
||||
# reports = reports + [ "iso.cr" ]
|
||||
prefix = "%(turn)s-%(faction)s." % options
|
||||
files=[]
|
||||
if options["compression"]=="zip":
|
||||
output = prefix+"zip"
|
||||
files = [output]
|
||||
if (access(output, R_OK)):
|
||||
pass
|
||||
else:
|
||||
parameters = []
|
||||
for extension in reports:
|
||||
filename = "%s%s" % (prefix, extension)
|
||||
if (access(filename, R_OK)):
|
||||
parameters = parameters + [ filename ]
|
||||
system("zip %s -q -m -j -1 %s" % (output, join(parameters," ")))
|
||||
else:
|
||||
for extension in reports:
|
||||
if extension!='':
|
||||
filename = "%s%s" % (prefix, extension)
|
||||
output = "%s%s.bz2" % (prefix, extension)
|
||||
files = files+[output]
|
||||
if access(filename, R_OK):
|
||||
if (access(output, R_OK)):
|
||||
#print output, "exists, skipping"
|
||||
continue
|
||||
system("bzip2 %s" % filename)
|
||||
#print files
|
||||
options["files"] = join(files, " ")
|
||||
batch = file("%s.sh" % options["faction"], "w")
|
||||
batch.write(template % options)
|
||||
batch.close()
|
||||
infile.close()
|
|
@ -0,0 +1,2 @@
|
|||
#/bin/.sh
|
||||
grep -v '>From' | $HOME/src/scripts/bin/orders-accept $*
|
|
@ -0,0 +1,218 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: iso-8859-1 -*-
|
||||
|
||||
from os import unlink, symlink, rename, popen, tmpfile
|
||||
from os.path import exists
|
||||
from re import compile, IGNORECASE
|
||||
from string import split, join, upper, strip
|
||||
from sys import argv, exit
|
||||
from time import sleep, time, ctime
|
||||
from syslog import openlog, closelog, syslog
|
||||
|
||||
from epasswd import EPasswd
|
||||
|
||||
def pwd_get_email(faction, pwd, pwdfile=None):
|
||||
return None
|
||||
|
||||
def splitfilename(filename):
|
||||
from os.path import split
|
||||
return split(filename)
|
||||
|
||||
def unlock_file(filename):
|
||||
try:
|
||||
unlink(filename+".lock")
|
||||
except:
|
||||
print "could not unlock %s.lock, file not found" % filename
|
||||
raise
|
||||
|
||||
def lock_file(filename):
|
||||
i = 0
|
||||
wait = 1
|
||||
if not exists(filename):
|
||||
file=open(filename, "w")
|
||||
file.close()
|
||||
while True:
|
||||
try:
|
||||
symlink(filename, filename+".lock")
|
||||
return
|
||||
except:
|
||||
i = i+1
|
||||
if i == 5:
|
||||
raise
|
||||
sleep(wait)
|
||||
wait = wait*2
|
||||
|
||||
messages = {
|
||||
"subject-de": "Befehle angekommen",
|
||||
"subject-en": "orders received",
|
||||
|
||||
"validate-en": "Validating",
|
||||
"validate-de": "Verarbeite",
|
||||
|
||||
"faction-en": "Faction",
|
||||
"faction-de": "Partei",
|
||||
|
||||
"unknown-de": "WARNUNG: Die Partei ist nicht bekannt, oder das Passwort falsch!",
|
||||
"unknown-en": "WARNING: This faction is unknown, or the password is incorrect!",
|
||||
|
||||
"warning-de": "Warnung",
|
||||
"warning-en": "Warning",
|
||||
|
||||
"error-de": "Fehler",
|
||||
"error-en": "Error",
|
||||
}
|
||||
|
||||
|
||||
# base directory for all your games:
|
||||
rootdir = "/home/eressea/eressea"
|
||||
frommail = "Eressea Server <eressea-server@eressea.de>"
|
||||
orderbase = "orders.dir"
|
||||
sendmail = True
|
||||
maxlines = 25
|
||||
echeck_cmd = "/home/eressea/echeck/echeck.sh"
|
||||
|
||||
# regular expression that finds the start of a faction
|
||||
fact_re = compile("^\s*(eressea|vinyambar|partei|faction)\s+([a-zA-Z0-9]+)\s+\"?([^\"]*)\"?", IGNORECASE)
|
||||
|
||||
def check_pwd(filename, email, pw_data):
|
||||
results = []
|
||||
try:
|
||||
file = open(filename, "r")
|
||||
except:
|
||||
print "could not open file", filename
|
||||
return results
|
||||
for line in file.readlines():
|
||||
mo = fact_re.search(strip(line))
|
||||
if mo != None:
|
||||
fact_nr = str(mo.group(2))
|
||||
fact_pw = str(mo.group(3))
|
||||
if pw_data.fac_exists(fact_nr):
|
||||
if pw_data.check(fact_nr, fact_pw) == 0:
|
||||
game_email = pw_data.get_email(fact_nr)
|
||||
results = results + [ (fact_nr, game_email, False, fact_pw) ]
|
||||
else:
|
||||
game_email = pw_data.get_email(fact_nr)
|
||||
results = results + [ (fact_nr, game_email, True, fact_pw) ]
|
||||
else:
|
||||
results = results + [ (fact_nr, None, False, fact_pw) ]
|
||||
return results
|
||||
|
||||
def echeck(filename, locale, rules):
|
||||
dirname, filename = splitfilename(filename)
|
||||
stream = popen("%s %s %s %s %s" % (echeck_cmd, locale, filename, dirname, rules), 'r')
|
||||
lines = stream.readlines()
|
||||
if len(lines)==0:
|
||||
stream.close()
|
||||
return None
|
||||
if len(lines)>maxlines:
|
||||
mail = join(lines[:maxlines-3] + ["...", "\n"] + lines[-3:], '')
|
||||
else:
|
||||
mail = join(lines[:maxlines], '')
|
||||
stream.close()
|
||||
return mail
|
||||
|
||||
## the main body of the script
|
||||
game = int(argv[1])
|
||||
|
||||
basedir = rootdir + "/game-%d" % (game, )
|
||||
queuename = basedir + "/orders.queue"
|
||||
if not exists(queuename):
|
||||
exit(0)
|
||||
|
||||
# parse the queue file -
|
||||
#print "connecting to SMTP..."
|
||||
from smtplib import SMTP
|
||||
try:
|
||||
server = SMTP("localhost")
|
||||
except:
|
||||
print "could not connect to SMTP server"
|
||||
exit(0)
|
||||
#print "reading password file..."
|
||||
pw_data = EPasswd(basedir + "/passwd")
|
||||
|
||||
#print "reading orders.queue..."
|
||||
# move the queue file to a save space while locking it:
|
||||
try:
|
||||
lock_file(queuename)
|
||||
except:
|
||||
exit(0)
|
||||
queuefile = open(queuename, "r")
|
||||
lines = queuefile.readlines()
|
||||
queuefile.close()
|
||||
|
||||
# copy to a temp file
|
||||
|
||||
tname="/tmp/orders.queue.%s" % str(time())
|
||||
try:
|
||||
lock_file(tname)
|
||||
except:
|
||||
exit(0)
|
||||
tmpfile=open(tname, "w")
|
||||
for line in lines:
|
||||
tmpfile.write(line)
|
||||
tmpfile.close()
|
||||
|
||||
openlog("orders")
|
||||
|
||||
unlink(queuename)
|
||||
try:
|
||||
unlock_file(queuename)
|
||||
except:
|
||||
pass
|
||||
|
||||
for line in lines:
|
||||
tokens = split(line[:-1], ' ')
|
||||
dict = {}
|
||||
for token in tokens:
|
||||
name, value = split(token, '=')
|
||||
dict[name] = value
|
||||
|
||||
email = dict["email"]
|
||||
locale = dict["locale"]
|
||||
game = int(dict["game"])
|
||||
file = dict["file"]
|
||||
gamename='[E%d]' % game
|
||||
rules='e%d' % game
|
||||
warning = ""
|
||||
failed = True
|
||||
results = check_pwd(file, email, pw_data)
|
||||
logfile = open(basedir+"/zug.log", "a")
|
||||
dirname, filename = splitfilename(file)
|
||||
msg = messages["validate-"+locale] + " " + filename + "\n\n"
|
||||
for faction, game_email, success, pwd in results:
|
||||
msg = msg + messages["faction-"+locale] + " " + faction + "\n"
|
||||
if success: failed = False
|
||||
else: msg = msg + messages["unknown-"+locale] + "\n"
|
||||
msg = msg + "\n"
|
||||
logfile.write("%s:%s:%s:%s:%s:%s\n" % (ctime(time()), email, game_email, faction, pwd, success))
|
||||
logfile.close()
|
||||
|
||||
if failed:
|
||||
warning = " (" + messages["warning-" + locale] + ")"
|
||||
syslog("failed - no valid password in " + file)
|
||||
else:
|
||||
result = echeck(file, locale, rules)
|
||||
if email=='eressea':
|
||||
print result
|
||||
continue
|
||||
elif result is None:
|
||||
# echeck did not finish
|
||||
msg = msg + "Echeck was killed. Your turn was accepted, but could not be verified.\n"
|
||||
warning = " (" + messages["warning-" + locale] + ")"
|
||||
syslog("process - echeck got killed, " + file)
|
||||
else:
|
||||
msg = msg + result
|
||||
syslog("process - checked orders in " + file)
|
||||
|
||||
subject = gamename + " " + messages["subject-" + locale] + warning
|
||||
msg = "Subject: %s\nFrom: %s\nTo: %s\nContent-Type: text/plain; charset=utf-8\n\n" % (subject, frommail, email) + msg
|
||||
try:
|
||||
server.sendmail(frommail, email, msg)
|
||||
except:
|
||||
syslog("failed - cannot send to " + email)
|
||||
|
||||
server.close()
|
||||
|
||||
closelog()
|
||||
unlink(tname)
|
||||
unlock_file(tname)
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
## this script processes incoming order files.
|
||||
# files are delivered into an incoming queue by procmail, then cron runs
|
||||
# this here script to make a non-blocking syntax check and reject or
|
||||
# accept the order file.
|
||||
|
||||
for GAME in $*
|
||||
do
|
||||
if [ "$GAME" == "eressea" ]; then GAME=2 ; fi
|
||||
if [ "$GAME" == "e3a" ]; then GAME=3 ; fi
|
||||
if [ -e $HOME/eressea/game-$GAME/orders.queue ]
|
||||
then
|
||||
$HOME/bin/orders-process $GAME
|
||||
fi
|
||||
done
|
|
@ -0,0 +1,35 @@
|
|||
#!/bin/bash
|
||||
if [ -z $ERESSEA ]; then
|
||||
echo "You have to define the \$ERESSEA environment variable to run $0"
|
||||
exit -2
|
||||
fi
|
||||
source $HOME/bin/functions.sh
|
||||
source $ERESSEA/etc/eressea.conf
|
||||
|
||||
TEMPLATE=report-mail.txt
|
||||
if [ "$1" == "-Lde" ]
|
||||
then
|
||||
TEMPLATE=report-mail.de.txt
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ "$1" == "-Lde" ]
|
||||
then
|
||||
TEMPLATE=report-mail.en.txt
|
||||
shift
|
||||
fi
|
||||
|
||||
EMAIL=$1
|
||||
SUBJECT=$2
|
||||
shift 2
|
||||
|
||||
ATTACHMENTS=""
|
||||
while [ $# -gt 0 ]
|
||||
do
|
||||
if [ -e "$1" ]; then
|
||||
ATTACHMENTS="-a $1 $ATTACHMENTS"
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
cat $ERESSEA/etc/$TEMPLATE | mutt -F $ERESSEA/etc/muttrc -s "$SUBJECT" $ATTACHMENTS -- $EMAIL
|
|
@ -0,0 +1,46 @@
|
|||
#!/bin/bash
|
||||
if [ -z $ERESSEA ]; then
|
||||
ERESSEA=`echo $PWD |sed -e 's/\/game.*//'`
|
||||
echo "Assuming that ERESSEA=$ERESSEA"
|
||||
fi
|
||||
if [ ! -f reports.txt ]; then
|
||||
echo "need to run $0 from the report direcory"
|
||||
exit -2
|
||||
fi
|
||||
|
||||
PWD=$(pwd)
|
||||
GAME=$(dirname $PWD)
|
||||
|
||||
TEMPLATE=report-mail.txt
|
||||
if [ "$1" == "-Lde" ]
|
||||
then
|
||||
TEMPLATE=report-mail.de.txt
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ "$1" == "-Len" ]
|
||||
then
|
||||
TEMPLATE=report-mail.en.txt
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ -e $GAME/$TEMPLATE ]; then
|
||||
TEMPLATE=$GAME/$TEMPLATE
|
||||
else
|
||||
TEMPLATE=$ERESSEA/etc/$TEMPLATE
|
||||
fi
|
||||
|
||||
if [ ! -e $TEMPLATE ]; then
|
||||
echo "no such email template: $TEMPLATE"
|
||||
exit -3
|
||||
fi
|
||||
|
||||
while [ -e /tmp/.stopped ] ; do
|
||||
echo "waiting 2 minutes for lockfile in /tmp/.stopped to clear"
|
||||
sleep 120
|
||||
done
|
||||
mutt -F $ERESSEA/etc/muttrc -s "$2" -a "$3" -- $1 < $TEMPLATE
|
||||
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Sending failed for email/report: $2/$3"
|
||||
fi
|
Loading…
Reference in New Issue