1 Commits

Author SHA1 Message Date
86bccbc81d Update for Nim 1.x+. 2021-06-07 21:58:17 -05:00
5 changed files with 27 additions and 43 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
.*.sw?
log_happy log_happy
nimcache/ nimcache/

View File

@@ -2,30 +2,17 @@
## ========= ## =========
## ##
## Little tool to extract expected information from log streams. ## Little tool to extract expected information from log streams.
import std/[json, logging, os, osproc, sequtils, streams, strutils] import json, ncurses, os, osproc, sequtils, streams, strutils, threadpool
import std/nre except toSeq import nre except toSeq
import docopt, malebolgia, ncurses
import private/ncurses_ext import private/ncurses_ext
from posix import signal
type type
Expectation* = ref object Expectation* = ref object
label: string label: string
pattern: Regex pattern: Regex
expected, found: bool expected, found: bool
SourceKind = enum skStdIn, skFile, skCmd
InSource = object
case kind: SourceKind
of skStdIn:
discard
of skFile:
filename: string
of skCmd:
cmdInvocation: string
let expPattern = re"^-([eE])([^;]+);(.+)$" let expPattern = re"^-([eE])([^;]+);(.+)$"
var msgChannel: Channel[string] var msgChannel: Channel[string]
@@ -35,19 +22,18 @@ proc exitErr(msg: string): void =
quit(QuitFailure) quit(QuitFailure)
proc readStream(stream: Stream): void = proc readStream(stream: Stream): void =
var line: string var line = TaintedString""
try: try:
while stream.readLine(line): msgChannel.send(line) while stream.readLine(line): msgChannel.send(line)
except: discard "" except: discard ""
when isMainModule: when isMainModule:
var cmdProc: Process var cmdProc: Process
var source = InSource(kind: skStdIn) var inStream: Stream
var outFile: File var outFile: File
var threadMaster = createMaster()
try: try:
let VERSION = "0.2.0" let VERSION = "0.2.1"
let usage = """ let usage = """
Usage: Usage:
log_happy [options] log_happy [options]
@@ -128,7 +114,7 @@ Expectations JSON definitions follow this format:
if not fileExists(filename): if not fileExists(filename):
exitErr "no such file (" & filename & ")" exitErr "no such file (" & filename & ")"
source = InSource(kind: skFile, filename: filename) inStream = newFileStream(filename)
except: except:
exitErr "could not open file (" & filename & "):\t\n" & exitErr "could not open file (" & filename & "):\t\n" &
getCurrentExceptionMsg() getCurrentExceptionMsg()
@@ -169,7 +155,7 @@ Expectations JSON definitions follow this format:
inStream = cmdProc.outputStream inStream = cmdProc.outputStream
open(msgChannel) open(msgChannel)
threadMaster.spawn readStream(inStream) spawn readStream(inStream)
# Init ncurses # Init ncurses
let stdscr = initscr() let stdscr = initscr()
@@ -284,6 +270,5 @@ Expectations JSON definitions follow this format:
if not inStream.isNil: close(inStream) if not inStream.isNil: close(inStream)
if not outFile.isNil: close(outFile) if not outFile.isNil: close(outFile)
threadMaster.cancel()
close(msgChannel) close(msgChannel)
endwin() endwin()

View File

@@ -1,6 +1,6 @@
# Package # Package
version = "0.2.0" version = "0.2.1"
author = "Jonathan Bernard" author = "Jonathan Bernard"
description = "Scan logs for regex-defined events and report on what was found." description = "Scan logs for regex-defined events and report on what was found."
license = "MIT" license = "MIT"
@@ -8,4 +8,4 @@ bin = @["log_happy"]
# Dependencies # Dependencies
requires @["nim >= 0.16.1", "docopt >= 0.6.4", "ncurses", "malebolgia >= 1.3.2"] requires @["nim >= 0.16.1", "docopt >= 0.6.4", "ncurses"]

View File

@@ -1,2 +0,0 @@
[tools]
nim = "1"

View File

