summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config-joey.hs68
-rw-r--r--debian/changelog10
-rw-r--r--privdata/privdata.gpg865
-rw-r--r--propellor.cabal7
-rw-r--r--src/Propellor/CmdLine.hs10
-rw-r--r--src/Propellor/PrivData.hs16
-rw-r--r--src/Propellor/Property/Grub.hs39
-rw-r--r--src/Propellor/Property/HostingProvider/Linode.hs10
-rw-r--r--src/Propellor/Property/Ssh.hs11
9 files changed, 559 insertions, 477 deletions
diff --git a/config-joey.hs b/config-joey.hs
index 783c548f..18f0a32b 100644
--- a/config-joey.hs
+++ b/config-joey.hs
@@ -21,8 +21,10 @@ import qualified Propellor.Property.Git as Git
import qualified Propellor.Property.Apache as Apache
import qualified Propellor.Property.Postfix as Postfix
import qualified Propellor.Property.Service as Service
+import qualified Propellor.Property.Grub as Grub
import qualified Propellor.Property.HostingProvider.DigitalOcean as DigitalOcean
import qualified Propellor.Property.HostingProvider.CloudAtCost as CloudAtCost
+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.JoeySites as JoeySites
@@ -34,7 +36,6 @@ main = defaultMain hosts -- / \___-=O`/|O`/__| (____.'
Deployed -} -- `/-==__ _/__|/__=-| ( \_
hosts :: [Host] -- * \ | | '--------'
hosts = -- (o) `
- -- My laptop
[ host "darkstar.kitenet.net"
& ipv6 "2001:4830:1600:187::2" -- sixxs tunnel
@@ -42,8 +43,8 @@ hosts = -- (o) `
& Docker.configured
& Docker.docked hosts "android-git-annex"
- -- Unreliable server.
, standardSystem "clam.kitenet.net" Unstable "amd64"
+ [ "Unreliable server. Anything here may be lost at any time!" ]
& ipv4 "162.248.9.29"
& CloudAtCost.decruft
@@ -57,6 +58,7 @@ hosts = -- (o) `
-- Orca is the main git-annex build box.
, standardSystem "orca.kitenet.net" Unstable "amd64"
+ [ "Main git-annex build box." ]
& ipv4 "138.38.108.179"
& Hostname.sane
@@ -71,16 +73,27 @@ hosts = -- (o) `
& Docker.garbageCollected `period` Daily
& Apt.buildDep ["git-annex"] `period` Daily
- -- Important stuff that needs not too much memory or CPU.
- , let ctx = Context "diatom.kitenet.net"
- in standardSystem "diatom.kitenet.net" Stable "amd64"
+ , standardSystem "kite.kitenet.net" Unstable "amd64"
+ [ "Welcome to the new kitenet.net server!"
+ , "This is still under construction and not yet live.."
+ ]
+ & ipv4 "66.228.36.95"
+ & ipv6 "2600:3c03::f03c:91ff:fe73:b0d2"
+
+ & Apt.installed ["linux-image-amd64"]
+ & Linode.chainPVGrub 5
+ & Hostname.sane
+ & Apt.unattendedUpgrades
+ & Apt.installed ["systemd"]
+ & Ssh.hostKeys (Context "kitenet.net")
+
+ , standardSystem "diatom.kitenet.net" Stable "amd64"
+ [ "Important stuff that needs not too much memory or CPU." ]
& ipv4 "107.170.31.195"
& DigitalOcean.distroKernel
& Hostname.sane
- & Ssh.hostKey SshDsa ctx
- & Ssh.hostKey SshRsa ctx
- & Ssh.hostKey SshEcdsa ctx
+ & Ssh.hostKeys (Context "diatom.kitenet.net")
& Apt.unattendedUpgrades
& Apt.serviceInstalledRunning "ntp"
& Postfix.satellite
@@ -133,36 +146,18 @@ hosts = -- (o) `
& Dns.secondaryFor ["animx"] hosts "animx.eu.org"
- -- storage and backup server
, let ctx = Context "elephant.kitenet.net"
in standardSystem "elephant.kitenet.net" Unstable "amd64"
+ [ "Storage, big data, and backups, omnomnom!" ]
& ipv4 "193.234.225.114"
+ & Grub.chainPVGrub "hd0,0" "xen/xvda1" 30
& Hostname.sane
& Postfix.satellite
& Apt.unattendedUpgrades
- & Ssh.hostKey SshDsa ctx
- & Ssh.hostKey SshRsa ctx
- & Ssh.hostKey SshEcdsa ctx
+ & Ssh.hostKeys ctx
& Ssh.keyImported SshRsa "joey" ctx
-
- -- PV-grub chaining
- -- http://notes.pault.ag/linode-pv-grub-chainning/
- -- (Adapted to use xvda1/hd0,0 instead of xvda/hd0)
- & "/boot/grub/menu.lst" `File.hasContent`
- [ "default 1"
- , "timeout 30"
- , ""
- , "title grub-xen shim"
- , "root (hd0,0)"
- , "kernel /boot/xen-shim"
- , "boot"
- ]
- & "/boot/load.cf" `File.hasContent`
- [ "configfile (xen/xvda1)/boot/grub/grub.cfg" ]
- & Apt.installed ["grub-xen"]
- & flagFile (scriptProperty ["update-grub; grub-mkimage --prefix '(xen/xvda1)/boot/grub' -c /boot/load.cf -O x86_64-xen /usr/lib/grub/x86_64-xen/*.mod > /boot/xen-shim"]) "/boot/xen-shim"
- `describe` "/boot-xen-shim"
+ & Apt.serviceInstalledRunning "swapspace"
& alias "eubackup.kitenet.net"
& Apt.installed ["obnam", "sshfs", "rsync"]
@@ -204,6 +199,11 @@ hosts = -- (o) `
-- block 22.
& "/etc/ssh/sshd_config" `File.containsLine` "Port 80"
`onChange` Service.restarted "ssh"
+
+ -- temp
+ & Docker.docked hosts "amd64-git-annex-builder"
+ & Docker.docked hosts "i386-git-annex-builder"
+ & Docker.docked hosts "android-git-annex-builder"
--' __|II| ,.
@@ -257,10 +257,13 @@ hosts = -- (o) `
-- temp for an acquantance
] ++ monsters
+type Motd = [String]
+
-- This is my standard system setup.
-standardSystem :: HostName -> DebianSuite -> Architecture -> Host
-standardSystem hn suite arch = host hn
+standardSystem :: HostName -> DebianSuite -> Architecture -> Motd -> Host
+standardSystem hn suite arch motd = host hn
& os (System (Debian suite) arch)
+ & File.hasContent "/etc/motd" ("":motd++[""])
& Apt.stdSourcesList `onChange` Apt.upgrade
& Apt.cacheCleaned
& Apt.installed ["etckeeper"]
@@ -352,7 +355,6 @@ monsters = -- but do want to track their public keys etc.
& ipv4 "80.68.85.49"
& ipv6 "2001:41c8:125:49::10"
& alias "kitenet.net"
- & alias "kite.kitenet.net"
& alias "ns1.kitenet.net"
& alias "ftp.kitenet.net"
& alias "mail.kitenet.net"
diff --git a/debian/changelog b/debian/changelog
index 3c84ac91..54923662 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+propellor (0.8.1) unstable; urgency=medium
+
+ * Run apt-get update in initial bootstrap.
+ * --list-fields now includes a table of fields that are not currently set,
+ but would be used if they got set.
+ * Remove .gitignore from cabal file list, to avoid build failure on Debian.
+ Closes: #754334
+
+ -- Joey Hess <joeyh@debian.org> Wed, 09 Jul 2014 22:11:31 -0400
+
propellor (0.8.0) unstable; urgency=medium
* Completely reworked privdata storage. There is now a single file,
diff --git a/privdata/privdata.gpg b/privdata/privdata.gpg
index 9cb56a98..afafeee5 100644
--- a/privdata/privdata.gpg
+++ b/privdata/privdata.gpg
@@ -1,434 +1,439 @@
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1
-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
-=KIFU
+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
+=6HOm
-----END PGP MESSAGE-----
diff --git a/propellor.cabal b/propellor.cabal
index 1c3c8681..50067b8d 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
Name: propellor
-Version: 0.8.0
+Version: 0.8.1
Cabal-Version: >= 1.6
License: BSD3
Maintainer: Joey Hess <joey@kitenet.net>
@@ -25,7 +25,6 @@ Extra-Source-Files:
debian/copyright
debian/rules
debian/lintian-overrides
- .gitignore
Synopsis: property-based host configuration management in haskell
Description:
Propellor enures that the system it's run in satisfies a list of
@@ -81,6 +80,7 @@ Library
Propellor.Property.File
Propellor.Property.Git
Propellor.Property.Gpg
+ Propellor.Property.Grub
Propellor.Property.Network
Propellor.Property.Obnam
Propellor.Property.OpenId
@@ -92,8 +92,9 @@ Library
Propellor.Property.Sudo
Propellor.Property.Tor
Propellor.Property.User
- Propellor.Property.HostingProvider.DigitalOcean
Propellor.Property.HostingProvider.CloudAtCost
+ Propellor.Property.HostingProvider.DigitalOcean
+ Propellor.Property.HostingProvider.Linode
Propellor.Property.SiteSpecific.GitHome
Propellor.Property.SiteSpecific.JoeySites
Propellor.Property.SiteSpecific.GitAnnexBuilder
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index 448e70d2..7b39cd24 100644
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -92,7 +92,7 @@ defaultMain hostlist = do
go False (Boot hn) = onlyProcess $ withhost hn boot
withhost :: HostName -> (Host -> IO ()) -> IO ()
- withhost hn a = maybe (unknownhost hn) a (findHost hostlist hn)
+ withhost hn a = maybe (unknownhost hn hostlist) a (findHost hostlist hn)
onlyProcess :: IO a -> IO a
onlyProcess a = bracket lock unlock (const a)
@@ -106,11 +106,12 @@ onlyProcess a = bracket lock unlock (const a)
alreadyrunning = error "Propellor is already running on this host!"
lockfile = localdir </> ".lock"
-unknownhost :: HostName -> IO a
-unknownhost h = errorMessage $ unlines
+unknownhost :: HostName -> [Host] -> IO a
+unknownhost h hosts = errorMessage $ unlines
[ "Propellor does not know about host: " ++ h
, "(Perhaps you should specify the real hostname on the command line?)"
, "(Or, edit propellor's config.hs to configure this host)"
+ , "Known hosts: " ++ unwords (map hostName hosts)
]
buildFirst :: CmdLine -> IO () -> IO ()
@@ -209,7 +210,8 @@ spin hn hst = do
bootstrapcmd = shellWrap $ intercalate " ; "
[ "if [ ! -d " ++ localdir ++ " ]"
, "then " ++ intercalate " && "
- [ "apt-get --no-install-recommends --no-upgrade -y install git make"
+ [ "apt-get update"
+ , "apt-get --no-install-recommends --no-upgrade -y install git make"
, "echo " ++ toMarked statusMarker (show NeedGitClone)
]
, "else " ++ intercalate " && "
diff --git a/src/Propellor/PrivData.hs b/src/Propellor/PrivData.hs
index c6e41b45..f85ded15 100644
--- a/src/Propellor/PrivData.hs
+++ b/src/Propellor/PrivData.hs
@@ -109,20 +109,24 @@ editPrivData field context = do
listPrivDataFields :: [Host] -> IO ()
listPrivDataFields hosts = do
m <- decryptPrivData
- putStrLn "\n"
- let usedby = M.unionsWith (++) $ map mkhostmap hosts
- let rows = map (mkrow usedby) (M.keys m)
- let table = tableWithHeader header rows
- putStr $ unlines $ formatTable table
+ showtable "Currently set data:" $
+ map mkrow (M.keys m)
+ showtable "Data that would be used if set:" $
+ map mkrow (M.keys $ M.difference wantedmap m)
where
header = ["Field", "Context", "Used by"]
- mkrow usedby k@(field, (Context context)) =
+ mkrow k@(field, (Context context)) =
[ shellEscape $ show field
, shellEscape context
, intercalate ", " $ sort $ fromMaybe [] $ M.lookup k usedby
]
mkhostmap host = M.fromList $ map (\k -> (k, [hostName host])) $
S.toList $ _privDataFields $ hostInfo host
+ usedby = M.unionsWith (++) $ map mkhostmap hosts
+ wantedmap = M.fromList $ zip (M.keys usedby) (repeat "")
+ showtable desc rows = do
+ putStrLn $ "\n" ++ desc
+ putStr $ unlines $ formatTable $ tableWithHeader header rows
setPrivDataTo :: PrivDataField -> Context -> PrivData -> IO ()
setPrivDataTo field context value = do
diff --git a/src/Propellor/Property/Grub.hs b/src/Propellor/Property/Grub.hs
new file mode 100644
index 00000000..841861f4
--- /dev/null
+++ b/src/Propellor/Property/Grub.hs
@@ -0,0 +1,39 @@
+module Propellor.Property.Grub where
+
+import Propellor
+import qualified Propellor.Property.File as File
+import qualified Propellor.Property.Apt as Apt
+
+-- | Eg, hd0,0 or xen/xvda1
+type GrubDevice = String
+
+type TimeoutSecs = Int
+
+-- | Use PV-grub chaining to boot
+--
+-- Useful when the VPS's pv-grub is too old to boot a modern kernel image.
+--
+-- http://notes.pault.ag/linode-pv-grub-chainning/
+--
+-- The rootdev should be in the form "hd0", while the bootdev is in the form
+-- "xen/xvda".
+chainPVGrub :: GrubDevice -> GrubDevice -> TimeoutSecs -> Property
+chainPVGrub rootdev bootdev timeout = combineProperties desc
+ [ File.dirExists "/boot/grub"
+ , "/boot/grub/menu.lst" `File.hasContent`
+ [ "default 1"
+ , "timeout " ++ show timeout
+ , ""
+ , "title grub-xen shim"
+ , "root (" ++ rootdev ++ ")"
+ , "kernel /boot/xen-shim"
+ , "boot"
+ ]
+ , "/boot/load.cf" `File.hasContent`
+ [ "configfile (" ++ bootdev ++ ")/boot/grub/grub.cfg" ]
+ , Apt.installed ["grub-xen"]
+ , flagFile (scriptProperty ["update-grub; grub-mkimage --prefix '(" ++ bootdev ++ ")/boot/grub' -c /boot/load.cf -O x86_64-xen /usr/lib/grub/x86_64-xen/*.mod > /boot/xen-shim"]) "/boot/xen-shim"
+ `describe` "/boot-xen-shim"
+ ]
+ where
+ desc = "chain PV-grub"
diff --git a/src/Propellor/Property/HostingProvider/Linode.hs b/src/Propellor/Property/HostingProvider/Linode.hs
new file mode 100644
index 00000000..34d72184
--- /dev/null
+++ b/src/Propellor/Property/HostingProvider/Linode.hs
@@ -0,0 +1,10 @@
+module Propellor.Property.HostingProvider.Linode where
+
+import Propellor
+import qualified Propellor.Property.Grub as Grub
+
+-- | 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
+-- it.
+chainPVGrub :: Grub.TimeoutSecs -> Property
+chainPVGrub = Grub.chainPVGrub "hd0" "xen/xvda"
diff --git a/src/Propellor/Property/Ssh.hs b/src/Propellor/Property/Ssh.hs
index 6785ede6..5a260476 100644
--- a/src/Propellor/Property/Ssh.hs
+++ b/src/Propellor/Property/Ssh.hs
@@ -5,6 +5,7 @@ module Propellor.Property.Ssh (
hasAuthorizedKeys,
restartSshd,
randomHostKeys,
+ hostKeys,
hostKey,
keyImported,
knownHost,
@@ -75,7 +76,15 @@ randomHostKeys = flagFile prop "/etc/ssh/.unique_host_keys"
ensureProperty $ scriptProperty
[ "DPKG_MAINTSCRIPT_NAME=postinst DPKG_MAINTSCRIPT_PACKAGE=openssh-server /var/lib/dpkg/info/openssh-server.postinst configure" ]
--- | Sets ssh host keys.
+-- | Sets all types of ssh host keys from the privdata.
+hostKeys :: Context -> Property
+hostKeys ctx = propertyList "known ssh host keys"
+ [ hostKey SshDsa ctx
+ , hostKey SshRsa ctx
+ , hostKey SshEcdsa ctx
+ ]
+
+-- | Sets a single ssh host key from the privdata.
hostKey :: SshKeyType -> Context -> Property
hostKey keytype context = combineProperties desc
[ installkey (SshPubKey keytype "") (install writeFile ".pub")