X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=logger.lisp;h=a6aea52c6495a8fe80c97a334686fff044793d8c;hb=2ca1ab4fda6c7a17b6a8f9ccb903f3ecdf35eefe;hp=c686d4197aac13213bc99af7b8c16b6a3c463615;hpb=b0ecee99c1d09a77daa830e17c96fb908c5cb962;p=irc-logger.git diff --git a/logger.lisp b/logger.lisp index c686d41..a6aea52 100644 --- a/logger.lisp +++ b/logger.lisp @@ -7,8 +7,9 @@ (in-package #:irc-logger) (defvar *daemon-monitor-process* nil "Process of background monitor.") +(defparameter *timeout* 60) -(defclass channel () +(defclass log-channel () ((name :initarg :name :reader c-name :documentation "Name of channel.") (streams :initarg :streams :reader streams @@ -66,6 +67,10 @@ :documentation "Time of last, potentially active, warning message."))) +(defmethod print-object ((obj logger) stream) + (print-unreadable-object (obj stream :type t :identity t) + (format stream "~A" (l-nickname obj)))) + (defvar *loggers* nil "List of active loggers.") (defparameter *user-address-scanner* @@ -85,7 +90,7 @@ (string-left-trim '(#\#) name)) (defun find-channel-with-name (logger name) - (find name (the list (channels logger)) :test #'string-equal :key #'name)) + (find name (the list (channels logger)) :test #'string-equal :key #'c-name)) (defun make-output-name (name year month day) (format nil "~A-~4,'0D.~2,'0D.~2,'0D" (canonicalize-channel-name name) @@ -141,6 +146,9 @@ (defmethod log-file-path (output-root channel-name year month day (format (eql :sexp))) (%log-file-path output-root channel-name year month day "sexp")) +(defmethod log-file-path (output-root channel-name year month day (format (eql :binary))) + (%log-file-path output-root channel-name year month day "bin")) + (defmethod log-file-path (output-root channel-name year month day (format (eql :text))) (%log-file-path output-root channel-name year month day "txt")) @@ -372,7 +380,11 @@ (apply #'format nil fmt args))))) (defun add-private-log-entry (logger fmt &rest args) - (apply #'add-log-entry (get-private-log-stream logger) fmt args)) + (apply #'add-log-entry + (if (and logger (get-private-log-stream logger)) + (get-private-log-stream logger) + *standard-output*) + fmt args)) (defun privmsg-hook (msg) (let ((logger (find-logger-with-connection (connection msg))) @@ -384,9 +396,13 @@ (output-event msg :privmsg channel (trailing-argument msg)))))) (defun action-hook (msg) - (output-event msg :action (first (arguments msg)) - (subseq (trailing-argument msg) 8 - (- (length (trailing-argument msg)) 1)))) + (let ((end (- (length (trailing-argument msg)) 1))) + ;; end has been as low as 7 + (when (< end 8) + (warn "End is less than 8: `~A'." msg)) + (output-event msg :action (first (arguments msg)) + (subseq (trailing-argument msg) (min 8 end) + (- (length (trailing-argument msg)) 1))))) (defun nick-hook (msg) (output-event msg :nick nil (trailing-argument msg))) @@ -410,9 +426,9 @@ logger "Logging daemon ~A has been kicked from ~A (~A)" (l-nickname logger) channel (trailing-argument msg)) - (daemon-sleep 1) + (daemon-sleep 5) (remove-channel-logger logger channel) - (daemon-sleep 1) + (daemon-sleep 10) (add-channel-logger logger channel) (add-private-log-entry logger "Rejoined ~A" channel)))) @@ -472,7 +488,7 @@ (defun make-a-channel (name formats output) - (make-instance 'channel + (make-instance 'log-channel :name name :streams (make-array (length formats) :initial-element nil) :output-root (when (and (pathnamep output) @@ -626,13 +642,33 @@ (add-private-log-entry (find-logger-with-nick nick) "Closing previously active connection [add-logger].") (ignore-errors (remove-logger nick))) - (let ((logger (create-logger nick server :channels channels :output output - :logging-stream logging-stream :password password - :realname realname :username username - :private-log private-log - :unknown-log unknown-log - :formats formats - :async async))) + (add-private-log-entry nil "Calling create-logger [add-logger].~%") + (let ((logger + (do ((new-logger + (#-sbcl mp:with-timeout #-sbcl (*timeout* nil) + #+sbcl sb-ext:with-timeout #+sbcl *timeout* + (create-logger nick server :channels channels :output output + :logging-stream logging-stream :password password + :realname realname :username username + :private-log private-log + :unknown-log unknown-log + :formats formats + :async async)) + (#-sbcl mp:with-timeout #-sbcl (*timeout* nil) + #+sbcl sb-ext:with-timeout #+sbcl *timeout* + (create-logger nick server :channels channels :output output + :logging-stream logging-stream :password password + :realname realname :username username + :private-log private-log + :unknown-log unknown-log + :formats formats + :async async)))) + (new-logger + (progn + (add-private-log-entry nil "Acquired new logger ~A." new-logger) + new-logger)) + (add-private-log-entry nil "Timeout trying to create new logger [add-logger].")))) + (add-private-log-entry logger "Pushing newly created logger ~A [add-logger].~%" logger) (push logger *loggers*) (start-logger logger async) logger)) @@ -659,7 +695,7 @@ (setf (get-stream channel i) nil))) (setf (channels logger) (delete channel-name (channels logger) :test #'string-equal - :key #'name)) + :key #'c-name)) (setf (channel-names logger) (delete channel-name (channel-names logger) :test #'string-equal)) t) @@ -688,7 +724,8 @@ (let ((text (trailing-argument msg)) (logger (find-logger-with-connection (connection msg)))) (when (and (stringp text) - (zerop (search (format nil "Closing Link: ~A" (l-nickname logger)) text))) + (eql 0 (search (format nil "Closing Link: ~A" + (l-nickname logger)) text))) (setf (warning-message-utime logger) (received-time msg))) (output-event msg :error nil (trailing-argument msg)))) @@ -718,7 +755,6 @@ (defun is-connected (logger) (%is-connected logger)) -(defparameter *timeout* 60) (defun is-connected (logger) #-allegro (%is-connected logger) @@ -768,25 +804,36 @@ *recon-channel-names* (channel-names logger)) (ignore-errors (remove-logger logger))) - (let ((new-logger - (ignore-errors - (add-logger *recon-nick* *recon-server* - :channels *recon-channel-names* - :output *recon-user-output* - :password *recon-password* - :realname *recon-realname* - :username *recon-username* - :logging-stream *recon-logging-stream* - :private-log *recon-private-log* - :unknown-log *recon-unknown-log* - :async *recon-async* - :formats *recon-formats*)))) - (when new-logger - (sleep 5) - (when (is-connected new-logger) - (log-reconnection new-logger))))) - - ) + (do ((new-logger nil)) + (new-logger) + (setq new-logger + (ignore-errors + (add-logger *recon-nick* *recon-server* + :channels *recon-channel-names* + :output *recon-user-output* + :password *recon-password* + :realname *recon-realname* + :username *recon-username* + :logging-stream *recon-logging-stream* + :private-log *recon-private-log* + :unknown-log *recon-unknown-log* + :async *recon-async* + :formats *recon-formats*))) + (cond + (new-logger + (sleep 240) + (cond + ((is-connected new-logger) + (log-reconnection new-logger)) + (t + (log-daemon-message new-logger "Newly added logger is not connected. Removing connection and will re-attempt.") + (ignore-errors (remove-logger new-logger)) + (sleep 60) + (setq new-logger nil)))) + (t + (log-daemon-message nil "Got NIL for new logger. Waiting and retrying.") + (sleep 20))))) + ) ;; end closure (defun daemon-monitor () "This function runs in the background and monitors the connection of the logger."