/* checklog.p by Tomasz Judycki. Freeware, open source. */
&GLOBAL-DEFINE MAX_WARN 32
DEF VAR v_warning_words AS CHAR EXTENT {&MAX_WARN} NO-UNDO INITIAL [
"kill*",
"drastic",
"warn*",
"error",
"system",
"abnormal",
"exceed*",
"fail*",
"wrong",
"uexpected*",
"invalid",
"died",
"damage*",
"dead",
"overflow*",
"violation",
"fatal",
"insufficient",
"missing",
"disappear*",
"corrupt*",
"allow*",
"attempt*",
"cannot",
"enough",
"illegal",
"impossible",
"increase",
"unknown",
"unable",
"stop*",
"beyond"
].

&GLOBAL-DEFINE MAX_SKIP 32
DEF VAR v_skipped_lines AS CHAR EXTENT {&MAX_SKIP} NO-UNDO INITIAL [
"*: Login usernum *",
"*: Logout usernum *",
"*: Login by *",
"*: Logout by *",
"*: Quiet point request *",
"*: Quiet point has been *",
"*: Received RECONNECT from *",
"*: Started on port *",
"*: Begin transaction backout*",
"*: Transaction backout completed*"
].

DEF VAR v_month_names AS CHAR NO-UNDO INITIAL
  "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".


DEF STREAM s_log.

DEF VAR v_msg AS CHAR NO-UNDO.
DEF VAR v_param AS CHAR NO-UNDO.
DEF VAR v_filename AS CHAR NO-UNDO.
DEF VAR v_num_days AS INT NO-UNDO.
DEF VAR v_nothing_displayed AS LOG NO-UNDO.

v_param = REPLACE( SESSION:PARAM, '"', '' ).

IF v_param = '' THEN
  v_msg = 'Usage: ' +
    (IF OPSYS MATCHES "*WIN*" THEN 'prowin32.exe' ELSE 'mpro') +
    ' -p ' + PROGRAM-NAME(1) + ' -param log_name[,num_days]'.
ELSE
DO:
  v_filename = ENTRY( 1, v_param ).
  IF NUM-ENTRIES( v_param ) > 1 THEN
    v_num_days = INTEGER( ENTRY( 2, v_param ) ).
  ELSE
    v_num_days = 7.

  RUN AnalyzeLog( v_filename, v_num_days, OUTPUT v_msg, OUTPUT v_nothing_displayed ).

END.

IF v_msg = "" AND v_nothing_displayed THEN
  v_msg = 'Nothing interesting in log file.'.

IF v_msg <> "" THEN
  DISPLAY v_msg FORMAT "x(70)" WITH FRAME b.

PAUSE.
QUIT.

PROCEDURE AnalyzeLog:
DEF INPUT PARAM i_filename AS CHAR NO-UNDO.
DEF INPUT PARAM i_num_days AS CHAR NO-UNDO.
DEF OUTPUT PARAM o_msg AS CHAR NO-UNDO.
DEF OUTPUT PARAM o_nothing_displayed AS LOG NO-UNDO.

DEF VAR v_line AS CHAR NO-UNDO.
DEF VAR v_analyzing AS LOG NO-UNDO.
DEF VAR v_day AS INT NO-UNDO.
DEF VAR v_year AS INT NO-UNDO.
DEF VAR v_month_str AS CHAR NO-UNDO.
DEF VAR v_month AS INT NO-UNDO.
DEF VAR v_date AS DATE NO-UNDO.
DEF VAR v_skipped AS LOG NO-UNDO.
DEF VAR v_i AS INT NO-UNDO.
DEF VAR v_j AS INT NO-UNDO.
DEF VAR v_warn AS CHAR NO-UNDO.
DEF VAR v_word AS CHAR NO-UNDO.
DEF VAR v_display AS LOG NO-UNDO.


FORM
  v_warn FORMAT "x" COLUMN-LABEL "."
  v_date FORMAT "99-99-99" COLUMN-LABEL "Date"
  v_line FORMAT "x(60)"
WITH DOWN FRAME a.

  o_msg = ''.
  o_nothing_displayed = TRUE.

  v_analyzing = FALSE.
  INPUT STREAM s_log FROM VALUE( v_filename ).
  REPEAT:
    IMPORT STREAM s_log UNFORMATTED v_line.
    v_display = FALSE.
    IF v_line BEGINS "                " AND
      LENGTH( v_line ) >= 40 AND
      SUBSTRING( v_line, 21, 1 ) > " " THEN /* this should be date */
    DO:
      v_month_str = SUBSTRING( v_line, 21, 3 ).
      v_month = LOOKUP( v_month_str, v_month_names ).
      v_day = INTEGER( SUBSTRING( v_line, 25, 2 ) ) NO-ERROR.
      v_year = INTEGER( SUBSTRING( v_line, 37, 4 ) ) NO-ERROR.
      v_date = DATE( v_month, v_day, v_year ) NO-ERROR.
      IF ERROR-STATUS:ERROR THEN
      DO:
        v_warn = "!".
        v_date = ?.
        v_display = TRUE.
      END.
      ELSE
        IF v_date >= TODAY - v_num_days THEN
          v_analyzing = TRUE.
    END.
    ELSE IF v_analyzing AND v_line <> "" THEN
    DO:
      /* First ignore skipped lines */
      v_skipped = FALSE.
      DO v_i = 1 TO {&MAX_SKIP} WHILE NOT v_skipped:
        v_skipped = (v_line MATCHES v_skipped_lines[v_i]).
      END.
      IF NOT v_skipped THEN /* Then check special words */
      DO:
        v_warn = "".
        DO v_j = 1 TO NUM-ENTRIES( v_line, " " ) WHILE v_warn = "":
          v_word = ENTRY( v_j, v_line, " " ).
          DO v_i = 1 TO {&MAX_WARN} WHILE v_warn = "":
            IF v_word MATCHES v_warning_words[v_i] THEN
              v_warn = "!".
          END.
        END.
        v_display = TRUE.
      END. /* NOT v_skipped */
    END. /* v_analyzing */

    IF v_display THEN
    DO:
      DISPLAY
        v_warn
        v_date
        v_line
      WITH DOWN FRAME a.
      DOWN WITH FRAME a.
      o_nothing_displayed = FALSE.
    END.

  END. /* repeat */
  INPUT STREAM s_log CLOSE.

END PROCEDURE.

