Completed
Pull Request — master (#544)
by
unknown
09:52 queued 03:16
created

PublishAction   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 52
rs 10
c 0
b 0
f 0
wmc 7
1
from st2actions.runners.pythonrunner import Action
2
import paho.mqtt.publish as publish
3
4
5
class PublishAction(Action):
6
    def __init__(self, config):
7
        super(PublishAction, self).__init__(config)
8
9
        # Sensor/Action Mismatch
10
        self._config = self.config
11
12
        self._client = None
13
        self._hostname = self._config.get('hostname', None)
14
        self._port = self._config.get('port', 1883)
15
        self._protocol = self._config.get('protocol', 'MQTTv311')
16
        self._client_id = self._config.get('client_id', None)
17
        self._userdata = self._config.get('userdata', None)
18
        self._username = self._config.get('username', None)
19
        self._password = self._config.get('password', None)
20
        self._subscribe = self._config.get('subscribe', None)
21
        self._ssl = self._config.get('ssl', False)
22
        self._ssl_cacert = self._config.get('ssl_cacert', None)
23
        self._ssl_cert = self._config.get('ssl_cert', None)
24
        self._ssl_key = self._config.get('ssl_key', None)
25
26
        self._ssl_payload = None
27
        self._auth_payload = None
28
29
    def run(self, topic, message=None, qos=0, retain=False):
30
        if self._username:
31
            self._auth_payload = {
32
                'username': self._username,
33
                'password': self._password,
34
            }
35
36
        if self._ssl:
37
            if not self._ssl_cacert:
38
                raise ValueError('Missing "ssl_cacert" config option')
39
40
            if not self._ssl_cert:
41
                raise ValueError('Missing "ssl_cert" config option')
42
43
            if not self._ssl_key:
44
                raise ValueError('Missing "ssl_key" config option')
45
46
            self._ssl_payload = {
47
                'ca_certs': self._ssl_cacert,
48
                'certfile': self._ssl_cert,
49
                'keyfile': self._ssl_key,
50
            }
51
52
        publish.single(topic, payload=message, qos=qos, retain=retain,
53
                       hostname=self._hostname, port=self._port,
54
                       client_id=self._client_id, keepalive=60,
55
                       auth=self._auth_payload, tls=self._ssl_payload,
56
                       protocol=self._protocol)
57