ref: a1145078b69f732109f0e102d148cafaad8ceaac
author: cinap_lenrek <[email protected]>
date: Sat May 4 11:34:39 EDT 2024
trackerc: initial commit
--- /dev/null
+++ b/trackerc
@@ -1,0 +1,116 @@
+#!/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 ''