Docker image which provides a full Eressea installation to host a local game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

573 lines
19 KiB

3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
  1. #!/bin/bash
  2. base_dir="$(dirname "$0")"
  3. # -------------------
  4. # -- Helper functions
  5. function ini_sec() {
  6. /eressea/server/bin/inifile /data/game-1/eressea.ini add $1
  7. }
  8. function ini_add() {
  9. /eressea/server/bin/inifile /data/game-1/eressea.ini add $1:$2 $3
  10. }
  11. function ini_get() {
  12. /eressea/server/bin/inifile /data/game-1/eressea.ini get $1:$2
  13. }
  14. function get_turn() {
  15. turn=0
  16. [ -e /data/game-1/turn ] && turn=$(cat /data/game-1/turn)
  17. [ -z $turn ] && turn=0
  18. }
  19. # -----------------
  20. # -- Main-commands
  21. cmd_help() {
  22. usage() {
  23. echo ""
  24. echo "Usage: $0 COMMAND [-h] [arguments]"
  25. echo ""
  26. echo "supported COMMANDs:"
  27. echo " addpwd adds password in newfactions"
  28. echo " bash start a bash shell"
  29. echo " generate generate eressea.ini and all relevant files"
  30. echo " help show this help"
  31. echo " mail process incoming e-mail"
  32. echo " map generate/edit game map"
  33. echo " run execute Eressea game turn"
  34. echo " shutdown remove temporaray Eressea environment"
  35. echo " startup create temporaray Eressea environment which is necessary for scripts"
  36. echo ""
  37. echo "arguments:"
  38. echo "-h ... show more details of command"
  39. exit 2
  40. }
  41. usage
  42. }
  43. cmd_bash() {
  44. usage() {
  45. [ -n "$1" ] && echo -e "\n$1"
  46. echo ""
  47. echo "Starts an interactive bash shell."
  48. echo "Usage: $0 bash [-h] [-n]"
  49. echo "-h ... show this help"
  50. echo "-n ... start a 'naked' bash, which means eressea is not setup"
  51. echo " can be done later by invoking '/eressea/start.sh startup'"
  52. echo " before you exit the shell, call '/eressea/start.sh shutdown'"
  53. exit 2
  54. }
  55. args=$(getopt --name shutdown -o hn -- "$@")
  56. if [ $? != 0 ]; then
  57. usage
  58. exit
  59. fi
  60. eval set -- "$args"
  61. naked=0
  62. while :; do
  63. case "$1" in
  64. -h) usage ; shift ;;
  65. -n) naked=1; shift ;;
  66. --) shift ; break ;;
  67. esac
  68. done
  69. [ ${naked} == 0 ] && cmd_startup || echo "started bash without any Eressea environment setup"
  70. /bin/bash
  71. [ ${naked} == 0 ] && cmd_shutdown
  72. }
  73. cmd_startup() {
  74. usage() {
  75. [ -n "$1" ] && echo -e "\n$1"
  76. echo ""
  77. echo "Setup an environment which enables Eressea to find a runtime environment where all scripts are functional."
  78. echo "Usage: $0 startup [-h]"
  79. echo "-h ... show this help"
  80. exit 2
  81. }
  82. args=$(getopt --name shutdown -o h -- "$@")
  83. if [ $? != 0 ]; then
  84. usage
  85. exit
  86. fi
  87. eval set -- "$args"
  88. while :; do
  89. case "$1" in
  90. -h) usage ; shift ;;
  91. --) shift ; break ;;
  92. esac
  93. done
  94. mkdir -p /data/config
  95. mkdir -p /data/log
  96. ln -sf /data/config/muttrc ~/.muttrc
  97. ln -sf /data/config/fetchmailrc ~/.fetchmailrc
  98. ln -sf /data/config/procmailrc ~/.procmailrc
  99. ln -sf /eressea/server /data/server
  100. ln -sf /eressea/orders-php /data/orders-php
  101. mkdir -p /data/game-1
  102. mkdir -p /data/game-1/backup
  103. ln -sf /eressea/server/scripts/config.lua /data/game-1/config.lua
  104. ln -sf /eressea/server/bin/eressea /data/game-1/eressea
  105. ln -sf /eressea/server/scripts/reports.lua /data/game-1/reports.lua
  106. ln -sf /eressea/server/scripts/run-turn.lua /data/game-1/run-turn.lua
  107. mkdir -p /eressea/server/etc
  108. [ -e /eressea/server/etc/report-mail.de.txt ] && rm -f /eressea/server/etc/report-mail.de.txt
  109. [ -e /eressea/server/etc/report-mail.en.txt ] && rm -f /eressea/server/etc/report-mail.en.txt
  110. [ -e /eressea/server/etc/report-mail.txt ] && rm -f /eressea/server/etc/report-mail.txt
  111. ln -sf /data/config/report-mail.de.txt /eressea/server/etc/report-mail.de.txt
  112. ln -sf /data/config/report-mail.en.txt /eressea/server/etc/report-mail.en.txt
  113. ln -sf /data/config/report-mail.de.txt /eressea/server/etc/report-mail.txt
  114. cd /data/game-1
  115. echo "Eressea environment setup complete"
  116. }
  117. cmd_shutdown() {
  118. usage() {
  119. [ -n "$1" ] && echo -e "\n$1"
  120. echo ""
  121. echo "Removes temporary Eressea environment from mapped /data folder."
  122. echo "Usage: $0 shutdown [-h]"
  123. echo "-h ... show this help"
  124. exit 2
  125. }
  126. args=$(getopt --name shutdown -o h -- "$@")
  127. if [ $? != 0 ]; then
  128. usage
  129. exit
  130. fi
  131. eval set -- "$args"
  132. while :; do
  133. case "$1" in
  134. -h) usage ; shift ;;
  135. --) shift ; break ;;
  136. esac
  137. done
  138. [ -e /data/game-1/config.lua ] && rm /data/game-1/config.lua
  139. [ -e /data/game-1/eressea ] && rm /data/game-1/eressea
  140. [ -e /data/game-1/reports.lua ] && rm /data/game-1/reports.lua
  141. [ -e /data/game-1/run-turn.lua ] && rm /data/game-1/run-turn.lua
  142. [ -e /data/server ] && rm /data/server
  143. [ -e /data/orders-php ] && rm /data/orders-php
  144. [ -e ~/.muttrc ] && rm -f ~/.muttrc
  145. [ -e ~/.fetchmailrc ] && rm -f ~/.fetchmailrc
  146. [ -e ~/.procmailrc ] && rm -f ~/.procmailrc
  147. [ -e /data/config/logrotate ] && logrotate /data/config/logrotate
  148. echo "Eressea environment successfully removed"
  149. }
  150. cmd_generate() {
  151. usage() {
  152. [ -n "$1" ] && echo -e "\n$1"
  153. echo ""
  154. echo "Generates eressea.ini file and all other necessary files/folders needed by this Docker container."
  155. echo "Usage: $0 generate [options]"
  156. echo ""
  157. echo "General option:"
  158. echo "-f force generating of files - delete will be done without prompt!"
  159. echo "-g generate all other necessary files and folders (values are defined by eressea.ini and mail.ini)"
  160. echo "-h show this help"
  161. echo "-i generate eressea.ini and mail.ini file"
  162. echo ""
  163. echo "If eressea.ini is not available, option -i is mandatory. All of the following options are also necessray:"
  164. echo " --from <email> e-mail address Eressea postbox"
  165. echo " --imap_server <addr> IMAP server address. If not provided, value of smtp_server is used."
  166. echo " --imap_user <user> user for IMAP server. If not provided, value of smtp_user is used."
  167. echo " --imap_pass <password> password of IMAP user. If not provided, value of smtp_pass is used."
  168. echo " --smtp_server <addr> SMTP server address. If not provided, value of imap_server is used."
  169. echo " --smtp_user <user> user for SMTP server. If not provided, value of imap_user is used."
  170. echo " --smtp_pass <password> password of SMTP user. If not provided, value of imap_pass is used."
  171. echo ""
  172. echo " Optional:"
  173. echo " --game_name <name> name of self hosted Eressea game. Default=MyEressea"
  174. echo " --realname name> real name used for e-Mails. Default=Game Server <game_name>"
  175. echo " --smtp_port <port> port of SMTP server, Default=587"
  176. echo " --imap_port <port> port of IMAP server, Default=993"
  177. echo " --rules <ruleset> ruleset, Defaule=e3"
  178. exit 2
  179. }
  180. args=$(getopt --name generate -o fghi --long game_name:,from:,realname:,smtp_server:,smtp_port:,smtp_user:,smtp_pass:,imap_server:,imap_port:,imap_user:,imap_pass:,rules: -- "$@")
  181. if [ $? != 0 ]; then
  182. usage
  183. exit
  184. fi
  185. eval set -- "$args"
  186. force=0
  187. do_gen=0
  188. do_ini=0
  189. game_name="MyEressea"
  190. imap_port=993
  191. smtp_port=587
  192. rules="e3"
  193. while :; do
  194. case "$1" in
  195. -f) force=1 ; shift ;;
  196. -g) do_gen=1 ; shift ;;
  197. -h) usage ; shift ;;
  198. -i) do_ini=1 ; shift ;;
  199. --game_name) game_name="$2" ; shift 2 ;;
  200. --from) from="$2" ; shift 2 ;;
  201. --realname) realname="$2" ; shift 2 ;;
  202. --smtp_server) smtp_server="$2" ; shift 2 ;;
  203. --smtp_port) smtp_port="$2" ; shift 2 ;;
  204. --smtp_user) smtp_user="$2" ; shift 2 ;;
  205. --smtp_pass) smtp_pass="$2" ; shift 2 ;;
  206. --imap_server) imap_server="$2" ; shift 2 ;;
  207. --imap_port) imap_port="$2" ; shift 2 ;;
  208. --imap_user) imap_user="$2" ; shift 2 ;;
  209. --imap_pass) imap_pass="$2" ; shift 2 ;;
  210. --rules) rules="$2" ; shift 2 ;;
  211. --) shift ; break ;;
  212. esac
  213. done
  214. if [ $do_ini == 1 ]; then
  215. mkdir -p /data/game-1
  216. [ -e /data/game-1/eressea.ini ] && [ $force == 0 ] && usage "eressea.ini already exists. Add option -f"
  217. [ -z "$imap_server" ] && [ -n "$smtp_server" ] && imap_server=$smtp_server
  218. [ -z "$imap_user" ] && [ -n "$smtp_user" ] && imap_user=$smtp_user
  219. [ -z "$imap_pass" ] && [ -n "$smtp_pass" ] && imap_pass=$smtp_pass
  220. [ -z "$smtp_server" ] && [ -n "$imap_server" ] && smtp_server=$imap_server
  221. [ -z "$smtp_user" ] && [ -n "$imap_user" ] && smtp_user=$imap_user
  222. [ -z "$smtp_pass" ] && [ -n "$imap_pass" ] && smtp_pass=$imap_pass
  223. [ -z "$realname" ] && realname="Game Server ${game_name}"
  224. [ -z "$game_name" ] || [ -z "$from" ] || [ -z "$realname" ] || [ -z "$rules" ] || \
  225. [ -z "$smtp_server" ] || [ -z "$smtp_port" ] || [ -z "$smtp_user" ] || [ -z "$smtp_pass" ] || \
  226. [ -z "$imap_server" ] || [ -z "$imap_port" ] || [ -z "$imap_user" ] || [ -z "$imap_pass" ] && \
  227. usage "not all options relevant for eressea.ini were provided"
  228. [ -e /data/game-1/eressea.ini ] && rm -f /data/game-1/eressea.ini
  229. touch /data/game-1/eressea.ini
  230. ini_sec game
  231. ini_add game locales de,en
  232. ini_add game id 1
  233. ini_add game start 0
  234. ini_add game email $from
  235. ini_add game name $game_name
  236. ini_add game seed `shuf -i 0-9999 -n1`
  237. ini_add game dbname eressea.db
  238. ini_add game dbswap :memory:
  239. ini_add game mailcmd `echo "print '$game_name'.upper()" | python`
  240. ini_sec lua
  241. ini_add lua install /data/server
  242. ini_add lua paths /data/server/scripts:/data/server/lunit
  243. ini_add lua rules $rules
  244. echo "eressea.ini generated"
  245. [ -e /data/config/mail.ini ] && rm -f /data/config/mail.ini
  246. mkdir -p /data/config
  247. echo "[smtp]" > /data/config/mail.ini
  248. echo "server = $smtp_server" >> /data/config/mail.ini
  249. echo "port = $smtp_port" >> /data/config/mail.ini
  250. echo "user = $smtp_user" >> /data/config/mail.ini
  251. echo "pass = $smtp_pass" >> /data/config/mail.ini
  252. echo "[imap]" >> /data/config/mail.ini
  253. echo "server = $imap_server" >> /data/config/mail.ini
  254. echo "port = $imap_port" >> /data/config/mail.ini
  255. echo "user = $imap_user" >> /data/config/mail.ini
  256. echo "pass = $imap_pass" >> /data/config/mail.ini
  257. echo "[general]" >> /data/config/mail.ini
  258. echo "realname = $realname" >> /data/config/mail.ini
  259. echo "mail.ini generated"
  260. fi
  261. if [ $do_gen == 1 ]; then
  262. [ ! -e /data/game-1/eressea.ini ] && usage "eressea.ini missing. Use option -i"
  263. if [ $force == 1 ]; then
  264. echo "existing game data deleted"
  265. for node in /data/game-1/*
  266. do
  267. [ $node == "/data/game-1/eressea.ini" ] && continue
  268. [ -d $node ] && rm -rf $node || rm -f $node
  269. done;
  270. else
  271. echo "existing game data is not touched. Missing files are recreated"
  272. fi
  273. mkdir -p /data/config
  274. tmpfile=$(mktemp ini.XXX)
  275. cat /data/game-1/eressea.ini > $tmpfile
  276. cat /data/config/mail.ini >> $tmpfile
  277. [ -e /data/config/fetchmailrc ] && [ $force == 1 ] && rm -f /data/config/fetchmailrc
  278. [ ! -e /data/config/fetchmailrc ] && j2 -f ini /eressea/template-config/fetchmailrc $tmpfile > /data/config/fetchmailrc
  279. chmod 700 /data/config/fetchmailrc
  280. [ -e /data/config/procmailrc ] && [ $force == 1 ] && rm -f /data/config/procmailrc
  281. [ ! -e /data/config/procmailrc ] && j2 -f ini /eressea/template-config/procmailrc $tmpfile > /data/config/procmailrc
  282. [ -e /data/config/muttrc ] && [ $force == 1 ] && rm -f /data/config/muttrc
  283. [ ! -e /data/config/muttrc ] && j2 -f ini /eressea/template-config/muttrc $tmpfile > /data/config/muttrc
  284. [ -e /data/config/logrotate ] && [ $force == 1 ] && rm -f /data/config/logrotate
  285. [ ! -e /data/config/logrotate ] && cp /eressea/template-config/logrotate /data/config/logrotate
  286. [ -e /data/config/report-mail.de.txt ] && [ $force == 1 ] && rm -f /data/config/report-mail.de.txt
  287. [ ! -e /data/config/report-mail.de.txt ] && cp /eressea/template-mail/report-mail.de.txt /data/config/report-mail.de.txt
  288. [ -e /data/config/report-mail.en.txt ] && [ $force == 1 ] && rm -f /data/config/report-mail.en.txt
  289. [ ! -e /data/config/report-mail.en.txt ] && cp /eressea/template-mail/report-mail.en.txt /data/config/report-mail.en.txt
  290. rm -f $tmpfile
  291. mkdir -p /data/mail/cache
  292. mkdir -p /data/mail/postbox/inbox/{cur,new,tmp}
  293. mkdir -p /data/mail/postbox/sent/{cur,new,tmp}
  294. mkdir -p /data/mail/postbox/draft/{cur,new,tmp}
  295. mkdir -p /data/mail/certificates
  296. mkdir -p /data/game-1/data
  297. mkdir -p /data/game-1/reports
  298. mkdir -p /data/game-1/backup
  299. [ ! -e /data/game-1/newfactions ] && touch /data/game-1/newfactions
  300. [ ! -e /data/game-1/turn ] && echo 0 > /data/game-1/turn
  301. echo "all basic game files generated"
  302. echo "next step would be to create a new game file / map; therefore use '$0 map -h'"
  303. fi
  304. [ $do_gen == 0 ] && [ $do_ini == 0 ] && usage "nothing to generate. Use option -i or -g"
  305. }
  306. cmd_map() {
  307. usage() {
  308. [ -n "$1" ] && echo -e "\n$1"
  309. echo ""
  310. echo "Generate or edit Eressea map."
  311. echo "Usage: $0 map [options]"
  312. echo "-h ... show this help"
  313. echo "-n ... generate new map. If map already exists, it will be overwritten!"
  314. echo "-w ... width of new map - only relevant together with -n"
  315. echo "-e ... height of new map - only relevant together with -n"
  316. echo "-t ... turn"
  317. echo "-s ... save map when editor is closed"
  318. exit 2
  319. }
  320. args=$(getopt --name shutdown -o hnw:e:t:s -- "$@")
  321. if [ $? != 0 ]; then
  322. usage
  323. exit
  324. fi
  325. eval set -- "$args"
  326. create_new=0
  327. export ERESSEA_MAP_WIDTH=60
  328. export ERESSEA_MAP_HEIGHT=40
  329. get_turn
  330. save=0
  331. while :; do
  332. case "$1" in
  333. -h) usage ; shift ;;
  334. -n) create_new=1 ; shift ;;
  335. -w) ERESSEA_MAP_WIDTH=$2 ; shift 2 ;;
  336. -e) ERESSEA_MAP_HEIGHT=$2; shift 2 ;;
  337. -t) turn=$2 ; shift 2 ;;
  338. -s) save=1 ; shift ;;
  339. --) shift ; break ;;
  340. esac
  341. done
  342. cmd_startup
  343. if [ $create_new == 1 ]; then
  344. ini_sec game
  345. ini_add game seed `shuf -i 0-9999 -n1`
  346. ./eressea -v 0 -t $turn /eressea/lua-scripts/newgame.lua
  347. echo "created new game map with size ${ERESSEA_MAP_WIDTH}x${ERESSEA_MAP_HEIGHT}"
  348. fi
  349. if [ $save == 1 ]; then
  350. ./eressea -v 0 -t $turn /eressea/lua-scripts/modifymap.lua
  351. else
  352. ./eressea -v 0 -t $turn /data/server/scripts/map.lua
  353. fi
  354. cmd_shutdown
  355. }
  356. cmd_addpwd() {
  357. usage() {
  358. [ -n "$1" ] && echo -e "\n$1"
  359. echo ""
  360. echo "In file 'newfactions' on lines without password a secure one is generated and inserted."
  361. echo "Usage: $0 addpwd [options]"
  362. echo "-f ... force usage of new password"
  363. echo "-h ... show this help"
  364. exit 2
  365. }
  366. args=$(getopt --name shutdown -o hf -- "$@")
  367. if [ $? != 0 ]; then
  368. usage
  369. exit
  370. fi
  371. eval set -- "$args"
  372. force=0
  373. while :; do
  374. case "$1" in
  375. -h) usage ; shift ;;
  376. -f) force=1; shift ;;
  377. --) shift ; break ;;
  378. esac
  379. done
  380. [ ! -e "/data/game-1/newfactions" ] && echo "file newfactions does not exist" && exit
  381. tmpfile=$(mktemp newfactions.XXX)
  382. touch $tmpfile
  383. while IFS=" " read -r email race language pass alliance
  384. do
  385. [ -z "$email" ] && continue
  386. echo "found player $email ($race), language $language`[ -n "$alliance" ] && echo " in alliance with $alliance"`"
  387. if [ -z "$pass" ] || [ $force == 1 ]; then
  388. new_pass="`pwgen -c -n -y 8 1`"
  389. echo " new password $new_pass`[ -n "$pass" ] && echo " replaces former password $pass"`"
  390. else
  391. new_pass=$pass
  392. echo " uses password $pass"
  393. fi
  394. echo "$email $race $language $new_pass`[ -n "$alliance" ] && echo " $alliance"`" >> $tmpfile
  395. done < /data/game-1/newfactions
  396. rm -f /data/game-1/newfactions
  397. mv $tmpfile /data/game-1/newfactions
  398. }
  399. cmd_mail() {
  400. usage() {
  401. [ -n "$1" ] && echo -e "\n$1"
  402. echo ""
  403. echo "Process incoming e-mails"
  404. echo "Usage: $0 mail [options]"
  405. echo "-c ... check orders and send email to player"
  406. echo "-f ... fetch mail from server and pre-process them"
  407. echo "-h ... show this help"
  408. exit 2
  409. }
  410. args=$(getopt --name shutdown -o hcf -- "$@")
  411. if [ $? != 0 ]; then
  412. usage
  413. exit
  414. fi
  415. eval set -- "$args"
  416. fetch=0
  417. check=0
  418. while :; do
  419. case "$1" in
  420. -f) fetch=1; shift ;;
  421. -c) check=1; shift ;;
  422. -h) usage ; shift ;;
  423. --) shift ; break ;;
  424. esac
  425. done
  426. [ $(expr $fetch + $check) == 0 ] && usage "either option -f or -c is necessary"
  427. cmd_startup
  428. if [ $fetch == 1 ]; then
  429. touch /data/log/fetchmail.log
  430. fetchmail >> /data/log/fetchmail.log 2>&1
  431. fi
  432. if [ $check == 1 ]; then
  433. mkdir -p /data/game-1/orders.dir
  434. rules="$(ini_get lua rules)"
  435. /data/orders-php/check-orders.sh 1 $rules
  436. fi
  437. cmd_shutdown
  438. }
  439. cmd_run() {
  440. usage() {
  441. [ -n "$1" ] && echo -e "\n$1"
  442. echo ""
  443. echo "Execute next game turn"
  444. echo "Usage: $0 rung [options]"
  445. echo "-h ... show this help"
  446. exit 2
  447. }
  448. args=$(getopt --name shutdown -o h -- "$@")
  449. if [ $? != 0 ]; then
  450. usage
  451. exit
  452. fi
  453. eval set -- "$args"
  454. while :; do
  455. case "$1" in
  456. -h) usage ; shift ;;
  457. --) shift ; break ;;
  458. esac
  459. done
  460. cmd_startup
  461. mkdir -p $HOME/log
  462. mkdir -p /data/game-1/orders.dir
  463. touch /data/log/eressea.cron.log
  464. ln -sf /data/log/eressea.cron.log $HOME/log/eressea.cron.log
  465. get_turn
  466. enable_empty_orders="no"
  467. [ "$turn" == "0" ] && enable_empty_orders="yes"
  468. /eressea/run-eressea.sh 1
  469. cmd_shutdown
  470. }
  471. # ----------------
  472. # -- Main function
  473. COMMAND="$1"
  474. shift
  475. case $COMMAND in
  476. "help" | "startup" | "shutdown" | "bash" | "generate" | "map" | "addpwd" | "mail" | "run") eval cmd_$COMMAND "$@" ;;
  477. *) cmd_help ;;
  478. esac