def test_directoryCreation(self): # # Check default directory creation # directory = path_helpers.prettify(MqttDefaultFilePersistence.DEFAULT_DIRECTORY) self.persistenceFile = MqttDefaultFilePersistence() self.assertTrue(os.path.isdir(directory)) # Directory must now exist self.persistenceFile.open('theClientId', 'theUri') storageDirectory = os.path.join(directory, self.persistenceFile._perClientIdAndServerUriDirectory) self.assertTrue(os.path.isdir(storageDirectory)) # Sub-directory must now exist del self.persistenceFile # # Check custom directory creation # directory = path_helpers.prettify('~/mqtt-custom-persistence') self.persistenceFile = MqttDefaultFilePersistence(directory) self.assertTrue(os.path.isdir(directory)) # Directory must now exist # Tidy up on disk shutil.rmtree(directory)
def test_directoryCreation(self): # # Check default directory creation # directory = path_helpers.prettify( MqttDefaultFilePersistence.DEFAULT_DIRECTORY) self.persistenceFile = MqttDefaultFilePersistence() self.assertTrue(os.path.isdir(directory)) # Directory must now exist self.persistenceFile.open('theClientId', 'theUri') storageDirectory = os.path.join( directory, self.persistenceFile._perClientIdAndServerUriDirectory) self.assertTrue( os.path.isdir(storageDirectory)) # Sub-directory must now exist del self.persistenceFile # # Check custom directory creation # directory = path_helpers.prettify('~/mqtt-custom-persistence') self.persistenceFile = MqttDefaultFilePersistence(directory) self.assertTrue(os.path.isdir(directory)) # Directory must now exist # Tidy up on disk shutil.rmtree(directory)
def parseConfigFile(self, configFile): global config config = None pathConfigFile = path_helpers.prettify(configFile) if pathConfigFile and os.path.isfile(pathConfigFile): config = ConfigObj(pathConfigFile) if config: # Check if most important configuration parameters are present assert ('cloudio' ) in config, 'Missing group \'cloudio\' in config file!' assert ('host') in config[ 'cloudio'], 'Missing \'host\' parameter in cloudio group!' assert ('port') in config[ 'cloudio'], 'Missing \'port\' parameter in cloudio group!' assert ('username') in config[ 'cloudio'], 'Missing \'username\' parameter in cloudio group!' assert ('password') in config[ 'cloudio'], 'Missing \'password\' parameter in cloudio group!' else: sys.exit(u'Error reading config file') return config
def test_storageDirectory(self): testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) storageDirectoryName = 'theClientId-888-theServerUri' storageDirectory = os.path.join(self.persistenceFile._directory, storageDirectoryName) if os.path.exists(storageDirectory): os.rmdir(storageDirectory) self.assertTrue(not os.path.exists(storageDirectory)) # Directory must not exist before this test # # Check that '/', '\\', ':' and ' ' gets removed # self.persistenceFile.open('the Client/ Id-888', '\\the:Server:Uri ') # Check storage directory self.assertEqual(self.persistenceFile._perClientIdAndServerUriDirectory, storageDirectoryName) # Compare storage directory name self.assertEqual(self.persistenceFile._storageDirectory(), storageDirectory) # Directory must now exist self.assertTrue(os.path.exists(storageDirectory)) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def parseConfigFile(self, configFile): global config from configobj import ConfigObj config = None pathConfigFile = path_helpers.prettify(configFile) if pathConfigFile and os.path.isfile(pathConfigFile): config = ConfigObj(pathConfigFile) if config: # Check if most important configuration parameters are present assert 'cloudio' in config, 'Missing group \'cloudio\' in config file!' assert 'endpoint' in config, 'Missing group \'endpoint\' in config file!' assert 'node' in config, 'Missing group \'node\' in config file!' assert 'host' in config['cloudio'], 'Missing \'host\' parameter in cloudio group!' assert 'port' in config['cloudio'], 'Missing \'port\' parameter in cloudio group!' assert 'username' in config['cloudio'], 'Missing \'username\' parameter in cloudio group!' assert 'password' in config['cloudio'], 'Missing \'password\' parameter in cloudio group!' assert 'subscribe_topics' in config['cloudio'], 'Missing \'subscribe_topics\' parameter in cloudio group!' assert 'qos' in config['cloudio'], 'Missing \'qos\' parameter in cloudio group!' assert 'name' in config['endpoint'], 'Missing \'name\' parameter in endpoint group!' assert 'name' in config['node'], 'Missing \'name\' parameter in node group!' else: sys.exit(u'Error reading config file') return config
def test_clearPresistence(self): keyNbrs = 5 testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) self.assertEqual(keyNbrs, len(self.persistenceFile.keys())) # Clear persistence self.persistenceFile.clear() self.assertEqual(0, len(self.persistenceFile.keys())) self.assertEqual(0, len(self._getStorageFileNames())) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def createModel(self, xmlModelFile): try: pathName = path_helpers.prettify(xmlModelFile) self.log.info('Reading cloud.iO enpoint model from \'%s\'' % pathName) pathName = os.path.abspath(pathName) # Convert to absolute path to make isfile() happy # Check if config file is present if os.path.isfile(pathName): # Parse XML config file xmlConfigFile = minidom.parse(pathName) if xmlConfigFile: configList = xmlConfigFile.getElementsByTagName(u'config') """:type : list of minidom.Element""" for config in configList: deviceTypeList = config.getElementsByTagName(u'deviceType') """:type : list of minidom.Element""" for deviceType in deviceTypeList: """:type : list of minidom.Element""" print(u'Parsing elements for device: ' + deviceType.getAttribute('typeId')) self._parseDeviceTypeFromXmlDomElement(deviceType) else: raise RuntimeError(u'Missing configuration file: %s' % pathName) except Exception as e: traceback.print_exc() # After the endpoint is fully created the presents can be announced self.endpoint.announce()
def test_storageDirectory(self): testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) storageDirectoryName = 'theClientId-888-theServerUri' storageDirectory = os.path.join(self.persistenceFile._directory, storageDirectoryName) if os.path.exists(storageDirectory): os.rmdir(storageDirectory) self.assertTrue(not os.path.exists(storageDirectory) ) # Directory must not exist before this test # # Check that '/', '\\', ':' and ' ' gets removed # self.persistenceFile.open('the Client/ Id-888', '\\the:Server:Uri ') # Check storage directory self.assertEqual( self.persistenceFile._perClientIdAndServerUriDirectory, storageDirectoryName) # Compare storage directory name self.assertEqual(self.persistenceFile._storageDirectory(), storageDirectory) # Directory must now exist self.assertTrue(os.path.exists(storageDirectory)) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putPendingUpdate(self): testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') self.persistenceFile.put(self.keys[8], PendingUpdate(self.keys[8])) self.assertEqual(self.persistenceFile.get(self.keys[8]).getHeaderBytes(), self.keys[8])
def test_putPendingUpdate(self): testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') self.persistenceFile.put(self.keys[8], PendingUpdate(self.keys[8])) self.assertEqual( self.persistenceFile.get(self.keys[8]).getHeaderBytes(), self.keys[8])
def __init__(self, directory=None): """ :param directory: Base directory where to store the persistent data """ super(MqttDefaultFilePersistence, self).__init__() if directory is None or directory == '': directory = self.DEFAULT_DIRECTORY self._directory = path_helpers.prettify(directory) self._perClientIdAndServerUriDirectory = None # type: str # Give a temporary unique storage name in case open() method does not get called self._perClientIdAndServerUriDirectory = str(uuid.uuid4()) # Create base directory if not os.path.exists(self._directory): os.makedirs(self._directory)
def test_containsKeys(self): keyNbrs = 5 testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) self.assertTrue(self.persistenceFile.containsKey(self.keys[0])) self.assertTrue(self.persistenceFile.containsKey(self.keys[1])) self.assertTrue(self.persistenceFile.containsKey(self.keys[3])) self.assertTrue(self.persistenceFile.containsKey(self.keys[4])) self.assertFalse(self.persistenceFile.containsKey(self.keys[5])) self.assertFalse(self.persistenceFile.containsKey(self.keys[10])) self.assertFalse(self.persistenceFile.containsKey(self.keys[20])) self.assertEqual(keyNbrs, len(self.persistenceFile.keys())) # Remove one key and check again self.assertTrue(self.persistenceFile.containsKey( self.keys[2])) # Should be present self.persistenceFile.remove(self.keys[2]) # Remove it self.assertFalse(self.persistenceFile.containsKey( self.keys[2])) # Should be gone self.assertEqual(keyNbrs - 1, len(self.persistenceFile.keys())) # Get one key (not removing it) and check again self.assertTrue(self.persistenceFile.containsKey( self.keys[4])) # Should be present self.persistenceFile.get(self.keys[4]) # Get it self.assertTrue(self.persistenceFile.containsKey( self.keys[4])) # Should be still there # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putPersistable(self): testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') data = self.keys[0] # Store the key as data self.persistenceFile.put(self.keys[0], data) keyFile = os.path.join(self.persistenceFile._storageDirectory(), self.keys[0]) # Check if name of key file is right self.assertEqual(self.persistenceFile._keyFileName(self.keys[0]), keyFile) # Check if key file was created self.assertTrue(os.path.isfile(keyFile)) # Check if file data is what we expect self.assertEqual(self._getFileContent(keyFile), data) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putPersistableMultiple(self): keyNbrs = 3 testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) fileNames = self._getStorageFileNames() self.assertEqual(keyNbrs, len(fileNames)) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putPersistableMultiple(self): keyNbrs = 3 testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) fileNames = self._getStorageFileNames() self.assertEqual(keyNbrs, len(fileNames)) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def parseConfigFile(self, configFile): global config from configobj import ConfigObj config = None pathConfigFile = path_helpers.prettify(configFile) if pathConfigFile and os.path.isfile(pathConfigFile): config = ConfigObj(pathConfigFile) if config: # Check if most important configuration parameters are present assert 'cloudio' in config, 'Missing group \'cloudio\' in config file!' assert 'endpoint' in config, 'Missing group \'endpoint\' in config file!' assert 'node' in config, 'Missing group \'node\' in config file!' assert 'host' in config[ 'cloudio'], 'Missing \'host\' parameter in cloudio group!' assert 'port' in config[ 'cloudio'], 'Missing \'port\' parameter in cloudio group!' assert 'username' in config[ 'cloudio'], 'Missing \'username\' parameter in cloudio group!' assert 'password' in config[ 'cloudio'], 'Missing \'password\' parameter in cloudio group!' assert 'subscribe_topics' in config[ 'cloudio'], 'Missing \'subscribe_topics\' parameter in cloudio group!' assert 'qos' in config[ 'cloudio'], 'Missing \'qos\' parameter in cloudio group!' assert 'name' in config[ 'endpoint'], 'Missing \'name\' parameter in endpoint group!' assert 'name' in config[ 'node'], 'Missing \'name\' parameter in node group!' else: sys.exit(u'Error reading config file') return config
def test_putAndRemovePersistable(self): keyNbrs = 10 testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) # Remove in the middle self.persistenceFile.remove(self.keys[5]) self.persistenceFile.remove(self.keys[6]) # Check files left self.assertEqual(keyNbrs - 2, len(self._getStorageFileNames())) # Remove first and last self.persistenceFile.remove(self.keys[0]) self.persistenceFile.remove(self.keys[keyNbrs - 1]) # Check files left self.assertEqual(keyNbrs - 4, len(self._getStorageFileNames())) # Check names of remaining key files fileNames = self._getStorageFileNames() self.assertTrue(self.keys[1] in fileNames) self.assertTrue(self.keys[2] in fileNames) self.assertTrue(self.keys[3] in fileNames) self.assertTrue(self.keys[4] in fileNames) self.assertTrue(self.keys[7] in fileNames) self.assertTrue(self.keys[8] in fileNames) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_containsKeys(self): keyNbrs = 5 testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) self.assertTrue(self.persistenceFile.containsKey(self.keys[0])) self.assertTrue(self.persistenceFile.containsKey(self.keys[1])) self.assertTrue(self.persistenceFile.containsKey(self.keys[3])) self.assertTrue(self.persistenceFile.containsKey(self.keys[4])) self.assertFalse(self.persistenceFile.containsKey(self.keys[5])) self.assertFalse(self.persistenceFile.containsKey(self.keys[10])) self.assertFalse(self.persistenceFile.containsKey(self.keys[20])) self.assertEqual(keyNbrs, len(self.persistenceFile.keys())) # Remove one key and check again self.assertTrue(self.persistenceFile.containsKey(self.keys[2])) # Should be present self.persistenceFile.remove(self.keys[2]) # Remove it self.assertFalse(self.persistenceFile.containsKey(self.keys[2])) # Should be gone self.assertEqual(keyNbrs - 1, len(self.persistenceFile.keys())) # Get one key (not removing it) and check again self.assertTrue(self.persistenceFile.containsKey(self.keys[4])) # Should be present self.persistenceFile.get(self.keys[4]) # Get it self.assertTrue(self.persistenceFile.containsKey(self.keys[4])) # Should be still there # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putAndGetPersistable(self): keyNbrs = 10 testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) # Get data key[0] data = self.persistenceFile.get(self.keys[0]) self.assertEqual(data.getHeaderBytes(), self.keys[0]) # Get data key[9] data = self.persistenceFile.get(self.keys[9]) self.assertEqual(data.getHeaderBytes(), self.keys[9]) # Get data key[3] data = self.persistenceFile.get(self.keys[3]) self.assertEqual(data.getHeaderBytes(), self.keys[3]) # Get data key[8] data = self.persistenceFile.get(self.keys[8]) self.assertEqual(data.getHeaderBytes(), self.keys[8]) # Get none existing data data = self.persistenceFile.get(self.keys[keyNbrs + 1]) self.assertEqual(data, None) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def createModel(self, xmlModelFile): try: pathName = path_helpers.prettify(xmlModelFile) self.log.info('Reading cloud.iO enpoint model from \'%s\'' % pathName) pathName = os.path.abspath( pathName) # Convert to absolute path to make isfile() happy # Check if config file is present if os.path.isfile(pathName): # Parse XML config file xmlConfigFile = minidom.parse(pathName) if xmlConfigFile: configList = xmlConfigFile.getElementsByTagName(u'config') """:type : list of minidom.Element""" for config in configList: deviceTypeList = config.getElementsByTagName( u'deviceType') """:type : list of minidom.Element""" for deviceType in deviceTypeList: """:type : list of minidom.Element""" print(u'Parsing elements for device: ' + deviceType.getAttribute('typeId')) self._parseDeviceTypeFromXmlDomElement(deviceType) else: raise RuntimeError(u'Missing configuration file: %s' % pathName) except Exception as e: traceback.print_exc() # After the endpoint is fully created the presents can be announced self.endpoint.announce()
def test_putPersistable(self): testPresistenceDirectory = path_helpers.prettify( '~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence( testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') data = self.keys[0] # Store the key as data self.persistenceFile.put(self.keys[0], data) keyFile = os.path.join(self.persistenceFile._storageDirectory(), self.keys[0]) # Check if name of key file is right self.assertEqual(self.persistenceFile._keyFileName(self.keys[0]), keyFile) # Check if key file was created self.assertTrue(os.path.isfile(keyFile)) # Check if file data is what we expect self.assertEqual(self._getFileContent(keyFile), data) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putAndRemovePersistable(self): keyNbrs = 10 testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) # Remove in the middle self.persistenceFile.remove(self.keys[5]) self.persistenceFile.remove(self.keys[6]) # Check files left self.assertEqual(keyNbrs -2, len(self._getStorageFileNames())) # Remove first and last self.persistenceFile.remove(self.keys[0]) self.persistenceFile.remove(self.keys[keyNbrs - 1]) # Check files left self.assertEqual(keyNbrs - 4, len(self._getStorageFileNames())) # Check names of remaining key files fileNames = self._getStorageFileNames() self.assertTrue(self.keys[1] in fileNames) self.assertTrue(self.keys[2] in fileNames) self.assertTrue(self.keys[3] in fileNames) self.assertTrue(self.keys[4] in fileNames) self.assertTrue(self.keys[7] in fileNames) self.assertTrue(self.keys[8] in fileNames) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_putAndGetPersistable(self): keyNbrs = 10 testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) # Get data key[0] data = self.persistenceFile.get(self.keys[0]) self.assertEqual(data.getHeaderBytes(), self.keys[0]) # Get data key[9] data = self.persistenceFile.get(self.keys[9]) self.assertEqual(data.getHeaderBytes(), self.keys[9]) # Get data key[3] data = self.persistenceFile.get(self.keys[3]) self.assertEqual(data.getHeaderBytes(), self.keys[3]) # Get data key[8] data = self.persistenceFile.get(self.keys[8]) self.assertEqual(data.getHeaderBytes(), self.keys[8]) # Get none existing data data = self.persistenceFile.get(self.keys[keyNbrs + 1]) self.assertEqual(data, None) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def test_clearPresistence(self): keyNbrs = 5 testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence') self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory) self.persistenceFile.open('put-persistable', 'mqtt-test-server') # Put some data for idx, key in enumerate(self.keys): if idx >= keyNbrs: break data = key # Store the key as data self.persistenceFile.put(key, data) self.assertEqual(keyNbrs, len(self.persistenceFile.keys())) # Clear persistence self.persistenceFile.clear() self.assertEqual(0, len(self.persistenceFile.keys())) self.assertEqual(0, len(self._getStorageFileNames())) # Tidy up on disk shutil.rmtree(testPresistenceDirectory)
def __init__(self, uuid, configuration=None): self._endPointIsReady = False # Set to true after connection and subscription self.uuid = uuid # type: str self.nodes = {} # type: dict as CloudioNode self.cleanSession = True self.messageFormat = None # type: CloudioMessageFormat self.persistence = None # type MqttClientPersistence self.log.debug('Creating Endpoint %s' % uuid) # Check if a configuration with properties is given if configuration is None: # Try to load properties using a config file properties = ResourceLoader.loadFromLocations(self.uuid + '.properties', ['home:' + '/.config/cloud.io/', 'file:/etc/cloud.io/']) configuration = PropertiesEndpointConfiguration(properties) self._retryInterval = 10 # Connect retry interval in seconds self.messageFormat = JsonMessageFormat() # Check if 'host' property is present in config file host = configuration.getProperty(self.MQTT_HOST_URI_PROPERTY) if host == '': exit('Missing mandatory property "' + self.MQTT_HOST_URI_PROPERTY + '"') # Create persistence object. persistenceType = configuration.getProperty(self.MQTT_PERSISTENCE_PROPERTY, self.MQTT_PERSISTENCE_DEFAULT) if persistenceType == self.MQTT_PERSISTENCE_MEMORY: self.persistence = mqtt.MemoryPersistence() elif persistenceType == self.MQTT_PERSISTENCE_FILE: persistenceLocation = configuration.getProperty(self.MQTT_PERSISTENCE_LOCATION) self.persistence = mqtt.MqttDefaultFilePersistence(directory=persistenceLocation) elif persistenceType == self.MQTT_PERSISTENCE_NONE: self.persistence = None else: raise InvalidPropertyException('Unknown persistence implementation ' + '(ch.hevs.cloudio.endpoint.persistence): ' + '\'' + persistenceType + '\'') # Open peristence storage if self.persistence: self.persistence.open(clientId=self.uuid, serverUri=host) self.options = mqtt.MqttConnectOptions() # Last will is a message with the UUID of the endpoint and no payload. willMessage = 'DEAD' self.options.setWill(u'@offline/' + uuid, willMessage, 1, False) self.options._caFile = configuration.getProperty(self.CERT_AUTHORITY_FILE_PROPERTY, None) self.options._clientCertFile = configuration.getProperty(self.ENDPOINT_IDENTITY_CERT_FILE_PROPERTY, None) self.options._clientKeyFile = configuration.getProperty(self.ENDPOINT_IDENTITY_KEY_FILE_PROPERTY, None) self.options._username = configuration.getProperty('username') self.options._password = configuration.getProperty('password') self.options._tlsVersion = configuration.getProperty(self.ENDPOINT_IDENTITY_TLS_VERSION_PROPERTY, 'tlsv1.2') # Make path usable self.options._caFile = path_helpers.prettify(self.options._caFile) self.options._clientCertFile = path_helpers.prettify(self.options._clientCertFile) self.options._clientKeyFile = path_helpers.prettify(self.options._clientKeyFile) self._client = mqtt.MqttReconnectClient(host, clientId=self.uuid + '-endpoint-', clean_session=self.cleanSession, options=self.options) # Register callback method for connection established self._client.setOnConnectedCallback(self._onConnected) # Register callback method to be called when receiving a message over MQTT self._client.setOnMessageCallback(self._onMessageArrived) # Start the client self._client.start()
def __init__(self, uuid, configuration=None): self._endPointIsReady = False # Set to true after connection and subscription self.uuid = uuid # type: str self.nodes = {} # type: dict as CloudioNode self.cleanSession = True self.messageFormat = None # type: CloudioMessageFormat self.persistence = None # type MqttClientPersistence self.log.debug('Creating Endpoint %s' % uuid) # Check if a configuration with properties is given if configuration is None: # Try to load properties using a config file properties = ResourceLoader.loadFromLocations( self.uuid + '.properties', ['home:' + '/.config/cloud.io/', 'file:/etc/cloud.io/']) configuration = PropertiesEndpointConfiguration(properties) self._retryInterval = 10 # Connect retry interval in seconds self.messageFormat = JsonMessageFormat() # Check if 'host' property is present in config file host = configuration.getProperty(self.MQTT_HOST_URI_PROPERTY) if host == '': exit('Missing mandatory property "' + self.MQTT_HOST_URI_PROPERTY + '"') # Create persistence object. persistenceType = configuration.getProperty( self.MQTT_PERSISTENCE_PROPERTY, self.MQTT_PERSISTENCE_DEFAULT) if persistenceType == self.MQTT_PERSISTENCE_MEMORY: self.persistence = mqtt.MemoryPersistence() elif persistenceType == self.MQTT_PERSISTENCE_FILE: persistenceLocation = configuration.getProperty( self.MQTT_PERSISTENCE_LOCATION) self.persistence = mqtt.MqttDefaultFilePersistence( directory=persistenceLocation) elif persistenceType == self.MQTT_PERSISTENCE_NONE: self.persistence = None else: raise InvalidPropertyException( 'Unknown persistence implementation ' + '(ch.hevs.cloudio.endpoint.persistence): ' + '\'' + persistenceType + '\'') # Open peristence storage if self.persistence: self.persistence.open(clientId=self.uuid, serverUri=host) self.options = mqtt.MqttConnectOptions() # Last will is a message with the UUID of the endpoint and no payload. willMessage = 'DEAD' self.options.setWill(u'@offline/' + uuid, willMessage, 1, False) self.options._caFile = configuration.getProperty( self.CERT_AUTHORITY_FILE_PROPERTY, None) self.options._clientCertFile = configuration.getProperty( self.ENDPOINT_IDENTITY_CERT_FILE_PROPERTY, None) self.options._clientKeyFile = configuration.getProperty( self.ENDPOINT_IDENTITY_KEY_FILE_PROPERTY, None) self.options._username = configuration.getProperty('username') self.options._password = configuration.getProperty('password') self.options._tlsVersion = configuration.getProperty( self.ENDPOINT_IDENTITY_TLS_VERSION_PROPERTY, 'tlsv1.2') # Make path usable self.options._caFile = path_helpers.prettify(self.options._caFile) self.options._clientCertFile = path_helpers.prettify( self.options._clientCertFile) self.options._clientKeyFile = path_helpers.prettify( self.options._clientKeyFile) self._client = mqtt.MqttReconnectClient( host, clientId=self.uuid + '-endpoint-', clean_session=self.cleanSession, options=self.options) # Register callback method for connection established self._client.setOnConnectedCallback(self._onConnected) # Register callback method to be called when receiving a message over MQTT self._client.setOnMessageCallback(self._onMessageArrived) # Start the client self._client.start()