[8] | 1 | #include "globals.h"
|
---|
| 2 | #include <syslog.h>
|
---|
| 3 |
|
---|
| 4 | char logfile[256]=CS_LOGFILE;
|
---|
| 5 |
|
---|
| 6 | static FILE *fp=(FILE *)0;
|
---|
| 7 | static FILE *fps=(FILE *)0;
|
---|
| 8 | static int use_syslog=0;
|
---|
| 9 | static int use_stdout=0;
|
---|
| 10 |
|
---|
| 11 | #ifdef CS_ANTICASC
|
---|
| 12 | FILE *fpa=(FILE *)0;
|
---|
| 13 | int use_ac_log=0;
|
---|
| 14 | #endif
|
---|
| 15 |
|
---|
| 16 | static void switch_log(char* file, FILE **f, int (*pfinit)(char*))
|
---|
| 17 | {
|
---|
| 18 | if( cfg->max_log_size && mcl)
|
---|
| 19 | {
|
---|
| 20 | struct stat stlog;
|
---|
| 21 | if( stat(file, &stlog)!=0 )
|
---|
| 22 | {
|
---|
| 23 | fprintf(stderr, "stat('%s',..) failed (errno=%d)\n", file, errno);
|
---|
| 24 | return;
|
---|
| 25 | }
|
---|
| 26 |
|
---|
| 27 | if( stlog.st_size >= cfg->max_log_size*1024 )
|
---|
| 28 | {
|
---|
| 29 | int rc;
|
---|
| 30 | char prev_log[128];
|
---|
| 31 | sprintf(prev_log, "%s-prev", file);
|
---|
| 32 | fprintf(*f, "switch log file\n");
|
---|
| 33 | fflush(*f);
|
---|
| 34 | fclose(*f);
|
---|
| 35 | *f=(FILE *)0;
|
---|
| 36 | rc=rename(file, prev_log);
|
---|
| 37 | if( rc!=0 ) {
|
---|
| 38 | fprintf(stderr, "rename(%s, %s) failed (errno=%d)\n",
|
---|
| 39 | file, prev_log, errno);
|
---|
| 40 | }
|
---|
| 41 | else if( pfinit(file))
|
---|
| 42 | cs_exit(0);
|
---|
[96] | 43 |
|
---|
| 44 |
|
---|
[8] | 45 | }
|
---|
| 46 | }
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | void cs_write_log(char *txt)
|
---|
| 50 | {
|
---|
| 51 | #ifdef CS_ANTICASC
|
---|
| 52 | if( use_ac_log && fpa )
|
---|
| 53 | {
|
---|
| 54 | switch_log(cfg->ac_logfile, &fpa, ac_init_log);
|
---|
| 55 | fprintf(fpa, "%s", txt);
|
---|
| 56 | fflush(fpa);
|
---|
| 57 | }
|
---|
| 58 | else
|
---|
| 59 | #endif
|
---|
| 60 | if (fp || use_stdout)
|
---|
| 61 | {
|
---|
| 62 | if( !use_stdout && !use_syslog) switch_log(logfile, &fp, cs_init_log);
|
---|
| 63 | fprintf(fp, "%s", txt);
|
---|
| 64 | fflush(fp);
|
---|
| 65 | }
|
---|
| 66 | }
|
---|
| 67 |
|
---|
| 68 | int cs_init_log(char *file)
|
---|
| 69 | {
|
---|
[25] | 70 | static char *head = ">> OSCam << cardserver started";
|
---|
[8] | 71 |
|
---|
| 72 | if (!strcmp(file, "stdout"))
|
---|
| 73 | {
|
---|
| 74 | use_stdout=1;
|
---|
| 75 | fp=stdout;
|
---|
| 76 | cs_log(head);
|
---|
| 77 | return(0);
|
---|
| 78 | }
|
---|
| 79 | if (strcmp(file, "syslog"))
|
---|
| 80 | {
|
---|
| 81 | if (!fp)
|
---|
| 82 | {
|
---|
| 83 | if ((fp=fopen(file, "a+"))<=(FILE *)0)
|
---|
| 84 | {
|
---|
| 85 | fp=(FILE *)0;
|
---|
| 86 | fprintf(stderr, "couldn't open logfile: %s (errno %d)\n", file, errno);
|
---|
| 87 | }
|
---|
| 88 | else
|
---|
| 89 | {
|
---|
| 90 | time_t t;
|
---|
| 91 | char line[80];
|
---|
| 92 | memset(line, '-', sizeof(line));
|
---|
| 93 | line[(sizeof(line)/sizeof(char))-1]='\0';
|
---|
| 94 | time(&t);
|
---|
[25] | 95 | fprintf(fp, "\n%s\n>> OSCam << cardserver started at %s%s\n", line, ctime(&t), line);
|
---|
[8] | 96 | cs_log_config();
|
---|
| 97 | }
|
---|
| 98 | }
|
---|
| 99 | return(fp<=(FILE *)0);
|
---|
| 100 | }
|
---|
| 101 | else
|
---|
| 102 | {
|
---|
[21] | 103 | openlog("oscam", LOG_NDELAY, LOG_DAEMON);
|
---|
[8] | 104 | use_syslog=1;
|
---|
| 105 | cs_log(head);
|
---|
| 106 | return(0);
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | static char *get_log_header(int m, char *txt)
|
---|
| 111 | {
|
---|
| 112 | if (m)
|
---|
| 113 | {
|
---|
[56] | 114 | sprintf(txt, "%6d ", getpid());
|
---|
[8] | 115 | if (cs_idx)
|
---|
| 116 | switch (client[cs_idx].typ)
|
---|
| 117 | {
|
---|
| 118 | case 'r':
|
---|
| 119 | case 'p': sprintf(txt+7, "%c%02d ", client[cs_idx].typ, cs_idx-1);
|
---|
| 120 | break;
|
---|
| 121 | case 'm':
|
---|
| 122 | case 'c': sprintf(txt+7, "%c%02d ", client[cs_idx].typ, cs_idx-cdiff);
|
---|
| 123 | break;
|
---|
| 124 | #ifdef CS_ANTICASC
|
---|
| 125 | case 'a':
|
---|
| 126 | #endif
|
---|
| 127 | case 'l':
|
---|
| 128 | case 'n': sprintf(txt+7, "%c " , client[cs_idx].typ);
|
---|
| 129 | break;
|
---|
| 130 | }
|
---|
| 131 | else
|
---|
| 132 | strcpy(txt+7, "s ");
|
---|
| 133 | }
|
---|
| 134 | else
|
---|
| 135 | {
|
---|
| 136 | sprintf(txt, "%-11.11s", "");
|
---|
| 137 | }
|
---|
| 138 | return(txt);
|
---|
| 139 | }
|
---|
| 140 |
|
---|
| 141 | static void write_to_log(int flag, char *txt)
|
---|
| 142 | {
|
---|
| 143 | //static int logcounter=0;
|
---|
| 144 | int i;
|
---|
| 145 | time_t t;
|
---|
| 146 | struct tm *lt;
|
---|
| 147 | char buf[512], sbuf[16];
|
---|
| 148 |
|
---|
| 149 | get_log_header(flag, sbuf);
|
---|
| 150 | memcpy(txt, sbuf, 11);
|
---|
| 151 |
|
---|
| 152 | if (use_syslog && !use_ac_log) // system-logfile
|
---|
| 153 | syslog(LOG_INFO, "%s", txt);
|
---|
| 154 | else {
|
---|
| 155 | time(&t);
|
---|
| 156 | lt=localtime(&t);
|
---|
| 157 | sprintf(buf, "[LOG000]%4d/%02d/%02d %2d:%02d:%02d %s\n",
|
---|
| 158 | lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday,
|
---|
| 159 | lt->tm_hour, lt->tm_min, lt->tm_sec, txt);
|
---|
| 160 |
|
---|
| 161 | /*
|
---|
| 162 | #ifdef CS_ANTICASC
|
---|
| 163 | if (fp || fpa || use_stdout) // logfile
|
---|
| 164 | #else
|
---|
| 165 | if (fp || use_stdout) // logfile
|
---|
| 166 | #endif
|
---|
| 167 | {
|
---|
| 168 | */
|
---|
| 169 | if ((*log_fd) && (client[cs_idx].typ!='l') && (client[cs_idx].typ!='a'))
|
---|
[70] | 170 | write_to_pipe(*log_fd, PIP_ID_LOG, (uchar *) buf+8, strlen(buf+8));
|
---|
[8] | 171 | else
|
---|
| 172 | cs_write_log(buf+8);
|
---|
| 173 | // }
|
---|
| 174 | }
|
---|
| 175 | store_logentry(buf);
|
---|
| 176 |
|
---|
| 177 | for (i=0; i<CS_MAXPID; i++) // monitor-clients
|
---|
| 178 | {
|
---|
| 179 | if ((client[i].pid) && (client[i].log))
|
---|
| 180 | {
|
---|
| 181 | if (client[i].monlvl<2)
|
---|
| 182 | {
|
---|
| 183 | if ((client[cs_idx].typ!='c') && (client[cs_idx].typ!='m'))
|
---|
| 184 | continue;
|
---|
| 185 | if (strcmp(client[cs_idx].usr, client[i].usr))
|
---|
| 186 | continue;
|
---|
| 187 | }
|
---|
[56] | 188 | sprintf(sbuf, "%03d", client[i].logcounter);
|
---|
[8] | 189 | client[i].logcounter=(client[i].logcounter+1) % 1000;
|
---|
| 190 | memcpy(buf+4, sbuf, 3);
|
---|
| 191 | monitor_send_idx(i, buf);
|
---|
| 192 | }
|
---|
| 193 | }
|
---|
| 194 | }
|
---|
| 195 |
|
---|
| 196 | void cs_log(char *fmt,...)
|
---|
| 197 | {
|
---|
| 198 | char txt[256+11];
|
---|
| 199 |
|
---|
| 200 | va_list params;
|
---|
| 201 | va_start(params, fmt);
|
---|
| 202 | vsprintf(txt+11, fmt, params);
|
---|
| 203 | va_end(params);
|
---|
| 204 | write_to_log(1, txt);
|
---|
| 205 | }
|
---|
| 206 |
|
---|
| 207 | void cs_close_log(void)
|
---|
| 208 | {
|
---|
| 209 | if (use_stdout || use_syslog || !fp) return;
|
---|
| 210 | fclose(fp);
|
---|
| 211 | fp=(FILE *)0;
|
---|
| 212 | }
|
---|
| 213 |
|
---|
| 214 | void cs_debug(char *fmt,...)
|
---|
| 215 | {
|
---|
| 216 | char txt[256];
|
---|
| 217 |
|
---|
[66] | 218 | // cs_log("cs_debug called, cs_ptyp=%d, cs_dblevel=%d, %d", cs_ptyp, client[cs_idx].dbglvl ,cs_ptyp & client[cs_idx].dbglvl);
|
---|
| 219 |
|
---|
[8] | 220 | // if ((cs_ptyp & cs_dblevel)==cs_ptyp)
|
---|
| 221 | if ((cs_ptyp & client[cs_idx].dbglvl)==cs_ptyp)
|
---|
| 222 | {
|
---|
| 223 | va_list params;
|
---|
| 224 | va_start(params, fmt);
|
---|
| 225 | vsprintf(txt+11, fmt, params);
|
---|
| 226 | va_end(params);
|
---|
| 227 | write_to_log(1, txt);
|
---|
| 228 | }
|
---|
| 229 | }
|
---|
| 230 |
|
---|
| 231 | void cs_dump(uchar *buf, int n, char *fmt, ...)
|
---|
| 232 | {
|
---|
| 233 | int i;
|
---|
| 234 | char txt[512];
|
---|
| 235 |
|
---|
| 236 | if( fmt )
|
---|
| 237 | cs_log(fmt);
|
---|
| 238 |
|
---|
| 239 | for( i=0; i<n; i+=16 )
|
---|
| 240 | {
|
---|
| 241 | sprintf(txt+11, "%s", cs_hexdump(1, buf+i, (n-i>16) ? 16 : n-i));
|
---|
| 242 | write_to_log(i==0, txt);
|
---|
| 243 | }
|
---|
| 244 | }
|
---|
| 245 |
|
---|
| 246 | void cs_ddump(uchar *buf, int n, char *fmt, ...)
|
---|
| 247 | {
|
---|
| 248 | int i;
|
---|
| 249 | char txt[512];
|
---|
| 250 |
|
---|
| 251 | // if (((cs_ptyp & cs_dblevel)==cs_ptyp) && (fmt))
|
---|
| 252 | if (((cs_ptyp & client[cs_idx].dbglvl)==cs_ptyp) && (fmt))
|
---|
| 253 | {
|
---|
| 254 | va_list params;
|
---|
| 255 | va_start(params, fmt);
|
---|
| 256 | vsprintf(txt+11, fmt, params);
|
---|
| 257 | va_end(params);
|
---|
| 258 | write_to_log(1, txt);
|
---|
| 259 | //printf("LOG: %s\n", txt); fflush(stdout);
|
---|
| 260 | }
|
---|
| 261 | // if (((cs_ptyp | D_DUMP) & cs_dblevel)==(cs_ptyp | D_DUMP))
|
---|
| 262 | if (((cs_ptyp | D_DUMP) & client[cs_idx].dbglvl)==(cs_ptyp | D_DUMP))
|
---|
| 263 | {
|
---|
| 264 | for (i=0; i<n; i+=16)
|
---|
| 265 | {
|
---|
| 266 | sprintf(txt+11, "%s", cs_hexdump(1, buf+i, (n-i>16) ? 16 : n-i));
|
---|
| 267 | write_to_log(i==0, txt);
|
---|
| 268 | }
|
---|
| 269 | }
|
---|
| 270 | }
|
---|
| 271 |
|
---|
| 272 | int cs_init_statistics(char *file)
|
---|
| 273 | {
|
---|
| 274 | if ((!fps) && (file[0]))
|
---|
| 275 | {
|
---|
| 276 | if ((fps=fopen(file, "a"))<=(FILE *)0)
|
---|
| 277 | {
|
---|
| 278 | fps=(FILE *)0;
|
---|
| 279 | cs_log("couldn't open statistics file: %s", file);
|
---|
| 280 | }
|
---|
| 281 | }
|
---|
| 282 | return(fps<=(FILE *)0);
|
---|
| 283 | }
|
---|
| 284 |
|
---|
| 285 | void cs_statistics(int idx)
|
---|
| 286 | {
|
---|
| 287 | time_t t;
|
---|
| 288 | struct tm *lt;
|
---|
| 289 |
|
---|
| 290 | if (fps)
|
---|
| 291 | {
|
---|
| 292 | float cwps;
|
---|
| 293 |
|
---|
| 294 | switch_log(cfg->usrfile, &fps, cs_init_statistics);
|
---|
| 295 | time(&t);
|
---|
| 296 | lt=localtime(&t);
|
---|
| 297 | if (client[idx].cwfound+client[idx].cwnot>0)
|
---|
| 298 | {
|
---|
| 299 | cwps=client[idx].last-client[idx].login;
|
---|
| 300 | cwps/=client[idx].cwfound+client[idx].cwnot;
|
---|
| 301 | }
|
---|
| 302 | else
|
---|
| 303 | cwps=0;
|
---|
| 304 |
|
---|
[56] | 305 | fprintf(fps, "%02d.%02d.%02d %02d:%02d:%02d %3.1f %s %s %d %d %d %d %ld %ld %s\n",
|
---|
[8] | 306 | lt->tm_mday, lt->tm_mon+1, lt->tm_year%100,
|
---|
| 307 | lt->tm_hour, lt->tm_min, lt->tm_sec, cwps,
|
---|
| 308 | client[idx].usr[0] ? client[idx].usr : "-",
|
---|
| 309 | cs_inet_ntoa(client[idx].ip), client[idx].port,
|
---|
| 310 | client[idx].cwfound, client[idx].cwcache, client[idx].cwnot,
|
---|
| 311 | client[idx].login, client[idx].last,
|
---|
| 312 | ph[client[idx].ctyp].desc);
|
---|
| 313 | fflush(fps);
|
---|
| 314 | }
|
---|
| 315 | }
|
---|