1

rpm.spec ファイルの %pre/%post スクリプトレットのベスト プラクティスを追跡しようとしています。

具体的には、かなり複雑なインストールを行うシステムがあります。とりわけ、多くの「セキュリティが強化された Linux」のカスタマイズ、iptable の編集、ユーザーの作成 (パスワードを使用)、「chown」などを行う必要があります。

問題は、これをどこで行うかです。これを事前/事後スクリプトレットに入れる必要がありますか? ベストプラクティスは、これらをできるだけシンプルに保ち、間違いなくインタラクティブにしないことです。

Postgres インストーラー (およびその他のインストーラー) は、root ユーザーがスクリプトを実行して、postgres ユーザーのパスワードの設定などの特定のことを行う必要がある「手動ポスト インストール」ステップを実行することに気付きました。rpm が出力される場所を以下に示します。これ:To initialize, run /etc/init.d/postgres-9.1-openscg start as root user.

抽出されたスクリプトレットは次のとおりです。

rpm -qp --scripts postgres-9.1.2-1.i386.openscg.rpm

プリインストール スクリプトレット (/bin/sh を使用):

if [ "$1" = "2" ]; then
  #Perform maintenance tasks before server upgrade begins.
  #Determine if server is running, stops it.
  /etc/init.d/postgres-9.1-openscg status &> /dev/null
  if [ "$?" = "0" ];
  then
   /etc/init.d/postgres-9.1-openscg stop
   touch /tmp/pg_9.1.stopped
  fi
fi

postinstall スクリプトレット (/bin/sh を使用):

if type "/usr/bin/chcon" &> /dev/null ; then
  /usr/bin/chcon -t textrel_shlib_t $RPM_INSTALL_PREFIX/lib/libedit.so &> /dev/null 
fi

#Create a soft link to init script
if [ ! -f /etc/init.d/postgres-9.1-openscg ]
then
  ln -s $RPM_INSTALL_PREFIX/bin/postgres-9.1-openscg /etc/init.d/postgres-9.1-openscg
fi


#In case of upgrade, dump environment values file
#if [ "$1" = "2" ];
#then
  #Fix for psql dumb terminal issue
  LD_PRELOAD_VALUE=""
  for libreadline in `find -L /lib  -type f -name libreadline.\* 2> /dev/null`
  do
    LD_PRELOAD_VALUE="$libreadline:$LD_PRELOAD_VALUE"
  done
  if [ x"$LD_PRELOAD_VALUE" != x"" ];
  then
    LD_PRELOAD_VALUE="export LD_PRELOAD=$LD_PRELOAD_VALUE"
  fi

  #Dump environment values
cat <<ENVEOF > $RPM_INSTALL_PREFIX/pg91-openscg.env 
#!/bin/bash
$LD_PRELOAD_VALUE
export PGHOME=$RPM_INSTALL_PREFIX
export PGDATA=$RPM_INSTALL_PREFIX/data
export PATH=$RPM_INSTALL_PREFIX/bin:\$PATH
export LD_LIBRARY_PATH=$RPM_INSTALL_PREFIX/lib:\$LD_LIBRARY_PATH
export PGUSER=postgres
export PGDATABASE=postgres
ENVEOF

 #Determine port from postgresql.conf
 PGPORT_VALUE=""
 if [ -f $RPM_INSTALL_PREFIX/data/postgresql.conf ]; then
  PGPORT_VALUE=`grep "port =" $RPM_INSTALL_PREFIX/data/postgresql.conf | sed -e      "s/^.*port[[:space:]]=[[:space:]]\([0-9]\+\).*$/\1/"`
  PGPORT_VALUE="export PGPORT=$PGPORT_VALUE"
  cat <<ENVEOF >> $RPM_INSTALL_PREFIX/pg91-openscg.env 
$PGPORT_VALUE
ENVEOF
 fi

#fi

# If it is an upgrade, and we stopped a running server, start it.
if [ "$1" = "2" -a -f /tmp/pg_9.1.stopped ];
then
  rm /tmp/pg_9.1.stopped
  /etc/init.d/postgres-9.1-openscg start
fi

if [ "$1" = "1" ];
then
  echo "PostgreSQL 9.1 is now installed in $RPM_INSTALL_PREFIX."
  echo
  echo "To initialize, run /etc/init.d/postgres-9.1-openscg start"
  echo "as root user."
fi
if [ "$1" = "2" ];
then
  echo "PostgreSQL 9.1 is upgraded in $RPM_INSTALL_PREFIX."
fi

preuninstall スクリプトレット (/bin/sh を使用):

if [ "$1" = "0" ]; then
  #Action is uninstallation, not called due to upgrade of a new package

  #Determine if server is running, stops it.
  /etc/init.d/postgres-9.1-openscg status &> /dev/null
  if [ "$?" = "0" ];
  then
   echo "Attempting to stop server..."
   /etc/init.d/postgres-9.1-openscg stop
  fi

  echo "Attempting to update server startup status..." 
  if type "/sbin/chkconfig" &> /dev/null ; then
   /sbin/chkconfig --del postgres-9.1-openscg 
  fi
fi

アンインストール後のスクリプトレット (/bin/sh を使用):

if [ "$1" = "0" ]; then
  #Action is uninstallation, not called due to upgrade of a new package
  rm /etc/init.d/postgres-9.1-openscg
  echo "Uninstallation complete."
fi
4

1 に答える 1

6

RPM インストール中のユーザー操作に関連するベスト プラクティスを意味するのであれば、疑いの余地はありません。これをしないでください。スクリプトレットでユーザーの操作を必要としないことは何でも行い、ユーザーにインストール後にスクリプトを実行するように指示するか、アプリの最初の実行ですべての情報を取得します。

于 2013-09-25T05:47:49.060 に答える