Using BSD Administration Scripts to verify your installed ports
I recently discovered the nice set of packages provided by BSDAdminScripts. It includes a number of programs that help you validate your installed packages. It has pkg_libchk for validating that your installed programs are linked to libraries that are actually installed. pkg_validate checks the checksums of everything installed and lets you know when those don't match. Also included are portconfig and rcstart, each of which I'll cover below.
pkg_libchk
This is so far my favorite app I have found in a while. It basically lets me know which packages I need to recompile because a package that they depend on has been upgraded. For example:
> pkg_libchk diablo-jdk-1.6.0.07.02_9: /usr/local/diablo-jdk1.6.0/bin/unpack200 misses libz.so.4 diablo-jdk-1.6.0.07.02_9: /usr/local/diablo-jdk1.6.0/jre/bin/unpack200 misses libz.so.4 diablo-jdk-1.6.0.07.02_9: /usr/local/diablo-jdk1.6.0/jre/lib/amd64/libJdbcOdbc.so misses libodbcinst.so jdk-1.6.0.3p4_17: /usr/local/jdk1.6.0/jre/lib/amd64/libJdbcOdbc.so misses libodbcinst.so mediatomb-0.12.1_1: /usr/local/bin/mediatomb misses libmp4v2.so.0 net-snmp-5.5_4: /usr/local/lib/libnetsnmphelpers.so.20 misses libperl.so net-snmp-5.5_4: /usr/local/lib/libnetsnmpmibs.so.20 misses libperl.so net-snmp-5.5_4: /usr/local/lib/libnetsnmpmibs.so.20 misses libperl.so >
The above shows me that I have 4 packages that have dependencies that are out of sync. The easy solution from there is to use portupgrade -f for each of the 4 packages and recompile them. I had already cleaned up quite a mess with libgcrypt for 160 packages so this list is much smaller than when it started.
The reason I like this program so much is that it can help me find some of those weird issues where a piece of a program won't work right or something crashes on you. Many times this is because some ports are out of sync. Rather than recompile all 900+ ports I have installed which can take 18 hours, this lets me be a bit more surgical in what I do.
pkg_validate
This program lets me know what files are wrong according to checksums or are missing according to the install manifests. Simply enough from here, I can choose to recompile any packages that are off. A while back, I managed to blow up my entire /var/db/pkg directory and had to restore from backup and then recompile what I thought was missing. Running this, I see that I still have some mess to clean up.
[tethys]:/home/rnejdl> pkg_validate csum miss package origin 7 0 GeoIP-1.4.6 net/GeoIP 6 0 adns-1.4_1 dns/adns 1 0 appres-1.0.2 x11/appres 12 0 apr-ipv6-devrandom-gdbm-db42-1.4.2.1.3.9_1 devel/apr1 2 0 arc-5.21o_1 archivers/arc 4 0 arj-3.10.22_3 archivers/arj 2 1 assp-1.7.5.7 mail/assp.new 2 0 avahi-app-0.6.27_2 net/avahi-app 3 0 bitmap-1.0.4 x11/bitmap 4 0 bullet-2.75 devel/bullet 2 0 cairo-1.8.10_1,1 graphics/cairo 3 0 cal3d-0.11.0_1 graphics/cal3d 2 0 cclient-2007e,1 mail/cclient 5 0 cegui-0.6.2b_2 graphics/cegui 1 0 consolehm-1.31_1 sysutils/consolehm 1 0 ctorrent-3.3.2_3 net-p2p/ctorrent ...
I haven't gone through and tried to clean this list up yet but when I have a bit of down time, I'll see what it does for me.
portconfig and others
This lets you issue make targets for a large number of ports all together instead of having to do each individually. There are the following programs you can use:
- portconfig
- portbuild
- portclean
- portfetch
- portpackage
- portconfig-recursive
- portfetch-recursive
For example, if you wanted to do a config on all of the ports that require updating so that you don't have to have your update get stuck waiting for you later, you could do:
sudo portconfig -a
For the config dialoges of the new dependencies, run:
sudo portconfig-recursive -a
Portfetch of course would fetch your list of tarballs for you and portclean would clean the ports out.
rcstart
This is similar to the service command on linux that let's you manage which services are running and not. To see a list of services, run:
[tethys]:/home/rnejdl> rcstart -s DAEMON FILESYSTEMS LOGIN NETWORKING NETWORK SERVERS abi accounting addswap adjkerntz amd apm apmd archdep atm1 atm2 atm3 auditd auto_linklocal bgfsck ...
You can use rcrestart to restart services and rconerestart for services that don't have an entry in /etc/rc.conf such as moused.