Check Drupal Module Status Using Bash

When you run a lot of Drupal sites it can be annoying to keep track of all of the modules contained in a platform and ensure all of them are up to date. One option is to setup a dummy site setup with all the modules installed and email notifications enabled, this is OK, but then you need to make sure you enable the additional modules every time you add something to your platform.

I wanted to be able to check the status of all of the modules in a given platform using the command line. I started scratching the itch by writing a simple shell script to use the Drupal updates server to check for the status of all the modules. I kept on polishing it until I was happy with it, there are some bits of which are a little bit ugly, but that is mostly due to the limitations of bash. If I had to rewrite the it I would do it in PHP or some other language which understands arrays/lists and has http client and XML libraries.

The script supports excluding modules by using an extended grep regular expression pattern and nominating a major version of Drupal. When there is a version mismatch it will be shown in bolded red, while modules where the versions match will be shown in green. The script filters out all dev and alpha releases, after all the script is designed for checking production sites. Adding support for per module update servers should be pretty easy to do, but I don’t have modules to test this with.

To use the script, download it, save it somewhere handy, such as ~/bin/, make it executable (run chmod +x ~/bin/ Now it is ready for you to run it - ~/bin/ /path/to/drupal and wait for the output.

# Check the latest version of a drupal module / template
# Written by Dave Hall
# Copyright (c) 2010 Dave Hall Consulting
# Licensed under the terms of the GPLv3


if [[ 0 -eq $# || 3 -lt $# ]]; then
  echo Usage: $(basename $0) /path/to/drupal-instance [[exclude-pattern] drupal-version]
  exit 1


if [ ! -d "$DRUPAL_PATH" ]; then
  echo ERROR: Invalid path - $DRUPAL_PATH
  exit 2

if [ 2 -lt $# ]; then

if [ 3 -eq $# ]; then

INFO_FILES=$(find $DRUPAL_PATH -name *.info)

modules=( )
for info in $INFO_FILES; do
  project=$(sed -e '/project =/!d' -e 's/project = "\(.*\)"/\1/g' < $info | head -n1)
  if [[ "" == "$project" || 0 -eq $(echo $project | egrep -cv $EXCLUDE_PATTERN) ]]; then
  cur_ver=$(sed -e '/version =/!d' -e 's/version = "\(.*\)"/\1/g' < $info | tail -n1)
  modules=( "${modules[@]}" "$project|$cur_ver##" )

modules=$(echo ${modules[@]} | tr '##' '\n' | sort -u)

echo -e "module\t\tlocal\tcurrent"
for mod in $modules; do
  new_ver=$(wget -O -`echo $mod | cut -d\| -f1`/$DRUPAL_VERSION 2> /dev/null | sed -e '/<version>.*<\/version>/!d' -e '/\(dev\|alpha\)/d' -e 's/.*<version>\(.*\)<\/version>/\1/g' | head -n1 );
  if [ "$(echo $mod | cut -d\| -f2)" != "$new_ver" ]; then
  echo -e $color$mod\|$new_ver | tr '|' '\t'