propellor 5.14 → 5.14.1
raw patch · 5 files changed
+47/−885 lines, 5 files
Files
- CHANGELOG +7/−0
- config.hs +16/−442
- debian/changelog +7/−0
- executables/propellor-config.hs +16/−442
- propellor.cabal +1/−1
CHANGELOG view
@@ -1,3 +1,10 @@+propellor (5.14.1) unstable; urgency=medium++ * Fix config.hs example, which was accidentially joeyconfig.hs in the+ previous release.++ -- Joey Hess <id@joeyh.name> Sat, 15 Oct 2022 14:44:01 -0400+ propellor (5.14) unstable; urgency=medium * Removed Propellor.Property.OpenID module, since the simpleid package
config.hs view
@@ -1,455 +1,29 @@--- This is the live config file used by propellor's author.--- https://propellor.branchable.com/-module Main where+-- This is the main configuration file for Propellor, and is used to build+-- the propellor program. import Propellor-import Propellor.Property.Scheduled-import Propellor.Property.DiskImage-import Propellor.Property.Chroot-import Propellor.Property.Machine-import Propellor.Property.Bootstrap import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt-import qualified Propellor.Property.Network as Network-import qualified Propellor.Property.Ssh as Ssh import qualified Propellor.Property.Cron as Cron-import qualified Propellor.Property.Sudo as Sudo import qualified Propellor.Property.User as User-import qualified Propellor.Property.Hostname as Hostname-import qualified Propellor.Property.Tor as Tor-import qualified Propellor.Property.Dns as Dns-import qualified Propellor.Property.Git as Git-import qualified Propellor.Property.Postfix as Postfix-import qualified Propellor.Property.Apache as Apache-import qualified Propellor.Property.LetsEncrypt as LetsEncrypt-import qualified Propellor.Property.Locale as Locale-import qualified Propellor.Property.Grub as Grub-import qualified Propellor.Property.Borg as Borg-import qualified Propellor.Property.Systemd as Systemd-import qualified Propellor.Property.Journald as Journald-import qualified Propellor.Property.Fail2Ban as Fail2Ban-import qualified Propellor.Property.Laptop as Laptop-import qualified Propellor.Property.LightDM as LightDM-import qualified Propellor.Property.HostingProvider.Linode as Linode-import qualified Propellor.Property.SiteSpecific.GitHome as GitHome-import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder-import qualified Propellor.Property.SiteSpecific.Branchable as Branchable-import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites -main :: IO () -- _ ______`| ,-.__-main = defaultMain hosts -- / \___-=O`/|O`/__| (____.'- {- Propellor -- \ / | / ) _.-"-._- Deployed -} -- `/-==__ _/__|/__=-| ( \_-hosts :: [Host] -- * \ | | '--------'-hosts = -- (o) `- [ darkstar- , dragon- , oyster- , orca- , house- , kite- , beaver- , sow- , mouse- , peregrine- , pell- ] ++ monsters--darkstar :: Host-darkstar = host "darkstar.kitenet.net" $ props- & osDebian Unstable X86_64- & ipv6 "2001:4830:1600:187::2"- & Hostname.sane- & Hostname.mailname- & Apt.serviceInstalledRunning "swapspace"- & Laptop.powertopAutoTuneOnBoot- & Laptop.trimSSD- & Grub.cmdline_Linux_default "i915.enable_psr=1"- ! Grub.cmdline_Linux_default "quiet"- & User.hasGroup (User "joey") (Group "dialout")-- & JoeySites.dkimMilter- & JoeySites.postfixSaslPasswordClient- -- & JoeySites.alarmClock "*-*-* 7:30" (User "joey")- -- "/usr/bin/timeout 45m /home/joey/bin/goodmorning"- & JoeySites.laptopSoftware- & JoeySites.userDirHtml- & Ssh.userKeys (User "joey") hostContext- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICfFntnesZcYz2B2T41ay45igfckXRSh5uVffkuCQkLv joey@darkstar")- ]- & imageBuiltFor house- (RawDiskImage "/srv/house.img")- (Debootstrapped mempty)--dragon :: Host-dragon = host "dragon.kitenet.net" $ props- & ipv6 "2001:4830:1600:187::2"- & JoeySites.dkimMilter- & JoeySites.postfixSaslPasswordClient--oyster :: Host-oyster = host "oyster.kitenet.net" $ props- & standardSystem (Stable "buster") X86_64- ["Unreliable server. Anything here may be lost at any time!" ]- & ipv4 "45.138.157.89"-- & User.hasPassword (User "root")- & Apt.unattendedUpgrades--orca :: Host-orca = host "orca.kitenet.net" $ props- & standardSystem Unstable X86_64 [ "Main git-annex build box." ]- & ipv4 "138.38.108.179"-- & Apt.unattendedUpgrades- & Postfix.satellite- & Apt.serviceInstalledRunning "ntp"- & Systemd.persistentJournal-- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.standardAutoBuilder- Unstable X86_64 Nothing (Cron.Times "15 * * * *") "2h")- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.standardAutoBuilder- Unstable X86_32 Nothing (Cron.Times "30 * * * *") "2h")- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.stackAutoBuilder- (Stable "jessie") X86_32 (Just "ancient") (Cron.Times "45 * * * *") "2h")- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.standardAutoBuilder- Testing ARM64 Nothing (Cron.Times "1 * * * *") "4h")--house :: Host-house = host "house.lan" $ props- & standardSystem Testing ARMHF- [ "Home router and arm git-annex build box." ]- & Apt.removed ["rsyslog"]- - & cubietech_Cubietruck- & hasPartition- ( partition EXT3- `mountedAt` "/"- `setSize` MegaBytes 16000- )- & JoeySites.cubieTruckOneWire- & Systemd.persistentJournal- & Apt.installed ["firmware-atheros"]- & Apt.serviceInstalledRunning "ntp" -- no hardware clock- & bootstrappedFrom GitRepoOutsideChroot- & Ssh.hostKeys hostContext- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIS/hDYq1MAxfOBf49htym3BOYlx4Gk9SDpiHjv7u6IC")- ]- & Ssh.userKeys (User "joey") hostContext- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAYgEgsDmN26goPBGPN0HIvtkZfxlc996nPfBPDWxGuh")- ]-- & JoeySites.house- (User "joey")- hosts- (Context "house.joeyh.name")- (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMAmVYddg/RgCbIj+cLcEiddeFXaYFnbEJ3uGj9G/EyV joey@honeybee")- & JoeySites.connectStarlinkRouter- & JoeySites.homeRouter- & JoeySites.homeNAS- & Apt.installed ["mtr-tiny", "iftop", "screen", "nmap"]- -- Currently manually building the xr_usb_serial module.- & Apt.installed ["linux-headers-armmp-lpae"]- & Postfix.satellite-- & check (not <$> hasContainerCapability Systemd.FilesystemContained) - (setupRevertableProperty autobuilder)- -- In case compiler needs more than available ram- & Apt.serviceInstalledRunning "swapspace"- where- autobuilder = Systemd.nspawned $ GitAnnexBuilder.autoBuilderContainer- (GitAnnexBuilder.armAutoBuilder GitAnnexBuilder.standardAutoBuilder)- Testing ARMEL Nothing (Cron.Times "15 15 * * *") "10h"---- This is not a complete description of kite, since it's a--- multiuser system with eg, user passwords that are not deployed--- with propellor.-kite :: Host-kite = host "kite.kitenet.net" $ props- & standardSystemUnhardened Testing X86_64 [ "Welcome to kite!" ]- & ipv4 "66.228.36.95"- -- disabled because I've had complaints of mail bouncing, and it- -- seems mail servers are only trying ipv6 and then bouncing if- -- they have an ipv6 routing issue.- -- & ipv6 "2600:3c03::f03c:91ff:fe73:b0d2"- & alias "kitenet.net"- & Ssh.hostKeys (Context "kitenet.net")- [ (SshDsa, "ssh-dss AAAAB3NzaC1kc3MAAACBAO9tnPUT4p+9z7K6/OYuiBNHaij4Nzv5YVBih1vMl+ALz0gYAj8RWJzXmqp5buFAyfgOoLw+H9s1bBS01Sy3i07Dm6cx1fWG4RXL/E/3w1tavX99GD2bBxDBu890ebA5Tp+eFRJkS9+JwSvFiF6CP7NbVjifCagoUO56Ig048RwDAAAAFQDPY2xM3q6KwsVQliel23nrd0rV2QAAAIEAga3hj1hL00rYPNnAUzT8GAaSP62S4W68lusErH+KPbsMwFBFY/Ib1FVf8k6Zn6dZLh/HH/RtJi0JwdzPI1IFW+lwVbKfwBvhQ1lw9cH2rs1UIVgi7Wxdgfy8gEWxf+QIqn62wG+Ulf/HkWGvTrRpoJqlYRNS/gnOWj9Z/4s99koAAACBAM/uJIo2I0nK15wXiTYs/NYUZA7wcErugFn70TRbSgduIFH6U/CQa3rgHJw9DCPCQJLq7pwCnFH7too/qaK+czDk04PsgqV0+Jc7957gU5miPg50d60eJMctHV4eQ1FpwmGGfXxRBR9k2ZvikWYatYir3L6/x1ir7M0bA9IzNU45")- , (SshRsa, "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA2QAJEuvbTmaN9ex9i9bjPhMGj+PHUYq2keIiaIImJ+8mo+yKSaGUxebG4tpuDPx6KZjdycyJt74IXfn1voGUrfzwaEY9NkqOP3v6OWTC3QeUGqDCeJ2ipslbEd9Ep9XBp+/ldDQm60D0XsIZdmDeN6MrHSbKF4fXv1bqpUoUILk=")- , (SshEcdsa, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLF+dzqBJZix+CWUkAd3Bd3cofFCKwHMNRIfwx1G7dL4XFe6fMKxmrNetQcodo2edyufwoPmCPr3NmnwON9vyh0=")- , (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZftKMnH/zH29BHMKbcBO4QsgTrstYFVhbrzrlRzBO3")- ]-- & Network.preserveStatic "eth0" `requires` Network.cleanInterfacesFile- & Apt.installed ["linux-image-amd64"]- & Apt.serviceInstalledRunning "swapspace"- & Linode.serialGrub- & Linode.locateEnabled- & Apt.unattendedUpgrades- & Systemd.installed- & Systemd.persistentJournal- & Journald.systemMaxUse "500MiB"- & Ssh.passwordAuthentication True- & Fail2Ban.installed -- since ssh password authentication is allowed- -- Allow ssh -R to forward ports via kite- & Ssh.setSshdConfig "GatewayPorts" "clientspecified"- & Apt.serviceInstalledRunning "ntp"- & "/etc/timezone" `File.hasContent` ["US/Eastern"]- - & Borg.backup "/" (JoeySites.rsyncNetBorgRepo "kite.borg" []) Cron.Daily- [ "--exclude=/proc/*"- , "--exclude=/sys/*"- , "--exclude=/run/*"- , "--exclude=/mnt/*"- , "--exclude=/tmp/*"- , "--exclude=/var/tmp/*"- , "--exclude=/var/cache/*"- , "--exclude=/var/lib/swapspace/*"- , "--exclude=/var/lib/container/*"- , "--exclude=/home/joey/lib"- -- These directories are backed up and restored separately.- , "--exclude=/srv/git"- ]- [ Borg.KeepDays 7- , Borg.KeepWeeks 4- , Borg.KeepMonths 3- ]- `requires` Ssh.knownHost hosts "usw-s002.rsync.net" (User "root")- `requires` Ssh.userKeys (User "root")- (Context "kite.kitenet.net")- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKyciu8E8qspcO8lnTSUBAxUdYfmk7FaFlvT5yxUaP+0 root@kite")- ]-- & alias "smtp.kitenet.net"- & alias "imap.kitenet.net"- & alias "pop.kitenet.net"- & alias "mail.kitenet.net"- & JoeySites.kiteMailServer-- & JoeySites.legacyWebSites- & File.ownerGroup "/srv/web" (User "joey") (Group "joey")- & Apt.installed ["analog"]-- & alias "git.kitenet.net"- & alias "git.joeyh.name"- & JoeySites.gitServer hosts-- & JoeySites.downloads- & JoeySites.gitAnnexDistributor- & JoeySites.tmp-- & Apt.installed- [ "git-annex", "myrepos"- , "build-essential", "make"- , "rss2email", "chewmail"- , "devscripts"- -- Some users have zsh as their login shell.- , "zsh"- ]-- & alias "znc.kitenet.net"- & JoeySites.ircBouncer-- & alias "kgb.kitenet.net"- & JoeySites.kgbServer- - & Systemd.nspawned ancientKitenet- - & alias "podcatcher.kitenet.net"- & JoeySites.podcatcher-- & alias "ns4.kitenet.net"- & myDnsPrimary "kitenet.net"- [ (RelDomain "mouse-onion", CNAME $ AbsDomain "htieo6yu2qtcn2j3.onion")- , (RelDomain "beaver-onion", CNAME $ AbsDomain "tl4xsvaxryjylgxs.onion")- , (RelDomain "peregrine-onion", CNAME $ AbsDomain "rsdwvaabir6ty2kdzblq7wdda26ib4fuc6hzxzwum75jbn6thqbojvid.onion")- , (RelDomain "sow-onion", CNAME $ AbsDomain "urt4g2tq32qktgtp.onion")- ]- & myDnsPrimary "joeyh.name" []- & myDnsPrimary "ikiwiki.info" []- ! myDnsPrimary "olduse.net"- [ (RelDomain "article", CNAME $ AbsDomain "virgil.koldfront.dk")- ]- ! myDnsPrimary "quarantimer.app" []- & alias "ns4.branchable.com"- & branchableSecondary- -- Use its own name server (amoung other things this avoids- -- spamassassin URIBL_BLOCKED.- & "/etc/resolv.conf" `File.hasContent`- [ "nameserver 127.0.0.1"- , "domain kitenet.net"- , "search kitenet.net"- ]- - & alias "debug-me.joeyh.name"- & Apt.installed ["debug-me", "debug-me-server"]- & Systemd.enabled "debug-me"-- -- testing- & Apache.httpsVirtualHost "letsencrypt.joeyh.name" "/var/www/html"- (LetsEncrypt.AgreeTOS (Just "id@joeyh.name"))- & alias "letsencrypt.joeyh.name"--beaver :: Host-beaver = host "beaver.kitenet.net" $ props- & Apt.installed ["ssh"]- & Ssh.hostPubKey SshDsa "ssh-dss AAAAB3NzaC1kc3MAAACBAIrLX260fY0Jjj/p0syNhX8OyR8hcr6feDPGOj87bMad0k/w/taDSOzpXe0Wet7rvUTbxUjH+Q5wPd4R9zkaSDiR/tCb45OdG6JsaIkmqncwe8yrU+pqSRCxttwbcFe+UU+4AAcinjVedZjVRDj2rRaFPc9BXkPt7ffk8GwEJ31/AAAAFQCG/gOjObsr86vvldUZHCteaJttNQAAAIB5nomvcqOk/TD07DLaWKyG7gAcW5WnfY3WtnvLRAFk09aq1EuiJ6Yba99Zkb+bsxXv89FWjWDg/Z3Psa22JMyi0HEDVsOevy/1sEQ96AGH5ijLzFInfXAM7gaJKXASD7hPbVdjySbgRCdwu0dzmQWHtH+8i1CMVmA2/a5Y/wtlJAAAAIAUZj2US2D378jBwyX1Py7e4sJfea3WSGYZjn4DLlsLGsB88POuh32aOChd1yzF6r6C2sdoPBHQcWBgNGXcx4gF0B5UmyVHg3lIX2NVSG1ZmfuLNJs9iKNu4cHXUmqBbwFYQJBvB69EEtrOw4jSbiTKwHFmqdA/mw1VsMB+khUaVw=="- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)--sow :: Host-sow = host "sow.kitenet.net" $ props- & Apt.installed ["ssh"]- & Ssh.hostPubKey SshDsa "ssh-dss AAAAB3NzaC1kc3MAAACBAIrLX260fY0Jjj/p0syNhX8OyR8hcr6feDPGOj87bMad0k/w/taDSOzpXe0Wet7rvUTbxUjH+Q5wPd4R9zkaSDiR/tCb45OdG6JsaIkmqncwe8yrU+pqSRCxttwbcFe+UU+4AAcinjVedZjVRDj2rRaFPc9BXkPt7ffk8GwEJ31/AAAAFQCG/gOjObsr86vvldUZHCteaJttNQAAAIB5nomvcqOk/TD07DLaWKyG7gAcW5WnfY3WtnvLRAFk09aq1EuiJ6Yba99Zkb+bsxXv89FWjWDg/Z3Psa22JMyi0HEDVsOevy/1sEQ96AGH5ijLzFInfXAM7gaJKXASD7hPbVdjySbgRCdwu0dzmQWHtH+8i1CMVmA2/a5Y/wtlJAAAAIAUZj2US2D378jBwyX1Py7e4sJfea3WSGYZjn4DLlsLGsB88POuh32aOChd1yzF6r6C2sdoPBHQcWBgNGXcx4gF0B5UmyVHg3lIX2NVSG1ZmfuLNJs9iKNu4cHXUmqBbwFYQJBvB69EEtrOw4jSbiTKwHFmqdA/mw1VsMB+khUaVw=="- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)--mouse :: Host-mouse = host "mouse.kitenet.net" $ props- & ipv4 "67.223.19.96"- & Apt.installed ["ssh"]- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)--peregrine :: Host-peregrine = host "peregrine.kitenet.net" $ props- & Apt.installed ["ssh", "screen", "variety", "git-annex"]- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)- & LightDM.autoLogin (User "desktop")---- Branchable is not completely deployed with propellor yet.-pell :: Host-pell = host "pell.branchable.com" $ props- & alias "branchable.com"- & ipv4 "66.228.46.55"- & ipv6 "2600:3c03::f03c:91ff:fedf:c0e5"+main :: IO ()+main = defaultMain hosts - -- All the websites I host at branchable that don't use- -- branchable.com dns.- & alias "www.kitenet.net"- & alias "joeyh.name"- & alias "www.joeyh.name"- & alias "campaign.joeyh.name"- & alias "ikiwiki.info"- & alias "www.ikiwiki.info"- & alias "git.ikiwiki.info"- & alias "l10n.ikiwiki.info"- & alias "dist-bugs.kitenet.net"- & alias "family.kitenet.net"+-- The hosts propellor knows about.+hosts :: [Host]+hosts =+ [ mybox+ ] - & osDebian (Stable "buster") X86_32- & Apt.installed ["linux-image-686-pae"]- & Apt.stdSourcesList `onChange` Apt.upgrade+-- An example host.+mybox :: Host+mybox = host "mybox.example.com" $ props+ & osDebian Unstable X86_64+ & Apt.stdSourcesList & Apt.unattendedUpgrades- & Branchable.server hosts- & Linode.serialGrub---- --' __|II| ,.- ---- __|II|II|__ ( \_,/\---'-------'\o/-'-.-'-.-'-.- __|II|II|II|II|___/ __/ -'-.-'-.-'-.-'-.-'-.-'---------------------------- | [Containers] / ----------------------------------------------------- : / ------------------------------------------------------- \____, o ,' --------------------------------------------------------- '--,___________,' --------------------------------- Exhibit: kite's 90's website on port 1994.-ancientKitenet :: Systemd.Container-ancientKitenet = Systemd.debContainer "ancient-kitenet" $ props- & standardContainer (Stable "buster")- & alias hn- & Git.cloned (User "root") "git://kitenet-net.branchable.com/" "/var/www/html"- (Just "remotes/origin/old-kitenet.net")- & Apache.installed- & Apache.listenPorts [p]- & Apache.virtualHost hn p "/var/www/html"- & Apache.siteDisabled "000-default"- where- p = Port 1994- hn = "ancient.kitenet.net"--type Motd = [String]---- This is my standard system setup.-standardSystem :: DebianSuite -> Architecture -> Motd -> Property (HasInfo + Debian)-standardSystem suite arch motd =- standardSystemUnhardened suite arch motd- `before` Ssh.noPasswords--standardSystemUnhardened :: DebianSuite -> Architecture -> Motd -> Property (HasInfo + Debian)-standardSystemUnhardened suite arch motd = propertyList "standard system" $ props- & osDebian suite arch- & Hostname.sane- & Hostname.mailname- & Hostname.searchDomain- & Locale.available "en_US.UTF-8"- & File.hasContent "/etc/motd" ("":motd++[""])- & Apt.stdSourcesList `onChange` Apt.upgrade- & Apt.cacheCleaned & Apt.installed ["etckeeper"]- & Apt.installed ["ssh", "mosh"]- & GitHome.installedFor (User "root")+ & Apt.installed ["ssh"] & User.hasSomePassword (User "root")- & User.accountFor (User "joey")- & User.hasSomePassword (User "joey")- & Sudo.enabledFor (User "joey")- & GitHome.installedFor (User "joey")- & Apt.installed ["vim", "screen", "less"]+ & File.dirExists "/var/www" & Cron.runPropellor (Cron.Times "30 * * * *")- -- I use postfix, or no MTA.- & JoeySites.noExim---- This is my standard container setup, Featuring automatic upgrades.-standardContainer :: DebianSuite -> Property (HasInfo + Debian)-standardContainer suite = propertyList "standard container" $ props- & osDebian suite X86_64- -- Do not want to run mail daemon inside a random container..- & JoeySites.noExim- & Apt.stdSourcesList `onChange` Apt.upgrade- & Apt.unattendedUpgrades- & Apt.cacheCleaned--branchableSecondary :: RevertableProperty (HasInfo + DebianLike) DebianLike-branchableSecondary = Dns.secondaryFor ["branchable.com"] hosts "branchable.com"---- Currently using kite (ns4) as primary with gandi as secondary--- kite handles all mail.-myDnsPrimary :: Domain -> [(BindDomain, Record)] -> RevertableProperty (HasInfo + DebianLike) DebianLike-myDnsPrimary domain extras = Dns.signedPrimary (Weekly Nothing) hosts domain- (Dns.mkSOA "ns4.kitenet.net" 100) $- [ (RootDomain, NS $ AbsDomain "ns4.kitenet.net")- , (RootDomain, NS $ AbsDomain "ns6.gandi.net")- , (RootDomain, MX 0 $ AbsDomain "kitenet.net")- , (RootDomain, TXT "v=spf1 a a:kitenet.net ~all")- , JoeySites.domainKey- ] ++ extras---- Systems I don't manage with propellor,--- but do want to track their public keys etc.-monsters :: [Host]-monsters =- [ host "usw-s002.rsync.net" $ props- & Ssh.hostPubKey SshEd25519 "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB7yTEBGfQYdwG/oeL+U9XPMIh/dW7XNs9T+M79YIOrd"- , host "ns6.gandi.net" $ props- & ipv4 "217.70.177.40"- ]---- -- o- -- ___ o o- {-----\ / o \ ___o o- { \ __ \ / _ (X___>-- __o- _____________________{ ______\___ \__/ | \__/ \____ |X__>- < \___//|\\___/\ \____________ _- \ ___/ | \___ # # \ (-)- \ O O O # | \ # >=)- \______________________________# # / #__________________/ (-}--
debian/changelog view
@@ -1,3 +1,10 @@+propellor (5.14.1) unstable; urgency=medium++ * Fix config.hs example, which was accidentially joeyconfig.hs in the+ previous release.++ -- Joey Hess <id@joeyh.name> Sat, 15 Oct 2022 14:44:01 -0400+ propellor (5.14) unstable; urgency=medium * Removed Propellor.Property.OpenID module, since the simpleid package
executables/propellor-config.hs view
@@ -1,455 +1,29 @@--- This is the live config file used by propellor's author.--- https://propellor.branchable.com/-module Main where+-- This is the main configuration file for Propellor, and is used to build+-- the propellor program. import Propellor-import Propellor.Property.Scheduled-import Propellor.Property.DiskImage-import Propellor.Property.Chroot-import Propellor.Property.Machine-import Propellor.Property.Bootstrap import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt-import qualified Propellor.Property.Network as Network-import qualified Propellor.Property.Ssh as Ssh import qualified Propellor.Property.Cron as Cron-import qualified Propellor.Property.Sudo as Sudo import qualified Propellor.Property.User as User-import qualified Propellor.Property.Hostname as Hostname-import qualified Propellor.Property.Tor as Tor-import qualified Propellor.Property.Dns as Dns-import qualified Propellor.Property.Git as Git-import qualified Propellor.Property.Postfix as Postfix-import qualified Propellor.Property.Apache as Apache-import qualified Propellor.Property.LetsEncrypt as LetsEncrypt-import qualified Propellor.Property.Locale as Locale-import qualified Propellor.Property.Grub as Grub-import qualified Propellor.Property.Borg as Borg-import qualified Propellor.Property.Systemd as Systemd-import qualified Propellor.Property.Journald as Journald-import qualified Propellor.Property.Fail2Ban as Fail2Ban-import qualified Propellor.Property.Laptop as Laptop-import qualified Propellor.Property.LightDM as LightDM-import qualified Propellor.Property.HostingProvider.Linode as Linode-import qualified Propellor.Property.SiteSpecific.GitHome as GitHome-import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder-import qualified Propellor.Property.SiteSpecific.Branchable as Branchable-import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites -main :: IO () -- _ ______`| ,-.__-main = defaultMain hosts -- / \___-=O`/|O`/__| (____.'- {- Propellor -- \ / | / ) _.-"-._- Deployed -} -- `/-==__ _/__|/__=-| ( \_-hosts :: [Host] -- * \ | | '--------'-hosts = -- (o) `- [ darkstar- , dragon- , oyster- , orca- , house- , kite- , beaver- , sow- , mouse- , peregrine- , pell- ] ++ monsters--darkstar :: Host-darkstar = host "darkstar.kitenet.net" $ props- & osDebian Unstable X86_64- & ipv6 "2001:4830:1600:187::2"- & Hostname.sane- & Hostname.mailname- & Apt.serviceInstalledRunning "swapspace"- & Laptop.powertopAutoTuneOnBoot- & Laptop.trimSSD- & Grub.cmdline_Linux_default "i915.enable_psr=1"- ! Grub.cmdline_Linux_default "quiet"- & User.hasGroup (User "joey") (Group "dialout")-- & JoeySites.dkimMilter- & JoeySites.postfixSaslPasswordClient- -- & JoeySites.alarmClock "*-*-* 7:30" (User "joey")- -- "/usr/bin/timeout 45m /home/joey/bin/goodmorning"- & JoeySites.laptopSoftware- & JoeySites.userDirHtml- & Ssh.userKeys (User "joey") hostContext- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICfFntnesZcYz2B2T41ay45igfckXRSh5uVffkuCQkLv joey@darkstar")- ]- & imageBuiltFor house- (RawDiskImage "/srv/house.img")- (Debootstrapped mempty)--dragon :: Host-dragon = host "dragon.kitenet.net" $ props- & ipv6 "2001:4830:1600:187::2"- & JoeySites.dkimMilter- & JoeySites.postfixSaslPasswordClient--oyster :: Host-oyster = host "oyster.kitenet.net" $ props- & standardSystem (Stable "buster") X86_64- ["Unreliable server. Anything here may be lost at any time!" ]- & ipv4 "45.138.157.89"-- & User.hasPassword (User "root")- & Apt.unattendedUpgrades--orca :: Host-orca = host "orca.kitenet.net" $ props- & standardSystem Unstable X86_64 [ "Main git-annex build box." ]- & ipv4 "138.38.108.179"-- & Apt.unattendedUpgrades- & Postfix.satellite- & Apt.serviceInstalledRunning "ntp"- & Systemd.persistentJournal-- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.standardAutoBuilder- Unstable X86_64 Nothing (Cron.Times "15 * * * *") "2h")- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.standardAutoBuilder- Unstable X86_32 Nothing (Cron.Times "30 * * * *") "2h")- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.stackAutoBuilder- (Stable "jessie") X86_32 (Just "ancient") (Cron.Times "45 * * * *") "2h")- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer- GitAnnexBuilder.standardAutoBuilder- Testing ARM64 Nothing (Cron.Times "1 * * * *") "4h")--house :: Host-house = host "house.lan" $ props- & standardSystem Testing ARMHF- [ "Home router and arm git-annex build box." ]- & Apt.removed ["rsyslog"]- - & cubietech_Cubietruck- & hasPartition- ( partition EXT3- `mountedAt` "/"- `setSize` MegaBytes 16000- )- & JoeySites.cubieTruckOneWire- & Systemd.persistentJournal- & Apt.installed ["firmware-atheros"]- & Apt.serviceInstalledRunning "ntp" -- no hardware clock- & bootstrappedFrom GitRepoOutsideChroot- & Ssh.hostKeys hostContext- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIS/hDYq1MAxfOBf49htym3BOYlx4Gk9SDpiHjv7u6IC")- ]- & Ssh.userKeys (User "joey") hostContext- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAYgEgsDmN26goPBGPN0HIvtkZfxlc996nPfBPDWxGuh")- ]-- & JoeySites.house- (User "joey")- hosts- (Context "house.joeyh.name")- (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMAmVYddg/RgCbIj+cLcEiddeFXaYFnbEJ3uGj9G/EyV joey@honeybee")- & JoeySites.connectStarlinkRouter- & JoeySites.homeRouter- & JoeySites.homeNAS- & Apt.installed ["mtr-tiny", "iftop", "screen", "nmap"]- -- Currently manually building the xr_usb_serial module.- & Apt.installed ["linux-headers-armmp-lpae"]- & Postfix.satellite-- & check (not <$> hasContainerCapability Systemd.FilesystemContained) - (setupRevertableProperty autobuilder)- -- In case compiler needs more than available ram- & Apt.serviceInstalledRunning "swapspace"- where- autobuilder = Systemd.nspawned $ GitAnnexBuilder.autoBuilderContainer- (GitAnnexBuilder.armAutoBuilder GitAnnexBuilder.standardAutoBuilder)- Testing ARMEL Nothing (Cron.Times "15 15 * * *") "10h"---- This is not a complete description of kite, since it's a--- multiuser system with eg, user passwords that are not deployed--- with propellor.-kite :: Host-kite = host "kite.kitenet.net" $ props- & standardSystemUnhardened Testing X86_64 [ "Welcome to kite!" ]- & ipv4 "66.228.36.95"- -- disabled because I've had complaints of mail bouncing, and it- -- seems mail servers are only trying ipv6 and then bouncing if- -- they have an ipv6 routing issue.- -- & ipv6 "2600:3c03::f03c:91ff:fe73:b0d2"- & alias "kitenet.net"- & Ssh.hostKeys (Context "kitenet.net")- [ (SshDsa, "ssh-dss AAAAB3NzaC1kc3MAAACBAO9tnPUT4p+9z7K6/OYuiBNHaij4Nzv5YVBih1vMl+ALz0gYAj8RWJzXmqp5buFAyfgOoLw+H9s1bBS01Sy3i07Dm6cx1fWG4RXL/E/3w1tavX99GD2bBxDBu890ebA5Tp+eFRJkS9+JwSvFiF6CP7NbVjifCagoUO56Ig048RwDAAAAFQDPY2xM3q6KwsVQliel23nrd0rV2QAAAIEAga3hj1hL00rYPNnAUzT8GAaSP62S4W68lusErH+KPbsMwFBFY/Ib1FVf8k6Zn6dZLh/HH/RtJi0JwdzPI1IFW+lwVbKfwBvhQ1lw9cH2rs1UIVgi7Wxdgfy8gEWxf+QIqn62wG+Ulf/HkWGvTrRpoJqlYRNS/gnOWj9Z/4s99koAAACBAM/uJIo2I0nK15wXiTYs/NYUZA7wcErugFn70TRbSgduIFH6U/CQa3rgHJw9DCPCQJLq7pwCnFH7too/qaK+czDk04PsgqV0+Jc7957gU5miPg50d60eJMctHV4eQ1FpwmGGfXxRBR9k2ZvikWYatYir3L6/x1ir7M0bA9IzNU45")- , (SshRsa, "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA2QAJEuvbTmaN9ex9i9bjPhMGj+PHUYq2keIiaIImJ+8mo+yKSaGUxebG4tpuDPx6KZjdycyJt74IXfn1voGUrfzwaEY9NkqOP3v6OWTC3QeUGqDCeJ2ipslbEd9Ep9XBp+/ldDQm60D0XsIZdmDeN6MrHSbKF4fXv1bqpUoUILk=")- , (SshEcdsa, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLF+dzqBJZix+CWUkAd3Bd3cofFCKwHMNRIfwx1G7dL4XFe6fMKxmrNetQcodo2edyufwoPmCPr3NmnwON9vyh0=")- , (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZftKMnH/zH29BHMKbcBO4QsgTrstYFVhbrzrlRzBO3")- ]-- & Network.preserveStatic "eth0" `requires` Network.cleanInterfacesFile- & Apt.installed ["linux-image-amd64"]- & Apt.serviceInstalledRunning "swapspace"- & Linode.serialGrub- & Linode.locateEnabled- & Apt.unattendedUpgrades- & Systemd.installed- & Systemd.persistentJournal- & Journald.systemMaxUse "500MiB"- & Ssh.passwordAuthentication True- & Fail2Ban.installed -- since ssh password authentication is allowed- -- Allow ssh -R to forward ports via kite- & Ssh.setSshdConfig "GatewayPorts" "clientspecified"- & Apt.serviceInstalledRunning "ntp"- & "/etc/timezone" `File.hasContent` ["US/Eastern"]- - & Borg.backup "/" (JoeySites.rsyncNetBorgRepo "kite.borg" []) Cron.Daily- [ "--exclude=/proc/*"- , "--exclude=/sys/*"- , "--exclude=/run/*"- , "--exclude=/mnt/*"- , "--exclude=/tmp/*"- , "--exclude=/var/tmp/*"- , "--exclude=/var/cache/*"- , "--exclude=/var/lib/swapspace/*"- , "--exclude=/var/lib/container/*"- , "--exclude=/home/joey/lib"- -- These directories are backed up and restored separately.- , "--exclude=/srv/git"- ]- [ Borg.KeepDays 7- , Borg.KeepWeeks 4- , Borg.KeepMonths 3- ]- `requires` Ssh.knownHost hosts "usw-s002.rsync.net" (User "root")- `requires` Ssh.userKeys (User "root")- (Context "kite.kitenet.net")- [ (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKyciu8E8qspcO8lnTSUBAxUdYfmk7FaFlvT5yxUaP+0 root@kite")- ]-- & alias "smtp.kitenet.net"- & alias "imap.kitenet.net"- & alias "pop.kitenet.net"- & alias "mail.kitenet.net"- & JoeySites.kiteMailServer-- & JoeySites.legacyWebSites- & File.ownerGroup "/srv/web" (User "joey") (Group "joey")- & Apt.installed ["analog"]-- & alias "git.kitenet.net"- & alias "git.joeyh.name"- & JoeySites.gitServer hosts-- & JoeySites.downloads- & JoeySites.gitAnnexDistributor- & JoeySites.tmp-- & Apt.installed- [ "git-annex", "myrepos"- , "build-essential", "make"- , "rss2email", "chewmail"- , "devscripts"- -- Some users have zsh as their login shell.- , "zsh"- ]-- & alias "znc.kitenet.net"- & JoeySites.ircBouncer-- & alias "kgb.kitenet.net"- & JoeySites.kgbServer- - & Systemd.nspawned ancientKitenet- - & alias "podcatcher.kitenet.net"- & JoeySites.podcatcher-- & alias "ns4.kitenet.net"- & myDnsPrimary "kitenet.net"- [ (RelDomain "mouse-onion", CNAME $ AbsDomain "htieo6yu2qtcn2j3.onion")- , (RelDomain "beaver-onion", CNAME $ AbsDomain "tl4xsvaxryjylgxs.onion")- , (RelDomain "peregrine-onion", CNAME $ AbsDomain "rsdwvaabir6ty2kdzblq7wdda26ib4fuc6hzxzwum75jbn6thqbojvid.onion")- , (RelDomain "sow-onion", CNAME $ AbsDomain "urt4g2tq32qktgtp.onion")- ]- & myDnsPrimary "joeyh.name" []- & myDnsPrimary "ikiwiki.info" []- ! myDnsPrimary "olduse.net"- [ (RelDomain "article", CNAME $ AbsDomain "virgil.koldfront.dk")- ]- ! myDnsPrimary "quarantimer.app" []- & alias "ns4.branchable.com"- & branchableSecondary- -- Use its own name server (amoung other things this avoids- -- spamassassin URIBL_BLOCKED.- & "/etc/resolv.conf" `File.hasContent`- [ "nameserver 127.0.0.1"- , "domain kitenet.net"- , "search kitenet.net"- ]- - & alias "debug-me.joeyh.name"- & Apt.installed ["debug-me", "debug-me-server"]- & Systemd.enabled "debug-me"-- -- testing- & Apache.httpsVirtualHost "letsencrypt.joeyh.name" "/var/www/html"- (LetsEncrypt.AgreeTOS (Just "id@joeyh.name"))- & alias "letsencrypt.joeyh.name"--beaver :: Host-beaver = host "beaver.kitenet.net" $ props- & Apt.installed ["ssh"]- & Ssh.hostPubKey SshDsa "ssh-dss AAAAB3NzaC1kc3MAAACBAIrLX260fY0Jjj/p0syNhX8OyR8hcr6feDPGOj87bMad0k/w/taDSOzpXe0Wet7rvUTbxUjH+Q5wPd4R9zkaSDiR/tCb45OdG6JsaIkmqncwe8yrU+pqSRCxttwbcFe+UU+4AAcinjVedZjVRDj2rRaFPc9BXkPt7ffk8GwEJ31/AAAAFQCG/gOjObsr86vvldUZHCteaJttNQAAAIB5nomvcqOk/TD07DLaWKyG7gAcW5WnfY3WtnvLRAFk09aq1EuiJ6Yba99Zkb+bsxXv89FWjWDg/Z3Psa22JMyi0HEDVsOevy/1sEQ96AGH5ijLzFInfXAM7gaJKXASD7hPbVdjySbgRCdwu0dzmQWHtH+8i1CMVmA2/a5Y/wtlJAAAAIAUZj2US2D378jBwyX1Py7e4sJfea3WSGYZjn4DLlsLGsB88POuh32aOChd1yzF6r6C2sdoPBHQcWBgNGXcx4gF0B5UmyVHg3lIX2NVSG1ZmfuLNJs9iKNu4cHXUmqBbwFYQJBvB69EEtrOw4jSbiTKwHFmqdA/mw1VsMB+khUaVw=="- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)--sow :: Host-sow = host "sow.kitenet.net" $ props- & Apt.installed ["ssh"]- & Ssh.hostPubKey SshDsa "ssh-dss AAAAB3NzaC1kc3MAAACBAIrLX260fY0Jjj/p0syNhX8OyR8hcr6feDPGOj87bMad0k/w/taDSOzpXe0Wet7rvUTbxUjH+Q5wPd4R9zkaSDiR/tCb45OdG6JsaIkmqncwe8yrU+pqSRCxttwbcFe+UU+4AAcinjVedZjVRDj2rRaFPc9BXkPt7ffk8GwEJ31/AAAAFQCG/gOjObsr86vvldUZHCteaJttNQAAAIB5nomvcqOk/TD07DLaWKyG7gAcW5WnfY3WtnvLRAFk09aq1EuiJ6Yba99Zkb+bsxXv89FWjWDg/Z3Psa22JMyi0HEDVsOevy/1sEQ96AGH5ijLzFInfXAM7gaJKXASD7hPbVdjySbgRCdwu0dzmQWHtH+8i1CMVmA2/a5Y/wtlJAAAAIAUZj2US2D378jBwyX1Py7e4sJfea3WSGYZjn4DLlsLGsB88POuh32aOChd1yzF6r6C2sdoPBHQcWBgNGXcx4gF0B5UmyVHg3lIX2NVSG1ZmfuLNJs9iKNu4cHXUmqBbwFYQJBvB69EEtrOw4jSbiTKwHFmqdA/mw1VsMB+khUaVw=="- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)--mouse :: Host-mouse = host "mouse.kitenet.net" $ props- & ipv4 "67.223.19.96"- & Apt.installed ["ssh"]- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)--peregrine :: Host-peregrine = host "peregrine.kitenet.net" $ props- & Apt.installed ["ssh", "screen", "variety", "git-annex"]- & Tor.installed- & Tor.hiddenServiceAvailable "ssh" (Port 22)- & LightDM.autoLogin (User "desktop")---- Branchable is not completely deployed with propellor yet.-pell :: Host-pell = host "pell.branchable.com" $ props- & alias "branchable.com"- & ipv4 "66.228.46.55"- & ipv6 "2600:3c03::f03c:91ff:fedf:c0e5"+main :: IO ()+main = defaultMain hosts - -- All the websites I host at branchable that don't use- -- branchable.com dns.- & alias "www.kitenet.net"- & alias "joeyh.name"- & alias "www.joeyh.name"- & alias "campaign.joeyh.name"- & alias "ikiwiki.info"- & alias "www.ikiwiki.info"- & alias "git.ikiwiki.info"- & alias "l10n.ikiwiki.info"- & alias "dist-bugs.kitenet.net"- & alias "family.kitenet.net"+-- The hosts propellor knows about.+hosts :: [Host]+hosts =+ [ mybox+ ] - & osDebian (Stable "buster") X86_32- & Apt.installed ["linux-image-686-pae"]- & Apt.stdSourcesList `onChange` Apt.upgrade+-- An example host.+mybox :: Host+mybox = host "mybox.example.com" $ props+ & osDebian Unstable X86_64+ & Apt.stdSourcesList & Apt.unattendedUpgrades- & Branchable.server hosts- & Linode.serialGrub---- --' __|II| ,.- ---- __|II|II|__ ( \_,/\---'-------'\o/-'-.-'-.-'-.- __|II|II|II|II|___/ __/ -'-.-'-.-'-.-'-.-'-.-'---------------------------- | [Containers] / ----------------------------------------------------- : / ------------------------------------------------------- \____, o ,' --------------------------------------------------------- '--,___________,' --------------------------------- Exhibit: kite's 90's website on port 1994.-ancientKitenet :: Systemd.Container-ancientKitenet = Systemd.debContainer "ancient-kitenet" $ props- & standardContainer (Stable "buster")- & alias hn- & Git.cloned (User "root") "git://kitenet-net.branchable.com/" "/var/www/html"- (Just "remotes/origin/old-kitenet.net")- & Apache.installed- & Apache.listenPorts [p]- & Apache.virtualHost hn p "/var/www/html"- & Apache.siteDisabled "000-default"- where- p = Port 1994- hn = "ancient.kitenet.net"--type Motd = [String]---- This is my standard system setup.-standardSystem :: DebianSuite -> Architecture -> Motd -> Property (HasInfo + Debian)-standardSystem suite arch motd =- standardSystemUnhardened suite arch motd- `before` Ssh.noPasswords--standardSystemUnhardened :: DebianSuite -> Architecture -> Motd -> Property (HasInfo + Debian)-standardSystemUnhardened suite arch motd = propertyList "standard system" $ props- & osDebian suite arch- & Hostname.sane- & Hostname.mailname- & Hostname.searchDomain- & Locale.available "en_US.UTF-8"- & File.hasContent "/etc/motd" ("":motd++[""])- & Apt.stdSourcesList `onChange` Apt.upgrade- & Apt.cacheCleaned & Apt.installed ["etckeeper"]- & Apt.installed ["ssh", "mosh"]- & GitHome.installedFor (User "root")+ & Apt.installed ["ssh"] & User.hasSomePassword (User "root")- & User.accountFor (User "joey")- & User.hasSomePassword (User "joey")- & Sudo.enabledFor (User "joey")- & GitHome.installedFor (User "joey")- & Apt.installed ["vim", "screen", "less"]+ & File.dirExists "/var/www" & Cron.runPropellor (Cron.Times "30 * * * *")- -- I use postfix, or no MTA.- & JoeySites.noExim---- This is my standard container setup, Featuring automatic upgrades.-standardContainer :: DebianSuite -> Property (HasInfo + Debian)-standardContainer suite = propertyList "standard container" $ props- & osDebian suite X86_64- -- Do not want to run mail daemon inside a random container..- & JoeySites.noExim- & Apt.stdSourcesList `onChange` Apt.upgrade- & Apt.unattendedUpgrades- & Apt.cacheCleaned--branchableSecondary :: RevertableProperty (HasInfo + DebianLike) DebianLike-branchableSecondary = Dns.secondaryFor ["branchable.com"] hosts "branchable.com"---- Currently using kite (ns4) as primary with gandi as secondary--- kite handles all mail.-myDnsPrimary :: Domain -> [(BindDomain, Record)] -> RevertableProperty (HasInfo + DebianLike) DebianLike-myDnsPrimary domain extras = Dns.signedPrimary (Weekly Nothing) hosts domain- (Dns.mkSOA "ns4.kitenet.net" 100) $- [ (RootDomain, NS $ AbsDomain "ns4.kitenet.net")- , (RootDomain, NS $ AbsDomain "ns6.gandi.net")- , (RootDomain, MX 0 $ AbsDomain "kitenet.net")- , (RootDomain, TXT "v=spf1 a a:kitenet.net ~all")- , JoeySites.domainKey- ] ++ extras---- Systems I don't manage with propellor,--- but do want to track their public keys etc.-monsters :: [Host]-monsters =- [ host "usw-s002.rsync.net" $ props- & Ssh.hostPubKey SshEd25519 "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB7yTEBGfQYdwG/oeL+U9XPMIh/dW7XNs9T+M79YIOrd"- , host "ns6.gandi.net" $ props- & ipv4 "217.70.177.40"- ]---- -- o- -- ___ o o- {-----\ / o \ ___o o- { \ __ \ / _ (X___>-- __o- _____________________{ ______\___ \__/ | \__/ \____ |X__>- < \___//|\\___/\ \____________ _- \ ___/ | \___ # # \ (-)- \ O O O # | \ # >=)- \______________________________# # / #__________________/ (-}--
propellor.cabal view
@@ -1,5 +1,5 @@ Name: propellor-Version: 5.14+Version: 5.14.1 Cabal-Version: 1.20 License: BSD2 Maintainer: Joey Hess <id@joeyh.name>