packages feed

propellor 4.3.3 → 4.3.4

raw patch · 5 files changed

+135/−2 lines, 5 files

Files

CHANGELOG view
@@ -1,3 +1,13 @@+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
debian/changelog view
@@ -1,3 +1,13 @@+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
propellor.cabal view
@@ -1,5 +1,5 @@ Name: propellor-Version: 4.3.3+Version: 4.3.4 Cabal-Version: >= 1.20 License: BSD2 Maintainer: Joey Hess <id@joeyh.name>@@ -154,6 +154,7 @@     Propellor.Property.Unbound     Propellor.Property.User     Propellor.Property.Uwsgi+    Propellor.Property.Versioned     Propellor.Property.XFCE     Propellor.Property.ZFS     Propellor.Property.ZFS.Process
src/Propellor/Property/LightDM.hs view
@@ -12,6 +12,6 @@ -- | 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)+	("Seat:*", "autologin-user", u) 	`describe` "lightdm autologin" 	`requires` installed
+ src/Propellor/Property/Versioned.hs view
@@ -0,0 +1,112 @@+{-# 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++-- | 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 (Base (c, p))+	| c v = p+	| otherwise = revert p+processVerSpec v (More (c, p) vs)+	| c v = processVerSpec v vs `before` p+	| otherwise = revert p `before` processVerSpec v vs++-- | 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 <|>