/trunk/src/super_log_data.c

# · C · 330 lines · 275 code · 53 blank · 2 comment · 54 complexity · e8edc8b04e9a02193ed8295560463ffd MD5 · raw file

  1. #include <stdio.h>
  2. #include <sys/file.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include "global.h"
  6. #include "manhat-lib/shared_util.h"
  7. #include "manhat-lib/shared_super_util.h"
  8. #include "manhat-lib/shared_lock.h"
  9. #include "manhat-lib/shared_strtrm.h"
  10. #include "manhat-lib/shared_login_logs.h"
  11. #include "manhat-lib/shared_cs_util.h"
  12. typedef struct log_data
  13. {
  14. char *username;
  15. char *event;
  16. char * time;
  17. char *host;
  18. char *ip;
  19. char *browser;
  20. struct log_data *next;
  21. }LOG_DATA;
  22. #define SHOW_ADMIN_FLAG "__admin__"
  23. void
  24. free_log_data(LOG_DATA *head)
  25. {
  26. LOG_DATA *ptr, *start;
  27. if(head)
  28. {
  29. start = head->next;
  30. while(start)
  31. {
  32. ptr = start->next;
  33. if(start->username)
  34. free(start->username);
  35. if(start->event)
  36. free(start->event);
  37. if(start->time)
  38. free(start->time);
  39. if(start->host)
  40. free(start->host);
  41. if(start->ip)
  42. free(start->ip);
  43. if(start->browser)
  44. free(start->browser);
  45. free(start);
  46. start = ptr;
  47. }
  48. free(head);
  49. }
  50. }
  51. static
  52. int is_admin_record(const char *line)
  53. {
  54. char *ptr;
  55. char *str;
  56. str = hdf_get_value(global_cgi->hdf, "log_event.admin_prefix", "");
  57. ptr = strstr(line, str);
  58. return (ptr && (ptr == line))? 1 : 0;
  59. }
  60. LOG_DATA *
  61. build_data_list( const char *logfile, const char *username, int *count)
  62. {
  63. FILE *fp;
  64. char log_file[MAX_PATH +1];
  65. char line[MAX_PATH +1];
  66. int i =0;
  67. int show_admins;
  68. LOG_DATA *head = 0, *current =0, *ptr=0, *tail =0;
  69. *count = 0;
  70. cs_set_event_msg();
  71. /* if username is SHOW_ADMIN_FLAG, show all administrator activities */
  72. show_admins = !strcmp(username,SHOW_ADMIN_FLAG)? 1 : 0;
  73. snprintf(log_file, MAX_PATH +1, "%s/%s", LOG_PATH, logfile);
  74. fp = fopen(log_file, "r");
  75. if(fp)
  76. {
  77. head = (LOG_DATA *)malloc(sizeof(LOG_DATA)); /* dummy head */
  78. head->next =0;
  79. get_shared_lock(fileno(fp), 1);
  80. while(fgets(line, MAX_PATH +1, fp))
  81. {
  82. strtrm(line);
  83. if(strlen(username)>0)
  84. {
  85. if(i ==0 &&
  86. (!strcmp(line, username) || /* username matches exactly */
  87. (show_admins && is_admin_record(line)))) /* or we're looking for admins and this is an
  88. administrator's record */
  89. {
  90. (*count)++;
  91. ptr = (LOG_DATA *)malloc(sizeof(LOG_DATA));
  92. ptr->next =0;
  93. ptr->username = malloc_str(line);
  94. while(i<=4)
  95. {
  96. if(fgets(line, MAX_PATH +1,fp))
  97. {
  98. strtrm(line);
  99. if(i ==0)
  100. ptr->event = malloc_str(line);
  101. else if (i == 1)
  102. ptr->time = malloc_str(line);
  103. else if(i ==2)
  104. ptr->host = malloc_str(line);
  105. else if(i ==3)
  106. ptr->ip = malloc_str(line);
  107. else if (i ==4)
  108. ptr->browser = malloc_str(line);
  109. }
  110. i++;
  111. }
  112. i =0;
  113. if(!tail)
  114. {
  115. tail = ptr;
  116. current = ptr;
  117. head->next = ptr;
  118. }
  119. else
  120. {
  121. head->next = ptr;
  122. ptr->next = current;
  123. current = head->next;
  124. }
  125. }
  126. }
  127. else
  128. {
  129. if((*count) ==0 )
  130. (*count)++;
  131. if(i ==6)
  132. {
  133. (*count)++;
  134. i =0;
  135. }
  136. if(i ==0)
  137. {
  138. ptr = (LOG_DATA *)malloc(sizeof(LOG_DATA));
  139. ptr->next =0;
  140. }
  141. if(i ==0)
  142. ptr->username = malloc_str(line);
  143. else if( i ==1)
  144. ptr->event = malloc_str(line);
  145. else if( i ==2)
  146. ptr->time = malloc_str(line);
  147. else if(i ==3)
  148. ptr->host = malloc_str(line);
  149. else if(i ==4)
  150. ptr->ip = malloc_str(line);
  151. else if (i ==5)
  152. ptr->browser = malloc_str(line);
  153. i++;
  154. if(i ==6)
  155. {
  156. if(!tail)
  157. {
  158. tail = ptr;
  159. current = ptr;
  160. head->next = ptr;
  161. }
  162. else
  163. {
  164. head->next = ptr;
  165. ptr->next = current;
  166. current = ptr;
  167. }
  168. }
  169. }
  170. }
  171. release_lock(fileno(fp));
  172. fclose(fp);
  173. }
  174. return head;
  175. }
  176. void
  177. set_data_list(LOG_DATA *head, int *i)
  178. {
  179. #define MAX_TMP_NAME 50
  180. char name[MAX_TMP_NAME];
  181. LOG_DATA *ptr;
  182. if(head)
  183. {
  184. for(ptr = head->next; ptr; ptr = ptr->next)
  185. {
  186. snprintf(name, MAX_TMP_NAME, "record.%d.username", *i);
  187. cs_set_value(name, ptr->username);
  188. snprintf(name, MAX_TMP_NAME, "record.%d.event", *i);
  189. cs_set_value(name, ptr->event);
  190. snprintf(name, MAX_TMP_NAME, "record.%d.time", *i);
  191. cs_set_value(name, ptr->time);
  192. snprintf(name, MAX_TMP_NAME, "record.%d.host", *i);
  193. cs_set_value(name, ptr->host);
  194. snprintf(name, MAX_TMP_NAME, "record.%d.ip", *i);
  195. cs_set_value(name, ptr->ip);
  196. snprintf(name, MAX_TMP_NAME, "record.%d.browser", *i);
  197. cs_set_value(name, ptr->browser);
  198. (*i)++;
  199. }
  200. }
  201. #undef MAX_TMP_NAME
  202. }
  203. void
  204. print_one_log_data(const char *key, const char *logfile, const char *username)
  205. {
  206. int count =0;
  207. LOG_DATA *head;
  208. int i =0;
  209. head = build_data_list(logfile, username, &count);
  210. set_data_list(head, &i);
  211. cs_set_int_value("num_record", count);
  212. free_log_data(head);
  213. }
  214. void
  215. print_all_log_data(const char *key, const char *username)
  216. {
  217. LOGFILE_NODE *loglist_head, *ptr; /* shared_login_logs.h */
  218. int total_records =0;
  219. int log_count;
  220. int count;
  221. LOG_DATA *head;
  222. int i =0;
  223. loglist_head = build_logfile_list(&log_count, LOG_PATH, "log"); /* shared_login_logs.c */
  224. count = 0;
  225. for(ptr = loglist_head; ptr; ptr=ptr->next)
  226. {
  227. head = build_data_list( ptr->filename, username, &count);
  228. set_data_list(head, &i);
  229. free_log_data(head);
  230. total_records += count;
  231. count = 0;
  232. }
  233. free_logfile_list(loglist_head); /* shared_login_logs.c */
  234. cs_set_int_value("num_record", total_records);
  235. }
  236. void
  237. read_parameters( char *key, char *logfile, char *username, int *csv_file, int *possible_long_process)
  238. {
  239. char tmp[11];
  240. cs_get_required_parameter ("logfile", logfile, MAX_FILENAME);
  241. cs_get_required_parameter ("id", key, MAX_KEY);
  242. cs_get_optional_parameter ("username",username, MAX_USERNAME);
  243. cs_get_optional_parameter ("csv", tmp, 10);
  244. *csv_file = (*tmp == '1');
  245. cs_get_optional_parameter ("long_process", tmp, 10);
  246. *possible_long_process = (*tmp != '\0');
  247. }
  248. void set_continue_url(const char *key, const char *username)
  249. {
  250. char url[MAX_PATH +1];
  251. snprintf(url, MAX_PATH +1, "super_log_data?id=%s&amp;username=%s&amp;logfile=all", key, username);
  252. cs_set_value("log_url", url);
  253. }
  254. int main()
  255. {
  256. char key[MAX_KEY +1];
  257. char logfile[MAX_FILENAME +1];
  258. char username[MAX_USERNAME +1];
  259. int csv_file;
  260. int possible_long_process;
  261. SESSION user;
  262. cs_cgi_init();
  263. read_parameters( key, logfile, username, &csv_file, &possible_long_process);
  264. validate_super_key(key, &user);
  265. if(possible_long_process)
  266. {
  267. set_continue_url(key, username);
  268. }
  269. else if(strcmp(logfile, "all"))
  270. print_one_log_data(key, logfile, username);
  271. else
  272. print_all_log_data(key, username);
  273. cs_set_int_value("send_csv_file", csv_file? 1 : 0);
  274. cs_cgi_display("super_log_data", 1);
  275. cs_cgi_destroy();
  276. return 0;
  277. }