In preparation for the Sekati Reboot I did a major infrastructure overhaul. Part of this involved rolling my own Xen dom0 on new, collocated hardware to host service separated para-virtualized domU server instances.
In the process of preparing the VPS‘s a new, linux based operating system was selected; specifically Debian (where historically OpenBSD was my flavor of choice) – this was done for it’s strong Xen support & superior (compared with the OpenBSD ports tree) package management system.
Of course what I’m referring to is APT & it’s wonderful management tools apt-get, dpkg & aptitude. Let me be clear in saying; these tools are ridiculously easy to use, have solid man pages & too many blog tutorials to mention.
The problem? Simply put: I’m lazy (the good lazy). And I want to do things in one simple terminal command. And I want to engineer mindless maintenance away via cron as much and as often as is safe or sane. In other words; I want a good control script that bundles & wraps all the apt-get love into short sweet commands & parallel-ssh execute them across all my virtual machines for day-to-day admin stuff.
So, of course, I wrote AptManager to fill this little lazy niche of mine. And now I’m sharing it with you; enjoy!
AptManager v1.2.3 [download]
#!/bin/sh # Sekati: Apt Manager # @author jason m horwitz | sekati.com # Copyright (C) 2010 jason m horwitz, Sekat LLC. All Rights Reserved. # # CHANGELOG # 1.2.0 - now compatible with Bash4 # 1.2.2 - adding maintenance NAME="AptManager" VERSION="1.2.3" DEL="******************************************************" printHeader() { echo "\n$DEL\n$NAME v$VERSION\n$DEL\n" } printUsage() { echo "Usage: $0 { \n\tupdate | upgrade | [maint|maintenance] | dselect-upgrade | dist-upgrade \n\tsetup | [find|search] | install | reinstall \n\t[remove,uninstall] | autoremove | clean | autoclean \n\trepair | reconfigure | [list|installed] | show | showpkg | depends |status \n\t} package_name\n" } # die [goodbye_message] die() { echo $@ exit 1 } # confirm [question] confirm() { read -p "$1 (y/n) " [ "$REPLY" == y ] || die "\n$NAME Exiting..." } # checkArg [argument_name, value] checkArg() { if test -z "$2"; then die "Missing Argument: $1!\n" fi } printHeader case $1 in update) echo "Updating Package Database ...\n" apt-get update ;; upgrade) echo "Upgrading All Installed Packages ...\n" apt-get -u upgrade ;; maint|maintenance) echo "Updating, Upgrading & Cleaning ...\n" apt-get update apt-get -u upgrade apt-get autoclean apt-get autoremove ;; dselect-upgrade) echo "Upgrading All Installed Packages with DSelect ...\n" apt-get -u dselect-upgrade ;; dist-upgrade) echo "Upgrading Distribution Packages ...\n" apt-get -u dist-upgrade ;; setup) echo "Setup: Changing list of apt mirrors ...\n" apt-setup ;; search|find) checkArg "Package Name" $2 echo "Searching for package: $2 ...\n" apt-cache search $2 ;; install) checkArg "Package Name" $2 echo "Attempting to install package: $2 ...\n" apt-get install $2 ;; reinstall) checkArg "Package Name" $2 echo "Attempting to Reinstall package: $2 ...\n" apt-get --reinstall install $2 ;; remove|uninstall) checkArg "Package Name" $2 echo "Attempting to Remove & Purge Package: $2 ...\n" apt-get --purge remove $2 ;; autoremove) echo "Auto-Removing Unused Packages ...\n" apt-get autoremove ;; clean) echo "Cleaning ...\n" apt-get clean ;; autoclean) echo "Auto-Cleaning ...\n" apt-get autoclean ;; repair|fix) confirm "Are you sure you want to attempt to fix/repair the apt package error?\nThis will run the commands: `apt-get -f install && dpkg --configure -a`" apt-get -f install dpkg --configure -a ;; reconfigure) checkArg "Package Name" $2 confirm "Are you sure you want to reconfigure $2?" dpkg --reconfigure $2 ;; list|installed) echo "Listing Installed & Removed Packages ...\n" dpkg -l ;; show) checkArg "Package Name" $2 echo "Showing Package Info ...\n" apt-cache show $2 ;; showpkg) checkArg "Package Name" $2 echo "Showing Package ...\n" apt-cache showpkg $2 ;; depends) checkArg "Package Name" $2 echo "Showing Package Dependencies ...\n" apt-cache depends $2 ;; status) checkArg "Package Name" $2 echo "Showing package status: $2 ...\n" dpkg -l $2 ;; *|?) printUsage exit 1 ;; esac exit 0
—