Compare commits

..

6 Commits

Author SHA1 Message Date
76d8e02689
Korjaa kääntäminen uudella Guix-versiolla 2025-10-14 13:54:14 +03:00
874ff44b76
Mahdollista Git-tietovarantojen kopiointi ssh:n yli 2025-09-23 12:06:18 +03:00
cb7973d6b2
Mahdollista tiedote.md-paketin kunnollinen riippuvuusmuokkaus
Käyttämällä (assoc-ref inputs ...) aiemman #$(this-package-input ...)
sijaan viittauksen ratkaiseminen siirtyy alemmalle tasolle ja
esimerkiksi (inherit tiedote.md) toimii kuten pitäisi.
2025-09-23 11:59:01 +03:00
751741c915
Poista READMEstä maininta korjattuun vikaan
ASCII-rajoite --address-valitsimessa korjattiin versiossa
c4c9acc966
2025-05-14 15:58:34 +03:00
b9941268b7
Jatka lähettämistä yksittäisistä lähetysvirheistä huolimatta
Yksi ainoa lähetysvirhe riitti aiemmin kaatamaan tiedotejärjestelmän
postitussilmukan. Tällä muutoksella lähetysvirheet tulostetaan
virhelokiin ja ne aiheuttaneet viestit unohdetaan.
2025-05-14 15:45:19 +03:00
7a7022eba4
Lisää Guix-järjestelmäpalvelu 2025-05-08 21:37:13 +03:00
5 changed files with 75 additions and 48 deletions

View File

