#!/bin/bash
if [ $# -lt 1 ];then
  echo "Please select a img,eg. \""$0" ./xiaozhios.img.gz\""
  exit 0
fi
img=$1
if [[ ${img} =~ ^/ ]];then
  img=${img}
else
  img="$(pwd)/${img}"
fi
if [ ! -f /dev/shm/xiaozhiosinstall ];then
  cp -a $(pwd)/"$0" /dev/shm/xiaozhiosinstall
fi
if [[ "$0" != "/dev/shm/xiaozhiosinstall" ]];then
  /dev/shm/xiaozhiosinstall $img
  exit 0
fi
memsize=$(cat /proc/meminfo |awk /^MemTotal/'{print $2}')
if [[ $memsize"x" == "x" ]];then
  echo "Get memsize failed"
  exit 0
else
  a=$(cat /proc/meminfo |awk /^MemTotal/'{print $3}')
  if [ "$a" == "kB" ];then
    memsize=$(($memsize*1024))
  else
    echo "Get memsize failed:"$a
    exit 0
  fi
fi
disk=""
for i in "/boot" "/";do
  if [[ $disk"t" == "t" ]];then
    a=$(df -k |grep $i$ |awk '{print $1}')
    if [[ "$a" == /dev/* ]];then
      if [[ "$a" == /dev/mapper/* ]];then
        a=${a//--/-}
        key=${a##*/}
        while [[ $key"t" != "t" ]];do
          key=${key:0:$[${#key} - 1 ]}
          disk1=$(pvs|awk '{if($2=="'$key'")printf $1}')
          if [[ $disk1"t" != "t" ]];then
            a=$disk1
            break;
          fi
        done
      fi
      disk=$(echo $a |tr -d '[0-9]$')
    fi
  fi
done
if [[ $disk"t" == "t" ]];then
    echo "Get disk failed"
    exit 0
fi
defaultroute=$(ip route |awk '$1~/^default$/{print $3}')
if [[ $defaultroute"t" == "t" ]];then
  echo "Get default route failed"
  exit 0
fi
ipaddr=$(ip addr |grep `ip route |awk /$defaultroute/'$1~/default$/{print $5}'` |awk '$1~/^inet$/{print $2}')
if [[ $ipaddr"t" == "t" ]];then
  echo "Get ipaddr failed"
  exit 0
fi
echo "Install disk: "$disk
echo "IP:           "$ipaddr
echo "GateWay:      "$defaultroute
if [ $memsize -gt 10998998998 ];then
  echo "memsize:      "$(($memsize/1024/1024/1024)) "G"
elif [ $memsize -gt 10998998 ];then
  echo "memsize:      "$(($memsize/1024/1024)) "M"
elif [ $memsize -gt 10998 ];then
  echo "memsize:      "$(($memsize/1024)) "kB"
else
  echo "memsize:      "$memsize "B"
fi
read  -p "Do you want continue(y/n):" the_ok
if [ $the_ok"x" != "yx" ];then 
  exit 0
fi
echo "Start install ..."
hasError=0
if [ ! -d /xiaozhi ];then
  mkdir /xiaozhi
  if [ ! -f /dev/shm/xiaozhios.img.gz ];then 
    cp -an $img /dev/shm/xiaozhios.img.gz
  fi
  gzip -cd /dev/shm/xiaozhios.img.gz >/xiaozhi/xiaozhios.img
  for i in $(echo -e "/lib\n/usr\n/lib64\n/bin\n/sbin\n/etc\n/var");do
    if [ ! -L $i ] && [ -d $i ];then
      if [ $hasError -eq 0 ];then
        cp -an $i /dev/shm$i
        shmFreeSize=`df -k |awk '$6~/^\/dev\/shm$/{print $4}'`
        if [ "x$shmFreeSize" == "x" ];then
          shmFreeSize=`df -k |awk '$1~/^tmpfs$/ && $6~/^\/etc$/{print $4}'`
        fi
        if [ "x$shmFreeSize" == "x" ];then
          shmFreeSize=`df -k |awk '$1~/^tmpfs$/ && $6~/^\/usr$/{print $4}'`
        fi
        if [ $shmFreeSize -gt 10240 ];then  mount -o bind /dev/shm$i $i;
        else  hasError=1; fi
      fi
      if [ $hasError -ne 0 ];then 
        cp -an $i /xiaozhi$i
        mount -o bind /xiaozhi$i $i
        sync
      fi
    fi
  done 
else
  if [ ! -f /dev/shm/xiaozhios.img.gz ];then 
    cp -an $img /dev/shm/xiaozhios.img.gz
  fi
  gzip -cd /dev/shm/xiaozhios.img.gz >/xiaozhi/xiaozhios.img
  if [ $hasError -eq 0 ];then
    shmFreeSize=`df -k |awk '$6~/^\/dev\/shm$/{print $4}'`
    if [ $shmFreeSize -lt 10240 ];then hasError=1; fi
  fi
fi
if [ $hasError -ne 0 ];then
  read  -p "Has some error,do you want continue(y/n):" the_ok
  if [ $the_ok"x" != "yx" ];then 
    exit 0
  fi
fi
{
  disksize=$(fdisk $disk -l |awk /^Disk/'{print $5}')
  if [ $disksize"x" == "x" ];then
    disksize=$(fdisk $disk -l |awk /^磁盘/'{print $4}')
  fi
  xiaozhiosinit=""
  if [ $hasError -eq 0 ];then xiaozhiosinit="/dev/shm/xiaozhiosinit"
  else xiaozhiosinit="/xiaozhi/xiaozhiosinit"; fi
  echo -e "[network]\nip1=$ipaddr\ngateway=$defaultroute\n" >$xiaozhiosinit
  xiaozhiosinitsize=$(ls -l $xiaozhiosinit | awk '{print $5}')
  count=$((($xiaozhiosinitsize+487) / 488))
  skip=0;
  for((i=0;i<count;i++));do
    a=$(printf "%05d" $i)
    echo -e "$a.xiaozhi.fslib.org\n" >$xiaozhiosinit$a
    thesize=$(($xiaozhiosinitsize-$skip))
    if [ $thesize -ge 488 ];then
      thesize=488
      dd if=$xiaozhiosinit of=$xiaozhiosinit$a conv=notrunc bs=1 skip=$skip seek=24 count=$thesize &>/dev/null
      skip=$(($skip+$thesize))
    else
      dd if=$xiaozhiosinit of=$xiaozhiosinit$a conv=notrunc bs=1 skip=$skip seek=24 count=$thesize &>/dev/null
      skip=$(($skip+$thesize))
      dd if=/dev/zero of=$xiaozhiosinit$a conv=notrunc bs=1 seek=$((24+$thesize)) count=$((488-$thesize)) &>/dev/null
    fi
    dd if=$xiaozhiosinit$a of=$disk conv=notrunc bs=1 seek=$(($disksize-($count-$i)*512)) count=512 &>/dev/null
  done
}
sync
imgsize=$(ls -l /xiaozhi/xiaozhios.img | awk '{print $5}')
memsize=$(($memsize + $imgsize))
b='#'
for((i=0;i<=memsize;));do
    a=$(($i * 100 / $memsize))
    printf "progress:[%-100s]%d%%\r" $b $a    
    i=$(($i + $imgsize))
    gzip -cd /dev/shm/xiaozhios.img.gz >$disk
    a=$(($i * 100 / $memsize))
    if [ $a -gt 100 ];then
      a=100
    fi
    while [ ${#b} -lt $a ];do
      b=#$b
    done
    sync
done
printf "progress:[%-100s]%d%%\r" $b 100
echo ""
echo "Install successfully,reboot ..."
sleep 3
sync
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
sleep 3
reboot -f
