Merge remote-tracking branch 'origin/master' into enhanced_device
# Conflicts: # src/lib/ebus/device.cpp # src/lib/ebus/device.h
This commit is contained in:
@@ -45,6 +45,7 @@ using std::dec;
|
|||||||
#define O_CERT (O_CAFI+1)
|
#define O_CERT (O_CAFI+1)
|
||||||
#define O_KEYF (O_CERT+1)
|
#define O_KEYF (O_CERT+1)
|
||||||
#define O_KEPA (O_KEYF+1)
|
#define O_KEPA (O_KEYF+1)
|
||||||
|
#define O_INSE (O_KEPA+1)
|
||||||
|
|
||||||
/** the definition of the MQTT arguments. */
|
/** the definition of the MQTT arguments. */
|
||||||
static const struct argp_option g_mqtt_argp_options[] = {
|
static const struct argp_option g_mqtt_argp_options[] = {
|
||||||
@@ -74,6 +75,7 @@ static const struct argp_option g_mqtt_argp_options[] = {
|
|||||||
{"mqttcert", O_CERT, "CERTFILE", 0, "Use CERTFILE for MQTT TLS client certificate (no default)", 0 },
|
{"mqttcert", O_CERT, "CERTFILE", 0, "Use CERTFILE for MQTT TLS client certificate (no default)", 0 },
|
||||||
{"mqttkey", O_KEYF, "KEYFILE", 0, "Use KEYFILE for MQTT TLS client certificate (no default)", 0 },
|
{"mqttkey", O_KEYF, "KEYFILE", 0, "Use KEYFILE for MQTT TLS client certificate (no default)", 0 },
|
||||||
{"mqttkeypass", O_KEPA, "PASSWORD", 0, "Use PASSWORD for the encrypted KEYFILE (no default)", 0 },
|
{"mqttkeypass", O_KEPA, "PASSWORD", 0, "Use PASSWORD for the encrypted KEYFILE (no default)", 0 },
|
||||||
|
{"mqttinsecure",O_INSE, nullptr, 0, "Allow insecure TLS connection (e.g. using a self signed certificate)", 0 },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{nullptr, 0, nullptr, 0, nullptr, 0 },
|
{nullptr, 0, nullptr, 0, nullptr, 0 },
|
||||||
@@ -105,6 +107,7 @@ static const char* g_capath = nullptr; //!< CA path for TLS
|
|||||||
static const char* g_certfile = nullptr; //!< client certificate file for TLS
|
static const char* g_certfile = nullptr; //!< client certificate file for TLS
|
||||||
static const char* g_keyfile = nullptr; //!< client key file for TLS
|
static const char* g_keyfile = nullptr; //!< client key file for TLS
|
||||||
static const char* g_keypass = nullptr; //!< client key file password for TLS
|
static const char* g_keypass = nullptr; //!< client key file password for TLS
|
||||||
|
static bool g_insecure = false; //!< whether to allow insecure TLS connection
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool parseTopic(const string& topic, vector<string>* strs, vector<string>* fields);
|
bool parseTopic(const string& topic, vector<string>* strs, vector<string>* fields);
|
||||||
@@ -248,6 +251,9 @@ static error_t mqtt_parse_opt(int key, char *arg, struct argp_state *state) {
|
|||||||
}
|
}
|
||||||
g_keypass = replaceSecret(arg);
|
g_keypass = replaceSecret(arg);
|
||||||
break;
|
break;
|
||||||
|
case O_INSE: //--mqttinsecure
|
||||||
|
g_insecure = true;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -508,6 +514,11 @@ MqttHandler::MqttHandler(UserInfo* userInfo, BusHandler* busHandler, MessageMap*
|
|||||||
ret = mosquitto_tls_set(m_mosquitto, g_cafile, g_capath, g_certfile, g_keyfile, on_keypassword);
|
ret = mosquitto_tls_set(m_mosquitto, g_cafile, g_capath, g_certfile, g_keyfile, on_keypassword);
|
||||||
if (ret != MOSQ_ERR_SUCCESS) {
|
if (ret != MOSQ_ERR_SUCCESS) {
|
||||||
logOtherError("mqtt", "unable to set TLS: %d", ret);
|
logOtherError("mqtt", "unable to set TLS: %d", ret);
|
||||||
|
} else if (g_insecure) {
|
||||||
|
ret = mosquitto_tls_insecure_set(m_mosquitto, true);
|
||||||
|
if (ret != MOSQ_ERR_SUCCESS) {
|
||||||
|
logOtherError("mqtt", "unable to set TLS insecure: %d", ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+15
-15
@@ -131,21 +131,10 @@ Device* Device::create(const char* name, bool checkDevice, bool readOnly, bool i
|
|||||||
free(in);
|
free(in);
|
||||||
return nullptr; // invalid port
|
return nullptr; // invalid port
|
||||||
}
|
}
|
||||||
struct sockaddr_in address;
|
|
||||||
memset(reinterpret_cast<char*>(&address), 0, sizeof(address));
|
|
||||||
*portpos = 0;
|
*portpos = 0;
|
||||||
if (inet_aton(addrpos, &address.sin_addr) == 0) {
|
char* hostOrIp = strdup(addrpos);
|
||||||
struct hostent* h = gethostbyname(addrpos);
|
|
||||||
if (h == nullptr) {
|
|
||||||
free(in);
|
|
||||||
return nullptr; // invalid host
|
|
||||||
}
|
|
||||||
memcpy(&address.sin_addr, h->h_addr_list[0], h->h_length);
|
|
||||||
}
|
|
||||||
free(in);
|
free(in);
|
||||||
address.sin_family = AF_INET;
|
return new NetworkDevice(name, hostOrIp, port, readOnly, initialSend, udp, enhanced);
|
||||||
address.sin_port = (in_port_t)htons((uint16_t)port);
|
|
||||||
return new NetworkDevice(name, address, readOnly, initialSend, udp, enhanced);
|
|
||||||
}
|
}
|
||||||
// support enh:/dev/<device>
|
// support enh:/dev/<device>
|
||||||
return new SerialDevice(name, checkDevice, readOnly, initialSend, enhanced);
|
return new SerialDevice(name, checkDevice, readOnly, initialSend, enhanced);
|
||||||
@@ -656,13 +645,24 @@ result_t NetworkDevice::open() {
|
|||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
struct sockaddr_in address;
|
||||||
|
memset(reinterpret_cast<char*>(&address), 0, sizeof(address));
|
||||||
|
if (inet_aton(m_hostOrIp, &address.sin_addr) == 0) {
|
||||||
|
struct hostent* h = gethostbyname(m_hostOrIp);
|
||||||
|
if (h == nullptr) {
|
||||||
|
return RESULT_ERR_GENERIC_IO; // invalid host
|
||||||
|
}
|
||||||
|
memcpy(&address.sin_addr, h->h_addr_list[0], h->h_length);
|
||||||
|
}
|
||||||
|
address.sin_family = AF_INET;
|
||||||
|
address.sin_port = (in_port_t)htons(m_port);
|
||||||
|
|
||||||
m_fd = socket(AF_INET, m_udp ? SOCK_DGRAM : SOCK_STREAM, 0);
|
m_fd = socket(AF_INET, m_udp ? SOCK_DGRAM : SOCK_STREAM, 0);
|
||||||
if (m_fd < 0) {
|
if (m_fd < 0) {
|
||||||
return RESULT_ERR_GENERIC_IO;
|
return RESULT_ERR_GENERIC_IO;
|
||||||
}
|
}
|
||||||
int ret;
|
int ret;
|
||||||
if (m_udp) {
|
if (m_udp) {
|
||||||
struct sockaddr_in address = m_address;
|
|
||||||
address.sin_addr.s_addr = INADDR_ANY;
|
address.sin_addr.s_addr = INADDR_ANY;
|
||||||
ret = bind(m_fd, (struct sockaddr*)&address, sizeof(address));
|
ret = bind(m_fd, (struct sockaddr*)&address, sizeof(address));
|
||||||
} else {
|
} else {
|
||||||
@@ -678,7 +678,7 @@ result_t NetworkDevice::open() {
|
|||||||
setsockopt(m_fd, IPPROTO_TCP, TCP_KEEPCNT, reinterpret_cast<void*>(&value), sizeof(value));
|
setsockopt(m_fd, IPPROTO_TCP, TCP_KEEPCNT, reinterpret_cast<void*>(&value), sizeof(value));
|
||||||
}
|
}
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
ret = connect(m_fd, (struct sockaddr*)&m_address, sizeof(m_address));
|
ret = connect(m_fd, (struct sockaddr*)&address, sizeof(address));
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
close();
|
close();
|
||||||
|
|||||||
+14
-5
@@ -302,19 +302,25 @@ class NetworkDevice : public Device {
|
|||||||
* Construct a new instance.
|
* Construct a new instance.
|
||||||
* @param name the device name (e.g. "/dev/ttyUSB0" for serial, "127.0.0.1:1234" for network).
|
* @param name the device name (e.g. "/dev/ttyUSB0" for serial, "127.0.0.1:1234" for network).
|
||||||
* @param address the socket address of the device.
|
* @param address the socket address of the device.
|
||||||
|
* @param hostOrIp the host name or IP address of the device.
|
||||||
|
* @param port the TCP or UDP port of the device.
|
||||||
* @param readOnly whether to allow read access to the device only.
|
* @param readOnly whether to allow read access to the device only.
|
||||||
* @param initialSend whether to send an initial @a ESC symbol in @a open().
|
* @param initialSend whether to send an initial @a ESC symbol in @a open().
|
||||||
* @param udp true for UDP, false to TCP.
|
* @param udp true for UDP, false to TCP.
|
||||||
* @param enhancedProto whether to use the ebusd enhanced protocol.
|
* @param enhancedProto whether to use the ebusd enhanced protocol.
|
||||||
*/
|
*/
|
||||||
NetworkDevice(const char* name, const struct sockaddr_in& address, bool readOnly, bool initialSend,
|
NetworkDevice(const char* name, const char* hostOrIp, uint16_t port, bool readOnly, bool initialSend,
|
||||||
bool udp, bool enhancedProto=false)
|
bool udp, bool enhancedProto=false)
|
||||||
: Device(name, true, readOnly, initialSend, enhancedProto), m_address(address), m_udp(udp) {}
|
: Device(name, true, readOnly, initialSend, enhancedProto), m_hostOrIp(hostOrIp), m_port(port), m_udp(udp) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor.
|
* Destructor.
|
||||||
*/
|
*/
|
||||||
~NetworkDevice() override {}
|
~NetworkDevice() override {
|
||||||
|
if (m_hostOrIp) {
|
||||||
|
free((void*)m_hostOrIp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// @copydoc
|
// @copydoc
|
||||||
unsigned int getLatency() const override { return 10000; }
|
unsigned int getLatency() const override { return 10000; }
|
||||||
@@ -329,8 +335,11 @@ class NetworkDevice : public Device {
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** the socket address of the device. */
|
/** the host name or IP address of the device. */
|
||||||
const struct sockaddr_in m_address;
|
const char* m_hostOrIp;
|
||||||
|
|
||||||
|
/** the TCP or UDP port of the device. */
|
||||||
|
const uint16_t m_port;
|
||||||
|
|
||||||
/** true for UDP, false to TCP. */
|
/** true for UDP, false to TCP. */
|
||||||
const bool m_udp;
|
const bool m_udp;
|
||||||
|
|||||||
Reference in New Issue
Block a user