-
Notifications
You must be signed in to change notification settings - Fork 2
/
manifestcreator.py
executable file
·101 lines (90 loc) · 3.32 KB
/
manifestcreator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/python
# Copyright 2014-2016 Nick McSpadden
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
A tool that allows Munki administrators to quickly create manifests based on a
CSV containing serial numbers.
positional arguments:
file Path to the CSV file containing serial numbers.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Outputs the path to each manifest as it is created.
--repo REPO The path to the Munki repository you want to add
manifests to. Defaults to /Volumes/munki.
--template TEMPLATE The path to the file you want to use as your manifest
template. Defaults to
/Volumes/munki/manifests/Template.
"""
import csv
import argparse
import plistlib
import os
p = argparse.ArgumentParser(
description=("A tool that allows Munki administrators to quickly create "
"manifests based on a CSV containing serial numbers."))
p.add_argument(
"file",
help="Path to the CSV file containing serial numbers.")
p.add_argument(
"-v", "--verbose",
action="store_true",
help="Outputs the path to each manifest as it is created.")
p.add_argument(
"--repo",
action="store",
help=("The path to the Munki repository you want to add manifests to. "
"Defaults to /Volumes/munki."))
p.add_argument(
"--template",
action="store",
help=("The path to the file you want to use as your manifest template. "
"Defaults to /Volumes/munki/manifests/Template."))
p.add_argument(
"--nooverwrite",
action="store_true",
help=("Do not overwrite existing files. Does not check to ensure the "
"existing files match the template."))
arguments = p.parse_args()
if arguments.repo:
repo = arguments.repo
else:
repo = "/Volumes/munki"
if arguments.template:
template = arguments.template
else:
template = repo + "/manifests/Template"
try:
manifest_dict = plistlib.readPlist(template)
except:
print "Manifest template might not be a valid plist file."
raise
with open(arguments.file, "rb") as f:
reader = csv.DictReader(f)
for row in reader:
new_manifest = repo + "/manifests/" + row["serial"]
for key in row:
if key != "serial":
manifest_dict[key] = row[key]
if arguments.nooverwrite is True:
if os.path.exists(new_manifest):
if arguments.verbose is True:
print "Skipping %s, file exists" % new_manifest
continue
else:
plistlib.writePlist(manifest_dict, new_manifest)
else:
# If false just write write the plists anyway
plistlib.writePlist(manifest_dict, new_manifest)
if arguments.verbose is True:
print new_manifest