#!/bin/ksh # ---------------------------------------------------------------------- # Project : Harman Car Multimedia System # Harman/becker Automotive Systems GmbH # All rights reserved # # File : HDD Management Script # Author : SPreuss # Co-Author : HSauer # ---------------------------------------------------------------------- MAC_ADDRESS=FFFFFFFFFFFF BTMAC_ADDRESS=FFFFFFFFFFFF NBT_SERIALNUMBER=FFFFFFFFFFFFFFFFFFFF ADJINFO_READY=0 ADJBLOCK_JACINTO_TXT=NBT_AdjBlock_Jacinto.txt SYSETADJINFO=sysetadjread JACINTO_HOST=hu-jacinto FILE_ADJ_DATA=/net/$JACINTO_HOST/dev/fs0 NAND_FS="/fs/sda0" REPOSITORY=$NAND_FS/repository/istep export PATH=$PATH:$REPOSITORY/bin:$REPOSITORY/opt/sys/bin:. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$REPOSITORY/lib:$REPOSITORY/usr/lib:$REPOSITORY/opt/sys/lib:. CDIR=$PWD VERSION=V1.2.7 CHKQNX6FS=chkqnx6fs HDDSECURITY=hddsecurity2 rRETVAL=0 QUIET=0 BLOCK_SIZE=4096 ## new partition table HDD_SIZE_200GB=195360984 DEF_DATA_200GB="177 /mnt/data ro 135348" DEF_SHARE_200GB="178 /mnt/share rw 14688" DEF_MEDIA_200GB="179 /mnt/quota/mm rw 39422" DEF_DEBUG_200GB="180 /mnt/quota/sys rw 1321" DOMAIN_DIRS="car conn hmi mm nav speech sys" DEVICE=/dev/hd0 LOG=/dev/ser1 #LOG=/dev/console if [[ ! -e $LOG ]]; then LOG=/dev/null fi cd ${0%/*} export PATH=$PATH:$PWD cd $CDIR getDef() { rNAME=$1 if [[ $rNAME == data ]]; then echo $DEF_DATA elif [[ $rNAME == share ]]; then echo $DEF_SHARE elif [[ $rNAME == media ]]; then echo $DEF_MEDIA elif [[ $rNAME == debug ]]; then echo $DEF_DEBUG else echo fi return 0 } getAdjInfo() { # return if adjust info is already known. if [[ $ADJINFO_READY -eq 1 ]]; then return 0 fi if [[ $rSTAT -eq 0 ]]; then if [[ -e $FILE_ADJ_DATA ]]; then ADJINFO=$($SYSETADJINFO --get=E2P.Networking.Eth0MacAddr) && MAC_ADDRESS="${ADJINFO##E2P.Networking.Eth0MacAddr=*( )}" if [[ $? -eq 0 ]]; then if [[ ("$MAC_ADDRESS" == "$ADJINFO") || ("$MAC_ADDRESS" == "") || ("$MAC_ADDRESS" == "FFFFFFFFFFFF") || ("$MAC_ADDRESS" == "ffffffffffff") ]]; then echo "ERROR: Could not read MAC-Address from adjustblock. Please update the ajustblock!" rSTAT=$((rSTAT + 1)) fi fi ADJINFO=$($SYSETADJINFO --get=E2P.Networking.Bt0Addr) && BTMAC_ADDRESS="${ADJINFO##E2P.Networking.Bt0Addr=*( )}" if [[ $? -eq 0 ]]; then if [[ ("$BTMAC_ADDRESS" == "$ADJINFO") || ("$BTMAC_ADDRESS" == "") || ("$BTMAC_ADDRESS" == "FFFFFFFFFFFF") || ("$BTMAC_ADDRESS" == "ffffffffffff") ]]; then echo "ERROR: Could not read BLMAC-Address from adjustblock. Please update the ajustblock!" rSTAT=$((rSTAT + 1)) fi fi ADJINFO=$($SYSETADJINFO --get=E2P.ProdLogistic.SerialNo) && NBT_SERIALNUMBER="${ADJINFO##E2P.ProdLogistic.SerialNo=*( )}" if [[ $? -eq 0 ]]; then if [[ ("$NBT_SERIALNUMBER" == "$ADJINFO") || ("$NBT_SERIALNUMBER" == "") || ("$NBT_SERIALNUMBER" == "FFFFFFFFFFFF") || ("$NBT_SERIALNUMBER" == "ffffffffffff") ]]; then echo "ERROR: Could not read serial number from adjustblock. Please update the ajustblock!" rSTAT=$((rSTAT + 1)) fi fi if [[ $QUIET -eq 0 ]]; then echo "MAC_ADDRESS: $MAC_ADDRESS" echo "BTMAC_ADDRESS: $BTMAC_ADDRESS" echo "NBT_SERIALNUMBER: $NBT_SERIALNUMBER" ADJINFO_READY=1 fi else if [[ -e /net/$JACINTO_HOST ]]; then echo "ERROR: No flash device $FILE_ADJ_DATA at jacinto available!" else echo "ERROR: No connection to jacinto /net/$JACINTO_HOST!" fi rSTAT=$((rSTAT + 1)) fi fi return $rSTAT } kPartitionHdd() { rSTAT=0 rDEVICE=$1 rSTART=1 rEND=0 shift echo "fdisk $rDEVICE delete -a" fdisk $rDEVICE delete -a || rSTAT=$((rSTAT + 1)) while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift rEND=$((rSTART + $rSIZE - 1)) echo "fdisk $rDEVICE add -t $rTYPE -c $rSTART,$rEND" fdisk $rDEVICE add -t $rTYPE -c $rSTART,$rEND || rSTAT=$((rSTAT + 1)) rSTART=$((rEND + 1)) done fdisk $rDEVICE show || rSTAT=$((rSTAT + 1)) mount -e $rDEVICE || rSTAT=$((rSTAT + 1)) return $rSTAT } kFormatHdd() { rBS=$BLOCK_SIZE rSTAT=0 rDEVICE=$1 shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift echo "mkqnx6fs -q -b$rBS ${rDEVICE}t$rTYPE" mkqnx6fs -q -b$rBS ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1)) done return $rSTAT } kMountHdd() { rSTAT=0 rDEVICE=$1 shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift if [[ -e $rMP ]]; then if [[ $QUIET -eq 0 ]]; then echo "INFO: mount point $rMP already exist!" fi else if [[ $QUIET -eq 0 ]]; then echo "mount -t qnx6 -o $rMODE ${rDEVICE}t$rTYPE $rMP" fi if [[ -e /dev/hd0t180 && -e /dev/hd0t179 && -e /dev/hd0t178 && -e /dev/hd0t177 ]]; then mount -t qnx6 -o $rMODE ${rDEVICE}t$rTYPE $rMP || rSTAT=$((rSTAT + 1)) else echo "ERROR: Not all hdd partitions /dev/hd0t1xx could be found!" if [[ -e /net/$JACINTO_HOST ]]; then echo "Probably your hdd needs to be initalized." echo "Please set up your hdd by using the following command: " echo "create_hdd.sh -i" else echo "Probably your hdd is locked, but no adjust data to unlock the hdd is available." echo "The adjust block must have been flashed and" echo "qnet has to be established (see: /net/$JACINTO_HOST)." fi rSTAT=$((rSTAT + 1)) exit $rSTAT fi fi done return $rSTAT } kReMountHdd() { rSTAT=0 rDEVICE=$1 rMODE=$2 shift; shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rNULL=$3 rSIZE=$4 shift; shift; shift; shift if [[ -e $rMP ]]; then if [[ $QUIET -eq 0 ]]; then echo "INFO: mount point $rMP already exist!" fi else if [[ $QUIET -eq 0 ]]; then echo "mount -t qnx6 -o $rMODE ${rDEVICE}t$rTYPE $rMP" fi if [[ -e /dev/hd0t180 && -e /dev/hd0t179 && -e /dev/hd0t178 && -e /dev/hd0t177 ]]; then mount -t qnx6 -o $rMODE ${rDEVICE}t$rTYPE $rMP || rSTAT=$((rSTAT + 1)) else echo "ERROR: Not all hdd partitions /dev/hd0t1xx could be found!" if [[ -e /net/$JACINTO_HOST ]]; then echo "Probably your hdd needs to be initalized." echo "Please set up your hdd by using the following command: " echo "create_hdd.sh -i" else echo "Probably your hdd is locked, but no adjust data to unlock the hdd is available." echo "The adjust block must have been flashed and" echo "qnet has to be established (see: /net/$JACINTO_HOST)." fi rSTAT=$((rSTAT + 1)) exit $rSTAT fi fi done return $rSTAT } kUmountHdd() { rSTAT=0 rDEVICE=$1 shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift if [[ -e $rMP ]]; then if [[ $QUIET -eq 0 ]]; then echo "umount -f $rMP" fi umount -f $rMP || rSTAT=$((rSTAT + 1)) else echo "WRANING: mountpoint $rMP not available" fi done return $rSTAT } kDirectoriesHdd() { rSTAT=0 rCURRDIR=$PWD rDEVICE=$1 shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift mount -u -o rw $rMP || rSTAT=$((rSTAT + 1)) cd $rMP for rDIR in $DOMAIN_DIRS do if [[ $QUIET -eq 0 ]]; then echo "mkdir $rMP/$rDIR" fi mkdir -p $rDIR || rSTAT=$((rSTAT + 1)) done mount -u -o $rMODE $rMP || rSTAT=$((rSTAT + 1)) done cd $rCURRDIR || rSTAT=$((rSTAT + 1)) return $rSTAT } kCleanUp() { rSTAT=0 rCURRDIR=$PWD cd /dev/shmem rDEVICE=$1 shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift mount -u -o rw $rMP || rSTAT=$((rSTAT + 1)) if [[ $QUIET -eq 0 ]]; then echo "deleting 'rm -rf $rMP/*' ..." fi rm -rf $rMP/* || rSTAT=$((rSTAT + 1)) mount -u -o $rMODE $rMP || rSTAT=$((rSTAT + 1)) done cd $rCURRDIR || rSTAT=$((rSTAT + 1)) return $rSTAT } kHddSecurity() { rSTAT=0 rDEVICE=$1 type $HDDSECURITY >/dev/null 2>&1 if [ $? -eq 0 ] ; then $HDDSECURITY -v -m ${rDEVICE} || rSTAT=$((rSTAT + 1)) else echo "WARNING: $HDDSECURITY not found!" fi return $rSTAT } kNoSecurity() { rSTAT=0 rDEVICE=$1 type $HDDSECURITY >/dev/null 2>&1 if [ $? -eq 0 ] ; then getAdjInfo if [ $? -eq 0 ] ; then $HDDSECURITY -d $MAC_ADDRESS,$BTMAC_ADDRESS,$NBT_SERIALNUMBER -m ${rDEVICE} >/dev/console 2>&1 if [ $? -gt 1 ]; then # return value 1 is no password to delete. rSTAT=$((rSTAT + 1)) fi fi else echo "WARNING: $HDDSECURITY not found!" fi return $rSTAT } kSecurity() { rSTAT=0 rDEVICE=$1 type $HDDSECURITY >/dev/null 2>&1 if [ $? -eq 0 ] ; then getAdjInfo if [ $? -eq 0 ] ; then $HDDSECURITY -s $MAC_ADDRESS,$BTMAC_ADDRESS,$NBT_SERIALNUMBER -m ${rDEVICE} >/dev/console 2>&1 if [ $? -gt 1 ]; then # return value 1 is no password to delete. rSTAT=$((rSTAT + 1)) fi fi else echo "WARNING: $HDDSECURITY not found!" fi return $rSTAT } kHddUnlock() { rSTAT=0 rDEVICE=$1 type $HDDSECURITY >/dev/null 2>&1 if [ $? -eq 0 ] ; then getAdjInfo if [ $? -eq 0 ] ; then $HDDSECURITY -u $MAC_ADDRESS,$BTMAC_ADDRESS,$NBT_SERIALNUMBER -m ${rDEVICE} >/dev/console 2>&1 rSTAT=$((rSTAT + $?)) fi else echo "WARNING: $HDDSECURITY not found!" fi return $rSTAT } kChkfs() { rSTAT=0 rDEVICE=$1 shift while [[ $# -gt 0 ]] do rTYPE=$1 rMP=$2 rMODE=$3 rSIZE=$4 shift; shift; shift; shift $CHKQNX6FS -svv ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1)) $CHKQNX6FS -vv ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1)) done return $rSTAT } kHelp() { echo "usage $0 [-i] [-c [ -c ] ...]" echo "-i initalize the HDD partitions: create partiton table, make filesystems and add domain directories." echo "-m mount all partitons" echo "-R mount all partitons read only" echo "-W mount all partitons writeable" echo "-u umount all partitons" echo "-f check qnx6fs" echo "-p print hdd security status" echo "-d delete the hdd password" echo "-r clean up all writeable partitions" echo "-s set the hdd password" echo "-c " echo "-q QUIET no messages exept errors." echo "commands:" echo "=========" echo "partition: create partiton table" echo "format: make filesystems" echo "info: info about partition definition" echo "mount: mount filesystems" echo "umount: umount filesystems" echo "hddsecurity: print hdd security status" echo "unlock: unlock the hdd" echo "secure: set the hdd password" echo "nosecure: delete the hdd password" echo "directories: make domain directories on certain filesystems" echo "cleanup: removes content in the writeable partitions: " echo "chkfs: checks the qnx6 file system" echo "help: print this help screen" echo "Commands are executed in the order specified on the command line." echo "Example: $0 -c partition -c format -c mount -c directories" echo } COMMANDLIST="" # if there are no arguments if [[ $# -lt 1 ]] ; then kHelp exit 0 fi # parse command line while getopts "b:fumic:hsdpqrRW" OPTION do case $OPTION in b) BLOCK_SIZE=$OPTARG ;; f) COMMANDLIST="umount unlock hddsecurity chkfs mount" ;; i) COMMANDLIST="umount unlock partition format mount directories" ;; c) COMMANDLIST="$COMMANDLIST $OPTARG" ;; u) COMMANDLIST="umount" ;; m) COMMANDLIST="unlock mount" ;; R) COMMANDLIST="remount_r" ;; W) COMMANDLIST="remount_w" ;; p) COMMANDLIST="hddsecurity" ;; d) COMMANDLIST="unlock nosecure" ;; s) COMMANDLIST="secure" ;; r) COMMANDLIST="cleanup directories" ;; q) QUIET=1 ;; h | *) kHelp exit 0 ;; esac done # preset the partition sizes to 80GB hdd as fallback DEF_DATA=$DEF_DATA_200GB DEF_SHARE=$DEF_SHARE_200GB DEF_MEDIA=$DEF_MEDIA_200GB DEF_DEBUG=$DEF_DEBUG_200GB type df >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo "ERROR: Could not determine HDD size. The 'df' command is not available." exit 1 fi # check size of $DEVICE DF_OUTP=`df -k ${DEVICE}` CUT_FRONT=${DF_OUTP#* } CUT_BACK=`echo ${CUT_FRONT%%%* }` HDD_SIZE=`echo ${CUT_BACK% * * *}` if [[ $QUIET -eq 0 ]]; then echo "HDD size: ${HDD_SIZE} [kb]" fi if [[ ${HDD_SIZE} -lt ${HDD_SIZE_200GB} ]] ; then echo "ERROR: HDD size $HDD_SIZE cylinder are too small, expecting $HDD_SIZE_200GB cylinder or more!" exit 1 fi if [[ $QUIET -eq 0 ]]; then echo "-------------------------" echo "$0 $VERSION" echo "-------------------------" fi for COMMAND in $COMMANDLIST do if [[ $COMMAND == partition ]]; then kPartitionHdd $DEVICE $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi if [[ $COMMAND == format* ]]; then if [[ $COMMAND > format ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kFormatHdd $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kFormatHdd $DEVICE $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == info* ]]; then if [[ $COMMAND > info ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then echo $def rRETVAL=$((rRETVAL + $?)) else echo "info not found ..." rRETVAL=1 fi else def_data=`getDef data` def_share=`getDef share` def_media=`getDef media` def_debug=`getDef debug` if [[ ! -z def_data ]] && [[ ! -z def_share ]] && [[ ! -z def_media ]] && [[ ! -z def_debug ]]; then echo $def_data echo $def_share echo $def_media echo $def_debug else echo "info not found ..." rRETVAL=1 fi fi fi if [[ $COMMAND == mount* ]]; then if [[ $COMMAND > mount ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kMountHdd $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kMountHdd $DEVICE $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == remount_r* ]]; then if [[ $COMMAND > remount_r ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kReMountHdd $DEVICE ro $def rRETVAL=$((rRETVAL + $?)) fi else kReMountHdd $DEVICE ro $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == remount_w* ]]; then if [[ $COMMAND > remount_w ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kReMountHdd $DEVICE rw $def rRETVAL=$((rRETVAL + $?)) fi else kReMountHdd $DEVICE rw $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == umount* ]]; then if [[ $COMMAND > umount ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kUmountHdd $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kUmountHdd $DEVICE $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == hddsecurity* ]]; then if [[ $COMMAND > hddsecurity ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kHddSecurity $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kHddSecurity $DEVICE rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == nosecure* ]]; then if [[ $COMMAND > nosecure ]]; then def=`getDef ${COMMAND#*_}` if [[ -z $def ]]; then rRETVAL=$((rRETVAL + 1)) echo "ERROR: Wrong paraneters '$def'" fi else kNoSecurity $DEVICE rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == secure* ]]; then if [[ $COMMAND > secure ]]; then def=`getDef ${COMMAND#*_}` if [[ -z $def ]]; then rRETVAL=$((rRETVAL + 1)) echo "ERROR: Wrong paraneters '$def'" fi else kSecurity $DEVICE rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == unlock* ]]; then if [[ $COMMAND > unlock ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then rRETVAL=$((rRETVAL + 1)) echo "ERROR: Wrong paraneters '$def'" fi else kHddUnlock $DEVICE if [ $? -gt 1 ]; then # return value 1 is no password to unlock. rRETVAL=$((rRETVAL + $?)) fi fi fi if [[ $COMMAND == chkfs* ]]; then if [[ $COMMAND > chkfs ]]; then def=`getDef ${COMMAND#*_}` if [[ ! -z $def ]]; then kChkfs $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kChkfs $DEVICE $DEF_DATA $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == directories* ]]; then if [[ $COMMAND > directories ]]; then def=`getDef ${COMMAND#*_}` if [[ $def == $DEF_DATA ]] || [[ $def == $DEF_SHARE ]];then kDirectoriesHdd $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kDirectoriesHdd $DEVICE $DEF_DATA $DEF_SHARE rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == cleanup* ]]; then if [[ $COMMAND > cleanup ]]; then def=`getDef ${COMMAND#*_}` if [[ $def == $DEF_MEDIA ]] || [[ $def == $DEF_SHARE ]] || [[ $def == $DEF_DEBUG ]];then kCleanUp $DEVICE $def rRETVAL=$((rRETVAL + $?)) fi else kCleanUp $DEVICE $DEF_SHARE $DEF_MEDIA $DEF_DEBUG rRETVAL=$((rRETVAL + $?)) fi fi if [[ $COMMAND == help ]]; then kHelp fi if [[ $rRETVAL -ne 0 ]]; then echo "ERROR: $0 failed returnval=$rRETVAL!" exit $rRETVAL fi done if [[ $QUIET -eq 0 ]]; then echo "SUCCESS: $0 finished!" fi