From f02872386c93600dbabe137e3904240d370a7c1f Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Sun, 18 May 2014 09:44:29 +0200 Subject: add shell script to install adk on flash/block --- package/adkinstall/Makefile | 28 ++++++++ package/adkinstall/src/adkinstall | 144 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 package/adkinstall/Makefile create mode 100644 package/adkinstall/src/adkinstall (limited to 'package/adkinstall') diff --git a/package/adkinstall/Makefile b/package/adkinstall/Makefile new file mode 100644 index 000000000..1ebfa2982 --- /dev/null +++ b/package/adkinstall/Makefile @@ -0,0 +1,28 @@ +# This file is part of the OpenADK project. OpenADK is copyrighted +# material, please see the LICENCE file in the top-level directory. + +include ${TOPDIR}/rules.mk + +PKG_NAME:= adkinstall +PKG_VERSION:= 2.0 +PKG_RELEASE:= 1 +PKG_DESCR:= ADK disk/flash installer +PKG_SECTION:= base +PKG_DEPENDS:= mke2fs parted sfdisk dosfstools mksh + +PKG_SYSTEM_DEPENDS:= mikrotik-rb532 lemote-yeelong +NO_DISTFILES:= 1 + +include ${TOPDIR}/mk/package.mk + +$(eval $(call PKG_template,ADKINSTALL,adkinstall,${PKG_VERSION}-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION})) + +CONFIG_STYLE:= manual +BUILD_STYLE:= manual +INSTALL_STYLE:= manual + +do-install: + $(INSTALL_DIR) $(IDIR_ADKINSTALL)/sbin + $(INSTALL_BIN) ./src/adkinstall $(IDIR_ADKINSTALL)/sbin + +include ${TOPDIR}/mk/pkg-bottom.mk diff --git a/package/adkinstall/src/adkinstall b/package/adkinstall/src/adkinstall new file mode 100644 index 000000000..c28453088 --- /dev/null +++ b/package/adkinstall/src/adkinstall @@ -0,0 +1,144 @@ +#!/bin/mksh +# This file is part of the OpenADK project. +# install to ADK to a block/flash device + +if [ $(id -u) -ne 0 ];then + print Installation is only possible as root + exit 1 +fi + +if [ -z $1 ];then + print give the filename of the archive you want to install + exit 1 +fi +archive=$1 + +# get adk target system +target=$(cat /etc/.adktarget) +if [ -z $target ];then + print autodetection of target failed + exit 1 +fi + +case $target { +(mikrotik-rb532) + cfgfssize=32768 + nand=0 + cf=0 + fs=ext4 + while getopts "cnf:" ch; do + case $ch in + c) + cf=1 + fs=ext4 + ;; + n) + nand=1 + fs=yaffs2 + ;; + f) + fs=$OPTARG + ;; + esac + done + shift $((OPTIND - 1)) + ;; +(*) + print target $target not supported + exit 1 + ;; +} + +f=0 +for tool in parted sfdisk mkfs.$fs;do + if ! which $tool >/dev/null; then + echo "Checking if $tool is installed... failed" + f=1 + fi +done +if [ $f -eq 1 ];then exit 1;fi + +# create empty partition table +function create_label { + print "Creating empty partition table" + parted -s $1 mklabel msdos +} + +# get max size of disk in sectors +function get_max_size { + maxsize=$(env LC_ALL=C parted $1 -s unit s print |awk '/^Disk/ { print $3 }'|sed -e 's/s//') + rootsize=$(($maxsize-$cfgfssize)) + print device has $maxsize sectors. Using $rootsize for root. +} + +# create partition, with fstype start and end in sectors +function create_partition { + print creating partition on $1 for filesystem $2 + parted -s $1 unit s mkpart primary $2 $3 $4 +} + +function set_boot_flag { + print setting bootflag on $1 partition $2 + parted -s $1 set $2 boot on +} + +function change_part_type { + print setting partition type on $1 partition $2 to $3 + sfdisk --change-id $1 $2 $3 >/dev/null 2>&1 +} + +function create_filesystem { + print creating filesystem $2 on $1 partition $3 + mkfs.$fs -q ${1}${3} +} + +function mount_fs { + print mounting ${1}${2} to $4 with filesystem $3 + mount -t $3 ${1}${2} $4 +} + +function extract_archive { + print extracting archive $1 onto $2 + tar -C $2 -xpf $1 +} + +function fix_perm { + print fixing permissions + chmod 1777 ${1}/tmp + chmod 4755 ${1}/bin/busybox +} + +case $target { +(mikrotik-rb532) + if (( cf )); then + get_max_size /dev/sda + create_label /dev/sda + create_partition /dev/sda ext2 0 1 + create_partition /dev/sda ext2 1 $rootsize + create_partition /dev/sda ext2 $rootsize $maxsize + set_boot_flag /dev/sda 1 + change_part_type /dev/sda 1 27 + change_part_type /dev/sda 3 88 + create_filesystem /dev/sda $fs 2 + mount_fs /dev/sda 2 $fs /mnt + extract_archive $archive /mnt + print installing kernel to cf disk /dev/sda1 + dd if=/mnt/boot/kernel of=/dev/sda1 bs=2048 >/dev/null 2>&1 + fix_perm /mnt + umount /mnt + fi + if (( nand )); then + mount_fs /dev/mtdblock 1 $fs /mnt + rm -rf /mnt/* >/dev/null 2>&1 + mkdir /mnt/boot + mount_fs /dev/mtdblock 0 $fs /mnt/boot + extract_archive $archive /mnt + fix_perm /mnt + umount /mnt/boot + umount /mnt + fi + ;; +} + +echo "Successfully installed OpenADK on $target." +exit 0 -- cgit v1.2.3