服务器 频道

Solaris 实现安装包的反安装

  【IT168 服务器学院】工作中,有时需要移植一些已经安装过的Solaris包,或者对已经安装后的包进行修改,但一时又无法找到原来的安装包。系统升级时,有时也常常涉及到对原来系统的备份问题,这时需要一些能够对原来的安装包进行备份,又能够在新系统上进行安装的工具。Solaris本身并不提供直接的工具用于包的移植。
  
  但Solaris在安装本身通用的PKG包时,会产生两个与安装包相关的文档/上录,分别在/var/sadm/pkg/<pkgname>下和/var/sadm/install/contents中,通过对这两个文档进行解析,可以实现对Solaris包的反安装,这在实现系统升级时尤其有用。
  
  以下脚本会在当前的运行目录下产生压缩的系统安装包,Copy/Paste本脚本到Solaris机上,运行后输入需要反安装的包名即可。欢迎大家测试。
  
  #!/bin/ksh
  
  #########################################
#################
  #
  # Copyright (c) 2002 Chinaunix.net -- Solaris
  #
  # Module Description ::
  # Script to create Sun packages from existing installation
  #
  ########################################
##################
  
  # [Global Parameters]
  #===============================================
  
  MAIN_DIR=`pwd`
  PRO_DIR=$MAIN_DIR/process
  PKG_DIR=$MAIN_DIR/package
  SYS_DIR=/var/sadm/pkg
  CNT_FILE=/var/sadm/install/contents
  ID=`/usr/bin/id | awk -F= ''{print $2}'' | awk -F\( ''{print $1}''`
  VER=sol`uname -r | cut -d. -f2,2`
  
  GREP=/bin/grep
  # awk can not handle long line with many fileds.
  # In Solaris, use ''nawk'' or ''gawk'' instead.
  AWK=/bin/nawk
  GZIP=/bin/gzip
  MKDIR=/bin/mkdir
  CHMOD=/bin/chmod
  CHOWN=/bin/chown
  CP=/bin/cp
  MV=/bin/mv
  PKGMK=/bin/pkgmk
  PKGTRANS=/bin/pkgtrans
  
  # [Functions]
  #=============================================
=====================
  
  function mk_dir
  {
  $MKDIR -p $PRO_DIR/$3
  $CHMOD $4 $PRO_DIR/$3
  $CHOWN $5:$6 $PRO_DIR/$3
  }
  
  function cp_file
  {
  $CP -p $3 $PRO_DIR/$3
  $CHMOD $4 $PRO_DIR/$3
  $CHOWN $5:$6 $PRO_DIR/$3
  }
  
  # [Main]
  #=============================================
=====================
  
  if [ ${ID} != 0 ]
  then
  echo ""
  echo "Only Root User allow to run this script. Exit...."
  sleep 1
  echo ""
  exit 1
  fi
  
  echo ""
  echo "Please enter package name you want to create, then press Enter: "
  echo "Enter Package name: \c"
  read pkgname
  
  PKG_NAME=$pkgname
  
  if [ ! -d $SYS_DIR/$PKG_NAME ]; then
  echo ""
  echo "This Package doesn''t exist!!! Please check the name and try again!"
  echo ""
  exit 1
  fi
  
  if [ ! -d $PRO_DIR ]; then
  $MKDIR $PRO_DIR
  fi
  
  if [ ! -d $PKG_DIR ]; then
  $MKDIR $PKG_DIR
  fi
  
  # Producing part of Prototype file
  
  $GREP $PKG_NAME $CNT_FILE | $GREP -v ^#.* > $PRO_DIR/cnt_pkg
  $AWK ''{print $2,$3,$1,$4,$5,$6}'' $PRO_DIR/cnt_pkg > $PRO_DIR/Prototmp
  $GREP ^d $PRO_DIR/Prototmp > $PRO_DIR/Protodir
  $GREP ^f $PRO_DIR/Prototmp >> $PRO_DIR/Protofile
  
  rm -f $PRO_DIR/Prototmp
  rm -f $PRO_DIR/cnt_pkg
  
  # Producing pkginfo file
  
  cp $SYS_DIR/$PKG_NAME/pkginfo $PRO_DIR
  
  # Making directory with permission
  
  i=0
  while IFS='' '' read line
  do
  t[$i]=$line
  ((i=i+1))
  mk_dir $line
  done < $PRO_DIR/Protodir
  
  # Copying file to Spool directory
  
  i=0
  while IFS='' '' read line
  do
  t[$i]=$line
  ((i=i+1))
  cp_file $line
  done < $PRO_DIR/Protofile
  
  # Producing Prototype file
  
  cat $PRO_DIR/Protodir > $PRO_DIR/Prototype
  cat $PRO_DIR/Protofile >> $PRO_DIR/Prototype
  (echo "i pkginfo"; cat $PRO_DIR/Prototype ) > $PRO_DIR/Prototmp
  mv $PRO_DIR/Prototmp $PRO_DIR/Prototype
  
  rm -f $PRO_DIR/Protodir
  rm -f $PRO_DIR/Protofile
  
  # Now let''s make the package
  
  $PKGMK -o -r $PRO_DIR -d $PRO_DIR -f $PRO_DIR/Prototype
  $PKGTRANS -s $PRO_DIR $PKG_DIR/$PKG_NAME-$VER-pkg $PKG_NAME
  $GZIP -f $PKG_DIR/$PKG_NAME-$VER-pkg
  
  rm -rf $PRO_DIR
  
0
相关文章