Merge branch 'joeyconfig'

Conflicts:
	privdata.joey/privdata.gpg
This commit is contained in:
Joey Hess 2015-05-22 14:16:16 -04:00
commit 53f2646c45
8 changed files with 130 additions and 30 deletions

View File

@ -31,6 +31,7 @@ import qualified Propellor.Property.HostingProvider.Linode as Linode
import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitHome as GitHome
import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder
import qualified Propellor.Property.SiteSpecific.IABak as IABak import qualified Propellor.Property.SiteSpecific.IABak as IABak
import qualified Propellor.Property.SiteSpecific.Branchable as Branchable
import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites
@ -47,6 +48,7 @@ hosts = -- (o) `
, kite , kite
, elephant , elephant
, beaver , beaver
, pell
, iabak , iabak
] ++ monsters ] ++ monsters
@ -311,6 +313,30 @@ beaver = host "beaver.kitenet.net"
& Cron.niceJob "system disk backed up" Cron.Weekly (User "root") "/" & Cron.niceJob "system disk backed up" Cron.Weekly (User "root") "/"
"rsync -a -x / /home/joey/lib/backup/beaver.kitenet.net/" "rsync -a -x / /home/joey/lib/backup/beaver.kitenet.net/"
-- Branchable is not completely deployed with propellor yet.
pell :: Host
pell = host "pell.branchable.com"
& ipv4 "66.228.46.55"
& ipv6 "2600:3c03::f03c:91ff:fedf:c0e5"
-- All the websites I host at branchable that don't use
-- branchable.com dns.
& alias "olduse.net"
& alias "www.olduse.net"
& alias "www.kitenet.net"
& alias "joeyh.name"
& alias "campaign.joeyh.name"
& alias "ikiwiki.info"
& alias "git.ikiwiki.info"
& alias "l10n.ikiwiki.info"
& alias "dist-bugs.kitenet.net"
& alias "family.kitenet.net"
& Apt.installed ["linux-image-amd64"]
& Linode.chainPVGrub 5
& Apt.unattendedUpgrades
& Branchable.server hosts
iabak :: Host iabak :: Host
iabak = host "iabak.archiveteam.org" iabak = host "iabak.archiveteam.org"
& ipv4 "124.6.40.227" & ipv4 "124.6.40.227"
@ -338,6 +364,7 @@ iabak = host "iabak.archiveteam.org"
& IABak.gitServer monsters & IABak.gitServer monsters
& IABak.registrationServer monsters & IABak.registrationServer monsters
& IABak.graphiteServer & IABak.graphiteServer
& IABak.publicFace
where where
admins = map User ["joey", "db48x"] admins = map User ["joey", "db48x"]
@ -491,19 +518,6 @@ monsters = -- but do want to track their public keys etc.
& ipv6 "2001:4978:f:2d9::2" & ipv6 "2001:4978:f:2d9::2"
, host "mouse.kitenet.net" , host "mouse.kitenet.net"
& ipv6 "2001:4830:1600:492::2" & ipv6 "2001:4830:1600:492::2"
, host "branchable.com"
& ipv4 "66.228.46.55"
& ipv6 "2600:3c03::f03c:91ff:fedf:c0e5"
& alias "olduse.net"
& alias "www.olduse.net"
& alias "www.kitenet.net"
& alias "joeyh.name"
& alias "campaign.joeyh.name"
& alias "ikiwiki.info"
& alias "git.ikiwiki.info"
& alias "l10n.ikiwiki.info"
& alias "dist-bugs.kitenet.net"
& alias "family.kitenet.net"
, host "animx" , host "animx"
& ipv4 "76.7.162.101" & ipv4 "76.7.162.101"
& ipv4 "76.7.162.186" & ipv4 "76.7.162.186"

View File

@ -110,6 +110,8 @@ Library
Propellor.Property.SiteSpecific.GitHome Propellor.Property.SiteSpecific.GitHome
Propellor.Property.SiteSpecific.JoeySites Propellor.Property.SiteSpecific.JoeySites
Propellor.Property.SiteSpecific.GitAnnexBuilder Propellor.Property.SiteSpecific.GitAnnexBuilder
Propellor.Property.SiteSpecific.Branchable
Propellor.Property.SiteSpecific.IABak
Propellor.PropAccum Propellor.PropAccum
Propellor.CmdLine Propellor.CmdLine
Propellor.Info Propellor.Info

View File

@ -1,4 +1,4 @@
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleContexts, TypeSynonymInstances, FlexibleInstances #-}
-- | Docker support for propellor -- | Docker support for propellor
-- --
@ -18,7 +18,8 @@ module Propellor.Property.Docker (
tweaked, tweaked,
Image, Image,
ContainerName, ContainerName,
Container(..), Container,
HasImage(..),
-- * Container configuration -- * Container configuration
dns, dns,
hostname, hostname,
@ -79,10 +80,16 @@ configured = prop `requires` installed
type ContainerName = String type ContainerName = String
-- | A docker container. -- | A docker container.
data Container = Container data Container = Container Image Host
{ containerImage :: Image
, containerHost :: Host class HasImage a where
} getImageName :: a -> Image
instance HasImage Image where
getImageName = id
instance HasImage Container where
getImageName (Container i _) = i
instance PropAccum Container where instance PropAccum Container where
(Container i h) & p = Container i (h & p) (Container i h) & p = Container i (h & p)
@ -142,19 +149,21 @@ docked ctr@(Container _ h) =
] ]
-- | Build the image from a directory containing a Dockerfile. -- | Build the image from a directory containing a Dockerfile.
imageBuilt :: FilePath -> Image -> Property NoInfo imageBuilt :: HasImage c => FilePath -> c -> Property NoInfo
imageBuilt directory image = describe built msg imageBuilt directory ctr = describe built msg
where where
msg = "docker image " ++ image ++ " built from " ++ directory msg = "docker image " ++ image ++ " built from " ++ directory
built = Cmd.cmdProperty' dockercmd ["build", "--tag", image, "./"] workDir built = Cmd.cmdProperty' dockercmd ["build", "--tag", image, "./"] workDir
workDir p = p { cwd = Just directory } workDir p = p { cwd = Just directory }
image = getImageName ctr
-- | Pull the image from the standard Docker Hub registry. -- | Pull the image from the standard Docker Hub registry.
imagePulled :: Image -> Property NoInfo imagePulled :: HasImage c => c -> Property NoInfo
imagePulled image = describe pulled msg imagePulled ctr = describe pulled msg
where where
msg = "docker image " ++ image ++ " pulled" msg = "docker image " ++ image ++ " pulled"
pulled = Cmd.cmdProperty dockercmd ["pull", image] pulled = Cmd.cmdProperty dockercmd ["pull", image]
image = getImageName ctr
propigateContainerInfo :: (IsProp (Property i)) => Container -> Property i -> Property HasInfo propigateContainerInfo :: (IsProp (Property i)) => Container -> Property i -> Property HasInfo
propigateContainerInfo ctr@(Container _ h) p = propigateContainer ctr p' propigateContainerInfo ctr@(Container _ h) p = propigateContainer ctr p'

View File

@ -9,7 +9,7 @@ import qualified Propellor.Property.Reboot as Reboot
import Data.List import Data.List
-- Digital Ocean does not provide any way to boot -- | Digital Ocean does not provide any way to boot
-- the kernel provided by the distribution, except using kexec. -- the kernel provided by the distribution, except using kexec.
-- Without this, some old, and perhaps insecure kernel will be used. -- Without this, some old, and perhaps insecure kernel will be used.
-- --
@ -40,7 +40,7 @@ runningInstalledKernel = do
findVersion kernelver <$> findVersion kernelver <$>
readProcess "file" ("-L" : kernelimages) readProcess "file" ("-L" : kernelimages)
-- File output looks something like this, we want to unambiguously -- | File output looks something like this, we want to unambiguously
-- match the running kernel version: -- match the running kernel version:
-- Linux kernel x86 boot executable bzImage, version 3.16-3-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 3.1, RO-rootFS, swap_dev 0x2, Normal VGA -- Linux kernel x86 boot executable bzImage, version 3.16-3-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 3.1, RO-rootFS, swap_dev 0x2, Normal VGA
findVersion :: String -> String -> Bool findVersion :: String -> String -> Bool

View File

@ -6,7 +6,7 @@ import qualified Propellor.Property.File as File
import Utility.FileMode import Utility.FileMode
-- | Linode's pv-grub-x86_64 does not currently support booting recent -- | Linode's pv-grub-x86_64 does not currently support booting recent
-- Debian kernels compressed with xz. This sets up pv-grub chaing to enable -- Debian kernels compressed with xz. This sets up pv-grub chaining to enable
-- it. -- it.
chainPVGrub :: Grub.TimeoutSecs -> Property NoInfo chainPVGrub :: Grub.TimeoutSecs -> Property NoInfo
chainPVGrub = Grub.chainPVGrub "hd0" "xen/xvda" chainPVGrub = Grub.chainPVGrub "hd0" "xen/xvda"

View File

@ -0,0 +1,66 @@
module Propellor.Property.SiteSpecific.Branchable where
import Propellor
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.File as File
import qualified Propellor.Property.User as User
import qualified Propellor.Property.Ssh as Ssh
import qualified Propellor.Property.Postfix as Postfix
import qualified Propellor.Property.Gpg as Gpg
import qualified Propellor.Property.Sudo as Sudo
server :: [Host] -> Property HasInfo
server hosts = propertyList "branchable server" $ props
& "/etc/timezone" `File.hasContent` ["Etc/UTC"]
& "/etc/locale.gen" `File.containsLines`
[ "en_GB.UTF-8 UTF-8"
, "en_US.UTF-8 UTF-8"
, "fi_FI.UTF-8 UTF-8"
]
`onChange` cmdProperty "locale-gen" []
& Apt.installed ["etckeeper", "ssh", "popularity-contest"]
& Apt.serviceInstalledRunning "apache2"
& Apt.serviceInstalledRunning "ntp"
& Apt.serviceInstalledRunning "openssh-server"
& Ssh.passwordAuthentication False
& Ssh.hostKeys (Context "branchable.com")
[ (SshDsa, "ssh-dss AAAAB3NzaC1kc3MAAACBAK9HnfpyIm8aEhKuF5oz6KyaLwFs2oWeToVkqVuykyy5Y8jWDZPtkpv+1TeOnjcOvJSZ1cCqB8iXlsP9Dr5z98w5MfzsRQM2wIw0n+wvmpPmUhjVdGh+wTpfP9bcyFHhj/f1Ymdq9hEWB26bnf4pbTbJW2ip8ULshMvn5CQ/ugV3AAAAFQCAjpRd1fquRiIuLJMwej0VcyoZKQAAAIBe91Grvz/icL3nlqXYrifXyr9dsw8bPN+BMu+hQtFsQXNJBylxwf8FtbRlmvZXmRjdVYqFVyxSsrL2pMsWlds51iXOr9pdsPG5a4OgJyRHsveBz3tz6HgYYPcr3Oxp7C6G6wrzwsaGK862SgRp/bbD226k9dODRBy3ogMhk/MvAgAAAIEApfknql3vZbDVa88ZnwbNKDOv8L1hb6blbKAMt2vJbqJMvu3EP9CsP9hGyEQh5YCAl2F9KEU3bJXN1BG76b7CiYtWK95lpL1XmCCWnJBCcdEhw998GfJS424frPw7qGmXLxJKYxEyioB90/IDp2dC+WaLcLOYHM9SroCQTIK5A1g= root@pell")
, (SshRsa, "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1M0aNLgcgcgf0tkmt/8vCDZLok8Xixz7Nun9wB6NqVXxfzAR4te+zyO7FucVwyTY5QHmiwwpmyNfaC21AAILhXGm12SUKSAirF9BkQk7bhQuz4T/dPlEt3d3SxQ3OZlXtPp4LzXWOyS0OXSzIb+HeaDA+hFXlQnp/gE7RyAzR1+xhWPO7Mz1q5O/+4dXANnW32t6P7Puob6NsglVDpLrMRYjkO+0RgCVbYMzB5+UnkthkZsIINaYwsNhW2GKMKbRZeyp5en5t1NJprGXdw0BqdBqd/rcBpOxmhHE1U7rw+GS1uZwCFWWv0aZbaXEJ6wY7mETFkqs0QXi5jtoKn95Gw== root@pell")
]
& Apt.installed ["procmail", "bsd-mailx"]
& "/etc/aliases" `File.hasPrivContentExposed` (Context "branchable.com")
`onChange` Postfix.newaliases
& "/etc/mailname" `File.hasContent` ["branchable.com"]
& Postfix.installed
& Postfix.mainCf ("mailbox_command", "procmail -a \"$EXTENSION\"")
-- Obnam is run by a cron job in ikiwiki-hosting.
& "/etc/obnam.conf" `File.hasContent`
[ "[config]"
, "repository = sftp://joey@eubackup.kitenet.net/home/joey/lib/backup/pell.obnam"
, "log = /var/log/obnam.log"
, "encrypt-with = " ++ obnamkey
, "log-level = info"
, "log-max = 1048576"
, "keep = 7d,5w,12m"
, "upload-queue-size = 128"
, "lru-size = 128"
]
& Gpg.keyImported (Gpg.GpgKeyId obnamkey) (User "root")
& Ssh.keyImported SshRsa (User "root") (Context "branchable.com")
& Ssh.knownHost hosts "eubackup.kitenet.net" (User "root")
& Ssh.knownHost hosts "usw-s002.rsync.net" (User "root")
& adminuser "joey"
& adminuser "liw"
where
obnamkey = "41E1A9B9"
adminuser u = propertyList ("admin user " ++ u) $ props
& User.accountFor (User u)
& User.hasSomePassword (User u)
& Sudo.enabledFor (User u)
& User.hasGroup (User u) (Group "adm")
& User.hasGroup (User u) (Group "systemd-journal")

View File

@ -15,6 +15,13 @@ repo = "https://github.com/ArchiveTeam/IA.BAK/"
userrepo :: String userrepo :: String
userrepo = "git@gitlab.com:archiveteam/IA.bak.users.git" userrepo = "git@gitlab.com:archiveteam/IA.bak.users.git"
publicFace :: Property HasInfo
publicFace = propertyList "iabak public face" $ props
& Git.cloned (User "root") repo "/usr/local/IA.BAK" (Just "server")
& Apt.serviceInstalledRunning "apache2"
& Cron.niceJob "graph-gen" (Cron.Times "*/10 * * * *") (User "root") "/"
"/usr/local/IA.BAK/web/graph-gen.sh"
gitServer :: [Host] -> Property HasInfo gitServer :: [Host] -> Property HasInfo
gitServer knownhosts = propertyList "iabak git server" $ props gitServer knownhosts = propertyList "iabak git server" $ props
& Git.cloned (User "root") repo "/usr/local/IA.BAK" (Just "server") & Git.cloned (User "root") repo "/usr/local/IA.BAK" (Just "server")
@ -56,12 +63,14 @@ graphiteServer = propertyList "iabak graphite server" $ props
[ "[carbon]" [ "[carbon]"
, "pattern = ^carbon\\." , "pattern = ^carbon\\."
, "retentions = 60:90d" , "retentions = 60:90d"
, "[iabak]" , "[iabak-connections]"
, "pattern = ^iabak\\.shardstats\\.connections"
, "retentions = 1h:1y,3h:10y"
, "[iabak-default]"
, "pattern = ^iabak\\." , "pattern = ^iabak\\."
, "retentions = 10m:30d,1h:1y,3h,10y" , "retentions = 10m:30d,1h:1y,3h:10y"
, "[default_1min_for_1day]" , "[default_1min_for_1day]"
, "pattern = .*" , "pattern = .*"
, "retentions = 60s:1d"
] ]
& graphiteCSRF & graphiteCSRF
& cmdProperty "graphite-manage" ["syncdb", "--noinput"] `flagFile` "/etc/flagFiles/graphite-syncdb" & cmdProperty "graphite-manage" ["syncdb", "--noinput"] `flagFile` "/etc/flagFiles/graphite-syncdb"

View File

@ -470,7 +470,7 @@ backupsBackedupFrom hosts srchost destdir = Cron.niceJob desc
`requires` Ssh.knownHost hosts srchost (User "joey") `requires` Ssh.knownHost hosts srchost (User "joey")
where where
desc = "backups copied from " ++ srchost ++ " on boot" desc = "backups copied from " ++ srchost ++ " on boot"
cmd = "rsync -az --bwlimit=300K --partial --delete " ++ srchost ++ ":lib/backup/ " ++ destdir </> srchost cmd = "sleep 30m && rsync -az --bwlimit=300K --partial --delete " ++ srchost ++ ":lib/backup/ " ++ destdir </> srchost
obnamRepos :: [String] -> Property NoInfo obnamRepos :: [String] -> Property NoInfo
obnamRepos rs = propertyList ("obnam repos for " ++ unwords rs) obnamRepos rs = propertyList ("obnam repos for " ++ unwords rs)