Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: run.py

Issue 4810150141493248: Issue 122 - Puppet ENC via Hiera (Closed)
Patch Set: 112 - Integrate run.py and monitoring with Hiera Created Feb. 26, 2015, 5:59 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: run.py
===================================================================
--- a/run.py
+++ b/run.py
@@ -3,6 +3,7 @@
import sys
import os
+import os.path
Felix Dahlke 2015/03/03 16:43:32 Not necessary, we're already importing os. Looks l
mathias 2015/03/04 12:32:37 Agreed, the explicit os.path import will be remove
import re
import subprocess
import getopt
@@ -41,78 +42,42 @@
return user, hosts, ignore_errors, args
-def readMonitoringConfig():
- # Use Puppet's parser to convert monitoringserver.pp into YAML
- manifest = os.path.join(os.path.dirname(__file__), 'manifests', 'monitoringserver.pp')
- parseScript = '''
- require 'puppet'
- require 'puppet/parser'
- parser = Puppet::Parser::Parser.new(Puppet[:environment])
- Puppet.settings[:ignoreimport] = true
- parser.file = ARGV[0]
- print ZAML.dump(parser.parse)
- '''
- data, dummy = subprocess.Popen(['ruby', '', manifest],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE).communicate(parseScript)
-
- # See http://stackoverflow.com/q/8357650/785541 on parsing Puppet's YAML
- yaml.add_multi_constructor(u"!ruby/object:", lambda loader, suffix, node: loader.construct_yaml_map(node))
- yaml.add_constructor(u"!ruby/sym", lambda loader, node: loader.construct_yaml_str(node))
- return yaml.load(data)
def getValidHosts():
- def processNode(node, hosts=None, groups=None):
- if hosts == None:
- hosts = set()
- if groups == None:
- groups = {}
-
- if 'context' in node and 'code' in node['context']:
- node = node['context']['code']
-
- if node.get('type', None) == 'nagios_hostgroup':
- data = node['instances']['children'][0]
- title = data['title']['value']
- members = filter(lambda c: c['param'] == 'members', data['parameters']['children'])[0]['value']['value']
- members = re.split(r'\s*,\s*', members)
- groups[title] = members
- elif node.get('type', None) == 'nagios_host':
- data = node['instances']['children'][0]
- title = data['title']['value']
- hosts.add(title)
-
- for child in node['children']:
- processNode(child, hosts, groups)
- return hosts, groups
-
- monitoringConfig = readMonitoringConfig()
- if not monitoringConfig:
- print >>sys.stderr, "Failed to parse monitoring configuration"
- return [[], []]
- # Extract hosts and groups from monitoring config
- return processNode(monitoringConfig)
+ dirname = os.path.dirname(sys.argv[0])
+ path_name = os.path.join(dirname, "hiera", "private", "hosts.yaml")
+ with open(path_name, 'rb') as handle:
+ config = yaml.load(handle)
+ servers = config.get('servers', {})
+ return servers
def resolveHostList(hosts):
- validHosts, validGroups = getValidHosts()
- if not validHosts:
- print >>sys.stderr, "Warning: No valid hosts found, not validating"
- return hosts
+ host_names = set(str(item) for item in hosts)
Wladimir Palant 2015/03/03 20:00:19 Given that hosts is a list of string, this seems e
mathias 2015/03/04 12:32:37 "Given that hosts is a list of string" <- this is
Felix Dahlke 2015/03/04 14:27:53 Nit: The parentheses are now not necessary anymore
Wladimir Palant 2015/03/04 15:14:11 This isn't a library function you wrote here, it i
mathias 2015/03/04 18:13:51 Done.
mathias 2015/03/04 18:13:51 Done.
result = set()
- for param in hosts:
- if param in validGroups:
- for host in validGroups[param]:
- if host == '*':
- result = result | validHosts
- else:
- result.add(host)
- elif param in validHosts:
- result.add(param)
- elif '%s.adblockplus.org' % param in validHosts:
- result.add('%s.adblockplus.org' % param)
- else:
- print >>sys.stderr, 'Warning: failed to recognize host or group %s' %param
+
+ try:
+ valid_hosts = getValidHosts()
Felix Dahlke 2015/03/03 16:43:32 Host validation doesn't make _that_ much sense any
Wladimir Palant 2015/03/03 20:00:19 Indeed, that's something we discussed previously -
mathias 2015/03/04 12:32:37 This version does two jobs at the same time; valid
Felix Dahlke 2015/03/04 14:27:53 For the record: I actually prefer Wladimir's sugge
Wladimir Palant 2015/03/04 15:14:11 Actually, changing the current validation code to
mathias 2015/03/04 18:13:51 @Felix As I wrote before, this is actually intende
Felix Dahlke 2015/03/09 23:14:51 Didn't realise this, but yeah, the catch clause st
+ except Warning as error:
+ print >>sys.stderr, 'Warning: failed to determine valid hosts:', error
+ result.update(host_names)
+ else:
+ for name in host_names:
+ chunk = tuple(
+ item[1].get('dns', item[0]) for item in valid_hosts.items()
Wladimir Palant 2015/03/03 20:00:19 for (key, value) in valid_hosts.iteritems() please
mathias 2015/03/04 12:32:37 Done. To answer your question: There is no need
Wladimir Palant 2015/03/04 15:14:11 The difference between a list and a tuple isn't th
mathias 2015/03/04 18:13:51 This has already been changed in the current patch
+
+ if name == item[0]
+ or name == '*'
+ or name == item[1].get('dns', None)
+ or name in item[1]['ip']
mathias 2015/02/26 18:41:23 While resolving IPs would be a nice feature, this
mathias 2015/03/04 12:32:37 Done.
+ or name in item[1].get('groups', ())
+ )
+
+ if len(chunk) == 0:
+ print >>sys.stderr, 'Warning: failed to recognize host or group', name
+ else:
+ result.update(chunk)
+
return result
def runCommand(user, host, command, ignore_errors=False):
« modules/nagios/manifests/server.pp ('K') | « modules/statsmaster/manifests/init.pp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld