diff options
Diffstat (limited to 'retiolum/scripts')
| -rwxr-xr-x | retiolum/scripts/tinc_setup/new_install.sh | 492 | 
1 files changed, 248 insertions, 244 deletions
| diff --git a/retiolum/scripts/tinc_setup/new_install.sh b/retiolum/scripts/tinc_setup/new_install.sh index 76ed9e70..226e7c1b 100755 --- a/retiolum/scripts/tinc_setup/new_install.sh +++ b/retiolum/scripts/tinc_setup/new_install.sh @@ -1,281 +1,193 @@  #!/bin/sh +main(){ -#get sudo -if test "${nosudo-false}" != true -a `id -u` != 0; then -  echo "we're going sudo..." >&2 -  exec sudo -E "$0" "$@" -  exit 23 # go to hell -fi -set -euf -# -SUBNET4=${SUBNET4:-10.243} -SUBNET6=${SUBNET6:-42} -TEMPDIR=${TEMPDIR:-auto} -TINCDIR=${TINCDIR:-auto} -exists() { type "$1" >/dev/null 2>/dev/null; } - -if exists hostname ;then SYSHOSTN=${HOSTNAME:-$(hostname)} -elif exists uci    ;then SYSHOSTN=$(uci get system.@system[0].hostname) -elif [ -e /etc/hostname ]   ;then SYSHOSTN=$(cat /etc/hostname) -else                              SYSHOSTN="unknown" -fi - -#overwrite `found` hostname -HOSTN=${HOSTN:-$SYSHOSTN} -NETNAME=${NETNAME:-retiolum} -MASK4=${MASK4:-16} -MASK6=${MASK6:-16} -RMASK=${RMASK:-255.255.0.0} -URL=${URL:-http://euer.krebsco.de/retiolum/hosts.tar.gz} -SURL=${SURL:-http://euer.krebsco.de/retiolum/supernodes.tar.gz} - -IRCCHANNEL=${IRCCHANNEL:-"#krebs_incoming"} -IRCSERVER=${IRCSERVER:-"irc.freenode.net"} -IRCPORT=${IRCPORT:-6667} - -OS=${OS:-0} -TELNET=${TELNET:-} - -IP4=${IP4:-0} -IP6=${IP6:-0} - -RAND4=1 -RAND6=1 +  #get sudo +  if test "${nosudo-false}" != true -a `id -u` != 0; then +    echo "we're going sudo..." >&2 +    exec sudo -E "$0" "$@" +    exit 23 # go to hell +  fi +  set -euf +  # +  SUBNET4=${SUBNET4:-10.243} +  SUBNET6=${SUBNET6:-42} +  TEMPDIR=${TEMPDIR:-auto} +  TINCDIR=${TINCDIR:-auto} +  exists() { type "$1" >/dev/null 2>/dev/null; } + +  if exists hostname ;then SYSHOSTN=${HOSTNAME:-$(hostname)} +  elif exists uci    ;then SYSHOSTN=$(uci get system.@system[0].hostname) +  elif [ -e /etc/hostname ]   ;then SYSHOSTN=$(cat /etc/hostname) +  else                              SYSHOSTN="unknown" +  fi -#convert hostmask to subnetmask only version 4 -host2subnet() -{ -    NEEDDOTSINSUB=$(expr 3 - $( echo $SUBNET4 | tr -C -d . | wc -c)) -    case $NEEDDOTSINSUB in -        3) FULLSUBNET=$SUBNET4.0.0.0 ;; -        2) FULLSUBNET=$SUBNET4.0.0 ;; -        1) FULLSUBNET=$SUBNET4.0 ;; -        0) FULLSUBNET=$SUBNET4 ;; -        *) echo "cannot read subnet" && exit 1;; -    esac -} +  #overwrite `found` hostname +  HOSTN=${HOSTN:-$SYSHOSTN} +  NETNAME=${NETNAME:-retiolum} +  MASK4=${MASK4:-16} +  MASK6=${MASK6:-16} +  RMASK=${RMASK:-255.255.0.0} +  URL=${URL:-http://euer.krebsco.de/retiolum/hosts.tar.gz} +  SURL=${SURL:-http://euer.krebsco.de/retiolum/supernodes.tar.gz} -#check if ip is valid ipv4 function -check_ip_valid4() -{ -    if [ "$(echo $1 | awk -F"\." ' $0 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/ && $1 <=255 && $2 <= 255 && $3 <= 255 && $4 <= 255 ' 2>/dev/null)" == "$1" ] && [ ${1:0:${#SUBNET4}} == $SUBNET4 ] -    then -        return 0 -    else -        return 1 -    fi -} +  IRCCHANNEL=${IRCCHANNEL:-"#krebs_incoming"} +  IRCSERVER=${IRCSERVER:-"irc.freenode.net"} +  IRCPORT=${IRCPORT:-6667} -#check if ip is valid ipv6 function -check_ip_valid6() -{ -    if [ "$(echo $1 | awk -F"." ' $0 ~ /^([0-9a-fA-F]{1,4}\:){7}[0-9a-fA-F]{1,4}$/' 2>/dev/null)" == $1 ] && [ ${1:0:${#SUBNET6}} == $SUBNET6 ] -    then -        return 0 -    else -        return 1 -    fi -} +  OS=${OS:-0} +  TELNET=${TELNET:-} -#check if ip is taken function -check_ip_taken() -{ -    if grep -q -r -E "$1(#|/)" $TEMPDIR/hosts/ ;then -        return 1 -    else -        return 0 -    fi -} - -#if hostname is taken, count upwards until it isn't taken function -get_hostname() -{ -    TSTFILE=$TEMPDIR/hosts/$1 -    LCOUNTER=0 -    if test -e $TSTFILE; then -        while test -e $TSTFILE; do -            : $((LCOUNTER+=1)) -            TSTFILE=$TEMPDIR/hosts/$1$LCOUNTER -        done -        HOSTN=$1$LCOUNTER -    else -        HOSTN=$1 -    fi -} +  IP4=${IP4:-0} +  IP6=${IP6:-0} -#os autodetection -find_os() -{ -    if grep -qe 'Linux' /etc/*release 2>/dev/null || grep -qe 'Linux' /etc/issue 2>/dev/null; then -        OS='linux' -    elif exists getprop ; then -        OS='android' -    elif test -e /etc/openwrt_release; then -        OS='openwrt' -    elif uname -s | grep -qi 'darwin'; then -        OS='osx' -    else -        echo "Cannot determine your operating system, falling back to Linux" -        OS='linux' -    fi -} +  RAND4=1 +  RAND6=1 -find_telnet(){ -  if exists telnet >/dev/null;then -    TELNET="`command -v telnet`" -  elif exists busybox >/dev/null;then -    TELNET="`command -v busybox` telnet" -  else -    echo "cannot find telnet binary, please install either telnet-client or busybox" -    echo "bailing out!" -    exit 1 -  fi -} -if [ $IP4 -eq 0 ]; then +  if [ $IP4 -eq 0 ]; then      RAND4=1 -elif ! check_ip_valid4 $IP4; then +  elif ! check_ip_valid4 $IP4; then      echo 'ip4 is invalid'      exit 1 -fi -if [ $IP6 -eq 0 ]; then +  fi +  if [ $IP6 -eq 0 ]; then      RAND6=1 -elif ! check_ip_valid6 $IP6; then +  elif ! check_ip_valid6 $IP6; then      echo 'ip6 is invalid'      exit 1 -fi +  fi -#find OS -if [ $OS -eq 0 ]; then +  #find OS +  if [ $OS -eq 0 ]; then      find_os -fi -if [ -z "$TELNET" ]; then -  find_telnet -fi -#check if everything is installed -if ! exists awk ; then +  fi +  if [ -z "$TELNET" ]; then +    find_telnet +  fi +  #check if everything is installed +  if ! exists awk ; then      echo "Please install awk"      exit 1 -fi +  fi -if ! exists curl ; then +  if ! exists curl ; then      if ! exists wget ; then -        echo "Please install curl or wget" -        exit 1 +      echo "Please install curl or wget" +      exit 1      else -        LOADER='wget -O-' -        HEAD_LOADER="$LOADER --spider" +      LOADER='wget -O-' +      HEAD_LOADER="$LOADER --spider"      fi -else +  else      LOADER=curl      HEAD_LOADER="$LOADER -I" -fi +  fi -if ! $HEAD_LOADER $SURL >/dev/null 2>/dev/null ;then +  if ! $HEAD_LOADER $SURL >/dev/null 2>/dev/null ;then      echo "Cannot find supernode package, check if your internet is working"      exit 1 -fi +  fi -#check if everything is installed -if [ $OS = 'android' ]; then +  #check if everything is installed +  if [ $OS = 'android' ]; then      if ! test -e /data/data/org.poirsouille.tinc_gui/files/tincd; then -        echo "Please install tinc-gui" -        exit 1 +      echo "Please install tinc-gui" +      exit 1      else -        TINCBIN=/data/data/org.poirsouille.tinc_gui/files/tincd -        DEV="/dev/tun" -        if [ $TINCDIR = 'auto' ]; then TINCDIR="/usr/local/etc/tinc" ;fi -        if [ $TEMPDIR = 'auto' ]; then TEMPDIR="/storage/sdcard0/tinc-fu" ;fi -        mount -o remount,rw / -        mount -o remount,rw /system +      TINCBIN=/data/data/org.poirsouille.tinc_gui/files/tincd +      DEV="/dev/tun" +      if [ $TINCDIR = 'auto' ]; then TINCDIR="/usr/local/etc/tinc" ;fi +      if [ $TEMPDIR = 'auto' ]; then TEMPDIR="/storage/sdcard0/tinc-fu" ;fi +      mount -o remount,rw / +      mount -o remount,rw /system      fi -elif [ $OS = 'osx' ]; then +  elif [ $OS = 'osx' ]; then      if ! exists tincd >/dev/null; then -        echo "Please install tinc" -        exit 1 +      echo "Please install tinc" +      exit 1      else -        TINCBIN=tincd -        DEV="/dev/net/tun" -        if [ $TINCDIR = 'auto' ]; then TINCDIR="/usr/local/etc/tinc" ;fi -        if [ $TEMPDIR = 'auto' ]; then TEMPDIR="/tmp/tinc-install-fu" ;fi +      TINCBIN=tincd +      DEV="/dev/net/tun" +      if [ $TINCDIR = 'auto' ]; then TINCDIR="/usr/local/etc/tinc" ;fi +      if [ $TEMPDIR = 'auto' ]; then TEMPDIR="/tmp/tinc-install-fu" ;fi      fi -else +  else      if ! exists tincd >/dev/null; then -        echo "Please install tinc" -        exit 1 +      echo "Please install tinc" +      exit 1      else -        TINCBIN=tincd -        DEV="/dev/net/tun" -        if [ $TINCDIR = 'auto' ]; then TINCDIR="/etc/tinc" ;fi -        if [ $TEMPDIR = 'auto' ]; then TEMPDIR="/tmp/tinc-install-fu" ;fi +      TINCBIN=tincd +      DEV="/dev/net/tun" +      if [ $TINCDIR = 'auto' ]; then TINCDIR="/etc/tinc" ;fi +      if [ $TEMPDIR = 'auto' ]; then TEMPDIR="/tmp/tinc-install-fu" ;fi      fi -fi +  fi -#generate full subnet information for v4 +  #generate full subnet information for v4 -#test if tinc directory already exists -if test -e $TINCDIR/$NETNAME; then +  #test if tinc directory already exists +  if test -e $TINCDIR/$NETNAME; then      echo "tinc config directory $TINCDIR/$NETNAME does already exist. (backup and) delete config directory and restart"      exit 1 -fi +  fi -#get tinc-hostfiles -mkdir -p $TEMPDIR/hosts -$LOADER $URL | tar zx -C $TEMPDIR/hosts/ +  #get tinc-hostfiles +  mkdir -p $TEMPDIR/hosts +  $LOADER $URL | tar zx -C $TEMPDIR/hosts/ -#check for free ip -#version 4 -until check_ip_taken $IP4; do +  #check for free ip +  #version 4 +  until check_ip_taken $IP4; do      if [ $RAND4 -eq 1 ]; then -        IP4="$SUBNET4.$(( $(head /dev/urandom | tr -dc "123456789" | head -c3) %255)).$(( $(head /dev/urandom | tr -dc "123456789" | head -c3) %255))" +      IP4="$SUBNET4.$(( $(head /dev/urandom | tr -dc "123456789" | head -c3) %255)).$(( $(head /dev/urandom | tr -dc "123456789" | head -c3) %255))"      else -        printf 'choose new ip: ' +      printf 'choose new ip: ' +      read IP4 +      while !  check_ip_valid4 $IP4; do +        printf 'the ip is invalid, retard, choose a valid ip: '          read IP4 -        while !  check_ip_valid4 $IP4; do -            printf 'the ip is invalid, retard, choose a valid ip: ' -            read IP4 -        done +      done      fi -done +  done -#version 6 -until check_ip_taken $IP6; do +  #version 6 +  until check_ip_taken $IP6; do      if [ $RAND6 -eq 1 ]; then -        NETLENGTH=$(expr $(expr 128 - $MASK6) / 4) -        IP6="$SUBNET6$(head /dev/urandom | tr -dc "0123456789abcdef" | head -c$NETLENGTH | sed 's/..../:&/g')" #todo: generate ip length from hostmask +      NETLENGTH=$(expr $(expr 128 - $MASK6) / 4) +      IP6="$SUBNET6$(head /dev/urandom | tr -dc "0123456789abcdef" | head -c$NETLENGTH | sed 's/..../:&/g')" #todo: generate ip length from hostmask      else -        printf 'ip taken, choose new ip: ' +      printf 'ip taken, choose new ip: ' +      read IP6 +      while !  check_ip_valid6 $IP6; do +        printf 'the ip is invalid, retard, choose a valid ip: '          read IP6 -        while !  check_ip_valid6 $IP6; do -            printf 'the ip is invalid, retard, choose a valid ip: ' -            read IP6 -        done +      done      fi -done +  done -#check for free hostname -get_hostname $HOSTN +  #check for free hostname +  get_hostname $HOSTN -#create the configs -mkdir -p $TINCDIR/$NETNAME -cd $TINCDIR/$NETNAME +  #create the configs +  mkdir -p $TINCDIR/$NETNAME +  cd $TINCDIR/$NETNAME -if [ $OS = 'openwrt' ]; then +  if [ $OS = 'openwrt' ]; then      mkdir hosts      $LOADER $SURL | tar xz -C hosts/ -else +  else      mv $TEMPDIR/hosts ./ -fi +  fi -rm -r $TEMPDIR || echo "$TEMPDIR does not exist, skipping removal" +  rm -r $TEMPDIR || echo "$TEMPDIR does not exist, skipping removal" -echo "Subnet = $IP4" > hosts/$HOSTN -echo "Subnet = $IP6" >> hosts/$HOSTN +  echo "Subnet = $IP4" > hosts/$HOSTN +  echo "Subnet = $IP6" >> hosts/$HOSTN -cat>tinc.conf<<EOF +  cat>tinc.conf<<EOF  Name = $HOSTN  Device = $DEV @@ -289,10 +201,10 @@ ConnectTo = pigstarter  ConnectTo = pico  EOF -host2subnet $MASK4 - -#check if ip is installed -if exists ip >/dev/null; then +  host2subnet $MASK4 +   +  #check if ip is installed +  if exists ip >/dev/null; then      echo 'dirname="`dirname "$0"`"' > tinc-up      echo '' >> tinc-up      echo 'conf=$dirname/tinc.conf' >> tinc-up @@ -310,7 +222,7 @@ if exists ip >/dev/null; then      echo "addr6=\$(sed -n \"s|^ *Subnet *= *\\($SUBNET6[:][^ ]*\\) *\$|\\\\1|p\" \$host)" >> tinc-up      echo 'ip -6 addr add $addr6 dev $INTERFACE' >> tinc-up      echo "ip -6 route add $SUBNET6::/$MASK6 dev \$INTERFACE" >> tinc-up -else +  else      echo 'dirname="`dirname "$0"`"' > tinc-up      echo '' >> tinc-up      echo 'conf=$dirname/tinc.conf' >> tinc-up @@ -322,37 +234,129 @@ else      echo "addr4=\$(sed -n \"s|^ *Subnet *= *\\($SUBNET4[.][^ ]*\\) *$|\\\\1|p\" \$host)" >> tinc-up      echo 'ifconfig $INTERFACE $addr4' >> tinc-up      echo "route add -net $FULLSUBNET netmask $RMASK dev \$INTERFACE " >> tinc-up -fi - -#fix permissions -chmod +x tinc-up -chown -R 0:0 . - -#generate keys with tinc -if exists tincctl ; then -    yes | tincctl -n $NETNAME generate-keys -    cat rsa_key.pub >> hosts/$HOSTN -else +  fi +   +  #fix permissions +  chmod +x tinc-up +  chown -R 0:0 . +   +  #generate keys with tinc +  if exists tinc ; then +    yes | tinc -n $NETNAME generate-keys +  else      yes | $TINCBIN -n $NETNAME -K -fi - -if [ $OS = 'android' ]; then +  fi +   +  if [ $OS = 'android' ]; then      mkdir /etc/tinc      cd /      mv $TINCDIR/$NETNAME /etc/tinc/      cd /etc/tinc/$NETNAME -fi -#write to irc-channel -NICK="${HOSTN}_$(head /dev/urandom | tr -dc "0123456789" | head -c3)" +  fi +  #write to irc-channel +  NICK="${HOSTN}_$(head /dev/urandom | tr -dc "0123456789" | head -c3)" +   +  (   echo "NICK $NICK"; +  echo "USER $NICK $IRCSERVER bla : $NICK"; +  echo "JOIN $IRCCHANNEL"; +  sleep 23; +  echo "PRIVMSG $IRCCHANNEL : This is $HOSTN"; +  sed "s/^\(.*\)/PRIVMSG $IRCCHANNEL : \1/" hosts/$HOSTN; +  sleep 5; ) | $TELNET $IRCSERVER $IRCPORT +   +   +  # finish what you have begun! +  tincd -n $NETNAME +} -(   echo "NICK $NICK"; -    echo "USER $NICK $IRCSERVER bla : $NICK"; -    echo "JOIN $IRCCHANNEL"; -    sleep 23; -    echo "PRIVMSG $IRCCHANNEL : This is $HOSTN"; -    sed "s/^\(.*\)/PRIVMSG $IRCCHANNEL : \1/" hosts/$HOSTN; -    sleep 5; ) | $TELNET $IRCSERVER $IRCPORT +#convert hostmask to subnetmask only version 4 +host2subnet() +{ +  NEEDDOTSINSUB=$(expr 3 - $( echo $SUBNET4 | tr -C -d . | wc -c)) +  case $NEEDDOTSINSUB in +    3) FULLSUBNET=$SUBNET4.0.0.0 ;; +    2) FULLSUBNET=$SUBNET4.0.0 ;; +    1) FULLSUBNET=$SUBNET4.0 ;; +    0) FULLSUBNET=$SUBNET4 ;; +    *) echo "cannot read subnet" && exit 1;; +    esac +} -# finish what you have begun! -tincd -n $NETNAME +#check if ip is valid ipv4 function +check_ip_valid4() +{ +  if [ "$(echo $1 | awk -F"\." ' $0 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/ && $1 <=255 && $2 <= 255 && $3 <= 255 && $4 <= 255 ' 2>/dev/null)" == "$1" ] && [ ${1:0:${#SUBNET4}} == $SUBNET4 ] +  then +    return 0 +  else +    return 1 +  fi +} + +#check if ip is valid ipv6 function +check_ip_valid6() +{ +  if [ "$(echo $1 | awk -F"." ' $0 ~ /^([0-9a-fA-F]{1,4}\:){7}[0-9a-fA-F]{1,4}$/' 2>/dev/null)" == $1 ] && [ ${1:0:${#SUBNET6}} == $SUBNET6 ] +  then +    return 0 +  else +    return 1 +  fi +} + +#check if ip is taken function +check_ip_taken() +{ +  if grep -q -r -E "$1(#|/)" $TEMPDIR/hosts/ ;then +    return 1 +  else +    return 0 +  fi +} + +#if hostname is taken, count upwards until it isn't taken function +get_hostname() +{ +  TSTFILE=$TEMPDIR/hosts/$1 +  LCOUNTER=0 +  if test -e $TSTFILE; then +    while test -e $TSTFILE; do +      : $((LCOUNTER+=1)) +      TSTFILE=$TEMPDIR/hosts/$1$LCOUNTER +    done +    HOSTN=$1$LCOUNTER +  else +    HOSTN=$1 +  fi +} + +#os autodetection +find_os() +{ +  if grep -qe 'Linux' /etc/*release 2>/dev/null || grep -qe 'Linux' /etc/issue 2>/dev/null; then +    OS='linux' +  elif exists getprop ; then +    OS='android' +  elif test -e /etc/openwrt_release; then +    OS='openwrt' +  elif uname -s | grep -qi 'darwin'; then +    OS='osx' +  else +    echo "Cannot determine your operating system, falling back to Linux" +    OS='linux' +  fi +} + +find_telnet(){ +  if exists telnet >/dev/null;then +    TELNET="`command -v telnet`" +  elif exists busybox >/dev/null;then +    TELNET="`command -v busybox` telnet" +  else +    echo "cannot find telnet binary, please install either telnet-client or busybox" +    echo "bailing out!" +    exit 1 +  fi +} +main | 