@ -11,6 +11,7 @@
#:use-module (gnu packages haskell-check)
#:use-module (gnu packages haskell-web)
#:use-module (gnu packages golang-web)
#:use-module (gnu packages ssh)
#:use-module (gnu packages version-control))
(define vcs-file?
@ -41,17 +42,19 @@
ghc-scotty
ghc-exit-codes
git
openssh-sans-x
go-github-com-aymerick-douceur))
(arguments
(list
#:phases
#~(modify-phases %standard-phases
(add-after 'install 'wrap-binaries
(lambda _
(lambda* (#:key inputs #:allow-other-keys)
(wrap-program
(string-append #$output "/bin/tiedote.md")
`("PATH" prefix (,(string-append #$(this-package-input "git") "/bin")
,(string-append #$(this-package-input "go-github-com-aymerick-douceur")
`("PATH" prefix (,(string-append (assoc-ref inputs "git") "/bin")
,(string-append (assoc-ref inputs "openssh-sans-x") "/bin")
,(string-append (assoc-ref inputs "go-github-com-aymerick-douceur")
"/bin")))))))))
(home-page "https://git.olarinmaensamoojat.fi/OMS/tiedote.md")
(synopsis "Git- ja markdown-pohjainen masssasähköpostijärjestelmä OMS:lle")
@ -468,20 +471,17 @@ representations used for @@Generic1@@ are modified slightly.")
(define ghc-filestore
(package
(name "ghc-filestore")
(version "0.6.5")
(version "0.6.5.1")
(source (origin
(method url-fetch)
(uri (hackage-uri "filestore" version))
(sha256
(base32
"0z29273vdqjsrj4vby0gp7d12wg9nkzq9zgqg18db0p5948jw1dh"))))
"1m6rav1rcigckakw8ky27lbwh5a9q8xl7nvv358ljykmvyl1j2lc"))))
(build-system haskell-build-system)
(properties '((upstream-name . "filestore")))
(inputs (list ghc-utf8-string ghc-xml ghc-split ghc-diff ghc-old-locale git mercurial))
(native-inputs (list ghc-hunit))
(arguments
`(#:cabal-revision ("1"
"1v9xqm0112knv6za05qf310ldndrc0h3xhajgwjaycbzkrknz4n7")))
(home-page "http://hackage.haskell.org/package/filestore")
(synopsis "Interface for versioning file stores.")
(description

View File

@ -30,7 +30,7 @@ the tiedote.md user on this system.")
(sendmail-path
(string "/run/privileged/bin/sendmail")
"Path to a sendmail compatible mailing executable.")
(port
(webhook-port
(integer 3000)
"Port to listen on for webhook notifications.")
(socket-path
@ -54,10 +54,36 @@ the tiedote.md user on this system.")
(home-directory state-directory)
(shell (file-append bash-minimal "/bin/bash"))))))
(define (make-tiedote.md-server-script config)
(match-record config <tiedote.md-configuration>
(socket-path email-address sender-name webhook-port sendmail-path
remote-branch remote-url state-directory)
(program-file "tiedote.md-server"
#~(begin
; use utf8 before starting tiedote.md to be able to pass utf characters as arguments
(setlocale LC_ALL "C.UTF-8")
; use utf8 after exec so that ghc text library doesn't crash from IO
(setenv "LANG" "C.UTF-8")
(let ((tiedote.md #$(file-append tiedote-md "/bin/tiedote.md"))
(repo-path (string-append #$state-directory "/git-repo")))
(apply execl
`(,tiedote.md
,tiedote.md
"--address" #$email-address
"--sender-name" #$sender-name
"--sendmail" #$sendmail-path
"--socket" #$socket-path
"server"
"--repository" ,repo-path
"--port" #$(number->string webhook-port)
"--remote-url" #$remote-url
,@(if #$(maybe-value-set? remote-branch)
(list "--remote-branch" #$remote-branch)
'()))))))))
(define (tiedote.md-shepherd-service config)
(match-record config <tiedote.md-configuration>
(state-directory socket-path email-address sender-name port sendmail-path
remote-branch remote-url)
(state-directory socket-path)
(list (shepherd-service
(documentation "A simple mass email system")
(requirement '(networking user-processes))
@ -65,48 +91,46 @@ the tiedote.md user on this system.")
(start #~(let* ((user (getpw "tiedote.md"))
(uid (passwd:uid user))
(gid (passwd:gid user))
(socket-directory (dirname #$socket-path))
(repo-path (string-append #$state-directory "/git-repo")))
(socket-directory (dirname #$socket-path)))
(begin
(mkdir-p socket-directory)
(chown socket-directory uid gid)
(make-forkexec-constructor
(list #$(file-append tiedote-md "/bin/tiedote.md")
"--address" #$email-address
"--sender-name" #$sender-name
"--sendmail" #$sendmail-path
"--socket" #$socket-path
"server"
"--repository" repo-path
"--port" #$(number->string port)
"--remote-url" #$remote-url
;,@(if #$(maybe-value-set? remote-branch)
; (list "--remote-branch" #$remote-branch)
; '())
)
#:user "tiedote.md"
#:group "tiedote.md"
#:environment (cons "GIT_SSL_CAINFO=/etc/ssl/certs/ca-certificates.crt"
(default-environment-variable))
#:directory #$state-directory))))
(make-forkexec-constructor (list #$(make-tiedote.md-server-script config))
#:user "tiedote.md"
#:group "tiedote.md"
#:environment-variables
(cons* "GIT_SSL_CAINFO=/etc/ssl/certs/ca-certificates.crt"
(default-environment-variables))
#:directory #$state-directory))))
(stop #~(make-kill-destructor))))))
(define (tiedote.md-activation config)
(match-record config <tiedote.md-configuration>
(state-directory email-address sender-name sendmail-path socket-path)
(let* ((receive-exec (list (file-append tiedote-md "/bin/tiedote.md") ; file to exec
(file-append tiedote-md "/bin/tiedote.md") ; arg $0
(let* ((tiedote.md (file-append tiedote-md "/bin/tiedote.md"))
(receive-exec (list tiedote.md ; file to exec
tiedote.md ; arg $0
"--address" email-address
"--sender-name" sender-name
"--sendmail" sendmail-path
"--socket" socket-path))
"--socket" socket-path
"receive"))
(receive-script (program-file "tiedote.md-receive"
#~(apply execl #$receive-exec)))
#~(begin
(setlocale LC_ALL "C.UTF-8")
(setenv "LANG" "C.UTF-8")
(apply execl '#$receive-exec))))
(forward-file (mixed-text-file "dot-forward" "|" receive-script)))
#~(let ((.forward (string-append #$state-directory "/.forward")))
#~(let* ((.forward (string-append #$state-directory "/.forward"))
(user (getpw "tiedote.md"))
(uid (passwd:uid user))
(gid (passwd:gid user)))
(if (file-exists? .forward)
(delete-file .forward))
(symlink #$forward-file .forward)))))
; smtpd does not follow symbolic links and requires .forward files to
; be owned by the recipient
(copy-file #$forward-file .forward)
(chown .forward uid gid)))))
(define tiedote.md-service-type
(service-type

View File

@ -41,9 +41,7 @@ lähettämisestä ja Git-tietovaraston päivittämisestä, kun se saa muutoksist
ilmoituksen HTTP POST -pyyntönä (esim. Git-palvelun webhookista).
Palvelimen voi käynnistää komennolla `tiedote.md server`. Mahdolliset asetukset
saa listattua lisäämällä komentoon `--help` valitsimen. `--address`
valitsimesta tulee huomata, että osoitteessa voi käyttää vain ASCII-merkkejä
(ks. [#15](https://git.olarinmaensamoojat.fi/OMS/tiedote.md/issues/15)).
saa listattua lisäämällä komentoon `--help` valitsimen.
Sähköpostin lähettämiseen tarvitaan `sendmail`-yhteensopiva MTA (mail transfer
agent, sähköpostin välitysohjelma), jollaisen useimmat sähköpostipalvelimet

View File

@ -3,7 +3,7 @@
(url "https://git.savannah.gnu.org/git/guix.git")
(branch "master")
(commit
"a6fc564bcc32ba599fc701f340c2d59c47bb225b")
"b2943f6791d02feda7901c3dc2c777193e664455")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"

View File

@ -4,7 +4,6 @@
module TiedoteMD.Send where
import Control.Concurrent (threadDelay)
import Control.Exception (throwIO)
import Control.Lens (set, _Just)
import Control.Monad (forever, unless)
import Data.Acid (AcidState, query, update)
@ -15,8 +14,7 @@ import Data.MIME.Charset (defaultCharsets)
import Data.Set (Set)
import Data.Time (getCurrentTime)
import System.Exit (ExitCode(..))
import System.Exit.Codes (codeTempFail)
import System.IO (hClose, stdout)
import System.IO (hClose, stdout, stderr)
import System.Process (CreateProcess(..), StdStream(..), waitForProcess, createProcess, proc)
import System.Random (getStdRandom, uniform)
@ -25,18 +23,25 @@ import qualified Data.IMF as IMF
import qualified Data.List.NonEmpty as NE
import qualified Data.Set as Set
import qualified Data.Text as T
import qualified Data.Text.IO as T
import TiedoteMD.State
import TiedoteMD.Types
sendmail :: FilePath -> LBS.ByteString -> IO ()
sendmail path bs = do
(Just stdin, _, _, processHandle) <- createProcess (proc path ["-t"]) {std_in = CreatePipe}
(Just stdin, _, Just stderr, processHandle) <- createProcess
(proc path ["-t"]) {std_in = CreatePipe, std_err = CreatePipe}
LBS.hPut stdin bs
hClose stdin
errors <- T.hGetContents stderr
exitCode <- waitForProcess processHandle
unless (exitCode `elem` [ExitSuccess, codeTempFail]) $
throwIO $ ProcessError (T.pack path) exitCode
-- TODO: handle System.Exit.Codes.codeTempFail differently from other failures
unless (exitCode == ExitSuccess) $ do
T.hPutStr System.IO.stderr $
"Sending mail with " <> (T.pack path) <> " failed with " <> (T.pack $ show exitCode)
unless (T.null errors) $ T.hPutStrLn System.IO.stderr $ ":\n" <> errors
T.hPutStrLn System.IO.stderr ""
manageQueue :: AcidState State -> Mailbox -> FilePath -> IO ()
manageQueue acid sender sendmailPath = forever $ do