view contrib/peer2anonet/peer2anonet @ 1202:306a7562f05e draft

????????: abs <post@abslimit.info> ?? ????? master ???? ????? ????????? ? ???????????? ? ?origin/master?. ?????????, ??????? ????? ???????? ? ??????: ????? ????: db/as/49608/owner ????? ????: db/dom/ano/abslimit/owner ????? ????: db/dom/ano/netstalking/owner ????? ????: db/ip/15/0A/0B/00/cidr ????? ????: db/ip/15/0A/0B/00/owner ????? ????: db/usr/abslimit/git
author abs <abs@abslimit.info>
date Sun, 13 May 2018 14:57:04 +0300
parents 5ec278277aa4
children
line wrap: on
line source

#!/bin/bash
if [[ $(id -u) != 0 ]]; then
    echo "peer2anonet: root privileges required."
    exit 1
fi

if [ -e /services/bird ]; then
    [ -e /etc/peer2anonet/bird.tar ] || ( cd /services ; echo "creating /etc/peer2anonet/bird.tar backup" ;\
    tar cf /etc/peer2anonet/bird.tar bird )
fi

[ -e contrib/peer2anonet/peer2anonet ] || echo "peer2anonet: not in \$RESDB_ROOT"
[ -e contrib/peer2anonet/peer2anonet ] || exit 1

[ -w /etc/rc.local ] && chmod +x /etc/rc.local
[ -w /etc/rc.d/rc.local ] && chmod +x /etc/rc.d/rc.local

USAGE(){
    echo -e '\npeer2anonet:'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --configure             generate a new local configuration and exit'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --update                regenerate peer configurations'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --configure-peer        generate a new peer configuration and update'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --rm-peer               remove a peer configuration and update'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --install-daemontools   installs daemontools'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --install-ucspi-tcp     installs ucspi-tcp'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --install-djbdns        installs djbdns'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --install-nacl          installs nacl'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --setup-qmail           installs and configures qmail'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --configure-dns         configures dnscache and tinydns zones'
    echo -e '\n    ./contrib/peer2anonet/peer2anonet --update-dns            updates tinydns-ano zone\n'
    exit 0
    }

mkdir -p /service
mkdir -p /services
mkdir -p /services/bird
mkdir -p /etc/peer2anonet
mkdir -p /etc/peer2anonet/peers

CONFIGURE(){
    echo -e '\nCONFIGURE:\n'
    read -p "   Enter your AnoNet subnet: " P2A_NET
    read -p "   Enter your AnoNet router: " P2A_ROUTE
    read -p "   Enter your peering ip: " P2A_IP
    read -p "   Enter your AnoNet asn: " P2A_ASN


    echo "P2A_NET=\"$P2A_NET\"">/etc/peer2anonet/p2a.conf
    echo "P2A_ROUTE=\"$P2A_ROUTE\"">>/etc/peer2anonet/p2a.conf
    echo "P2A_IP=\"$P2A_IP\"">>/etc/peer2anonet/p2a.conf
    echo "P2A_ASN=\"$P2A_ASN\"">>/etc/peer2anonet/p2a.conf
    echo -e '\npeer2anonet: configured\n'

    NICK=`cat conf/git_name`
    ./scripts/add_as $P2A_ASN $NICK
    ./scripts/add_ip $P2A_NET/24 $NICK "`cat conf/tinydns__srvrname`/`cat conf/tinydns__srvrip`"
    [ -e "db/usr/$NICK" ] || mkdir -p "db/usr/$NICK"
    [ -e "db/usr/$NICK/git" ] || echo "git://git.$NICK.ano/">"db/usr/$NICK/git"
    [ -e "db/usr/$NICK/email" ] || echo "`cat conf/git_email`">"db/usr/$NICK/email"
    exit 0
    }

