def run(self): if self.ipc is None: return self.running = True # Wait a bit so we ensure IPC thread is running... time.sleep(2) while self.running and self.ipc.running: try: msg = self.ipc.getMessage() if msg is None: break msgId, data = msg logger.debug('Got Message on User Space: {}:{}'.format(msgId, data)) if msgId == ipc.MSG_MESSAGE: self.displayMessage.emit(QtCore.QString.fromUtf8(data)) elif msgId == ipc.MSG_LOGOFF: self.logoff.emit() elif msgId == ipc.MSG_SCRIPT: self.script.emit(QtCore.QString.fromUtf8(data)) elif msgId == ipc.MSG_INFORMATION: self.information.emit(pickle.loads(data)) except Exception as e: try: logger.error('Got error on IPC thread {}'.format(utils.exceptionToMessage(e))) except: logger.error('Got error on IPC thread (an unicode error??)') if self.ipc.running is False and self.running is True: logger.warn('Lost connection with Service, closing program') self.exit.emit()
def checkIpsChanged(self): if self.api is None or self.api.uuid is None: return # Not connected netInfo = tuple(operations.getNetworkInfo()) for i in netInfo: # If at least one ip has changed if i.mac in self.knownIps and self.knownIps[i.mac] != i.ip: logger.info( 'Notifying ip change to broker (mac {}, from {} to {})'. format(i.mac, self.knownIps[i.mac], i.ip)) try: # Notifies all interfaces IPs self.api.notifyIpChanges(((v.mac, v.ip) for v in netInfo)) # Regenerates Known ips self.knownIps = dict(((v.mac, v.ip) for v in netInfo)) # And notify new listening address to broker address = (self.knownIps[self.api.mac], self.httpServer.getPort()) # And new listening address self.httpServer.restart(address) # sends notification self.api.notifyComm(self.httpServer.getServerUrl()) except Exception as e: logger.warn( 'Got an error notifiying IPs to broker: {} (will retry in a bit)' .format(e.message.decode('windows-1250', 'ignore')))
def checkIpsChanged(self): if self.api.uuid is None: return # Not connected netInfo = tuple(operations.getNetworkInfo()) for i in netInfo: # If at least one ip has changed if i.mac in self.knownIps and self.knownIps[i.mac] != i.ip: logger.info('Notifying ip change to broker (mac {}, from {} to {})'.format(i.mac, self.knownIps[i.mac], i.ip)) try: # Notifies all interfaces IPs self.api.notifyIpChanges(((v.mac, v.ip) for v in netInfo)) # Regenerates Known ips self.knownIps = dict(((i.mac, i.ip) for i in netInfo)) except Exception as e: logger.warn('Got an error notifiying IPs to broker: {} (will retry in a bit)'.format(e.message.decode('windows-1250', 'ignore')))
def run(self): if self.ipc is None: return self.running = True # Wait a bit so we ensure IPC thread is running... time.sleep(2) while self.running and self.ipc.running: try: msg = self.ipc.getMessage() if msg is None: break msgId, data = msg logger.debug('Got Message on User Space: {}:{}'.format( msgId, data)) if msgId == ipc.MSG_MESSAGE: self.displayMessage.emit(QtCore.QString.fromUtf8(data)) elif msgId == ipc.MSG_LOGOFF: self.logoff.emit() elif msgId == ipc.MSG_SCRIPT: self.script.emit(QtCore.QString.fromUtf8(data)) elif msgId == ipc.MSG_INFORMATION: self.information.emit(pickle.loads(data)) except Exception as e: try: logger.error('Got error on IPC thread {}'.format( utils.exceptionToMessage(e))) except: logger.error( 'Got error on IPC thread (an unicode error??)') if self.ipc.running is False and self.running is True: logger.warn('Lost connection with Service, closing program') self.exit.emit()
def interactWithBroker(self): ''' Returns True to continue to main loop, false to stop & exit service ''' # If no configuration is found, stop service if cfg is None: logger.fatal('No configuration found, stopping service') return False self.api = REST.Api(cfg['host'], cfg['masterKey'], cfg['ssl']) # Wait for Broker to be ready counter = 0 while self.isAlive: try: # getNetworkInfo is a generator function netInfo = tuple(operations.getNetworkInfo()) self.knownIps = dict(((i.mac, i.ip) for i in netInfo)) ids = ','.join([i.mac for i in netInfo]) if ids == '': # Wait for any network interface to be ready logger.debug('No valid network interfaces found, retrying in a while...') raise Exception() logger.debug('Ids: {}'.format(ids)) self.api.init(ids) # Set remote logger to notify log info to broker logger.setRemoteLogger(self.api) break except REST.InvalidKeyError: logger.fatal('Can\'t sync with broker: Invalid broker Master Key') return False except REST.UnmanagedHostError: # Maybe interface that is registered with broker is not enabled already? # Right now, we thing that the interface connected to broker is # the interface that broker will know, let's see how this works logger.fatal('This host is not managed by UDS Broker (ids: {})'.format(ids)) return False # On unmanaged hosts, there is no reason right now to continue running except Exception as e: logger.debug('Exception on network info: retrying') logger.exception() # Any other error is expectable and recoverable, so let's wait a bit and retry again # but, if too many errors, will log it (one every minute, for # example) counter += 1 if counter % 60 == 0: # Every 5 minutes, raise a log logger.info('Trying to inititialize connection with broker (last error: {})'.format(exceptionToMessage(e))) # Wait a bit before next check self.doWait(5000) # Broker connection is initialized, now get information about what to # do counter = 0 while self.isAlive: try: logger.debug('Requesting information of what to do now') info = self.api.information() data = info.split('\r') if len(data) != 2: logger.error('The format of the information message is not correct (got {})'.format(info)) raise Exception params = data[1].split('\t') if data[0] == 'rename': try: if len(params) == 1: # Simple rename logger.debug('Renaming computer to {}'.format(params[0])) self.rename(params[0]) # Rename with change password for an user elif len(params) == 4: logger.debug('Renaming computer to {}'.format(params)) self.rename(params[0], params[1], params[2], params[3]) else: logger.error('Got invalid parameter for rename operation: {}'.format(params)) return False break except Exception as e: logger.error('Error at computer renaming stage: {}'.format(e.message)) return False elif data[0] == 'domain': if len(params) != 5: logger.error('Got invalid parameters for domain message: {}'.format(params)) return False self.joinDomain(params[0], params[1], params[2], params[3], params[4]) break else: logger.error('Unrecognized action sent from broker: {}'.format(data[0])) return False # Stop running service except REST.UserServiceNotFoundError: logger.error('The host has lost the sync state with broker! (host uuid changed?)') return False except Exception: if counter % 60 == 0: logger.warn('Too many retries in progress, though still trying (last error: {})'.format(exceptionToMessage(e))) counter += 1 # Any other error is expectable and recoverable, so let's wait # a bit and retry again # Wait a bit before next check self.doWait(5000) if self.rebootRequested: try: operations.reboot() except Exception as e: logger.error('Exception on reboot: {}'.format(e.message)) return False # Stops service return True
def interactWithBroker(self): ''' Returns True to continue to main loop, false to stop & exit service ''' # If no configuration is found, stop service if cfg is None: logger.fatal('No configuration found, stopping service') return False self.api = REST.Api(cfg['host'], cfg['masterKey'], cfg['ssl']) # Wait for Broker to be ready counter = 0 while self.isAlive: try: # getNetworkInfo is a generator function netInfo = tuple(operations.getNetworkInfo()) self.knownIps = dict(((i.mac, i.ip) for i in netInfo)) ids = ','.join([i.mac for i in netInfo]) if ids == '': # Wait for any network interface to be ready logger.debug('No valid network interfaces found, retrying in a while...') raise Exception() logger.debug('Ids: {}'.format(ids)) self.api.init(ids) # Set remote logger to notify log info to broker logger.setRemoteLogger(self.api) break except REST.InvalidKeyError: logger.fatal('Can\'t sync with broker: Invalid broker Master Key') return False except REST.UnmanagedHostError: # Maybe interface that is registered with broker is not enabled already? # Right now, we thing that the interface connected to broker is # the interface that broker will know, let's see how this works logger.fatal('This host is not managed by UDS Broker (ids: {})'.format(ids)) return False # On unmanaged hosts, there is no reason right now to continue running except Exception as e: logger.debug('Exception on network info: retrying') # Any other error is expectable and recoverable, so let's wait a bit and retry again # but, if too many errors, will log it (one every minute, for # example) counter += 1 if counter % 60 == 0: # Every 5 minutes, raise a log logger.info('Trying to inititialize connection with broker (last error: {})'.format(exceptionToMessage(e))) # Wait a bit before next check self.doWait(5000) # Now try to run the "runonce" element runOnce = store.runApplication() if runOnce is not None: if self.execute(runOnce, 'RunOnce') is True: # operations.reboot() return False # Broker connection is initialized, now get information about what to # do counter = 0 while self.isAlive: try: logger.debug('Requesting information of what to do now') info = self.api.information() data = info.split('\r') if len(data) != 2: logger.error('The format of the information message is not correct (got {})'.format(info)) raise Exception params = data[1].split('\t') if data[0] == 'rename': try: if len(params) == 1: # Simple rename logger.debug('Renaming computer to {}'.format(params[0])) self.rename(params[0]) # Rename with change password for an user elif len(params) == 4: logger.debug('Renaming computer to {}'.format(params)) self.rename(params[0], params[1], params[2], params[3]) else: logger.error('Got invalid parameter for rename operation: {}'.format(params)) return False break except Exception as e: logger.error('Error at computer renaming stage: {}'.format(e.message)) return None # Will retry complete broker connection if this point is reached elif data[0] == 'domain': if len(params) != 5: logger.error('Got invalid parameters for domain message: {}'.format(params)) return False # Stop running service self.joinDomain(params[0], params[1], params[2], params[3], params[4]) break else: logger.error('Unrecognized action sent from broker: {}'.format(data[0])) return False # Stop running service except REST.UserServiceNotFoundError: logger.error('The host has lost the sync state with broker! (host uuid changed?)') return False except Exception as err: if counter % 60 == 0: logger.warn('Too many retries in progress, though still trying (last error: {})'.format(exceptionToMessage(err))) counter += 1 # Any other error is expectable and recoverable, so let's wait # a bit and retry again # Wait a bit before next check self.doWait(5000) if self.rebootRequested: try: operations.reboot() except Exception as e: logger.error('Exception on reboot: {}'.format(e.message)) return False # Stops service return True