Browse Source

add shell script to install adk on flash/block

Waldemar Brodkorb 10 years ago
parent
commit
f02872386c
4 changed files with 175 additions and 0 deletions
  1. 1 0
      mk/image.mk
  2. 28 0
      package/adkinstall/Makefile
  3. 144 0
      package/adkinstall/src/adkinstall
  4. 2 0
      target/config/Config.in

+ 1 - 0
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

+ 28 - 0
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

+ 144 - 0
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

+ 2 - 0
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.