So I'm installing an OS on my laptop, and for whatever reason, the
Debian Etch install disk thought it would be a good idea to initialize
the whole disk to random data *before* rather than *after* the rest of
the install. Writing to the whole disk takes a long time --- a few hours ---
and so I'm left with the Debian netinst environment to play with.
So I decided to IRC. Unfortunately, the only programming language I could
find is sh, and there don't seem to be any IRC clients. And I can't get
the ssh client to work --- I was able to install the ssh client from the
udeb on the CD-ROM with udpkg -i path/to/openssl-client-whatever.udeb. But
it depends on libnsl.so.1, and I don't know what udeb I have to install to
get that.
So I wrote my own IRC client in shell. The output is a little ugly, and
there's no line editing or multiple window support, but otherwise it's just
like any other IRC client to use. Almost.
#!/bin/sh
# In the grim future of the Debian netinst disk, there is only nc.
# And dd and sh, of course.
: ${2?"Usage: $0 ircserver nickname"}
ircserver="$1"
nickname="$2"
grimdir="`dirname "$0"`"
case "$grimdir" in /*) ;; *) grimdir="../$grimdir" ;; esac
tmpdir=".tmp.grimirc.$$"
mkdir "$tmpdir"
cd "$tmpdir"
trap 'cd ..; rm -rf "$tmpdir"' 0
(echo user grimirc hostname "$ircserver" :grimirc user
echo nick "$nickname"
> grimirc-responses
tail -f grimirc-responses &
while read command
do case "$command" in
/join*) echo "joining">/dev/tty
set $command; currentchan="$2"
echo "$command" > .grimtmp
dd bs=1 skip=1 < .grimtmp 2>/dev/null;;
/*) echo "$command" > .grimtmp
dd bs=1 skip=1 < .grimtmp 2>/dev/null;;
*) echo "PRIVMSG $currentchan :$command"
esac
done) | "$grimdir/grimdebuglog" | nc "$ircserver" 6667 | while read response
do echo "$response"
case "$response" in
"PING "*) echo "responding to ping"
set $response
shift
echo "PONG $*" >> grimirc-responses
esac
done
This depends on this little script, "grimdebuglog":
#!/bin/sh
# "grimdebuglog": Helper for grimirc.
while read line
do echo "debug: $line" >/dev/tty
echo "$line"
done
I'm posting this mail with a similar program:
#!/bin/sh
# Wrapper around nc to support logging (incl. downloading) and file sending
tmp=".grimmodem7.$$.tmp"
logfile=".grimmodem7.$$.logfile"
trap 'rm -f "$tmp" "$logfile"' 0
while read line; do
case "$line" in
..*) echo "$line" > "$tmp"
dd bs=1 skip=1 < "$tmp"
rm -f "$tmp" ;;
".send "*) set $line
cat "$2"
echo "sent $2" >/dev/tty ;;
".log "*) set $line
rm -f "$logfile"
ln -s "$2" "$logfile"
touch "$2"
ls -l "$logfile" > /dev/tty ;;
*) echo "$line" ;;
esac
done | nc "$@" | while read line; do
if [ -e "$logfile" ] ; then echo "$line" >> "$logfile"; fi
echo "$line"
done
Hope it works!