<feed xmlns='http://www.w3.org/2005/Atom'>
<title>propellor/src/Propellor/Container.hs, branch master</title>
<subtitle>gnusosa's centralized propellor repository for hosts spin-up.
</subtitle>
<id>https://git.gnusosa.net/propellor/atom?h=master</id>
<link rel='self' href='https://git.gnusosa.net/propellor/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/'/>
<updated>2017-03-15T18:09:07Z</updated>
<entry>
<title>Property types changed to use a Maybe (Propellor Result). (API change)</title>
<updated>2017-03-15T18:09:07Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2017-03-15T18:09:07Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=52ca81661f156122a3a5d4a438fea83e067215ac'/>
<id>urn:sha1:52ca81661f156122a3a5d4a438fea83e067215ac</id>
<content type='text'>
* Property types changed to use a Maybe (Propellor Result). (API change)
* When Nothing needs to be done to ensure a property, propellor
  will avoid displaying its description at all. The doNothing property
  is an example of such a property.

This is mostly in preparation for Monoid instances for Property types, but
is's also nice that anything that uses doNothing will avoid printing out
any message at all. At least, I think it probably is. It might potentially
be confusing for something that sometimes takes an action and sometimes
resolves to doNothing and in either case has a description set to not
always show the description. If this did turn out to be confusing, the
change to doNothing could be reverted.

This commit was sponsored by Boyd Stephen Smith Jr. on Patreon.
</content>
</entry>
<entry>
<title>don't propagate DNS info from DiskImage chroots</title>
<updated>2017-03-11T20:52:00Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2017-03-11T20:52:00Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=9a54ba471986b994f10ad332f27639059c18e7e1'/>
<id>urn:sha1:9a54ba471986b994f10ad332f27639059c18e7e1</id>
<content type='text'>
* DiskImage building properties used to propagate DNS info out from
  the chroot used to build the disk image to the Host. That is no longer
  done, since that chroot only exists as a side effect of the disk image
  creation and servers will not be running in it.
* The IsInfo types class's propagateInfo function changed to use a
  PropagateInfo data type. (API change)

This is particularly important when using hostChroot, since the host could
well have DNS settings then.

This commit was sponsored by Ole-Morten Duesund on Patreon.
</content>
</entry>
<entry>
<title>turn off redundant constraints warnings in cabal file</title>
<updated>2016-11-11T21:42:43Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2016-11-11T21:40:32Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=b1038365960693a013d7026f25d026a1fd098062'/>
<id>urn:sha1:b1038365960693a013d7026f25d026a1fd098062</id>
<content type='text'>
ghc 7 does not support  -fno-warn-redundant-constraints so this can't be
done on a per-module basis.

It would be good to revert this commit when dropping support for ghc 7.
</content>
</entry>
<entry>
<title>Clean up build warnings about redundant constraints when built with ghc 8.0.</title>
<updated>2016-11-11T21:29:25Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2016-11-11T21:29:11Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=c0d0e57257fe8dee1f9d37a6d49b6322af985a69'/>
<id>urn:sha1:c0d0e57257fe8dee1f9d37a6d49b6322af985a69</id>
<content type='text'>
Only a couple of the constraints were really redundant. The rest are
essential to propellor's tracking of Info propigation, so I silenced the
warning for those.

It would be better to only silence the warning for the functions with the
extra constraints, but IIRC warnings can only be silenced on an entire file
basis.

This commit was sponsored by Andreas on Patreon.
</content>
</entry>
<entry>
<title>improve haddocks and move code around to make them more clear</title>
<updated>2016-03-27T23:59:20Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2016-03-27T23:59:20Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=9d6dc29555b8499d8ae6c73c891b0b5dc19f83e5'/>
<id>urn:sha1:9d6dc29555b8499d8ae6c73c891b0b5dc19f83e5</id>
<content type='text'>
</content>
</entry>
<entry>
<title>ported DiskImage</title>
<updated>2016-03-27T20:10:43Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2016-03-27T20:10:43Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=0b0ea182ab3301ade8b87b1be1cdecc3464cd1da'/>
<id>urn:sha1:0b0ea182ab3301ade8b87b1be1cdecc3464cd1da</id>
<content type='text'>
Unfortunately, DiskImage needs to add properties to the Chroot it's
presented with, and the metatypes are not included in the Chroot, so it
can't guarantee that the properties it's adding match the OS in the Chroot.

