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()