home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / lib / rpm / vpkg-provides.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  2006-11-29  |  9KB  |  399 lines

  1. #!/bin/sh
  2.  
  3. #
  4. # Original Author: Tim Mooney (mooney@plains.NoDak.edu)
  5. # Improvements by: Ken Estes <kestes@staff.mail.com>
  6. # This file is distributed under the terms of the GNU General Public License
  7. #
  8.  
  9. # vpkg-provides.sh is part of RPM, the Red Hat Package Manager.
  10.  
  11. # vpkg-provides.sh searches a list of directories (based on what OS
  12. # it's being executed on) for shared libraries and interpreter files
  13. # that have been installed by some packaging system other than RPM.
  14. # It then generates a spec file that can be used to build a "virtual
  15. # package" that provides all of these things without actually
  16. # installing any files.  The spec file in effect tells rpm what it
  17. # needs to know about operating system files which are not under rpm
  18. # control.  This makes it much easier to use RPM on non-Linux systems.
  19.  
  20. # By default the script also generates a %verifyscript (with hard
  21. # coded $shlib_dirs, $ignore_dirs values) which will check that the
  22. # checksum of each file in the directories searched has not changed
  23. # since the package was built.
  24.  
  25. # Comments: This script is a quick hack.  A better solution is to use the
  26. # vendor's package management commands to actually query what's installed, and
  27. # build one or more spec files based on that.  This is something
  28. # I intend to write, probably in perl, but the need for something like this
  29. # first effort was great, so I didn't want to wait until the better solution
  30. # was done.
  31.  
  32. # The complete specfile will be sent to stdout.
  33.  
  34. # you will need to create a spec_header for the virtual package.  This
  35. # header will provide such specfile information as:
  36. #
  37. #  Summary: 
  38. #  Name: 
  39. #  Version: 
  40. #  Release: 
  41. #  Copyright: 
  42. #  Group: 
  43. #  Source: 
  44.  
  45.  
  46. # most of the command line arguments have defaults
  47.  
  48. usage="usage: $0 --spec_header '/path/to/os-base-header.spec' \n"
  49. usage="$usage\t[--find_provides '/path/to/find-provides']\n"
  50. usage="$usage\t[--shlib_dirs 'dirs:which:contain:shared:libs']\n"
  51. usage="$usage\t[--ignore_dirs 'egrep|pattern|of|paths|to|ignore']\n"
  52.  
  53. # these two should be unnessary as the regular dependency analysis
  54. # should take care of interpreters as well as shared libraries.
  55.  
  56. usage="$usage\t[--interp_dirs 'dirs:which:contain:interpreters']\n"
  57. usage="$usage\t[--interps 'files:to:assume:are:installed']\n"
  58. usage="$usage\t[--no_verify]\n"
  59.  
  60.  
  61. # this command may not be portable to all OS's, does something else
  62. # work? can this be set in the case $osname statement?
  63.  
  64. sum_cmd="xargs cksum"
  65.  
  66. date=`date`
  67. hostname=`uname -n`
  68.  
  69. # if some subdirectories of the system directories needs to be ignored
  70. # (eg /usr/local is a subdirectory of /usr but should not be part of
  71. # the virtual package) then call this script with ignore_dirs set to a
  72. # vaild egrep pattern which discribes the directories to ignored.
  73.  
  74. PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb:/usr/bsd
  75. export PATH
  76.  
  77.  
  78. #
  79. # The (OS independent) default values.
  80. #
  81. spec_header='/usr/lib/rpm/os-base-header.spec';
  82. interps="sh:csh:ksh:dtksh:wish:tclsh:perl:awk:gawk:nawk:oawk"
  83. find_provides='/usr/lib/rpm/find-provides';
  84.  
  85.     # no file names begin with this character so it is a good default
  86.     # for dirs to ignore.  
  87.  
  88. ignore_dirs="@"
  89.  
  90.  
  91. osname=`uname -s`
  92. if test $? -ne 0 || test X$osname = X ; then
  93.     echo "I can't determine what platform this is.  Exiting"
  94.     exit 1
  95. fi
  96.  
  97.  
  98. #
  99. # Set OS dependent defaults
  100. #
  101. case $osname in
  102.     OSF1)
  103.         shlib_dirs='/shlib:/usr/shlib:/usr/dt/lib:/usr/opt'
  104.         interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin:/usr/bin/posix'
  105.         ;;
  106.     HP-UX)
  107.         shlib_dirs='/usr/shlib:/usr/dt/lib:/opt'
  108.         shlib_dirs="$shlib_dirs:/usr/bms:/usr/obam:/usr/sam"
  109.         interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin:/usr/bin/posix'
  110.         ;;
  111.     AIX)
  112.         shlib_dirs='/usr/lib:/usr/ccs/lib:/usr/dt/lib:/usr/lpp:/usr/opt'
  113.         interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin'
  114.         ;;
  115.     SunOS)
  116.         shlib_dirs='/etc/lib:/etc/vx:/opt:/usr/lib:/usr/ccs/lib:/usr/dt/lib'
  117.         shlib_dirs="$shlib_dirs:/usr/4lib:/usr/openwin/lib:/usr/snadm/lib"
  118.         shlib_dirs="$shlib_dirs:/usr/ucblib:/usr/xpg4/lib"
  119.         interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin:/usr/xpg4/bin'
  120.         ;;
  121.     IRIX|IRIX64)
  122.         shlib_dirs='/lib:/usr/lib:/usr/lib32:/usr/lib64'
  123.         # Irix always makes me laugh...
  124.         shlib_dirs="$shlib_dirs:/usr/ToolTalk:/usr/xfsm:/usr/SpeedShop"
  125.         shlib_dirs="$shlib_dirs:/usr/sgitcl:/usr/SGImeeting:/usr/pcp/lib"
  126.         shlib_dirs="$shlib_dirs:/usr/Motif-2.1"
  127.         interp_dirs='/bin:/usr/bin:/sbin:/usr/sbin:/usr/dt/bin'
  128.         ;;
  129.     *)
  130.         echo "I'm sorry.  I haven't been configured yet to work on $osname."
  131.         echo "Please poke around your system and try figure out what directories"
  132.         echo "I should be searching for shared libraries.  Once you have this"
  133.         echo "information, email it to rpm-list@redhat.com, so that your OS"
  134.         echo "will be supported by some future version of this script."
  135.         echo ""
  136.         echo "Thanks!"
  137.         echo
  138.         exit 2
  139.         ;;
  140. esac
  141.  
  142.  
  143. # allow the user to change defaults with the command line arguments.
  144.  
  145. # Loop over all args
  146.  
  147. while :
  148. do
  149.  
  150. # Break out if there are no more args
  151.     case $# in
  152.     0)
  153.         break
  154.         ;;
  155.     esac
  156.  
  157. # Get the first arg, and shuffle
  158.     option=$1
  159.     shift
  160.  
  161. # Make all options have two hyphens
  162.     orig_option=$option    # Save original for error messages
  163.     case $option in
  164.     --*) ;;
  165.     -*) option=-$option ;;
  166.     esac
  167.  
  168.  
  169.     case $option in
  170.     --spec_header)
  171.         spec_header=$1
  172.         shift
  173.         ;;
  174.     --ignore_dirs)
  175.         ignore_dirs=$1
  176.         shift
  177.         ;;
  178.     --find_provides)
  179.         find_provides=$1
  180.         shift
  181.         ;;
  182.     --shlib_dirs)
  183.         shlib_dirs=$1
  184.         shift
  185.         ;;
  186.     --interp_dirs)
  187.         interp_dirs=$1
  188.         shift
  189.         ;;
  190.     --interps)
  191.         interps=$1
  192.         shift
  193.         ;;
  194.     --no_verify)
  195.         no_verify=1
  196.         ;;
  197.     --help)
  198.         echo $usage
  199.         exit 0
  200.         ;;
  201.     *)
  202.         echo "$0: Unrecognized option: \"$orig_option\"; use --help for usage." >&2
  203.         exit 1
  204.         ;;
  205.     esac
  206. done
  207.  
  208.  
  209. # consistancy checks on the arguments
  210.  
  211. if [ ! -f $spec_header ]; then
  212.     echo "You must pass me the full path to the partial spec file"
  213.     echo "as my first argument, since this file does not appear in the"
  214.     echo "default location of $default_spec_header"
  215.     echo
  216.     echo $usage
  217.     echo
  218.     exit 9
  219. fi
  220.  
  221.  
  222. if [ ! -f $find_provides ]; then
  223.     echo "You must pass me the full path to the find-provides script as my"
  224.     echo "second argument, since find-provides does not appear in the"
  225.     echo "default location of $default_find_provides"
  226.     echo
  227.     echo $usage
  228.     echo
  229.     exit 9
  230. fi
  231.  
  232.  
  233.  
  234. provides_tmp=/tmp/provides.$$
  235. if test -f $provides_tmp ; then
  236.     echo "$provides_tmp already exists.  Exiting."
  237.     exit 11
  238. fi
  239.  
  240. #
  241. # iterate through all the directories in shlib_dirs, looking for shared
  242. # libraries
  243. #
  244. for d in `echo $shlib_dirs | sed -e 's/:/ /g'`
  245. do
  246.     find $d -type f -print 2>/dev/null | egrep -v \'$ignore_dirs\' | $find_provides >> $provides_tmp
  247. done
  248.  
  249. sum_tmp=/tmp/sum.$$
  250. if test -f $sum_tmp ; then
  251.     echo "$sum_tmp already exists.  Exiting."
  252.     exit 11
  253. fi
  254.  
  255. #
  256. # iterate through all the directories in shlib_dirs, record the sum
  257. #
  258. for d in `echo $shlib_dirs | sed -e 's/:/ /g'`
  259. do
  260.     find $d -type f -print 2>/dev/null | egrep -v \'$ignore_dirs\' | $sum_cmd >> $sum_tmp
  261. done
  262.  
  263.  
  264. #
  265. # output the initial part of the spec file
  266. #
  267. cat $spec_header
  268.  
  269. #
  270. # output the 'Provides: ' part of the spec file
  271. #
  272. {
  273.     #
  274.     # Output the shared libraries
  275.     #
  276.     for f in `cat $provides_tmp | sort -u`
  277.     do
  278.     echo "Provides: $f"
  279.     done
  280.  
  281.     #
  282.     # Output the available shell interpreters
  283.     #
  284.     for d in `echo $interp_dirs | sed -e 's/:/ /g'`
  285.     do
  286.     for f in `echo $interps | sed -e 's/:/ /g'`
  287.     do
  288.         if test -f $d/$f ; then
  289.             echo "Provides: $d/$f"
  290.         fi
  291.     done
  292.     done
  293. } | sed -e 's/%/%%/g'
  294.  
  295. #
  296. # Output the discription of the spec file
  297. #
  298.  
  299. cat <<_EIEIO_
  300.  
  301.  
  302. %description
  303. This is a virtual RPM package.  It contains no actual files.  It uses the
  304. \`Provides' token from RPM 3.x and later to list many of the shared libraries
  305. and interpreters that are part of the base operating system and associated
  306. OS packages for $osname.
  307.  
  308. This virtual package was constructed based on the vendor/system software
  309. installed on the '$osname' machine named '$hostname', as of the date
  310. '$date'.
  311.  
  312. Input to the script:
  313.  
  314.                 spec_header=$spec_header
  315.                 ignore_dirs=$ignore_dirs
  316.                 find_provides=$find_provides
  317.                 shlib_dirs=$shlib_dirs
  318.                 interp_dirs=$interp_dirs
  319.                 interps=$interps
  320.  
  321. _EIEIO_
  322.  
  323. #
  324. # Output the build sections of the spec file
  325. #
  326.  
  327. echo '%prep'
  328. echo '# nothing to do'
  329. echo '%build'
  330. echo '# nothing to do'
  331. echo '%install'
  332. echo '# nothing to do'
  333. echo '%clean'
  334. echo '# nothing to do'
  335.  
  336. if [ -z "${no_verify}" ]; then
  337.  
  338. #
  339. # Output the optional verify section of the spec file
  340. #
  341.  
  342. cat <<_EIEIO_
  343.  
  344. %verifyscript
  345.  
  346. PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb:/usr/bsd
  347. export PATH
  348.  
  349. sum_current_tmp=/tmp/rpm.sum.current.\$\$
  350. if test -f \$sum_current_tmp ; then
  351.     echo "\$sum_current_tmp already exists.  Exiting."
  352.     exit 11
  353. fi
  354.  
  355. sum_package_tmp=/tmp/rpm.sum.package.\$\$
  356. if test -f \$sum_package_tmp ; then
  357.     echo "\$sum_package_tmp already exists.  Exiting."
  358.     exit 11
  359. fi
  360.  
  361. for d in `echo $shlib_dirs | sed -e 's/:/ /g'`
  362. do
  363.     find \$d -type f -print 2>/dev/null | egrep -v \'$ignore_dirs\' | $sum_cmd >> \$sum_current_tmp
  364. done
  365.  
  366. cat >\$sum_package_tmp <<_EOF_
  367. _EIEIO_
  368.  
  369. # the contents of the temporary file are hardcoded into the verify
  370. # script so that the file can be reproduced at verification time.
  371.  
  372. cat $sum_tmp | sed -e 's/%/%%/g'
  373.  
  374. cat <<_EIEIO_
  375. _EOF_
  376.  
  377.  
  378. cmp \$sum_package_tmp \$sum_current_tmp 
  379.  
  380. if [ \$? -ne 0 ]; then
  381.     echo"Differences found by: cmp \$sum_package_tmp \$sum_current_tmp"
  382.     exit \$?
  383. fi
  384.  
  385. _EIEIO_
  386.  
  387. # end optional verify section
  388. fi
  389.  
  390. #
  391. # Output the files section of the spec file
  392. #
  393.  
  394. echo '%files'
  395. echo '# no files in a virtual package'
  396.  
  397. exit 0
  398.