1 #!@GUILE@ --no-auto-compile
3 -*- geiser-scheme-implementation: guile -*-
5 ;;; mumi -- Mediocre, uh, mail interface
6 ;;; Copyright © 2016, 2017, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
7 ;;; Copyright © 2018, 2021 Arun Isaac <arunisaac@systemreboot.net>
9 ;;; This file is part of mumi.
11 ;;; mumi is free software; you can redistribute it and/or modify it
12 ;;; under the terms of the GNU General Public License as published by
13 ;;; the Free Software Foundation; either version 3 of the License, or
14 ;;; (at your option) any later version.
16 ;;; mumi is distributed in the hope that it will be useful, but
17 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ;;; General Public License for more details.
21 ;;; You should have received a copy of the GNU General Public License
22 ;;; along with mumi. If not, see <http://www.gnu.org/licenses/>.
24 (use-modules (srfi srfi-1)
31 #:select (extract-bug-numbers))
33 #:select (worker-loop))
35 #:select (start-mumi-web-server))
39 (define %default-repl-server-port
40 ;; Default port to run REPL server on, if --listen-repl is provided
41 ;; but no port is mentioned
44 ;; Keep indexing the mail directory
45 (define %update-interval 30)
49 (lambda* (#:key loop?)
50 (set! count (remainder (1+ count) 10))
54 (display "Starting full indexing." (current-error-port))
55 (newline (current-error-port)))
56 (index! #:full? (zero? count))
59 (format (current-error-port)
60 "Sleeping for ~a seconds." %update-interval)
61 (sleep %update-interval)
64 (format (current-error-port) "worker error: ~a~%" args)
65 (sleep %update-interval)
69 ;; Specifications of the command-line options
70 (list (option '("address") #t #f
71 (lambda (opt name arg result)
74 (inet-pton AF_INET arg))
76 (error "invalid web server address" arg)))
77 (alist-cons 'address arg
78 (alist-delete 'address result))))
79 (option '("port") #t #f
80 (lambda (opt name arg result)
81 (let ((port (string->number arg)))
83 (alist-cons 'port port
84 (alist-delete 'port result))
85 (error "invalid web server port" arg)))))
86 (option '("listen-repl") #f #t
87 (lambda (opt name arg result)
88 (alist-cons 'listen-repl (or (string->number arg) arg)
89 (alist-delete 'listen-repl result))))
90 (option '("disable-mailer") #f #f
91 (lambda (opt name arg result)
92 (alist-cons 'disable-mailer #t result)))
93 (option '("sender") #t #f
94 (lambda (opt name arg result)
95 (alist-cons 'sender arg result)))
96 (option '("smtp") #t #f
97 (lambda (opt name arg result)
98 (alist-cons 'smtp arg result)))))
100 (define %default-options
101 ;; Alist of default option values
105 (disable-mailer . #f)))
107 (define (parse-options args)
110 (lambda (opt name arg result)
111 (error "unrecognized option" name))
113 (error "extraneous argument" arg))
116 (define (show-mumi-usage)
117 (format (current-error-port)
119 `mumi web [--address=address] [--port=port] [--listen-repl[=port]] [--disable-mailer]':
120 start the application web server.
122 `mumi mailer --sender=SENDER --smtp=SMTP:
123 start a mailer process (requires Redis).
126 run an update loop to refresh issue information from Debbugs.
129 index all Debbugs bug logs and update bug statuses once.
134 (match (cdr (program-arguments))
136 (let* ((opts (parse-options rest))
137 (sender (assoc-ref opts 'sender))
138 (smtp (assoc-ref opts 'smtp)))
139 (if (and sender smtp)
141 (error "Both sender and smtp options must be provided!"))))
143 (update-state! #:loop? #f))
145 (update-state! #:loop? #t))
147 (let ((opts (parse-options rest)))
148 (parameterize ((mailer-enabled? (not (assoc-ref opts 'disable-mailer))))
149 (let ((listen-repl (assoc-ref opts 'listen-repl)))
152 ((number? listen-repl)
153 (format (current-error-port)
154 "REPL server listening on port ~a~%"
156 (spawn-server (make-tcp-server-socket #:port listen-repl)))
158 (format (current-error-port)
159 "REPL server listening on ~a~%"
161 (spawn-server (make-unix-domain-server-socket #:path listen-repl))))))
162 (start-mumi-web-server (or (assoc-ref opts 'address)
164 (or (assoc-ref opts 'port)
166 (_ (show-mumi-usage)))