00001
00002
00003
00004
00005 #include "minosDaq.h"
00006 #include "msgLog.h"
00007 #include <unistd.h>
00008 #include <stdlib.h>
00009 #include <string.h>
00010 #include <stdio.h>
00011 #include <argp.h>
00012 #include <time.h>
00013 const char* argp_program_bug_address = "Caius Howcroft<howcroft@hep.phy.cam.ac.uk>";
00014 const char* argp_program_version = "msgLogger 0.1";
00015 static char args_doc[] = "USER MESSAGE";
00016
00017 typedef struct arguments_t
00018 {
00019 char prio[5];
00020 char message[100];
00021 int nodeId;
00022 long pid;
00023 char procname[126];
00024 long count;
00025 long stime;
00026 int echo;
00027
00028 }arguments;
00029
00030
00031 static const struct argp_option options[] =
00032 {
00033 {"priority", 'l', "D1/D2/D3/I/N/W/E/C", 0, "Message Priority", 0},
00034 {"node", 'n', "INT", 0, "Minos Node ID", 0},
00035 {"name", 's', "PROCNAME", 0, "Process Name", 0},
00036 {0, 0, 0, 0,"Expert Actions:",0},
00037 {"count", 'c', "INT", 0, "Set message count number", 1},
00038 {"time", 't', "INT", 0, "Set message time (UNIX time)", 1},
00039 {"echo", 'e', 0, 0, "Echo message to stdout", 1},
00040 {"pid", 'p', "INT", 0, "Process PID", 0},
00041 {0}
00042 };
00043
00044 static error_t parse_opt (int key, char *arg, struct argp_state *state)
00045 {
00046 arguments* args = (arguments*)state->input;
00047 switch (key)
00048 {
00049 case 'l':
00050 strncpy(args->prio, arg, 5);
00051 break;
00052 case 'e':
00053 args->echo = 1;
00054 break;
00055 case 'c':
00056 args->count = strtol(arg, (char**)NULL, 0);
00057 break;
00058 case 't':
00059 args->stime = strtol(arg, (char**)NULL, 0);
00060 break;
00061 case 's':
00062 strncpy(args->procname,arg , 126);
00063 break;
00064 case 'n':
00065 args->nodeId = strtol(arg, (char**)NULL, 0);
00066 break;
00067 case 'p':
00068 args->pid = strtol(arg, (char**)NULL, 0);
00069 break;
00070 case ARGP_KEY_ARG:
00071 return ARGP_ERR_UNKNOWN;
00072 break;
00073 case ARGP_KEY_ARGS:
00074 {
00075 int i=0;
00076 for(i=state->next ; i<state->argc;++i)
00077 {
00078 strncat(args->message, " ", 100);
00079 strncat(args->message, state->argv[i], 100);
00080 }
00081 break;
00082 }
00083 case ARGP_KEY_END:
00084 break;
00085 default:
00086 return ARGP_ERR_UNKNOWN;
00087 }
00088 return 0;
00089 }
00090
00091 static const char doc[] =
00092 "msgLogger - MINOS Logger script\v Forwards messages to Run Control over UDP.";
00093
00094 static struct argp argparms = {options,
00095 parse_opt,
00096 args_doc,
00097 doc};
00098
00099
00100 int main(int argc, char** argv)
00101 {
00102 long defaultId = MINOS_QUASI_ONLINE;
00103
00104 arguments dargs;
00105 strcpy(dargs.prio, "I");
00106 dargs.pid=getppid();
00107 strcpy(dargs.procname, "?");
00108 dargs.count=-1;
00109 dargs.stime = time(NULL);
00110 dargs.echo=0;
00111 dargs.nodeId = defaultId;
00112 strcpy(dargs.message, "");
00113
00114 argp_parse (&argparms, argc, argv, 0, 0, &dargs);
00115
00116 msgLogInit(dargs.procname);
00117 msgLogNodeIdSet(dargs.nodeId);
00118 logDebugLevelSet(10);
00119 if(dargs.count!=-1) msgLogResetMsgCount(dargs.count);
00120 msgLogPidSet(dargs.pid);
00121 if(dargs.echo)msgLogLocalEchoSet(1);
00122 else msgLogLocalEchoSet(0);
00123 switch(dargs.prio[0])
00124 {
00125 case 'I':
00126 case 'i':
00127 logInfo("%s", dargs.message);
00128 break;
00129 case 'N':
00130 case 'n':
00131 logNotice("%s", dargs.message);
00132 break;
00133 case 'W':
00134 case 'w':
00135 logWarn("%s", dargs.message);
00136 break;
00137 case 'E':
00138 case 'e':
00139 logError("%s", dargs.message);
00140 break;
00141 case 'C':
00142 case 'c':
00143 logCritical("%s", dargs.message);
00144 break;
00145 case 'D':
00146 case 'd':
00147 {
00148 int dbl=0;
00149 switch(dargs.prio[1]){
00150 case '3':dbl=3; break;
00151 case '2':dbl=2; break;
00152 case '1':dbl=3; break;
00153 default: break;
00154 };
00155 logDebug(dbl, "%s", dargs.message);
00156 break;
00157 }
00158 };
00159 msgLogCleanup();
00160 return msgLogGetMsgCount();
00161 }