#!/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 # get adk target system target=$(cat /etc/.adktarget) if [ -z $target ];then print autodetection of target failed exit 1 fi function mikrotik-rb532-help { cat >&2 < -a: archive -c: compact flash install -n: nand install -f: filesystem for compact flash -h: help text EOF exit 1 } case $target { (mikrotik-rb532) cfgfssize=32768 nand=0 cf=0 fs=ext4 while getopts "a:cnhf:" ch; do case $ch in a) archive=$OPTARG ;; c) cf=1 fs=ext4 ;; n) nand=1 fs=yaffs2 ;; f) fs=$OPTARG ;; h) mikrotik-rb532-help exit 1 ;; *) mikrotik-rb532-help exit 1 ;; esac done shift $((OPTIND - 1)) ;; (*) print target $target not supported exit 1 ;; } if [ $cf -eq 0 -a $nand -eq 0 ];then print "You either install on cf (-c) or nand (-n)" mikrotik-rb532-help exit 1 fi tools="parted sfdisk" if [ $cf -eq 1 ];then tools="$tools mkfs.$fs" fi f=0 for tool in $tools;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 parted -s $1 unit s mkpart primary $2 $3 $4 > /dev/null 2>&1 } function set_boot_flag { print setting bootflag on $1 partition $2 > /dev/null 2>&1 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.$2 -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 1 16384 create_partition /dev/sda ext2 16385 $rootsize create_partition /dev/sda ext2 $(($rootsize+1)) $(($maxsize-1)) 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 mdev -s 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