#!/bin/sh
# retiolum host functions
#@include core
#@include network
tinc_path=${tinc_path:-/etc/tinc}
netname=${netname:-retiolum}
hosts_dir=${hosts_dir:-$tinc_path/$netname/hosts}
supernode_urls="http://euer.krebsco.de/retiolum/supernodes.tar.gz"
reload_tinc(){
  info "reloading tinc configuration"
  pkill -HUP tincd || tinc -n $netname reload;
}

refresh_supernode_keys(){
  for url in $supernode_urls;do
    info "Trying $url to retrieve supernodes"
    if http_get "$url" \
       | tar xvz -C $hosts_dir | xargs -n1 echo "refreshed:" ;then
      info "refreshed supernode keys"
      return 0
    else
      error "$url unusable for retrieving supernode host files"
    fi
  done && return 1
}
port_open(){
  # $1 - host
  # $2 - port
  #  nc -zw 2 $1 $2
  echo | run_telnet "$1" "$2" & pid=$!
  { sleep 5; kill $pid;} & wid=$!
  wait $pid 
  RET=$?
  kill $wid >/dev/null 2>&1
  return $RET
}
find_supernodes(){
  cd $hosts_dir
  set +f
  for name in `
    grep '^[  ]*Address[  ]*=' * |
      cut -d: -f1 | sort | uniq
  `; do
    if eval "`sed -n '
        s/[   ]\+//g
        s/^\(Address\|Port\)=\(.*\)/\1="\${\1+\$\1\n}\2"/p
      ' $name`"; then
      port=${Port-655}
      for host in $Address; do
        if port_open $host $port 2>/dev/null; then
          echo "$name [('$host', $port)]"
        fi &
      done
      wait
    fi &
  done
  wait
  cd - >/dev/null
}

find_active_nodes(){
  # TODO this function currently only supports a single address for a host
  cd $hosts_dir
  # posix grep does not support [[:space:]]
  set +f
  for name in `
    grep '^[  ]*Address[  ]*=' * |
      cut -d: -f1 | sort | uniq
  `; do
    if eval "`sed -n '
        s/[   ]\+//g
        s/^\(Address\|Port\)=\(.*\)/\1="\${\1+\$\1\n}\2"/p
      ' $name`"; then
      port=${Port-655}
      for host in $Address; do
        if port_open $host $port 2>/dev/null; then
          echo "$name [('$host', $port)]"
        fi &
      done
      wait
    fi &
  done
  wait
  cd - >/dev/null
}

check_free_v4(){
  myipv4=${1-10.243.0.-1}
  v4num=${myipv4##*.}
  printf "Retard check: "
  if [ "$v4num" -gt 0 -a "$v4num" -lt "256" ];
  then 
    info "No retard detected\n"
    cd $hosts_dir
    info "Check if ip is still free: "
    for i in `ls -1`; do
      if grep -q -e $myipv4\$ $i ;then
        error "Host IP already taken by $i! "
        return 1
      fi
    done
    info "Passed\n"
    return 0
  else
    error "you are made of stupid. bailing out\n" 
    return 1
  fi
  cd - >/dev/null
}