|
|
@ -226,16 +226,17 @@ def readkeys(filename):
|
|
|
|
if not os.path.isfile(filename):
|
|
|
|
if not os.path.isfile(filename):
|
|
|
|
return []
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
|
|
keys = []
|
|
|
|
keys = {}
|
|
|
|
f = open(filename)
|
|
|
|
f = open(filename)
|
|
|
|
for line in f.readlines():
|
|
|
|
for line in f.readlines():
|
|
|
|
key_data = parsekey(line)
|
|
|
|
key_data = parsekey(line)
|
|
|
|
if key_data:
|
|
|
|
if key_data:
|
|
|
|
keys.append(key_data)
|
|
|
|
# use key as identifier
|
|
|
|
|
|
|
|
keys[key_data[0]] = key_data
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
# for an invalid line, just append the line
|
|
|
|
# for an invalid line, just append the line
|
|
|
|
# to the array so it will be re-output later
|
|
|
|
# to the array so it will be re-output later
|
|
|
|
keys.append(line)
|
|
|
|
keys[line] = line
|
|
|
|
f.close()
|
|
|
|
f.close()
|
|
|
|
return keys
|
|
|
|
return keys
|
|
|
|
|
|
|
|
|
|
|
@ -244,16 +245,20 @@ def writekeys(module, filename, keys):
|
|
|
|
fd, tmp_path = tempfile.mkstemp('', 'tmp', os.path.dirname(filename))
|
|
|
|
fd, tmp_path = tempfile.mkstemp('', 'tmp', os.path.dirname(filename))
|
|
|
|
f = open(tmp_path,"w")
|
|
|
|
f = open(tmp_path,"w")
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
for key in keys:
|
|
|
|
for index, key in keys.items():
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
(keyhash,type,options,comment) = key
|
|
|
|
(keyhash,type,options,comment) = key
|
|
|
|
option_str = ""
|
|
|
|
option_str = ""
|
|
|
|
if options:
|
|
|
|
if options:
|
|
|
|
|
|
|
|
option_strings = []
|
|
|
|
for option_key in options.keys():
|
|
|
|
for option_key in options.keys():
|
|
|
|
if options[option_key]:
|
|
|
|
if options[option_key]:
|
|
|
|
option_str += "%s=%s " % (option_key, options[option_key])
|
|
|
|
option_strings.append("%s=%s" % (option_key, options[option_key]))
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
option_str += "%s " % option_key
|
|
|
|
option_strings.append("%s " % option_key)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
option_str = ",".join(option_strings)
|
|
|
|
|
|
|
|
option_str += " "
|
|
|
|
key_line = "%s%s %s %s\n" % (option_str, type, keyhash, comment)
|
|
|
|
key_line = "%s%s %s %s\n" % (option_str, type, keyhash, comment)
|
|
|
|
except:
|
|
|
|
except:
|
|
|
|
key_line = key
|
|
|
|
key_line = key
|
|
|
@ -295,39 +300,35 @@ def enforce_state(module, params):
|
|
|
|
present = False
|
|
|
|
present = False
|
|
|
|
matched = False
|
|
|
|
matched = False
|
|
|
|
non_matching_keys = []
|
|
|
|
non_matching_keys = []
|
|
|
|
for existing_key in existing_keys:
|
|
|
|
|
|
|
|
# skip bad entries or bad input
|
|
|
|
if parsed_new_key[0] in existing_keys:
|
|
|
|
if len(parsed_new_key) == 0 or len(existing_key) == 0:
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
# the first element in the array after parsing
|
|
|
|
|
|
|
|
# is the actual key hash, which we check first
|
|
|
|
|
|
|
|
if parsed_new_key[0] == existing_key[0]:
|
|
|
|
|
|
|
|
present = True
|
|
|
|
present = True
|
|
|
|
# Then we check if everything matches, including
|
|
|
|
# Then we check if everything matches, including
|
|
|
|
# the key type and options. If not, we append this
|
|
|
|
# the key type and options. If not, we append this
|
|
|
|
# existing key to the non-matching list
|
|
|
|
# existing key to the non-matching list
|
|
|
|
if parsed_new_key != existing_key:
|
|
|
|
# We only want it to match everything when the state
|
|
|
|
non_matching_keys.append(existing_key)
|
|
|
|
# is present
|
|
|
|
|
|
|
|
if parsed_new_key != existing_keys[parsed_new_key[0]] and state == "present":
|
|
|
|
|
|
|
|
non_matching_keys.append(existing_keys[parsed_new_key[0]])
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
matched = True
|
|
|
|
matched = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# handle idempotent state=present
|
|
|
|
# handle idempotent state=present
|
|
|
|
if state=="present":
|
|
|
|
if state=="present":
|
|
|
|
if unique and len(non_matching_keys) > 0:
|
|
|
|
if unique and len(non_matching_keys) > 0:
|
|
|
|
for non_matching_key in non_matching_keys:
|
|
|
|
for non_matching_key in non_matching_keys:
|
|
|
|
existing_keys.remove(non_matching_key)
|
|
|
|
del existing_keys[non_matching_key[0]]
|
|
|
|
do_write = True
|
|
|
|
do_write = True
|
|
|
|
|
|
|
|
|
|
|
|
if not matched:
|
|
|
|
if not matched:
|
|
|
|
existing_keys.append(parsed_new_key)
|
|
|
|
existing_keys[parsed_new_key[0]] = parsed_new_key
|
|
|
|
do_write = True
|
|
|
|
do_write = True
|
|
|
|
|
|
|
|
|
|
|
|
elif state=="absent":
|
|
|
|
elif state=="absent":
|
|
|
|
# currently, we only remove keys when
|
|
|
|
|
|
|
|
# they are an exact match
|
|
|
|
|
|
|
|
if not matched:
|
|
|
|
if not matched:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
existing_keys.remove(parsed_new_key)
|
|
|
|
del existing_keys[parsed_new_key[0]]
|
|
|
|
do_write = True
|
|
|
|
do_write = True
|
|
|
|
|
|
|
|
|
|
|
|
if do_write:
|
|
|
|
if do_write:
|
|
|
|