From bb0841d4733f09d34d7fd34535ee68ef96699892 Mon Sep 17 00:00:00 2001
From: shahaan <shahaan@gmail.com>
Date: Wed, 23 Sep 2015 14:19:59 +1000
Subject: [PATCH] Modified DynamicInventory

---
 dynamicInventory-mcc2 | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/dynamicInventory-mcc2 b/dynamicInventory-mcc2
index 5317ed91..dd761641 100755
--- a/dynamicInventory-mcc2
+++ b/dynamicInventory-mcc2
@@ -1,14 +1,15 @@
 #!/usr/bin/env python
 import sys, os, string, socket, re
 import shlex, multiprocessing, time, shutil, json
-import novaclient.v1_1.client as nvclient
+from novaclient import client as nvclient
 import novaclient.exceptions as nvexceptions
 import keystoneclient.v2_0.client as ksclient
 from joblib import Parallel, delayed
 from multiprocessing import Process, Manager, Pool
+from libnmap.process import NmapProcess
+from libnmap.parser import NmapParser, NmapParserException
 
 def gatherInfo(tenantName, tenantID, userName, passwd, authUrl, inventory):
-	
 	## Fetch the Nova Object
 	projectName = os.path.basename(sys.argv[0])
 	nc = nvclient.Client(	auth_url=authUrl,
@@ -16,25 +17,23 @@ def gatherInfo(tenantName, tenantID, userName, passwd, authUrl, inventory):
 		api_key=passwd,
 		project_id=tenantName,
 		tenant_id=tenantID,
-		service_type="compute"
+		version="2"
 		)
 	for server in nc.servers.list():
 		if server.metadata and \
 		'ansible_host_groups' in server.metadata and \
 		'project_name' in  server.metadata:
-			if server.metadata['project_name'] != projectName.strip(): continue
+			if server.metadata['project_name'].strip() != projectName.strip(): continue
 			unwantedChars = """][")("""
 			rgx = re.compile('[%s]' % unwantedChars)
 			ansible_groups = rgx.sub('', server.metadata['ansible_host_groups']).split(',')
 			hostname = socket.gethostbyaddr(server.networks.values()[0][0])[0]
-			closed=True
-			while closed:
-				hostSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-				if not hostSocket.connect_ex((hostname, 22)): 
-					closed = False
-					break
-				time.sleep(5)
-				hostSocket.close()
+			novaVolumes = nc.volumes.get_server_volumes(server.id)
+			# Let's do some port scanning using nmap
+			nmproc = NmapProcess(hostname, "-p 22 -sV -Pn")
+			rc = nmproc.run()
+			if rc != 0: continue
+			parsed = NmapParser.parse(nmproc.stdout)
 			# Set Ansible Host Group
 			for group in ansible_groups:
 				groupName = group.strip()
@@ -44,6 +43,9 @@ def gatherInfo(tenantName, tenantID, userName, passwd, authUrl, inventory):
 			for key, value in server.metadata.iteritems():
 				if key not in ('project_name','ansible_host_groups'):
 					inventory['_meta']['hostvars'][hostname] = { key:value }
+			if novaVolumes:
+				inventory['_meta']['hostvars'][hostname]['volumeList'] = [ volume.id for volume in novaVolumes ]
+			inventory['_meta']['hostvars'][hostname]['status']  = parsed.hosts[0].status
 		else:
 			continue
 	#print inventory
-- 
GitLab