Jul 16

[原]整合红旗CD安装光盘为DVD光盘的脚本 晴

linuxing , 15:49 , 编程 » 示例 , 评论(2) , 引用(0) , 阅读(35459) , Via 本站原创 | |

#! /bin/bash
# 2007-07-10 by Linuxing
# ver 1.7
E_WRONGARGS=65
E_ISOWRONG=60

#定义使用帮助的函数
helpecho ()
{
  echo "`basename $0` can have 2 arguments."
  echo "-----------------------------------------------------------------------------------------------"
  echo "usage: `basename $0` [-a x86|x86_64] [-c copy|release] [-v dc4.1|dc5.0]  SOURCEPATH TARGETPATH"
  echo "-a means Architectue: x86|x86_64"
  echo "-v means Operating System Name: dc4.1|dc5.0"
  echo "-c means Copy or Release Tools Disk CD to DVD Disk: copy|release"
  echo "-i means CD Disk iso name,for example:"
  echo "   RedFlag DC 5.0 for x86's CD Disk iso is redflag-dc5.0-sp2-x86-release-disc{1234}.iso"
  echo "   So you can use: -i redflag-dc5.0-sp2-x86-release"
  echo "-p means patch version,for example:sp2"
  echo "-h means HELP !!"
  echo "SOURCEPATH means where is the location of your CD Disk iso in."
  echo "TARGETPATH means where is you want to put the Final DVD iso to."
  echo "-----------------------------------------------------------------------------------------------"
}

#获取命令行参数
while getopts "a:c:v:i:p:h" Option
do
  case $Option in
  a)
    CUMARCH=$OPTARG
    echo "CUMARCH is $CUMARCH"
    ;;
  c)
    case $OPTARG in
      copy|release) CUMMODE=$OPTARG;;
      *)
      echo -e "-c argument is wrong./nPlease choice onf of 'copy' or 'release'."
      exit $E_WRONGARGS
      ;;
    esac
    ;;
  v)
    if [ $OPTARG == "dc4.1" ] || [ $OPTARG == "dc5.0" ];then
      CUMVER=$OPTARG
      else
      echo -e "-v argument is wrong./nPlease choice onf of 'dc4.1' or 'dc5.0'."
      exit $E_WRONGARGS
    fi
    ;;
  i)
    if [ -e "$OPTARG-disc1.iso" ]; then
      CUMISONAME=$OPTARG
      else
      echo -e "-i argument is wrong./nPlease confirm your iso name $OPTARG is right."
      exit $E_WRONGARGS
    fi
    ;;
  p)
    CUMPATCH=$OPTARG
    echo "CUMPATCH is $CUMPATCH"
    ;;
  h)
    helpecho
    exit
    ;;
  esac
done
shift $(($OPTIND -1))  