@@ -1,31 +1,31 @@
import ncurses import ncurses
export ncurses export ncurses
#proc keypad*(win: ptr window, enable: bool): int {.cdecl, discardable, importc: "keypad", dynlib: libncurses.} #proc keypad*(win: PWindow, enable: bool): int {.cdecl, discardable, importc: "keypad", dynlib: libncurses.}
#proc scrollok*(win: ptr window, enable: bool): int {.cdecl, discardable, importc: "scrollok", dynlib: libncurses.} #proc scrollok*(win: PWindow, enable: bool): int {.cdecl, discardable, importc: "scrollok", dynlib: libncurses.}
#proc nodelay*(win: ptr window, enable: bool): int {.cdecl, discardable, importc: "nodelay", dynlib: libncurses.} #proc nodelay*(win: PWindow, enable: bool): int {.cdecl, discardable, importc: "nodelay", dynlib: libncurses.}
#proc nonl*(): int {.cdecl, discardable, importc: "nonl", dynlib: libncurses.} #proc nonl*(): int {.cdecl, discardable, importc: "nonl", dynlib: libncurses.}
proc newwin*(num_rows, num_cols, begin_x, begin_y: int): ptr window {.cdecl, discardable, importc: "newwin", dynlib: libncurses.} proc newwin*(num_rows, num_cols, begin_x, begin_y: int): PWindow {.cdecl, discardable, importc: "newwin", dynlib: libncurses.}
proc delwin*(win: ptr window): int {.cdecl, discardable, importc: "delwin", dynlib: libncurses.} proc delwin*(win: PWindow): int {.cdecl, discardable, importc: "delwin", dynlib: libncurses.}
#proc newwin(num_rows, num_cols, begin_x, begin_y: int): ptr window {.cdecl, discardable, importc: "newwin", dynlib: libncurses.} #proc newwin(num_rows, num_cols, begin_x, begin_y: int): PWindow {.cdecl, discardable, importc: "newwin", dynlib: libncurses.}
#proc wgetch*(win: ptr window): int {.cdecl, discardable, importc: "wgetch", dynlib: libncurses.} #proc wgetch*(win: PWindow): int {.cdecl, discardable, importc: "wgetch", dynlib: libncurses.}
#proc wrefresh*(win: ptr window): int {.cdecl, discardable, importc: "wrefresh", dynlib: libncurses.} #proc wrefresh*(win: PWindow): int {.cdecl, discardable, importc: "wrefresh", dynlib: libncurses.}
proc wclear*(win: ptr window): int {.cdecl, discardable, importc: "wclear", dynlib: libncurses.} proc wclear*(win: PWindow): int {.cdecl, discardable, importc: "wclear", dynlib: libncurses.}
proc mvwhline*(win: ptr window, rol, col: int, chType: char, n: int): int {.cdecl, discardable, importc: "whline", dynlib: libncurses.} proc mvwhline*(win: PWindow, rol, col: int, chType: char, n: int): int {.cdecl, discardable, importc: "whline", dynlib: libncurses.}
proc wmove*(win: ptr window, rol, col: int): int {.cdecl, discardable, importc: "wmove", dynlib: libncurses.} proc wmove*(win: PWindow, rol, col: int): int {.cdecl, discardable, importc: "wmove", dynlib: libncurses.}
#proc wprintw*(win: ptr window, str: cstring): int {.cdecl, discardable, importc: "wprintw", dynlib: libncurses.} #proc wprintw*(win: PWindow, str: cstring): int {.cdecl, discardable, importc: "wprintw", dynlib: libncurses.}
#proc mvwprintw*(win: ptr window, row, col: int, str: cstring): int {.cdecl, discardable, importc: "mvwprintw", dynlib: libncurses.} #proc mvwprintw*(win: PWindow, row, col: int, str: cstring): int {.cdecl, discardable, importc: "mvwprintw", dynlib: libncurses.}
proc box*(win: ptr window, vert_border, horiz_border: char): int {.cdecl, discardable, importc: "box", dynlib: libncurses.} proc box*(win: PWindow, vert_border, horiz_border: char): int {.cdecl, discardable, importc: "box", dynlib: libncurses.}
proc wborder*(win: ptr window, ls,rs,ts,bs,tl,tr,bl,br: char): int {.cdecl, discardable, importc: "wborder", dynlib: libncurses.} proc wborder*(win: PWindow, ls,rs,ts,bs,tl,tr,bl,br: char): int {.cdecl, discardable, importc: "wborder", dynlib: libncurses.}
proc init_pair*(n, f, b: int): int {.cdecl, discardable, importc: "init_pair", dynlib: libncurses.} proc init_pair*(n, f, b: int): int {.cdecl, discardable, importc: "init_pair", dynlib: libncurses.}
proc COLOR_PAIR*(n: int): int {.cdecl, discardable, importc: "COLOR_PAIR", dynlib: libncurses.} proc COLOR_PAIR*(n: int): int {.cdecl, discardable, importc: "COLOR_PAIR", dynlib: libncurses.}
proc wattron*(win: ptr window, attrs: int): int {.cdecl, discardable, importc: "wattron", dynlib: libncurses.} proc wattron*(win: PWindow, attrs: int): int {.cdecl, discardable, importc: "wattron", dynlib: libncurses.}
proc wattroff*(win: ptr window, attrs: int): int {.cdecl, discardable, importc: "wattron", dynlib: libncurses.} proc wattroff*(win: PWindow, attrs: int): int {.cdecl, discardable, importc: "wattron", dynlib: libncurses.}
const BLACK* = 0 const BLACK* = 0
const RED* = 1 const RED* = 1