I partially worked around this by making the properties that DiskImage adds
check the OS, so they don't assume Debian.

It would be nicer to parameterize the Chroot type with the metatypes of the
inner OS. I worked for several hours on a patch along those lines, but it
doesn't quite compile. Failed at the final hurdle :/ The patch is below
for later..

--- src/Propellor/Property/Chroot.hs	2016-03-27 16:06:44.285464820 -0400
+++ /home/joey/Chroot.hs	2016-03-27 15:32:29.073416143 -0400
@@ -1,9 +1,9 @@
-{-# LANGUAGE FlexibleContexts, GADTs, DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleContexts, GADTs, DeriveDataTypeable, MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, DataKinds #-}

 module Propellor.Property.Chroot (
 	debootstrapped,
 	bootstrapped,
-	provisioned,
+	--provisioned,
 	Chroot(..),
 	ChrootBootstrapper(..),
 	Debootstrapped(..),
@@ -11,7 +11,7 @@
 	noServices,
 	inChroot,
 	-- * Internal use
-	provisioned',
+	--provisioned',
 	propagateChrootInfo,
 	propellChroot,
 	chain,
@@ -20,6 +20,7 @@

 import Propellor.Base
 import Propellor.Container
+import Propellor.Types.MetaTypes
 import Propellor.Types.CmdLine
 import Propellor.Types.Chroot
 import Propellor.Types.Info
@@ -38,27 +39,29 @@

 -- | Specification of a chroot. Normally you'll use `debootstrapped` or
 -- `bootstrapped` to construct a Chroot value.
-data Chroot where
-	Chroot :: ChrootBootstrapper b =&gt; FilePath -&gt; b -&gt; Host -&gt; Chroot
-
-instance IsContainer Chroot where
-	containerProperties (Chroot _ _ h) = containerProperties h
-	containerInfo (Chroot _ _ h) = containerInfo h
-	setContainerProperties (Chroot loc b h) ps = Chroot loc b (setContainerProperties h ps)
+--
+-- The inner and outer type variables are the metatypes of the inside of
+-- the chroot and the system it runs in.
+data Chroot inner outer where
+	Chroot :: ChrootBootstrapper b inner outer =&gt; FilePath -&gt; b -&gt; Host -&gt; (inner, outer) -&gt; Chroot inner outer
+
+instance IsContainer (Chroot inner outer) where
+	containerProperties (Chroot _ _ h _) = containerProperties h
+	containerInfo (Chroot _ _ h _) = containerInfo h

-chrootSystem :: Chroot -&gt; Maybe System
+chrootSystem :: Chroot inner outer -&gt; Maybe System
 chrootSystem = fromInfoVal . fromInfo . containerInfo

-instance Show Chroot where
-	show c@(Chroot loc _ _) = "Chroot " ++ loc ++ " " ++ show (chrootSystem c)
+instance Show (Chroot inner outer) where
+	show c@(Chroot loc _ _ _) = "Chroot " ++ loc ++ " " ++ show (chrootSystem c)

 -- | Class of things that can do initial bootstrapping of an operating
 -- System in a chroot.
-class ChrootBootstrapper b where
+class ChrootBootstrapper b inner outer where
 	-- | Do initial bootstrapping of an operating system in a chroot.
 	-- If the operating System is not supported, return
 	-- Left error message.
-	buildchroot :: b -&gt; Maybe System -&gt; FilePath -&gt; Either String (Property Linux)
+	buildchroot :: b -&gt; Maybe System -&gt; FilePath -&gt; Either String (Property outer)

 -- | Use this to bootstrap a chroot by extracting a tarball.
 --
@@ -68,9 +71,8 @@
 -- detect automatically.
 data ChrootTarball = ChrootTarball FilePath

-instance ChrootBootstrapper ChrootTarball where
-	buildchroot (ChrootTarball tb) _ loc = Right $
-		tightenTargets $ extractTarball loc tb
+instance ChrootBootstrapper ChrootTarball UnixLike UnixLike where
+	buildchroot (ChrootTarball tb) _ loc = Right $ extractTarball loc tb

 extractTarball :: FilePath -&gt; FilePath -&gt; Property UnixLike
 extractTarball target src = check (unpopulated target) $
@@ -88,7 +90,7 @@
 -- | Use this to bootstrap a chroot with debootstrap.
 data Debootstrapped = Debootstrapped Debootstrap.DebootstrapConfig

-instance ChrootBootstrapper Debootstrapped where
+instance ChrootBootstrapper Debootstrapped DebianLike Linux where
 	buildchroot (Debootstrapped cf) system loc = case system of
 		(Just s@(System (Debian _) _)) -&gt; Right $ debootstrap s
 		(Just s@(System (Buntish _) _)) -&gt; Right $ debootstrap s
@@ -107,13 +109,22 @@
 -- &gt;	&amp; osDebian Unstable "amd64"
 -- &gt;	&amp; Apt.installed ["ghc", "haskell-platform"]
 -- &gt;	&amp; ...
-debootstrapped :: Debootstrap.DebootstrapConfig -&gt; FilePath -&gt; Chroot
+-- debootstrapped :: Debootstrap.DebootstrapConfig -&gt; FilePath -&gt; Chroot DebianLike
+debootstrapped
+	:: (SingI inner, SingI outer, ChrootBootstrapper Debootstrapped (MetaTypes inner) (MetaTypes outer))
+	=&gt; Debootstrap.DebootstrapConfig
+	-&gt; FilePath
+	-&gt; Chroot (MetaTypes inner) (MetaTypes outer)
 debootstrapped conf = bootstrapped (Debootstrapped conf)

 -- | Defines a Chroot at the given location, bootstrapped with the
 -- specified ChrootBootstrapper.
-bootstrapped :: ChrootBootstrapper b =&gt; b -&gt; FilePath -&gt; Chroot
-bootstrapped bootstrapper location = Chroot location bootstrapper h
+bootstrapped
+	:: (SingI inner, SingI outer, ChrootBootstrapper b (MetaTypes inner) (MetaTypes outer))
+	=&gt; b
+	-&gt; FilePath
+	-&gt; Chroot (MetaTypes inner) (MetaTypes outer)
+bootstrapped bootstrapper location = Chroot location bootstrapper h (sing, sing)
   where
 	h = Host location [] mempty

@@ -123,45 +134,79 @@
 -- Reverting this property removes the chroot. Anything mounted inside it
 -- is first unmounted. Note that it does not ensure that any processes
 -- that might be running inside the chroot are stopped.
-provisioned :: Chroot -&gt; RevertableProperty (HasInfo + Linux) Linux
+-- provisioned :: SingI outer =&gt; Chroot inner outer -&gt; RevertableProperty (HasInfo + MetaTypes outer) Linux
+provisioned
+	::
+		( SingI outer
+		, SingI metatypes
+		, Combines (Property (MetaTypes outer)) (Property (MetaTypes outer))
+		, (HasInfo + outer) ~ MetaTypes metatypes
+		, CombinedType (Property (MetaTypes outer)) (Property (MetaTypes outer)) ~ Property outer
+		, IncludesInfo (MetaTypes metatypes) ~ 'True)
+	=&gt; Chroot inner outer -&gt; RevertableProperty (HasInfo + outer) Linux
 provisioned c = provisioned' (propagateChrootInfo c) c False

 provisioned'
-	:: (Property Linux -&gt; Property (HasInfo + Linux))
-	-&gt; Chroot
+	::
+		( Combines (Property (MetaTypes outer)) (Property (MetaTypes outer))
+		, CombinedType (Property (MetaTypes outer)) (Property (MetaTypes outer)) ~ Property outer
+		, SingI outer
+		)
+	=&gt; (Property outer -&gt; Property (HasInfo + outer))
+	-&gt; Chroot inner outer
 	-&gt; Bool
-	-&gt; RevertableProperty (HasInfo + Linux) Linux
-provisioned' propigator c@(Chroot loc bootstrapper _) systemdonly =
-	(propigator $ setup `describe` chrootDesc c "exists")
+	-&gt; RevertableProperty (HasInfo + outer) Linux
+provisioned' propigator c systemdonly =
+	(propigator $ setup c systemdonly `describe` chrootDesc c "exists")
 		&lt;!&gt;
-	(teardown `describe` chrootDesc c "removed")
-  where
-	setup :: Property Linux
-	setup = propellChroot c (inChrootProcess (not systemdonly) c) systemdonly
-		`requires` built
-
-	built = case buildchroot bootstrapper (chrootSystem c) loc of
-		Right p -&gt; p
-		Left e -&gt; cantbuild e
-
-	cantbuild e = property (chrootDesc c "built") (error e)
-
-	teardown :: Property Linux
-	teardown = check (not &lt;$&gt; unpopulated loc) $
-		property ("removed " ++ loc) $
-			makeChange (removeChroot loc)
-
-propagateChrootInfo :: Chroot -&gt; Property Linux -&gt; Property (HasInfo + Linux)
-propagateChrootInfo c@(Chroot location _ _) p = propagateContainer location c $
-	p `addInfoProperty` chrootInfo c
+	(teardown c `describe` chrootDesc c "removed")

-chrootInfo :: Chroot -&gt; Info
-chrootInfo (Chroot loc _ h) = mempty `addInfo`
+-- chroot removal code is currently linux specific..
+teardown :: Chroot inner outer -&gt; Property Linux
+teardown (Chroot loc _ _ _) = check (not &lt;$&gt; unpopulated loc) $
+	property ("removed " ++ loc) $
+		makeChange (removeChroot loc)
+
+setup
+	::
+		( SingI outer
+		, Combines (Property (MetaTypes outer)) (Property (MetaTypes outer))
+		)
+	=&gt; Chroot inner outer
+	-&gt; Bool
+	-&gt; CombinedType (Property (MetaTypes outer)) (Property (MetaTypes outer))
+setup c systemdonly = propellChroot c (inChrootProcess (not systemdonly) c) systemdonly
+	`requires` built c
+
+built :: (SingI outer, ChrootBootstrapper b inner outer) =&gt; Chroot inner outer -&gt; Property (MetaTypes outer)
+built c@(Chroot loc bootstrapper _ _) =
+	case buildchroot bootstrapper (chrootSystem c) loc of
+		Right p -&gt; error "FOO" -- p
+		Left e -&gt; error "FOO" -- cantbuild c e
+
+cantbuild :: Chroot inner outer -&gt; String -&gt; Property UnixLike
+cantbuild c e = property (chrootDesc c "built") (error e)
+
+propagateChrootInfo
+	::
+		( SingI metatypes
+		, (HasInfo + outer) ~ MetaTypes metatypes
+		, IncludesInfo (MetaTypes metatypes) ~ 'True
+		)
+	=&gt; Chroot inner outer
+	-&gt; Property outer
+	-&gt; Property (MetaTypes metatypes)
+propagateChrootInfo c@(Chroot location _ _ _) p =
+	propagateContainer location c $
+		p `addInfoProperty` chrootInfo c
+
+chrootInfo :: Chroot inner outer -&gt; Info
+chrootInfo (Chroot loc _ h _) = mempty `addInfo`
 	mempty { _chroots = M.singleton loc h }

 -- | Propellor is run inside the chroot to provision it.
-propellChroot :: Chroot -&gt; ([String] -&gt; IO (CreateProcess, IO ())) -&gt; Bool -&gt; Property UnixLike
-propellChroot c@(Chroot loc _ _) mkproc systemdonly = property (chrootDesc c "provisioned") $ do
+propellChroot :: SingI outer =&gt; Chroot inner outer -&gt; ([String] -&gt; IO (CreateProcess, IO ())) -&gt; Bool -&gt; Property (MetaTypes outer)
+propellChroot c@(Chroot loc _ _ _) mkproc systemdonly = property (chrootDesc c "provisioned") $ do
 	let d = localdir &lt;/&gt; shimdir c
 	let me = localdir &lt;/&gt; "propellor"
 	shim &lt;- liftIO $ ifM (doesDirectoryExist d)
@@ -199,8 +244,8 @@
 		liftIO cleanup
 		return r

-toChain :: HostName -&gt; Chroot -&gt; Bool -&gt; IO CmdLine
-toChain parenthost (Chroot loc _ _) systemdonly = do
+toChain :: HostName -&gt; Chroot inner outer -&gt; Bool -&gt; IO CmdLine
+toChain parenthost (Chroot loc _ _ _) systemdonly = do
 	onconsole &lt;- isConsole &lt;$&gt; getMessageHandle
 	return $ ChrootChain parenthost loc systemdonly onconsole

@@ -224,8 +269,8 @@
 			putStrLn $ "\n" ++ show r
 chain _ _ = errorMessage "bad chain command"

-inChrootProcess :: Bool -&gt; Chroot -&gt; [String] -&gt; IO (CreateProcess, IO ())
-inChrootProcess keepprocmounted (Chroot loc _ _) cmd = do
+inChrootProcess :: Bool -&gt; Chroot inner outer -&gt; [String] -&gt; IO (CreateProcess, IO ())
+inChrootProcess keepprocmounted (Chroot loc _ _ _) cmd = do
 	mountproc
 	return (proc "chroot" (loc:cmd), cleanup)
   where
@@ -244,26 +289,24 @@
 provisioningLock :: FilePath -&gt; FilePath
 provisioningLock containerloc = "chroot" &lt;/&gt; mungeloc containerloc ++ ".lock"

-shimdir :: Chroot -&gt; FilePath
-shimdir (Chroot loc _ _) = "chroot" &lt;/&gt; mungeloc loc ++ ".shim"
+shimdir :: Chroot inner outer -&gt; FilePath
+shimdir (Chroot loc _ _ _) = "chroot" &lt;/&gt; mungeloc loc ++ ".shim"

 mungeloc :: FilePath -&gt; String
 mungeloc = replace "/" "_"

-chrootDesc :: Chroot -&gt; String -&gt; String
-chrootDesc (Chroot loc _ _) desc = "chroot " ++ loc ++ " " ++ desc
+chrootDesc :: Chroot inner outer -&gt; String -&gt; String
+chrootDesc (Chroot loc _ _ _) desc = "chroot " ++ loc ++ " " ++ desc
</content>
</entry>
<entry>
<title>ported docker</title>
<updated>2016-03-27T01:38:39Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2016-03-27T01:38:39Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=46fc5467e633a9c1f149cb0cd7ee03af1e9e0aa1'/>
<id>urn:sha1:46fc5467e633a9c1f149cb0cd7ee03af1e9e0aa1</id>
<content type='text'>
Also, implemented modifyHostProps to add properties to an existing host.
Using it bypasses some type safety. Its use in docker is safe though.

But, in Conductor, the use of it was not really safe, because it was used
with a DebianLike property. Fixed that by making Ssh.installed
target all unix's, although it will fail on non-DebianLike ones.
</content>
</entry>
<entry>
<title>ported propagateContainer</title>
<updated>2016-03-26T23:31:23Z</updated>
<author>
<name>Joey Hess</name>
<email>joeyh@joeyh.name</email>
</author>
<published>2016-03-26T23:31:23Z</published>
<link rel='alternate' type='text/html' href='https://git.gnusosa.net/propellor/commit/?id=36e97137e538de401bd0340b469e10dca5f4b475'/>
<id>urn:sha1:36e97137e538de401bd0340b469e10dca5f4b475</id>
<content type='text'>
Renamed several utility functions along the way.
</content>
</entry>
</feed>
