#!/bin/zsh
#
# automatic network update script
# for a p2p updating scheme - fetch updates on your local network from other dyne:bolic
# we don't like centralized systems, so anyone can be the freshest! :)
# Jaromil, GNU GPL copyleft 2007

source /boot/dynenv
source /lib/dyne/utils.sh
source /lib/dyne/dialog.sh

samba=true
rsync=true

if [ -z $1 ]; then
  notice "usage: dyneupdate host_or_ip"
  exit 0
fi

if [ ${DISPLAY} ]; then
    if ! [ "$2" = "xterm" ]; then
	
	xterm -fn "-*-fixed-medium-*-*-*-18-*-*-*-*-*-*-*" -geometry 76x30 \
            -bg black -fg green -e "dyneupdate $1 xterm"
	exit 0
	
    fi
fi


if ! [ $DYNE_SYS_MEDIA = "hdisk" ]; then
  error "you are not running in an harddisk docked system: cannot write updates on a CD"
  exit 0
fi 

host=$1

notice "contacting host ${host}"

smbclient -c 'get VERSION /tmp/VERSION' \
          //${host}/dyne.dock -N 2>/dev/null 1>/dev/null

if [ $? = 1 ]; then
  act "no samba shared dock found on host"
  samba=false

  rsync ${host}::dyne.dock/VERSION /tmp/VERSION
  if [ $? != 0 ]; then
      act "no rsync dock modules found on host"
      error "no shared system on host"
      rsync=false
      sleep 10
      exit 1
  fi
fi

source /tmp/VERSION
rm -f /tmp/VERSION

host_sys_ver=${DYNE_SYS_VER}
host_initrd_ver=${DYNE_INITRD_VER}
act "${host} runs a dyne OS version sys:${host_sys_ver} initrd:${host_initrd_ver}"
if [ "$samba" = "true" ]; then act "samba connection open"; fi
if [ "$rsync" = "true" ]; then act "rsync connection open"; fi

source ${DYNE_SYS_MNT}/VERSION
my_sys_ver=${DYNE_SYS_VER}
my_initrd_ver=${DYNE_INITRD_VER}

if [ -r /tmp/update.actions ]; then rm -f /tmp/update.actions; fi

touch /tmp/update.actions

is_new_version ${my_sys_ver} ${host_sys_ver}
if [ $? = 0 ]; then
   act "sys is newer, updating"
   echo "sys dyne.sys ${host_sys_ver}" >> /tmp/update.actions
#   smbclient -c 'get dyne.sys ${DYNE_SYS_MNT}/update' \
#             //${host}/dyne.dock -N 2>/dev/null 1>/dev/null
fi

if [ "$samba" = "true" ]; then
    smbclient -c 'get SDK/cdrom/dyne/VERSION /tmp/VERSION' \
        //${host}/dyne.dock -N 2>/dev/null 1>/dev/null
else
    rsync ${host}::dyne.dock/SDK/cdrom/dyne/VERSION /tmp/VERSION
fi

if [ $? = 0 ]; then
    source /tmp/VERSION
    host_sdk_sys_ver=${DYNE_SYS_VER}
    host_sdk_initrd_ver=${DYNE_INITRD_VER}
    act "${host} has a dyne:SDK version sys:$host_sdk_sys_ver initrd:$host_sdk_initrd_ver"
    is_new_version ${my_sys_ver} ${host_sdk_sys_ver}
    if [ $? = 0 ]; then
	is_new_version ${host_sys_ver} ${host_sdk_sys_ver}
	if [ $? = 0 ]; then
	    act "SDK on host is newer, updating"
	    sed -i -e 's/^sys.*//g' /tmp/update.actions
	    echo "sdk dyne.sys ${host_sdk_sys_ver}" >> /tmp/update.actions
#      smbclient -c 'get SDK/cdrom/dyne/dyne.sys ${DYNE_SYS_MNT}/update' \
#                //${host}/dyne.dock -N 2>/dev/null 1>/dev/null
#      sleep 10
	fi
    fi
fi

if [ "$samba" = "true" ]; then
    mods="`smbclient -c 'ls modules/*' //${host}/dyne.dock -N 2>/dev/null`"
    mods=`echo ${mods} | awk '/dyne/ { if($2=="R") print $1 " " $3; else print $1 " " $2 }'`