UPDATE(){
    if [ -e /etc/peer2anonet/p2a.conf ]; then
        source /etc/peer2anonet/p2a.conf
    else
        CONFIGURE
        exit 0
    fi

    echo -e '\nUPDATE:\n'
    if [[ $(ls /etc/peer2anonet/peers) ]]; then
        for PEER in `ls /etc/peer2anonet/peers`; do
            if [ -e /etc/peer2anonet/peers/"$PEER"/remote_ip ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/remote_ip`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/remote_ip is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/remote_ip not exists"
                exit 1
            fi

            if [ -e /etc/peer2anonet/peers/"$PEER"/peering_ip ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/peering_ip`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/peering_ip is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/peering_ip not exists"
                exit 1
            fi

            if [ -e /etc/peer2anonet/peers/"$PEER"/remote_port ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/remote_port`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/remote_port is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/remote_port not exists"
                exit 1
            fi

            if [ -e /etc/peer2anonet/peers/"$PEER"/local_port ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/local_port`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/local_port is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/local_port not exists"
                exit 1
            fi

            if [ -e /etc/peer2anonet/peers/"$PEER"/asn ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/asn`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/asn is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/asn not exists"
                exit 1
            fi

            if [ -e /etc/peer2anonet/peers/"$PEER"/pubkey ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/pubkey`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/pubkey is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/pubkey not exists"
                exit 1
            fi

            if [ -e /etc/peer2anonet/peers/"$PEER"/seckey ]; then
                if [[ $(echo X`cat /etc/peer2anonet/peers/"$PEER"/seckey`) == 'X' ]]; then
                    echo "   fatal error: /etc/peer2anonet/peers/$PEER/seckey is void"
                    exit 1
                fi
            else
                echo "   fatal error: /etc/peer2anonet/peers/$PEER/seckey not exists"
                exit 1
            fi
        done
    else
        echo "   fatal error: peering configurations not exists"
        exit 1
    fi

    echo '#!/bin/bash
bird -c bird.conf -d' > /services/bird/run
    chmod +x /services/bird/run

    if [ -e /etc/peer2anonet/bird.conf ]; then
        cp /etc/peer2anonet/bird.conf /services/bird/bird.conf
    else
        echo "function n_AnoNet_mine (prefix arg) {
 if arg ~ [ $P2A_NET/24+ ] then return true;
return false; };

function n_AnoNet (prefix arg) {
 if arg ~ [ 1.0.0.0/8+ ] then return true;
return false; };

filter only_AnoNet_ebgp {
 if n_AnoNet(net) then
  if !n_AnoNet_mine(net) then
   accept \"AnoNet\";
  else reject \"mine\";
reject \"non-AnoNet\"; };

filter only_AnoNet_ebgp_export {
 if n_AnoNet(net) then accept \"AnoNet\";
reject \"non-AnoNet\"; };

filter only_AnoNet {
 if n_AnoNet(net) then accept \"AnoNet\";
reject \"non-AnoNet\"; };

table AnoNet_routes;

protocol pipe pipe_AnoNet_routes { peer table AnoNet_routes; mode transparent;
 import filter only_AnoNet;
 export filter only_AnoNet;
};

protocol static static_AnoNet_routes { table AnoNet_routes;
 route $P2A_NET/24 drop;
}

protocol kernel {
 scan time 10;
 import all;
 export all;
}

protocol device {
 scan time 900;
}

protocol direct direct_AnoNet_routes { table AnoNet_routes;
 interface \"eth0\";
 import filter only_AnoNet;
}" > /services/bird/bird.conf
    fi

    for PEER in `ls /etc/peer2anonet/peers`; do
        mkdir -p /services/"$PEER"
        REMOTEIP=`cat /etc/peer2anonet/peers/"$PEER"/remote_ip`
        PEERIP=`cat /etc/peer2anonet/peers/"$PEER"/peering_ip`
        PEERPORT=`cat /etc/peer2anonet/peers/"$PEER"/remote_port`
        LOCALPORT=`cat /etc/peer2anonet/peers/"$PEER"/local_port`
        PEERASN=`cat /etc/peer2anonet/peers/"$PEER"/asn`
        PUBKEY=`cat /etc/peer2anonet/peers/"$PEER"/pubkey`
        SECKEY=`cat /etc/peer2anonet/peers/"$PEER"/seckey`

        echo "
protocol bgp $PEER { table AnoNet_routes;
 local as $P2A_ASN;
 neighbor $PEERIP as $PEERASN;
 source address $P2A_IP;
 import filter only_AnoNet_ebgp;
 export filter only_AnoNet_ebgp_export;
}" >> /services/bird/bird.conf

        if [ -e /etc/peer2anonet/peers/"$PEER"/run ]; then
          test -L /services/"$PEER"/run || rm -f /services/"$PEER"/run
          test -L /services/"$PEER"/run || ln -s /etc/peer2anonet/peers/"$PEER"/run /services/"$PEER"/run
        else
            echo "#!/bin/bash

# uncomment for debugging. you'll need to use ./run to view output instead
# of svc -u /service/<peer name>
#
#export DEBUG=1

# uncomment if your peer has a dynamic IP
#
#export REMOTE_FLOAT=1

if [[ \$REMOTE_FLOAT != 1 ]]; then
  export REMOTE_ADDRESS=\`cat /etc/peer2anonet/peers/$PEER/remote_ip\`
  export REMOTE_PORT=\`cat /etc/peer2anonet/peers/$PEER/remote_port\`
fi

# not recommended to change these values
#
export LOCAL_PORT=\`cat /etc/peer2anonet/peers/$PEER/local_port\`
export PRIVATE_KEY=\`cat /etc/peer2anonet/peers/$PEER/seckey\`
export PUBLIC_KEY=\`cat /etc/peer2anonet/peers/$PEER/pubkey\`
export TUN_MODE=1
export INTERFACE=ppp-$PEER

# uncomment if you want to nuke your default gateway and configure
# routes only to peers through IcannNet. If any of your peers use
# dynamic IP's or you use Tor or i2p then this is probably NOT a
# good idea. You may need to modify the DEFAULT_ROUTE code below.
# If you run into problems with this please /msg /relayhell/d3v11
# so I can create a patch.
#
#DEFAULT_ROUTE=\`ip route show | grep default | cut -d' ' -f 3\`
#route del default gw \$DEFAULT_ROUTE
#route add \$REMOTE_ADDRESS gw \$DEFAULT_ROUTE

( sleep 5;
 ip addr add $P2A_IP peer \`cat /etc/peer2anonet/peers/$PEER/peering_ip\`/32 dev \$INTERFACE scope link
 ip addr add $P2A_ROUTE/32 dev \$INTERFACE scope global
 ip link set dev \$INTERFACE up

# comment the following ping line to remove pinghack. this is a
# trick used to help bird connect.
#
 ping -c 1 -I \$INTERFACE \`cat /etc/peer2anonet/peers/$PEER/peering_ip\` -r -w 5

) &
exec /usr/sbin/quicktun.nacltai" > /etc/peer2anonet/peers/$PEER/run
        fi
        chmod +x /etc/peer2anonet/peers/"$PEER"/run
        test -L /services/"$PEER"/run || rm -f /services/"$PEER"/run
        test -L /services/"$PEER"/run || ln -s /etc/peer2anonet/peers/"$PEER"/run /services/"$PEER"/run
        test -L "/service/$PEER" && svc -t "/service/$PEER"
        test -L "/service/$PEER" || ln -s "/services/$PEER" "/service/$PEER"
    done
    test -L /service/bird || ln -s /services/bird /service/bird
    echo configure | birdc
    }

CONFIGURE_PEER(){
    if [ -e /etc/peer2anonet/p2a.conf ]; then
        source /etc/peer2anonet/p2a.conf
    else
        CONFIGURE
        exit 0
    fi

    echo -e '\nCONFIGURE PEER:\n'
    read -p "   Enter your peer's name: " PEER
    read -p "   Enter your peer's remote ip: " REMOTEIP
    read -p "   Enter your peer's peering ip: " PEERIP
    read -p "   Enter your peer's remote port: " PEERPORT
    read -p "   Enter your local port: " LOCALPORT
    read -p "   Enter your peer's asn: " PEERASN
    read -p "   Enter your peer's public key: " PUBKEY
    read -p "   Enter your private key: " SECKEY
    [ -e /etc/peer2anonet/peers/"$PEER" ] && rm -r /etc/peer2anonet/peers/"$PEER"
    mkdir -p /etc/peer2anonet/peers/"$PEER"
    echo $REMOTEIP >/etc/peer2anonet/peers/"$PEER"/remote_ip
    echo $PEERIP >/etc/peer2anonet/peers/"$PEER"/peering_ip
    echo $PEERPORT >/etc/peer2anonet/peers/"$PEER"/remote_port
    echo $LOCALPORT >/etc/peer2anonet/peers/"$PEER"/local_port
    echo $PEERASN >/etc/peer2anonet/peers/"$PEER"/asn
    echo $PUBKEY >/etc/peer2anonet/peers/"$PEER"/pubkey
    echo $SECKEY >/etc/peer2anonet/peers/"$PEER"/seckey
    echo -e "\n   configured $PEER\n"
    }

RM_PEER(){
    if [ -e /etc/peer2anonet/p2a.conf ]; then
        source /etc/peer2anonet/p2a.conf
    else
        CONFIGURE
        exit 0
    fi

    echo -e '\nRM PEER:\n'
    read -p "   Enter your peer's name: " PEER
    if [ -e /etc/peer2anonet/peers/"$PEER" ]; then
        rm -r /etc/peer2anonet/peers/"$PEER"
        echo
        echo -e "   removed /etc/peer2anonet/peers/$PEER\n"
    else
        echo
        echo -e "   fatal error: /etc/peer2anonet/peers/$PEER not exists\n"
        exit 1
    fi
    }

INSTALL_DAEMONTOOLS(){
    echo -e '\nINSTALL DAEMONTOOLS:\n'
    [[ $(echo X`which gcc`) == X ]] && echo '   fatal error: cannot find gcc'
    [[ $(echo X`which gcc`) == X ]] && exit 1
    [[ $(echo X`which make`) == X ]] && echo '   fatal error: cannot find make'
    [[ $(echo X`which make`) == X ]] && exit 1

    if [ -w /etc/inittab ]; then :
    elif [ -w /etc/rc.local ] && ! [ -w /etc/inittab ]; then
        sed -i "s/exit 0/exec \/command\/svscanboot \&/" /etc/rc.local
        chmod +x /etc/rc.local
    else
        echo '   fatal error: cannot create reliable startup'
        exit 1
    fi

    mkdir -p /package
    chmod 1755 /package
    cd /package
    wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
    gunzip daemontools-0.76.tar
    tar -xpf daemontools-0.76.tar
    rm -f daemontools-0.76.tar
    cd admin/daemontools-0.76
    sed -i 's/gcc/gcc -include errno.h/g' src/conf-cc
    package/install
    exec /command/svscanboot >/dev/null 2>&1 &
    }

INSTALL_UCSPI_TCP(){
    echo -e '\nINSTALL UCSPI-TCP:\n'
    [[ $(echo X`which gcc`) == X ]] && echo '   fatal error: cannot find gcc'
    [[ $(echo X`which gcc`) == X ]] && exit 1
    [[ $(echo X`which make`) == X ]] && echo '   fatal error: cannot find make'
    [[ $(echo X`which make`) == X ]] && exit 1
    cd /usr/local/src
    wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
    gunzip ucspi-tcp-0.88.tar
    tar -xf ucspi-tcp-0.88.tar
    cd ucspi-tcp-0.88
    sed -i 's/gcc/gcc -include errno.h/g' conf-cc
    make
    make setup check
    }

SETUP_QMAIL(){
    echo -e '\nSETUP QMAIL:\n'

    echo -e '\tWARN:\n'
    echo -e '\tYou should patch or firewall off qmail from'
    echo -e '\treaching IcannNet so someone cannot harvest'
    echo -e '\tyour IP with the mailerdaemon response.'

    [[ $(echo X`which gcc`) == X ]] && echo '   fatal error: cannot find gcc'
    [[ $(echo X`which gcc`) == X ]] && exit 1
    [[ $(echo X`which make`) == X ]] && echo '   fatal error: cannot find make'
    [[ $(echo X`which make`) == X ]] && exit 1
    [[ $(echo X`which tcpserver`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-ucspi-tcp'
    [[ $(echo X`which tcpserver`) == X ]] && exit 1
    [[ $(echo X`which svscanboot`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-daemontools'
    [[ $(echo X`which svscanboot`) == X ]] && exit 1

    NICK=`cat conf/git_name` || exit 1
    MX_IP=`cat conf/gitd_ip` || exit 1
    MX_DOMAIN="a.mx.$NICK.ano" || exit 1

    if [ -e /services/tinydns ]; then
        (
            cd /services
            echo "creating /etc/peer2anonet/tinydns.tar backup"
            tar cf /etc/peer2anonet/tinydns.tar tinydns
            echo "@$NICK.ano:$MX_IP:a:12801:86400">>/services/tinydns/root/data
        )
    else
        echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --configure-dns'
        exit 1
    fi

    (
        cd /services/tinydns/root
        make
        cd /service
        sleep 5
        svc -t dnscache tinydns tinydns-ano tinydns-root
    )

    useradd qmaillog || exit 1

    if [ -w /etc/rc.local ]; then
        if [[ $(cat /etc/rc.local) != *"ip addr add $MX_IP/32 dev lo &"* ]]; then
            echo "ip addr add $MX_IP/32 dev lo &" >> /etc/rc.local
        fi
    elif [ -w /etc/rc.d/rc.local ]; then
        if [[ $(cat /etc/rc.d/rc.local) != *"ip addr add $MX_IP/32 dev lo &"* ]]; then
            echo "ip addr add $MX_IP/32 dev lo &" >> /etc/rc.d/rc.local
        fi
    else
        (
          mkdir -p /services/qmail-ips
          echo "#!/bin/sh -e" > /services/qmail-ips/run
          echo "ip addr add $MX_IP/32 dev lo &" >> /services/qmail-ips/run
          echo "svc -d ." /services/qmail-ips/run
          chmod +x /services/qmail-ips/run
          test -L /service/qmail-ips || ln -s /services/qmail-ips /service/qmail-ips
        )
    fi

    ip addr add $MX_IP/32 dev lo > /dev/null 2>&1

    if [ -e '/var/qmail/bin/qmail-qmtpd' ] || ! [ -e '/var/qmail/bin/qmail-smtpd' ]; then
        cd /usr/local/src
        wget http://www.srn.ano/software/qmail-1.03.tar.gz
        tar xzf qmail-1.03.tgz
        cd qmail-1.03
        unset http_proxy
        wget -O- http://www.srn.ano/patches/qmail-1.03-qmtpc.patch | patch -p1
        mkdir /var/qmail
        groupadd nofiles
        useradd -g nofiles -d /var/qmail/alias alias
        useradd -g nofiles -d /var/qmail qmaild
        useradd -g nofiles -d /var/qmail qmaill
        useradd -g nofiles -d /var/qmail qmailp
        groupadd qmail
        useradd -g qmail -d /var/qmail qmailq
        useradd -g qmail -d /var/qmail qmailr
        useradd -g qmail -d /var/qmail qmails
        sed -i 's/gcc/gcc -include errno.h/g' conf-cc
        make setup check
        ./config-fast $MX_DOMAIN
        echo yourdomain.ano >>/var/qmail/control/locals
        echo yourdomain.ano >>/var/qmail/control/rcpthosts
        (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
        chmod 644 ~alias/.qmail*
    fi

    mkdir -p /services/qmail
    mkdir -p /services/qmail/log
    mkdir -p /services/qmail/log/main
    chown qmaillog /services/qmail/log/main
    echo -e '#!/bin/sh\nexec env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin" qmail-start ./Mailbox' >/services/qmail/run
    chmod +x /services/qmail/run
    echo -e '#!/bin/sh\nexec setuidgid qmaillog multilog t s10000 n4 ./main' >/services/qmail/log/run
    chmod +x /services/qmail/log/run

    ( cd / ; ln -s /services/qmail /service )

    mkdir -p /services/qmail-smtpd
    mkdir -p /services/qmail-smtpd/log
    mkdir -p /services/qmail-smtpd/log/main
    chown qmaillog /services/qmail-smtpd/log/main
    echo -e echo -e '#!/bin/sh\nexec envuidgid qmaild tcpserver -U -c 100 '$MX_IP' smtp /var/qmail/bin/qmail-smtpd' >/services/qmail-smtpd/run
    chmod +x /services/qmail-smtpd/run
    echo -e '#!/bin/sh\nexec setuidgid qmaillog multilog t s10000 n4 ./main' >/services/qmail-smtpd/log/run
    chmod +x /services/qmail-smtpd/log/run

    ( cd / ; ln -s /services/qmail-smtpd /service )

    mkdir -p /services/qmail-qmtpd
    mkdir -p /services/qmail-qmtpd/log
    mkdir -p /services/qmail-qmtpd/log/main
    chown qmaillog /services/qmail-qmtpd/log/main
    echo -e echo -e '#!/bin/sh\nexec envuidgid qmaild tcpserver -U -c 100 '$MX_IP' qmtp /var/qmail/bin/qmail-qmtpd' >/services/qmail-qmtpd/run
    chmod +x /services/qmail-qmtpd/run
    echo -e '#!/bin/sh\nexec setuidgid qmaillog multilog t s10000 n4 ./main' >/services/qmail-qmtpd/log/run
    chmod +x /services/qmail-qmtpd/log/run

    ( cd / ; ln -s /services/qmail-qmtpd /service )

    (
        cd /
        [ -e /usr/sbin/sendmail ] && mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
        ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
    )

    echo 'export MAIL=~/Mailbox' >>/etc/profile
    }

INSTALL_DJBDNS(){
    echo -e '\nINSTALL DJBDNS:\n'
    [[ $(echo X`which gcc`) == X ]] && echo '   fatal error: cannot find gcc'
    [[ $(echo X`which gcc`) == X ]] && exit 1
    [[ $(echo X`which make`) == X ]] && echo '   fatal error: cannot find make'
    [[ $(echo X`which make`) == X ]] && exit 1
    [[ $(echo X`which tcpserver`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-ucspi-tcp'
    [[ $(echo X`which tcpserver`) == X ]] && exit 1
    [[ $(echo X`which svscanboot`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-daemontools'
    [[ $(echo X`which svscanboot`) == X ]] && exit 1
    cd /usr/local/src
    wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz
    gunzip djbdns-1.05.tar
    tar -xf djbdns-1.05.tar
    cd djbdns-1.05
    echo gcc -O2 -include /usr/include/errno.h > conf-cc
    make
    make setup check
    }

CONFIGURE_DNS(){
    if [ -e /etc/peer2anonet/p2a.conf ]; then
        source /etc/peer2anonet/p2a.conf
    else
        CONFIGURE
        exit 0
    fi

    [[ $(echo X`which tcpserver`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-ucspi-tcp'
    [[ $(echo X`which tcpserver`) == X ]] && exit 1
    [[ $(echo X`which svscanboot`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-daemontools'
    [[ $(echo X`which svscanboot`) == X ]] && exit 1
    [[ $(echo X`which tinydns`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-djbdns'
    [[ $(echo X`which tinydns`) == X ]] && exit 1

    if [ -e /services/dnscache ]; then
        [ -e /etc/peer2anonet/dnscache.tar ] || ( cd /services ; echo "creating /etc/peer2anonet/dnscache.tar backup" ;\
        tar cf /etc/peer2anonet/dnscache.tar dnscache )
    fi
    if [ -e /services/tinydns ]; then
        [ -e /etc/peer2anonet/tinydns.tar ] || ( cd /services ; echo "creating /etc/peer2anonet/tinydns.tar backup" ;\
        tar cf /etc/peer2anonet/tinydns.tar tinydns )
    fi
    if [ -e /services/tinydns-ano ]; then
        [ -e /etc/peer2anonet/tinydns-ano.tar ] || ( cd /services ; echo "creating /etc/peer2anonet/tinydns-ano.tar backup" ;\
        tar cf /etc/peer2anonet/tinydns-ano.tar tinydns-ano )
    fi
    if [ -e /services/tinydns-root ]; then
        [ -e /etc/peer2anonet/tinydns-root.tar ] || ( cd /services ; echo "creating /etc/peer2anonet/tinydns-root.tar backup" ;\
        tar cf /etc/peer2anonet/tinydns-root.tar tinydns-root )
    fi

    (
        cd /service
        svc -d dnscache tinydns tinydns-ano tinydns-root >/dev/null 2>&1
        rm -f dnscache tinydns tinydns-ano tinydns-root
        cd /services
        rm -rf dnscache tinydns tinydns-ano tinydns-root
    )

    echo -e '\nCONFIGURE DNS:\n'
    NICK=`cat conf/git_name` || exit 1
    TINYDNS_ROOT_IP=`cat conf/tinydns__rootsrvrip` || exit 1
    TINYDNS_ROOT_DOMAIN=`cat conf/tinydns__rootsrvrname` || exit 1
    TINYDNS_ANO_IP=`cat conf/tinydns__tldsrvrip` || exit 1
    TINYDNS_ANO_DOMAIN=`cat conf/tinydns__tldsrvrname` || exit 1
    TINYDNS_IP=`cat conf/tinydns__srvrip` || exit 1
    TINYDNS_DOMAIN=`cat conf/tinydns__srvrname` || exit 1
    GIT_IP=`cat conf/gitd_ip` || exit 1
    GIT_DOMAIN="git.$NICK.ano"

    ./scripts/add_dom $NICK.ano $NICK $TINYDNS_DOMAIN/$TINYDNS_IP > /dev/null 2>&1

    if [ -w /etc/rc.local ]; then
        if [[ $(cat /etc/rc.local) != *"ip addr add $TINYDNS_ROOT_IP/32 dev lo &"* ]]; then
            echo "ip addr add $TINYDNS_ROOT_IP/32 dev lo &" >> /etc/rc.local
        fi
        if [[ $(cat /etc/rc.local) != *"ip addr add $TINYDNS_IP/32 dev lo &"* ]]; then
            echo "ip addr add $TINYDNS_IP/32 dev lo &" >> /etc/rc.local
        fi
        if [[ $(cat /etc/rc.local) != *"ip addr add $TINYDNS_ANO_IP/32 dev lo &"* ]]; then
            echo "ip addr add $TINYDNS_ANO_IP/32 dev lo &" >> /etc/rc.local
        fi
        if [[ $(cat /etc/rc.local) != *"ip addr add $GIT_IP/32 dev lo &"* ]]; then
        echo "ip addr add $GIT_IP/32 dev lo &" >> /etc/rc.local
        fi
    elif [ -w /etc/rc.d/rc.local ]; then
        if [[ $(cat /etc/rc.d/rc.local) != *"ip addr add $TINYDNS_ROOT_IP/32 dev lo &"* ]]; then
            echo "ip addr add $TINYDNS_ROOT_IP/32 dev lo &" >> /etc/rc.d/rc.local
        fi
        if [[ $(cat /etc/rc.d/rc.local) != *"ip addr add $TINYDNS_IP/32 dev lo &"* ]]; then
            echo "ip addr add $TINYDNS_IP/32 dev lo &" >> /etc/rc.d/rc.local
        fi
        if [[ $(cat /etc/rc.d/rc.local) != *"ip addr add $TINYDNS_ANO_IP/32 dev lo &"* ]]; then
            echo "ip addr add $TINYDNS_ANO_IP/32 dev lo &" >> /etc/rc.d/rc.local
        fi
        if [[ $(cat /etc/rc.d/rc.local) != *"ip addr add $GIT_IP/32 dev lo &"* ]]; then
        echo "ip addr add $GIT_IP/32 dev lo &" >> /etc/rc.d/rc.local
        fi
    else
        (
          mkdir -p /services/tinydns-ips
          echo "#!/bin/sh -e" > /services/tinydns-ips/run
          echo "ip addr add $TINYDNS_ROOT_IP/32 dev lo &" >> /services/tinydns-ips/run
          echo "ip addr add $TINYDNS_IP/32 dev lo &" >> /services/tinydns-ips/run
          echo "ip addr add $TINYDNS_ANO_IP/32 dev lo &" >> /services/tinydns-ips/run
          echo "ip addr add $GIT_IP/32 dev lo &" >> /services/tinydns-ips/run
          echo "svc -d ." /services/tinydns-ips/run
          chmod +x /services/tinydns-ips/run
          test -L /service/tinydns-ips || ln -s /services/tinydns-ips /service/tinydns-ips
        )
    fi

    ip addr add $TINYDNS_ROOT_IP/32 dev lo > /dev/null 2>&1
    ip addr add $TINYDNS_IP/32 dev lo > /dev/null 2>&1
    ip addr add $TINYDNS_ANO_IP/32 dev lo > /dev/null 2>&1
    ip addr add $GIT_IP/32 dev lo > /dev/null 2>&1

    useradd gdnscache
    useradd gdnslog
    useradd gtinydns

    dnscache-conf gdnscache gdnslog /services/dnscache
    mv /services/dnscache/root/servers/@ /services/dnscache/root/servers/@.icann
    echo $TINYDNS_ROOT_IP >/services/dnscache/root/servers/@
    echo 'nameserver 127.0.0.1' >/etc/resolv.conf


    tinydns-conf gtinydns gdnslog /services/tinydns $TINYDNS_IP
    (
        cd /services/tinydns/root
        ./add-ns $NICK.ano $TINYDNS_IP
        ./add-alias $GIT_DOMAIN $GIT_IP
        ./add-alias $TINYDNS_ROOT_DOMAIN $TINYDNS_ROOT_IP
        ./add-alias $TINYDNS_ANO_DOMAIN $TINYDNS_ANO_IP
        make
    )

    tinydns-conf gtinydns gdnslog /services/tinydns-root $TINYDNS_ROOT_IP
    ./scripts/nameserver_autogen/tinydns_root_datafile > /services/tinydns-root/root/data
    ( cd /services/tinydns-root/root ; make )

    tinydns-conf gtinydns gdnslog /services/tinydns-ano $TINYDNS_ANO_IP
    ./scripts/nameserver_autogen/tinydns_tld_datafile > /services/tinydns-ano/root/data
    ( cd /services/tinydns-ano/root ; make )

    (
        cd /
        ln -s /services/dnscache /service/dnscache
        ln -s /services/tinydns /service/tinydns
        ln -s /services/tinydns-ano /service/tinydns-ano
        ln -s /services/tinydns-root /service/tinydns-root
        cd /service ; sleep 5 ; svc -t dnscache tinydns tinydns-ano tinydns-root
    )
    }

INSTALL_DJBDNS(){
    echo -e '\nINSTALL DJBDNS:\n'
    [[ $(echo X`which gcc`) == X ]] && echo '   fatal error: cannot find gcc'
    [[ $(echo X`which gcc`) == X ]] && exit 1
    [[ $(echo X`which make`) == X ]] && echo '   fatal error: cannot find make'
    [[ $(echo X`which make`) == X ]] && exit 1
    [[ $(echo X`which tcpserver`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-ucspi-tcp'
    [[ $(echo X`which tcpserver`) == X ]] && exit 1
    [[ $(echo X`which svscanboot`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-daemontools'
    [[ $(echo X`which svscanboot`) == X ]] && exit 1
    cd /usr/local/src
    wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz
    gunzip djbdns-1.05.tar
    tar -xf djbdns-1.05.tar
    cd djbdns-1.05
    echo gcc -O2 -include /usr/include/errno.h > conf-cc
    make
    make setup check
    }

UPDATE_DNS(){
    if [ -e /etc/peer2anonet/p2a.conf ]; then
        source /etc/peer2anonet/p2a.conf
    else
        CONFIGURE
        exit 0
    fi

    [[ $(echo X`which tcpserver`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-ucspi-tcp'
    [[ $(echo X`which tcpserver`) == X ]] && exit 1
    [[ $(echo X`which svscanboot`) == X ]] && echo '   fatal error: needs ./contrib/peer2anonet/peer2anonet --install-daemontools'
    [[ $(echo X`which svscanboot`) == X ]] && exit 1

    if [ -e /services/tinydns-ano ]; then
        (
            cd /services
            echo "creating /etc/peer2anonet/tinydns-ano.tar backup"
            tar cf /etc/peer2anonet/tinydns-ano.tar tinydns-ano
        )
    fi

    echo -e '\nUPDATE DNS:\n'
    ./scripts/nameserver_autogen/tinydns_tld_datafile > /services/tinydns-ano/root/data
    ( cd /services/tinydns-ano/root ; make )

    (
        cd /service
        sleep 5
        svc -t dnscache tinydns tinydns-ano tinydns-root
    )
    }

INSTALL_NACL(){
    cd /usr/local/src
    wget http://hyperelliptic.org/nacl/nacl-20110221.tar.bz2
    bunzip2 < nacl-20110221.tar.bz2 | tar -xf -
    cd nacl-20110221
    ./do
    }


if [ "$1" == '--configure' ]; then
    CONFIGURE
elif [ "$1" == '--update' ]; then
    UPDATE
elif [ "$1" == '--configure-peer' ]; then
    CONFIGURE_PEER
    UPDATE
elif [ "$1" == '--rm-peer' ]; then
    RM_PEER
    UPDATE
elif [ "$1" == '--install-daemontools' ]; then
    INSTALL_DAEMONTOOLS
elif [ "$1" == '--install-ucspi-tcp' ]; then
    INSTALL_UCSPI_TCP
elif [ "$1" == '--install-djbdns' ]; then
    INSTALL_DJBDNS
elif [ "$1" == '--install-nacl' ]; then
    INSTALL_NACL
elif [ "$1" == '--setup-qmail' ]; then
    SETUP_QMAIL
elif [ "$1" == '--configure-dns' ]; then
    CONFIGURE_DNS
elif [ "$1" == '--update-dns' ]; then
    UPDATE_DNS
else
    USAGE
fi