#!/bin/sh # Ideas and some parts from the original dgl-create-chroot (by joshk@triplehelix.org, modifications by jilles@stack.nl) # This one by paxed@alt.org, modified by porting@use.startmail.com # # configure dgl with --with-config-file=/path_to_chroot/etc/dgamelaunch.conf, if you want the conf file inside the chroot. # # Same as chroot_path in dgl config file CHROOT="/opt/nethack/nethack.alt.org/" # the user & group from dgamelaunch config file. USRGRP="games:games" # COMPRESS from include/config.h; the compression binary to copy. leave blank to skip. COMPRESSBIN="/usr/bin/gzip" # nethack binary to copy into chroot (leave blank to skip) #NETHACKBIN="/home/paxed/hacking/coding/nethacksource/nethack-3.4.3-nao/nh343/nethack.343-nao" # fixed data to copy (leave blank to skip) #NH_PLAYGROUND_FIXED="/home/paxed/hacking/coding/nethacksource/nethack-3.4.3-nao/nh343/" # HACKDIR from include/config.h; aka nethack subdir inside chroot NHSUBDIR="/nh343/" # VAR_PLAYGROUND from include/unixconf.h NH_VAR_PLAYGROUND="/nh343/var/" # only define this if dgl was configured with --enable-sqlite SQLITE_DBFILE="/dgldir/dgamelaunch.db" # only define this is dgl was configured without --enable-sqlite #PASSWD_FILE="/dgldir/dgl-login" #LOCK_FILE="/dgldir/dgl-lock" # only define this is dgl was configured without --enable-debugfile #DEBUGFILE="/dgldebug.log" # END OF CONFIG ############################################################################## errorexit() { echo "Error: $@" >&2 exit 1 } findlibs() { for i in "$@"; do if [ -z "`ldd "$i" | grep 'not a'`" ]; then if test $(uname -s) == OpenBSD; then echo $(ldd "$i" | awk '{ print $7 }' | egrep -v ^'\(') | cut -d ' ' -f 3- else echo $(ldd "$i" | awk '{ print $3 }' | egrep -v ^'\(') echo $(ldd "$i" | grep 'ld-linux' | awk '{ print $1 }') fi fi done } ############################################################################## if [ -z "$TERMDATA" ]; then SEARCHTERMDATA="/etc/terminfo /usr/share/lib/terminfo /usr/share/terminfo /lib/terminfo" for dir in $SEARCHTERMDATA; do if [ -e "$dir/x/xterm" ]; then TERMDATA="$TERMDATA $dir" fi done if [ -z "$TERMDATA" ]; then errorexit "Couldn't find terminfo definitions. Please specify in 'TERMDATA' variable." fi fi # remove trailing slash, if any CHROOT="`echo ${CHROOT%/}`" set -e umask 022 if [ -e "$CHROOT" ]; then errorexit "Chroot $CHROOT already exists." fi CURDIR="`pwd`" if [ ! -e "$CURDIR/dgamelaunch-openbsd" ]; then errorexit "Cannot find dgamelaunch-openbsd in $CURDIR" fi DGLFILE="dgamelaunch.`date +%Y%m%d`" echo "Setting up chroot in $CHROOT" LIBS="`findlibs dgamelaunch-openbsd`" mkdir -p "$CHROOT" || errorexit "Cannot create chroot" cd "$CHROOT" mkdir dgldir etc lib mail usr bin chown "$USRGRP" dgldir mail cp "$CURDIR/dgamelaunch-openbsd" "$DGLFILE" ln -s "$DGLFILE" dgamelaunch mkdir -p "$CHROOT/dgldir/inprogress-nh343" mkdir -p "$CHROOT/dgldir/userdata" chown "$USRGRP" "$CHROOT/dgldir/inprogress-nh343" chown "$USRGRP" "$CHROOT/dgldir/userdata" if [ -n "$SQLITE_DBFILE" ]; then if [ "x`which sqlite3`" = "x" ]; then errorexit "No sqlite3 found." else echo "Creating SQLite database at $SQLITE_DBFILE" SQLITE_DBFILE="`echo ${SQLITE_DBFILE%/}`" SQLITE_DBFILE="`echo ${SQLITE_DBFILE#/}`" sqlite3 "$CHROOT/$SQLITE_DBFILE" "create table dglusers (id integer primary key, username text, email text, env text, password text, flags integer);" chown "$USRGRP" "$CHROOT/$SQLITE_DBFILE" chmod 0700 "$CHROOT/$SQLITE_DBFILE" fi fi if [ -n "$PASSWD_FILE" ]; then echo "Creating password file at $PASSWD_FILE" touch "$CHROOT/$PASSWD_FILE" chown "$USRGRP" "$CHROOT/$PASSWD_FILE" chmod 0700 "$CHROOT/$PASSWD_FILE" fi if [ -n "$LOCK_FILE" ]; then echo "Creating lockfile at $LOCK_FILE" touch "$CHROOT/$LOCK_FILE" chown "$USRGRP" "$CHROOT/$LOCK_FILE" chmod 0700 "$CHROOT/$LOCK_FILE" fi if [ -n "$DEBUGFILE" ]; then echo "Creating debugfile at $DEBUGFILE" touch "$CHROOT/$DEBUGFILE" chown "$USRGRP" "$CHROOT/$DEBUGFILE" chmod 0700 "$CHROOT/$DEBUGFILE" fi if [ -n "$COMPRESSBIN" -a -e "`which $COMPRESSBIN`" ]; then COMPRESSDIR="`dirname $COMPRESSBIN`" COMPRESSDIR="`echo ${COMPRESSDIR%/}`" COMPRESSDIR="`echo ${COMPRESSDIR#/}`" echo "Copying $COMPRESSBIN to $COMPRESSDIR" mkdir -p "$COMPRESSDIR" cp "`which $COMPRESSBIN`" "$COMPRESSDIR/" LIBS="$LIBS `findlibs $COMPRESSBIN`" fi mkdir -p dev cd dev if test $(uname -s) == OpenBSD; then mknod urandom c 45 0 else mknod urandom c 1 9 fi cd .. cd etc cp "$CURDIR/examples/dgamelaunch.conf" . echo "Edit $CHROOT/etc/dgamelaunch.conf to suit your needs." [ -f /etc/localtime ] && cp /etc/localtime . cd .. cd bin cp "$CURDIR/ee" . cp "$CURDIR/virus" . echo "Copied text editors 'ee' and 'virus' to chroot." cd .. cp "$CURDIR/examples/dgl_menu_main_anon.txt" . cp "$CURDIR/examples/dgl_menu_main_user.txt" . cp "$CURDIR/examples/dgl_menu_watchmenu_help.txt" . cp "$CURDIR/examples/dgl-banner" . cp "$CURDIR/dgl-default-rcfile" "dgl-default-rcfile.nh343" chmod go+r dgl_menu_main_anon.txt dgl_menu_main_user.txt dgl-banner dgl-default-rcfile.nh343 NHSUBDIR="`echo ${NHSUBDIR%/}`" NHSUBDIR="`echo ${NHSUBDIR#/}`" mkdir "$CHROOT/$NHSUBDIR" if [ -n "$NETHACKBIN" -a ! -e "$NETHACKBIN" ]; then errorexit "Cannot find NetHack binary $NETHACKBIN" fi if [ -n "$NETHACKBIN" -a -e "$NETHACKBIN" ]; then echo "Copying $NETHACKBIN" cd "$NHSUBDIR" NHBINFILE="`basename $NETHACKBIN`.`date +%Y%m%d`" cp "$NETHACKBIN" "$NHBINFILE" ln -s "$NHBINFILE" nethack LIBS="$LIBS `findlibs $NETHACKBIN`" cd "$CHROOT" fi NH_PLAYGROUND_FIXED="`echo ${NH_PLAYGROUND_FIXED%/}`" if [ -n "$NH_PLAYGROUND_FIXED" -a -d "$NH_PLAYGROUND_FIXED" ]; then echo "Copying NetHack playground stuff." NHFILES="*.lev *.dat cmdhelp data dungeon help hh history license opthelp options oracles recover rumors wizhelp" for fil in $NHFILES; do cp $NH_PLAYGROUND_FIXED/$fil "$CHROOT/$NHSUBDIR/" done fi NH_VAR_PLAYGROUND="`echo ${NH_VAR_PLAYGROUND%/}`" NH_VAR_PLAYGROUND="`echo ${NH_VAR_PLAYGROUND#/}`" echo "Creating NetHack variable dir stuff." if [ -n "$NH_VAR_PLAYGROUND" ]; then mkdir -p "$CHROOT/$NH_VAR_PLAYGROUND" chown -R "$USRGRP" "$CHROOT/$NH_VAR_PLAYGROUND" fi mkdir -p "$CHROOT/$NH_VAR_PLAYGROUND/save" chown -R "$USRGRP" "$CHROOT/$NH_VAR_PLAYGROUND/save" touch "$CHROOT/$NH_VAR_PLAYGROUND/logfile" touch "$CHROOT/$NH_VAR_PLAYGROUND/perm" touch "$CHROOT/$NH_VAR_PLAYGROUND/record" touch "$CHROOT/$NH_VAR_PLAYGROUND/xlogfile" chown -R "$USRGRP" "$CHROOT/$NHSUBDIR" chown -R "$USRGRP" "$CHROOT/$NH_VAR_PLAYGROUND" # Curses junk if [ -n "$TERMDATA" ]; then echo "Copying termdata files from $TERMDATA" for termdat in $TERMDATA; do mkdir -p "$CHROOT`dirname $termdat`" if [ -d $termdat/. ]; then cp -LR $termdat/. $CHROOT$termdat else cp $termdat $CHROOT`dirname $termdat` fi done fi LIBS=`for lib in $LIBS; do echo $lib; done | sort | uniq` echo "Copying libraries:" $LIBS for lib in $LIBS; do mkdir -p "$CHROOT`dirname $lib`" cp $lib "$CHROOT$lib" done echo "Finished."