diff --git a/MakeRootfsUpdate.sh b/MakeRootfsUpdate.sh index 99b77c9..c3f9894 100755 --- a/MakeRootfsUpdate.sh +++ b/MakeRootfsUpdate.sh @@ -1,5 +1,6 @@ #!/bin/bash WRKDIR=/tmp/XXXUpdateRootfs +BOOTDIR=$WRKDIR/_GfABoot BUILD=`cat ../GfA/board/GfA/Display001/BUILD` UPDATE_BINARY=$WRKDIR/dest/UpdateRootfs.tar.Z UPDATE_FILENAME="../UpdateDisplay001_$BUILD.sh" @@ -7,67 +8,34 @@ UPDATE_IN_SCRIPT="UpdateRootfs.sh.in" ROOTFSMNT=/tmp/XXXRootFs -sudo umount $ROOTFSMNT +sudo umount $ROOTFSMNT 2>/dev/null sudo rm -rf $ROOTFSMNT sudo mkdir -p $ROOTFSMNT - sudo mount -o loop ./output/images/rootfs.ext2 $ROOTFSMNT -rm -rf $WRKDIR +sudo rm -rf $WRKDIR mkdir -p $WRKDIR/dest -cp ./output/images/*.dtb $WRKDIR -cp ./output/images/uImage $WRKDIR -cp ./output/images/MLO $WRKDIR -cp ./output/images/u-boot.img $WRKDIR - -sudo tar -C $ROOTFSMNT -czvf $WRKDIR/rootfs.tar.gz ./ -sudo umount $ROOTFSMNT -#cp ./output/images/rootfs.tar.gz $WRKDIR - -tar -C $WRKDIR --exclude=./dest -czvf $WRKDIR/dest/UpdateRootfs.tar.Z ./ - -# Check for payload format option (default is binary). -binary=1 -uuencode=0 - -if [[ "$1" == '--binary' ]]; then - binary=1 - uuencode=0 - shift -fi -if [[ "$1" == '--uuencode' ]]; then - binary=0 - uuencode=1 - shift -fi - +sudo bash </dev/null +tar -C $WRKDIR --exclude=./dest -czvf $UPDATE_BINARY ./ +EOF + +#---- if [[ ! -f $UPDATE_BINARY ]]; then echo " UPDATE_BINARY $UPDATE_BINARY doesn't exist!" - echo "Usage: $0 [--binary | --uuencode]" + echo "Usage: $0" exit 1 fi - -if [[ $binary -ne 0 ]]; then - # Append binary data. - sed \ - -e 's/uuencode=./uuencode=0/' \ - -e 's/binary=./binary=1/' \ - $UPDATE_IN_SCRIPT > $UPDATE_FILENAME - echo "PAYLOAD:" >> $UPDATE_FILENAME - - cat $UPDATE_BINARY >> $UPDATE_FILENAME -fi -if [[ $uuencode -ne 0 ]]; then - # Append uuencoded data. - sed \ - -e 's/uuencode=./uuencode=1/' \ - -e 's/binary=./binary=0/' \ - $UPDATE_IN_SCRIPT > $UPDATE_FILENAME - echo "PAYLOAD:" >> $UPDATE_FILENAME - - cat $UPDATE_BINARY | uuencode - >> $UPDATE_FILENAME -fi +cat $UPDATE_IN_SCRIPT > $UPDATE_FILENAME +echo "PAYLOAD:" >> $UPDATE_FILENAME +cat $UPDATE_BINARY >> $UPDATE_FILENAME chmod a+x $UPDATE_FILENAME diff --git a/UpdateRootfs.sh.in b/UpdateRootfs.sh.in index 13aeadf..af10b8a 100644 --- a/UpdateRootfs.sh.in +++ b/UpdateRootfs.sh.in @@ -1,28 +1,13 @@ #!/bin/sh -uuencode=0 -binary=1 - -##TAR_PARAMETERS="-C / --exclude=./opt --exclude=./etc/inittab -xzvf -" TMP_PATH="$GFA_PREFIX/__GfA_Update" -TAR_PARAMETERS="-C $TMP_PATH -xzvf -" +TAR_PARAMETERS="-C $GFA_PREFIX/ --exclude=./tmp --exclude=./etc/inittab --exclude=./etc/hosts --exclude=./etc/hostname --exclude=./etc/passwd --exclude=./etc/shadow --exclude=./etc/vncpwd --exclude=./etc/init.d/S99tincd --exclude=./etc/hostapd.conf --exclude=./root/.ssh --exclude=./etc/init.d/M99tincd --exclude=./var/GfA/Display_GSM.ini --exclude=./var/cron/crontabs/root -xzvf -" untar_payload () { - - echo "remove $TMP_PATH : " - rm -rf $TMP_PATH - echo ">> $? " - mkdir -p $TMP_PATH - match=$(grep -n -m 1 '^PAYLOAD:$' $0 | cut -d ':' -f 1) payload_start=$((match + 1)) - if [[ $binary -ne 0 ]]; then - tail -n +$payload_start $0 | tar $TAR_PARAMETERS - fi - if [[ $uuencode -ne 0 ]]; then - tail -n +$payload_start $0 | uudecode | tar $TAR_PARAMETERS - fi + tail -n +$payload_start $0 | tar $TAR_PARAMETERS } if [ -z $1 ] @@ -164,22 +149,17 @@ then else bootpart="/dev/mmcblk0p1" fi +#===== DoRealUpdate === Start +if [ $1 == "DoRealUpdate" ] +then -umount /mnt -mount $bootpart /mnt - -## -- alte Firmwarebinaries löschen -#rm /root/btm*.bin +umount /mnt 2>/dev/null +umount $GFA_PREFIX/_GfABoot 2>/dev/null -#--- Kernel MLO und Rootfs-Tarball entpacken -untar_payload -# --- +rm -rf $GFA_PREFIX/_GfABoot +mkdir $GFA_PREFIX/_GfABoot +mount $bootpart $GFA_PREFIX/_GfABoot -rm /mnt/rootfs.tar.gz -cp $TMP_PATH/MLO /mnt -cp $TMP_PATH/u-boot.img /mnt -cp $TMP_PATH/uImage /mnt -cp $TMP_PATH/*.dtb /mnt mkdir -p $TMP_PATH/bu_cfg @@ -201,17 +181,9 @@ then rm $GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf fi -#rootfs auspacken -tar -C $GFA_PREFIX/ --exclude=./tmp --exclude=./etc/inittab \ - --exclude=./etc/hosts --exclude=./etc/hostname \ - --exclude=./etc/passwd --exclude=./etc/shadow \ - --exclude=./etc/vncpwd --exclude=./etc/init.d/S99tincd \ - --exclude=./etc/hostapd.conf \ - --exclude=./root/.ssh \ - --exclude=./etc/init.d/M99tincd \ - --exclude=./var/GfA/Display_GSM.ini \ - --exclude=./var/cron/crontabs/root \ - -xzvf $TMP_PATH/rootfs.tar.gz +#--- Kernel MLO und Rootfs-Tarball entpacken +untar_payload +# --- echo "sync mmc be patient ...." sync @@ -297,12 +269,6 @@ then sed -i 's/TSYNCCMD=rdate time.memod.de/TSYNCCMD=\/etc\/init.d\/S99rtc_GfA set/' $GFA_PREFIX/var/GfA/Display_GSM.ini fi -#echo "Update Firmware" -#echo "." -#/root/spi_tivia /root/btm43_0107.bin >/dev/null -#echo ".." -#echo "Update Firmware Done" -#/root/gfa_spi -v #================================ #--create mountable run folder insted of link RUNDIR=$GFA_PREFIX/run @@ -430,13 +396,562 @@ fi #================= echo "Update Done, pls. reboot System" -umount /mnt +umount $GFA_PREFIX/_GfABoot 2>/dev/null +rm -rf $GFA_PREFIX/_GfABoot + echo "." echo "restart system !!!" sleep 2 #----------------- reboot +fi +fi +#====================== DoRealUpdate ==== Ende ===== +#===== MakeBootableSD/EMMC === Start +if [ $1 == "MakeBootableSD" -o $1 == "MakeBootableEMMC" ] +then +such="root=/dev/mmcblk1" + +if [ $1 == "MakeBootableSD" ]; then + TODEV="SD" +else + TODEV="EMMC" +fi + +grep -q $such /proc/cmdline +if [ $? == 0 ]; then + bootpart="/dev/mmcblk1p1" + bootdev="EMMC" + DESTNAME="SD" + DESTDEV="/dev/mmcblk0" + DESTBOOTPART="/dev/mmcblk0p1" + DESTROOTPART="/dev/mmcblk0p2" +else + bootpart="/dev/mmcblk0p1" + bootdev="SD" + DESTNAME="EMMC" + DESTDEV="/dev/mmcblk1" + DESTBOOTPART="/dev/mmcblk1p1" + DESTROOTPART="/dev/mmcblk1p2" +fi + +echo "" +echo -e "\e[7mMake Bootable $TODEV\e[0m" + +if [ $bootdev == $TODEV ]; then + echo "System was booted from $TODEV, Making Bootable$TODEV not possible ! ==> EXIT" + exit 1 +fi + +if [ ! -b $DESTDEV ]; then + echo -e "\e[31mNo $DESTNAME available ! ==> EXIT\e[0m" + exit 2 +fi + +echo -e "\e[31m$DESTNAME will be formatted, all Data will be deleted!!\e[0m" +echo "" +read -n 1 -p "are you sure? (y/n) : " antwort + +if [ ${#antwort} == 0 ]; then + antwort = "n" +fi + +if [ $antwort == "y" -o $antwort == "Y" ]; then + echo -e "\nStart copying .." +else + echo -e "\nEXIT on user reqest" + exit 3 +fi + +echo "Formatting $DESTNAME ...." +umount $DESTBOOTPART 2>/dev/null +umount $DESTROOTPART 2>/dev/null +dd if=/dev/zero of=$DESTDEV bs=2M count=1 conv=notrunc +busybox fdisk $DESTDEV < EXIT" + exit 1 +fi + +GFA_PREFIX="/opt/GfA/SDUpdateTool" +GFA_DATAPATH=$GFA_PREFIX/_BootRoot + +rm -rf $GFA_DATAPATH +mkdir -p $GFA_DATAPATH +TAR_PARAMETERS="-C $GFA_DATAPATH/ -xzvf -" + +#--- Kernel MLO und Rootfs-Tarball entpacken +untar_payload +# --- +echo -e "===\n Make UpdateEMMC.sh \n===\n" +(\ +cat << XEOF +#!/bin/sh + +CALLDIR=\`pwd\` +WRKDIR=/opt/GfA/SDUpdateTool + +DESTDEV="/dev/mmcblk1" + +EMMC_BOOTPATH="/tmp/EMMCBOOT" +EMMC_ROOTPATH="/tmp/EMMCROOT" +such=\$DESTDEV + +grep -q \$such /proc/cmdline +if [ \$? == 0 ]; then + bootpart="/dev/mmcblk1p1" + bootdev="EMMC" +else + bootpart="/dev/mmcblk0p1" + bootdev="SD" +fi + +echo "" +echo -e "\e[7mUpdate EMMC from SD\e[0m" + +if [ \$bootdev != "SD" ]; then + echo "System was booted from \$bootdev, update from SD not possible ! ==" + exit 1 +fi + +umount \${DESTDEV}p1 2>/dev/null +umount \${DESTDEV}p2 2>/dev/null + +rm -rf \$EMMC_BOOTPATH +rm -rf \$EMMC_ROOTPATH +mkdir -p \$EMMC_BOOTPATH +mkdir -p \$EMMC_ROOTPATH + +mount \${DESTDEV}p1 \$EMMC_BOOTPATH +mount \${DESTDEV}p2 \$EMMC_ROOTPATH + +#== copy network config == +TMP_PATH=\$WRKDIR/_GfA_tmp +GFA_PREFIX=\$EMMC_ROOTPATH + +rm -rf \$TMP_PATH +mkdir -p \$TMP_PATH +mkdir -p \$TMP_PATH/bu_cfg + +if [ -e \$GFA_PREFIX/etc/network/interfaces ] +then + cp \$GFA_PREFIX/etc/network/interfaces \$TMP_PATH/bu_cfg + rm \$GFA_PREFIX/etc/network/interfaces +fi + +if [ -e \$GFA_PREFIX/etc/wpa_supplicant.conf ] +then + cp \$GFA_PREFIX/etc/wpa_supplicant.conf \$TMP_PATH/bu_cfg/wpa_supplicant.conf_old + rm \$GFA_PREFIX/etc/wpa_supplicant.conf +fi + +if [ -e \$GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf ] +then + cp \$GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf \$TMP_PATH/bu_cfg + rm \$GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf +fi + +#=== copy ROOTFS +cd \$WRKDIR/_BootRoot +rsync -avR --exclude=/_GfABoot \\ +--exclude=./tmp --exclude=./etc/inittab \\ +--exclude=./etc/hosts --exclude=./etc/hostname \\ +--exclude=./etc/passwd --exclude=./etc/shadow \\ +--exclude=./etc/vncpwd --exclude=./etc/init.d/S99tincd \\ +--exclude=./etc/hostapd.conf --exclude=./root/.ssh \\ +--exclude=./etc/init.d/M99tincd --exclude=./var/GfA/Display_GSM.ini \\ +--exclude=./var/cron/crontabs/root \\ + ./ \$EMMC_ROOTPATH/ + +# --- copy old eth0 configuration +INTERFACE="eth0" +IFCONFIG=\$TMP_PATH/bu_cfg/interfaces + +(\\ +cat << EOF +# Configure Loopback +auto lo +iface lo inet loopback + +EOF +) > \$GFA_PREFIX/etc/network/interfaces + +awk -v par=\$INTERFACE '/^iface/ && \$2==par {f=1}/^iface/ && \$2!=par {f=0}f && !/^\s*#/d && !/^\s*\$/d {print \$0 }' \$TMP_PATH/bu_cfg/interfaces \\ +>> \$GFA_PREFIX/etc/network/interfaces + +(\\ +cat << EOF +iface eth1 inet dhcp +#--- +iface usb0 inet static + address 192.168.7.2 + netmask 255.255.255.252 +#--- +iface wlan0 inet dhcp + wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf +# +EOF +) >> \$GFA_PREFIX/etc/network/interfaces + +if [ -e \$GFA_PREFIX/etc/init.d/S98usb_g_ether ] +then + cp \$GFA_PREFIX/etc/init.d/S98usb_g_ether \$GFA_PREFIX/etc/init.d/M98usb_g_ether + rm \$GFA_PREFIX/etc/init.d/S98usb_g_ether +fi + +if [ -e \$GFA_PREFIX/etc/init.d/S80ti-sgx ] +then + rm \$GFA_PREFIX/etc/init.d/S80ti-sgx +fi + +if [ -e \$GFA_PREFIX/etc/init.d/M99_wlan_usb ] +then + rm \$GFA_PREFIX/etc/init.d/M99_wlan_usb +fi + +if [ -e \$GFA_PREFIX/etc/init.d/S99_wlan_usb ] +then + rm \$GFA_PREFIX/etc/init.d/S99_wlan_usb +fi + +if [ -e \$GFA_PREFIX/etc/init.d/M80dhcp-relay ] +then + rm \$GFA_PREFIX/etc/init.d/M80dhcp-relay +fi + +if [ -e \$GFA_PREFIX/etc/init.d/S80dhcp-relay ] +then + rm \$GFA_PREFIX/etc/init.d/S80dhcp-relay +fi +if [ -e \$GFA_PREFIX/etc/init.d/M80dhcp-server ] +then + rm \$GFA_PREFIX/etc/init.d/M80dhcp-server +fi + +if [ -e \$GFA_PREFIX/etc/init.d/S80dhcp-server ] +then + rm \$GFA_PREFIX/etc/init.d/S80dhcp-server +fi + +if [ -d \$GFA_PREFIX/etc/dhcp ] +then + rm -rf \$GFA_PREFIX/etc/dhcp +fi + +if [ -e \$GFA_PREFIX/var/GfA/Display_GSM.ini ] +then + sed -i 's/TSYNCCMD=rdate time.memod.de/TSYNCCMD=\/etc\/init.d\/S99rtc_GfA set/' \$GFA_PREFIX/var/GfA/Display_GSM.ini +fi +#================================ +#--create mountable run folder insted of link +RUNDIR=\$GFA_PREFIX/run +if [ -L \$RUNDIR ]; then + mv \$RUNDIR \$RUNDIR'_WRK' + mkdir \$RUNDIR + mount -t tmpfs tmpfs \$RUNDIR + WRKDIR=\`pwd\` + cd \$RUNDIR'_WRK' + cp -a ./* \$RUNDIR + cd \$WRKDIR + rm \$RUNDIR'_WRK' +fi +#--- craete missing nogroup group +GID_NOGROUP=\`awk -F\: '/nogroup/ {print \$3}' \$GFA_PREFIX/etc/group\` +if [ -z "\$GID_NOGROUP" ]; then +# addgroup -S -g 65534 nogroup + GID_NOGROUP=65534 + echo "nogroup:x:\${GID_NOUGROUP}:" >> \$GFA_PREFIX/etc/group +fi +#--create missing users for mysql, +if [ -z \`awk -F\: '/mysql/ {print \$3}' \$GFA_PREFIX/etc/passwd\` ]; then + UID_MY=\`awk -F: '{uid[\$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' \$GFA_PREFIX/etc/passwd\` + echo "mysql:x:\$UID_MY:\${GID_NOUGROUP}:MySQL daemon:/var/mysql:/bin/false" >> \$GFA_PREFIX/etc/passwd +fi +#--create missing users for postgresql, +if [ -z \`awk -F\: '/postgres/ {print \$3}' \$GFA_PREFIX/etc/passwd\` ]; then + UID_PG=\`awk -F: '{uid[\$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' \$GFA_PREFIX/etc/passwd\` + GID_PG=\`awk -F\: '/postgres/ {print \$3}' \$GFA_PREFIX/etc/group\` + if [ -z "\$GID_PG" ]; then + GID_PG=\`awk -F: '{uid[\$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' \$GFA_PREFIX/etc/group\` + echo "postgres:x:\$GID_PG:" >> \$GFA_PREFIX/etc/group + fi + echo "postgres:x:\$UID_PG:\$GID_PG:PostgreSQL Server:/var/lib/pgsql:/bin/sh" >> \$GFA_PREFIX/etc/passwd +fi +#------------------ +UID_MY=\`awk -F\: '/mysql/ {print \$3}' \$GFA_PREFIX/etc/passwd\` +UID_PG=\`awk -F\: '/postgres/ {print \$3}' \$GFA_PREFIX/etc/passwd\` +GID_PG=\`awk -F\: '/postgres/ {print \$3}' \$GFA_PREFIX/etc/group\` +GID_NOGROUP=\`awk -F\: '/nogroup/ {print \$3}' \$GFA_PREFIX/etc/group\` + +chown -Rv \${UID_MY}:\${GID_NOGROUP} \$GFA_PREFIX/var/mysql +chown -Rv \${UID_PG}:\${GID_PG} \$GFA_PREFIX/var/lib/pgsql + +chmod 700 \$GFA_PREFIX/root/.ssh +#===== copy custom_root files if folder exists +if [ -d "\$WRKDIR/custom_root" ]; then + cd \$WRKDIR/custom_root + rsync -avR \\ + ./ \$EMMC_ROOTPATH/ +fi +#============================================================================== +#=== copy BOOTFS +rm -rf \$EMMC_BOOTPATH/* +cd \$WRKDIR/_BootRoot/_GfABoot +rsync -avR ./ \$EMMC_BOOTPATH/ +#===== +# Get Graphics resolution and set dtb to the right resolution +BASEBOARD=\`cat /tmp/BASEBOARD\` + +DONE=0 +YRES="\$(fbset | awk '/geom/ {print \$3}')" +XRES="\$(fbset | awk '/geom/ {print \$2}')" + +echo "XRES \$XRES, YRES \$YRES" + +if [ "\$XRES" == "480" -a "\$YRES" == "272" ]; then +if [ "\$BASEBOARD" == "DISPLAY002_DI4" ]; then + echo "4.3 Inch Display 2" + cp \$EMMC_BOOTPATH/Display002_4.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +else + echo "4.3 Inch" + cp \$EMMC_BOOTPATH/Display001_4.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +fi +fi + +if [ "\$XRES" == "800" -a "\$YRES" == "480" ]; then +if [ "\$BASEBOARD" == "DISPLAY002_DI4" ]; then + echo "7 Inch Display 2" + cp \$EMMC_BOOTPATH/Display002_7.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +else +if [ "\$BASEBOARD" == "DISPLAY002_RS485" ]; then + echo "7 Inch Display 2 rs485" + cp \$EMMC_BOOTPATH/Display002_7_rs485.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +else + echo "7 Inch" + cp \$EMMC_BOOTPATH/Display001_7.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +fi +fi +fi + +if [ "\$XRES" == "640" -a "\$YRES" == "480" ]; then +if [ "\$BASEBOARD" == "DISPLAY002_DI4" ]; then + echo "5.7 Inch Display 2" + cp \$EMMC_BOOTPATH/Display002_5.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +else + echo "5.7 Inch" + cp \$EMMC_BOOTPATH/Display001_5.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +fi +fi +if [ "\$XRES" == "1280" -a "\$YRES" == "800" ]; then +if [ "\$BASEBOARD" == "DISPLAY002_DI4" ]; then + echo "10 Inch Display 2" + cp \$EMMC_BOOTPATH/Display002_10.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +else + echo "10 Inch" + cp \$EMMC_BOOTPATH/Display001_10.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +fi +fi + +if [ "\$XRES" == "1920" -a "\$YRES" == "1080" ]; then +if [ "\$BASEBOARD" == "DISPLAY002_DI4" ]; then + echo "15 Inch Display 2" + cp \$EMMC_BOOTPATH/Display002_15.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +else + echo "15 Inch" + cp \$EMMC_BOOTPATH/Display001_15.dtb \$EMMC_BOOTPATH/Display001.dtb + DONE=1 +fi +fi + +if [ "\$DONE" == "0" ]; then + echo "Unknown Display Resolution" +fi +#======================================== + +umount \${DESTDEV}p1 2>/dev/null +umount \${DESTDEV}p2 2>/dev/null + +XEOF +) > $GFA_PREFIX/UpdateEMMC.sh +chmod a+x $GFA_PREFIX/UpdateEMMC.sh + exit 0 fi -#------------- +#===== MakeSDUpdateTool === End + +#====== HELP on unknown Command ======= +echo -e "Unknown Command :: $1" +echo -e "Usage: $0 \e[32m[Command]\e[0m" +echo -e "\t without command ... update to new system" +echo -e "\t \e[32mMakeBootableSD\e[0m ... create bootable SD card with factory defaults" +echo -e "\t \e[32mMakeBootableEMMC\e[0m ... create bootable EMMC with factory defaults" +echo -e "\t \e[32mMakeSDUpdateTool\e[0m ... create Folders and scripts for" +echo -e "\t\t updating system from SD Card in /opt/GfA/SDUpdateTool" +echo -e "\t\t To Do UpdateEMMC:" +echo -e "\t\t\t cd /opt/GfA/SDUpdateTool" +echo -e "\t\t\t ./UpdateEMMC.sh" +echo -e "\t\t\t if folder /opt/GfASDupdateTool/custom_root exists" +echo -e "\t\t\t whole tree will be copied to root filesystem as is" + exit 0