summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
l---------config.hs2
-rwxr-xr-xdebian/rules2
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn34
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment30
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment38
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment11
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment16
-rw-r--r--doc/forum/Supported_OS.mdwn5
-rw-r--r--doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment23
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn12
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment10
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment19
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment11
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment11
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment7
-rw-r--r--doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn1
-rw-r--r--doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment10
-rw-r--r--doc/forum/propellor_with_no_central_repository__63__.mdwn1
-rw-r--r--doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment7
-rw-r--r--doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment9
-rw-r--r--doc/forum/property_combinator_ordering.mdwn8
-rw-r--r--doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment31
-rw-r--r--doc/news/propellor_demo.mdwn8
-rw-r--r--doc/news/version_1.1.0.mdwn33
-rw-r--r--doc/news/version_1.2.0.mdwn9
-rw-r--r--doc/news/version_1.2.1.mdwn6
-rw-r--r--doc/security.mdwn2
-rw-r--r--doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment10
-rw-r--r--doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment8
-rw-r--r--doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment17
-rw-r--r--doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment22
-rw-r--r--doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment13
-rw-r--r--doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment11
-rw-r--r--doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment8
-rw-r--r--doc/todo/editor_for_privdata__63__.mdwn4
-rw-r--r--doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment9
-rw-r--r--doc/todo/etckeeper.mdwn1
-rw-r--r--doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment9
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn3
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment30
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment7
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment19
-rw-r--r--doc/todo/git_push_over_propellor_ssh_channel.mdwn13
-rw-r--r--doc/todo/info_propigation_out_of_nested_properties.mdwn115
-rw-r--r--doc/todo/port_info_for_properties_for_firewall.mdwn24
-rw-r--r--doc/todo/type_level_port_conflict_detection.mdwn5
-rw-r--r--privdata.joey/keyring.gpgbin113014 -> 0 bytes
-rw-r--r--privdata.joey/privdata.gpg753
-rw-r--r--src/Propellor/PrivData/Paths.hs2
49 files changed, 660 insertions, 779 deletions
diff --git a/config.hs b/config.hs
index 07959a0a..ec313725 120000
--- a/config.hs
+++ b/config.hs
@@ -1 +1 @@
-config-joey.hs \ No newline at end of file
+config-simple.hs \ No newline at end of file
diff --git a/debian/rules b/debian/rules
index c553132f..bcb681c1 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,4 +1,4 @@
-#!/bin/false
+#!/usr/bin/make -f
# Avoid using cabal, as it writes to $HOME
export CABAL=./Setup
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn
new file mode 100644
index 00000000..b678d8d0
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn
@@ -0,0 +1,34 @@
+Hello,
+
+Still working on the reprepro property :)
+
+Here A property that I am using to publish a repository via apache (this is a prototype)
+
+ website :: String -> Property
+ website hn = toProp $ Apache.siteEnabled hn apachecfg
+ where
+ apachecfg = [ "<VirtualHost *>"
+ , "DocumentRoot " ++ basePath
+ , "<Directory " ++ basePath ++ ">"
+ , " Options Indexes FollowSymLinks Multiviews"
+ , " Order allow,deny"
+ , Apache.allowAll
+ , "</Directory>"
+ ] ++ concatMap deny ["db", "conf", "incoming"]
+ ++ ["</VirtualHost>"]
+
+ deny dir = [ "<Directory \"" ++ basePath ++ "apt/*/" ++ dir ++ "\">"
+ , " Order deny,allow"
+ , " Deny from all"
+ , "</Directory>"
+ ]
+
+during my test I am runing the config.hs with
+runhaskell config.hs (it work the first time, the apache config files are ok)
+
+but when I do a modification on the apachecfg and rerun the runhaskell,
+the config files are not updated. I need to remove them to have an updated version.
+
+cheers
+
+Fred
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment
new file mode 100644
index 00000000..0101ccb2
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="first run"
+ date="2014-12-08T09:31:46Z"
+ content="""
+root@mordor:~/propellor/src# PROPELLOR_DEBUG=1 runhaskell config.hs
+[2014-12-08 10:27:10 CET] read: hostname [\"-f\"]
+[2014-12-08 10:27:10 CET] command line: Run \"mordor\"
+[2014-12-08 10:27:10 CET] read: git [\"remote\"]
+[2014-12-08 10:27:10 CET] read: git [\"symbolic-ref\",\"--short\",\"HEAD\"]
+[2014-12-08 10:27:10 CET] call: git [\"fetch\"]
+Pull from central git repository ... done
+[2014-12-08 10:27:12 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+[2014-12-08 10:27:12 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+mordor has Operating System (Debian Unstable) \"i386\" ... ok
+[2014-12-08 10:27:12 CET] read: apt-cache [\"policy\",\"etckeeper\"]
+mordor apt installed etckeeper ... ok
+[2014-12-08 10:27:13 CET] read: apt-cache [\"policy\",\"ssh\"]
+mordor apt installed ssh ... ok
+[2014-12-08 10:27:13 CET] read: passwd [\"-S\",\"root\"]
+mordor root has password ... ok
+[2014-12-08 10:27:13 CET] call: a2query [\"-q\",\"-s\",\"reprepro\"]
+[2014-12-08 10:27:14 CET] read: apt-cache [\"policy\",\"apache2\"]
+[2014-12-08 10:27:14 CET] call: a2ensite [\"--quiet\",\"reprepro\"]
+Enabling site reprepro.
+[2014-12-08 10:27:15 CET] call: sh [\"-c\",\"set -e ; service 'apache2' reload >/dev/null 2>&1 || true\"]
+mordor create reprepro ... done
+mordor overall ... done
+
+"""]]
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment
new file mode 100644
index 00000000..85a57383
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment
@@ -0,0 +1,38 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="second run with content modified"
+ date="2014-12-08T09:37:43Z"
+ content="""
+Second run after adding a space here
+
+ - , \" Options Indexes FollowSymLinks Multiviews\"
+ + , \" Options Indexes FollowSymLinks Multiviews\"
+
+
+ root@mordor:~/propellor/src# PROPELLOR_DEBUG=1 runhaskell config.hs
+ [2014-12-08 10:34:19 CET] read: hostname [\"-f\"]
+ [2014-12-08 10:34:19 CET] command line: Run \"mordor\"
+ [2014-12-08 10:34:19 CET] read: git [\"remote\"]
+ [2014-12-08 10:34:19 CET] read: git [\"symbolic-ref\",\"--short\",\"HEAD\"]
+ [2014-12-08 10:34:19 CET] call: git [\"fetch\"]
+ remote: Counting objects: 32, done.
+ remote: Compressing objects: 100% (6/6), done.
+ remote: Total 6 (delta 3), reused 0 (delta 0)
+ Dépaquetage des objets: 100% (6/6), fait.
+ Depuis git://git.kitenet.net/propellor
+ c5a8cae..9ac0dfb master -> origin/master
+ Pull from central git repository ... done
+ [2014-12-08 10:34:20 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+ [2014-12-08 10:34:20 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+ mordor has Operating System (Debian Unstable) \"i386\" ... ok
+ [2014-12-08 10:34:20 CET] read: apt-cache [\"policy\",\"etckeeper\"]
+ mordor apt installed etckeeper ... ok
+ [2014-12-08 10:34:21 CET] read: apt-cache [\"policy\",\"ssh\"]
+ mordor apt installed ssh ... ok
+ [2014-12-08 10:34:21 CET] read: passwd [\"-S\",\"root\"]
+ mordor root has password ... ok
+ [2014-12-08 10:34:21 CET] call: a2query [\"-q\",\"-s\",\"reprepro\"]
+ mordor create reprepro ... ok
+ mordor overall ... ok
+
+"""]]
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment
new file mode 100644
index 00000000..5dc67fb0
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="comment 3"
+ date="2014-12-08T10:47:59Z"
+ content="""
+I forgot to say that the content of
+
+/etc/apache2/site-xxx/reprepro[.conf]
+
+is unmodifed after this second run
+"""]]
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment
new file mode 100644
index 00000000..a9201541
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2014-12-09T04:35:12Z"
+ content="""
+Pretty obvious why if you look at the code:
+
+ enable = check (not <$> isenabled) $
+ cmdProperty "a2ensite" ["--quiet", hn]
+ `describe` ("apache site enabled " ++ hn)
+ `requires` siteAvailable hn cf
+
+So that property was skipped entirely if the site was already enabled and never looked at the config file.
+
+I've put in a fix.
+"""]]
diff --git a/doc/forum/Supported_OS.mdwn b/doc/forum/Supported_OS.mdwn
new file mode 100644
index 00000000..f17b9054
--- /dev/null
+++ b/doc/forum/Supported_OS.mdwn
@@ -0,0 +1,5 @@
+What are the requirements for the configured OS ? Does it need to be Debian ?
+
+Would Propellor work for Arch linux, RHEL, Windows, AIX or linux on pSeries) ?
+
+Cheers
diff --git a/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
new file mode 100644
index 00000000..3a2055ea
--- /dev/null
+++ b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-12-07T15:58:03Z"
+ content="""
+I have heard of propellor being used on OSX. Probably that user wrote their
+own code for OSX specific stuff.
+
+Propellor properites can be parameterized by OS. Currently it has support
+for Debian and some untested support for Ubuntu. A property can be parameterized
+like this:
+
+ foo :: Property
+ foo = property "foo" withOS desc $ \o -> case o of
+ (Just (System (Debian _) _)) -> ensureProperty fooDebian
+ (Just (System (Ubuntu _) _)) -> ensureProperty fooUbuntu
+
+The first step for adding a new OS will be to modify <http://hackage.haskell.org/package/propellor-1.0.0/docs/Propellor-Types-OS.html>.
+Compilation will then warn about all OS parameterized properties that
+need to be updated to support your added OS, and it can be taken from there.
+
+I'll accept reasonable patches to support other OS's.
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn
new file mode 100644
index 00000000..c88defcf
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn
@@ -0,0 +1,12 @@
+Hello,
+
+I am trying propellor on Debian Jessie (haskell is fantastic for this sort or things) to setup one of my computer.
+
+On my network, the system administrator set proxies for http and https.
+These information are available via a http://proxy/proxy.pac URL.
+
+So I would like to know what should be done to extract this information and set it for all users on the system ?
+
+Cheers
+
+Frederic
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment
new file mode 100644
index 00000000..6bf8844d
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-25T15:44:13Z"
+ content="""
+You could, for example, use Propellor.Propety.Cmd.cmdProperty
+to run a command that sets up the proxying. If there's not a single command
+that does it, you could cause propellor to fetch the url and deploy the
+info itself.
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment
new file mode 100644
index 00000000..8458ee49
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="comment 2"
+ date="2014-11-25T17:55:25Z"
+ content="""
+In my case I need to wget the proxy.pac file and parse it to find the right proxy.
+
+what worried me is that these proxy.pac things are dynamical depending on the ip of the sender AND the receive.
+It work nicely with web browser, but not with the unix http_proxy and HTTPS_PROXY env.
+
+nevertheless, I can create something to parse my local setup and extract the right http_proxy.
+
+Is there something available in Propellor to set a global environment variable in /etc/environment (the right place for this ?)
+
+cheers
+
+Frederic
+
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment
new file mode 100644
index 00000000..9bdcb4df
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-25T19:37:46Z"
+ content="""
+There's no Property that handles setting global environment currently, but
+it's a reasonable one to add.
+
+I think that /etc/environment is read by `pam_env` logins, but maybe not
+other things, so dunno.
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment
new file mode 100644
index 00000000..d2a0b45e
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="comment 4"
+ date="2014-11-25T20:01:12Z"
+ content="""
+I saw that there is an haskell binding for augeas.
+
+Maybe this could be a nice uniform interface to deal with all the system configuration files.
+then no need to deal with the config file formats.
+
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment
new file mode 100644
index 00000000..d670fa3b
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 5"
+ date="2014-11-27T08:17:36Z"
+ content="""
+Just looked at augeas, and add it to propellor would be great. Much more robust than Propellor.Property.File.{containsLine,containsLines,lacksLine}, at least.
+"""]]
diff --git a/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn
new file mode 100644
index 00000000..0815b4b3
--- /dev/null
+++ b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn
@@ -0,0 +1 @@
+How can I modify the configuration of a managed host (which seems to be stored in /usr/local/propellor/.git/config) from the host on which I run propellor?
diff --git a/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment
new file mode 100644
index 00000000..f034a377
--- /dev/null
+++ b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-10-31T14:40:33Z"
+ content="""
+I'm curious what you need to configure there..
+
+But, there seems to be a simple solution: Add a Property that configures
+the .git/config however you need to! :)
+"""]]
diff --git a/doc/forum/propellor_with_no_central_repository__63__.mdwn b/doc/forum/propellor_with_no_central_repository__63__.mdwn
new file mode 100644
index 00000000..5f322878
--- /dev/null
+++ b/doc/forum/propellor_with_no_central_repository__63__.mdwn
@@ -0,0 +1 @@
+Is there a way to use propellor with no central repository?
diff --git a/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment b/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment
new file mode 100644
index 00000000..1f1456c5
--- /dev/null
+++ b/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-10-31T14:39:48Z"
+ content="""
+Not yet, but see [[todo/git_push_over_propellor_ssh_channel]]
+"""]]
diff --git a/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment b/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment
new file mode 100644
index 00000000..6a6aa946
--- /dev/null
+++ b/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""yay!"""
+ date="2014-11-19T01:31:14Z"
+ content="""
+propellor now supports this mode by default, just use `propellor --spin
+hostname` and the changes in the local repo will be pushed and deployed to
+the host, w/o needing a centralized git repo.
+"""]]
diff --git a/doc/forum/property_combinator_ordering.mdwn b/doc/forum/property_combinator_ordering.mdwn
new file mode 100644
index 00000000..25549bb4
--- /dev/null
+++ b/doc/forum/property_combinator_ordering.mdwn
@@ -0,0 +1,8 @@
+when I write
+
+ setDistribution cfg = f `File.hasContent` cfg
+ `onChange` update
+ `requires` File.dirExists confDir
+
+is update called before ensuring the confiDir Exist ?
+It seems to me but who knows ?
diff --git a/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment b/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment
new file mode 100644
index 00000000..c41abd90
--- /dev/null
+++ b/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment
@@ -0,0 +1,31 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-12-01T15:53:11Z"
+ content="""
+I think that should behave intuitively, but of course if you're unsure
+of this kind of thing, adding parens is a good way to disambiguate the
+code.
+
+ (f `File.hasContent` cfg `onChange` update)
+ `requires` File.dirExists confDir
+
+Written that way, it's explicit that the parenthesized part runs
+together as one action.
+
+Or, we can do a quick test in ghci:
+
+ joey@darkstar:~/src/propellor/src#joeyconfig>ghci Propellor.hs Propellor/Property.hs
+ *Propellor> let f1 = property "hasContent" (liftIO (print "f1") >> return MadeChange)
+ *Propellor> let f2 = property "update" (liftIO (print "f2") >> return MadeChange)
+ *Propellor> let f3 = property "dirExists" (liftIO (print "f3") >> return MadeChange)
+ *Propellor> runPropellor (Host "foo" [] mempty) $ ensureProperty $ f1 `onChange` f2 `requires` f3
+ "dirExists"
+ "hasContent"
+ "update"
+ MadeChange
+
+So, yes, it's behaving as it should, first ensuring that the `requires`
+property is met, and then running the main property, and since it made a
+change, following up by running the `onChange` property.
+"""]]
diff --git a/doc/news/propellor_demo.mdwn b/doc/news/propellor_demo.mdwn
new file mode 100644
index 00000000..362f56e6
--- /dev/null
+++ b/doc/news/propellor_demo.mdwn
@@ -0,0 +1,8 @@
+A quick demo of propellor.
+
+<video controls src="http://downloads.kitenet.net/talks/propellor_demo/propellor_demo.webm"></video>
+
+[video](http://downloads.kitenet.net/talks/propellor_demo/propellor_demo.webm)
+
+(Audio quality is clipped/fast in places, unfortunately this was a problem
+with the source recording.)
diff --git a/doc/news/version_1.1.0.mdwn b/doc/news/version_1.1.0.mdwn
new file mode 100644
index 00000000..4bf09cc4
--- /dev/null
+++ b/doc/news/version_1.1.0.mdwn
@@ -0,0 +1,33 @@
+propellor 1.1.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * --spin target --via relay causes propellor to bounce through an
+ intermediate relay host, which handles any necessary uploads
+ when provisioning the target host.
+ * --spin can be passed multiple hosts, and it will provision each host
+ in turn.
+ * Add --merge, to combine multiple --spin commits into a single, more useful
+ commit.
+ * Hostname parameters not containing dots are looked up in the DNS to
+ find the full hostname.
+ * propellor --spin can now deploy propellor to hosts that do not have
+ git, ghc, or apt-get. This is accomplished by uploading a fairly
+ portable precompiled tarball of propellor.
+ * Propellor.Property.OS contains properties that can be used to do a clean
+ reinstall of the OS of an existing host. This can be used, for example,
+ to do an in-place conversion from Fedora to Debian.
+ This is experimental; use with caution!
+ * Added group-related properties. Thanks, Félix Sipma.
+ * Added Git.barerepo. Thanks, Félix Sipma.
+ * Added Grub.installed and Grub.boots properties.
+ * New HostContext can be specified when a PrivData value varies per host.
+ * hasSomePassword and hasPassword now default to using HostContext.
+ To specify a different context, use hasSomePassword' and
+ hasPassword' (API change)
+ * hasSomePassword and hasPassword now make sure shadow passwords are enabled.
+ * cron.runPropellor now runs propellor, rather than using its Makefile.
+ This is more robust.
+ * propellor.debug can be set in the git config to enable more persistent
+ debugging output.
+ * Run apt-cache policy with LANG=C so it works on other locales.
+ * endAction can be used to register an action to run once propellor
+ has successfully run on a host."""]] \ No newline at end of file
diff --git a/doc/news/version_1.2.0.mdwn b/doc/news/version_1.2.0.mdwn
new file mode 100644
index 00000000..6ea5581e
--- /dev/null
+++ b/doc/news/version_1.2.0.mdwn
@@ -0,0 +1,9 @@
+propellor 1.2.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Display a warning when ensureProperty is used on a property which has
+ Info and is so prevented from propigating it.
+ * Removed boolProperty; instead the new toResult can be used. (API change)
+ * Include Propellor.Property.OS, which was accidentially left out of the
+ cabal file in the last release.
+ * Fix Apache.siteEnabled to update the config file and reload apache when
+ configuration has changed."""]] \ No newline at end of file
diff --git a/doc/news/version_1.2.1.mdwn b/doc/news/version_1.2.1.mdwn
new file mode 100644
index 00000000..59dd4cee
--- /dev/null
+++ b/doc/news/version_1.2.1.mdwn
@@ -0,0 +1,6 @@
+propellor 1.2.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added CryptPassword to PrivDataField, for password hashes as produced
+ by crypt(3).
+ * User.hasPassword and User.hasSomePassword will now use either
+ a CryptPassword or a Password from privdata, depending on which is set."""]] \ No newline at end of file
diff --git a/doc/security.mdwn b/doc/security.mdwn
index 12ae18de..831b2b41 100644
--- a/doc/security.mdwn
+++ b/doc/security.mdwn
@@ -29,7 +29,7 @@ in cleartext private data such as passwords, ssh private keys, etc.
Instead, `propellor --spin $host` looks for a
`~/.propellor/privdata/privdata.gpg` file and if found decrypts it,
-extracts the private that that the $host needs, and sends it to to the
+extracts the private data that the $host needs, and sends it to to the
$host using ssh. This lets a host know its own private data, without
seeing all the rest.
diff --git a/doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment b/doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment
new file mode 100644
index 00000000..4ed9ecdb
--- /dev/null
+++ b/doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Is it ok to publish to a public repository?"
+ date="2014-08-29T21:13:19Z"
+ content="""
+It is not clear to me whether or not it is safe to publish my own propellor repository to a publicly hosted service. It seems to me that when I do ./propellor --add-key MYKEYID, the private key data is stored in the repository as a commit, so pushing it exposes this data to the public. Am I wrong?
+
+Thanks
+"""]]
diff --git a/doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment b/doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment
new file mode 100644
index 00000000..4d209b03
--- /dev/null
+++ b/doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="131.252.200.111"
+ subject="comment 2"
+ date="2014-08-29T21:52:02Z"
+ content="""
+--add-key puts your **public** key in the repository, not the private key.
+"""]]
diff --git a/doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment b/doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment
new file mode 100644
index 00000000..4d75842d
--- /dev/null
+++ b/doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Remote host fails to connect"
+ date="2014-08-30T06:40:33Z"
+ content="""
+Makes sense of course, but the message one gets when doing that is a bit misleading.
+
+I ran into another issue: propellor deploys itself to remote host, but then the propellor instance run on remote host cannot read the remote git repo, because:
+
+1. the host key is not initially present in root's known_hosts, then
+2. the user's (root) public key is unknown to the remote git repo, in my case bitbucket.org, and the URL used is git@bitbucket.org:abailly/capital-match-infra.git which implies connection goes through SSH
+
+I am puzzled: Does this mean I should add some for use by the remote host deployed to? This does not make sense so there should be another way... If I change the origin url to use https, then I cannot push locally anymore.
+
+Thanks for your help
+"""]]
diff --git a/doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment b/doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment
new file mode 100644
index 00000000..b2ac4d57
--- /dev/null
+++ b/doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Output from propellor --spin $host"
+ date="2014-08-30T07:17:52Z"
+ content="""
+Here is the output (truncated):
+
+
+ Permission denied (publickey).
+ fatal: Could not read from remote repository.
+
+ Please make sure you have the correct access rights
+ and the repository exists.
+ Git fetch ... failed
+ fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.
+ Use '--' to separate paths from revisions, like this:
+ 'git <command> [<revision>...] -- [<file>...]'
+ propellor: user error (git [\"log\",\"-n\",\"1\",\"--format=%G?\",\"origin/master\"] exited 128)
+
+
+"""]]
diff --git a/doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment b/doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment
new file mode 100644
index 00000000..cc26f42d
--- /dev/null
+++ b/doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Got it working..."
+ date="2014-08-31T12:50:17Z"
+ content="""
+OK, I manage to get my first propellor config run fine by setting different branch.master.url and branch.master.pushUrl configurations:
+
+* Use a https:// based url for the first
+* Use a git:// based url for the second
+
+I had to nuke the remote /usr/local/propellor directory because it still had wrong configuration with a single remote url.
+"""]]
diff --git a/doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment b/doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment
new file mode 100644
index 00000000..be8ac7f9
--- /dev/null
+++ b/doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 6"""
+ date="2014-11-19T01:35:59Z"
+ content="""
+@Arnaud, see [[centralized_repository]], including its documentation of a
+"deploy" remote, which can be used to configure the url that remote hosts
+should pull from.
+
+Also, propellor can be used now without any centralized repository.
+"""]]
diff --git a/doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment b/doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment
new file mode 100644
index 00000000..e9d20642
--- /dev/null
+++ b/doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkgUir7k_amh9RFp4D3QutX1fGh_nd7ko4"
+ nickname="Philipp"
+ subject="Passwords in PrivData"
+ date="2014-12-13T18:25:23Z"
+ content="""
+I wonder if there could be a shortcut in PrivData handling that hashes the input with crypt() instead of passing it raw to a machine. For instance passwords are stored in plain on the target machines, while this is not required to set the password in shadow: the hash would suffice. I think this page should at least spell out that fact.
+"""]]
diff --git a/doc/todo/editor_for_privdata__63__.mdwn b/doc/todo/editor_for_privdata__63__.mdwn
new file mode 100644
index 00000000..8b91338c
--- /dev/null
+++ b/doc/todo/editor_for_privdata__63__.mdwn
@@ -0,0 +1,4 @@
+Would adding a way to call $EDITOR to edit privdata be possible?
+It would make sense for editing data like logcheck files.
+
+> [[done]]
diff --git a/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment b/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment
new file mode 100644
index 00000000..bbe93fe3
--- /dev/null
+++ b/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ subject="comment 2"
+ date="2014-11-11T21:16:09Z"
+ content="""
+Already exists in `propellor --edit`
+
+Documentation patches accepted! :)
+"""]]
diff --git a/doc/todo/etckeeper.mdwn b/doc/todo/etckeeper.mdwn
new file mode 100644
index 00000000..7dc80cef
--- /dev/null
+++ b/doc/todo/etckeeper.mdwn
@@ -0,0 +1 @@
+It would be cool to have an etckeeper module :-).
diff --git a/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment b/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment
new file mode 100644
index 00000000..f080f70e
--- /dev/null
+++ b/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-06T15:46:56Z"
+ content="""
+All I've needed for this is `& Apt.installed ["etckeeper"]`
+
+Patches welcome, I suppose.
+"""]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn b/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn
new file mode 100644
index 00000000..046f4a6f
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn
@@ -0,0 +1,3 @@
+Sometimes I forget to commit a modification, and running "propellor --spin" automatically commits this stuff. It would be better if "propellor --spin" failed (or, even better, warned the user) that there are uncommited changes, and "propellor --spin" would just always add an empty commit.
+
+> --merge added; [[done]] --[[Joey]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment
new file mode 100644
index 00000000..19b2fab6
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-23T18:41:40Z"
+ content="""
+Letting --spin commit is part of my workflow. It's great when you're just
+changing config.hs to quickly blast out the changes.
+
+Granted, it is not so nice when doing Property development, as changes get
+fragmented across the spins used to test them. I'd be happy to find some
+way to improve that. Perhaps a way could be found to get this structure of
+git commits:
+
+ manual commit------------------------->manual commit--merge
+ \--spin--spin--spin--spin--spin------------/
+
+Where the second manual commit has an identical tree committed as does the
+spin just underneath it, and so the following merge doesn't change any files,
+just grafts the two branches back together.
+
+I guess that could be handled by haing a checkpoint command, that squashes
+all the previous spins since the last checkpoint together into one commit,
+lets the user edit the commit message of that, and the juggles the branches
+into place and creates the merge commit -- which then becomes the new last
+checkpoint.
+
+I'll take patches for such a thing, or more simply a way to configure --spin's
+auto-committing behavior. However, I don't want to change the default
+behavior to not commit.
+"""]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment
new file mode 100644
index 00000000..3e8e5f62
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 2"
+ date="2014-11-23T20:23:24Z"
+ content="""
+Your solution seems a lot better :-).
+"""]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment
new file mode 100644
index 00000000..8ad6ab49
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2014-11-23T21:12:19Z"
+ content="""
+Here's a almost-script to do it, which worked when it did it by hand:
+
+<pre>
+get old-head (git show-ref HEAD -s)
+get curr-branch (refs/heads/master eg)
+find old-commit (look back through git log for the first commit that was not "propellor spin")
+git reset old-commit
+git commit -a # user gets to edit commit message for all the spins and any staged changes here
+git merge -S -s ours old-head
+get current-commit (result of merge)
+git update-ref curr-branch current-commit
+git checkout curr-branch
+</pre>
+"""]]
diff --git a/doc/todo/git_push_over_propellor_ssh_channel.mdwn b/doc/todo/git_push_over_propellor_ssh_channel.mdwn
new file mode 100644
index 00000000..c6d42fcf
--- /dev/null
+++ b/doc/todo/git_push_over_propellor_ssh_channel.mdwn
@@ -0,0 +1,13 @@
+Propellor currently needs a central git server. And it has a special-cased
+protocol during bootstrap that transfers the git repo over to a new host,
+using the ssh connection that will be used to run propellor.
+
+This could be improved by making a git push be done whenever
+`propellor spin $host` runs. The remote propellor runs `git receive-pack`;
+the local one runs `git send-pack`.
+
+Then there would be no need for a central git repo. Although still very
+useful if you have multiple propellor driven hosts and you want to just git
+commit and let cron sort them out.
+
+> [[done]]! --[[Joey]]
diff --git a/doc/todo/info_propigation_out_of_nested_properties.mdwn b/doc/todo/info_propigation_out_of_nested_properties.mdwn
index 1a586be6..e4bb443a 100644
--- a/doc/todo/info_propigation_out_of_nested_properties.mdwn
+++ b/doc/todo/info_propigation_out_of_nested_properties.mdwn
@@ -1,7 +1,7 @@
Currently, Info about a Host's Properties is manually gathered and
-propigated. propertyList combines the Info of the Properties in the list.
+propigated. propertyList combines the Info of the Properties in the list;
Docker.docked extracts relevant Info from the Properties of the container
-(but not al of it, intentionally!).
+(but not al of it, intentionally!); etc.
This works, but it's error-prone. Consider this example:
@@ -9,26 +9,97 @@ This works, but it's error-prone. Consider this example:
(Just (System (Debian Unstable) _)) -> ensureProperty foo
_ -> ensureProperty bar
-Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info.
-Of course, only one of them will be run, and only its info should be propigated
-out..
+Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info. Of
+course, only one of them will be run, and only its info should be
+propigated out..
-This commonly afflicts eg, privData. For example, `User.hasPassword'`
-has this problem, and this prevents --list-fields from listing privdata
-that's not set from that property.
+----
+
+Currently, ensureProperty detects if it's called on a property with a
+non-empty Info, and prints a warning. Would prefer to handle this at the
+type level though..
+
+----
One approach might be to make the Propellor monad be able to be run in two
-modes. In one mode, it actually perform IO, etc. In the other mode, all
-liftIO is a no-op, but all Info encountered is accumulated using a Reader
-monad. This might need two separate monad definitions.
-
-That is surely doable, but the withOS example above shows a problem with it --
-the OS is itself part of a Host's info, so won't be known until all its
-properties have been examined for info!
-
-Perhaps that can be finessed. We don't really need to propigate out OS info.
-Just DNS and PrivDataField Info. So info could be collected in 2 passes,
-first as it's done now by static propertyInfo values. Then take that
-and use it as the Info when running the Properties in the Reader monad.
-Combine what the Reader accumulates with the static info to get the full
-info.
+modes. In run mode, it actually performs IO, etc. In introspection mode, all
+liftIO is a no-op, but all Info encountered is accumulated using a Reader.
+This might need two separate monad definitions.
+
+That is surely doable, but consider this example:
+
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then ensureProperty foo
+ else ensureProperty bar
+
+In introspection mode, the liftIO is a no-op, but needs to return a Bool.
+That seems unlikely (how to pick which?), but even if some defaulting is
+used, only one of foo or bar's info will be seen.
+
+----
+
+Another approach could be something like this:
+
+ withInfoFrom foo $ \callfoo ->
+ withInfoFrom bar $ \callbar ->
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then callfoo
+ else callbar
+
+Here withInfoFrom is able to add foo and bar's Info to the info of the
+property that (may) call them.
+
+This approach is not fully type safe; it would be possible to call
+withInfoFrom in a way that didn't let it propigate the info.
+
+Also it has the problem that it doesn't support this:
+
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then do
+ foop <- liftIO getFooParam
+ ensureProperty (foo foop)
+ else ensureProperty bar
+
+----
+
+Another approach would be to add a new SimpleProperty, which is a property
+that has no Info. Only allow calling ensureProperty on this new type.
+
+(Or, remove propertyInfo from Property, and add a new InfoProperty that
+has the info.)
+
+But, propertyList can only contain one type at a time,
+not a mixed list of Property and SimpleProperty.
+
+Could a GADT be used instead?
+
+ {-# LANGUAGE GADTs #-}
+ {-# LANGUAGE EmptyDataDecls #-}
+
+ data HasInfo
+ data NoInfo
+
+ data Property = IProperty (GProperty HasInfo) | SProperty (GProperty NoInfo)
+
+ data GProperty i where
+ GIProperty :: Desc -> Propellor Result -> Info -> GProperty HasInfo
+ GSProperty :: Desc -> Propellor Result -> GProperty NoInfo
+
+ ensureProperty :: GProperty NoInfo -> Propellor Result
+ ensureProperty (GSProperty d r) = r
+
+That works. I made a `gadtwip` git branch that elaborated on that,
+to the point that Property.File compiles, but is otherwise
+unfinished. Most definitions of `Property` need to be changed to
+`GProperty NoInfo`, so that ensureProperty can call them. It's a big,
+intrusive change, and it may complicate propellor too much.
+
+(I may need to make instances of Prop for `GProperty NoInfo` and `GProperty
+HasInfo`, if that's possible, and make more Property combinators work on
+Prop.)
diff --git a/doc/todo/port_info_for_properties_for_firewall.mdwn b/doc/todo/port_info_for_properties_for_firewall.mdwn
new file mode 100644
index 00000000..efaaba05
--- /dev/null
+++ b/doc/todo/port_info_for_properties_for_firewall.mdwn
@@ -0,0 +1,24 @@
+The firewall module could be improved if properties that set up a service
+on a port included info (see Propellor.Info and Propellor.Types.Info)
+about the port(s) used.
+
+While currently the ports have to be explicitly listed:
+
+ & Apache.installed
+ & Firewall.installed
+ & Firewall.addRule (Rule INPUT ACCEPT (Proto TCP :- Port 80))
+ & Firewall.addRule (Rule INPUT ACCEPT (Proto TCP :- Port 443))
+
+Instead the ports would be derived from the installed services.
+
+ & Apache.installed
+ & Firewall.installed
+
+There could also be some combinators to adjust the exposed
+ports of a property.
+
+ & localOnly Apache.installed
+ & exposedPorts [443,80] (Apt.serviceInstalledRunning "apache2")
+
+Such port enformation is also going to be needed as a basis of
+[[type_level_port_conflict_detection]]. --[[Joey]]
diff --git a/doc/todo/type_level_port_conflict_detection.mdwn b/doc/todo/type_level_port_conflict_detection.mdwn
new file mode 100644
index 00000000..5aec5775
--- /dev/null
+++ b/doc/todo/type_level_port_conflict_detection.mdwn
@@ -0,0 +1,5 @@
+See <http://stackoverflow.com/questions/26027765/using-types-to-prevent-conflicting-port-numbers-in-a-list> --[[Joey]]
+
+Needs ghc newer than 7.6.3. It may be possible to port Data.Type.Equality
+and Data.Type.Bool to older versions; I got them to compile but they didn't
+work right. --[[Joey]]
diff --git a/privdata.joey/keyring.gpg b/privdata.joey/keyring.gpg
deleted file mode 100644
index 01dd24e7..00000000
--- a/privdata.joey/keyring.gpg
+++ /dev/null
Binary files differ
diff --git a/privdata.joey/privdata.gpg b/privdata.joey/privdata.gpg
deleted file mode 100644
index 2a761fff..00000000
--- a/privdata.joey/privdata.gpg
+++ /dev/null
@@ -1,753 +0,0 @@
------BEGIN PGP MESSAGE-----
-Version: GnuPG v1
-
-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
-RshEEnOB9uaV3YCNq649i0NP6siwez9tMpid35A7Es8IoarKHkcqCx/0aav1Cj1l
-ZAlkz7pwrwN1VI8ed1eTtqVAGb5MzArV+SIzWLCZexDANV6wipdWduC08xaNNa5K
-djFct43hfTH6apG32hn68CNwl16V8mfrnjX7zSB7e+yPBrXYdibjzcHocRLYzy6k
-TRWWLN/2qVqfOc2WaVD/pZloFilV9Enval7F00o98EptNtJUrQ4hokW3uB7/tSg3
-u4kw93JCT4twxvxB04PWQGRCeq9jTNxp+cVL+rBmkciEjsyGl/D5V1yhTFyn/EVp
-GUioxUPPQ+nXm/VJRHbE8wroC6oYotmskQDIkFKwl/EMOmK9p3TDgZ/kqxT9PzH+
-wPPyBmMsOvmSRBc+7iptMJpWOsJ2fgaz/jSi2/d7TBq7+NIYTQyuRqlPMlbzp0jg
-lERzmNt9+ryzfomMp7HkXoX1vkcZavWPaEHtr0OuFcQNldx2noSkG/mCdlLcM/is
-WGKTCTu5xQow1qLkJqWxr5h5D3UvmYNJzG13bn9Bw0HS0H/sm5srXh283dnpmdPh
-wvvZeQvvfwSCgkG4XC8s5IEa3xnkYVONflAKBWGK/2CvMnxGVJYy2UWswhGzypRn
-5jqDnYeQhyxZfMVpR3miGuJTd+h26A+WNxogkEt+P0gGv7UVRHpcj9r9+2/vctiX
-SIlNZXnxzcRvKmlr92RWW5PhhEZ+k0KnQudNoo0ld6M0Q0vWWJHW0B+JQ/3Ne31w
-JQR+Xd1to5Q8l4rrxrWhxWqdiovaCVdppbW0ENT/diECW588o1WTyiilK69OD1yL
-hU+T6mLdvxIQe77DaTlaPs5PMBI6OL6KA5npiIdgLjXyyONxC0CCNFlSIrhatjde
-yZMCCbEf1wfr6ns/6byRY+I+mNeuB+jEN41r6ws3FB93cWeM9G+O8kijL1Yjmt7V
-VcAo5tf5LkzcGHU6Wl1s3rurECbr42njm5JSWyj/ryBiNhSx8K/df+s6LqmRyQ31
-SeLvmDyN2v8BenqyBzH3TNfR3k256AeiQbGN70kHaRz90YWMoyCufh3VgvJVtqTc
-y8+IrrpJzKlH25pokwPUxR8f807A6R9nots4bAdYgbBXjm03U26O1Kx1M/EC8Uz2
-k9dFT6oLYFj40bk8pSVFPByjqH4FkSsGZsiYlLu4qK1KkLSf0K/bVSt9QE7Bh1Yg
-dFaKOL8zXZvcf3lk8mO6YnjAgKPnKWiV4ndwFq7fP6hw8Z3YfIOSIumcjbjSbm1L
-uDeETFNjbeb9vV2wWG6wen23KNmQ0H+PW9Z3hLr1zS4A2t/zEPLfIXvOtep5Yjtg
-FQjKgs4YrnNL4QrxUWrPQgmsyKVbrQ53qAJlcPgUCKhXsBd76NWYxBek9xg69xPt
-pr90115hnEtmc4O4DvOBTUo3r6ANpJpfDDlcIR/rNTMW3kwLZ/D/Q+sdUXptGl/y
-6/sh9u7efuxHkuYKpmEBQSvLEXwIs14QDtHHtEQVRV+Cb6ZoZVX4CvsPk1r5Lf8n
-0viI58LteC9bpdGha2ytZDzFgEM3bUELohBKH9FLw2THilYE3YO20aReHFRsle0F
-w3RdnkgY5MBfYj31IVVPQJqy0tvoCxBB3D/6J4sS4+sWp8o1Fll47AjwoDHWe0Qu
-jbi2WvEesUACgneHwczbbjgOXCz+ajcaekAzwnLnLvtvXIgGeRyZJZtVk6YxDWaB
-ysCjtTE/h9W3af0+gRj36+L2YyVlC+Qwjbsxl8kN0mUYUqEmYR33bXI+JJ1YIQwq
-K1G7DYrGkMMqC6n2SLtB/wm58PyNT2YnrhQ8X7T81jd3terRkUiX8kHEhcBffdgc
-EM7cX/kwfK0E871hCbHwjBgbRiSurkGcadoHxo9uEdufaXuZdzl3NOFBb0u8VNR5
-rEiJUXixIx2tXwAJnmwe+5IY7V46kFye8tlFIL4D3AZdfcDvkmWam4cFjIzqe2wh
-oa6ftmmCessZhfzsidYQWlt/htVFqCkL5CeHMjZTUBcE0fx6pXj4w3ws1Soga2kL
-8p6rAARaqtHEdWJsSzmA6c0OE2UscFFECTOaAcJgEFbZlfn2rJvcbU+1XVGdA8gE
-wa/6BKIJ2huysRviiei7XtVXBZIP0HcS6il3t8LXCTclrdnj4UEV0MRVPHTuY8+c
-zrGoeIN1V9W1LjLIi7snmx2S8jPP9O05PcsZktT5oHw11Gxrol7LNyOZxVGo9Fgz
-NPlXflu/FfMSeR5OqRJ9QgDDsXQ1YaoG6qlgoLp1ozEr0zKDrV2epBcrFjc1V+FG
-qiK7k5jIaOKvyoCkOU4Suul74Sz1MLW2H4X8LWgs0MxxhH7uPvKTYwZQGRwsIL88
-65GoqJCQzkmCMLRPGl+pvffjZw6YUw5uf1uIm6cBtNiWAIma/z2O0TjOJGCMGwra
-54DX1KEPN+C7+6tJ92g+eEBtX2hOlExsFyPkm4R/S+J95255nsTgpkdSB1N2TyhI
-Xdwb+hZfZyx+woN+o0YF1Aga66ki37IMV3pzKvAJ56mBns3FncTanVcPr+ABNKkZ
-TFPJBSiQqYBfsQ6nI5SDrdfOkrqUEor3Ml6CRo3kuRJLjJY3Odcb1b8GW3ZwgPjm
-YbniMHUv9BtG7Bk9FqwGIihYWLtpR1PCAQjuzxmw70CdTAlToVjNME5uh74/6Hrd
-sLTLPMEaxB8Whz3Mw0ifRert2sYCe2zzCRNu+PooHRgBuhOszFnIizQ5u5UoVWsZ
-NSxv1Irh1U6gg1BE0qHDyoEBm9Cfy8og43hdLFAIW6cSmZbwL6jEeJ0FC+Fp+ENS
-q+nJP++Ccs3CV5TeHERXx893RUgvnk3sp3lVTP+jhzIWbh1WwOgCIMcUwVn3eWfU
-fCWKLTGQZIZryePvWrKrAfypFJub+AwIKAokdDn6L1HxEtuABW02FNZUWyVuHKrk
-kdZgfjsH3MY5nLfxzt0GGTvM8yhdcbkcuAN0A75LQF5OlyJ/ClJDseXWyzXHiSnf
-8UlJM2CeUHvCeZaKzBR8478NpwU6LQ3W3Z/nikjis8FVK1uvcjMgE5Gi/cuhRltu
-XRVp7YieiX9LFFra52c2TFCON4oAH0xProbNiIowny+dHcH0ndi0IIOQ8LAsdsP6
-zmm94K1XNrlqajOJj6q7dH0N+nuY1ypYl3Y3oM93hgeGdozn9Uf2zfcNvptymobn
-Mkp0c+KVFjGgqhKrmGe+8nMzw/hqMKG+plkYpR/zCeVuUpUgeKn/fQorbgXqhSMt
-I43/1TCN3MfX8GzvA07pF1KKTiQf1lhGX/GUzMHdFJLuZ1Wo+2LsdpTbx9RVbWEn
-0AHZygPNVZx39p5QmUHOCOen/cVn1Ej8e2YKPxpoYw3aB78zgF5tINiRQX0GgiQv
-GBrUi06+HbWzv/VqbE1kGMdKIWv+foKjXJ/uohbFKbBSTyZVDb6o+2WJ2Ab3aRiS
-noHfph/AI/Roq06Oa1AQtVrIjEE4Cx9XutANtGIOg5+0KISotIbufmLMNS5hb7Um
-nnvmB3s5b5bms4vzeSH92LBH4Y1Wl9K5fAtMpTVV73Q4gOmO0Q8E4b/ch7DC0jrb
-QaKqCP1sTMtgaRbrr48exwRdb0ons0Ionp/QaIfg48riUrfKgDXxdYqGyiUyUs3z
-sgtTNyNiPfUo/YwV+mTBP/aFZmuL0gHFaW722oam2aZH6xi6nOBhj8lK8/Uk115F
-IcmsS3Ik9S+AeZXWu6j9tgtUONRExIHaW7M3P5mNJ8Plq/XLlVb0ofQ2vzdIPxHL
-gB8oHwQpXc0ZQ0vo8cDLLGPvnU0LVpwcWbefsDlIvYRW7m+xxXJwNeaiF1Acp5Pl
-+CnUhApxYT+n39Ug+im0O6jpsBW+WLHIJs6Gbv2MiluCom5HVJh7FfcF5ADF8w1q
-frb5O4Jhi+c3Y+N3zhZisKE8pQyvo+teEPbDWA1gd+2Ns2gHqLFqMuLd3MLh+2H+
-94HB/sDvhyMf2v4+/b7cuiDm+NVXB3Sz92OedGqDz5bINADneur913tH73zAy4Tf
-xPPf+gZfMnpOTflkNVFB/T7qpEOS8m/rcpYpxONvMz8T3Wvptz5a+BfOBO/+ZvFC
-XfUkD9ML/FrH9ZQBQ3hQbGafCVhhGzD8sJ8F+XnvPuwZRi9/tFGErIJIz35kfahs
-lUo1Sz+9Gr+knVoLQgMB6vAAs3JgiyBfwXvtbPYGWz9Qp4/zrNUf3WREpAPPBQZO
-WQHzFS4d/tWGalN1K7fgUcuguyFlC7qTOGzarYH74yr5E/sVG7KMbJbViTMJ22fS
-VvAOOUKV740kXh/fmqP6K83djyyF8lYFeFvms5Z0SiAXxafNlMKm+wWb8a9Wafk3
-3YNrf86LFKTrFq01PLvp+dQ9ie0dplmoOP0bXWenBnYDsFpFBYsQc61Zx3W0NjU3
-8mg/eCa/OGaEMYXsM7tiYvKw1z85UvU9L4lXhgf8qjWmmtpeKTPEliE95Pajq2XI
-SF8HHnd/sOyU1rx4mvotsJF3yfy7jZr7S3OAz6mX2pNcjoJ13JKfOwfvcTFDgyDI
-/Vwm51qVfV1tEKngzOHTtwEa/lXT+MuOYGD6rybfKMzArdDyrCa8sScT5qjd8UbD
-1rILpHw1Anjm2Q7Ds8WKHpyAV4xMHJpesLvnZnj9pzJMjV0t4ZBpvKMqg2BrAOYc
-eg0e1HGnCqDtO/X5524Rb01M3XxvLIqfAXKz6elhUmwJsGFEGvv94XI1aPQLJ2C3
-cl77AG+dahNIz+jT6EcmzT774n4t7JmQWDgqUU1iK1Bz+pgli1tE4foZCg+Z7i2F
-r5EferiplF17PTLPszy3rRGm2KtR7MuFDsG8PhYzcb++ieE9v1PFfb1sjmVHUSe3
-vP7TRrUTELjFzv/cCploHXcpZHgL9itMC7JFX/PtQIT2RgabECOYbUhON/itkWry
-HvLHXuFIijNQrh0MQzIhRmuVwhrgHbw4DBOgm1no+n+6Ul7Err60An952IiOusLL
-VlZgmYs5lJ2x6sHfdU/za+TwlbCBOGvbnuzV174jKE06IzqKnqBLZUGFFLifbxWV
-9VtDwjIi3UtE70pwWULaIMIjMoAofbEQH1dO6TFTQs25Swwses/yff9f4NU08+8M
-rai8c/skT6gAZWUJJk9DNgXuziJueT+25uiy0xVNNK092ig+IwIhdvNCxwoEGQMw
-PpKyREL4Aq/5ed3cE+s4oWH7jgbm0FWo4dI7oRlYCeNAeMCvMou9TVN6pom4rcBA
-tqr9McnTw9p372qv/DPINeJBYHemfAeXQv/al5XGUKWyNtWGulaUCgcuAraqbY4s
-3tIABrqWpGVaf5GDXyRCxi2vOffbtxIij/3PkjtZZ4cEJUgTHDdGPtVnI993CJBM
-jV03c5uc7JAHcE+KnCyj09FW1lBO1kMpxoiHiL+76UVYgdjoe7e+awjg/Kh+JPy8
-5zf7OaaX1uL2lNVFas0AOkXp6FGrBUoxV6+yJ6bjIkTFfOUA4p601gg5WZ8JgfCq
-9gBpzwGsBbG5oyrm1NrBCDj+gkT3ZRv6DNQ5iT8ZUViS1t68/f1JZJN6kFtf4ruQ
-UIS2QLUYUDYtmcaRRGExlJxFOjd719DMbhJWsouF+DesHIbSUmFlr1HIYBvvmcQM
-cNnSruUNv02YtHgbP3AwUGHTbEPYzYZubeoPUQgbdjwkmK7BHoE7mfdh8Mc2KaZ+
-7+YIuNd1brtrLfppM81WCrIhiGr0FZ4Bq83+6oAOl+jkVTzhVpROCnzdGzuY11Jh
-5KYLtX2c2O9+LB8Iwkjx4MR4gBGGew7OMgR6krL/U1b0CTXJ2Gq/OdGOq6JrPA1L
-LFM5n8rrfB9m7TgqH9bdoekVksracc2xjyb3Z1XWKygmLKMjVMPBgdV6XGMLr/WY
-6oYgrz6B7/yJ6ZRjgVkly89qQ6H6aMUZYTnIqOHt4JC+fswrS1BkwaRsPh+TPG8J
-dqwdvLqUyw9vtcX9PTBkcIrt/A42TS2k2Zf+hdBnwKegTE4tKz37Kxj14nDoJxum
-JFrCDFfVvizLb580h3aED79hOEf9vf6wWPQvVoTy0siiDmg7V99URzc4leYBeb3y
-pbSrRK4aJEJDJVnUZslEY7qKnG0tOAnuhi8UdxPGQ2cT5WJ4tx7LyDdRkIbOEjdf
-cJq4C2hFXPAHxbF1ysXFpvGaLLAk8Xa2VnoyU0I7isFZ1BwGP0s4/mPn9bKENdfL
-9rtCyBE1h08shbYL86xl9hCofbcDadhdaL09cTuwlQ64Nl3HM7vAjSl/C1ls3T4V
-GSn0lG3Ru7PVZ7zKtz4A4npdGS6gY/r2xCV7ppSVJ60ce75YN2P6jlHWE2ojiicM
-S8BLzhAt/fxjCLA6GGB6yUiKoibgAsXHGFdVj2EGmcwtJ/BcFoTU/G/GWGutNBJa
-5gtcGNQ5CLEeh2K202qyTGHyELmCr6/yCAlF/pqyyzh/4aLRQVOecfIdHoyGFSvy
-C3VTz9yyi1gCZq87almmRpi/qrLX6nnwcOQy8+2611rhJnMhtU7Yse8BTqOeZfBe
-q12Jhho5CcXKdwQ5bgrmuDMy0XaU2S1dkl3sMsPE23H6mYyLA0t95seaxDsxzvUW
-xJ+Yj6OiHJ2edzdXRDMXTX6+YYiCax7/Zngqq5IS5jAqANCqjQKTDwrc9Gxz856C
-2WKXge5/Mvr6TD+SusesbY5DJmhEElD0BD3XxkhPikIoMjwaE80I35uVpAgtV9TL
-f0ZddVxr9qAQLqBJytKTtkIUZq8reTRv7kMmIRCCIOdq4nifBa1KLX0zzGK5fc/G
-s/fPwt4FQZqKVryfKLPF/jSc5oPrCo/9b1lb0CTmHombu5qQ4yZ92A7wHmFnS+vt
-kI+GL8vy2dgYxBZE3/Wp1CUXsIX/1IiWTLj/NQZDgxApW/o2vYncgnGF/NUPb6DY
-Vx5jByPyTwAVQgzD613IAPKka9PFwif8293mHZswfy81p3MVPmXVcZG+kEXxRa3L
-XO4JW3zxDvgxE2+zv2U1kbwSxrijJSU7EdVVhHbqT5Ck0os/s8omQP3hE7nfmtNe
-MAIttgPZS7ZZJkbS1rw0z0fbCoZyuFSbkozWqGFPcgp1tcCQ8L5Cg8dWOdq9PAmu
-yQ3ZRefSkYxHERdOarhl3Mvbgw+f9jsR+3c6KxwGG+8oAe5fRBign1vbwWHLb8m7
-PWxiZ9EmP7q8lRUbJB6Hi0cZphxhbvLbsHlsZHk8f40jUiIrr3TK5bUcCyhIRMVQ
-geT6dhOMa2fh4DR3MhA+aqweGE11NusnRwMd2LAsjm7m/0aLvLTjx/iizMEhzU7Z
-X2Svt6AbKdB0WD7iTbgp6IIStW+OLjm6RpLuEpQR95/nCNSSLrXL4aqaEUkduJiw
-vkRmAhtXD1ozVO7aHP9MsNNWeTDvCV8xjKkIpTW7Lb/0U3TqAuMD3rgZQItqWbPi
-jRu3KC4BlGxGnkw8zGcGo7dF++Pg3+7cBgnMopr1SyIDCPT9o6fQmIKI1/8sFa/+
-AC442bYIaldjhl80b7+zP9YnuDg2hdzh2H60KKXrn6XouL5STuc+r0L0M8ZdDDMN
-D+08PF1gHGE0sGCjhS5zbRi4qi6tSbgbsFsvclZUEqWXiuMWCtc3+4zkCntfnAqj
-7Rov1cL02Tcj75QK2ZTGsKA8zWrWFa/ehcPGjlJ+hu0mabS8/W0FiZiIYBaHkKkh
-wCRcuARKPkXkNmwp6+F1Rhvkmnt8Q+fJWvL2aElXke7Le9YlGagZHEyiHnMlwsuP
-TZAmzSWnqG0NKwfAiznfGWJa4ylKVM1SRwCaUiKs+iyUjzJvlaWyVNXHUIqTvrqq
-G3RdddDexwSy6VfDH7nJmNtt3dtU5wNWsjIMt/hTQOJoR3NrnertmizbMov+6QNb
-ZaXYbi4mCfbcDFbxxN8/KrXikXNVKCPcitJm/Ma7fCcwOdsUAX6TZR4aN+Dv0MMD
-2tdrgD85/MUg1wMvZdlS46emV/xa5jIDGGVYjmvZKypSjwWK1tGCEBdhe9N1r45f
-TfHw37vlMhjebEvuMxzgQbr8gbhEMfUAzK6QNa8qeZEdx6VeKwdv9BqOQjzfpoRF
-KbYCnq1GThCWh2bMKbVFXnWDbixdj344v5wrjqdiZA9/GOlx8IytcpHjtXfRiXWs
-sUiehAJ+uGy1dwRbpLjW730e0HlLz/ayb0Yg7uXOXsm2fkznshvLuPwq0L5PkBHb
-aQb20Ka+xFO3c2+853yZpOKUIrG3EJd7kGxw5GG/LKkBEXOlF3bu2b5zXrFW4D4b
-u3k4hhLMeIE4lWTx9BD/BbiAbAlinBqP1lGFGxMFXSMVhfGlg8VW6iLgAv4Y8NrN
-oC3EAR4At73cr715RfhOs3l3AfYL4sAjRI62Wpm4OA0hVyFiTDVUpwP/zoltCcZl
-oPUtAy7nh/J4mt6HziYJhApGswdKuFyEiDb1wwlHAkBlSRNgxzWXKnWugcAL/bdp
-EvK1TomUXjocpgPEd6T7uGNhsk/QGnqF2XUI5qj4LsOXMf1+6JPz7J40td8HcZZ3
-Z1OpUD6Y9ENbmy0azhY9PTseS8YyuQ1fgDFnJAprRwmOi0ReRRn7INazzrQIYZJd
-JBrTZxuwjhEc/kkBp4viB8bbTkDDwjhF1T7KFeFriV+ME3CJ+dZhjIOi/HTK5y3X
-k0PPlkfMAqRNohtuwlyNayzUD0cXcGWZ4cgS32wf0A0MW7KAF7retm30ddPuKLlN
-Yy8NIz0OiEF9koMbIyitLN0BVGhiBQcd0YCrGNVWNEWR+kpt50Fo6OhYZHy6F52Q
-TMvn9W6Qj3SDq49uouoRmvK1/eccLhhjwYEyyuEpiBe9422k6lfm+gy/2PdzLDzW
-ZBCS5FV3OAfGXkt1GQC3edkWBRxpJ8WopDOTBtiTI6166H+Eq0/PfMibICwmy0vC
-BDPRe1IiW3S8SZzeYaPLSWgz4TCRuOnYtccmq7rxnbBQQl3M+EYp/tWEHP0yg1fC
-xSx54/kxwH8GknOBTlD2qYiAk+nk4RnvyIciDCBytO9wqBx8u1rZkyiuhwYJpqDy
-Oamegbd6imkOPv7NqZG2WEIge053sSENbeVJjiw0T5ndzjKMT04ocKf4lKgCOcgt
-do2uhsozbPyvV+h8ktOtzlCB7zt+lWu/p0kACD6u0qGMjM03heSWbJtVXNvCKscH
-tng1W+i7k++I4PH3oGYE/3xXKFlMv5tjBDyBu7NPIYBPOO1Z/uyGbRlKYIHGz9o4
-zqi5QqXZvJjB1s5YX4Dkt/PUuR17W86/Mb7Ggqv/hZ/eMSmBF4uvHtDDurTTTfcR
-ITmEtR2gMrHNxIqcFzsI0aiLvxEiH+zLSXuYrXnwu2qRr5K4BS42k1gOhKvtAfsh
-bbUT+Dn574bxdAUjCFH0ju1dyKEu4uuLuw+KQwxuulp0AUC3UQUYpPxmxbE2wNjy
-DZS6TM6JWhd/ww0DvQ5wD06DtZao9th8kKHErOUABB/57yzcffepsEN+nQcLd52+
-fy2dnu2OUOs/7FGMGEbxULwdlYhrcM9aOAxwcL7uSCAGt7dwZoZDeSWDT1nh6Ygc
-98EY+5Sw0x63EVlVyjonafXKUNW60PTPHqYfXTay43FLMYpt/ynxMe2vvfHB5/qn
-XUXIIZDJ/ySqIrD2dsJyqyT4mUACfc2WF+hERACuXd/HQWhVPr0TOdF0t4Kwcdo4
-Nx1lF6SOO4IfnnVKj/6eWXEb17mCSqw2R6ihzZ2ZrPA1zwVEpJHltDnHKbPC61DZ
-4vg4KTn2l+Gbbp91GkHjqA31Lq90eMtvYIsOX1pGrnyTeuqdeyd88qajpmWktxzh
-J8zJmWBEkNcEdR9Ue10TIorammB+ayPPCisIy7kqUP5kw7Tf9jsUNg6loU/tC8ux
-f/ha0j16o1GDG4AO/IQFVowPbj3L2LAFJ3NaydR9uDoG67j4rcVbWFh8Txntp9C9
-RLSiRgFg6GVhHxqNz97a6BjtOQAjPyNa7AsfDShA+T7WSa2Fi7HjpqkgHPuwhQQO
-6z+S7GuLH7R45OHuSpu2RI9Bh2eZD0WudlgkH5+mnJeEvOjzLOvydZukUN1Z0Iqu
-wqpjN6jjTEsohRkbC23o/wOi+vtB0Ayuf0lr0YUizZg6i/oMBxJ7yo3abu/m/a7X
-D/7ZJLxZNneOjY7CRac4OM+Y8vZBKXpC9BVevVkji/JsyWQLtlNHGUxyIdIL++CT
-o04wiHjRdiP8yW+SpKRlziDdDrG99R0bAKEiKz9v0cIFboxklPMpA8lNFgjQBdky
-0yTKt8bTiFKVK7q1p6QSBmy7TLBT54OzVQ3YWf6DqsTVbVxo1PtBAVH9mCR5k3+P
-4g2qyUFrYIO7eW4C6Dbi68HWWkfonbXoKxh4Ad3QOzSbTEcAq0WAPj/eKAISWXy9
-k2GCqE9vgeUbLjcd3/BA7bvd3twzTMFjJEG2uDP70OgzrsaqggUWuCuV4O7fKVDa
-nuOuLx1UhiXJq8l91zN7LRSzrH1tozqn6oBGgZFZn+K37wfwxLkcMgX/kq4lRy0+
-a+Yfisd8ESHOAFqK5DZGpN0yt0XdAgfzpvx8W2Cjkc0KY0rB9F0LP6ga4sOMSfDT
-Pm/TZna+Kfzb5RSPbpbNDHv8AaVITrSvcNoNigRMbU2QDzSfD1SM+ymhFoSJ0iNC
-y1c6XlHTlWVrT4zuNE/vdqXekn1/Vp4NQOQ/Y41eyS+VUmlCNshMnuCJTo+ywdr4
-HFrHwtXm8BzRoDCPBD2YvygnGyUkwTDaj/ClFPqXtyIA8U7VqyEqByASGjHAgYO5
-bCy3A9EjMsqxdWIKo1EB55CEQbRSkr1F//qrxEGnD/IBiyP3g5WqtPfrYJKP+VWw
-9FM/RAzg7t+EbYA0emASZRGn8wlHm6pwcr5+Vg3+sVhZiDlq9tC9vFUxLqW4jpkE
-RImPgw4koN+aGLWZB3oE0ZZh8a4jzpS70TybH79yCqxn3sWxpeE7wS75/EnuqwP4
-tduUuxTV2vo5PLeZu2Y0FIqz8wbD2UwMYw0k1e+4k/A9wI/F4v8HOPAA2A05ls16
-8HTHjIlwZ2MWrdcAZ+JY+ySW8yQOlBto9eOre0qv8WsFObpuD8DbT+w+vSzVGJi2
-/5Sb3cZJwwx0zyRzj+mbnoGotOXty714m6ujcOUIhRxH9pMVFFfq11XcbpH/H8nn
-acerPgDckgapsKC4aOxD4gDLG/qFT9uE2A7IJOwWmCCPj7ikDc6CiBdOhJVuf+61
-h0IVjU6Ye+syP5nHwwDPiSUTcVtnzH1xDtSe08lA8jHil1rdsVBNkgS8VTJGbFHy
-3wkD0+VfSO3q8uLKx5PZudsqJHAmo0pU+sI09O0Liof7tN2oL2rnL0vkWRoctzug
-0TUxygwsuj+jJGhSdRSiZ18AQHkzDxZJ65ZdBxjHyFcSDGG9VQNX8thG/ktwlTSk
-oHcAhpMdoaS+m07LH3kkRT3wdD2dJBLj2vUGRHJ7FcUs/C2Fl9C9rjQ2MxHphgJo
-pUYqjhzrZS0pXd0xX7Jn5ttjadb3T4cnEBbkSAJKTl8ZGOzVXCAvAMuV8LkOrpUt
-eQ4kCFjukU5oIgf/zGMJ1T9Ga8uLTHZ81iWz3IGkN0J1wpBxBp2FgrQEFkE3foAO
-Y156Z8mZZrcV2w42lRDPI6yYy1DsvsosDPHe1Y+AVck+kT6HICr88HA8xWRmC38N
-q9XE/tvxvYOZbD3Nf7kTU0GCbq/gPCp7os1mhJ+Eerm5TE4jDIb9v08gXu+qCKBP
-ZVNZBftzAYqRAULO1HjsmZkG0W5NvWHkUGLzVqlxm61nfvi01Qz/FcIpHBB0kc3I
-IjX9gDz2BWQx71XZrDp+bWbM6khHYe0igdo6IN4N5QTbgfSYpQ96zxG/gPvEKp6a
-w7il9XFtLS1chheXlEQlMU+oW53RfjLMpGBEDfiPehReOYspAqPeTGL2sp8t0OCO
-wP4CmlcEpQaXihluKYukBdDxX5iNQ4kPxD9rLmP6l6pgy0ESYP539gg9b7/6SQbR
-FIBxMfdmVdsnwN7RrxcQkKywF5GjWJ/hh+J4HELeu6mLGKt6BF0FOTHArv6oM256
-+ayD7BrL/FsgqhzGDZM/pdkqA91R58jdzmh0V4MQjEaclfidzsQiNAtdEFsTDoiW
-GqggDG8s7gOoInYqcP36/JBSXnmEqtMwwDSHTosOnC0Rh0kqucDMXNeVz2zPQ3KD
-SJ64ng69S9iDesByb7PaBkdbtMU0Grhcmi70sD6tsuf2CqCWVHVTSjRBKt9lWLpW
-cDt5ScAaneDVXmshzIZNubbkHKWUoulePzLu1NxdQsgz4Tu7dYeHYOfm6DWTwS8R
-A5ZifTf/02ULXZWaC6hr6+ZWX0UYIQ0oWoW+rKQAWXhbF5a6g00XHEf7Z41dnzKV
-3gy6b5VMr452DOZzNcRjgLNLQ0zmEuqH8UjjXvF1Uudv8mgFnv3N/zL9BlOw+Fw9
-ZYMhvqGXcDwPB7Mklc0SQ0dtdV4ey12L4yHAybbh0iJ+MY0u+Lrq28Clb+b+hK+5
-faQqWzB6CC4TX2R/FrJBfdBUgMSvWa3pOj5CZaXZEI1yTPI+enmGiB9G67V0n6O5
-WrgeDd8Yx8KsZt6IvB09Ao7DwQuuFFWm+nE4h8GyLzeIj4EBrhIIZXDgQ3PxZyCn
-bXdkAJUpIMbAUgLUtNv4duWW7i4HbLaFnuo5iPTkeFdPkYq6YVous2oOe+imjto1
-bikEIy3lMx+U+c3wm6DxP0rh6FPOevdE2sOYXfg9J9wnWJWWsWoLpG3hU3q9RQ3Y
-WbkAxRGdoqLeTKWFerJQoHB+zjSTtDwHliN8WIn2ok5bW+4fTdV41AuocTu8YUog
-1MQGcN3By+3eeXa7KxxIt0xidOFrm1yxO+403GBSdDx/0d54MLwnZ83z3EtaITy3
-f9cQS2kN1uz2r1zhQVsuuKJr9kI3LitQimUgA04ew+EJRafRfqSH7JgmASbyzIX0
-4dO79K/wWazuz7ge5IhZcLnBTXcsRysU9hbGuV7utzgnxk3CedKjACoiNuEylXJ/
-crScdpOkGqVbx/4928oq1XgKEaIrjiRpaeDkQiS+yP8awt376VJfIz1U2ZOTWv4q
-BmTB+fmE8BAlzLdZKfsTGORNDMy8QN2FXjV1oNto7qqdOcVsYTiLSTWDO710NZX7
-LpOMeMM+plDTA6n84uRqRrAHxTnidnB7EBLhyAHQr07G8v77VJrtPNF/PRsqJAjb
-hD1WKnyIOW3n8AtjuUiClabw7T3WyCeGgDRj715J0uG6fQa2vPKewyKQkcBT9BCK
-FpYSCZvBmOjtfuNWQpYg5z+uG8HMX0AvVPMfxGsTj03bHDnSXLXRSRi8wtlqQ2Oa
-5LbvqAzt8w2at2KPKO1H1TEL1XuyM2JdrDw8wBw3GKPgF/InTpe4XyPTKUzmMLAS
-7SVvkVKEh3onscs2Yrlruz6CVx5evCNGwQ29Xv4OAG0zcKU6nL36nJls/xKgUtNU
-rEUyKWjrd9svh1fdkDtdBy3xSGlni7hbYf3E2MrPcSdN15iBgfE6uxheyeg2OpaI
-yZ6DyttXordpKslnH4cel9MxNuGUmw+08Rts8rLT285izZiRuMG1Um5CQdRc3t/V
-DRxz0dHVhi5LOnVmcI9CR9+bEefUN4Fotd3K44uXDEf8Vx5phQl5GFOHLuDFlgkW
-OBw15Eg/NWR7NMFAV4IfWh8BR2JHwsrXcf0S2TihM/YQa4+7CXLAgBRdf6kGXSH7
-aaue+ZBLr3b41rksvDOYb/BE3XSx8FjXW/Bmv31POSjHz6lOaCduzuAg/uWtpMah
-fihgY9ApJZcQVtBu0Si5lm3AW/oJ455VWEWEk74nSbkb10e0zv0nbFT4H+2S+dmU
-S3iK5mGq5wt5TazPOvrBVnRZ3S3gjLF/l578rD0WdPeuLCGM2UO2guVe3Gl01Khw
-LtrEeOFx55jjoBuUx5vzc+I2FLhoerUtxm5swHn31jO/22JUhszia9YaccF3syaT
-Uj7E698qTPhve07dKay/kgpQptZMo43YTZgYEFAFUHQ3l2kX637zb04VAi0T0JIW
-Y53CX9MbcTALyczjL9MbhJUFKE6+coM8+ec7GEMkwfyWmrFA1rZxzERIEuroW/Lu
-nYbLXMIuUvvlTDfyCF3Y79lmaA2J+wPeQH+4RMM3rWgPYnSJoF1i47/89TCNFh/k
-zUQ4f30gDo5zNxXgzQrZXYfUEOjVx2Wbb/emVHX2lc8ukgWeblc1O73uzKGVqW4q
-0MQISH0M0BztHVHGCPjkf9fEvO5F7rA5XgHBJyc2PebfOvMhvKnwsgGG+E7Y75+S
-/jqVVR0ou9P+TeCc+MSSet4O2LTO4lOUoYJ497UpvvkZ6UlAPic+h8k/Z3mDraFs
-FPSS5cp/wDTUQcc3AXdzEz+NBcEOeGtvQm+XN0ZNmyDkBvIJJYpdD3eSbMihmS3s
-oYM0oszzsgGKr2POFo9lDPwkUHgogzajFEUUJfz1qmS5RPTgchqkbKOBfkMv6dEk
-CmDz2GqW377r0iCd5N2ZOYweFaT0zfqVj0sACHu3ocLqzJ6Gnpg14Vo9sISTjiWy
-caUDkfuNe/nNljXeIUTpf7M6M6ilNEnaGPjwPSlX94KFH9U9lvlWzIeCDEnakmoV
-1LDaRVDKXuUrqX2k/F+VvYD86J6AooVjqoP4Z8OYZXDaEDSasn8LfP/lDzlv35OF
-Zc5jc2BVMQpc1svJnUjt+vGGF+9Fdm8fGMs1u5dK2bd9zsjdpJXLSyPDrqbSmW6H
-iveb90TgWwg2fa0n0yxFwBls1+BGYLyob4pYBXoGt0C/g0lls/1Pe+GmcfyiRUmE
-G8zfg6q38OlvkJvfGE4jbTLDDy5xDapnJhXNnLVOF3N6CRnu34+/ilV5BzRAC+BC
-7NXxEWVZogjhI/14W9yTbCUP5G+JTxmXgzcoJCLX2b2V+gLO5dBBPoOWrZecY8WY
-P5hfXHiHAzt56Q4Ri02PSit7zf2/2pahMskLl8AGDeuOvRqx0wc0b/v9655FeTOL
-RuttFzk0UAQTQN1ZKlyKAWsEfhAMM0qBQO1EGybxPn6Kubr20XyYs7gjpznqEDKs
-jWomZ0zZ/rCI+6RFn5oYMfEUk9hBPx4VAuD2mRYxWKiM4JbOPSziIHO0RZMprLiX
-v9qeKmKqQQQ9T12wkZkEDRrdBeDzAf3FYjsythfvT1gpB8JnToCxJKL9d+RvRWpd
-szkcNEzhVFFxuBgMbMQwDAOPxAEihJ/gXSmzTAvC8JsjX9yHnm5IafaIZVuj2Biu
-rwowZhU0MFl0TDodWgEcilQX49k6aVyl3esBEYgA1HgLT8FKv0+kn5FLIpRMsi6h
-1NBDy/v8lS6xX07zke7Q73h+Sf4XiXkVZCL/Rb5po3gXrQPUoCOArBYSHhsxmTZx
-OT+OsNTv4Rzydm0oF8BQkIvHvAEGIQd6dQ6sjHSxNzgBPFYSFKVSrCf6fIwnt9AF
-+vArEnFvapUoHqd/aqFetL9shvlM4sozCTyA1yRTAOYH8/wwi9T2HggRt0108j2T
-W9+tYv7fXJQf9pqnY+LrbM4Io8IFULKb9pBFo4+pTGD/fPkhYt0/6TCsA7pDkXI5
-DENQI024yd3D+L822lCYf/A86XBs/HrJ67Cz3NilmjEnkURs83Q9EdaHw8xu5Yh6
-vTq3jiJpa0zTYvNW+2Fv1PcBsFkp9wp9sfE/V+6jyoIjB+WtyBvUbWRzOnZriKlH
-coESxtyou8gnzwaNmuEUWqbBrmyVGI47vG4QJUX7fuhbFJ1KmFOEM2OCY5z67cvX
-UQrWveurLKpUxsxpgrbe/VoOLMFIg1mczfuCXrqLrQvFVqVmm32XeYuf82iVN1Cp
-JYZNKgEzP+DmFkH+nnsLm5aiHvWQ1buLQxc+PuKGXSAUtD0/s10SXUfuaRLMzIzg
-tu+tjHmBYDb0IkEulrKwF5A5qq0zChicq6rV83J7G7yhSFz8568rkufvWw5Kl2KM
-w/rPeyZGQkYNdwyqFiTU8k2GBlDlmIBd1gUU5xebbBrXtlFXx/j6FnNj+x91ET9G
-T6ti0SMBpXw7rps5fEngeyDVlNPKjP0m1WbqUDiBkzUb8js2zMa+ix4u2r5X9B2F
-CmTyfUeX4ogoY0Sn7+4fwgW1O6TFtB9igIIyAM3bkvljpwa1bF0mdf16xOe1tTlY
-eWeUxHXnQnz0US4Q4VvU2Ha3CiCJMrQmcX4K/ErxXMv1aoNyAwQW/Vp2uYcC09DD
-FhUtdQOkhtGnSsyGw5YYkEu3aTee2tfhD46gM5JbYfWSA+5jCV0Tm8HQOmvJ95YZ
-fp6U+q3YoR6dgZ+KGzlWSsQvGQ2mqDxbXf8wN/gajDtUdC5+5YoGfH+WjIFD/MKP
-lS9e2+k1UmjvpxdnB0tvyb7GOTokc+URuZAUw7KkJrCDJDYjGa2sPrHH4osVUIKa
-nMpoMqy4D8B8p2sL10IEJwWhdimrxxp2HnE973Rvs5Tc6JL1/AYokI3+Dc/xZ2Ft
-jG0slOpFKWhemjwWSRagmpLfo5S20vlp+2M91tV22zDTq6GH1De1s3yz77d+5HRw
-sjky7gzAaGvKUU2UmhRL1Bfx3OWeXND87mJo9w5LA1qX9/wIbrzz/W4HmErPOCPf
-PeXxp1D0qNBsoMfq6hIB4WpgkrAHt2UYCw5fgZP+2VhYCkuv+p4ECovnTAABf3Kh
-h24UQQciWA1HVnvs4OUJHCNhv0GJ3fHPOprY/rgqrnqWseLCxlfS1wMtYnqfn5GS
-/9+QYcqHHKpkNuaI0dsGUhojCJsp6UYWUTQLbRSm6p4Xs/KM5lzMSMkzPIymYv+Z
-hBEG+6zvKOHiN8StVVQYslG6CUflFhBK2LN0S5pjcJefD7aOtcUUqZX5p+gXSo0y
-/+Esu698bMWYP53maG3N85dLfSTC4xgJGjNzXsgBg7WIZXq8Do1Sz7+JIA/8GfCf
-EQwmNIZa+7RNv8G9uLXSajDfSF8lbJJgjlShmZvC/A5++R5eoSjza/vBHHW8xDY4
-+XI8a0nDiN8mvBK6D5xtQ9A7LRTDbiSlGGiBswjT2BxYz2buo2H5AXqVATx1XChl
-b0//dadguF3brMK/XJ7AK1r1rRHgEebr/BanhMTbBSz0BXFEo4HNRI0uHZFlMOmJ
-FeOC3p+07pRCVqUJAgp8C2aYUJPFXftzg1AS0rK42GdD65Nf4eio3yk5JlJoaLBE
-s1kSbyWgthprBHtDXJX/Tg+V+ppPdj5vfJ4mSYBPiKvBqzcgpoQtPPNpyuCkCzdU
-H4g5xHOj5BYNIqwdhAtB6Dx6MYSs7/OTXXBsO8jTeEspIoUpOLZYB0r/u6IkHEV4
-G8Zs4HO3zT70xw1Ss/ydUEMJfPRSePHvCoNo3DKwpB39NaOmHepJnRfW7MfYXXbx
-JxsiICVmKt+FFkTNeo+t2ok96adbM/6yvWuvcl3xc1r01cYvA02Grk7QHCo3D7Lf
-ExzNe1JoCgtVWArnXKWWkT8=
-=h0v5
------END PGP MESSAGE-----
diff --git a/src/Propellor/PrivData/Paths.hs b/src/Propellor/PrivData/Paths.hs
index 9f791b76..3d0d8a58 100644
--- a/src/Propellor/PrivData/Paths.hs
+++ b/src/Propellor/PrivData/Paths.hs
@@ -3,7 +3,7 @@ module Propellor.PrivData.Paths where
import System.FilePath
privDataDir :: FilePath
-privDataDir = "privdata.joey"
+privDataDir = "privdata"
privDataFile :: FilePath
privDataFile = privDataDir </> "privdata.gpg"