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 --- mk/image.mk | 1 + package/adkinstall/Makefile | 28 ++++++++ package/adkinstall/src/adkinstall | 144 ++++++++++++++++++++++++++++++++++++++ target/config/Config.in | 2 + 4 files changed, 175 insertions(+) create mode 100644 package/adkinstall/Makefile create mode 100644 package/adkinstall/src/adkinstall diff --git a/mk/image.mk b/mk/image.mk index 0a3d1f7dd..b9e56b70a 100644 --- a/mk/image.mk +++ b/mk/image.mk @@ -56,6 +56,7 @@ image-prepare-post: test -z $(GIT) || \ $(GIT) log -1|head -1|sed -e 's#commit ##' \ > $(TARGET_DIR)/etc/.adkversion + echo $(ADK_TARGET_SYSTEM) > $(TARGET_DIR)/etc/.adktarget ifneq (${ADK_PACKAGE_CONFIG_IN_ETC},) gzip -9c ${TOPDIR}/.config > $(TARGET_DIR)/etc/adkconfig.gz chmod 600 $(TARGET_DIR)/etc/adkconfig.gz 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 diff --git a/target/config/Config.in b/target/config/Config.in index f75ed139f..f7afcef49 100644 --- a/target/config/Config.in +++ b/target/config/Config.in @@ -636,6 +636,7 @@ config ADK_TARGET_ROOTFS_NFSROOT select ADK_KERNEL_NFS_COMMON select ADK_KERNEL_IP_PNP select ADK_KERNEL_IP_PNP_DHCP + select ADK_PACKAGE_ADKINSTALL depends on !ADK_HARDWARE_QEMU && !ADK_HARDWARE_VBOX && !ADK_TARGET_SYSTEM_ARANYM_M68K depends on !ADK_TARGET_SYSTEM_ARM_FM help @@ -652,6 +653,7 @@ config ADK_TARGET_ROOTFS_USB select ADK_KERNEL_USB_UHCI_HCD select ADK_KERNEL_USB_STORAGE select ADK_KERNEL_EXT2_FS + select ADK_PACKAGE_ADKINSTALL depends on ADK_TARGET_WITH_USB_BOOT help Boot system from USB stick. -- cgit v1.2.3