6.13. Mailman and Allegroserve
Final system setup requires you to do something along the lines of
ScriptAlias /mailman/ $prefix/cgi-bin/
Alias /pipermail/ $varprefix/archives/public/
The above is very Apache! Here follows the Allegroserve counterpart. Make sure you specify :setuid and :setgid arguments to net.aserve:start, otherwise the server will attempt to run cgi scripts as root, which is a Bad Thing.
;;;;;;;;;;; (in-package "NET.ASERVE") ;; what is the url prefix for mailman queries? (defparameter *mailman-prefix* "/mailman/") ;; where is mailman installed? (defparameter *mailman-root* "/usr/local/mailman/") (defun mailman-location (where) (merge-pathnames where *mailman-root*)) ;; We want to convert "/mailman/admin/mylist" into ;; "/usr/local/mailman/cgi-bin/admin" and "/mylist" (defun mailman-cgi-names (uri-path) (let* ((uri-relative (uri-path (enough-uri uri-path *mailman-prefix*))) (where (position #\/ uri-relative)) (program-name (subseq uri-relative 0 where)) (program (merge-pathnames program-name (mailman-location "cgi-bin/")))) (values (namestring program) (and where (subseq uri-relative where))))) (defun cgi-error-output (req ent istream) (declare (ignore req ent)) (let ((ostream (error-stream))) (loop (let ((char (read-char-no-hang istream nil :eof))) (cond ((null char) (return nil)) ((eq :eof char) (return t)) (t (write-char char ostream))))))) (defun mailman-invoke-cgi (req ent) (let ((uri-path (request-decoded-uri-path req))) (multiple-value-bind (program path-info) (mailman-cgi-names uri-path) (unless (probe-file program) (error "Mailman program ~s not found." uri-path)) (run-cgi-program req ent program :path-info path-info :error-output #'cgi-error-output)))) (publish-prefix #| :host *my-vhost-names* |# :prefix *mailman-prefix* :function #'mailman-invoke-cgi) (publish-directory #| :host *my-vhost-names* |# :prefix "/pipermail/" :destination (namestring (mailman-location "archives/public/")))
Converted from the Mailman FAQ Wizard
This is one of many Frequently Asked Questions.