mirror of
https://gitlab.com/manzerbredes/ina260-zmq-publisher.git
synced 2025-04-07 04:16:26 +02:00
103 lines
No EOL
2.9 KiB
C
103 lines
No EOL
2.9 KiB
C
#include <zmq.h>
|
|
#include <assert.h>
|
|
#include <time.h>
|
|
#include <dirent.h>
|
|
|
|
#include "utils.h"
|
|
|
|
// Global:
|
|
char *__logdir;
|
|
char *__key;
|
|
char *__interface;
|
|
char *__ip;
|
|
int __loginterval;
|
|
int __port;
|
|
|
|
void publish(void *publisher, char *filepath, char* client, long int interval);
|
|
|
|
int main (int argc, char *argv [])
|
|
{
|
|
printf("%d\n",ZMQ_MSG_SIZE);
|
|
if(argc != 6){
|
|
printf("Usage: %s <abslogdir> <loginterval> <ip> <port> <key>",argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
//----- Init global variables
|
|
__logdir=argv[1];
|
|
__loginterval=atoi(argv[2]);
|
|
__ip=argv[3];
|
|
__port=atoi(argv[4]);
|
|
__key=argv[5];
|
|
|
|
//----- Prepare our context and publisher
|
|
void *context = zmq_ctx_new ();
|
|
void *publisher = zmq_socket (context, ZMQ_PUB);
|
|
char bindto[30];
|
|
sprintf(bindto,"tcp://%s:%d",__ip,__port);
|
|
int rc = zmq_connect (publisher, bindto);
|
|
if(rc!=0){
|
|
printf("Failed to bind zmq on %s\n",bindto);
|
|
exit(1);
|
|
}
|
|
|
|
//----- Start publisher
|
|
struct dirent *de; // Pointer for directory entry
|
|
while(1){
|
|
int interval=INTERVAL(__loginterval);
|
|
int interval_next=INTERVAL_NEXT(__loginterval);
|
|
DIR *dr = opendir(__logdir);
|
|
while ((de = readdir(dr)) != NULL){
|
|
if(strcmp(de->d_name,".") && strcmp(de->d_name,"..")){
|
|
char *client=de->d_name;
|
|
char logfile[255];
|
|
char logfile_next[255];
|
|
sprintf(logfile,"%s/%s/%ld",__logdir,client,interval);
|
|
sprintf(logfile_next,"%s/%s/%ld",__logdir,client,interval_next);
|
|
// As long as next logfile is not available, we should wait
|
|
// for sending the current one
|
|
printf("Waiting for %s...%s\n",client,logfile_next);
|
|
while(!FILE_EXISTS(logfile_next)){
|
|
sleep(1);
|
|
}
|
|
// Send current one
|
|
if(FILE_EXISTS(logfile)){
|
|
publish(publisher,logfile,client,interval);
|
|
remove(logfile);
|
|
}
|
|
}
|
|
}
|
|
closedir(dr);
|
|
}
|
|
|
|
zmq_close (publisher);
|
|
zmq_ctx_destroy (context);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void publish(void *publisher, char *filepath, char* client, long int interval){
|
|
printf("Publish!\n");
|
|
char buffer[ZMQ_MSG_SIZE];
|
|
sprintf(buffer,"%s\n%s\n%s\n%ld\n",ZMQ_TOKEN,__key,client,interval);
|
|
int msglen=strlen(buffer);
|
|
|
|
FILE *fptr;
|
|
char * line = NULL;
|
|
size_t len = 0;
|
|
ssize_t read;
|
|
fptr=fopen(filepath,"r");
|
|
while ((read = getline(&line, &len, fptr)) != -1) {
|
|
if((read+msglen) <ZMQ_MSG_SIZE){
|
|
strcat(buffer,line);
|
|
msglen+=read;
|
|
} else {
|
|
zmq_send (publisher, buffer, ZMQ_MSG_SIZE, 0);
|
|
sprintf(buffer,"%s\n%s\n%s\n%ld\n",ZMQ_TOKEN,__key,client,interval);
|
|
strcat(buffer,line);
|
|
msglen=strlen(buffer);
|
|
}
|
|
}
|
|
fclose(fptr);
|
|
zmq_send (publisher, buffer, ZMQ_MSG_SIZE, 0);
|
|
} |