Python 2.4.4 and boto-2.0b3 import hashlib error

Python 2.4.4 and boto-2.0b3 import hashlib error has a fix found here

Running an older Debian AMI with RAID0 XFS EBS volumes, I patch boto-2.0b3. Hopefully, have this instance migrated using a newer Ubuntu EBS AMI and use ec2-consistent-snapshot instead.

1. Copy a patch file to a temporary file:

# vi /tmp/c_14.patch
--- boto-2.0b3/boto/ec2/connection.py   Fri Nov 12 14:16:07 2010
+++ boto/ec2/connection.py      Fri Nov 12 15:19:21 2010
@@ -28,7 +28,6 @@
 import base64
 import hmac
 import boto
-from hashlib import sha1 as sha
 from boto.connection import AWSQueryConnection
 from boto.resultset import ResultSet
 from boto.ec2.image import Image, ImageAttribute
@@ -51,6 +50,11 @@
 from boto.ec2.tag import Tag
 from boto.exception import EC2ResponseError
 
+try:
+    from hashlib import sha1 as sha
+except ImportError:
+    import sha
+
 #boto.set_stream_logger('ec2')
 
 class EC2Connection(AWSQueryConnection):

2. Now we can get the source of boto:

# cd /usr/lib/python2.4/
# mv boto-2.0b3-py2.4.eggboto-2.0b3-py2.4.egg boto-2.0b3-py2.4.egg.old
# easy_install -Z boto 
# cd boto-2.0b3-py2.4.egg/boto/ec2
# patch < /tmp/c_14.patch


3. A simple Python script to snapshot NFS volumes, for the meantime. Note if you want to use it, you need to supply the access and secret keys.

#!/usr/bin/env python 
#
# Filename: snap-vol.py 
# Desc:  Snapshot XFS volumes.
# Date: Dec 14, 2010
# Author: rodney@capsunlock.net
 
import getopt, sys, os

aws_access_key = ''
aws_secret_key = ''


def usage():
    print 'Description: Snapshot a mounted volume formatted as XFS.'  
    print 'Usage:'
    print '     snap-vol.py  -m /mount_dir -v vol-xxxx,vol-xxxx -d volume-description'
    print ''
    sys.exit(2)

def snapshot_volumes(mount_dir, volumes,vol_desc):
    import boto 
    from boto.ec2.connection import EC2Connection 
    
    conn = None 
    try:  
       #conn = EC2Connection()
       conn = EC2Connection(aws_access_key, aws_secret_key)
    except TypeError, boto.exception.EC2ResponseError:
       print 'Error: aws keys not set.'
       sys.exit(2)


    os.system("sync")
    isMounted = False
    
    print 'Checking mount directory: '  + mount_dir , 
    if os.path.ismount(mount_dir): 
       isMounted = True
       print ' mounted.'
    else: 
       print  ' not mounted.'

    if isMounted: 
       print 'Executing xfs_freeze -f on ' + mount_dir
       os.system("xfs_freeze -f " + mount_dir)

    for volume in volumes: 
       try: 
          snapshot = None
          if vol_desc is None: 
             snapshot = conn.create_snapshot(volume)
          else: 
             print 'Setting volume description to: ' + vol_desc
             snapshot = conn.create_snapshot(volume,vol_desc)
          print "Volume: " + volume + " Snapshot:" + snapshot.id
       except boto.exception.EC2ResponseError:
          print 'Error snapshotting volume: ' + volume 

    if isMounted: 
       print 'Executing xfs_freeze -u on ' + mount_dir
       os.system("xfs_freeze -u " + mount_dir)

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "v:m:d:h", ["help"])
    except getopt.GetoptError, err:
        # print help information and exit:
        print str(err) # will print something like "option -a not recognized"
        usage()

    mount_dir = None
    vol_desc = None 
    volumes =  []

    for o, arg in opts:
        if o == "-v":
            volumes = arg.split(",")
            #print volumes
        elif o == "-d":
            vol_desc = arg
        elif o == "-m":
            mount_dir = arg
            #print 'Mount Directory: ' + mount_dir
        elif o in ("-h", "--help"):
            usage()
        else:
            assert False, "Opps unhandled option"
            sys.exit(2)

    if mount_dir != None and len(volumes)>0:
        print "Backing Up mount directory and XFS volume"
        os.system("date")
        # do backup here.
        snapshot_volumes(mount_dir, volumes,vol_desc)
    else:
        usage()

if __name__ == "__main__":
    main()

Leave a Reply

Your email address will not be published. Required fields are marked *