Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3 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 c03b6c45 Nikos Skalkotos
import struct
17 22a2e378 Nikos Skalkotos
from optparse import OptionParser
18 22a2e378 Nikos Skalkotos
19 22a2e378 Nikos Skalkotos
20 22a2e378 Nikos Skalkotos
def timestamp():
21 22a2e378 Nikos Skalkotos
    now = datetime.datetime.now()
22 22a2e378 Nikos Skalkotos
    current_time = now.strftime("%Y%m%d.%H%M%S")
23 22a2e378 Nikos Skalkotos
    return current_time
24 22a2e378 Nikos Skalkotos
25 22a2e378 Nikos Skalkotos
def parse_arguments(input_args):
26 22a2e378 Nikos Skalkotos
    usage = "Usage: %prog [options] <target>"
27 22a2e378 Nikos Skalkotos
    parser = OptionParser(usage=usage)
28 22a2e378 Nikos Skalkotos
    parser.add_option("-i", "--input",
29 22a2e378 Nikos Skalkotos
                        action="store",type='string', dest="input_file",
30 22a2e378 Nikos Skalkotos
                        help="get input from FILE instead of stdin",
31 22a2e378 Nikos Skalkotos
                        metavar="FILE")
32 c03b6c45 Nikos Skalkotos
    parser.add_option("-d", "--decode",
33 c03b6c45 Nikos Skalkotos
                        action="store_true", dest="decode", default=False,
34 c03b6c45 Nikos Skalkotos
                        help="decode files under target and create manifest")
35 22a2e378 Nikos Skalkotos
36 22a2e378 Nikos Skalkotos
    opts, args = parser.parse_args(input_args)
37 22a2e378 Nikos Skalkotos
38 22a2e378 Nikos Skalkotos
    if len(args) != 1:
39 22a2e378 Nikos Skalkotos
        parser.error('target is missing')
40 22a2e378 Nikos Skalkotos
   
41 22a2e378 Nikos Skalkotos
    target = args[0]
42 22a2e378 Nikos Skalkotos
    if not os.path.isdir(target):
43 22a2e378 Nikos Skalkotos
        parser.error('target is not a directory')
44 22a2e378 Nikos Skalkotos
45 22a2e378 Nikos Skalkotos
    input_file = opts.input_file
46 22a2e378 Nikos Skalkotos
    if input_file is None:
47 22a2e378 Nikos Skalkotos
        input_file = sys.stdin
48 22a2e378 Nikos Skalkotos
    else:
49 22a2e378 Nikos Skalkotos
        if not os.path.isfile(input_file):
50 22a2e378 Nikos Skalkotos
            parser.error('input file does not exist')
51 22a2e378 Nikos Skalkotos
        input_file = open(input_file,'r')
52 22a2e378 Nikos Skalkotos
        
53 c03b6c45 Nikos Skalkotos
    return (input_file, target, opts.decode)
54 22a2e378 Nikos Skalkotos
55 22a2e378 Nikos Skalkotos
56 22a2e378 Nikos Skalkotos
def main():
57 c03b6c45 Nikos Skalkotos
    (input_file, target, decode) = parse_arguments(sys.argv[1:])
58 22a2e378 Nikos Skalkotos
59 2545cdc5 Nikos Skalkotos
    files = json.load(input_file)
60 c03b6c45 Nikos Skalkotos
    
61 c03b6c45 Nikos Skalkotos
    if decode:
62 c03b6c45 Nikos Skalkotos
        manifest = open(target + '/manifest', 'w')
63 c03b6c45 Nikos Skalkotos
    
64 c03b6c45 Nikos Skalkotos
    count = 0
65 22a2e378 Nikos Skalkotos
    for f in files:
66 c03b6c45 Nikos Skalkotos
        count += 1
67 c03b6c45 Nikos Skalkotos
        owner = f['owner'] if 'owner' in f else "root"
68 c03b6c45 Nikos Skalkotos
        group = f['group'] if 'group' in f else "root"
69 c03b6c45 Nikos Skalkotos
        mode = f['mode'] if 'mode' in f else 288 # 440 in oct = 288 in dec
70 22a2e378 Nikos Skalkotos
71 c03b6c45 Nikos Skalkotos
        filepath = f['path'] if not decode else str(count)
72 c03b6c45 Nikos Skalkotos
        filepath = target + "/" + filepath
73 c03b6c45 Nikos Skalkotos
74 c03b6c45 Nikos Skalkotos
        if os.path.lexists(filepath):
75 c03b6c45 Nikos Skalkotos
            backup_file = filepath + '.bak.' + timestamp()
76 c03b6c45 Nikos Skalkotos
            os.rename(filepath, backup_file)
77 c03b6c45 Nikos Skalkotos
78 c03b6c45 Nikos Skalkotos
        parentdir = os.path.dirname(filepath)
79 22a2e378 Nikos Skalkotos
        if not os.path.exists(parentdir):
80 22a2e378 Nikos Skalkotos
            os.makedirs(parentdir)
81 22a2e378 Nikos Skalkotos
82 c03b6c45 Nikos Skalkotos
        newfile = open(filepath, 'w')
83 22a2e378 Nikos Skalkotos
        newfile.write(base64.b64decode(f['contents']))
84 22a2e378 Nikos Skalkotos
        newfile.close()
85 c03b6c45 Nikos Skalkotos
        
86 c03b6c45 Nikos Skalkotos
        if decode:
87 c03b6c45 Nikos Skalkotos
            manifest.write(str(count))
88 c03b6c45 Nikos Skalkotos
            manifest.write(struct.pack('B', 0))
89 c03b6c45 Nikos Skalkotos
            manifest.write(owner)
90 c03b6c45 Nikos Skalkotos
            manifest.write(struct.pack('B', 0))
91 c03b6c45 Nikos Skalkotos
            manifest.write(group)
92 c03b6c45 Nikos Skalkotos
            manifest.write(struct.pack('B', 0))
93 c03b6c45 Nikos Skalkotos
            manifest.write("%o" % mode)
94 c03b6c45 Nikos Skalkotos
            manifest.write(struct.pack('B', 0))
95 c03b6c45 Nikos Skalkotos
            manifest.write(f['path'])
96 c03b6c45 Nikos Skalkotos
            manifest.write(struct.pack('B', 0))
97 c03b6c45 Nikos Skalkotos
 
98 c03b6c45 Nikos Skalkotos
    sys.stderr.write('Files were injected successfully\n')
99 c03b6c45 Nikos Skalkotos
100 c03b6c45 Nikos Skalkotos
    if decode:
101 c03b6c45 Nikos Skalkotos
        manifest.close()
102 22a2e378 Nikos Skalkotos
103 22a2e378 Nikos Skalkotos
    input_file.close()
104 22a2e378 Nikos Skalkotos
    return 0
105 22a2e378 Nikos Skalkotos
106 22a2e378 Nikos Skalkotos
if __name__ == "__main__":
107 22a2e378 Nikos Skalkotos
    sys.exit(main())
108 22a2e378 Nikos Skalkotos
109 22a2e378 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :