Files
racket-wiki/main.rkt
T
2026-08-14 21:47:23 +02:00

112 lines
3.9 KiB
Racket

#lang racket/base
(require racket/cmdline
racket/path
"private/auth.rkt"
"private/config.rkt"
"private/database.rkt"
"private/storage.rkt"
"server.rkt")
(provide start
start-wiki)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; goal : Start the wiki using explicit server parameters.
; pre : data-dir, port, listen-ip and the remaining values are valid wiki
; configuration values.
; post : Wiki storage has been initialized and PostgreSQL is prepared when configured and the
; HTTP server has been started.
; result : The result returned by start-wiki-server.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (start #:data-dir [data-dir "wiki-data"]
#:port [port 8080]
#:listen-ip [listen-ip "127.0.0.1"]
#:secure-cookie? [secure-cookie? #f]
#:site-title [site-title "Racket Wiki"]
#:session-seconds [session-seconds (* 12 60 60)]
#:language [language "en"])
(define config
(make-wiki-config #:data-dir data-dir
#:port port
#:listen-ip listen-ip
#:secure-cookie? secure-cookie?
#:site-title site-title
#:session-seconds session-seconds
#:language language))
(start-wiki config))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; goal : Start the wiki using a configuration.
; pre : config is a wiki-config value.
; post : Wiki storage has been initialized and PostgreSQL is prepared when configured and the
; HTTP server has been started.
; result : The result returned by start-wiki-server.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (start-wiki [config (default-wiki-config)])
(ensure-wiki-data! config)
(when (database-settings-exist? config)
(initialize-database! config))
(start-wiki-server config))
(module+ main
(define config (default-wiki-config))
(define create-admin-user #f)
(define create-admin-password #f)
(command-line
#:program "racket-wiki"
#:once-each
(("--data") directory
"Wiki data directory"
(set! config
(struct-copy wiki-config config
(data-dir (path->complete-path directory)))))
(("--port") port
"HTTP port"
(set! config
(struct-copy wiki-config config
(port (string->number port)))))
(("--listen") listen-ip
"Listen IP; use * for all interfaces"
(set! config
(struct-copy wiki-config config
(listen-ip (if (string=? listen-ip "*") #f listen-ip)))))
(("--title") title
"Site title"
(set! config
(struct-copy wiki-config config
(site-title title))))
(("--language") language
"UI language (for example en or nl)"
(set! config
(struct-copy wiki-config config
(language language))))
(("--secure-cookie")
"Mark the session cookie Secure (enable behind HTTPS)"
(set! config
(struct-copy wiki-config config
(secure-cookie? #t))))
(("--create-admin") username password
"Create or reset an administrator account"
(set! create-admin-user username)
(set! create-admin-password password)))
(ensure-wiki-data! config)
(when (database-settings-exist? config)
(initialize-database! config))
(cond
(create-admin-user
(unless (database-ready? config)
(error 'racket-wiki "PostgreSQL must be configured through /setup before --create-admin can be used"))
(upsert-user! config
create-admin-user
create-admin-user
create-admin-password
'admin
'enabled)
(displayln (format "Administrator '~a' is ready." create-admin-user)))
(else
(start-wiki-server config))))