Initial repo population
[ric-app/mc.git] / src / sidecars / listener / mc_listener.c
1 // vim: ts=4 sw=4 noet:
2 /*
3 --------------------------------------------------------------------------------
4         Copyright (c) 2018-2019 AT&T Intellectual Property.
5
6    Licensed under the Apache License, Version 2.0 (the "License");
7    you may not use this file except in compliance with the License.
8    You may obtain a copy of the License at
9
10            http://www.apache.org/licenses/LICENSE-2.0
11
12    Unless required by applicable law or agreed to in writing, software
13    distributed under the License is distributed on an "AS IS" BASIS,
14    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15    See the License for the specific language governing permissions and
16    limitations under the License.
17 --------------------------------------------------------------------------------
18 */
19
20 /*
21         Mnemonic:       mc_listener.c
22         Abstract:       This application (management campaign listener) will listen for
23                                 RMR based messages and write the payloads into FIFOs which
24                                 correspond to the message type.
25                 
26                                 Defaults:
27                                         /var/lib/mc/listener  -- directory for FIFOs
28
29                                 Command line options:
30                                         -d <path>   FIFO directory (default is /tmp/mcl/fifos)
31                                         -p <port>       The port to set RMR listener on (default is 4560)
32                                         -r <seconds>  The frequency that count reports are written to
33                                                                         stderr. 0 == 0ff; default is 60.
34
35
36                                 RMR based environment variables which might be needed:
37                                         RMR_SEED_RT -- path to the static routing table
38                                         RMR_RTG_SVC -- port to listen for RTG connections
39
40         Date:           22 August 2019
41         Author:         E. Scott Daniels
42 */
43
44 #include <unistd.h>
45 #include <errno.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <time.h>
49 #include <string.h>
50
51
52 #include "mcl.h"
53
54 //---- support -----------------------------------------------------------------------------
55
56 static void bad_arg( char* what ) {
57         fprintf( stderr, "[ERR] option is unrecognised or isn't followed by meaningful data: %s\n", what );
58 }
59
60 static void usage( char* argv0 ) {
61         fprintf( stderr, "usage: %s [-d fifo-dir] [-e] [-p listen-port] [-q | -r report-freq]\n", argv0 );
62         fprintf( stderr, "  -e  enable extended header in buffers written to FIFOs\n" );
63 }
64
65 //------------------------------------------------------------------------------------------
66 int main( int argc,  char** argv ) {
67         void*   ctx;                                                    // the mc listener library context
68         char*   dname = "/tmp/mcl/fifos";               // default directory where we open fifos
69         char*   port = "4560";                                  // default rmr port
70         char*   siphon_dir = "/tmp/mci/siphon"; // where siphon files are placed
71         int             siphon = 0;                                             // percentage of messages to siphone off
72         int             report_freq = 60;                               // report stats every n seconds
73         int             pidx = 1;                                               // parameter index
74         int             error = 0;
75         int             long_hdrs = 0;                                  // -e sets and causes extended headers to be written
76
77         while( pidx < argc && argv[pidx][0] == '-' ) {                  // simple argument parsing (-x  or -x value)
78                 switch( argv[pidx][1] ) {
79                         case 'd':
80                                 if( pidx+1 < argc ) {
81                                         dname = strdup( argv[pidx+1] );
82                                         pidx++;
83                                 } else {
84                                         bad_arg( argv[pidx] );
85                                         error = 1;
86                                 }
87                                 break;
88
89                         case 'e':
90                                 long_hdrs = 1;
91                                 break;
92
93                         case 'p':
94                                 if( pidx+1 < argc ) {
95                                         port = strdup( argv[pidx+1] );
96                                         pidx++;
97                                 } else {
98                                         bad_arg( argv[pidx] );
99                                         error = 1;
100                                 }
101                                 break;
102
103                         case 'q':
104                                 report_freq = 0;
105                                 break;
106
107                         case 'r':
108                                 if( pidx+1 < argc ) {
109                                         report_freq = atoi( argv[pidx+1] );
110                                         pidx++;
111                                 } else {
112                                         bad_arg( argv[pidx] );
113                                         error = 1;
114                                 }
115                                 break;
116
117                         case 'h':
118                         case '?':
119                                 usage( argv[0] );
120                                 exit( 0 );
121                                 break;
122
123                         default:
124                                 bad_arg( argv[pidx] );
125                                 error = 1;
126                                 break;
127                 }
128
129                 pidx++;
130         }
131
132         if( error ) {
133                 usage( argv[0] );
134                 exit( 1 );
135         }
136
137         ctx = mcl_mk_context( dname );                  // initialise the library context
138         if( ctx == NULL ) {
139                 fprintf( stderr, "[FAIL] couldn't initialise the mc listener environment\n" );
140                 exit( 1 );
141         }
142         mcl_set_sigh();                                                                 // set signal handler(s)
143
144         mcl_start_listening( ctx,  port, MCL_NOWAIT );          // start the listener, no waiting for rt since we don't send
145         mcl_fifo_fanout( ctx, report_freq, long_hdrs );         // listen and fanout messages to fifo; report to stdout every ~2sec
146
147         fprintf( stderr, "[INFO] mc listener is finished.\n" );
148 }
149