summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog83
-rw-r--r--doc/forum/Error_building_on_remote_host.mdwn31
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment21
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment13
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment8
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment8
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment10
-rw-r--r--doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment8
-rw-r--r--doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment8
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options.mdwn41
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment12
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment9
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment10
-rw-r--r--doc/news/Linux.Conf.Au.presentation.mdwn5
-rw-r--r--doc/news/version_3.3.1.mdwn8
-rw-r--r--doc/news/version_3.4.0.mdwn14
-rw-r--r--doc/news/version_3.4.1.mdwn3
-rw-r--r--doc/news/version_4.3.1.mdwn4
-rw-r--r--doc/news/version_4.3.2.mdwn3
-rw-r--r--doc/news/version_4.5.1.mdwn7
-rw-r--r--doc/news/version_4.5.2.mdwn5
-rw-r--r--doc/news/version_4.6.0.mdwn8
-rw-r--r--doc/news/version_4.6.1.mdwn7
-rw-r--r--doc/news/version_4.6.2.mdwn8
-rw-r--r--doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn7
-rw-r--r--doc/todo/differential_update_via_RevertableProperty.mdwn146
-rw-r--r--doc/todo/merge_request:_Timezone.hs.mdwn9
-rw-r--r--doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment15
-rw-r--r--doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn23
-rw-r--r--joeyconfig.hs63
-rw-r--r--privdata/.joeyconfig/privdata.gpg2936
-rw-r--r--propellor.cabal6
-rw-r--r--src/Propellor/Bootstrap.hs4
-rw-r--r--src/Propellor/CmdLine.hs2
-rw-r--r--src/Propellor/Property/Bootstrap.hs2
-rw-r--r--src/Propellor/Property/ConfFile.hs14
-rw-r--r--src/Propellor/Property/DiskImage.hs99
-rw-r--r--src/Propellor/Property/DiskImage/PartSpec.hs88
-rw-r--r--src/Propellor/Property/Grub.hs44
-rw-r--r--src/Propellor/Property/LightDM.hs14
-rw-r--r--src/Propellor/Property/Network.hs70
-rw-r--r--src/Propellor/Property/OS.hs2
-rw-r--r--src/Propellor/Property/Parted.hs198
-rw-r--r--src/Propellor/Property/Parted/Types.hs119
-rw-r--r--src/Propellor/Property/Reboot.hs17
-rw-r--r--src/Propellor/Property/Rsync.hs5
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs80
-rw-r--r--src/Propellor/Property/Sudo.hs24
-rw-r--r--src/Propellor/Property/Systemd.hs64
-rw-r--r--src/Propellor/Property/Timezone.hs21
-rw-r--r--src/Propellor/Property/Versioned.hs124
-rw-r--r--src/Propellor/Types.hs4
-rw-r--r--src/Propellor/Types/Bootloader.hs2
-rw-r--r--src/Propellor/Types/Info.hs3
-rw-r--r--src/Propellor/Types/PartSpec.hs66
55 files changed, 2762 insertions, 1843 deletions
diff --git a/debian/changelog b/debian/changelog
index c313a2c6..c014eeba 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,86 @@
+propellor (4.6.2) unstable; urgency=medium
+
+ * Systemd.nspawned: Recent systemd versions such as 234 ignore
+ non-symlinks in /etc/systemd/system/multi-user.target.wants,
+ which was used to configure systemd-nspawn parameters. Instead,
+ use a service.d/local.conf file to configure that.
+ * Grub: Added bootsMounted property, a generalization of
+ DiskImage.grubBooted
+
+ -- Joey Hess <id@joeyh.name> Fri, 28 Jul 2017 15:48:32 -0400
+
+propellor (4.6.1) unstable; urgency=medium
+
+ * Added Network.dhcp' and Network.static', which allow specifying
+ additional options for interfaces files.
+ * Fix build failure on ghc-8.2.1
+ Thanks, Sergei Trofimovich.
+ * DiskImage: Fix strictness bug in .parttable read/write sequence.
+
+ -- Joey Hess <id@joeyh.name> Thu, 27 Jul 2017 09:17:32 -0400
+
+propellor (4.6.0) unstable; urgency=medium
+
+ * Add Typeable instance to Bootstrapper, fixing build with old versions
+ of ghc.
+ * Network.static changed to take address and gateway parameters.
+ If you used the old Network.static property, it has been renamed to
+ Network.preserveStatic.
+ (Minor API change)
+
+ -- Joey Hess <id@joeyh.name> Wed, 26 Jul 2017 20:02:50 -0400
+
+propellor (4.5.2) unstable; urgency=medium
+
+ * Added Rsync.installed property.
+ * Added DiskImage.vmdkBuiltFor property which is useful for booting
+ a disk image in VirtualBox.
+
+ -- Joey Hess <id@joeyh.name> Tue, 25 Jul 2017 17:58:46 -0400
+
+propellor (4.5.1) unstable; urgency=medium
+
+ * Reboot.toKernelNewerThan: If running kernel is new enough, avoid
+ looking at what kernels are installed.
+ Thanks, Sean Whitton.
+ * DiskImage: Avoid re-partitioning disk image unncessarily, for a large
+ speedup.
+
+ -- Joey Hess <id@joeyh.name> Tue, 25 Jul 2017 15:51:33 -0400
+
+propellor (4.5.0) unstable; urgency=medium
+
+ * Generalized the PartSpec DSL, so it can be used for both
+ disk image partitioning, and disk device partitioning, with
+ different partition sizing methods as appropriate for the different
+ uses. (minor API change)
+ * Propellor.Property.Parted: Added calcPartTable function which uses
+ PartSpec DiskPart, and a useDiskSpace combinator.
+ * Generate a better description for versioned properties.
+
+ -- Joey Hess <id@joeyh.name> Fri, 21 Jul 2017 16:40:13 -0400
+
+propellor (4.4.0) unstable; urgency=medium
+
+ * Propellor.Property.Timezone: New module, contributed by Sean Whitton.
+ * Propellor.Property.Sudo.enabledFor: Made revertable.
+ (minor API change)
+ * Propellor.Property.LightDM.autoLogin: Made revertable.
+ (minor API change)
+ * Propellor.Property.Conffile: Added lacksIniSetting.
+
+ -- Joey Hess <id@joeyh.name> Mon, 17 Jul 2017 12:55:02 -0400
+
+propellor (4.3.4) unstable; urgency=medium
+
+ * Propellor.Property.Versioned: New module which allows different
+ versions of a property or host to be written down in a propellor config
+ file. Has many applications, including staged upgrades and rollbacks.
+ * LightDM.autoLogin: Use [Seat:*] rather than the old [SeatDefaults].
+ The new name has been supported since lightdm 1.15.
+
+ -- Joey Hess <id@joeyh.name> Sat, 15 Jul 2017 17:22:53 -0400
+
propellor (4.3.3) unstable; urgency=medium
* Hosts can be configured to build propellor using stack, by adding
diff --git a/doc/forum/Error_building_on_remote_host.mdwn b/doc/forum/Error_building_on_remote_host.mdwn
new file mode 100644
index 00000000..240db464
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host.mdwn
@@ -0,0 +1,31 @@
+I recently updated to the latest Propellor and now I'm getting an error building on a remote host:
+
+ [86 of 94] Compiling Propellor.Bootstrap ( src/Propellor/Bootstrap.hs, dist/build/propellor-config/propellor-config-tmp/Propellor/Bootstrap.o )
+
+ src/Propellor/Bootstrap.hs:237:22:
+ No instance for (Typeable Bootstrapper)
+ arising from a use of `fromInfo'
+ Possible fix:
+ add an instance declaration for (Typeable Bootstrapper)
+ In the expression: fromInfo (maybe mempty hostInfo mh)
+ In a stmt of a 'do' block:
+ case fromInfo (maybe mempty hostInfo mh) of {
+ NoInfoVal
+ -> do { bs <- getGitConfigValue "propellor.buildsystem";
+ case bs of {
+ Just "stack" -> ...
+ _ -> ... } }
+ InfoVal bs
+ -> case getBuilder bs of {
+ Cabal -> cabalBuild msys
+ Stack -> stackBuild msys } }
+ In the second argument of `($)', namely
+ `do { case fromInfo (maybe mempty hostInfo mh) of {
+ NoInfoVal -> do { ... }
+ InfoVal bs
+ -> case getBuilder bs of {
+ Cabal -> ...
+ Stack -> ... } } }'
+ propellor: cabal build failed
+
+I guess I'm missing something, but not sure what?
diff --git a/doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment b/doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment
new file mode 100644
index 00000000..eca6c8c6
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="mithrandi"
+ avatar="http://cdn.libravatar.org/avatar/869963bdf99b541c9f0bbfb04b0320f1"
+ subject="comment 1"
+ date="2017-07-25T22:22:49Z"
+ content="""
+I tried adding:
+
+ & bootstrapWith (Robustly Stack)
+
+But that fails trying to install stack:
+
+ Fetched 413 kB in 7s (54.3 kB/s)
+ Reading package lists...
+ E: Unable to locate package haskell-stack
+ sh: 1: stack: not found
+ sh: 1: stack: not found
+
+That's not really too surprising, of course, since this package isn't in jessie (or stretch, for that matter).
+
+"""]]
diff --git a/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment b/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment
new file mode 100644
index 00000000..34750553
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="mithrandi"
+ avatar="http://cdn.libravatar.org/avatar/869963bdf99b541c9f0bbfb04b0320f1"
+ subject="comment 2"
+ date="2017-07-25T22:50:42Z"
+ content="""
+Okay, got it to work:
+
+1. Installed haskell-stack by hand from unstable (the package works fine even on jessie).
+2. Removed the \"dist\" directory in the remote /usr/local/propellor.
+
+After that the build was successful; I think that points to the original failure being due to the ancient GHC in jessie, but I'm not 100% sure.
+"""]]
diff --git a/doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment b/doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment
new file mode 100644
index 00000000..1790ac78
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2017-07-26T00:49:51Z"
+ content="""
+The haskell-stack package is available in Debian stretch
+<https://packages.debian.org/search?keywords=haskell-stack>
+"""]]
diff --git a/doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment b/doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment
new file mode 100644
index 00000000..5129fb5d
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="mithrandi"
+ avatar="http://cdn.libravatar.org/avatar/869963bdf99b541c9f0bbfb04b0320f1"
+ subject="comment 4"
+ date="2017-07-26T01:03:02Z"
+ content="""
+Oh, so it is! Must have misread something earlier.
+"""]]
diff --git a/doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment b/doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment
new file mode 100644
index 00000000..7d8f26fe
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2017-07-26T00:52:20Z"
+ content="""
+Interesting that it works on newer ghc without an explict
+`Typeable Bootstrapper` instance.
+
+I've added the missing instance.
+"""]]
diff --git a/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment
new file mode 100644
index 00000000..35c894b0
--- /dev/null
+++ b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="gueux"
+ avatar="http://cdn.libravatar.org/avatar/2982bac2c2cd94ab3860efb189deafc8"
+ subject="comment 5"
+ date="2017-07-14T10:58:33Z"
+ content="""
+The new \"bootstrapWith (Robustly Stack)\" and \"bootstrapWith OSOnly\" properties completely address my concerns. Thanks!
+"""]]
diff --git a/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment
new file mode 100644
index 00000000..32ed86f8
--- /dev/null
+++ b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="gueux"
+ avatar="http://cdn.libravatar.org/avatar/2982bac2c2cd94ab3860efb189deafc8"
+ subject="comment 6"
+ date="2017-07-14T11:16:10Z"
+ content="""
+(I did not try to build propellor again on this 128Mo host yet, though)
+"""]]
diff --git a/doc/forum/host_to_deal_with_dpkg::options.mdwn b/doc/forum/host_to_deal_with_dpkg::options.mdwn
new file mode 100644
index 00000000..5faaefe2
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options.mdwn
@@ -0,0 +1,41 @@
+[[!meta title "how to deal with dpkg::options"]]
+
+Hello
+
+I try to create a distUpgrade property in order to migrate one of my computer from jessie -> stretch
+
+I started wit this
+
+ distUpgrade :: String -> Property DebianLike
+ distUpgrade p = combineProperties ("apt " ++ p) $ props
+ & Apt.pendingConfigured
+ & Apt.runApt ["-y", "--force-yes", "-o", "Dpkg::Options::=\"--force-confnew\"", p]
+ `assume` MadeChange
+
+But when I try to use this
+
+ ...
+ & distUpgrade dist-upgrade
+
+ I get this error message
+
+ Préconfiguration des paquets...
+ setting xserver-xorg-legacy/xwrapper/allowed_users from configuration file
+ dpkg: erreur: requiert une option d'action
+
+ Utilisez « dpkg --help » pour obtenir de l'aide à propos de l'installation et la désinstallation des paquets [*] ;
+ Utilisez « apt » ou « aptitude » pour gérer les paquets de m1578 mis à jour, 376 nouvellement installés, 72 à enlever et 0 non mis à jour.
+ Il est nécessaire de prendre 0 o/1 458 Mo dans les archives.
+
+I checked that if I run this command on the command line it works
+
+ apt-get -y --force-yes -o Dpkg::Options::="--force-confnew" dist-upgrade
+
+even If I write this it works
+
+ apt-get -y --force-yes -o Dpkg::Options::=\"--force-confnew\" dist-upgrade
+
+So it seems to me that there is a problem with the runApt method or I missed something
+
+thanks
+
diff --git a/doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment
new file mode 100644
index 00000000..65756b12
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 1"
+ date="2017-07-28T15:09:12Z"
+ content="""
+please change the title, I made a mistake
+
+how to deal with ...
+
+sorry
+"""]]
diff --git a/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment
new file mode 100644
index 00000000..39e0ebc3
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2017-07-28T15:45:43Z"
+ content="""
+I doubt that apt's option parser deals with quotes; those are normally
+handled by the shell. runApt does not pass the command through the shell,
+so probably simply removing the quotes from inside the parameter will work.
+"""]]
diff --git a/doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment
new file mode 100644
index 00000000..4031bd16
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 3"
+ date="2017-07-28T15:53:03Z"
+ content="""
+Great it works
+
+thanks a lot
+"""]]
diff --git a/doc/news/Linux.Conf.Au.presentation.mdwn b/doc/news/Linux.Conf.Au.presentation.mdwn
deleted file mode 100644
index 54180979..00000000
--- a/doc/news/Linux.Conf.Au.presentation.mdwn
+++ /dev/null
@@ -1,5 +0,0 @@
-<video controls src="http://mirror.linux.org.au/pub/linux.conf.au/2017/Type_driven_configuration_management_with_Propellor.webm"></video>
-
-[video](http://mirror.linux.org.au/pub/linux.conf.au/2017/Type_driven_configuration_management_with_Propellor.webm)
-
-Also see this writeup in [Linux Weekly News](https://lwn.net/Articles/713653/)
diff --git a/doc/news/version_3.3.1.mdwn b/doc/news/version_3.3.1.mdwn
deleted file mode 100644
index 84ab72f1..00000000
--- a/doc/news/version_3.3.1.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-propellor 3.3.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Apt: Removed the mirrors.kernel.org line from stdSourcesList etc.
- The mirror CDN has a new implementation that should avoid the problems
- with httpredir that made an extra mirror sometimes be needed.
- * Switch Debian CDN address to deb.debian.org.
- * Tor.hiddenService: Fix bug in torrc's HiddenServicePort configuration.
- Thanks, Félix Sipma"""]] \ No newline at end of file
diff --git a/doc/news/version_3.4.0.mdwn b/doc/news/version_3.4.0.mdwn
deleted file mode 100644
index d38716e1..00000000
--- a/doc/news/version_3.4.0.mdwn
+++ /dev/null
@@ -1,14 +0,0 @@
-propellor 3.4.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Added ConfigurableValue type class, for values that can be used in a
- config file, or to otherwise configure a program.
- * The val function converts such values to String.
- * Removed fromPort and fromIPAddr (use val instead). (API change)
- * Removed several Show instances that were only used for generating
- configuration, replacing with ConfigurableValue instances. (API change)
- * The github mirror of propellor's git repository has been removed,
- since github's terms of service has started imposing unwanted licensing
- requirements.
- * propellor --init: The option to clone propellor's git repository
- used to use the github mirror, and has been changed to use a different
- mirror."""]] \ No newline at end of file
diff --git a/doc/news/version_3.4.1.mdwn b/doc/news/version_3.4.1.mdwn
deleted file mode 100644
index 51d9c2ac..00000000
--- a/doc/news/version_3.4.1.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-propellor 3.4.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Fixed https url to propellor git repository."""]] \ No newline at end of file
diff --git a/doc/news/version_4.3.1.mdwn b/doc/news/version_4.3.1.mdwn
deleted file mode 100644
index 5c07307d..00000000
--- a/doc/news/version_4.3.1.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-propellor 4.3.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Added Propellor.Property.FreeDesktop module.
- * Added reservedSpacePercentage to the PartSpec EDSL."""]] \ No newline at end of file
diff --git a/doc/news/version_4.3.2.mdwn b/doc/news/version_4.3.2.mdwn
deleted file mode 100644
index 1a85d2d4..00000000
--- a/doc/news/version_4.3.2.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-propellor 4.3.2 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Really include Propellor.Property.FreeDesktop."""]] \ No newline at end of file
diff --git a/doc/news/version_4.5.1.mdwn b/doc/news/version_4.5.1.mdwn
new file mode 100644
index 00000000..212b4f27
--- /dev/null
+++ b/doc/news/version_4.5.1.mdwn
@@ -0,0 +1,7 @@
+propellor 4.5.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Reboot.toKernelNewerThan: If running kernel is new enough, avoid
+ looking at what kernels are installed.
+ Thanks, Sean Whitton.
+ * DiskImage: Avoid re-partitioning disk image unncessarily, for a large
+ speedup."""]] \ No newline at end of file
diff --git a/doc/news/version_4.5.2.mdwn b/doc/news/version_4.5.2.mdwn
new file mode 100644
index 00000000..f7268048
--- /dev/null
+++ b/doc/news/version_4.5.2.mdwn
@@ -0,0 +1,5 @@
+propellor 4.5.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added Rsync.installed property.
+ * Added DiskImage.vmdkBuiltFor property which is useful for booting
+ a disk image in VirtualBox."""]] \ No newline at end of file
diff --git a/doc/news/version_4.6.0.mdwn b/doc/news/version_4.6.0.mdwn
new file mode 100644
index 00000000..673051ea
--- /dev/null
+++ b/doc/news/version_4.6.0.mdwn
@@ -0,0 +1,8 @@
+propellor 4.6.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Add Typeable instance to Bootstrapper, fixing build with old versions
+ of ghc.
+ * Network.static changed to take address and gateway parameters.
+ If you used the old Network.static property, it has been renamed to
+ Network.preserveStatic.
+ (Minor API change)"""]] \ No newline at end of file
diff --git a/doc/news/version_4.6.1.mdwn b/doc/news/version_4.6.1.mdwn
new file mode 100644
index 00000000..eb7bd940
--- /dev/null
+++ b/doc/news/version_4.6.1.mdwn
@@ -0,0 +1,7 @@
+propellor 4.6.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added Network.dhcp' and Network.static', which allow specifying
+ additional options for interfaces files.
+ * Fix build failure on ghc-8.2.1
+ Thanks, Sergei Trofimovich.
+ * DiskImage: Fix strictness bug in .parttable read/write sequence."""]] \ No newline at end of file
diff --git a/doc/news/version_4.6.2.mdwn b/doc/news/version_4.6.2.mdwn
new file mode 100644
index 00000000..50930135
--- /dev/null
+++ b/doc/news/version_4.6.2.mdwn
@@ -0,0 +1,8 @@
+propellor 4.6.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Systemd.nspawned: Recent systemd versions such as 234 ignore
+ non-symlinks in /etc/systemd/system/multi-user.target.wants,
+ which was used to configure systemd-nspawn parameters. Instead,
+ use a service.d/local.conf file to configure that.
+ * Grub: Added bootsMounted property, a generalization of
+ DiskImage.grubBooted"""]] \ No newline at end of file
diff --git a/doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn b/doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn
new file mode 100644
index 00000000..c60cd4d6
--- /dev/null
+++ b/doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn
@@ -0,0 +1,7 @@
+Currently, this module requires `RevertableProperty t t`.
+That can be annoying, it would be good to support at least
+`RevertablePropery (HasInfo + t) t` and ideally all
+`RevertableProperty t1 t2`
+
+There should be no reason that can't be done; I was just having
+problems getting the type checker happy on the day I wrote it. --[[Joey]]
diff --git a/doc/todo/differential_update_via_RevertableProperty.mdwn b/doc/todo/differential_update_via_RevertableProperty.mdwn
new file mode 100644
index 00000000..3eb9bc7a
--- /dev/null
+++ b/doc/todo/differential_update_via_RevertableProperty.mdwn
@@ -0,0 +1,146 @@
+Long ago, nomeata pointed out that RevertableProperty required the user to
+keep track of different versions of a Host, in a way that should be able to
+be automated. When the user decides to revert a RevertableProperty, they
+have to keep the reverted property on the Host until propellor runs there,
+and only then can remove it.
+
+What if instead, there was a way to store the old version of a Host
+somewhere. Let's not worry about where or how, but assume we have
+`(old, new) :: (Host, Host)`
+
+Propellor could compare `old` and `new`, and if it finds a
+RevertableProperty in `old` that is not in `new`, add it in reverted form
+to `new'`.
+
+Also, if propellor finds a Property in `old` that is not in `new`, it can
+tell the user that this Property needs to be reverted, but cannot be, so
+`new` won't fully describe the state of the host. --[[Joey]]
+
+----
+
+There are a lot of ways such a capability could be used, especially if
+there were a way to pull the old version of a Host out of a previous
+version of config.hs or something like that. But leaving aside such magic,
+here are some nice use cases:
+
+* Suppose we want to generate several disk images, which are somewhat
+ similar, but differ in some properties. Rather than building a separate
+ chroot for each, we can build a chroot for the first, update the first
+ disk image, compare that with the second and update the chroot
+ accordingly, and so on.
+* When propellor is used to build a OS installer disk image, that installer
+ could know the properties used to create it, and the properties of the
+ system that is desired to be installed. To install, it can rsync the
+ installer disk contents to `/target` and then run propellor in `/target`,
+ differentially updating it as needed.
+
+----
+
+Here's the catch: It can't be implemented currently! The comparison of
+properties needs an `Eq` instance for Property (and RevertableProperty).
+But, a property contains an action in the IO monad, which can't have an
+`Eq` instance, and so there's no good way to compare properties.
+
+Making propellor use an ESDL could get us `Eq`. But it would make it rather
+clumsy to write properties, something like this.
+
+<pre>
+appendfoo f = WriteFile f (ListAppend "foo" (ReadFile f))
+</pre>
+
+(Perhaps a deeply embedded DSL would be better.)
+
+Could a Free monad get us `Eq`? Well, there can apparently be free monads that
+have an `Eq` instance, but I tried building one for a simple teletype, and
+failed, which does not bode well. Here's the code; this fails to compile
+because of a missing instance `(Eq1 ((->) String))`, and of course comparing
+functions for equality is not generally feasible.
+
+<pre>
+{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
+
+import Control.Monad.Free
+import Prelude.Extras
+
+data TeletypeF x
+ = PutStrLn String x
+ | GetLine (String -> x)
+
+instance Functor TeletypeF where
+ fmap f (PutStrLn str x) = PutStrLn str (f x)
+ fmap f (GetLine k) = GetLine (f . k)
+
+instance (Eq1 ((->) String)) => Eq1 TeletypeF where
+ PutStrLn a x ==# PutStrLn b y = a == b && x == y
+ GetLine a ==# GetLine b = a ==# b
+
+type Teletype = Free TeletypeF
+
+putStrLn' :: String -> Teletype ()
+putStrLn' str = liftF $ PutStrLn str ()
+
+getLine' :: Teletype String
+getLine' = liftF $ GetLine id
+
+foo :: Teletype ()
+foo = do
+ putStrLn' "name?"
+ name <- getLine'
+ putStrLn' ("hello, " ++ name)
+
+fooisfoo :: Bool
+fooisfoo = foo ==# foo
+</pre>
+
+-----
+
+## the best we can do without Eq
+
+Is, perhaps:
+
+ data Version = A | B | C
+ deriving (Enum, Ord)
+
+ foo :: Versioned Hoso
+ foo = versionedHost "foo" $ do
+ ver A someprop
+ <|> othervers otherprop
+ ver A somerevertableprop
+ ver [B, C] newprop
+
+That's ... pretty ok, would hit as least some of the use cases described
+above. Seems to need a Reader+Writer monad to implement it,
+without passing the Version around explicitly.
+
+Is it allowable for `newprop` to not be revertable?
+Once `foo` gets that property, it is never removed if we're moving only
+forwards. On the other hand, perhaps the user will want to roll back to
+version A. Allowing rollbacks seems good, so `inVersion` should only
+accept `RevertableProperty`.
+
+Another interesting case is this:
+
+ foo = versionedHost "foo" $ do
+ ver A bar
+ always otherprop
+ ver [B, C] bar
+
+Is version A of foo identical to verion B? If so, this should be allowed to
+compile even when `bar` cannot be reverted. On the other hand, perhaps
+ordering of the properties matters, in which case the systems are subtly
+different, and there's no way to get from A to B.
+
+It's certianly possible for ordering to matter in propellor properties,
+although it's generally a bug when it does. So, it seems ok for this
+case to be rejected.
+
+As well as `Versioned Host`, it would be possible to have
+`Versioned (Property metatypes)`.
+Indeed, that would make sense to he used internally in the
+examples above. And that allows composition of properties with versioning:
+
+ someprop :: Versioned (Property DebianLike)
+ someprop = versionedProperty $ do
+ ver A foo <|> ver [B, C] bar
+
+> [[done]] in Propellor.Property.Versioned. --[[Joey]]
diff --git a/doc/todo/merge_request:_Timezone.hs.mdwn b/doc/todo/merge_request:_Timezone.hs.mdwn
new file mode 100644
index 00000000..a8ba3eae
--- /dev/null
+++ b/doc/todo/merge_request:_Timezone.hs.mdwn
@@ -0,0 +1,9 @@
+Please consider merging branch `timezone` of repo `https://git.spwhitton.name/propellor`.
+
+Adds `Timezone.configured`.
+
+I think that this works fine on stretch, but on Jessie there is some oddness. For example, if you set the timezone of a host to `US/Arizona`, the apt reconfiguration will put `America/Phoenix` in /etc/timezone, resulting in the property reporting a change every time that it is run. I think this is harmless.
+
+--spwhitton
+
+> [[merged|done]] --[[Joey]]
diff --git a/doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment b/doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment
new file mode 100644
index 00000000..026b13de
--- /dev/null
+++ b/doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-07-16T15:57:20Z"
+ content="""
+I generally consider properties that do work every time to be a minor bug.
+
+I wonder if it would be better to preseed tzdata rather than writing the
+config file. I observe the same substitution from eg, US/Eastern to
+America/New_York in the file when reconfiguring noninteractively,
+but reconfiguring interactively I can select US/Eastern and that gets
+into the file.
+
+Anyway, merged as this is certianly a good starting point.
+"""]]
diff --git a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
index 450416f2..62f619db 100644
--- a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
+++ b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
@@ -1,11 +1,20 @@
-The properties in `Sbuild.hs` should use apt-cacher-ng instead of a bind mount of `/var/cache/apt/archives`. This has at least three advantages:
+Please consider merging branch `apt-cacher-ng` of repo `https://git.spwhitton.name/propellor`.
-1. more than one instance of sbuild can run at once
+Sample text for changelog/description of changes:
-2. sbuild can run even if apt is doing something else with its cache
-
-3. the `piupartsConf` properties are no longer needed.
+ * Add Apt.proxy property to set a host's apt proxy.
+ * Add Apt.useLocalCacher property to set up apt-cacher-ng.
+ * Rework Sbuild properties to use apt proxies/cachers instead of bind-mounting
+ the host's apt cache. This makes it possible to run more than one build at
+ a time, and lets sbuild run even if apt's cache is locked by the host's apt.
+ - If Apt.proxy is set, it is assumed that the proxy does some sort of
+ caching, and sbuild chroots are set up to use the same proxy.
+ - If Apt.proxy is not set, we install apt-cacher-ng, and point sbuild
+ chroots at the local apt cacher.
+ - Drop Sbuild.piupartsConfFor, Sbuild.piupartsConf, Sbuild.shareAptCache
+ (API change)
+ No longer needed now that we are using apt proxies/cachers.
+ - Update sample config in haddock for Propellor.Property.Sbuild.
+ Please compare both your config.hs and your ~/.sbuildrc against the haddock.
--spwhitton
-
-[[!tag user/spwhitton]]
diff --git a/joeyconfig.hs b/joeyconfig.hs
index 2b7806b0..7ed23dfb 100644
--- a/joeyconfig.hs
+++ b/joeyconfig.hs
@@ -4,6 +4,8 @@ module Main where
import Propellor
import Propellor.Property.Scheduled
+import Propellor.Property.DiskImage
+import Propellor.Property.Chroot
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Network as Network
@@ -83,6 +85,8 @@ darkstar = host "darkstar.kitenet.net" $ props
& ipv6 "2001:4830:1600:187::2"
& Aiccu.hasConfig "T18376" "JHZ2-SIXXS"
+ & User.nuked (User "nosuchuser") User.YesReallyDeleteHome
+
& JoeySites.dkimMilter
& JoeySites.postfixSaslPasswordClient
-- & JoeySites.alarmClock "*-*-* 7:30" (User "joey")
@@ -90,6 +94,17 @@ darkstar = host "darkstar.kitenet.net" $ props
& Ssh.userKeys (User "joey") hostContext
[ (SshRsa, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1YoyHxZwG5Eg0yiMTJLSWJ/+dMM6zZkZiR4JJ0iUfP+tT2bm/lxYompbSqBeiCq+PYcSC67mALxp1vfmdOV//LWlbXfotpxtyxbdTcQbHhdz4num9rJQz1tjsOsxTEheX5jKirFNC5OiKhqwIuNydKWDS9qHGqsKcZQ8p+n1g9Lr3nJVGY7eRRXzw/HopTpwmGmAmb9IXY6DC2k91KReRZAlOrk0287LaK3eCe1z0bu7LYzqqS+w99iXZ/Qs0m9OqAPnHZjWQQ0fN4xn5JQpZSJ7sqO38TBAimM+IHPmy2FTNVVn9zGM+vN1O2xr3l796QmaUG1+XLL0shfR/OZbb joey@darkstar")
]
+ & imageBuilt "/srv/test.img" mychroot MSDOS
+ [ partition EXT2 `mountedAt` "/boot"
+ , partition EXT4 `mountedAt` "/"
+ , swapPartition (MegaBytes 256)
+ ]
+ `before` vmdkBuiltFor "/srv/test.img"
+ where
+ mychroot d = debootstrapped mempty d $ props
+ & osDebian Unstable X86_64
+ & Apt.installed ["linux-image-amd64"]
+ & Grub.installed PC
gnu :: Host
gnu = host "gnu.kitenet.net" $ props
@@ -167,42 +182,42 @@ orca = host "orca.kitenet.net" $ props
honeybee :: Host
honeybee = host "honeybee.kitenet.net" $ props
- & standardSystem Testing ARMHF [ "Arm git-annex build box." ]
+ & standardSystem Testing ARMHF
+ [ "Home router and arm git-annex build box." ]
- -- I have to travel to get console access, so no automatic
- -- upgrades, and try to be robust.
+ -- Hard to get console access, so no automatic upgrades,
+ -- and try to be robust.
& "/etc/default/rcS" `File.containsLine` "FSCKFIX=yes"
+ -- Cubietruck
& Apt.installed ["flash-kernel"]
& "/etc/flash-kernel/machine" `File.hasContent` ["Cubietech Cubietruck"]
& Apt.installed ["linux-image-armmp"]
- & Network.dhcp "eth0" `requires` Network.cleanInterfacesFile
- & Postfix.satellite
-
- -- ipv6 used for remote access thru firewalls
- & Apt.serviceInstalledRunning "aiccu"
- & ipv6 "2001:4830:1600:187::2"
- -- restart to deal with failure to connect, tunnel issues, etc
- & Cron.job "aiccu restart daily" Cron.Daily (User "root") "/"
- "service aiccu stop; service aiccu start"
-
- -- In case compiler needs more than available ram
- & Apt.serviceInstalledRunning "swapspace"
+ & Apt.installed ["firmware-brcm80211"]
+ -- Workaround for https://bugs.debian.org/844056
+ `requires` File.hasPrivContent "/lib/firmware/brcm/brcmfmac43362-sdio.txt" anyContext
+ `requires` File.dirExists "/lib/firmware/brcm"
- -- No hardware clock.
+ -- No hardware clock
& Apt.serviceInstalledRunning "ntp"
- -- Runs only on weekdays.
+ & JoeySites.homeRouter
+ & Apt.installed ["mtr-tiny", "iftop", "screen"]
+ & Postfix.satellite
+
& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
GitAnnexBuilder.armAutoBuilder
- Unstable ARMEL Nothing weekends "23h")
- -- Runs only on weekends.
- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
+ Unstable ARMEL Nothing (Cron.Times "15 10 * * *") "10h")
+ -- Disabled because it does not work, and the old systemd
+ -- in the container uses a ton of CPU
+ ! Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
GitAnnexBuilder.stackAutoBuilder
- (Stable "jessie") ARMEL (Just "ancient") weekdays "23h")
+ (Stable "jessie") ARMEL (Just "ancient") weekdays "10h")
+ -- In case compiler needs more than available ram
+ & Apt.serviceInstalledRunning "swapspace"
where
- weekdays = Cron.Times "15 6 * * 2-5"
- weekends = Cron.Times "15 6 * * 6-7"
+ weekdays = Cron.Times "15 10 * * 2-5"
+ -- weekends = Cron.Times "15 10 * * 6-7"
-- This is not a complete description of kite, since it's a
-- multiuser system with eg, user passwords that are not deployed
@@ -221,7 +236,7 @@ kite = host "kite.kitenet.net" $ props
, (SshEd25519, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZftKMnH/zH29BHMKbcBO4QsgTrstYFVhbrzrlRzBO3")
]
- & Network.static "eth0" `requires` Network.cleanInterfacesFile
+ & Network.preserveStatic "eth0" `requires` Network.cleanInterfacesFile
& Apt.installed ["linux-image-amd64"]
& Linode.serialGrub
& Linode.mlocateEnabled
diff --git a/privdata/.joeyconfig/privdata.gpg b/privdata/.joeyconfig/privdata.gpg
index abcddba9..4892f12d 100644
--- a/privdata/.joeyconfig/privdata.gpg
+++ b/privdata/.joeyconfig/privdata.gpg
@@ -1,1463 +1,1479 @@
-----BEGIN PGP MESSAGE-----
-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
-V9VxK/RYRDYUqW+eGQMJk4X4ib+EQRTh
-=18+W
+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
+0f7uUGKkbItamXQziMDC467ocKxHeOGFp/bBwXm7UrZt336j509AjN/55dPtajRO
+7vMwFxahjseXCVEuNmk4QhL8NozUQVj4Z7brXP82WGVakSljzjB5s5PPd9S3rSDa
+ZJteZ2NDRp/eJv1G9QvorgJvmljaf+sC+AKnTsUM9WIy+UpcKrufLX0TCu3UA3je
+pqaSSt8+vshRb5mM8HjCbt+YtqFN50qwseraa69+ZfKId5OtF2nDE3TrWr/b4yew
+rIh7/EK84aOA+VEC7sRrplY5ZjUvNyRqlRaylHe4K11ZNdmS2RMMh+AHKld6V85E
+0AQrTWeMZpNWnZcKjxOywK21VJ4JhqvkJJ+USEX5Rnam5LjFZdk4wnobOotY0wRi
+6eMWO+iDreLl1m9mBBgA5pgYeajdt4MSpRV4pNQJz6LC63jDDeyHi1oR+PotTyjA
+mA42eLXBxtehTeVX6hJKw3CttkzBEAwfdzFoix24t35cSttOobN/Ss3QykDX/EBy
+ZqpbtXVrnfXAhg0QqVxpaItqrMEMy/JPhAuiDloKvPkgHYkSu4BdjfK4iEnKqJU+
+trrvi47K8ehXmoK8cWJs9PLzMhXtLDl+THNKHC5PP1yKc6Q7cv7TIDeH9miD+WvE
+aVk0GxzqZ4Xg4AN6ZetUAFhJGYKbWLBMug7TbjgOOMU/8juHUR8tok3AWgjDFqz6
+LGf8zVBQ1M4Tl57PpiCX6ND2vYGJG9sejbv2VPMqDeNmZm6hxHCjIRgXwpV/y+dg
+wRz2DE0efGx8c+ao+kDFSF07rq/k8NfneySgx71WLVlNYBDFMAJf9pYOF2fkBYTJ
+m5l7VVMP+2hEaADrMOGorEE57zzcliYdaOalCN5hHIBVgqzI1XBHXnEuWjrek4fM
+2iQ2oSvbVEI7jvFP3jXf63wYgmkPqj8US7jGUVGhxezjFAvNzbX42glAoGppDgYu
+fJqhQmsCXP5LlJA/ljtDueIWPOfAnKZA7I/y1BzUSUfP1yClpHwPYz4DdgyQn6zC
+evOgd0DWkKIwIDkVQ+9y4TXeWnS77Cb5hBYSkvtzHR/aFpESe7SHtdnYINwt7ADD
+iFGCLwSR5AEphcuEhUKqueSRGPgH+dB59Ks93pdOZp6f6fyYVitmMBMqusYPEx6b
+rNSdSXaEZNYv8uE4pVvuT7nlxrd/5KAaxp1PPdBreaKTnfw3seggLZOjX/Hq1dw2
+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
+ryrHQmt6O7ecbloUa0zQXlNu+8XV5cA=
+=4IwF
-----END PGP MESSAGE-----
diff --git a/propellor.cabal b/propellor.cabal
index 3c2477b9..f278fdd4 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
Name: propellor
-Version: 4.3.3
+Version: 4.6.2
Cabal-Version: >= 1.20
License: BSD2
Maintainer: Joey Hess <id@joeyh.name>
@@ -135,6 +135,7 @@ Library
Propellor.Property.OS
Propellor.Property.Pacman
Propellor.Property.Parted
+ Propellor.Property.Parted.Types
Propellor.Property.Partition
Propellor.Property.Postfix
Propellor.Property.PropellorRepo
@@ -150,10 +151,12 @@ Library
Propellor.Property.Sudo
Propellor.Property.Systemd
Propellor.Property.Systemd.Core
+ Propellor.Property.Timezone
Propellor.Property.Tor
Propellor.Property.Unbound
Propellor.Property.User
Propellor.Property.Uwsgi
+ Propellor.Property.Versioned
Propellor.Property.XFCE
Propellor.Property.ZFS
Propellor.Property.ZFS.Process
@@ -191,6 +194,7 @@ Library
Propellor.Types.Info
Propellor.Types.MetaTypes
Propellor.Types.OS
+ Propellor.Types.PartSpec
Propellor.Types.PrivData
Propellor.Types.Result
Propellor.Types.ResultCheck
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 21f051c9..21d29bcc 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+
module Propellor.Bootstrap (
Bootstrapper(..),
Builder(..),
@@ -34,7 +36,7 @@ data Bootstrapper = Robustly Builder | OSOnly
deriving (Show)
data Builder = Cabal | Stack
- deriving (Show)
+ deriving (Show, Typeable)
defaultBootstrapper :: Bootstrapper
defaultBootstrapper = Robustly Cabal
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index a36ec7f5..cba5991d 100644
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -204,7 +204,7 @@ updateFirst h canrebuild cmdline next = ifM hasOrigin
, next
)
--- If changes can be fetched from origin, Builds propellor (when allowed)
+-- If changes can be fetched from origin, builds propellor (when allowed)
-- and re-execs the updated propellor binary to continue.
-- Otherwise, runs the IO action to continue.
updateFirst' :: Maybe Host -> CanRebuild -> CmdLine -> IO () -> IO ()
diff --git a/src/Propellor/Property/Bootstrap.hs b/src/Propellor/Property/Bootstrap.hs
index 91d1a82f..f0759dae 100644
--- a/src/Propellor/Property/Bootstrap.hs
+++ b/src/Propellor/Property/Bootstrap.hs
@@ -30,7 +30,7 @@ import qualified Data.ByteString as B
bootstrapWith :: Bootstrapper -> Property (HasInfo + UnixLike)
bootstrapWith b = pureInfoProperty desc (InfoVal b)
where
- desc = "bootstrapped with " ++ case b of
+ desc = "propellor bootstrapped with " ++ case b of
Robustly Stack -> "stack"
Robustly Cabal -> "cabal"
OSOnly -> "OS packages only"
diff --git a/src/Propellor/Property/ConfFile.hs b/src/Propellor/Property/ConfFile.hs
index ce092ec9..76d52bd9 100644
--- a/src/Propellor/Property/ConfFile.hs
+++ b/src/Propellor/Property/ConfFile.hs
@@ -9,6 +9,7 @@ module Propellor.Property.ConfFile (
IniSection,
IniKey,
containsIniSetting,
+ lacksIniSetting,
hasIniSection,
lacksIniSection,
iniFileContains,
@@ -93,6 +94,19 @@ containsIniSetting f (header, key, value) = adjustIniSection
go (l:ls) = if isKeyVal l then confline : ls else l : go ls
isKeyVal x = (filter (/= ' ') . takeWhile (/= '=')) x `elem` [key, '#':key]
+-- | Removes a key=value setting from a section of an .ini file.
+-- Note that the section heading is left in the file, so this is not a
+-- perfect reversion of containsIniSetting.
+lacksIniSetting :: FilePath -> (IniSection, IniKey, String) -> Property UnixLike
+lacksIniSetting f (header, key, value) = adjustIniSection
+ (f ++ " section [" ++ header ++ "] lacks " ++ key ++ "=" ++ value)
+ header
+ (filter (/= confline))
+ id
+ f
+ where
+ confline = key ++ "=" ++ value
+
-- | Ensures that a .ini file exists and contains a section
-- with a given key=value list of settings.
hasIniSection :: FilePath -> IniSection -> [(IniKey, String)] -> Property UnixLike
diff --git a/src/Propellor/Property/DiskImage.hs b/src/Propellor/Property/DiskImage.hs
index 9300b201..f64f685a 100644
--- a/src/Propellor/Property/DiskImage.hs
+++ b/src/Propellor/Property/DiskImage.hs
@@ -13,6 +13,7 @@ module Propellor.Property.DiskImage (
imageRebuilt,
imageBuiltFrom,
imageExists,
+ vmdkBuiltFor,
Grub.BIOS(..),
) where
@@ -20,12 +21,12 @@ import Propellor.Base
import Propellor.Property.DiskImage.PartSpec
import Propellor.Property.Chroot (Chroot)
import Propellor.Property.Chroot.Util (removeChroot)
+import Propellor.Property.Mount
import qualified Propellor.Property.Chroot as Chroot
import qualified Propellor.Property.Grub as Grub
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
import Propellor.Property.Parted
-import Propellor.Property.Mount
import Propellor.Property.Fstab (SwapPartition(..), genFstab)
import Propellor.Property.Partition
import Propellor.Property.Rsync
@@ -33,8 +34,9 @@ import Propellor.Types.Info
import Propellor.Types.Bootloader
import Propellor.Container
import Utility.Path
+import Utility.FileMode
-import Data.List (isPrefixOf, isInfixOf, sortBy)
+import Data.List (isPrefixOf, isInfixOf, sortBy, unzip4)
import Data.Function (on)
import qualified Data.Map.Strict as M
import qualified Data.ByteString.Lazy as L
@@ -109,16 +111,16 @@ type DiskImage = FilePath
-- > & Apt.installed ["linux-image-amd64"]
-- > & Grub.installed PC
-- > & hasPassword (User "root")
-imageBuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageBuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
imageBuilt = imageBuilt' False
-- | Like 'built', but the chroot is deleted and rebuilt from scratch each
-- time. This is more expensive, but useful to ensure reproducible results
-- when the properties of the chroot have been changed.
-imageRebuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageRebuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
imageRebuilt = imageBuilt' True
-imageBuilt' :: Bool -> DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageBuilt' :: Bool -> DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
imageBuilt' rebuild img mkchroot tabletype partspec =
imageBuiltFrom img chrootdir tabletype final partspec
`requires` Chroot.provisioned chroot
@@ -159,13 +161,13 @@ cachesCleaned = "cache cleaned" ==> (Apt.cacheCleaned `pickOS` skipit)
skipit = doNothing :: Property UnixLike
-- | Builds a disk image from the contents of a chroot.
-imageBuiltFrom :: DiskImage -> FilePath -> TableType -> Finalization -> [PartSpec] -> RevertableProperty (HasInfo + DebianLike) UnixLike
+imageBuiltFrom :: DiskImage -> FilePath -> TableType -> Finalization -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) UnixLike
imageBuiltFrom img chrootdir tabletype final partspec = mkimg <!> rmimg
where
desc = img ++ " built from " ++ chrootdir
mkimg = property' desc $ \w -> do
- -- unmount helper filesystems such as proc from the chroot
- -- before getting sizes
+ -- Unmount helper filesystems such as proc from the chroot
+ -- first; don't want to include the contents of those.
liftIO $ unmountBelow chrootdir
szm <- M.mapKeys (toSysDir chrootdir) . M.map toPartSize
<$> liftIO (dirSizes chrootdir)
@@ -174,16 +176,15 @@ imageBuiltFrom img chrootdir tabletype final partspec = mkimg <!> rmimg
let (mnts, mntopts, parttable) = fitChrootSize tabletype partspec $
map (calcsz mnts) mnts
ensureProperty w $
- imageExists img (partTableSize parttable)
- `before`
- partitioned YesReallyDeleteDiskContents img parttable
+ imageExists' img parttable
`before`
kpartx img (mkimg' mnts mntopts parttable)
mkimg' mnts mntopts parttable devs =
partitionsPopulated chrootdir mnts mntopts devs
`before`
imageFinalized final mnts mntopts devs parttable
- rmimg = File.notPresent img
+ rmimg = undoRevertableProperty (imageExists' img dummyparttable)
+ dummyparttable = PartTable tabletype []
partitionsPopulated :: FilePath -> [Maybe MountPoint] -> [MountOpts] -> [LoopDev] -> Property DebianLike
partitionsPopulated chrootdir mnts mntopts devs = property' desc $ \w ->
@@ -214,10 +215,10 @@ partitionsPopulated chrootdir mnts mntopts devs = property' desc $ \w ->
-- The constructor for each Partition is passed the size of the files
-- from the chroot that will be put in that partition.
-fitChrootSize :: TableType -> [PartSpec] -> [PartSize] -> ([Maybe MountPoint], [MountOpts], PartTable)
+fitChrootSize :: TableType -> [PartSpec ()] -> [PartSize] -> ([Maybe MountPoint], [MountOpts], PartTable)
fitChrootSize tt l basesizes = (mounts, mountopts, parttable)
where
- (mounts, mountopts, sizers) = unzip3 l
+ (mounts, mountopts, sizers, _) = unzip4 l
parttable = PartTable tt (zipWith id sizers basesizes)
-- | Generates a map of the sizes of the contents of
@@ -273,6 +274,29 @@ imageExists img isz = property ("disk image exists" ++ img) $ liftIO $ do
-- Common sector sizes are 512 and 4096; use 4096 as it's larger.
sectorsize = 4096 :: Double
+-- | Ensure that disk image file exists and is partitioned.
+--
+-- Avoids repartitioning the disk image, when a file of the right size
+-- already exists, and it has the same PartTable.
+imageExists' :: FilePath -> PartTable -> RevertableProperty DebianLike UnixLike
+imageExists' img parttable = (setup <!> cleanup) `describe` desc
+ where
+ desc = "disk image exists " ++ img
+ parttablefile = img ++ ".parttable"
+ setup = property' desc $ \w -> do
+ oldparttable <- liftIO $ catchDefaultIO "" $ readFileStrict parttablefile
+ res <- ensureProperty w $ imageExists img (partTableSize parttable)
+ if res == NoChange && oldparttable == show parttable
+ then return NoChange
+ else if res == FailedChange
+ then return FailedChange
+ else do
+ liftIO $ writeFile parttablefile (show parttable)
+ ensureProperty w $ partitioned YesReallyDeleteDiskContents img parttable
+ cleanup = File.notPresent img
+ `before`
+ File.notPresent parttablefile
+
-- | A property that is run after the disk image is created, with
-- its populated partition tree mounted in the provided
-- location from the provided loop devices. This is typically used to
@@ -339,35 +363,9 @@ unbootable msg = \_ _ -> property desc $ do
-- This does not install the grub package. You will need to add
-- the `Grub.installed` property to the chroot.
grubBooted :: Finalization
-grubBooted mnt loopdevs = combineProperties "disk image boots using grub" $ props
- -- bind mount host /dev so grub can access the loop devices
- & bindMount "/dev" (inmnt "/dev")
- & mounted "proc" "proc" (inmnt "/proc") mempty
- & mounted "sysfs" "sys" (inmnt "/sys") mempty
- -- update the initramfs so it gets the uuid of the root partition
- & inchroot "update-initramfs" ["-u"]
- `assume` MadeChange
- -- work around for http://bugs.debian.org/802717
- & check haveosprober (inchroot "chmod" ["-x", osprober])
- & inchroot "update-grub" []
- `assume` MadeChange
- & check haveosprober (inchroot "chmod" ["+x", osprober])
- & inchroot "grub-install" [wholediskloopdev]
- `assume` MadeChange
- -- sync all buffered changes out to the disk image
- -- may not be necessary, but seemed needed sometimes
- -- when using the disk image right away.
- & cmdProperty "sync" []
- `assume` NoChange
+grubBooted mnt loopdevs = Grub.bootsMounted mnt wholediskloopdev
+ `describe` "disk image boots using grub"
where
- -- cannot use </> since the filepath is absolute
- inmnt f = mnt ++ f
-
- inchroot cmd ps = cmdProperty "chroot" ([mnt, cmd] ++ ps)
-
- haveosprober = doesFileExist (inmnt osprober)
- osprober = "/etc/grub.d/30_os-prober"
-
-- It doesn't matter which loopdev we use; all
-- come from the same disk image, and it's the loop dev
-- for the whole disk image we seek.
@@ -387,3 +385,20 @@ toSysDir :: FilePath -> FilePath -> FilePath
toSysDir chrootdir d = case makeRelative chrootdir d of
"." -> "/"
sysdir -> "/" ++ sysdir
+
+-- | Builds a VirtualBox .vmdk file for the specified disk image file.
+vmdkBuiltFor :: FilePath -> RevertableProperty DebianLike UnixLike
+vmdkBuiltFor diskimage = (setup <!> cleanup)
+ `describe` (vmdkfile ++ " built")
+ where
+ vmdkfile = diskimage ++ ".vmdk"
+ setup = cmdProperty "VBoxManage"
+ [ "internalcommands", "createrawvmdk"
+ , "-filename", vmdkfile
+ , "-rawdisk", diskimage
+ ]
+ `changesFile` vmdkfile
+ `onChange` File.mode vmdkfile (combineModes (ownerWriteMode : readModes))
+ `requires` Apt.installed ["virtualbox"]
+ `requires` File.notPresent vmdkfile
+ cleanup = File.notPresent vmdkfile
diff --git a/src/Propellor/Property/DiskImage/PartSpec.hs b/src/Propellor/Property/DiskImage/PartSpec.hs
index 2b14baa0..55249889 100644
--- a/src/Propellor/Property/DiskImage/PartSpec.hs
+++ b/src/Propellor/Property/DiskImage/PartSpec.hs
@@ -1,32 +1,28 @@
-- | Disk image partition specification and combinators.
+-- Partitions in disk images default to being sized large enough to hold
+-- the files that appear in the directory where the partition is to be
+-- mounted. Plus a fudge factor, since filesystems have some space
+-- overhead.
+
module Propellor.Property.DiskImage.PartSpec (
+ module Propellor.Types.PartSpec,
module Propellor.Property.DiskImage.PartSpec,
- Partition,
- PartSize(..),
- PartFlag(..),
- TableType(..),
- Fs(..),
- MountPoint,
+ module Propellor.Property.Parted.Types,
+ module Propellor.Property.Partition,
) where
import Propellor.Base
import Propellor.Property.Parted
-import Propellor.Property.Mount
-
--- | Specifies a mount point, mount options, and a constructor for a Partition.
---
--- The size that is eventually provided is the amount of space needed to
--- hold the files that appear in the directory where the partition is to be
--- mounted. Plus a fudge factor, since filesystems have some space
--- overhead.
-type PartSpec = (Maybe MountPoint, MountOpts, PartSize -> Partition)
+import Propellor.Types.PartSpec
+import Propellor.Property.Parted.Types
+import Propellor.Property.Partition (Fs(..))
--- | Partitions that are not to be mounted (ie, LinuxSwap), or that have
--- no corresponding directory in the chroot will have 128 MegaBytes
--- provided as a default size.
-defSz :: PartSize
-defSz = MegaBytes 128
+-- | Adds additional free space to the partition.
+addFreeSpace :: PartSpec t -> PartSize -> PartSpec t
+addFreeSpace (mp, o, p, t) freesz = (mp, o, p', t)
+ where
+ p' = \sz -> p (sz <> freesz)
-- | Add 2% for filesystem overhead. Rationalle for picking 2%:
-- A filesystem with 1% overhead might just sneak by as acceptable.
@@ -35,55 +31,3 @@ defSz = MegaBytes 128
-- Add an additional 200 mb for temp files, journals, etc.
fudge :: PartSize -> PartSize
fudge (MegaBytes n) = MegaBytes (n + n `div` 100 * 2 + 3 + 200)
-
--- | Specifies a swap partition of a given size.
-swapPartition :: PartSize -> PartSpec
-swapPartition sz = (Nothing, mempty, const (mkPartition LinuxSwap sz))
-
--- | Specifies a partition with a given filesystem.
---
--- The partition is not mounted anywhere by default; use the combinators
--- below to configure it.
-partition :: Fs -> PartSpec
-partition fs = (Nothing, mempty, mkPartition fs)
-
--- | Specifies where to mount a partition.
-mountedAt :: PartSpec -> FilePath -> PartSpec
-mountedAt (_, o, p) mp = (Just mp, o, p)
-
--- | Specifies a mount option, such as "noexec"
-mountOpt :: ToMountOpts o => PartSpec -> o -> PartSpec
-mountOpt (mp, o, p) o' = (mp, o <> toMountOpts o', p)
-
--- | Mount option to make a partition be remounted readonly when there's an
--- error accessing it.
-errorReadonly :: MountOpts
-errorReadonly = toMountOpts "errors=remount-ro"
-
--- | Adds additional free space to the partition.
-addFreeSpace :: PartSpec -> PartSize -> PartSpec
-addFreeSpace (mp, o, p) freesz = (mp, o, \sz -> p (sz <> freesz))
-
--- | Forced a partition to be a specific size, instead of scaling to the
--- size needed for the files in the chroot.
-setSize :: PartSpec -> PartSize -> PartSpec
-setSize (mp, o, p) sz = (mp, o, const (p sz))
-
--- | Sets the percent of the filesystem blocks reserved for the super-user.
---
--- The default is 5% for ext2 and ext4. Some filesystems may not support
--- this.
-reservedSpacePercentage :: PartSpec -> Int -> PartSpec
-reservedSpacePercentage s percent = adjustp s $ \p ->
- p { partMkFsOpts = ("-m"):show percent:partMkFsOpts p }
-
--- | Sets a flag on the partition.
-setFlag :: PartSpec -> PartFlag -> PartSpec
-setFlag s f = adjustp s $ \p -> p { partFlags = (f, True):partFlags p }
-
--- | Makes a MSDOS partition be Extended, rather than Primary.
-extended :: PartSpec -> PartSpec
-extended s = adjustp s $ \p -> p { partType = Extended }
-
-adjustp :: PartSpec -> (Partition -> Partition) -> PartSpec
-adjustp (mp, o, p) f = (mp, o, f . p)
diff --git a/src/Propellor/Property/Grub.hs b/src/Propellor/Property/Grub.hs
index 4bad7b2b..739a63e9 100644
--- a/src/Propellor/Property/Grub.hs
+++ b/src/Propellor/Property/Grub.hs
@@ -3,6 +3,7 @@ module Propellor.Property.Grub where
import Propellor.Base
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
+import Propellor.Property.Mount
import Propellor.Property.Chroot (inChroot)
import Propellor.Types.Info
import Propellor.Types.Bootloader
@@ -89,3 +90,46 @@ chainPVGrub rootdev bootdev timeout = combineProperties desc $ props
xenshim = scriptProperty ["grub-mkimage --prefix '(" ++ bootdev ++ ")/boot/grub' -c /boot/load.cf -O x86_64-xen /usr/lib/grub/x86_64-xen/*.mod > /boot/xen-shim"]
`assume` MadeChange
`describe` "/boot-xen-shim"
+
+-- | This is a version of `boots` that makes grub boot the system mounted
+-- at a particular directory. The OSDevice should be the underlying disk
+-- device that grub will be installed to (generally a whole disk,
+-- not a partition).
+bootsMounted :: FilePath -> OSDevice -> Property Linux
+bootsMounted mnt wholediskdev = combineProperties desc $ props
+ -- bind mount host /dev so grub can access the loop devices
+ & bindMount "/dev" (inmnt "/dev")
+ & mounted "proc" "proc" (inmnt "/proc") mempty
+ & mounted "sysfs" "sys" (inmnt "/sys") mempty
+ -- update the initramfs so it gets the uuid of the root partition
+ & inchroot "update-initramfs" ["-u"]
+ `assume` MadeChange
+ -- work around for http://bugs.debian.org/802717
+ & check haveosprober (inchroot "chmod" ["-x", osprober])
+ & inchroot "update-grub" []
+ `assume` MadeChange
+ & check haveosprober (inchroot "chmod" ["+x", osprober])
+ & inchroot "grub-install" [wholediskdev]
+ `assume` MadeChange
+ & cleanupmounts
+ -- sync all buffered changes out to the disk in case it's
+ -- used right away
+ & cmdProperty "sync" []
+ `assume` NoChange
+ where
+ desc = "grub boots " ++ wholediskdev
+
+ -- cannot use </> since the filepath is absolute
+ inmnt f = mnt ++ f
+
+ inchroot cmd ps = cmdProperty "chroot" ([mnt, cmd] ++ ps)
+
+ haveosprober = doesFileExist (inmnt osprober)
+ osprober = "/etc/grub.d/30_os-prober"
+
+ cleanupmounts :: Property Linux
+ cleanupmounts = property desc $ liftIO $ do
+ umountLazy (inmnt "/sys")
+ umountLazy (inmnt "/proc")
+ umountLazy (inmnt "/dev")
+ return NoChange
diff --git a/src/Propellor/Property/LightDM.hs b/src/Propellor/Property/LightDM.hs
index 69538d89..d471d314 100644
--- a/src/Propellor/Property/LightDM.hs
+++ b/src/Propellor/Property/LightDM.hs
@@ -10,8 +10,12 @@ installed :: Property DebianLike
installed = Apt.installed ["lightdm"]
-- | Configures LightDM to skip the login screen and autologin as a user.
-autoLogin :: User -> Property DebianLike
-autoLogin (User u) = "/etc/lightdm/lightdm.conf" `ConfFile.containsIniSetting`
- ("SeatDefaults", "autologin-user", u)
- `describe` "lightdm autologin"
- `requires` installed
+autoLogin :: User -> RevertableProperty DebianLike DebianLike
+autoLogin (User u) = (setup <!> cleanup)
+ `describe` ("lightdm autologin for " ++ u)
+ where
+ cf = "/etc/lightdm/lightdm.conf"
+ setting = ("Seat:*", "autologin-user", u)
+ setup = cf `ConfFile.containsIniSetting` setting
+ `requires` installed
+ cleanup = tightenTargets $ cf `ConfFile.lacksIniSetting` setting
diff --git a/src/Propellor/Property/Network.hs b/src/Propellor/Property/Network.hs
index 9ed9e591..b581fa3f 100644
--- a/src/Propellor/Property/Network.hs
+++ b/src/Propellor/Property/Network.hs
@@ -7,6 +7,9 @@ import Data.Char
type Interface = String
+-- | Options to put in a stanza of an ifupdown interfaces file.
+type InterfaceOptions = [(String, String)]
+
ifUp :: Interface -> Property DebianLike
ifUp iface = tightenTargets $ cmdProperty "ifup" [iface]
`assume` MadeChange
@@ -19,27 +22,57 @@ ifUp iface = tightenTargets $ cmdProperty "ifup" [iface]
--
-- No interfaces are brought up or down by this property.
cleanInterfacesFile :: Property DebianLike
-cleanInterfacesFile = tightenTargets $ hasContent interfacesFile
- [ "# Deployed by propellor, do not edit."
- , ""
- , "source-directory interfaces.d"
+cleanInterfacesFile = interfaceFileContains interfacesFile
+ [ "source-directory interfaces.d"
, ""
, "# The loopback network interface"
, "auto lo"
, "iface lo inet loopback"
]
+ []
`describe` ("clean " ++ interfacesFile)
-- | Configures an interface to get its address via dhcp.
dhcp :: Interface -> Property DebianLike
-dhcp iface = tightenTargets $ hasContent (interfaceDFile iface)
+dhcp iface = dhcp' iface mempty
+
+dhcp' :: Interface -> InterfaceOptions -> Property DebianLike
+dhcp' iface options = interfaceFileContains (interfaceDFile iface)
[ "auto " ++ iface
, "iface " ++ iface ++ " inet dhcp"
- ]
+ ] options
`describe` ("dhcp " ++ iface)
`requires` interfacesDEnabled
--- | Writes a static interface file for the specified interface.
+newtype Gateway = Gateway IPAddr
+
+-- | Configures an interface with a static address and gateway.
+static :: Interface -> IPAddr -> Maybe Gateway -> Property DebianLike
+static iface addr gateway = static' iface addr gateway mempty
+
+static' :: Interface -> IPAddr -> Maybe Gateway -> InterfaceOptions -> Property DebianLike
+static' iface addr gateway options =
+ interfaceFileContains (interfaceDFile iface) headerlines options'
+ `describe` ("static IP address for " ++ iface)
+ `requires` interfacesDEnabled
+ where
+ headerlines =
+ [ "auto " ++ iface
+ , "iface " ++ iface ++ " " ++ inet ++ " static"
+ ]
+ options' = catMaybes
+ [ Just $ ("address", val addr)
+ , case gateway of
+ Just (Gateway gaddr) ->
+ Just ("gateway", val gaddr)
+ Nothing -> Nothing
+ ] ++ options
+ inet = case addr of
+ IPv4 _ -> "inet"
+ IPv6 _ -> "inet6"
+
+-- | Writes a static interface file for the specified interface
+-- to preserve its current configuration.
--
-- The interface has to be up already. It could have been brought up by
-- DHCP, or by other means. The current ipv4 addresses
@@ -50,8 +83,8 @@ dhcp iface = tightenTargets $ hasContent (interfaceDFile iface)
--
-- (ipv6 addresses are not included because it's assumed they come up
-- automatically in most situations.)
-static :: Interface -> Property DebianLike
-static iface = tightenTargets $
+preserveStatic :: Interface -> Property DebianLike
+preserveStatic iface = tightenTargets $
check (not <$> doesFileExist f) setup
`describe` desc
`requires` interfacesDEnabled
@@ -84,13 +117,13 @@ static iface = tightenTargets $
-- | 6to4 ipv6 connection, should work anywhere
ipv6to4 :: Property DebianLike
-ipv6to4 = tightenTargets $ hasContent (interfaceDFile "sit0")
- [ "# Deployed by propellor, do not edit."
+ipv6to4 = tightenTargets $ interfaceFileContains (interfaceDFile "sit0")
+ [ "auto sit0"
, "iface sit0 inet6 static"
- , "\taddress 2002:5044:5531::1"
- , "\tnetmask 64"
- , "\tgateway ::192.88.99.1"
- , "auto sit0"
+ ]
+ [ ("address", "2002:5044:5531::1")
+ , ("netmask", "64")
+ , ("gateway", "::192.88.99.1")
]
`describe` "ipv6to4"
`requires` interfacesDEnabled
@@ -114,3 +147,10 @@ interfacesDEnabled :: Property DebianLike
interfacesDEnabled = tightenTargets $
containsLine interfacesFile "source-directory interfaces.d"
`describe` "interfaces.d directory enabled"
+
+interfaceFileContains :: FilePath -> [String] -> InterfaceOptions -> Property DebianLike
+interfaceFileContains f headerlines options = tightenTargets $ hasContent f $
+ warning : headerlines ++ map fmt options
+ where
+ fmt (k, v) = "\t" ++ k ++ " " ++ v
+ warning = "# Deployed by propellor, do not edit."
diff --git a/src/Propellor/Property/OS.hs b/src/Propellor/Property/OS.hs
index 10d7afc0..c31bef7b 100644
--- a/src/Propellor/Property/OS.hs
+++ b/src/Propellor/Property/OS.hs
@@ -207,7 +207,7 @@ preserveNetwork = go `requires` Network.cleanInterfacesFile
["route", "list", "scope", "global"]
case words <$> headMaybe ls of
Just ("default":"via":_:"dev":iface:_) ->
- ensureProperty w $ Network.static iface
+ ensureProperty w $ Network.preserveStatic iface
_ -> do
warningMessage "did not find any default ipv4 route"
return FailedChange
diff --git a/src/Propellor/Property/Parted.hs b/src/Propellor/Property/Parted.hs
index f7ac379f..43744142 100644
--- a/src/Propellor/Property/Parted.hs
+++ b/src/Propellor/Property/Parted.hs
@@ -1,6 +1,7 @@
{-# LANGUAGE FlexibleContexts #-}
module Propellor.Property.Parted (
+ -- * Types
TableType(..),
PartTable(..),
partTableSize,
@@ -15,137 +16,30 @@ module Propellor.Property.Parted (
Partition.MkfsOpts,
PartType(..),
PartFlag(..),
- Eep(..),
+ -- * Properties
partitioned,
parted,
+ Eep(..),
installed,
+ -- * PartSpec combinators
+ calcPartTable,
+ DiskSize(..),
+ DiskPart,
+ module Propellor.Types.PartSpec,
+ DiskSpaceUse(..),
+ useDiskSpace,
) where
import Propellor.Base
+import Propellor.Property.Parted.Types
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Pacman as Pacman
import qualified Propellor.Property.Partition as Partition
+import Propellor.Types.PartSpec
import Utility.DataUnits
-import Data.Char
-import System.Posix.Files
-
-class PartedVal a where
- pval :: a -> String
-
--- | Types of partition tables supported by parted.
-data TableType = MSDOS | GPT | AIX | AMIGA | BSD | DVH | LOOP | MAC | PC98 | SUN
- deriving (Show)
-
-instance PartedVal TableType where
- pval = map toLower . show
-
--- | A disk's partition table.
-data PartTable = PartTable TableType [Partition]
- deriving (Show)
-
-instance Monoid PartTable where
- -- | default TableType is MSDOS
- mempty = PartTable MSDOS []
- -- | uses the TableType of the second parameter
- mappend (PartTable _l1 ps1) (PartTable l2 ps2) = PartTable l2 (ps1 ++ ps2)
-
--- | Gets the total size of the disk specified by the partition table.
-partTableSize :: PartTable -> ByteSize
-partTableSize (PartTable _ ps) = fromPartSize $
- -- add 1 megabyte to hold the partition table itself
- mconcat (MegaBytes 1 : map partSize ps)
-
--- | A partition on the disk.
-data Partition = Partition
- { partType :: PartType
- , partSize :: PartSize
- , partFs :: Partition.Fs
- , partMkFsOpts :: Partition.MkfsOpts
- , partFlags :: [(PartFlag, Bool)] -- ^ flags can be set or unset (parted may set some flags by default)
- , partName :: Maybe String -- ^ optional name for partition (only works for GPT, PC98, MAC)
- }
- deriving (Show)
-
--- | Makes a Partition with defaults for non-important values.
-mkPartition :: Partition.Fs -> PartSize -> Partition
-mkPartition fs sz = Partition
- { partType = Primary
- , partSize = sz
- , partFs = fs
- , partMkFsOpts = []
- , partFlags = []
- , partName = Nothing
- }
-
--- | Type of a partition.
-data PartType = Primary | Logical | Extended
- deriving (Show)
-
-instance PartedVal PartType where
- pval Primary = "primary"
- pval Logical = "logical"
- pval Extended = "extended"
-
--- | All partition sizing is done in megabytes, so that parted can
--- automatically lay out the partitions.
---
--- Note that these are SI megabytes, not mebibytes.
-newtype PartSize = MegaBytes Integer
- deriving (Show)
-
-instance PartedVal PartSize where
- pval (MegaBytes n)
- | n > 0 = val n ++ "MB"
- -- parted can't make partitions smaller than 1MB;
- -- avoid failure in edge cases
- | otherwise = "1MB"
--- | Rounds up to the nearest MegaByte.
-toPartSize :: ByteSize -> PartSize
-toPartSize b = MegaBytes $ ceiling (fromInteger b / 1000000 :: Double)
-
-fromPartSize :: PartSize -> ByteSize
-fromPartSize (MegaBytes b) = b * 1000000
-
-instance Monoid PartSize where
- mempty = MegaBytes 0
- mappend (MegaBytes a) (MegaBytes b) = MegaBytes (a + b)
-
-reducePartSize :: PartSize -> PartSize -> PartSize
-reducePartSize (MegaBytes a) (MegaBytes b) = MegaBytes (a - b)
-
--- | Flags that can be set on a partition.
-data PartFlag = BootFlag | RootFlag | SwapFlag | HiddenFlag | RaidFlag | LvmFlag | LbaFlag | LegacyBootFlag | IrstFlag | EspFlag | PaloFlag
- deriving (Show)
-
-instance PartedVal PartFlag where
- pval BootFlag = "boot"
- pval RootFlag = "root"
- pval SwapFlag = "swap"
- pval HiddenFlag = "hidden"
- pval RaidFlag = "raid"
- pval LvmFlag = "lvm"
- pval LbaFlag = "lba"
- pval LegacyBootFlag = "legacy_boot"
- pval IrstFlag = "irst"
- pval EspFlag = "esp"
- pval PaloFlag = "palo"
-
-instance PartedVal Bool where
- pval True = "on"
- pval False = "off"
-
-instance PartedVal Partition.Fs where
- pval Partition.EXT2 = "ext2"
- pval Partition.EXT3 = "ext3"
- pval Partition.EXT4 = "ext4"
- pval Partition.BTRFS = "btrfs"
- pval Partition.REISERFS = "reiserfs"
- pval Partition.XFS = "xfs"
- pval Partition.FAT = "fat"
- pval Partition.VFAT = "vfat"
- pval Partition.NTFS = "ntfs"
- pval Partition.LinuxSwap = "linux-swap"
+import System.Posix.Files
+import Data.List (genericLength)
data Eep = YesReallyDeleteDiskContents
@@ -202,3 +96,67 @@ parted YesReallyDeleteDiskContents disk ps = p `requires` installed
-- | Gets parted installed.
installed :: Property (DebianLike + ArchLinux)
installed = Apt.installed ["parted"] `pickOS` Pacman.installed ["parted"]
+
+-- | Gets the total size of the disk specified by the partition table.
+partTableSize :: PartTable -> ByteSize
+partTableSize (PartTable _ ps) = fromPartSize $
+ mconcat (partitionTableOverhead : map partSize ps)
+
+-- | Some disk is used to store the partition table itself. Assume less
+-- than 1 mb.
+partitionTableOverhead :: PartSize
+partitionTableOverhead = MegaBytes 1
+
+-- | Calculate a partition table, for a given size of disk.
+--
+-- For example:
+--
+-- > calcPartTable (DiskSize (1024 * 1024 * 1024 * 100)) MSDOS
+-- > [ partition EXT2 `mountedAt` "/boot"
+-- > `setSize` MegaBytes 256
+-- > `setFlag` BootFlag
+-- > , partition EXT4 `mountedAt` "/"
+-- > `useDisk` RemainingSpace
+-- > ]
+calcPartTable :: DiskSize -> TableType -> [PartSpec DiskPart] -> PartTable
+calcPartTable (DiskSize disksize) tt l = PartTable tt (map go l)
+ where
+ go (_, _, mkpart, FixedDiskPart) = mkpart defSz
+ go (_, _, mkpart, DynamicDiskPart (Percent p)) = mkpart $ toPartSize $
+ diskremainingafterfixed * fromIntegral p `div` 100
+ go (_, _, mkpart, DynamicDiskPart RemainingSpace) = mkpart $ toPartSize $
+ diskremaining `div` genericLength (filter isremainingspace l)
+ diskremainingafterfixed =
+ disksize - sumsizes (filter isfixed l)
+ diskremaining =
+ disksize - sumsizes (filter (not . isremainingspace) l)
+ sumsizes = sum . map fromPartSize . (partitionTableOverhead :) .
+ map (partSize . go)
+ isfixed (_, _, _, FixedDiskPart) = True
+ isfixed _ = False
+ isremainingspace (_, _, _, DynamicDiskPart RemainingSpace) = True
+ isremainingspace _ = False
+
+-- | Size of a disk, in bytes.
+newtype DiskSize = DiskSize ByteSize
+ deriving (Show)
+
+data DiskPart = FixedDiskPart | DynamicDiskPart DiskSpaceUse
+
+data DiskSpaceUse = Percent Int | RemainingSpace
+
+instance Monoid DiskPart
+ where
+ mempty = FixedDiskPart
+ mappend FixedDiskPart FixedDiskPart = FixedDiskPart
+ mappend (DynamicDiskPart (Percent a)) (DynamicDiskPart (Percent b)) = DynamicDiskPart (Percent (a + b))
+ mappend (DynamicDiskPart RemainingSpace) (DynamicDiskPart RemainingSpace) = DynamicDiskPart RemainingSpace
+ mappend (DynamicDiskPart (Percent a)) _ = DynamicDiskPart (Percent a)
+ mappend _ (DynamicDiskPart (Percent b)) = DynamicDiskPart (Percent b)
+ mappend (DynamicDiskPart RemainingSpace) _ = DynamicDiskPart RemainingSpace
+ mappend _ (DynamicDiskPart RemainingSpace) = DynamicDiskPart RemainingSpace
+
+-- | Make a partition use some percentage of the size of the disk
+-- (less all fixed size partitions), or the remaining space in the disk.
+useDiskSpace :: PartSpec DiskPart -> DiskSpaceUse -> PartSpec DiskPart
+useDiskSpace (mp, o, p, _) diskuse = (mp, o, p, DynamicDiskPart diskuse)
diff --git a/src/Propellor/Property/Parted/Types.hs b/src/Propellor/Property/Parted/Types.hs
new file mode 100644
index 00000000..3350e008
--- /dev/null
+++ b/src/Propellor/Property/Parted/Types.hs
@@ -0,0 +1,119 @@
+module Propellor.Property.Parted.Types where
+
+import Propellor.Base
+import qualified Propellor.Property.Partition as Partition
+import Utility.DataUnits
+
+import Data.Char
+
+class PartedVal a where
+ pval :: a -> String
+
+-- | Types of partition tables supported by parted.
+data TableType = MSDOS | GPT | AIX | AMIGA | BSD | DVH | LOOP | MAC | PC98 | SUN
+ deriving (Show)
+
+instance PartedVal TableType where
+ pval = map toLower . show
+
+-- | A disk's partition table.
+data PartTable = PartTable TableType [Partition]
+ deriving (Show)
+
+instance Monoid PartTable where
+ -- | default TableType is MSDOS
+ mempty = PartTable MSDOS []
+ -- | uses the TableType of the second parameter
+ mappend (PartTable _l1 ps1) (PartTable l2 ps2) = PartTable l2 (ps1 ++ ps2)
+
+-- | A partition on the disk.
+data Partition = Partition
+ { partType :: PartType
+ , partSize :: PartSize
+ , partFs :: Partition.Fs
+ , partMkFsOpts :: Partition.MkfsOpts
+ , partFlags :: [(PartFlag, Bool)] -- ^ flags can be set or unset (parted may set some flags by default)
+ , partName :: Maybe String -- ^ optional name for partition (only works for GPT, PC98, MAC)
+ }
+ deriving (Show)
+
+-- | Makes a Partition with defaults for non-important values.
+mkPartition :: Partition.Fs -> PartSize -> Partition
+mkPartition fs sz = Partition
+ { partType = Primary
+ , partSize = sz
+ , partFs = fs
+ , partMkFsOpts = []
+ , partFlags = []
+ , partName = Nothing
+ }
+
+-- | Type of a partition.
+data PartType = Primary | Logical | Extended
+ deriving (Show)
+
+instance PartedVal PartType where
+ pval Primary = "primary"
+ pval Logical = "logical"
+ pval Extended = "extended"
+
+-- | All partition sizing is done in megabytes, so that parted can
+-- automatically lay out the partitions.
+--
+-- Note that these are SI megabytes, not mebibytes.
+newtype PartSize = MegaBytes Integer
+ deriving (Show)
+
+instance PartedVal PartSize where
+ pval (MegaBytes n)
+ | n > 0 = val n ++ "MB"
+ -- parted can't make partitions smaller than 1MB;
+ -- avoid failure in edge cases
+ | otherwise = "1MB"
+
+-- | Rounds up to the nearest MegaByte.
+toPartSize :: ByteSize -> PartSize
+toPartSize b = MegaBytes $ ceiling (fromInteger b / 1000000 :: Double)
+
+fromPartSize :: PartSize -> ByteSize
+fromPartSize (MegaBytes b) = b * 1000000
+
+instance Monoid PartSize where
+ mempty = MegaBytes 0
+ mappend (MegaBytes a) (MegaBytes b) = MegaBytes (a + b)
+
+reducePartSize :: PartSize -> PartSize -> PartSize
+reducePartSize (MegaBytes a) (MegaBytes b) = MegaBytes (a - b)
+
+-- | Flags that can be set on a partition.
+data PartFlag = BootFlag | RootFlag | SwapFlag | HiddenFlag | RaidFlag | LvmFlag | LbaFlag | LegacyBootFlag | IrstFlag | EspFlag | PaloFlag
+ deriving (Show)
+
+instance PartedVal PartFlag where
+ pval BootFlag = "boot"
+ pval RootFlag = "root"
+ pval SwapFlag = "swap"
+ pval HiddenFlag = "hidden"
+ pval RaidFlag = "raid"
+ pval LvmFlag = "lvm"
+ pval LbaFlag = "lba"
+ pval LegacyBootFlag = "legacy_boot"
+ pval IrstFlag = "irst"
+ pval EspFlag = "esp"
+ pval PaloFlag = "palo"
+
+instance PartedVal Bool where
+ pval True = "on"
+ pval False = "off"
+
+instance PartedVal Partition.Fs where
+ pval Partition.EXT2 = "ext2"
+ pval Partition.EXT3 = "ext3"
+ pval Partition.EXT4 = "ext4"
+ pval Partition.BTRFS = "btrfs"
+ pval Partition.REISERFS = "reiserfs"
+ pval Partition.XFS = "xfs"
+ pval Partition.FAT = "fat"
+ pval Partition.VFAT = "vfat"
+ pval Partition.NTFS = "ntfs"
+ pval Partition.LinuxSwap = "linux-swap"
diff --git a/src/Propellor/Property/Reboot.hs b/src/Propellor/Property/Reboot.hs
index 3781cd7b..909d87fb 100644
--- a/src/Propellor/Property/Reboot.hs
+++ b/src/Propellor/Property/Reboot.hs
@@ -78,15 +78,16 @@ toKernelNewerThan ver =
property' ("reboot to kernel newer than " ++ ver) $ \w -> do
wantV <- tryReadVersion ver
runningV <- tryReadVersion =<< liftIO runningKernelVersion
- installedV <- maximum <$>
- (mapM tryReadVersion =<< liftIO installedKernelVersions)
if runningV >= wantV then noChange
- else if installedV >= wantV
- then ensureProperty w now
- else errorMessage $
- "kernel newer than "
- ++ ver
- ++ " not installed"
+ else maximum <$> installedVs >>= \installedV ->
+ if installedV >= wantV
+ then ensureProperty w now
+ else errorMessage $
+ "kernel newer than "
+ ++ ver
+ ++ " not installed"
+ where
+ installedVs = mapM tryReadVersion =<< liftIO installedKernelVersions
runningInstalledKernel :: IO Bool
runningInstalledKernel = do
diff --git a/src/Propellor/Property/Rsync.hs b/src/Propellor/Property/Rsync.hs
index 53baa74e..5665ab91 100644
--- a/src/Propellor/Property/Rsync.hs
+++ b/src/Propellor/Property/Rsync.hs
@@ -60,4 +60,7 @@ syncDirFiltered filters src dest = rsync $
rsync :: [String] -> Property (DebianLike + ArchLinux)
rsync ps = cmdProperty "rsync" ps
`assume` MadeChange
- `requires` Apt.installed ["rsync"] `pickOS` Pacman.installed ["rsync"]
+ `requires` installed
+
+installed :: Property (DebianLike + ArchLinux)
+installed = Apt.installed ["rsync"] `pickOS` Pacman.installed ["rsync"]
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index 6e0d6c4e..d686f3d9 100644
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -19,6 +19,7 @@ import qualified Propellor.Property.Obnam as Obnam
import qualified Propellor.Property.Apache as Apache
import qualified Propellor.Property.Postfix as Postfix
import qualified Propellor.Property.Systemd as Systemd
+import qualified Propellor.Property.Network as Network
import qualified Propellor.Property.Fail2Ban as Fail2Ban
import qualified Propellor.Property.LetsEncrypt as LetsEncrypt
import Utility.FileMode
@@ -929,3 +930,82 @@ alarmClock oncalendar (User user) command = combineProperties "goodmorning timer
& Systemd.started "goodmorning.timer"
& "/etc/systemd/logind.conf" `ConfFile.containsIniSetting`
("Login", "LidSwitchIgnoreInhibited", "no")
+
+-- My home router, running hostapd and dnsmasq for wlan0,
+-- with eth0 connected to a satellite modem, and a fallback ppp connection.
+homeRouter :: Property (HasInfo + DebianLike)
+homeRouter = propertyList "home router" $ props
+ & Network.static "wlan0" (IPv4 "10.1.1.1") Nothing
+ `requires` Network.cleanInterfacesFile
+ & Apt.serviceInstalledRunning "hostapd"
+ `requires` File.hasContent "/etc/hostapd/hostapd.conf"
+ [ "interface=wlan0"
+ , "ssid=house"
+ , "hw_mode=g"
+ , "channel=8"
+ ]
+ `requires` File.dirExists "/lib/hostapd"
+ & Apt.serviceInstalledRunning "dnsmasq"
+ `requires` File.hasContent "/etc/dnsmasq.conf"
+ [ "domain-needed"
+ , "bogus-priv"
+ , "interface=wlan0"
+ , "domain=kitenet.net"
+ , "dhcp-range=10.1.1.100,10.1.1.150,24h"
+ , "no-hosts"
+ , "address=/honeybee.kitenet.net/10.1.1.1"
+ ]
+ `requires` File.hasContent "/etc/resolv.conf"
+ [ "domain kitenet.net"
+ , "search kitenet.net"
+ , "nameserver 8.8.8.8"
+ , "nameserver 8.8.4.4"
+ ]
+ & ipmasq "wlan0"
+ & Apt.serviceInstalledRunning "netplug"
+ & Network.static' "eth0" (IPv4 "192.168.1.42")
+ (Just (Network.Gateway (IPv4 "192.168.1.1")))
+ -- When satellite is down, fall back to dialup
+ [ ("pre-up", "poff -a || true")
+ , ("post-down", "pon")
+ ]
+ `requires` Network.cleanInterfacesFile
+ & Apt.installed ["ppp"]
+ `before` File.hasContent "/etc/ppp/peers/provider"
+ [ "user \"joeyh@arczip.com\""
+ , "connect \"/usr/sbin/chat -v -f /etc/chatscripts/pap -T 9734111\""
+ , "/dev/ttyACM0"
+ , "115200"
+ , "noipdefault"
+ , "defaultroute"
+ , "persist"
+ , "noauth"
+ ]
+ `before` File.hasPrivContent "/etc/ppp/pap-secrets" (Context "joeyh@arczip.com")
+
+-- | Enable IP masqerading, on whatever other interfaces come up than the
+-- provided intif.
+ipmasq :: String -> Property DebianLike
+ipmasq intif = File.hasContent ifupscript
+ [ "#!/bin/sh"
+ , "INTIF=" ++ intif
+ , "if [ \"$IFACE\" = $INTIF ] || [ \"$IFACE\" = lo ]; then"
+ , "exit 0"
+ , "fi"
+ , "iptables -F"
+ , "iptables -A FORWARD -i $IFACE -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT"
+ , "iptables -A FORWARD -i $INTIF -o $IFACE -j ACCEPT"
+ , "iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE"
+ , "echo 1 > /proc/sys/net/ipv4/ip_forward"
+ ]
+ `before` scriptmode ifupscript
+ `before` File.hasContent pppupscript
+ [ "#!/bin/sh"
+ , "IFACE=$PPP_IFACE " ++ ifupscript
+ ]
+ `before` scriptmode pppupscript
+ `requires` Apt.installed ["iptables"]
+ where
+ ifupscript = "/etc/network/if-up.d/ipmasq"
+ pppupscript = "/etc/ppp/ip-up.d/ipmasq"
+ scriptmode f = f `File.mode` combineModes (readModes ++ executeModes)
diff --git a/src/Propellor/Property/Sudo.hs b/src/Propellor/Property/Sudo.hs
index 45ab8af2..1614801d 100644
--- a/src/Propellor/Property/Sudo.hs
+++ b/src/Propellor/Property/Sudo.hs
@@ -9,23 +9,33 @@ import Propellor.Property.User
-- | Allows a user to sudo. If the user has a password, sudo is configured
-- to require it. If not, NOPASSWORD is enabled for the user.
-enabledFor :: User -> Property DebianLike
-enabledFor user@(User u) = go `requires` Apt.installed ["sudo"]
+enabledFor :: User -> RevertableProperty DebianLike DebianLike
+enabledFor user@(User u) = setup `requires` Apt.installed ["sudo"] <!> cleanup
where
- go :: Property UnixLike
- go = property' desc $ \w -> do
+ setup :: Property UnixLike
+ setup = property' desc $ \w -> do
locked <- liftIO $ isLockedPassword user
ensureProperty w $
fileProperty desc
(modify locked . filter (wanted locked))
- "/etc/sudoers"
- desc = u ++ " is sudoer"
+ sudoers
+ where
+ desc = u ++ " is sudoer"
+
+ cleanup :: Property DebianLike
+ cleanup = tightenTargets $
+ fileProperty desc (filter notuserline) sudoers
+ where
+ desc = u ++ " is not sudoer"
+
+ sudoers = "/etc/sudoers"
sudobaseline = u ++ " ALL=(ALL:ALL)"
+ notuserline l = not (sudobaseline `isPrefixOf` l)
sudoline True = sudobaseline ++ " NOPASSWD:ALL"
sudoline False = sudobaseline ++ " ALL"
wanted locked l
-- TOOD: Full sudoers file format parse..
- | not (sudobaseline `isPrefixOf` l) = True
+ | notuserline l = True
| "NOPASSWD" `isInfixOf` l = locked
| otherwise = True
modify locked ls
diff --git a/src/Propellor/Property/Systemd.hs b/src/Propellor/Property/Systemd.hs
index d1a94aa8..51d1313c 100644
--- a/src/Propellor/Property/Systemd.hs
+++ b/src/Propellor/Property/Systemd.hs
@@ -283,54 +283,42 @@ nspawned c@(Container name (Chroot.Chroot loc builder _ _) h) =
chroot = Chroot.Chroot loc builder Chroot.propagateChrootInfo h
--- | Sets up the service file for the container, and then starts
--- it running.
+-- | Sets up the service files for the container, using the
+-- systemd-nspawn@.service template, and starts it running.
nspawnService :: Container -> ChrootCfg -> RevertableProperty Linux Linux
nspawnService (Container name _ _) cfg = setup <!> teardown
where
service = nspawnServiceName name
- servicefile = "/etc/systemd/system/multi-user.target.wants" </> service
-
- servicefilecontent = do
- ls <- lines <$> readFile "/lib/systemd/system/systemd-nspawn@.service"
- return $ unlines $
- "# deployed by propellor" : map addparams ls
- addparams l
- | "ExecStart=" `isPrefixOf` l = unwords $
- [ "ExecStart = /usr/bin/systemd-nspawn"
- , "--quiet"
- , "--keep-unit"
- , "--boot"
- , "--directory=" ++ containerDir name
- , "--machine=%i"
- ] ++ nspawnServiceParams cfg
- | otherwise = l
-
- goodservicefile = (==)
- <$> servicefilecontent
- <*> catchDefaultIO "" (readFile servicefile)
-
- writeservicefile :: Property Linux
- writeservicefile = property servicefile $ makeChange $ do
- c <- servicefilecontent
- File.viaStableTmp (\t -> writeFile t c) servicefile
-
- setupservicefile :: Property Linux
- setupservicefile = check (not <$> goodservicefile) $
- -- if it's running, it has the wrong configuration,
- -- so stop it
- stopped service
- `requires` daemonReloaded
- `requires` writeservicefile
+ overridedir = "/etc/systemd/system" </> nspawnServiceName name ++ ".d"
+ overridefile = overridedir </> "local.conf"
+ overridecontent =
+ [ "[Service]"
+ , "# Reset ExecStart from the template"
+ , "ExecStart="
+ , "ExecStart=/usr/bin/systemd-nspawn " ++ unwords nspawnparams
+ ]
+ nspawnparams =
+ [ "--quiet"
+ , "--keep-unit"
+ , "--boot"
+ , "--directory=" ++ containerDir name
+ , "--machine=" ++ name
+ ] ++ nspawnServiceParams cfg
+
+ overrideconfigured = File.hasContent overridefile overridecontent
+ `onChange` daemonReloaded
+ `requires` File.dirExists overridedir
setup :: Property Linux
setup = started service
- `requires` setupservicefile
+ `requires` enabled service
+ `requires` overrideconfigured
`requires` machined
teardown :: Property Linux
- teardown = check (doesFileExist servicefile) $
- disabled service `requires` stopped service
+ teardown = stopped service
+ `before` disabled service
+ `before` File.notPresent overridefile
nspawnServiceParams :: ChrootCfg -> [String]
nspawnServiceParams NoChrootCfg = []
diff --git a/src/Propellor/Property/Timezone.hs b/src/Propellor/Property/Timezone.hs
new file mode 100644
index 00000000..96a5e59c
--- /dev/null
+++ b/src/Propellor/Property/Timezone.hs
@@ -0,0 +1,21 @@
+-- | Maintainer: Sean Whitton <spwhitton@spwhitton.name>
+
+module Propellor.Property.Timezone where
+
+import Propellor.Base
+import qualified Propellor.Property.Apt as Apt
+import qualified Propellor.Property.File as File
+
+-- | A timezone from /usr/share/zoneinfo
+type Timezone = String
+
+-- | Sets the system's timezone
+configured :: Timezone -> Property DebianLike
+configured zone = File.hasContent "/etc/timezone" [zone]
+ `onChange` update
+ `describe` (zone ++ " timezone configured")
+ where
+ update = Apt.reConfigure "tzdata" mempty
+ -- work around a bug in recent tzdata. See
+ -- https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806/
+ `requires` File.notPresent "/etc/localtime"
diff --git a/src/Propellor/Property/Versioned.hs b/src/Propellor/Property/Versioned.hs
new file mode 100644
index 00000000..87673c64
--- /dev/null
+++ b/src/Propellor/Property/Versioned.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE RankNTypes, FlexibleContexts, TypeFamilies #-}
+
+-- | Versioned properties and hosts.
+--
+-- When importing and using this module, you will need to enable some
+-- language extensions:
+--
+-- > {-# LANGUAGE RankNTypes, FlexibleContexts, TypeFamilies #-}
+--
+-- This module takes advantage of `RevertableProperty` to let propellor
+-- switch cleanly between versions. The way it works is all revertable
+-- properties for other versions than the current version are first
+-- reverted, and then propellor ensures the property for the current
+-- version. This method should work for any combination of revertable
+-- properties.
+--
+-- For example:
+--
+-- > demo :: Versioned Int (RevertableProperty DebianLike DebianLike)
+-- > demo ver =
+-- > ver ( (== 1) --> Apache.modEnabled "foo"
+-- > `requires` Apache.modEnabled "foosupport"
+-- > <|> (== 2) --> Apache.modEnabled "bar"
+-- > <|> (> 2) --> Apache.modEnabled "baz"
+-- > )
+-- >
+-- > foo :: Host
+-- > foo = host "foo.example.com" $ props
+-- > & demo `version` (2 :: Int)
+--
+-- Similarly, a whole Host can be versioned. For example:
+--
+-- > bar :: Versioned Int Host
+-- > bar ver = host "bar.example.com" $ props
+-- > & osDebian Unstable X86_64
+-- > & ver ( (== 1) --> Apache.modEnabled "foo"
+-- > <|> (== 2) --> Apache.modEnabled "bar"
+-- > )
+-- > & ver ( (>= 2) --> Apt.unattendedUpgrades )
+--
+-- Note that some versioning of revertable properties may cause
+-- propellor to do a lot of unnecessary work each time it's run.
+-- Here's an example of such a problem:
+--
+-- > slow :: Versioned Int -> RevertableProperty DebianLike DebianLike
+-- > slow ver =
+-- > ver ( (== 1) --> (Apt.installed "foo" <!> Apt.removed "foo")
+-- > <|> (== 2) --> (Apt.installed "bar" <!> Apt.removed "bar")
+-- > )
+--
+-- Suppose that package bar depends on package foo. Then at version 2,
+-- propellor will remove package foo in order to revert version 1, only
+-- to re-install it since version 2 also needs it installed.
+
+module Propellor.Property.Versioned (Versioned, version, (-->), (<|>)) where
+
+import Propellor
+import Propellor.Types.Core
+
+import Data.List
+
+-- | Something that has multiple versions of type `v`.
+type Versioned v t = VersionedBy v -> t
+
+type VersionedBy v
+ = forall metatypes. Combines (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes)
+ => (CombinedType (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes) ~ RevertableProperty metatypes metatypes)
+ => (VerSpec v metatypes -> RevertableProperty metatypes metatypes)
+
+-- | Access a particular version of a Versioned value.
+version :: (Versioned v t) -> v -> t
+version f v = f (processVerSpec v)
+
+-- A specification of versions.
+--
+-- Why is this not a simple list like
+-- [(v -> Bool, RevertableProperty metatypes metatypes)] ?
+-- Using a list would mean the empty list would need to be dealt with,
+-- and processVerSpec does not have a Monoid instance for
+-- RevertableProperty metatypes metatypes in scope, and due to the way the
+-- Versioned type works, the compiler cannot find such an instance.
+--
+-- Also, using this data type allows a nice syntax for creating
+-- VerSpecs, via the `<&>` and `alt` functions.
+data VerSpec v metatypes
+ = Base (v -> Bool, RevertableProperty metatypes metatypes)
+ | More (v -> Bool, RevertableProperty metatypes metatypes) (VerSpec v metatypes)
+
+processVerSpec
+ :: Combines (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes)
+ => (CombinedType (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes) ~ RevertableProperty metatypes metatypes)
+ => v
+ -> VerSpec v metatypes
+ -> RevertableProperty metatypes metatypes
+processVerSpec v s = combinedp s
+ `describe` intercalate " and " (combineddesc s [])
+ where
+ combinedp (Base (c, p))
+ | c v = p
+ | otherwise = revert p
+ combinedp (More (c, p) vs)
+ | c v = combinedp vs `before` p
+ | otherwise = revert p `before` combinedp vs
+ combineddesc (Base (c, p)) l
+ | c v = getDesc p : l
+ | otherwise = getDesc (revert p) : l
+ combineddesc (More (c, p) vs) l
+ | c v = getDesc p : combineddesc vs l
+ | otherwise = getDesc (revert p) : combineddesc vs l
+
+-- | Specify a function that checks the version, and what
+-- `RevertableProperty` to use if the version matches.
+(-->) :: (v -> Bool) -> RevertableProperty metatypes metatypes -> VerSpec v metatypes
+c --> p = Base (c, p)
+
+-- | Add an alternate version.
+(<|>) :: VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes
+Base a <|> Base b = More a (Base b)
+Base a <|> More b c = More a (More b c)
+More b c <|> Base a = More a (More b c)
+More a b <|> More c d = More a (More c (b <|> d))
+
+infixl 8 -->
+infixl 2 <|>
diff --git a/src/Propellor/Types.hs b/src/Propellor/Types.hs
index 155662c2..b7c7c7f7 100644
--- a/src/Propellor/Types.hs
+++ b/src/Propellor/Types.hs
@@ -107,6 +107,10 @@ adjustPropertySatisfy (Property t d s i c) f = Property t d (f <$> s) i c
-- | A property that can be reverted. The first Property is run
-- normally and the second is run when it's reverted.
+--
+-- See `Propellor.Property.Versioned.Versioned`
+-- for a way to use RevertableProperty to define different
+-- versions of a host.
data RevertableProperty setupmetatypes undometatypes = RevertableProperty
{ setupRevertableProperty :: Property setupmetatypes
, undoRevertableProperty :: Property undometatypes
diff --git a/src/Propellor/Types/Bootloader.hs b/src/Propellor/Types/Bootloader.hs
index c6953b94..4a75503a 100644
--- a/src/Propellor/Types/Bootloader.hs
+++ b/src/Propellor/Types/Bootloader.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleInstances, DeriveDataTypeable #-}
module Propellor.Types.Bootloader where
diff --git a/src/Propellor/Types/Info.hs b/src/Propellor/Types/Info.hs
index 06212780..6716c403 100644
--- a/src/Propellor/Types/Info.hs
+++ b/src/Propellor/Types/Info.hs
@@ -17,6 +17,7 @@ module Propellor.Types.Info (
import Data.Dynamic
import Data.Maybe
import Data.Monoid
+import qualified Data.Typeable as T
import Prelude
-- | Information about a Host, which can be provided by its properties.
@@ -35,7 +36,7 @@ instance Show InfoEntry where
-- Extracts the value from an InfoEntry but only when
-- it's of the requested type.
extractInfoEntry :: Typeable v => InfoEntry -> Maybe v
-extractInfoEntry (InfoEntry v) = cast v
+extractInfoEntry (InfoEntry v) = T.cast v
-- | Values stored in Info must be members of this class.
--
diff --git a/src/Propellor/Types/PartSpec.hs b/src/Propellor/Types/PartSpec.hs
new file mode 100644
index 00000000..2b0a8787
--- /dev/null
+++ b/src/Propellor/Types/PartSpec.hs
@@ -0,0 +1,66 @@
+-- | Partition specification combinators.
+
+module Propellor.Types.PartSpec where
+
+import Propellor.Base
+import Propellor.Property.Parted.Types
+import Propellor.Property.Mount
+import Propellor.Property.Partition
+
+-- | Specifies a mount point, mount options, and a constructor for a
+-- Partition that determines its size.
+type PartSpec t = (Maybe MountPoint, MountOpts, PartSize -> Partition, t)
+
+-- | Specifies a partition with a given filesystem.
+--
+-- The partition is not mounted anywhere by default; use the combinators
+-- below to configure it.
+partition :: Monoid t => Fs -> PartSpec t
+partition fs = (Nothing, mempty, mkPartition fs, mempty)
+
+-- | Specifies a swap partition of a given size.
+swapPartition :: Monoid t => PartSize -> PartSpec t
+swapPartition sz = (Nothing, mempty, const (mkPartition LinuxSwap sz), mempty)
+
+-- | Specifies where to mount a partition.
+mountedAt :: PartSpec t -> FilePath -> PartSpec t
+mountedAt (_, o, p, t) mp = (Just mp, o, p, t)
+
+-- | Specify a fixed size for a partition.
+setSize :: PartSpec t -> PartSize -> PartSpec t
+setSize (mp, o, p, t) sz = (mp, o, const (p sz), t)
+
+-- | Specifies a mount option, such as "noexec"
+mountOpt :: ToMountOpts o => PartSpec t -> o -> PartSpec t
+mountOpt (mp, o, p, t) o' = (mp, o <> toMountOpts o', p, t)
+
+-- | Mount option to make a partition be remounted readonly when there's an
+-- error accessing it.
+errorReadonly :: MountOpts
+errorReadonly = toMountOpts "errors=remount-ro"
+
+-- | Sets the percent of the filesystem blocks reserved for the super-user.
+--
+-- The default is 5% for ext2 and ext4. Some filesystems may not support
+-- this.
+reservedSpacePercentage :: PartSpec t -> Int -> PartSpec t
+reservedSpacePercentage s percent = adjustp s $ \p ->
+ p { partMkFsOpts = ("-m"):show percent:partMkFsOpts p }
+
+-- | Sets a flag on the partition.
+setFlag :: PartSpec t -> PartFlag -> PartSpec t
+setFlag s f = adjustp s $ \p -> p { partFlags = (f, True):partFlags p }
+
+-- | Makes a MSDOS partition be Extended, rather than Primary.
+extended :: PartSpec t -> PartSpec t
+extended s = adjustp s $ \p -> p { partType = Extended }
+
+adjustp :: PartSpec t -> (Partition -> Partition) -> PartSpec t
+adjustp (mp, o, p, t) f = (mp, o, f . p, t)
+
+adjustt :: PartSpec t -> (t -> t) -> PartSpec t
+adjustt (mp, o, p, t) f = (mp, o, p, f t)
+
+-- | Default partition size when not otherwize specified is 128 MegaBytes.
+defSz :: PartSize
+defSz = MegaBytes 128