Fix helper's Enforce Personality task
[snf-image] / snf-image-helper / tasks / 40EnforcePersonality.py
1 #!/usr/bin/env python
2 #
3 # Copyright (c) 2011 Greek Research and Technology Network
4 #
5 """Personalize an Image by injecting files
6
7 This hook injects files into the filesystem of an Image.
8 The files are passed to the hook through the Ganeti
9 OS interface and found in the variable OSP_IMG_PERSONALITY.
10
11 """
12
13 import sys
14 import os
15 import json
16 import datetime
17 import base64
18
19
20 def timestamp():
21     now = datetime.datetime.now()
22     current_time = now.strftime("%Y%m%d.%H%M%S")
23     return current_time
24
25
26 def main():
27     if not os.environ.has_key('SNF_IMAGE_TARGET'):
28         sys.stderr.write('Error: SNF_IMAGE_TARGET variable is missing\n')
29         return 1
30
31     target = os.environ['SNF_IMAGE_TARGET']
32     if not os.path.isdir(target):
33         sys.stderr.write('Error: Target: `'+target+'\' is not a directory.\n')
34         return 2
35
36     if os.environ.has_key('SNF_IMAGE_PERSONALITY'):
37         osp_img_personality = os.environ['SNF_IMAGE_PERSONALITY']
38         files = json.loads(osp_img_personality)
39         for f in files:
40             real_path = target + '/' + f['path']
41             if os.path.lexists(real_path):
42                 backup_file = real_path + '.bak.' + timestamp()
43                 os.rename(real_path, backup_file)
44             file = file(real_path, 'w')
45             file.write(base64.b64decode(f['contents']))
46             file.close()
47             os.chmod(real_path, 0440)
48         sys.stderr.write('Successful personalization of Image\n')
49     else:
50         sys.stderr.write('This Image has no personality (0 files to inject)\n')
51     return 0
52
53
54 if __name__ == "__main__":
55     sys.exit(main())
56
57 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :