Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux RPM%post scriptlet最佳实践_Linux_Rpm_Rpm Spec - Fatal编程技术网

Linux RPM%post scriptlet最佳实践

Linux RPM%post scriptlet最佳实践,linux,rpm,rpm-spec,Linux,Rpm,Rpm Spec,我正在尝试跟踪rpm.spec文件中%pre/%post脚本的最佳实践 具体来说,我有一个安装相当复杂的系统。除此之外,它还需要进行大量的“安全增强型Linux”定制、iptable编辑、用户创建(使用密码)和“chown”-ing等 问题是在哪里这样做?这应该放在pre/post脚本中吗?最好的做法似乎是将这些保持不变 我注意到Postgres安装程序(和其他一些)执行了一个“手动后安装”步骤,根用户需要运行一个脚本来执行某些操作,如设置Postgres用户的密码等。您可以在下面的rpm打印位

我正在尝试跟踪rpm.spec文件中%pre/%post脚本的最佳实践

具体来说,我有一个安装相当复杂的系统。除此之外,它还需要进行大量的“安全增强型Linux”定制、iptable编辑、用户创建(使用密码)和“chown”-ing等

问题是在哪里这样做?这应该放在pre/post脚本中吗?最好的做法似乎是将这些保持不变

我注意到Postgres安装程序(和其他一些)执行了一个“手动后安装”步骤,根用户需要运行一个脚本来执行某些操作,如设置Postgres用户的密码等。您可以在下面的rpm打印位置看到它:
初始化,运行/etc/init.d/Postgres-9.1-openscg以根用户身份启动。

以下是提取的脚本:

rpm -qp --scripts postgres-9.1.2-1.i386.openscg.rpm
预安装scriptlet(使用/bin/sh):

postinstall scriptlet(使用/bin/sh):

姿势安装scriptlet(使用/bin/sh):


如果您指的是与RPM安装时的用户交互相关的最佳实践,那么毫无疑问。不要这样做。在Scriptlet中执行任何不需要用户交互的操作,并告诉用户在安装后运行脚本,或者在应用程序的第一次运行中获取所有信息。

如果您指的是与RPM安装时的用户交互相关的最佳实践,那么这是毫无疑问的。不要这样做。在Scriptlet中执行任何不需要用户交互的操作,并告诉用户在安装后运行脚本,或者在第一次运行应用程序时获取所有信息。

否。。。我知道互动很糟糕。。。就我个人而言,我敢打赌它一定会坏的。我的问题更。。。是否可以将条目作为RPM脚本的一部分注入iptables配置?您是否应该告诉用户您正在这样做?你是否应该像postgres那样解决这个问题,并要求用户运行一个“安装后脚本”?这两种方法都是可以的,也是很好的实践。在这种情况下,您应该采取的方式取决于用户。他们是技术人员吗?他们是否了解应用或不应用iptables规则的后果?顺便说一句,我在kickstart中的O/S安装期间设置了iptables。这是一个商业产品,因此用户可能是混合用户。我认为在某些情况下,用户会被吓坏。假设它安装在政府/军事系统中,安装程序现在正在打开端口并与其他系统配置发生冲突。Kickstart我认为有点不同,因为你写了脚本,所以你知道你在做什么。我认为教训是“这是一条很好的线,你应该小心行走”。绝对。祝你好运不我知道互动很糟糕。。。就我个人而言,我敢打赌它一定会坏的。我的问题更。。。是否可以将条目作为RPM脚本的一部分注入iptables配置?您是否应该告诉用户您正在这样做?你是否应该像postgres那样解决这个问题,并要求用户运行一个“安装后脚本”?这两种方法都是可以的,也是很好的实践。在这种情况下,您应该采取的方式取决于用户。他们是技术人员吗?他们是否了解应用或不应用iptables规则的后果?顺便说一句,我在kickstart中的O/S安装期间设置了iptables。这是一个商业产品,因此用户可能是混合用户。我认为在某些情况下,用户会被吓坏。假设它安装在政府/军事系统中,安装程序现在正在打开端口并与其他系统配置发生冲突。Kickstart我认为有点不同,因为你写了脚本,所以你知道你在做什么。我认为教训是“这是一条很好的线,你应该小心行走”。绝对。祝你好运
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
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
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
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