My blog

My place to bitch!

WordPress: Automatic plugin upgrade with python

Posted by admin On December - 29 - 2008

Since I have been unable to find anything that automagically upgrades wordpress plugins from a script, I decided to write my own in python. This basically logs in and presses the ‘upgrade’ button for each of the plugins that have an upgrade available. The script does not support the FTP login for the upgrade process… so you’re out of luck if you need that.

I’ve really only tested this on wordpress 2.7.

Only basic error detection is done, so don’t blame me if this breaks something :)   Code follows…

The python modules mechanize and BeautifulSoup are required.

#!/usr/bin/python

from mechanize import Browser, FormNotFoundError
from BeautifulSoup import BeautifulStoneSoup
import sys,re

def strip_tags(value):
    "Return the given HTML with all tags stripped."
    return re.sub(r'<[^>]*?>', '', value) 

def usage():
    print 'Usage: ./pyWordpressUpgrade.py <url> <username> <password>'
    print '   Where <url> is similar to: http://www.example.com/wp-admin'

if __name__ == '__main__':
    try:
        host = sys.argv[1]
        username = sys.argv[2]
        password = sys.argv[3]
    except:
        usage()
        sys.exit()

    #plugin name
    name_regex = re.compile(r'plugin=(?P<name>[\w-]*)')
    #success?
    success_regex = re.compile(r'Plugin upgraded successfully')
    #ftp connection required
    ftp_regex = re.compile(r'FTP connection information is required')

    br = Browser()
    br.set_handle_robots(False)
    #br.set_debug_http(True)

    try:
        br.open(host)
        br.select_form(name="loginform")
    except Exception, e:
        print 'Unable to log into: %s'%host
        print e
        usage()
        sys.exit()

    br["log"] = username
    br["pwd"] = password

    r = br.submit()

    # get to the plugin page
    r = br.follow_link(url="plugins.php")

    # get all the upgrade links into a list
    upgrade_list = [link for link in br.links(url_regex="update")]

    for link in upgrade_list:
        m = name_regex.search( link.url )
        if m:
            print 'Updating: %s' % m.group('name')
            r = br.follow_link( url=link.url )
            html = r.read()
            soup = BeautifulStoneSoup(html)
            result = str(soup.findAll('div', {'class':'wrap'})[0])
            # strip the html
            result = strip_tags(result)
            m = ftp_regex.search ( result )
            if m:
                print ' ++ FAILURE ++'
                print "Sorry, updating plugins via ftp not supported"
                break
            # search for the success string
            m = success_regex.search(result)
            if m:
                print '  ==> success!'
            else:
                print ' ++ FAILURE ++'
                print result
                print ' +++++++++++++'
            br.back()

    print "Done!"

Add A Comment