ref: a854b5cd46e3894e2c970927d54ef53de82328fc
dir: /bin/trackerc/
#!/bin/rc
# worst bittorrent tacker ever written... in rc.
dir=/tmp/tracker
cd $dir || exit 'no tracker directory'
cr='
'
ipv=ip
ipv6=()
if(! ~ $#net 1) net=$$#*
ip=`'!'{cat $net/remote}
ip=$ip(1)
~ $#ip 1 || exit 'no remote ip'
if(~ $ip *:*){
ipv=ipv6
ipv6=$ip
ip=()
}
req=`{read}
q=`'?'{echo -n $req(2)}
q=`'&'{echo -n $q(2)}
for(i in $q){
v=`'='{echo -n $i}
k=$v(1)
v=$v(2)
switch($k){
case info_hash peer_id port
$k=$v
}
}
# sanity
~ $#info_hash 1 || exit 'no info hash'
fn hex {
xd -x1 | sed 's/^[^ ]+//g;s/[ ]//g;' | sed '{N;s/\n//;}'
}
info_hash=`{echo -n $info_hash | urlencode -d | hex}
# sanity
~ $info_hash ???????????????????????????????????????? || exit 'bad info hash format'
fn respond {
echo $ip $req $* >[1=2]
echo 'HTTP/1.1' $* $cr
echo $cr
}
# is this a scrape?
if(! ~ $#peer_id 1){
if(! test -d $info_hash){
respond 404 'Not Found'
exit ''
}
}
fn str {
n=`{echo -n $1 | wc -c}
echo -n $n:$1
}
fn int {
echo -n i^$1^e
}
if(~ $#peer_id 1){
echo -n $peer_id | urlencode -d > /env/peer_id.bin
peer_id=`{hex < /env/peer_id.bin}
# sanity
~ $peer_id ???????????????????????????????????????? || exit 'bad peer id format'
port=`{echo $port | sed 's/[^0-9]//g'}
~ $#port 1 || exit 'no port port'
~ $port [0-9]* || exit 'bad port format'
mkdir -p $info_hash || exit 'mkdir info hash directory'
# write dict file for classic mode
> $info_hash/$peer_id.$ipv.dict {
echo -n d
str 'peer id'
echo -n '20:'
cat /env/peer_id.bin
str ip
str $$ipv
str port
int $port
echo -n e
}
}
cd $info_hash || exit 'cd info hash directory'
# cleanup old files
for(i in *){
test $i -older 5m && rm -f $i
}
respond 200 OK
echo -n d
str interval
int 120
str peers
echo -n l
cat *.dict >[2] /dev/null
echo -n e
echo -n e
exit ''