247 lines
9.1 KiB
Plaintext
247 lines
9.1 KiB
Plaintext
dgamelaunch
|
|
===========
|
|
|
|
dgamelaunch is a network-based game shell where anyone can sign up for an
|
|
account and start playing any game which suits your fancy - games known to
|
|
work with dgamelaunch are for example NetHack (http://www.nethack.org) and
|
|
Crawl (http://crawl.develz.org).
|
|
|
|
|
|
DGAMELAUNCH VERSIONS
|
|
====================
|
|
|
|
Development version can be fetched from the source repository with git:
|
|
|
|
git clone git://github.com/paxed/dgamelaunch.git
|
|
|
|
Releases are downloadable at http://alt.org/nethack/dgamelaunch/
|
|
|
|
|
|
REQUIREMENTS
|
|
============
|
|
|
|
- normal development tools (make, etc)
|
|
- autotools (autogen, autoconf, automake)
|
|
- ncurses library and development files
|
|
- bison (or yacc or byacc)
|
|
- flex (or lex)
|
|
- optionally sqlite3 library and development files
|
|
|
|
|
|
COMPILING
|
|
=========
|
|
|
|
Basically all you have to do is:
|
|
|
|
./autogen.sh && make
|
|
|
|
Some options you might want give to autogen:
|
|
|
|
--with-config-file=/absolute/path/to/dgamelaunch.config
|
|
--enable-shmem
|
|
--enable-sqlite
|
|
|
|
|
|
Dgamelaunch should compile without issue on Linux, Solaris, FreeBSD 4 and 5.
|
|
(Whether it _runs_ on all of these platforms is a different issue. We'd
|
|
like to hear about it.)
|
|
|
|
dgamelaunch was originally developed by M. Drew Streib <dtype@dtype.org> but
|
|
is now a collaborative project. Copyright and contact information is in the
|
|
COPYING file, included with this package.
|
|
|
|
|
|
BASIC SETUP INSTRUCTIONS
|
|
========================
|
|
|
|
These instructions are not current. For a more up-to-date ones, see
|
|
http://nethackwiki.com/wiki/User:Paxed/HowTo_setup_dgamelaunch
|
|
|
|
|
|
|
|
|
|
1) Setup a chroot jail. There is a helpful script included to accomplish this,
|
|
called dgl-create-chroot, in the source directory. The default settings are
|
|
viewable by editing the script; to customize the installation, look at
|
|
dgl-create-chroot.conf.example.* (also in the source directory) and edit it to
|
|
suit your needs, and save it into the same directory as dgl-create-chroot as
|
|
dgl-create-chroot.conf. It's very likely you need to run the script as root.
|
|
The script will not work with the very limited System V /bin/sh, such found on
|
|
Solaris; start it with ksh instead.
|
|
|
|
If you decide to not use dgl-create-chroot, you're on your own and we assume
|
|
you have enough clue to figure out exactly what's needed for the chroot to
|
|
operate correctly.
|
|
|
|
2) Compile nethack. Make sure the directories in the chroot match up with
|
|
where nethack thinks everything is. You may need to edit the VAR_PLAYGROUND
|
|
variable in include/unixconf.h and/or the HACKDIR variable in include/config.h.
|
|
|
|
(Note: Try not to, for security, to put anything else in the chroot. You may
|
|
need to put gzip in there though if you compile nethack to use it for
|
|
compression.)
|
|
|
|
3) Make a copy of dgamelaunch.conf and edit it. This will contain information
|
|
for dgamelaunch about what uid/username, gid/group to shed privileges to at
|
|
runtime. It must also contain the path to nethack, and needs to know certain
|
|
aspects of your chroot.
|
|
|
|
Note that using a username in dgamelaunch.conf will cause (part of) your
|
|
passwd database to be loaded into dgamelaunch's memory space. If you use BSD,
|
|
this will also include encrypted passwords. Therefore, it's recommended to
|
|
put the uid in the dgamelaunch.conf. The same applies to groups, but openpty(3)
|
|
often looks up the tty group anyway.
|
|
|
|
4) Setup dgamelaunch as one of the following:
|
|
a) The shell for a single login.
|
|
b) An (x)inetd service.
|
|
|
|
If you choose a login shell make sure dgamelaunch is setuid root. (that is,
|
|
chmod 4755 dgamelaunch.) It will shed privs right after entering the chroot
|
|
jail though.
|
|
|
|
Example xinetd lines:
|
|
|
|
service telnet
|
|
{
|
|
socket_type = stream
|
|
protocol = tcp
|
|
wait = no
|
|
user = root
|
|
server = /usr/sbin/in.telnetd
|
|
server_args = -h -L /opt/nethack/nethack.dtype.org/dgamelaunch -q -f /etc/dgamelaunch.conf
|
|
rlimit_cpu = 3600
|
|
bind = 64.71.163.206
|
|
}
|
|
|
|
A classic inetd line would look like this:
|
|
|
|
telnet stream tcp nowait root.root /usr/sbin/tcpd /usr/sbin/in.telnetd -h -L /usr/sbin/dgamelaunch -q -f /etc/dgamelaunch.conf
|
|
|
|
In both cases, the -L specifies an alternate login program (telnetlogin is
|
|
invoked by default) and -h prevents revealing of a login banner (for
|
|
example, "Debian GNU/Linux testing/unstable influx") before starting the
|
|
login shell.
|
|
|
|
It goes without saying that the argument after -L must point to dgamelaunch's
|
|
exact location. Also, the location of dgamelaunch.conf is variable and of
|
|
course should be customized by you.
|
|
|
|
NOTE: It appears that the -L option is not very widely supported. FreeBSD's
|
|
telnetd uses -p instead, and you can't give arguments (arguments appropriate
|
|
to standard login are used). Some other telnetds do not support anything
|
|
like this at all.
|
|
|
|
The -f option, followed by a filename, specifies the path to the config file
|
|
to use for dgamelaunch. If you specify the right path for DEFCONFIG in the
|
|
Makefile, you may be able to omit this.
|
|
|
|
For dgamelaunch, the -q option will silence errors pertaining to the server
|
|
configuration. This is recommended for use within inetd to prevent spamming
|
|
the clients, but when testing and setting up we strongly suggest you leave it
|
|
off until running dgamelaunch produces no error output on stderr.
|
|
|
|
5) Test your compilation of dgamelaunch by running it as root. If this
|
|
works, a shell login or (x)inetd will work with the correct configuration.
|
|
If you have problems with dgamelaunch's display make sure that your chroot's
|
|
/etc/terminfo directory (or whatever directory your ncurses uses) is
|
|
populated.
|
|
|
|
|
|
COMMANDLINE PARAMETERS
|
|
======================
|
|
|
|
-a Ignored.
|
|
-c Shows error message and exits. (login shell command)
|
|
-e Ignored.
|
|
-h Ignored.
|
|
-i user Autologin and run the register -command hook for "user"
|
|
(with password "user").
|
|
-p Ignored.
|
|
-q Be quiet, suppress errors.
|
|
-s Show players currently playing.
|
|
-W user:msg Send message "msg" to all players. The message seems
|
|
to come from "user".
|
|
-S Free the shared memory block.
|
|
-D Show contents of the shared memory block.
|
|
|
|
|
|
ENVIRONMENT VARIABLES
|
|
=====================
|
|
|
|
Linux telnetd allows importing the USER environment variables via telnet,
|
|
while FreeBSD does not. FreeBSD, on the other hand, does allow the LOGNAME
|
|
environment variable. Dgamelaunch will first check USER, then LOGNAME,
|
|
for "username:password", and tries autologin if either exists.
|
|
Dgamelaunch-specific DGLAUTH is checked before either of those.
|
|
|
|
|
|
ERROR CODES
|
|
===========
|
|
|
|
1 Could not terminate stale processes
|
|
2 Cannot chroot()
|
|
3 Cannot chdir()
|
|
4 Cannot setgroups()
|
|
5 Cannot setgid()
|
|
6 Cannot setuid()
|
|
7 Caught HUP
|
|
8 Cannot run as root: Config file has shed_user = "root"
|
|
9 Cannot run as root: Config file has shed_user set to UID 0 user.
|
|
10 Could not setup player
|
|
11 Cannot run as root: Config file has shed_uid = 0
|
|
12 Config file has an unrecognized token
|
|
13 Config file: Negative value not accepted
|
|
15 dgamelaunch called with -c (login shell command); exited
|
|
20 No menu defined, or no banner found for menu
|
|
60 Cannot create a new terminal, or no termcap files.
|
|
61 Cannot openpty()
|
|
62 Cannot open /dev/ptmx
|
|
65 Cannot open master ptsname
|
|
68 Cannot fcntl inprogress-lock
|
|
70 Cannot write to inprogress-lock
|
|
71 ftok() error for shm_key, no "dgamelaunch" file found?
|
|
72 ftok() error for shm_sem_key, no "dgamelaunch" file found?
|
|
73 shmget() error, cannot connect to shared memory
|
|
74 smat() error, cannot attach to shared memory
|
|
75 Nothing in shared memory?
|
|
76 sem_init() error, could not initialize shared memory
|
|
77 sem_wait() error
|
|
78 sem_post() error
|
|
95 Cannot fnctl lockfile
|
|
96 sqlite3_open() failed when checking user existence: could not open login database
|
|
97 sqlite3_open() failed in writefile()
|
|
98 sqlite3_exec() failed in writefile()
|
|
99 Could not open password file
|
|
100 Username field too long in login file
|
|
101 Email field too long in login file
|
|
102 password field too long in login file
|
|
103 env field too long in login file
|
|
104 Cannot read config file
|
|
105 Cannot read default config file
|
|
106 Cannot open lockfile or password file
|
|
107 fcntl failed on login database in writefile()
|
|
108 sqlite3_exec() failed when checking user existence.
|
|
109 Too many registered users. (see maxusers setting in config file)
|
|
110 Login failed
|
|
111 Two users trying to register at the same time
|
|
112 Error changing password: cannot have ':' in password
|
|
113 Error parsing configuration file
|
|
114 exec-command fork failed
|
|
115 could not read lock file in writefile()
|
|
116 Too many registered users. (see maxusers setting in config file)
|
|
117 wall error: no message to send
|
|
118 wall error: no players
|
|
119 User has a retarded terminal
|
|
120 wall error: message too long
|
|
121 wall error: "from" username is too short
|
|
122 Error changing password: struct "me" does not exist
|
|
123 chdir() failed in dgl commands.
|
|
140 populate_games(): Cannot open inprogress-dir
|
|
145 populate_games(): Inprogress-filename does not have ':' in it
|
|
146 populate_games(): Inprogress-filename does not have ': in it (pt. 2)
|
|
200 purge_stale_locks(): could not open inprogress-dir
|
|
201 purge_stale_locks(): inprogress-file did not have ':' in it
|
|
202 purge_stale_locks(): could not read inprogress-file
|
|
203 purge_stale_locks(): could not get inprogress-file contents
|