summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2014-05-18 09:44:29 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2014-05-18 09:44:38 +0200
commitf02872386c93600dbabe137e3904240d370a7c1f (patch)
treef2bddabfb2383c6e2326d3560ddcf11f18ef6b17
parentc68b9e5076094d60e8f767ffcd3bb9c224fc3fe9 (diff)
add shell script to install adk on flash/block
-rw-r--r--mk/image.mk1
-rw-r--r--package/adkinstall/Makefile28
-rw-r--r--package/adkinstall/src/adkinstall144
-rw-r--r--target/config/Config.in2
4 files changed, 175 insertions, 0 deletions
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.