else
    mods="`rsync 10.66.66.72::dyne.dock/modules/`"
    mods=`echo ${mods} | awk '/dyne$/ {print $5 " " $2}'`
fi

if [ $? = 0 ]; then
   nmods=`echo ${mods} | wc -l`
   act "$nmods modules found"
   updmods=""
   for m in ${(f)mods}; do
     tag=`echo ${m} | awk '{print $1}'`
#     uncomment this to exclude existing modules from update
#     if [ -r ${DYNE_SYS_MNT}/modules/${tag} ]; then continue; fi
     updmods+="${tag} "
   done
   updnmods=`echo $updmods | wc -w`
fi 

if [ -r /tmp/install_modules ]; then rm -f /tmp/install_modules; fi
if [ -r /tmp/dialogarg ]; then rm -f /tmp/dialogarg; fi


c=0
touch /tmp/dialogarg
for m in ${(f)mods}; do
  tag=`echo ${m} | awk '{print $1}'`
#  if [ -r ${DYNE_SYS_MNT}/modules/${tag} ]; then continue; fi
  size=`echo ${m} | awk '{ if($2=="R") print $3; else print $2}'`
  size="`echo ${size}/1024|bc`"
  echo "${tag} \"${size} KB\" ${host}"  >> /tmp/dialogarg
  c=`expr $c + 1`
#   if [ `echo "$c > 6"|bc` = 1 ]; then
#       echo "--separate-output --checklist \"${updnmods} new modules found, choose which to install:\" 20 60 ${c}" \
#  	  > /tmp/dialogarg2
#       cat /tmp/dialogarg >> /tmp/dialogarg2
#       dynedialog --file /tmp/dialogarg2 2> /tmp/install_modules
#       inst="${inst} `cat /tmp/install_modules | awk '{print $1}'`"
#       rm -f /tmp/install_modules
#       rm -f /tmp/dialogarg
#       rm -f /tmp/dialogarg2
#       c=0
#  fi
done
if [ `echo "$c > 0"|bc` = 1 ]; then
    echo "--separate-output --checklist \"${updnmods} new modules found, choose which to install:\" 20 60 ${c}" \
	> /tmp/dialogarg2
    cat /tmp/dialogarg >> /tmp/dialogarg2
    dynedialog --file /tmp/dialogarg2 2> /tmp/install_modules
    inst="${inst} `cat /tmp/install_modules | awk '{print $1}'`"
    rm -f /tmp/install_modules
    rm -f /tmp/dialogarg
    rm -f /tmp/dialogarg2
fi

for i in ${(f)inst}; do
  echo "mod $i" >> /tmp/update.actions
done

acts=`cat /tmp/update.actions `

ask_yesno 10 "confirm updating from ${host}:\n\n$acts"
if [ $? = 1 ]; then
  echo "update"

  mkdir -p $DYNE_SYS_MNT/update

  for a in ${(f)acts}; do
      act "${a}"
      echo ${a} | grep '^mod'
      if [ $? = 0 ]; then
	  mkdir -p $DYNE_SYS_MNT/update/modules
	  mod="`echo ${a}|awk '{print $2}'`"
	  if [ "$rsync" = "true" ]; then
	      rsync -P "${host}::dyne.dock/modules/`echo ${a}|awk '{print $2}'`" $DYNE_SYS_MNT/update/modules/
	  fi
      fi
      echo ${a} | grep '^sys'
      if [ $? = 0 ]; then # upate .sys from dock
	  echo ${a} | grep '^sdk'

	  if [ $? = 0; then # or from sdk if there is one
	      act "updating dyne.sys from remote SDK"
	      sys_update=SDK/cdrom/dyne/dyne.sys
	  else
	      act "updating dyne.sys from remote dock"
	      sys_update=dyne.sys
	  fi

	  if [ "$rsync" = "true" ]; then
	      cp ${DYNE_SYS_MNT}/dyne.sys $DYNE_SYS_MNT/update/
	      rsync -P ${host}::dyne.dock/${sys_update} ${DYNE_SYS_MNT}/update/
	  fi

      fi
  done

  notice "update download!"
  act "now reboot to complete."
else
    error "aborted"
fi