#设置ISO源路径及DVD的目标路径
if [ $# -eq 2 ] && [ -d $1 ] && [ -d $2 ]; then
  SOURCEPATH=${1%/}
  TEMPROOT=${2%/}
  cd $SOURCEPATH;SOURCEPATH=`pwd`
  cd - > /dev/null
  cd $TEMPROOT;TEMPROOT=`pwd`
  cd - > /dev/null
  else
  echo "Use default arguments."
  helpecho
  SOURCEPATH=`pwd`
  TEMPROOT=`pwd`
fi

echo "SOURCEPATH is $SOURCEPATH"
echo "TARGETPATH is $TEMPROOT"

#设置一系列环境变量
MOUNTEMP="/mnt/disk"
TEMP="$TEMPROOT/install"
TEMPTOOLS="$TEMP/tools"
TEMPSCRIPTS="$TEMP/scripts"
TEMPRPMS="$TEMP/Asianux/RPMS"
TEMPBASE="$TEMP/Asianux/base"
TEMPISOLINUX="$TEMP/isolinux"
CUMSCRIPTS="$SOURCEPATH/scripts"
CUMRPMS="$SOURCEPATH/rpms"
CUMISOLINUX="$SOURCEPATH/isolinux"
CUMBASE="$SOURCEPATH/base"
DEFAULTARCH=x86
DEFAULTVER="dc5.0"
DEFAULTMODE="release"
DEFAULTPATCH="sp2"
ARCH=${CUMARCH:-$DEFAULTARCH}
NAME="redflag"
VER=${CUMVER:-$DEFAULTVER}
PATCH=${CUMPATCH:-$DEFAULTPATCH}
RELEASE=release
DEFAULTISONAME="$NAME-$VER-$PATCH-$ARCH-$RELEASE"
ISONAME=${CUMISONAME:-$DEFAULTISONAME}
DVDNAME="$NAME-$VER-$PATCH-$ARCH-$RELEASE-dvd.iso"
LIST=/tmp/list
TMPLIST=/tmp/list.tmp
EXCLUDEFILES="rflicense cdrecord evlog kolourpaint libeasyrpm openhpi openhpi-clients openhpi-daemon openhpi-devel rfmon rfuser rpmtools"
MODE=${CUMMODE:-$DEFAULTMODE}

#定义挂载及解压ISO的函数
mountiso ()
{
if [ ! -d $MOUNTEMP ]; then
  mkdir -p $MOUNTEMP
  echo "$MOUNTEMP directory create successfully."
fi
if [ ! -d $TEMP ]; then
  mkdir -p $TEMP
  echo "$TEMP directory create successfully."
fi
echo "Mount $FILENAME"
mount -o loop $FILENAME $MOUNTEMP
cd $MOUNTEMP
echo "Move source cd packages to $TEMP directory."
tar cf - ./|tar xf - -C $TEMP
cd -
echo "Umount $MOUNTEMP"
umount $MOUNTEMP
}

#定义生成rpm临时list文件的函数
mklist ()
{
local file
local filename
local rpmlist
for file in $RPMSPATH/*.rpm
do
  #filename=${file#$RPMSPATH/}
  #filename=$(expr match "$file" '\([a-zA-Z0-9_]*-[a-zA-Z\-]*\)')
        #filename=${file%-}
        filename=`rpm -qp --nosignature --qf "%{name}" $file`
        for rpmlist in $EXCLUDEFILES
        do
          if [ "$filename" == "$rpmlist" ];then
            continue 2
          fi
        done
        echo $filename >> $TMPLIST
        #echo "Copy $file packages to $TEMPRPMS directory."
        cp -a $file $TEMPRPMS
done
}

#定义生成新的comps.xml的函数
mkcomps ()
{
echo "Modify comps.xml file"
echo '<!-- Addons rpm packages -->' >> $LIST
echo "
  <group>
    <id>$ID</id>
    <name>$ID</name>
    <uservisible>true</uservisible>
    <default>false</default>
    <description></description>
    <packagelist>" >> $LIST
sed -i 's#\(.*\)#      <packagereq type="optional">\1</packagereq>#' $TMPLIST
cat $TMPLIST >> $LIST
echo '    </packagelist>
  </group>
' >> $LIST
sed -i -e "/<CUMGROUP>/r $LIST" $CUMBASE/comps.xml
sed -i "/<CUMID>/a\        <subcategory>$ID</subcategory>" $CUMBASE/comps.xml
echo "Clean up $LIST & $TMPLIST file."
: > $LIST
: > $TMPLIST
}

#定义释放Tools工具盘的函数
releasedisk ()
{
echo "Mount $FILENAME"
mount -o loop $FILENAME $MOUNTEMP
local path
echo "Create Disk$i CD packages list."
ID=disk$i
#CUMRPMSPATH="$MOUNTEMP/RedFlag/RPMS $MOUNTEMP/EASuite/RPMS"
CUMRPMSPATH="$MOUNTEMP/RedFlag/RPMS"
for path in $CUMRPMSPATH
do
  RPMSPATH=$path
  mklist
done
echo "Add Disk$i rpm info to comps.xml file"
mkcomps
if [ ! -d $TEMPTOOLS ]; then
  mkdir $TEMPTOOLS
  echo "$TEMPTOOLS directory create successfully."
fi
echo "Copy rflicense packages to $TEMPTOOLS directory."
cp -a $MOUNTEMP/RedFlag/RPMS/rflicense* $TEMPTOOLS
if [ $VER == "dc5.0" ];then
  echo "Copy Disk$i Documents and other tools to $TEMPTOOLS directory."
  cp -a $MOUNTEMP/Documents $TEMPTOOLS
  cp -a $MOUNTEMP/EASuite $TEMPTOOLS
  cp -a $MOUNTEMP/emulex $TEMPTOOLS
  cp -a $MOUNTEMP/image $TEMPTOOLS
  cp -a $MOUNTEMP/ICC $TEMPTOOLS
  cp -a $MOUNTEMP/RedFlag/Kernel $TEMPTOOLS
fi
echo "Umount $MOUNTEMP"
umount $MOUNTEMP
}

#定义拷贝Tools工具盘的函数
copydisk ()
{
if [ ! -d $TEMPTOOLS ]; then
    mkdir $TEMPTOOLS
    echo "$TEMPTOOLS directory create successfully."
fi
echo "Copy $FILENAME to $TEMPTOOLS directory."
cp $FILENAME $TEMPTOOLS
}

#定义生成hdlist的函数
createhdlist ()
{
export PYTHONPATH=/usr/lib/anaconda:/usr/lib/anaconda-runtime:$PYTHONPATH
export PATH="$PATH:/usr/lib/anaconda-runtime"
cd $TEMPROOT
genhdlist --productpath "Asianux" $TEMP
if [ `uname -i` = "$ARCH" ]; then
  pkgorder --product Asianux $TEMP Asianux > $TEMPROOT/pkgorder.txt
  genhdlist --withnumbers --fileorder $TEMPROOT/pkgorder.txt \
  --productpath "Asianux" $TEMP
fi
cd -
}

#定义把自定义rpm包加入光盘的函数
rpmsfile ()
{
if [ -d $CUMRPMS ]; then
  echo "Create Customize packages list."
  ID=addons
  RPMSPATH=$CUMRPMS
  mklist
  echo "Add Customize info to comps.xml file"
  mkcomps
fi
}

#定义加入kickstart脚本到光盘中的函数
autoks ()
{
if [ -e "$CUMISOLINUX/autoks.cfg" ]; then
  echo "Copy some new .msg & autoks.cfg scripts to 'isolinux' directory."
  cp -p $CUMISOLINUX/* $TEMPISOLINUX
  else
  echo "There is no autoks.cfg file in $CUMISOLINUX directory."
fi
}

#定义加入自定义脚本到光盘中的函数
scriptsfile ()
{
if [ ! -d $TEMPSCRIPTS ]; then
  mkdir $TEMPSCRIPTS
  echo "$TEMPSCRIPTS directory create successfully."
fi
echo "Copy all scripts to $TEMPSCRIPTS."
cp -a $CUMSCRIPTS $TEMPSCRIPTS
}

#定义生成DVD光盘的函数
mkdvdiso ()
{
cd $TEMP
echo "Remove all TRANS.TBL files."
find $TEMP -name 'TRANS.TBL' -exec rm {} \;
#修改.discinfo中第四行的光盘数量标识
echo "Modify .discinfo file"
sed -i '4c1' .discinfo
echo "Renew $CUMBASE/comps.xml file"
sed -i '/<CUMGROUP>/d' $CUMBASE/comps.xml
sed -i '/<CUMID>/d' $CUMBASE/comps.xml
echo "Copy comps.xml to BASE directory."
cp -p $CUMBASE/comps.xml $TEMPBASE
echo "Resume original comps.xml file"
cp $CUMBASE/comps.xml $CUMBASE/comps.xml.new
cp $CUMBASE/comps.xml.bak $CUMBASE/comps.xml
echo "Create $TEMPROOT/$DVDNAME"
mkisofs -b isolinux/isolinux.bin -no-emul-boot \
-boot-load-size 4 -boot-info-table -c isolinux/boot.cat \
-l -J -o $TEMPROOT/$DVDNAME -r -T \
-V "$NAME $VER $RELEASE" $TEMP
cd -
echo "*******************************************"
echo "Final DVD ISO is $TEMPROOT/$DVDNAME"
echo "Congratulation !! All have been done."
echo "*******************************************"
}

#定义清理临时文件的函数
cleanup ()
{
rm -rf $TEMP
rm -f $TEMPROOT/pkgorder.txt
}

#定义预编译准备的函数
pre()
{
if [ -d $TEMP ]; then
  echo "You want to remove $TEMP directory?(Y/N)"
  read CONFIRM
  case $CONFIRM in
    Y&#124;y)
      echo "Remove $TEMP directory."
      rm -rf $TEMP
      ;;
  esac
fi

if [ -e $DVDNAME ]; then
  echo "You want to remove $DVDNAME file?(Y/N)"
  read CONFIRM
  case $CONFIRM in
    Y&#124;y)
      echo "Remove $DVDNAME file."
      rm $DVDNAME
      ;;
  esac
fi
if [ -e $CUMBASE/comps.xml ]; then
  echo "Backup customize comps.xml file"
  cp $CUMBASE/comps.xml $CUMBASE/comps.xml.bak
  cp $CUMBASE/comps.xml $CUMBASE/comps.xml.`date +%s`
fi
echo "Clean up $LIST & $TMPLIST file."
: > $LIST
: > $TMPLIST
}

#定义针对dc5x86_64sp2光盘使用3张系统安装盘时候的函数
dc5x86_64sp2 ()
{
for i in `seq 5`
do
  FILENAME="$ISONAME-disc$i.iso"

  case $i in
    4)
    if [ ! -e $FILENAME ]; then
      echo " $FILENAME not found."
      echo " Sleep 3 sec,Countinue ... "
      sleep 3
      else    
        if [ "$MODE" = "release" ] &#124;&#124; [ -z $MODE ]; then
          echo "Copy Disk$i rpms & create new comps.xml"
          releasedisk
          else
          copydisk
        fi
    fi
    continue
    ;;
    5)
    if [ ! -e $FILENAME ]; then
      echo " $FILENAME not found."
      echo " Sleep 3 sec,Countinue ... "
      sleep 3
      else
        copydisk
    fi
    continue
    ;;
    *)
    if [ ! -e $FILENAME ]; then
      echo "$FILENAME not found."
      exit $E_ISOWRONG
    else
    echo "Try to release $FILENAME"
    mountiso
    fi
    ;;
  esac
done
}

#定义针对其他安装盘使用的函数(2张系统安装盘,1张工具盘,1张开发光盘)
othercd ()
{
for i in `seq 4`
do
  FILENAME="$ISONAME-disc$i.iso"

  case $i in
    3)
    if [ ! -e $FILENAME ]; then
      echo " $FILENAME not found."
      echo " Sleep 3 sec,Countinue ... "
      sleep 3
      else    
        if [ "$MODE" = "release" ] &#124;&#124; [ -z $MODE ]; then
          echo "Copy Disk$i rpms & create new comps.xml"
          releasedisk
          else
          copydisk
        fi
    fi
    continue
    ;;
    4)
    if [ ! -e $FILENAME ]; then
      echo " $FILENAME not found."
      echo " Sleep 3 sec,Countinue ... "
      sleep 3
      else
        copydisk
    fi
    continue
    ;;
    *)
    if [ ! -e $FILENAME ]; then
      echo "$FILENAME not found."
      exit $E_ISOWRONG
    else
    echo "Try to release $FILENAME"
    mountiso
    fi
    ;;
  esac
done
}

#程序从这里开始正式执行
#-------------------Begin here----------------------------#
pre

cd $SOURCEPATH
if [ $ARCH = "x86_64" ] && [ $VER = "dc5.0" ] && [ $PATCH = "sp2" ]; then
  dc5x86_64sp2
  else
  othercd
fi

if [ -d $CUMSCRIPTS ]; then
  echo "Copy specail scripts to $TEMPSCRIPTS."
  scriptsfile
  else
  echo "There is no $CUMSCRIPTS directory."
fi

if [ -d $CUMRPMS ]; then
  echo "Copy additional rpms to $DVDNAME."
  rpmsfile
  else
  echo "There is no $CUMRPMS directory."
fi

if [ -d $CUMISOLINUX ]; then
  echo "Add autoks.cfg script to $DVDNAME's isolinux directory."
  autoks
  else
  echo "There is no $CUMISOLINUX directory."
fi

echo "Generate hdlist file."
createhdlist

echo "Make DVD ISO."
mkdvdiso

echo "Clean UP !!"
cleanup
内文分页: [1] [2]
Tags: ,
上善若水
2008/11/05 14:59
高深,一时还看不太懂
linuxing 回复于 2008/11/06 09:01
实际上很简单,新版本Asianux 3.0的更简单,脚本是看上去复杂了。
sinhoi Email
2007/08/15 08:51
mkcomps 函数写的不错.
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]