home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NeXTSTEP 3.0
/
builddiskfd
< prev
next >
Wrap
Text File
|
1992-01-01
|
16KB
|
718 lines
#! /bin/csh -f
#PROGRAM:builddisk PROJECT:builddisk-19 DEVELOPER:richwill BUILT:Fri Nov 2 18:20:59 PST 1990
set path=( /usr/etc /bin /usr/bin /usr/ucb /etc $path )
set prog=$0
set hostname=`hostname`
set scriptdir=/etc
set exitstatus=0
set mounted=()
set mountlist=()
while ( $#argv > 0 )
switch ( $argv[1] )
case -x:
set nofscks
shift
breaksw
case -n:
set noinit
shift
breaksw
case -q:
set noquestions
shift
breaksw
case -S:
set standalone
shift
breaksw
case -h:
if ( $#argv < 2 ) then
echo ${prog:t}: -h requires hostname
exit(1)
endif
set hostname=$argv[2]
shift; shift
breaksw
case -l:
if ( $#argv < 2 ) then
echo ${prog:t}: -l requires disklabel
exit(1)
endif
set label="$argv[2]"
shift; shift
breaksw
case -t:
if ( $#argv < 2 ) then
echo ${prog:t}: -t requires disktab type
exit(1)
endif
set dtype=$argv[2]
shift; shift
breaksw
case -s:
if ( $#argv < 2 ) then
echo ${prog:t}: -s requires builddisk script name
exit(1)
endif
set script=$argv[2]
shift; shift
breaksw
case -*:
echo ${prog:t}: Unknown option: $argv[1]
exit(1)
default:
break
endsw
end
set noglob
umask 022
if ( `whoami` != "root" ) then
echo You must be root to run ${prog:t}
exit(1)
endif
if ( $#argv != 1 ) then
echo Usage: ${prog:t} [-n] [-q] [-h HOSTNAME] [-l LABEL] [-t DISKTYPE] [-s SCRIPT] DEV
exit(1)
endif
switch ( $argv[1] )
case fd0:
set type=fd
breaksw
case od[01]:
set type=od
breaksw
case sd[01234567]:
set type=sd
breaksw
default:
echo ${prog:t}: Device must be of form \"od0\", \"sd0\", etc
exit(1)
endsw
set dev="/dev/$argv[1]"
set rdev = "/dev/r"$argv[1]
switch ( $type )
case 'sd':
set mb=( `scsimodes -C ${rdev}a` )
if ( $status ) then
echo ${prog:t}: Can\'t determine SCSI capacity
set fstab=sd330
else if ( $mb > 500 ) then
if ( $?standalone ) then
set fstab=sd660.1
else
set fstab=sd660
endif
set dscript=sd660
else if ( $mb > 75 ) then
set fstab=sd330
set dscript=sd330
else
set fstab=sd330
set dscript=swapdisk
set label=swapdisk
endif
echo \#
echo \# Building a $mb MB hard disk drive.
echo \#
breaksw
case 'od':
set fstab=od
set dscript=od
breaksw
case 'fd':
set fstab=fd
set dscript=fd
breaksw
endsw
if ( ! $?script ) then
if ( $?dscript ) then
set script=$dscript
else
echo ${prog:t}: Use -s SCRIPT option to specify script
echo Known scripts are:
unset noglob
ls $scriptdir/BLD.* | sed -e 's/.*\/BLD\.//'
exit(1)
endif
endif
if ( ! $?label ) then
set label="MyDisk"
endif
if ( -e BLD.$script ) then
set desc=BLD.$script
else if ( -e $scriptdir/BLD.$script ) then
set desc=$scriptdir/BLD.$script
else
echo ${prog:t}: can\'t find builddisk script BLD.$script
echo Known scripts are:
unset noglob
ls $scriptdir/BLD.* | sed -e 's/.*\/BLD\.//'
exit(1)
endif
set mtab=( `mount | grep ^${dev}` )
if ( $#mtab > 0 ) then
/usr/etc/wumount ${dev}a
endif
set mtab=( `mount | grep ^${dev}` )
if ( $#mtab > 0 ) then
mount | grep ^${dev}
echo ${dev} is busy. Try logging out and logging back in.
exit(1)
endif
set mtab=( `mount | grep '/mnt[abc]' ` )
if ( $#mtab > 0 ) then
mount | grep '/mnt[abc]'
echo ${prog:t}: /mnta, /mntb, or /mntc is in use
echo ${prog:t} must use these mount points
exit(1)
endif
if ( ! $?noinit ) then
if ( ! $?noquestions ) then
echo -n "builddisk destroys previous contents of $dev, ok? "
set rsp=$<
if ( $rsp !~ [yY]* ) then
echo ${prog:t} aborted
exit(1)
endif
endif
else
if ( ! $?noquestions ) then
echo -n "builddisk overwrites contents of $dev, ok? "
set rsp=$<
if ( $rsp !~ [yY]* ) then
echo ${prog:t} aborted
exit(1)
endif
endif
set initialized
endif
set totalsize = 0
set od_capacity = 233066
onintr abort
@ line = 1
while (1)
set cmdline = ( `sed -n -e ${line}p $desc` )
if ( $#cmdline < 1 ) goto done
if ( "$cmdline[1]" =~ \#* ) then
echo $cmdline
goto nextline
endif
if ( $#cmdline < 2 ) then
echo ${prog:t}: Bad command line \"$cmdline\"
goto abort
endif
set cmd = $cmdline[1]
set part = $cmdline[2]
if ( $cmd != newdisk && $?initialized == 0 ) then
if ( $?dtype ) then
disk -i -t $dtype -h $hostname -l "$label" ${rdev}a
if ( $status != 0 ) then
echo ${prog:t}: Disk initialization failed
goto abort
endif
else
disk -i -h $hostname -l "$label" ${rdev}a
if ( $status != 0 ) then
echo ${prog:t}: Disk initialization failed
goto abort
endif
endif
set initialized
endif
if ( $cmd != mount && $cmd != newdisk && "$mounted" !~ *\:$part\:* ) then
if ( ! $?nofscks && ! { fsck ${rdev}$part } ) then
echo ${prog:t}: fsck of ${rdev}$part failed
goto abort
endif
umount /mnt$part >& /dev/null
if ( ! { mount ${dev}$part /mnt$part } ) then
echo ${prog:t}: mount ${dev}$part /mnt$part failed
goto abort
endif
set mounted=($mounted \:$part\: )
set mountlist=($mountlist $part)
endif
echo Doing: $cmdline
switch ( $cmd )
case "size":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set sizedir = $cmdline[3]
if( -e $sizedir ) then
set dirsize = ( `du -s $sizedir | awk '{ print $1 }'` )
@ totalsize = $totalsize + $dirsize
echo Size of $sizedir is $dirsize KB.
else
echo Cannot find directory to size
endif
breaksw
case "addsize":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set addsize = $cmdline[3]
@ totalsize = $totalsize + $addsize
endif
breaksw
case "fit":
echo The source directories contain a total of $totalsize KB.
switch ( $type )
case 'sd':
set destination_size = ( `/usr/etc/scsimodes -C ${rdev}a` )
@ destination_size = $destination_size * 1024
if ( $totalsize > $destination_size ) then
echo The destination filesystem has a maximum capacity of $destination_size KB.
echo The source directories will NOT fit on the destination file system.
echo Builddisk failed.
exit(1)
endif
breaksw
case 'od':
if ( $totalsize > $od_capacity ) then
echo The destination filesystem has a maximum capacity of $od_capacity KB.
echo The source directories will NOT fit on the destination file system.
echo Builddisk failed.
exit(1)
endif
breaksw
endsw
echo The source directories will fit on the destination file system.
echo
breaksw
case "load":
if ( $#cmdline < 3 || $#cmdline > 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set local = $cmdline[3]
if ( -e $local ) then
if ( $#cmdline == 4 ) then
set target = $cmdline[4]
else
set target = $local
endif
mkdirs /mnt$part/$target
(cd $local; tar cf - .)|(cd /mnt$part/$target; tar xfpB - )
if ( $status != 0 ) then
echo ${prog:t}: load of $target from $local failed
set exitstatus=1
endif
endif
breaksw
case "cload":
if ( $#cmdline < 3 || $#cmdline > 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set local = $cmdline[3]
if ( $#cmdline == 4 ) then
set target = $cmdline[4]
else
set target = $local
endif
if ( -d $local ) then
mkdirs /mnt$part/$target
(cd $local; tar cf - .)|(cd /mnt$part/$target; tar xfpB - )
if ( $status != 0 ) then
echo ${prog:t}: load of $target from $local failed
set exitstatus=1
endif
endif
breaksw
case "symlink":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set dest = $cmdline[3]
set src = $cmdline[4]
rm -f /mnt$part/$src
ln -s $dest /mnt$part/$src
if ( $status != 0 ) then
echo ${prog:t}: symlink of $src to $dest failed
set exitstatus=1
endif
breaksw
case "link":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set dest = $cmdline[3]
set src = $cmdline[4]
rm -f /mnt$part/$src
ln /mnt$part/$dest /mnt$part/$src
if ( $status != 0 ) then
echo ${prog:t}: link of $src to $dest failed
set exitstatus=1
endif
breaksw
case "copy":
if ( $#cmdline < 3 || $#cmdline > 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set src = $cmdline[3]
if ( $#cmdline == 4 ) then
set dest = $cmdline[4]
else
set dest = $src
endif
rm -f /mnt$part/$dest
unset noglob
if ( ! { cp -p $src /mnt$part/$dest } ) then
set noglob
echo ${prog:t}: copy of $src to $dest failed
set exitstatus=1
endif
set noglob
breaksw
case "ccopy":
if ( $#cmdline < 3 || $#cmdline > 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set src = $cmdline[3]
if ( $#cmdline == 4 ) then
set dest = $cmdline[4]
else
set dest = $src
endif
if ( -f $src ) then
rm -f /mnt$part/$dest
unset noglob
if ( ! { cp -p $src /mnt$part/$dest } ) then
set noglob
echo ${prog:t}: copy of $src to $dest failed
set exitstatus=1
endif
set noglob
endif
breaksw
case "move":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set src = $cmdline[3]
set dest = $cmdline[4]
rm -f /mnt$part/$dest
unset noglob
if ( ! { mv /mnt$part/$src /mnt$part/$dest } ) then
set noglob
echo ${prog:t}: move of $src to $dest failed
set exitstatus=1
endif
set noglob
breaksw
case "mount":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set src = $cmdline[2]
set dest = $cmdline[3]
umount $dest
if ( ! { mount $src $dest } ) then
echo ${prog:t}: mount of $src on $dest failed
goto abort
endif
breaksw
case "mkdirs":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set dirs = $cmdline[3]
if ( ! { mkdirs /mnt$part/$dirs } ) then
echo ${prog:t}: mkdirs of $dirs failed
set exitstatus=1
endif
breaksw
case "rrm":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set dirs = $cmdline[3]
unset noglob
if ( ! { rm -rf /mnt$part/$dirs } ) then
set noglob
echo ${prog:t}: rm -rf of $dirs failed
set exitstatus=1
endif
set noglob
breaksw
case "rm":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set file = $cmdline[3]
unset noglob
if ( ! { rm /mnt$part/$file } ) then
set noglob
echo ${prog:t}: rm of $file failed
set exitstatus=1
endif
set noglob
breaksw
case "strip":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set file = $cmdline[3]
unset noglob
strip /mnt$part/$file >& /dev/null
set noglob
breaksw
case "chmod":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set mode = $cmdline[3]
set file = $cmdline[4]
unset noglob
if ( ! { chmod $mode /mnt$part/$file } ) then
set noglob
echo ${prog:t}: chmod $mode $file failed
set exitstatus=1
endif
set noglob
breaksw
case "chown":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set owner = $cmdline[3]
set file = $cmdline[4]
unset noglob
if ( ! { chown $owner /mnt$part/$file } ) then
set noglob
echo ${prog:t}: chown $owner $file failed
set exitstatus=1
endif
set noglob
breaksw
case "chgrp":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set group = $cmdline[3]
set file = $cmdline[4]
unset noglob
if ( ! { chgrp $group /mnt$part/$file } ) then
set noglob
echo ${prog:t}: chgrp $group $file failed
set exitstatus=1
endif
set noglob
breaksw
case "rchmod":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set mode = $cmdline[3]
set file = $cmdline[4]
unset noglob
if ( ! { chmod -R $mode /mnt$part/$file } ) then
set noglob
echo ${prog:t}: chmod -R $mode $file failed
set exitstatus=1
endif
set noglob
breaksw
case "rchown":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set owner = $cmdline[3]
set file = $cmdline[4]
unset noglob
if ( ! { chown -R $owner /mnt$part/$file } ) then
set noglob
echo ${prog:t}: chown -R $owner $file failed
set exitstatus=1
endif
set noglob
breaksw
case "rchgrp":
if ( $#cmdline != 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set group = $cmdline[3]
set file = $cmdline[4]
unset noglob
if ( ! { chgrp -R $group /mnt$part/$file } ) then
set noglob
echo ${prog:t}: chgrp -R $group $file failed
set exitstatus=1
endif
set noglob
breaksw
case "exec":
if ( $#cmdline < 4 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set dir = $cmdline[3]
set command = ( $cmdline[4-] )
( cd /mnt$part/$dir; $command )
if ( $status != 0 ) then
echo ${prog:t}: $command failed
set exitstatus=1
endif
breaksw
case "newclient":
if ( $#cmdline < 3 || $#cmdline > 4) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set dir = $cmdline[3]
if ( $#cmdline < 4 ) then
set opt = "-p"
else
set opt = $cmdline[4]
endif
( cd /mnt$part/$dir; ./newclient $opt $fstab /mnta/usr/template/client /mnta/private )
if ( $status != 0 ) then
echo ${prog:t}: newclient failed
set exitstatus=1
endif
breaksw
case "touch":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set file = $cmdline[3]
if ( ! { touch /mnt$part/$file } ) then
echo ${prog:t}: touch $file failed
set exitstatus=1
endif
breaksw
case "remove":
if ( $#cmdline != 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
set file=$cmdline[3]
unset noglob
if ( ! { rm -f /mnt$part/$file } ) then
set noglob
echo ${prog:t}: rm -f $file failed
set exitstatus=1
endif
set noglob
breaksw
case "newdisk":
if ( $#cmdline != 2 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
if ( $type !~ od && $type !~ fd) then
echo ${prog:t}: Can\'t use newdisk command with $type disks
goto abort
endif
if ( $#mountlist > 0 ) then
while ( $#mountlist > 0 )
umount /mnt$mountlist[1]
if ( ! $?nofscks && ! { fsck -y ${rdev}$mountlist[1] } ) then
echo ${prog:t}: fsck of ${rdev}$mountlist[1] failed
set exitstatus=1
endif
df ${rdev}$mountlist[1]
shift mountlist
end
echo Label ejected disk with $label
disk -e ${rdev}a
set mounted=()
set mountlist=()
endif
set label=$part
echo Beginning build of $label
disk -i -h $hostname -l "$label" ${rdev}a
if ( $status != 0 ) then
echo ${prog:t}: Disk initialization failed
goto abort
endif
set initialized
breaksw
case "bom":
if ( $#cmdline > 3 ) then
echo ${prog:t}: Bad command \"$cmdline\"
goto abort
endif
if ( $#cmdline == 3 ) then
set bom=$cmdline[3]
else
set bom=$label
endif
(cd /mnt$part; du; ls -lgAR ) >${bom}.bom
breaksw
default:
echo ${prog:t}: Unknown command \"$cmdline\"
goto abort
endsw
nextline:
@ line++
end
abort:
echo Build of $dev aborted
while ( $#mountlist > 0 )
umount /mnt$mountlist[1]
shift mountlist
end
set exitstatus=1
goto ejectit
done:
while ( $#mountlist > 0 )
umount /mnt$mountlist[1]
if ( ! $?nofscks && ! { fsck -y ${rdev}$mountlist[1] } ) then
echo ${prog:t}: fsck of ${rdev}$mountlist[1] failed
set exitstatus=1
endif
df ${rdev}$mountlist[1]
shift mountlist
end
if ( $exitstatus != 0 ) then
echo ""
echo ============= WARNING ==================
echo ${prog:t}: BUILD OF $dev HAD ERRORS
echo DISK MAY NOT BE USABLE, REVIEW ERROR LOG
echo ========================================
else
echo ""
echo ==========================
echo Build of $dev complete
echo ==========================
endif
ejectit:
if ( $type =~ od ) then
disk -e ${rdev}a
endif
exit($exitstatus)