def modify(self): db = inventoryd.db(inventoryd.localData.cfg["db"]) for el in self._vars: res = db.modifyStaticHostvar(hostname = self._hostname, fact = el["fact"], value = el["value"], priority = el["priority"]) db.disconnect() return True
def _getUserInfo(self): db = inventoryd.db(inventoryd.localData.cfg["db"]) userinfo = db.getUserInfo(self._username) db.disconnect() if userinfo is not None: self._name = userinfo["name"] self._new = False
def create(self): self._err = list() if self._name is None: self._err.append('You need to specify a connector name') if self._connector is None: self._err.append('You need to specify a connector') if self._type is None: self._err.append('You need to specify the connector type (%s)' % "|".join(self._typelist)) elif isinstance(self._type, str) and self._type not in self._typelist: self._err.append('Connector type cannot be %s. It has to be one of these: %s.' % (self._type, ",".join(self._typelist))) if self._schedule is None: self._err.append('You need to specify the schedule') if self._parameters is None: self._err.append('You need to specify the connector parameters') if self._priority is None: self._err.append('You need to specify the connector priority') if len(self._err) > 0: return False db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.createConnector(name = self._name, connector = self._connector, connector_type = self._type, parameters = self._parameters, priority = self._priority) db.disconnect() return res
def disable(self, connector_id = -1): if connector_id > 0: self._id = connector_id db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.disableConnector(connector_id = self._id) db.disconnect() return True
def _createInventoryCacheFile(self): inventoryd.logmessage(severity="info", message="Create Inventory cache file") inventoryd.logmessage(severity="info", message="Generating Ansible Inventory") db = inventoryd.db(self._cfg["db"]) res = db.getAnsibleInventory() db.disconnect() timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") filename = "%s/%s.json" % (self._cli.cachefilepath, timestamp) inventoryd.logmessage(severity="info", message="Creating cache file %s" % filename) with open(filename, "w") as f: f.write( json.dumps(res, sort_keys=True, indent=4, separators=(',', ': '))) inventoryd.logmessage(severity="info", message="Creating link to %s" % filename) if os.path.isfile("%s/latest.json" % self._cli.cachefilepath) is True: os.unlink("%s/latest.json" % self._cli.cachefilepath) os.symlink(filename, "%s/latest.json" % self._cli.cachefilepath) inventoryd.logmessage(severity="info", message="Done generating Ansible Inventory")
def delete(self): db = inventoryd.db(inventoryd.localData.cfg["db"]) for el in self._vars: res = db.deleteStaticHostvar(hostname = self._hostname, fact = el["fact"]) db.disconnect() return True
def modify(self): self._err = list() db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.modifyConnector(self._id, self._name, self._connector, self._type, json.dumps(self._parameters), self._priority) db.disconnect() return res
def disable(self, connector_id=-1): if connector_id > 0: self._id = connector_id db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.disableConnector(connector_id=self._id) db.disconnect() return True
def _getRoles(self): db = inventoryd.db(inventoryd.localData.cfg["db"]) roles = db.getRoles(self._username) db.disconnect() self._roles = [] for el in roles: self._roles.append(inventoryd.role(el["name"]))
def getUserACL(self): if self._acl is None: db = inventoryd.db(inventoryd.localData.cfg["db"]) self._acl = inventoryd.acl(db.getUserACL(self._username)) #self._acl = db.getUserACL(self._username) #print self._acl return self._acl
def delete(self): db = inventoryd.db(inventoryd.localData.cfg["db"]) for el in self._vars: res = db.deleteStaticHostvar(hostname=self._hostname, fact=el["fact"]) db.disconnect() return True
def read(self, connector_id=-1): self._err = list() if connector_id > 0: self._id = connector_id self._data = dict() db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.readConnector(connector_id=self._id) try: res["id"] except: res["id"] = -1 try: res["name"] except: res["name"] = None try: res["connector"] except: res["connector"] = None try: res["enabled"] except: res["enabled"] = False try: res["priority"] except: res["priority"] = 0 try: res["type"] except: res["type"] = None try: res["schedule"] except: res["schedule"] = None try: res["parameters"] except: res["parameters"] = None self._id = res["id"] self._name = res["name"] self._connector = res["connector"] self._enabled = res["enabled"] self._priority = res["priority"] self._type = res["type"] self._schedule = res["schedule"] self._parameters = res["parameters"] db.disconnect() return True
def read(self, connector_id = -1): self._err = list() if connector_id > 0: self._id = connector_id self._data = dict() db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.readConnector(connector_id = self._id) try: res["id"] except: res["id"] = -1 try: res["name"] except: res["name"] = None try: res["connector"] except: res["connector"] = None try: res["enabled"] except: res["enabled"] = False try: res["priority"] except: res["priority"] = 0 try: res["type"] except: res["type"] = None try: res["schedule"] except: res["schedule"] = None try: res["parameters"] except: res["parameters"] = None self._id = res["id"] self._name = res["name"] self._connector = res["connector"] self._enabled = res["enabled"] self._priority = res["priority"] self._type = res["type"] self._schedule = res["schedule"] self._parameters = res["parameters"] db.disconnect() return True
def read(self, host_id=None): if host_id is not None: self._id = host_id self._data = dict() db = inventoryd.db(inventoryd.localData.cfg["db"]) self._vars = db.readHost(host_id=self._id) db.disconnect() return True
def read(self, host_id = None): if host_id is not None: self._id = host_id self._data = dict() db = inventoryd.db(inventoryd.localData.cfg["db"]) self._vars = db.readHost(host_id = self._id) db.disconnect() return True
def modify(self): db = inventoryd.db(inventoryd.localData.cfg["db"]) for el in self._vars: res = db.modifyStaticHostvar(hostname=self._hostname, fact=el["fact"], value=el["value"], priority=el["priority"]) db.disconnect() return True
def _startScheduler(self): inventoryd.logmessage(severity="info", message="Starting the task scheduler") inventoryd.logmessage(severity="info", message="Housekeeping schedule: %s" % self._cfg["housekeeper"]["schedule"]) db = inventoryd.db(self._cfg["db"]) for el in db.getConnectors(): inventoryd.logmessage(severity="info", message="Sync connector '%s' schedule: %s" % (el["name"], el["schedule"])) db.disconnect() interval = 61 - datetime.datetime.now().second self._scheduleTimer = Timer(interval, self._runScheduler) self._scheduleTimer.start()
def listConnectors(user = None, payload = None, handler = None): if user.hasAcces("list","connector") is True: db = inventoryd.db(inventoryd.localData.cfg["db"]) connectors = db.getConnectors(False) db.disconnect() handler.send_response(200) handler.send_header('Content-Type', 'application/json') handler.end_headers() handler.wfile.write(json.dumps(connectors, sort_keys=True, indent=4, separators=(',',': '))) return True else: handler.send_response(401) return True
def listHosts(user=None, payload=None, handler=None): if user.hasAcces("list", "host") is True: db = inventoryd.db(inventoryd.localData.cfg["db"]) hosts = db.getHosts() db.disconnect() handler.send_response(200) handler.send_header('Content-Type', 'application/json') handler.end_headers() handler.wfile.write( json.dumps(hosts, sort_keys=True, indent=4, separators=(',', ': '))) return True else: handler.send_response(401) return True
def showInventory(user = None, payload = None, handler = None): inventoryd.logmessage(severity="debug", message="Inventory pull request") handler.send_response(200) handler.send_header('Content-Type', 'application/json') handler.end_headers() if os.path.isfile("%s/latest.json" % inventoryd.localData.cli.cachefilepath) is True: with open("%s/latest.json" % inventoryd.localData.cli.cachefilepath,"r") as f: res = json.loads(f.read()) else: tdb = inventoryd.db(inventoryd.localData.cfg["db"]) res = tdb.getAnsibleInventory() tdb.disconnect() handler.wfile.write(json.dumps(res, sort_keys=True, indent=4, separators=(',',': '))) return True
def _runScheduler(self): interval = 61 - datetime.datetime.now().second self._scheduleTimer = Timer(interval, self._runScheduler) self._scheduleTimer.start() if self._scheduler_is_running is True: inventoryd.logmessage(severity="info", message="Skipping run, as scheduler is still busy.") else: datetime_now = datetime.datetime.today() inventoryd.logmessage(severity="info", message="Starting scheduled tasks") cron = inventoryd.cronpare() db = inventoryd.db(self._cfg["db"]) for el in db.getConnectors(): inventoryd.logmessage(severity="info", message="Checking schedule for %s:%s" % (el["name"], el["schedule"])) if cron.compare(el["schedule"],datetime_now) is True: inventoryd.logmessage(severity="info", message="Starting sync run for %s." % el["name"]) self._sync_connector(el["id"]) inventoryd.logmessage(severity="info", message="Ending sync run for %s." % el["name"]) inventoryd.logmessage(severity="info", message="Checking schedule for Housekeeping:%s" % self._cfg["housekeeper"]["schedule"]) if cron.compare(self._cfg["housekeeper"]["schedule"],datetime_now) is True: inventoryd.logmessage(severity="info", message="Starting Housekeeping run") if self._cfg["housekeeper"]["history"] > 0: db.deleteHistory(self._cfg["housekeeper"]["history"]) if self._cfg["housekeeper"]["inventory_history"] > 0: cachefiles = list() for el in os.listdir(self._cli.cachefilepath): if re.match("^[0-9]+.json", el) is not None: cachefiles.append(el) cachefiles.sort() cachefiles = cachefiles[:0-self._cfg["housekeeper"]["inventory_history"]] inventoryd.logmessage(severity="info", message="Removing %d old cache files" % len(cachefiles)) for el in cachefiles: inventoryd.logmessage(severity="debug", message="Removing old cache file %s" % el) try: os.unlink("%s/%s" % (self._cli.cachefilepath, el)) except OSError as e: inventoryd.logmessage(severity="error", message="An error ocurred removing %s: %s" % (el, e)) except: inventoryd.logmessage(severity="error", message="An error ocurred removing %s" % el) inventoryd.logmessage(severity="info", message="Ending Housekeeping run") db.disconnect() inventoryd.logmessage(severity="info", message="Endinging scheduled tasks")
def _createInventoryCacheFile(self): inventoryd.logmessage(severity="info", message="Create Inventory cache file") inventoryd.logmessage(severity="info", message="Generating Ansible Inventory") db = inventoryd.db(self._cfg["db"]) res = db.getAnsibleInventory() db.disconnect() timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") filename = "%s/%s.json" % (self._cli.cachefilepath, timestamp) inventoryd.logmessage(severity="info", message="Creating cache file %s" % filename) with open(filename, "w") as f: f.write(json.dumps(res, sort_keys=True, indent=4, separators=(',',': '))) inventoryd.logmessage(severity="info", message="Creating link to %s" % filename) if os.path.isfile("%s/latest.json" % self._cli.cachefilepath) is True: os.unlink("%s/latest.json" % self._cli.cachefilepath) os.symlink(filename,"%s/latest.json" % self._cli.cachefilepath) inventoryd.logmessage(severity="info", message="Done generating Ansible Inventory")
def showInventory(user=None, payload=None, handler=None): inventoryd.logmessage(severity="debug", message="Inventory pull request") handler.send_response(200) handler.send_header('Content-Type', 'application/json') handler.end_headers() if os.path.isfile( "%s/latest.json" % inventoryd.localData.cli.cachefilepath) is True: with open("%s/latest.json" % inventoryd.localData.cli.cachefilepath, "r") as f: res = json.loads(f.read()) else: tdb = inventoryd.db(inventoryd.localData.cfg["db"]) res = tdb.getAnsibleInventory() tdb.disconnect() handler.wfile.write( json.dumps(res, sort_keys=True, indent=4, separators=(',', ': '))) return True
def authenticate(self, passphrase = None, token = None, username = None): if username is not None: self._username = username if token is not None: self._token = token auth_type='token' if passphrase is not None: auth_type='passphrase' if auth_type == 'passphrase': db = inventoryd.db(inventoryd.localData.cfg["db"]) db_salt, db_pass = db.getUserPassword(self._username) db.disconnect() hashpass = hashlib.sha512('%s:%s' % (db_salt,passphrase)).hexdigest() if hashpass == db_pass: self._authenticated = True else: self._authenticated = False return self._authenticated
def create(self): self._err = list() if self._name is None: self._err.append('You need to specify a connector name') if self._connector is None: self._err.append('You need to specify a connector') if self._type is None: self._err.append('You need to specify the connector type (%s)' % "|".join(self._typelist)) elif isinstance(self._type, str) and self._type not in self._typelist: self._err.append( 'Connector type cannot be %s. It has to be one of these: %s.' % (self._type, ",".join(self._typelist))) if self._schedule is None: self._err.append('You need to specify the schedule') if self._parameters is None: self._err.append('You need to specify the connector parameters') if self._priority is None: self._err.append('You need to specify the connector priority') if len(self._err) > 0: return False db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.createConnector(name=self._name, connector=self._connector, connector_type=self._type, parameters=self._parameters, priority=self._priority) db.disconnect() return res
def _sync_connector(self, connector_id): db = inventoryd.db(self._cfg["db"]) connector = db.getConnector(connector_id) if connector is None: return False hid = db.startHistoryItem(connector["id"]) try: exec "connector_%s" % connector["connector"] except: libpath = self._cfg["inventoryd"]["connector_path"] inventoryd.logmessage( severity="debug", message="Connector %s hasn't been imported yet. Attempting." % connector["connector"]) execute_connector = False if libpath is not None and os.path.isdir( self._cfg["inventoryd"]["connector_path"]): inventoryd.logmessage( severity="debug", message= "inventoryd.connector_path is set and connector library exists!" ) try: exec "import connector_%s" % connector["connector"] except: inventoryd.logmessage( severity="crit", message="Could not import the connector %s" % connector["connector"]) else: exec "import connector_%s" % connector["connector"] execute_connector = True elif libpath is not None: inventoryd.logmessage( severity="err", message= "inventoryd.connector_path is set but connector library doesn't exist!" ) elif libpath is None: inventoryd.logmessage( severity="debug", message="inventoryd.connector_path is not set") else: execute_connector = True if execute_connector is True: inventoryd.logmessage(severity="info", message="Syncing %s" % connector["name"]) exec "cc = connector_%s(connector['parameters'])" % connector[ "connector"] if connector["type"] == "hosts": facts = cc.getHosts() if cc.rc == 0: inventoryd.logmessage( severity="info", message= "%s - synchronizing %d hostvar facts for %d hosts" % (connector["name"], len(facts), int( cc.getHostCount()))) db.commitHostsCache(hid, facts) inventoryd.logmessage( severity="debug", message="%s - %d hostvar facts synchronized" % (connector["name"], len(facts))) else: inventoryd.logmessage( severity="error", message= "%s - An error occurred synchronizing hostvars. RC:%d" % (connector["name"], cc.rc)) inventoryd.logmessage(severity="error", message="%s - %s" % (connector["name"], cc.message)) else: facts, hosts, children = cc.getGroups() if cc.rc == 0: inventoryd.logmessage( severity="info", message="%s - synchronizing %d groupvar facts" % (connector["name"], len(facts))) inventoryd.logmessage( severity="info", message="%s - synchronizing %d group host memberships" % (connector["name"], len(hosts))) inventoryd.logmessage( severity="info", message="%s - synchronizing %d group group memberships" % (connector["name"], len(children))) db.commitGroupsCache(hid, facts, hosts, children) inventoryd.logmessage( severity="debug", message="%s - %d groupvar facts synchronized" % (connector["name"], len(facts))) inventoryd.logmessage( severity="debug", message="%s - %d group host memberships synchronized" % (connector["name"], len(hosts))) inventoryd.logmessage( severity="debug", message="%s - %d group group memberships synchronized" % (connector["name"], len(children))) else: inventoryd.logmessage( severity="error", message= "%s - An error occurred synchronizing groups. RC:%d" % (connector["name"], cc.rc)) inventoryd.logmessage(severity="error", message="%s - %s" % (connector["name"], cc.message)) db.endHistoryItem(hid, cc.rc, cc.message) inventoryd.logmessage(severity="info", message="Syncing %s done" % connector["name"]) else: inventoryd.logmessage(severity="info", message="Could not start %s sync" % connector["name"]) db.disconnect() if execute_connector is True: self._createInventoryCacheFile()
def delete(self, connector_id=-1): self._err = list() db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.deleteConnector(connector_id=self._id) db.disconnect() return res
def _runScheduler(self): interval = 61 - datetime.datetime.now().second self._scheduleTimer = Timer(interval, self._runScheduler) self._scheduleTimer.start() if self._scheduler_is_running is True: inventoryd.logmessage( severity="info", message="Skipping run, as scheduler is still busy.") else: datetime_now = datetime.datetime.today() inventoryd.logmessage(severity="info", message="Starting scheduled tasks") cron = inventoryd.cronpare() db = inventoryd.db(self._cfg["db"]) for el in db.getConnectors(): inventoryd.logmessage(severity="info", message="Checking schedule for %s:%s" % (el["name"], el["schedule"])) if cron.compare(el["schedule"], datetime_now) is True: inventoryd.logmessage(severity="info", message="Starting sync run for %s." % el["name"]) self._sync_connector(el["id"]) inventoryd.logmessage(severity="info", message="Ending sync run for %s." % el["name"]) inventoryd.logmessage( severity="info", message="Checking schedule for Housekeeping:%s" % self._cfg["housekeeper"]["schedule"]) if cron.compare(self._cfg["housekeeper"]["schedule"], datetime_now) is True: inventoryd.logmessage(severity="info", message="Starting Housekeeping run") if self._cfg["housekeeper"]["history"] > 0: db.deleteHistory(self._cfg["housekeeper"]["history"]) if self._cfg["housekeeper"]["inventory_history"] > 0: cachefiles = list() for el in os.listdir(self._cli.cachefilepath): if re.match("^[0-9]+.json", el) is not None: cachefiles.append(el) cachefiles.sort() cachefiles = cachefiles[:0 - self._cfg["housekeeper"] ["inventory_history"]] inventoryd.logmessage( severity="info", message="Removing %d old cache files" % len(cachefiles)) for el in cachefiles: inventoryd.logmessage( severity="debug", message="Removing old cache file %s" % el) try: os.unlink("%s/%s" % (self._cli.cachefilepath, el)) except OSError as e: inventoryd.logmessage( severity="error", message="An error ocurred removing %s: %s" % (el, e)) except: inventoryd.logmessage( severity="error", message="An error ocurred removing %s" % el) inventoryd.logmessage(severity="info", message="Ending Housekeeping run") db.disconnect() inventoryd.logmessage(severity="info", message="Endinging scheduled tasks")
def delete(self, connector_id = -1): self._err = list() db = inventoryd.db(inventoryd.localData.cfg["db"]) res = db.deleteConnector(connector_id = self._id) db.disconnect() return res
def _sync_connector(self, connector_id): db = inventoryd.db(self._cfg["db"]) connector = db.getConnector(connector_id) if connector is None: return False hid = db.startHistoryItem(connector["id"]) try: exec "connector_%s" % connector["connector"] except: libpath = self._cfg["inventoryd"]["connector_path"] inventoryd.logmessage(severity="debug", message="Connector %s hasn't been imported yet. Attempting." % connector["connector"]) execute_connector = False if libpath is not None and os.path.isdir(self._cfg["inventoryd"]["connector_path"]): inventoryd.logmessage(severity="debug", message="inventoryd.connector_path is set and connector library exists!") try: exec "import connector_%s" % connector["connector"] except: inventoryd.logmessage(severity="crit", message="Could not import the connector %s" % connector["connector"]) else: exec "import connector_%s" % connector["connector"] execute_connector = True elif libpath is not None: inventoryd.logmessage(severity="err", message="inventoryd.connector_path is set but connector library doesn't exist!") elif libpath is None: inventoryd.logmessage(severity="debug", message="inventoryd.connector_path is not set") else: execute_connector = True if execute_connector is True: inventoryd.logmessage(severity="info", message="Syncing %s" % connector["name"]) exec "cc = connector_%s(connector['parameters'])" % connector["connector"] if connector["type"] == "hosts": facts = cc.getHosts() if cc.rc == 0: inventoryd.logmessage(severity="info", message="%s - synchronizing %d hostvar facts for %d hosts" % (connector["name"], len(facts), int(cc.getHostCount()))) db.commitHostsCache(hid,facts) inventoryd.logmessage(severity="debug", message="%s - %d hostvar facts synchronized" % (connector["name"], len(facts))) else: inventoryd.logmessage(severity="error", message="%s - An error occurred synchronizing hostvars. RC:%d" % (connector["name"],cc.rc)) inventoryd.logmessage(severity="error", message="%s - %s" % (connector["name"],cc.message)) else: facts, hosts, children = cc.getGroups() if cc.rc == 0: inventoryd.logmessage(severity="info", message="%s - synchronizing %d groupvar facts" % (connector["name"], len(facts))) inventoryd.logmessage(severity="info", message="%s - synchronizing %d group host memberships" % (connector["name"], len(hosts))) inventoryd.logmessage(severity="info", message="%s - synchronizing %d group group memberships" % (connector["name"], len(children))) db.commitGroupsCache(hid,facts, hosts, children) inventoryd.logmessage(severity="debug", message="%s - %d groupvar facts synchronized" % (connector["name"], len(facts))) inventoryd.logmessage(severity="debug", message="%s - %d group host memberships synchronized" % (connector["name"], len(hosts))) inventoryd.logmessage(severity="debug", message="%s - %d group group memberships synchronized" % (connector["name"], len(children))) else: inventoryd.logmessage(severity="error", message="%s - An error occurred synchronizing groups. RC:%d" % (connector["name"], cc.rc)) inventoryd.logmessage(severity="error", message="%s - %s" % (connector["name"], cc.message)) db.endHistoryItem(hid, cc.rc, cc.message) inventoryd.logmessage(severity="info", message="Syncing %s done" % connector["name"]) else: inventoryd.logmessage(severity="info", message="Could not start %s sync" % connector["name"]) db.disconnect() if execute_connector is True: self._createInventoryCacheFile()