Statistics
| Branch: | Tag: | Revision:

root / snf-image-helper / inject-files.py @ ec728294

History | View | Annotate | Download (2 kB)

1 22a2e378 Nikos Skalkotos
#!/usr/bin/env python
2 22a2e378 Nikos Skalkotos
3 22a2e378 Nikos Skalkotos
"""Inject files into a directory
4 22a2e378 Nikos Skalkotos

5 22a2e378 Nikos Skalkotos
This program injects files into a target directory.
6 22a2e378 Nikos Skalkotos
The files are passed to the program through a JSON string either read from a
7 22a2e378 Nikos Skalkotos
file or from standard input.
8 22a2e378 Nikos Skalkotos

9 22a2e378 Nikos Skalkotos
"""
10 22a2e378 Nikos Skalkotos
11 22a2e378 Nikos Skalkotos
import sys
12 22a2e378 Nikos Skalkotos
import os
13 22a2e378 Nikos Skalkotos
import json
14 22a2e378 Nikos Skalkotos
import datetime
15 22a2e378 Nikos Skalkotos
import base64
16 22a2e378 Nikos Skalkotos
from optparse import OptionParser
17 22a2e378 Nikos Skalkotos
18 22a2e378 Nikos Skalkotos
19 22a2e378 Nikos Skalkotos
def timestamp():
20 22a2e378 Nikos Skalkotos
    now = datetime.datetime.now()
21 22a2e378 Nikos Skalkotos
    current_time = now.strftime("%Y%m%d.%H%M%S")
22 22a2e378 Nikos Skalkotos
    return current_time
23 22a2e378 Nikos Skalkotos
24 22a2e378 Nikos Skalkotos
def parse_arguments(input_args):
25 22a2e378 Nikos Skalkotos
    usage = "Usage: %prog [options] <target>"
26 22a2e378 Nikos Skalkotos
    parser = OptionParser(usage=usage)
27 22a2e378 Nikos Skalkotos
    parser.add_option("-i", "--input",
28 22a2e378 Nikos Skalkotos
                        action="store",type='string', dest="input_file",
29 22a2e378 Nikos Skalkotos
                        help="get input from FILE instead of stdin",
30 22a2e378 Nikos Skalkotos
                        metavar="FILE")
31 22a2e378 Nikos Skalkotos
32 22a2e378 Nikos Skalkotos
    opts, args = parser.parse_args(input_args)
33 22a2e378 Nikos Skalkotos
34 22a2e378 Nikos Skalkotos
    if len(args) != 1:
35 22a2e378 Nikos Skalkotos
        parser.error('target is missing')
36 22a2e378 Nikos Skalkotos
   
37 22a2e378 Nikos Skalkotos
    target = args[0]
38 22a2e378 Nikos Skalkotos
    if not os.path.isdir(target):
39 22a2e378 Nikos Skalkotos
        parser.error('target is not a directory')
40 22a2e378 Nikos Skalkotos
41 22a2e378 Nikos Skalkotos
    input_file = opts.input_file
42 22a2e378 Nikos Skalkotos
    if input_file is None:
43 22a2e378 Nikos Skalkotos
        input_file = sys.stdin
44 22a2e378 Nikos Skalkotos
    else:
45 22a2e378 Nikos Skalkotos
        if not os.path.isfile(input_file):
46 22a2e378 Nikos Skalkotos
            parser.error('input file does not exist')
47 22a2e378 Nikos Skalkotos
        input_file = open(input_file,'r')
48 22a2e378 Nikos Skalkotos
        
49 22a2e378 Nikos Skalkotos
    return (input_file, target)
50 22a2e378 Nikos Skalkotos
51 22a2e378 Nikos Skalkotos
52 22a2e378 Nikos Skalkotos
def main():
53 22a2e378 Nikos Skalkotos
    (input_file, target) = parse_arguments(sys.argv[1:])
54 22a2e378 Nikos Skalkotos
55 2545cdc5 Nikos Skalkotos
    files = json.load(input_file)
56 22a2e378 Nikos Skalkotos
    for f in files:
57 22a2e378 Nikos Skalkotos
        real_path = target + '/' + f['path']
58 22a2e378 Nikos Skalkotos
        if os.path.lexists(real_path):
59 22a2e378 Nikos Skalkotos
            backup_file = real_path + '.bak.' + timestamp()
60 22a2e378 Nikos Skalkotos
            os.rename(real_path, backup_file)
61 22a2e378 Nikos Skalkotos
62 22a2e378 Nikos Skalkotos
        parentdir = os.path.dirname(real_path)
63 22a2e378 Nikos Skalkotos
        if not os.path.exists(parentdir):
64 22a2e378 Nikos Skalkotos
            os.makedirs(parentdir)
65 22a2e378 Nikos Skalkotos
66 22a2e378 Nikos Skalkotos
        newfile = open(real_path, 'w')
67 22a2e378 Nikos Skalkotos
        newfile.write(base64.b64decode(f['contents']))
68 22a2e378 Nikos Skalkotos
        newfile.close()
69 22a2e378 Nikos Skalkotos
        os.chmod(real_path, 0440)
70 22a2e378 Nikos Skalkotos
    sys.stderr.write('Successful personalization of Image\n')
71 22a2e378 Nikos Skalkotos
72 22a2e378 Nikos Skalkotos
    input_file.close()
73 22a2e378 Nikos Skalkotos
    return 0
74 22a2e378 Nikos Skalkotos
75 22a2e378 Nikos Skalkotos
76 22a2e378 Nikos Skalkotos
if __name__ == "__main__":
77 22a2e378 Nikos Skalkotos
    sys.exit(main())
78 22a2e378 Nikos Skalkotos
79 22a2e378 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :