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/Propellor_without_superuser_privileges.mdwn3
-rw-r--r--doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment26
-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.2.0.mdwn9
-rw-r--r--doc/news/version_1.2.1.mdwn6
-rw-r--r--doc/news/version_1.2.2.mdwn4
-rw-r--r--doc/news/version_1.3.0.mdwn17
-rw-r--r--doc/news/version_1.3.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.mdwn109
-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.gpg1105
-rw-r--r--src/Propellor/PrivData/Paths.hs2
53 files changed, 677 insertions, 1131 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/Propellor_without_superuser_privileges.mdwn b/doc/forum/Propellor_without_superuser_privileges.mdwn
new file mode 100644
index 00000000..d7288a72
--- /dev/null
+++ b/doc/forum/Propellor_without_superuser_privileges.mdwn
@@ -0,0 +1,3 @@
+Joey uses propellor to popular his /home/joey on hosts he controls. I'd like to use it to populate my home directory on hosts where I don't have root. If someone gives me a shell account on a Debian box, it would be great to just run `propellor --spin` to have apply properties such as having certain stuff downloaded and compiled in `~/local/bin`, putting cronjobs in place, and checking stuff out with `myrepos`.
+
+Does propellor assume root access at a deep enough level that writing properties to do this stuff would be impractical?
diff --git a/doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment b/doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment
new file mode 100644
index 00000000..1a38ef94
--- /dev/null
+++ b/doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment
@@ -0,0 +1,26 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-12-26T19:26:00Z"
+ content="""
+I think that the root assumptions are in basically 3 places:
+
+* Many Properties assume they're run as root, and will fail if they're not.
+ Probably not a problem in practice for most of them. It might be nice
+ to make a few, such as `User.hasSomePassword` work when run as a normal
+ user.
+
+* Propellor's self-deployment involves running apt-get to instal ghc,
+ etc. This could be modified to check if it's not root and do a local
+ user of ghc if necessary.
+
+* `localdir = "/usr/local" and this is used in various places by eg,
+ `--spin`. It is, however, entirely possible to run "./propellor" in
+ some other directory, which causes it to run in that directory
+ and ensure the properties of localhost. `--spin` could certianly be
+ taught to run in a user mode where it uses "~/.propellor/" instead of
+ `localdir`.
+
+I think that's all! I don't plan to try to add this feature myself, but
+will be happy to support anyone who wants to work on it.
+"""]]
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.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/news/version_1.2.2.mdwn b/doc/news/version_1.2.2.mdwn
new file mode 100644
index 00000000..c10940fd
--- /dev/null
+++ b/doc/news/version_1.2.2.mdwn
@@ -0,0 +1,4 @@
+propellor 1.2.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Revert ensureProperty warning message, too many false positives in places
+ where Info is correctly propigated. Better approach needed."""]] \ No newline at end of file
diff --git a/doc/news/version_1.3.0.mdwn b/doc/news/version_1.3.0.mdwn
new file mode 100644
index 00000000..87abb2f7
--- /dev/null
+++ b/doc/news/version_1.3.0.mdwn
@@ -0,0 +1,17 @@
+propellor 1.3.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * --spin checks if the DNS matches any configured IP address property
+ of the host, and if not, sshes to the host by IP address.
+ * Detect #774376 and refuse to use docker if the system is so broken
+ that docker exec doesn't enter a chroot.
+ * Update intermediary propellor in --spin --via
+ * Added support for DNSSEC.
+ * Ssh.hostKey and Ssh.hostKeys no longer install public keys from
+ the privdata. Instead, the public keys are included in the
+ configuration. (API change)
+ * Ssh.hostKeys now removes any host keys of types that the host is not
+ configured to have.
+ * sshPubKey is renamed to Ssh.pubKey, and has an added SshKeyType
+ parameter. (API change)
+ * CloudAtCost.deCruft no longer forces randomHostKeys.
+ * Fix build with process 1.2.1.0."""]] \ No newline at end of file
diff --git a/doc/news/version_1.3.1.mdwn b/doc/news/version_1.3.1.mdwn
new file mode 100644
index 00000000..74a39ac4
--- /dev/null
+++ b/doc/news/version_1.3.1.mdwn
@@ -0,0 +1,6 @@
+propellor 1.3.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Fix bug that prevented deploying ssh host keys when the file for the
+ key didn't already exist.
+ * DNS records for hosts with known ssh public keys now automatically
+ include SSHFP records."""]] \ 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..b08e326f 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,91 @@ 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.
+----
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 f2e3363c..00000000
--- a/privdata.joey/privdata.gpg
+++ /dev/null
@@ -1,1105 +0,0 @@
------BEGIN PGP MESSAGE-----
-Version: GnuPG v1
-
-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
-=SygN
------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"