应用程序包开发者指南

示例-创建新文件

说明

对象是一个不太可能在以后进行编辑的全新文件,或者它将替换另一个软件包拥有的某个文件。

实现

将软件包对象定义为文件类型 f,并使用能够撤消更改的类操作脚本来安装该对象。

示例

/etc 中需要一个全新的文件来提供必要的信息,以便支持名为 /etc/shdisk.conf 的固态硬盘。pkgmap 文件中的条目可能如下所示:


 
.
.
.
1 f newetc /etc/shdisk.conf
.
.
.

类操作脚本 i.newetc 负责安装此文件以及需要安装到 /etc 的所有其他文件。该脚本将执行检查以确保该位置不存在其他文件。如果不存在其他文件,它只是将新文件复制到该位置。如果该位置已经有文件,该脚本将在安装新文件之前备份该文件。脚本 r.newetc 可根据需要删除这些文件并恢复原始文件。以下是安装脚本的关键片段。

# i.newetc
while read src dst; do
	  if [ -f $dst ]; then
	    dstfile=`basename $dst`
	    cp $dst $PKGSAV/$dstfile
	  fi
	  cp $src $dst
done
 
if [ "${1}" = "ENDOFCLASS" ]; then
	  cd $PKGSAV
	  tar cf SAVE.newetc .
	  $INST_DATADIR/$PKG/install/squish SAVE.newetc
fi

请注意,此脚本使用 PKGSAV 环境变量存储将被替换的文件的备份。当参数 ENDOFCLASS 传递给该脚本时,即 pkgadd 命令通知该脚本这些条目是此类中的最后一批条目,此时,该脚本将归档并压缩使用专用压缩程序(存储在软件包的安装目录中)保存的文件。

尽管在软件包更新期间使用 PKGSAV 环境变量不可靠,但如果软件包未更新(例如,未通过修补程序更新),则备份文件将是安全的。下面的删除脚本包含的代码用于处理另一个问题:pkgrm 命令的旧版本不向脚本传递 PKGSAV 环境变量的正确路径。

删除脚本可能如下所示。

# r.newetc
 
# make sure we have the correct PKGSAV
if [ -d $PKG_INSTALL_ROOT$PKGSAV ]; then
	  PKGSAV="$PKG_INSTALL_ROOT$PKGSAV"
fi
 
# find the unsquish program
UNSQUISH_CMD=`dirname $0`/unsquish
 
while read file; do
	  rm $file
done
 
if [ "${1}" = ENDOFCLASS ]; then
	  if [ -f $PKGSAV/SAVE.newetc.sq ]; then
	     $UNSQUISH_CMD $PKGSAV/SAVE.newetc
	  fi
 
	  if [ -f $PKGSAV/SAVE.newetc ]; then
	     targetdir=dirname $file	# get the right directory
	     cd $targetdir
		    tar xf $PKGSAV/SAVE.newetc
		    rm $PKGSAV/SAVE.newetc
	  fi
fi

此脚本使用软件包数据库的安装目录中的专用卸载算法 (unsquish)。这由 pkgadd 命令在安装时自动完成。所有未被 pkgadd 命令特别识别为仅限于安装的脚本都将保留在此目录中,供 pkgrm 命令使用。您无法肯定该目录位于何处,但您可以确定该目录是无层次的,并且包含该软件包的所有适当信息文件和安装脚本。此脚本根据以下事实查找该目录:即类操作脚本肯定从包含 unsquish 程序的目录中执行。

另外请注意,此脚本并不只是假定目标目录是 /etc。该目录实际上可能是 /export/root/client2/etc。可以用以下两种方式之一构建正确的目录。

通过对软件包中的每个绝对对象使用此方法,您可以确信当前的理想行为保持不变或者至少是可恢复的。