diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c index 3ae40a6266327fe1c9792e352e57fff4986cb771..15c9df4c892d90af19c850b82f6d551ddb4448df 100644 --- a/src/sbbs3/sbbscon.c +++ b/src/sbbs3/sbbscon.c @@ -240,13 +240,12 @@ static void notify_systemd(const char* new_status) } #endif -static int lputs(int level, char *str) +static int log_puts(int level, char *str) { static pthread_mutex_t mutex; static BOOL mutex_initialized; char *p; - mqtt_lputs(&bbs_startup.mqtt, TOPIC_HOST, level, str); #ifdef __unix__ if (is_daemon) { if(str!=NULL) { @@ -286,6 +285,13 @@ static int lputs(int level, char *str) return(prompt_len); } +static int lputs(int level, char *str) +{ + if(str != NULL && *str != '\0') + mqtt_lputs(&bbs_startup.mqtt, TOPIC_HOST, level, str); + return log_puts(level, str); +} + static void errormsg(void *cbdata, int level, const char *msg) { error_count++; @@ -304,11 +310,20 @@ static int lprintf(int level, const char *fmt, ...) return(lputs(level,sbuf)); } +static void recycle_all() +{ + bbs_startup.recycle_now = TRUE; + ftp_startup.recycle_now = TRUE; + web_startup.recycle_now = TRUE; + mail_startup.recycle_now = TRUE; + services_startup.recycle_now = TRUE; +} + #ifdef USE_MOSQUITTO void mqtt_message_received(struct mosquitto* mosq, void* cbdata, const struct mosquitto_message* msg) { char topic[128]; - lprintf(LOG_DEBUG, "MQTT message received on %s", msg->topic); + lprintf(LOG_DEBUG, "MQTT message received (%d bytes) on %s", msg->payloadlen, msg->topic); for(int i = bbs_startup.first_node; i <= bbs_startup.last_node; i++) { mqtt_topic(&bbs_startup.mqtt, TOPIC_BBS, topic, sizeof(topic), "node%d/input", i); if(strcmp(msg->topic, topic) != 0) @@ -317,28 +332,27 @@ void mqtt_message_received(struct mosquitto* mosq, void* cbdata, const struct mo RingBufWrite(bbs_startup.node_inbuf[i - 1], msg->payload, msg->payloadlen); return; } - mqtt_topic(&bbs_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle"); - if(strcmp(msg->topic, topic) == 0) { + if(strcmp(msg->topic, mqtt_topic(&bbs_startup.mqtt, TOPIC_HOST, topic, sizeof(topic), "recycle")) == 0) { + recycle_all(); + return; + } + if(strcmp(msg->topic, mqtt_topic(&bbs_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle")) == 0) { bbs_startup.recycle_now = true; return; } - mqtt_topic(&ftp_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle"); - if(strcmp(msg->topic, topic) == 0) { + if(strcmp(msg->topic, mqtt_topic(&ftp_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle")) == 0) { ftp_startup.recycle_now = true; return; } - mqtt_topic(&web_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle"); - if(strcmp(msg->topic, topic) == 0) { + if(strcmp(msg->topic, mqtt_topic(&web_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle")) == 0) { web_startup.recycle_now = true; return; } - mqtt_topic(&mail_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle"); - if(strcmp(msg->topic, topic) == 0) { + if(strcmp(msg->topic, mqtt_topic(&mail_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle")) == 0) { mail_startup.recycle_now = true; return; } - mqtt_topic(&services_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle"); - if(strcmp(msg->topic, topic) == 0) { + if(strcmp(msg->topic, mqtt_topic(&services_startup.mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle")) == 0) { services_startup.recycle_now = true; return; } @@ -765,7 +779,7 @@ static int bbs_lputs(void* p, int level, const char *str) sprintf(logline,"%sterm %.*s",tstr,(int)sizeof(logline)-70,str); truncsp(logline); - lputs(level,logline); + log_puts(level,logline); return(strlen(logline)+1); } @@ -811,7 +825,7 @@ static int ftp_lputs(void* p, int level, const char *str) sprintf(logline,"%sftp %.*s",tstr,(int)sizeof(logline)-70,str); truncsp(logline); - lputs(level,logline); + log_puts(level,logline); return(strlen(logline)+1); } @@ -852,7 +866,7 @@ static int mail_lputs(void* p, int level, const char *str) sprintf(logline,"%smail %.*s",tstr,(int)sizeof(logline)-70,str); truncsp(logline); - lputs(level,logline); + log_puts(level,logline); return(strlen(logline)+1); } @@ -893,7 +907,7 @@ static int services_lputs(void* p, int level, const char *str) sprintf(logline,"%ssrvc %.*s",tstr,(int)sizeof(logline)-70,str); truncsp(logline); - lputs(level,logline); + log_puts(level,logline); return(strlen(logline)+1); } @@ -934,7 +948,7 @@ static int event_lputs(void* p, int level, const char *str) sprintf(logline,"%sevnt %.*s",tstr,(int)sizeof(logline)-70,str); truncsp(logline); - lputs(level,logline); + log_puts(level,logline); return(strlen(logline)+1); } @@ -975,7 +989,7 @@ static int web_lputs(void* p, int level, const char *str) sprintf(logline,"%sweb %.*s",tstr,(int)sizeof(logline)-70,str); truncsp(logline); - lputs(level,logline); + log_puts(level,logline); return(strlen(logline)+1); } @@ -1143,11 +1157,7 @@ void _sighandler_rerun(int sig) lputs(LOG_NOTICE," Got HUP (rerun) signal"); - bbs_startup.recycle_now=TRUE; - ftp_startup.recycle_now=TRUE; - web_startup.recycle_now=TRUE; - mail_startup.recycle_now=TRUE; - services_startup.recycle_now=TRUE; + recycle_all(); } static void handle_sigs(void) @@ -1779,7 +1789,9 @@ int main(int argc, char** argv) } else { lprintf(LOG_INFO, "MQTT connecting to broker %s:%u", scfg.mqtt.broker_addr, scfg.mqtt.broker_port); result = mqtt_connect(&bbs_startup.mqtt, /* bind_address: */NULL); - if(result != MQTT_SUCCESS) { + if(result == MQTT_SUCCESS) { + lprintf(LOG_INFO, "MQTT broker-connect (%s:d) successful", scfg.mqtt.broker_addr, scfg.mqtt.broker_port); + } else { lprintf(LOG_ERR, "MQTT broker-connect (%s:%d) failure: %d", scfg.mqtt.broker_addr, scfg.mqtt.broker_port, result); mqtt_close(&bbs_startup.mqtt); } @@ -1812,6 +1824,7 @@ int main(int argc, char** argv) for(int i = bbs_startup.first_node; i <= bbs_startup.last_node; i++) { mqtt_subscribe(&bbs_startup.mqtt, TOPIC_BBS, str, sizeof(str), "node%d/input", i); } + mqtt_subscribe(&bbs_startup.mqtt, TOPIC_HOST, str, sizeof(str), "recycle"); mqtt_subscribe(&bbs_startup.mqtt, TOPIC_SERVER, str, sizeof(str), "recycle"); mqtt_subscribe(&ftp_startup.mqtt, TOPIC_SERVER, str, sizeof(str), "recycle"); mqtt_subscribe(&web_startup.mqtt, TOPIC_SERVER, str, sizeof(str), "recycle"); @@ -2162,11 +2175,7 @@ int main(int argc, char** argv) services_startup.shutdown_now=TRUE; } else { - bbs_startup.recycle_now=TRUE; - ftp_startup.recycle_now=TRUE; - web_startup.recycle_now=TRUE; - mail_startup.recycle_now=TRUE; - services_startup.recycle_now=TRUE; + recycle_all(); } break; case 'C':