summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
l---------config.hs2
-rwxr-xr-xdebian/rules2
-rw-r--r--doc/documentation.mdwn5
-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/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__.mdwn177
-rw-r--r--doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_1_8959a79735aa3fa13ee37e57eb5a92e1._comment14
-rw-r--r--doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_2_f07c33b4a14cdc0b78695de49875c9b5._comment52
-rw-r--r--doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_3_06c63446531f56e4c93f64f6bcfba2b1._comment25
-rw-r--r--doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_4_f52f30380b4fe58292fcf0ef368efbb1._comment44
-rw-r--r--doc/forum/passing_host_address_dynamically_to_propellor.mdwn2
-rw-r--r--doc/forum/passing_host_address_dynamically_to_propellor/comment_1_1c5d5b59f2325a2f4e06d09a9900007f._comment25
-rw-r--r--doc/forum/passing_host_address_dynamically_to_propellor/comment_2_b9041877dfc6e6bfb63a014492a2d1d1._comment18
-rw-r--r--doc/forum/passing_host_address_dynamically_to_propellor/comment_3_49d6408ee7618ccb88a537e519f95b27._comment11
-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/forum/running_propellor_as_a_library.mdwn4
-rw-r--r--doc/forum/running_propellor_as_a_library/comment_1_a7b8279508cd68e8cfbba238178a7643._comment49
-rw-r--r--doc/forum/running_propellor_as_a_library/comment_2_1174504655ffaf7ebc507e915cc26c84._comment7
-rw-r--r--doc/forum/running_propellor_as_a_library/comment_3_3e3961587228eb030ff8f704c71b00a5._comment8
-rw-r--r--doc/forum/trying_to_--spin_to_a_sid+experimental_machine.mdwn290
-rw-r--r--doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_1_df7ac45d7e576e8d73a8665521dbd6e0._comment29
-rw-r--r--doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_2_8600d257d92f786f2fcf0d4934f727d5._comment17
-rw-r--r--doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_3_f1ca62944fe0303db6f1dc0916e8c967._comment13
-rw-r--r--doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_4_d0d946df7455d079af9bc331da6fac55._comment16
-rw-r--r--doc/haskell_newbie.mdwn3
-rw-r--r--doc/news/propellor_demo.mdwn8
-rw-r--r--doc/news/version_1.3.0.mdwn17
-rw-r--r--doc/news/version_1.3.1.mdwn6
-rw-r--r--doc/news/version_1.3.2.mdwn5
-rw-r--r--doc/news/version_2.3.0.mdwn13
-rw-r--r--doc/news/version_2.4.0.mdwn13
-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/Bug_in_Property.Ssh.authorizedKey.mdwn8
-rw-r--r--doc/todo/HostingProvider_for_AWS.mdwn1
-rw-r--r--doc/todo/HostingProvider_for_AWS/comment_1_9db50a3f4fef8e10261e3e29dbd90e73._comment22
-rw-r--r--doc/todo/Manage_DNS_with_Route53.mdwn1
-rw-r--r--doc/todo/Manage_DNS_with_Route53/comment_1_dfa93678644b72781afda4fdc9d0da31._comment21
-rw-r--r--doc/todo/Manage_DNS_with_Route53/comment_2_a6c1ace47d5387d0b1559266ca124525._comment8
-rw-r--r--doc/todo/Push_2.4.0_to_Hackage.mdwn4
-rw-r--r--doc/todo/Wishlist:_User.hasLoginShell.mdwn9
-rw-r--r--doc/todo/Wishlist:_User.hasLoginShell/comment_1_c02e8783b91c3c0326bf1b317be4694f._comment59
-rw-r--r--doc/todo/bytes_in_privData__63__.mdwn17
-rw-r--r--doc/todo/bytes_in_privData__63__/comment_1_42c107179b091f74ef55aff1fc240c5e._comment19
-rw-r--r--doc/todo/bytes_in_privData__63__/comment_2_60f577b476adc6ee1e4f18e11843df90._comment7
-rw-r--r--doc/todo/bytes_in_privData__63__/comment_3_55f34128de77b7947d32fac71071e033._comment7
-rw-r--r--doc/todo/bytes_in_privData__63__/comment_4_f34a8f82c7bce7224e4edc59410c741f._comment19
-rw-r--r--doc/todo/bytes_in_privData__63__/comment_5_f4db6ffad054feb7eb299708fcd7d05c._comment15
-rw-r--r--doc/todo/bytes_in_privData__63__/comment_6_545e1c26a042b9f8347496a1bfb61548._comment48
-rw-r--r--doc/todo/docker_todo_list.mdwn2
-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/issue_after_upgrading_shared_library.mdwn25
-rw-r--r--doc/todo/issue_after_upgrading_shared_library/comment_1_8d9144d57871cb5d234710d1ab1b7183._comment20
-rw-r--r--doc/todo/issue_after_upgrading_shared_library/comment_2_01a3d5e006158302e12862cacee3327e._comment7
-rw-r--r--doc/todo/issue_after_upgrading_shared_library/comment_2_6025ec35330fbac220f2888e60be1e78._comment17
-rw-r--r--doc/todo/lxc_containers_support.mdwn1
-rw-r--r--doc/todo/missing_dependencies.mdwn39
-rw-r--r--doc/todo/missing_dependencies/comment_1_826a75052e87c04489aa07c3d322a54f._comment15
-rw-r--r--doc/todo/port_info_for_properties_for_firewall.mdwn24
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage.mdwn4
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage/comment_1_00a865bf7977c0e49f54a365f4b60ce8._comment27
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage/comment_2_29cc276929020e68eae8ae04110a3f5f._comment17
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage/comment_3_efbe0ef77be957c37e745ec64452ae99._comment10
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage/comment_4_6ebf2e30596ddf6eba91717576837019._comment8
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage/comment_5_4a4e94c637e0380adc1a43ec3d0633e1._comment8
-rw-r--r--doc/todo/publish_propellor_as_library_to_hackage/comment_6_19470170c3ef461f446b0af1d8501640._comment8
-rw-r--r--doc/todo/ssh__95__user_+_sudo/comment_4_7fc635a8d6e4c903eaefa7383d2c37ac._comment8
-rw-r--r--doc/todo/type_level_port_conflict_detection.mdwn5
-rw-r--r--doc/writing_properties.mdwn82
-rw-r--r--privdata.joey/keyring.gpgbin113014 -> 0 bytes
-rw-r--r--privdata.joey/privdata.gpg1427
-rw-r--r--src/Propellor/PrivData/Paths.hs2
106 files changed, 2054 insertions, 1460 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 c88cc004..a71212db 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/documentation.mdwn b/doc/documentation.mdwn
index 340eb09f..99f61c04 100644
--- a/doc/documentation.mdwn
+++ b/doc/documentation.mdwn
@@ -1,14 +1,15 @@
The [API documentation](http://hackage.haskell.org/package/propellor) of
-Propellor's modules is the most important docuemntation of propellor.
+Propellor's modules is the most important documentation of propellor.
Other documentation:
* [[man page|usage]]
* [[Haskell Newbie]]
+* [[Writing Properties]]
* [[Centralized Git Repository]]
* [[Components]]
* [[Contributing]]
* [[Interface Stability]]
-* [[Coding Stye]]
+* [[Coding Style]]
* [[Security]]
* [[Debugging]]
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/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__.mdwn b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__.mdwn
new file mode 100644
index 00000000..0a50fc91
--- /dev/null
+++ b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__.mdwn
@@ -0,0 +1,177 @@
+Having taken the inital hurdle of getting propellor running
+(cf. my last post in this forum), I am beginning to like propellor
+quite a lot. - This comes not too much as a surprise, as I am
+a Haskeller really. - I would love to use it for all my configuration
+needs, and to that end ditch ansible.
+
+Propellor's biggest show stopper for me is this (maybe I am misunderstanding
+propellor?):
+
+I can run
+
+```
+ propellor --spin myhost
+```
+
+from the command line, and all the tasks/properties that I have
+defined myhost to have beforehand will be executed/realized/configured.
+
+Say eg. I haved defined (sorry for the bad formatting,
+seems I have to do it line by line to get the markdown look nice)
+
+```
+myhost :: Host
+```
+
+```
+myhost = host "myhost"
+ & os (System (Debian Testing) "amd64")
+ & emacs
+ & apt
+```
+
+```
+emacs :: Property HasInfo
+```
+
+```
+emacs = propertyList "install & configure emacs" $ props
+ & Apt.installed ["emacs"
+ , "auto-complete-el"]
+```
+
+```
+ apt :: Property HasInfo
+```
+
+```
+apt = propertyList "apt update + upgrade" $ props
+ & Apt.update
+ & Apt.upgrade
+```
+
+
+Then running
+
+```
+ propellor --spin myhost
+```
+
+will make sure, that emacs is installed, and all my
+packages on myhost are up to date.
+
+It does so every time I run propellor, but normally I install
+emacs only once (and I know it's installed), whereas
+the apt update+upgrade combo I would want to run every other day.
+
+So what I would like is this: have just a minimal config for
+myhost, like this:
+
+```
+myhost :: Host
+```
+
+```
+myhost = host "myhost"
+ & os (System (Debian Testing) "amd64")
+```
+
+and then run a task (require a property ?) on myhost, somehow
+from the command line, like this
+
+```
+ propellor --spin myhost --task apt
+```
+
+Many other properties / installation steps I could run in this
+manner, like installing emacs initially
+
+```
+ propellor --spin myhost --task emacs
+```
+
+In ansible I can do this with playbooks:
+
+```
+ ansible-playbook -l myhost apt.yml
+```
+
+with some preconfigured playbook apt.yml that does just
+the apt update + upgrade task and nothing else. But I would
+have other tasks in other playbooks of course: I can install & configure
+emacs on myhost
+
+```
+ ansible-playbook -l myhost emacs.yml
+```
+
+etc.
+
+Related to that (but maybe not strictly the same question):
+
+I wouldn't mind writing my own haskell script that does
+the command line parsing (with optparse applicative eg):
+I could have options for
+
+```
+ --host (myhost/...)
+```
+
+and
+
+```
+ --task (emacs/apt/...)
+```
+
+and then just call into propellor. Unfortunately propellor's
+defaultMain does more than I want: gets the command line
+from processCmdLine.
+
+So I tried to create my own otherMain (similar to defaultMain,
+but would let me do my own command line parsing):
+
+```
+ otherMain :: [Host] -> CmdLine -> IO ()
+```
+
+but then at some point just gave up: for one thing: things
+were getting complicated, because of all the indirection:
+the propellor command line tool recompiles itself (?),
+does all this git stuff etc.
+
+And then: maybe I am approaching things in the wrong direction:
+maybe it's just not meant to be used that way
+(but ansible works fine for me in this regard)?
+
+And I thought: I don't really want to start a major programming
+task just to get this thing working, the way that seems
+reasonable to me. Or maybe it's possible already, and I just
+don't know how to use it? (So I am stuck with ansible for the time
+being).
+
+Still more or less related:
+
+Say this otherMain function existed, that allowed me to
+to do my own command line parsing and just
+call propellor on some host with the one or the other task,
+I am not 100% what's the right
+way to ensure/require/execute such a task on a host:
+
+above I am just using
+
+```
+ host & property
+```
+
+(from PropAccum), but maybe ensureProperty is better suited
+for that?
+
+Also for the wish list: some CONFIG_FILE env variable that
+would allow me to keep my config.hs somewhere other than
+in ~/.propellor/config.hs
+
+
+Anyway, thanks so far
+I would certainly want to switch to propellor completely.
+
+ Andreas
diff --git a/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_1_8959a79735aa3fa13ee37e57eb5a92e1._comment b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_1_8959a79735aa3fa13ee37e57eb5a92e1._comment
new file mode 100644
index 00000000..273dc758
--- /dev/null
+++ b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_1_8959a79735aa3fa13ee37e57eb5a92e1._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-14T18:48:23Z"
+ content="""
+By composing these things at the command-line, you're using the
+command-line, rather than haskell, for describing your system. I don't
+think that's a win.
+
+As far as properties that you don't want to have run every time, see
+`Propellor.Property.Scheduled.period`. For example:
+
+ & Apt.update `period` Daily
+"""]]
diff --git a/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_2_f07c33b4a14cdc0b78695de49875c9b5._comment b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_2_f07c33b4a14cdc0b78695de49875c9b5._comment
new file mode 100644
index 00000000..3eca3457
--- /dev/null
+++ b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_2_f07c33b4a14cdc0b78695de49875c9b5._comment
@@ -0,0 +1,52 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm-czsfuWENKQ0GI8l0gnGTeF1JEli1mA0"
+ nickname="Andreas"
+ subject="comment 2"
+ date="2015-04-14T19:24:46Z"
+ content="""
+using the command line: well yes, that's right.
+Still: I can configure a lot of details in haskell (ansible playbooks):
+
+my emacs task eg. is not only ensuring that emacs is installed
+(as in the example above), but I also set some links to my
+elisp config files, ensure that cask installed etc.
+
+another task for me is installing X windows:
+again lots of details: not only the xorg packages,
+but some links to .xsession files, window manager config
+files etc.
+
+and yes: I am happy, that I can spell out the details
+of these tasks in propellor/haskell.
+
+I just don't see the point of ensuring them again and again
+with every spin of propellor, and I would want
+to be able to run just this one task on the command line.
+
+
+concerning
+```
+ Apt.update `period` Daily
+```
+thanks, will have a look.
+but I guess this is cron job (will see),
+in general I think I will want to stick to my habit, that I want
+to see what's going on (what is upgraded), thus prefer
+to not run any cron jobs for apt upgrades
+
+My overall message / concern is: I don't want to completly change my
+habits, just because I am using propellor
+
+I had the habit of installing my computers task by task
+
+I had the habit of logging in to one of my systems, and
+doing apt-get update && apt-get upgrade
+
+I want my config tool to help me achieve things in my
+way that I am used to.
+
+
+
+
+
+"""]]
diff --git a/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_3_06c63446531f56e4c93f64f6bcfba2b1._comment b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_3_06c63446531f56e4c93f64f6bcfba2b1._comment
new file mode 100644
index 00000000..144915df
--- /dev/null
+++ b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_3_06c63446531f56e4c93f64f6bcfba2b1._comment
@@ -0,0 +1,25 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2015-04-14T19:42:22Z"
+ content="""
+[period](http://hackage.haskell.org/package/propellor-2.2.1/docs/Propellor-Property-Scheduled.html)
+is not a cron job, it just modifies the Property to only do anything
+every so often.
+
+It's also possible to modify a Property so it only runs once.
+[flagFile](http://hackage.haskell.org/package/propellor-2.2.1/docs/Propellor-Property.html#v:flagFile)
+can be used to do that.
+
+But there are good reasons for propellor to default to checking all
+Properties of a system each time:
+
+* It means that most Properties are idempotent, which has many good
+ features, like being able to recover from a crash.
+* If a system no longer has a configured Property, to fix it back to having
+ the property it's supposed to have.
+* Or, if it can't be fixed, to tell you with an error message in red.
+* It keeps propellor mostly stateless; rather than having to record state
+ about how it thinks a system is, which could diverge from reality,
+ it just looks at how it actually is.
+"""]]
diff --git a/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_4_f52f30380b4fe58292fcf0ef368efbb1._comment b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_4_f52f30380b4fe58292fcf0ef368efbb1._comment
new file mode 100644
index 00000000..ecd20630
--- /dev/null
+++ b/doc/forum/my_experience_with_propellor:_how_to_run_a_single_task_on_a_host__63__/comment_4_f52f30380b4fe58292fcf0ef368efbb1._comment
@@ -0,0 +1,44 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm-czsfuWENKQ0GI8l0gnGTeF1JEli1mA0"
+ nickname="Andreas"
+ subject="comment 4"
+ date="2015-04-15T10:15:17Z"
+ content="""
+Well thanks a lot, and yes I am learning: propellor has a lot
+of powerful features under the hood already.
+
+I still remain sceptical for the time being:
+
+Propellor's overall approach seems: one spin of propellor does ensure
+that a complete systems is properly installed (and then one can
+declare exceptions: don't check this every time...). I can even see
+how this is useful: if I where a sys admin with a huge farm of
+systems, I wouldn't want to deal with half installed systems, but just
+have propellor do a complete job.
+
+As far as I am only concerned with a few personal computers of mine, I
+prefer to stick to my task by task approach, though, and for tasks
+that come up reapeatedly (like keeping my apt cache + installed
+packages up to date) that seems reasonable to me as well. - having
+only a minimal required configuration for a host, and then building
+upon that (I think/hope, you got the idea by now). The fact, that
+this model is nicely supported by ansible, seems to suggest at least,
+that this kind of reasoning/approach is not completely flawed.
+
+What is not 100% clear to me: if propellor could be bent to support my
+kind of workflow: I would think that it's possible? (even though I
+might not have the time to bend it that way myself). Or are there any
+fundamental issues with it?
+
+What I am suggesting is: that propellor be at my disposal,
+more as a library, and would not also impose a certain
+command line interface / workflow on me.
+
+Anyway, you would certainly win me as a user (don't know
+how much that counts, and cannot speak for other people's
+needs).
+
+Thanks anyway.
+ Andreas
+
+"""]]
diff --git a/doc/forum/passing_host_address_dynamically_to_propellor.mdwn b/doc/forum/passing_host_address_dynamically_to_propellor.mdwn
new file mode 100644
index 00000000..1d6bc0be
--- /dev/null
+++ b/doc/forum/passing_host_address_dynamically_to_propellor.mdwn
@@ -0,0 +1,2 @@
+I would like to be able to pass the address of a host dynamically to propellor, e.g. to do something like `./propellor 1.2.3.4` so that I can apply some predefined set of properties.
+I tried to implement, it compiles just fine, but does fail to run properly on the remote (or even local) host because `defaultMain` does some transformation of command-line and of course the host name/address does not exist statically in the git repo that's built and run on the remote host. Would there be another way to do what I want?
diff --git a/doc/forum/passing_host_address_dynamically_to_propellor/comment_1_1c5d5b59f2325a2f4e06d09a9900007f._comment b/doc/forum/passing_host_address_dynamically_to_propellor/comment_1_1c5d5b59f2325a2f4e06d09a9900007f._comment
new file mode 100644
index 00000000..57b2a63b
--- /dev/null
+++ b/doc/forum/passing_host_address_dynamically_to_propellor/comment_1_1c5d5b59f2325a2f4e06d09a9900007f._comment
@@ -0,0 +1,25 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-05-29T14:05:10Z"
+ content="""
+What's the use case here?
+
+I think maybe you're trying to deploy basically the same set of properties
+to multiple hosts. And perhaps don't want to have the list of hosts in the
+config.hs file. If that's the goal, it seems you could accomplish it by
+writing a function like:
+
+ stdHost :: IPAddr -> Host
+
+Or more generally,
+
+ stdHost :: Property HasInfo -> Host
+
+And then you can map over the set of IP addresses to generate the the
+[Host] list for propellor. Or could even read a data file (that would need
+to be checked into the git repo) and use it to constuct the [Host] list at
+runtime.
+
+But maybe I misunderstood the use case..
+"""]]
diff --git a/doc/forum/passing_host_address_dynamically_to_propellor/comment_2_b9041877dfc6e6bfb63a014492a2d1d1._comment b/doc/forum/passing_host_address_dynamically_to_propellor/comment_2_b9041877dfc6e6bfb63a014492a2d1d1._comment
new file mode 100644
index 00000000..0f59b424
--- /dev/null
+++ b/doc/forum/passing_host_address_dynamically_to_propellor/comment_2_b9041877dfc6e6bfb63a014492a2d1d1._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="arnaud.oqube@c9b8c7ea33f1dea0b7a5485b86825c5bfa9efbf7"
+ nickname="arnaud.oqube"
+ subject="comment 2"
+ date="2015-05-29T15:09:24Z"
+ content="""
+We create/destroy dynamically hosts which have different purpose: CI, Dev boxes, Testing... IP of these hosts is unknown and assign by our provider (Digital Ocean) so what I would like to do is something like:
+
+```
+$ create-host
+...
+IP: 1.2.3.4
+$ ./propellor 1.2.3.4
+```
+
+But indeed the idea of having a local `hosts` file makes sense, or even a `hosts/` directory to which I output files containing IPs.
+
+"""]]
diff --git a/doc/forum/passing_host_address_dynamically_to_propellor/comment_3_49d6408ee7618ccb88a537e519f95b27._comment b/doc/forum/passing_host_address_dynamically_to_propellor/comment_3_49d6408ee7618ccb88a537e519f95b27._comment
new file mode 100644
index 00000000..37962eff
--- /dev/null
+++ b/doc/forum/passing_host_address_dynamically_to_propellor/comment_3_49d6408ee7618ccb88a537e519f95b27._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2015-05-30T14:50:14Z"
+ content="""
+Or teach propellor --spin how to create Digital Ocean, AWS, etc VMs, as
+described in [[todo/HostingProvider_for_AWS]].
+
+I guess that even if it created the hosts, it would make sense to have a
+static host list with their IPs.
+"""]]
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/forum/running_propellor_as_a_library.mdwn b/doc/forum/running_propellor_as_a_library.mdwn
new file mode 100644
index 00000000..a6945308
--- /dev/null
+++ b/doc/forum/running_propellor_as_a_library.mdwn
@@ -0,0 +1,4 @@
+I would like to define my propellor configuration using propellor as a library dependency, which removes the need to fork source repo, merge...
+I encounter an issue when trying to use propellor in that way: Everything under `Utility/` is not exported by the propellor, so cannot be used from my own properties. This is annoying because there are interesting things to build properties, like running processes...
+
+Would you consider exposing those modules, maybe through some other module like `Propellor.Utility` ?
diff --git a/doc/forum/running_propellor_as_a_library/comment_1_a7b8279508cd68e8cfbba238178a7643._comment b/doc/forum/running_propellor_as_a_library/comment_1_a7b8279508cd68e8cfbba238178a7643._comment
new file mode 100644
index 00000000..10188525
--- /dev/null
+++ b/doc/forum/running_propellor_as_a_library/comment_1_a7b8279508cd68e8cfbba238178a7643._comment
@@ -0,0 +1,49 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-05-27T15:24:07Z"
+ content="""
+The Utility.* modules are shared amoung several of my projects (git-annex,
+propeller, github-backup, ..), but I'm not really happy enough with them to
+make them a proper haskell library.
+
+For one thing, there's no unifying principle; it's just whatever bits of
+code I happened to write that were refactorable out of the main program. I
+don't want to end up with another MissingH like tarball library here.
+
+And for another thing, I don't think I want to commit to api stability, or
+even api versioning for all of that stuff.
+
+Some parts of it, I'm somewhat happier with, and hope to eventually break
+out into proper haskell libraries. For example, Utility.Scheduled is pretty
+good (and mostly re-exported from Propellor.Property.Scheduled anyway).
+
+OTOH, Utility.Process .. not happy with that at all from a design POV.
+I'd recommend you just use System.Process, or
+[Data.Streaming.Process](http://hackage.haskell.org/package/streaming-commons-0.1.12/docs/Data-Streaming-Process.html).
+Although there is the problem that `PROPELLOR_DEBUG` relies on
+Utility.Process adding calls to debugging functions, so you'd need to do that
+by hand.
+
+Maybe what makes sense is for some part of propellor to re-export qualified
+subsets of `Utility.*`, on a case-by-case basis as users find need for them.
+I counted the Utility imports inside Propellor.Property, they are:
+
+ 17 import Utility.SafeCommand
+ 8 import Utility.FileMode
+ 2 import Utility.Path
+ 2 import Utility.Env
+ 2 import Utility.DataUnits
+ 1 import Utility.ThreadScheduler
+ 1 import Utility.Scheduled
+ 1 import Utility.FileSystemEncoding
+ 1 import Utility.Applicative
+
+So, I'm inclined to have Propellor.Property.Cmd re-export Utility.SafeCommand,
+and leave it at that for now. It makes sense that propellor export a primitive
+that runs a command to a Bool, does any requested debug output, for use by the
+many Properties that involve running commands.
+
+(If you want to break out some part of Utility into a separate library
+and maintain it, I'd be ok with that too.)
+"""]]
diff --git a/doc/forum/running_propellor_as_a_library/comment_2_1174504655ffaf7ebc507e915cc26c84._comment b/doc/forum/running_propellor_as_a_library/comment_2_1174504655ffaf7ebc507e915cc26c84._comment
new file mode 100644
index 00000000..dd019d9d
--- /dev/null
+++ b/doc/forum/running_propellor_as_a_library/comment_2_1174504655ffaf7ebc507e915cc26c84._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2015-05-27T16:40:29Z"
+ content="""
+Ok, I've made Propellor.Property.Cmd export most of Utility.SafeCommand.
+"""]]
diff --git a/doc/forum/running_propellor_as_a_library/comment_3_3e3961587228eb030ff8f704c71b00a5._comment b/doc/forum/running_propellor_as_a_library/comment_3_3e3961587228eb030ff8f704c71b00a5._comment
new file mode 100644
index 00000000..17f04c3b
--- /dev/null
+++ b/doc/forum/running_propellor_as_a_library/comment_3_3e3961587228eb030ff8f704c71b00a5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="arnaud.oqube@c9b8c7ea33f1dea0b7a5485b86825c5bfa9efbf7"
+ nickname="arnaud.oqube"
+ subject="Thanks"
+ date="2015-05-27T19:05:19Z"
+ content="""
+... a lot for your reactivity! Actually that's fine because we use mostly `boolSystem` from `Utility.SafeCommand`. We also use `transcript` to retrieve output of a process. So you say it is better to use directly `System.Process` ?
+"""]]
diff --git a/doc/forum/trying_to_--spin_to_a_sid+experimental_machine.mdwn b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine.mdwn
new file mode 100644
index 00000000..1fde595c
--- /dev/null
+++ b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine.mdwn
@@ -0,0 +1,290 @@
+I'm trying to get propellor running, and for now, I'd prefer
+to not use a central git repo, according to what I have read
+
+```
+ propellor --spin host
+```
+
+should do just that: not use git.
+
+So I have cabal installed propellor locally, and
+in addition cloned
+
+```
+ git clone git://propellor.branchable.com/ .propellor
+```
+
+in my $HOME
+
+My local machine (from where I run propellor) runs debian testing, the
+machine I want to spin to: softland, debian unstable+experimental,
+ie. unstable in general + all things ghc from experimental, to get ghc
+7.8.4 (but not any more than that from experimental).
+
+was not sure, what the right propellor config would be in that case:
+
+```
+& os (System (Debian Experimental) "amd64")
+```
+which I have used, or
+
+```
+ & os (System (Debian Unstable) "amd64")
+```
+because in general I want Unstable
+
+
+First thing I notice, when running
+
+
+```
+$ propellor --spin softland
+```
+
+propellor nevertheless tries to git push (but fails, obviously,
+somewhere down in propellors output):
+
+```
+...
+Building propellor-2.2.1...
+Preprocessing library propellor-2.2.1...
+In-place registering propellor-2.2.1...
+Preprocessing executable 'propellor' for propellor-2.2.1...
+Preprocessing executable 'propellor-config' for propellor-2.2.1...
+Propellor build ... done
+[master 8ca2715] propellor spin
+Git commit ... done
+Counting objects: 10, done.
+Delta compression using up to 2 threads.
+Compressing objects: 100% (8/8), done.
+Writing objects: 100% (10/10), 913 bytes | 0 bytes/s, done.
+Total 10 (delta 6), reused 0 (delta 0)
+remote: you are not allowed to change config.hs
+To git://propellor.branchable.com/
+ ! [remote rejected] master -> master (pre-receive hook declined)
+error: failed to push some refs to 'git://propellor.branchable.com/'
+Push to central git repository ... failed
+Stop listening request sent.
+Hit http://ftp.uk.debian.org sid InRelease
+Hit http://ftp.uk.debian.org experimental InRelease
+Get:1 http://ftp.uk.debian.org sid/main amd64 Packages/DiffIndex [7,876 B]
+...
+```
+
+Note in particular the lines:
+
+```
+ To git://propellor.branchable.com/
+ ! [remote rejected] master -> master (pre-receive hook declined)
+ error: failed to push some refs to 'git://propellor.branchable.com/'
+ Push to central git repository ... failed
+```
+
+Shouldn't propellor be completely quiet about git /
+not try to push at all?
+
+OK, never mind, let's see what's next: some long
+output, propellor finally fails, I assume it's because
+of my sid+experimental configuration?
+
+
+```
+Stop listening request sent.
+Hit http://ftp.uk.debian.org sid InRelease
+Hit http://ftp.uk.debian.org experimental InRelease
+Get:1 http://ftp.uk.debian.org sid/main amd64 Packages/DiffIndex [7,876 B]
+Get:2 http://ftp.uk.debian.org sid/contrib amd64 Packages/DiffIndex [7,819 B]
+Get:3 http://ftp.uk.debian.org sid/non-free amd64 Packages/DiffIndex [7,819 B]
+Get:4 http://ftp.uk.debian.org sid/contrib Translation-en/DiffIndex [7,819 B]
+Get:5 http://ftp.uk.debian.org sid/main Translation-en/DiffIndex [7,876 B]
+Get:6 http://ftp.uk.debian.org sid/non-free Translation-en/DiffIndex [7,819 B]
+Get:7 http://ftp.uk.debian.org sid/main Sources [7,633 kB]
+Get:8 http://ftp.uk.debian.org sid/contrib Sources [57.1 kB]
+Get:9 http://ftp.uk.debian.org sid/non-free Sources [105 kB]
+Get:10 http://ftp.uk.debian.org experimental/main Sources/DiffIndex [7,819 B]
+Get:11 http://ftp.uk.debian.org experimental/contrib Sources/DiffIndex [7,819 B]
+Get:12 http://ftp.uk.debian.org experimental/non-free Sources/DiffIndex [7,819 B]
+Get:13 http://ftp.uk.debian.org experimental/main amd64 Packages/DiffIndex [7,819 B]
+Get:14 http://ftp.uk.debian.org experimental/contrib amd64 Packages/DiffIndex [7,819 B]
+Get:15 http://ftp.uk.debian.org experimental/contrib Translation-en/DiffIndex [7,819 B]
+Get:16 http://ftp.uk.debian.org experimental/main Translation-en/DiffIndex [7,819 B]
+Fetched 7,897 kB in 6s (1,169 kB/s)
+Reading package lists...
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping gnupg, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping ghc, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping cabal-install, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping libghc-async-dev, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+The following packages have unmet dependencies:
+ libghc-missingh-dev : Depends: libghc-hunit-dev-1.2.5.2-6e02e
+ Depends: libghc-array-dev-0.4.0.1-3b784
+ Depends: libghc-base-dev-4.6.0.1-8aa5d
+ Depends: libghc-containers-dev-0.5.0.0-ab1da
+ Depends: libghc-directory-dev-1.2.0.1-91a78
+ Depends: libghc-filepath-dev-1.3.0.1-b12cb
+ Depends: libghc-hslogger-dev-1.2.1-028cc
+ Depends: libghc-mtl-dev-2.1.2-94c72
+ Depends: libghc-network-dev-2.4.1.2-040ce
+ Depends: libghc-old-locale-dev-1.0.0.5-6729c
+ Depends: libghc-old-time-dev-1.1.0.1-2f8ea
+ Depends: libghc-parsec-dev-3.1.3-6c6e2
+ Depends: libghc-process-dev-1.1.0.2-76e05
+ Depends: libghc-random-dev-1.0.1.1-43fdc
+ Depends: libghc-regex-compat-dev-0.95.1-121c7
+ Depends: libghc-time-dev-1.4.0.1-10dc4
+ Depends: libghc-unix-dev-2.6.0.1-4f219
+E: Unable to correct problems, you have held broken packages.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+The following packages have unmet dependencies:
+ libghc-hslogger-dev : Depends: libghc-base-dev-4.6.0.1-8aa5d
+ Depends: libghc-containers-dev-0.5.0.0-ab1da
+ Depends: libghc-directory-dev-1.2.0.1-91a78
+ Depends: libghc-mtl-dev-2.1.2-94c72
+ Depends: libghc-network-dev-2.4.1.2-040ce
+ Depends: libghc-old-locale-dev-1.0.0.5-6729c
+ Depends: libghc-process-dev-1.1.0.2-76e05
+ Depends: libghc-time-dev-1.4.0.1-10dc4
+ Depends: libghc-unix-dev-2.6.0.1-4f219
+E: Unable to correct problems, you have held broken packages.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+The following packages have unmet dependencies:
+ libghc-unix-compat-dev : Depends: libghc-base-dev-4.6.0.1-8aa5d
+ Depends: libghc-unix-dev-2.6.0.1-4f219
+E: Unable to correct problems, you have held broken packages.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping libghc-ansi-terminal-dev, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+The following packages have unmet dependencies:
+ libghc-ifelse-dev : Depends: libghc-base-dev-4.6.0.1-8aa5d
+E: Unable to correct problems, you have held broken packages.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping libghc-network-dev, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping libghc-quickcheck2-dev, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Skipping libghc-mtl-dev, it is already installed and upgrade is not set.
+0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Reading package lists...
+Building dependency tree...
+Reading state information...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+The following packages have unmet dependencies:
+ libghc-monadcatchio-transformers-dev : Depends: libghc-base-dev-4.6.0.1-8aa5d
+ Depends: libghc-extensible-exceptions-dev-0.1.1.4-255a3
+ Depends: libghc-monads-tf-dev-0.1.0.2-731f0
+ Depends: libghc-transformers-dev-0.3.0.0-ff2bb
+E: Unable to correct problems, you have held broken packages.
+Downloading the latest package list from hackage.haskell.org
+Skipping download: Local and remote files match.
+Resolving dependencies...
+All the requested packages are already installed:
+Use --reinstall if you want to reinstall anyway.
+Resolving dependencies...
+Configuring propellor-2.2.1...
+Building propellor-2.2.1...
+Preprocessing library propellor-2.2.1...
+In-place registering propellor-2.2.1...
+Preprocessing executable 'propellor' for propellor-2.2.1...
+Preprocessing excaecutable 'propellor-bal: can't find source for configconf in src
+ig' for propellor-2.2.1...
+propellor: user error (ssh ["-o","ControlPath=/home/rx/.ssh/propellor/softland.sock","-o","ControlMaster=auto","-o","ControlPersist=yes","root@softland","sh -c 'if [ ! -d /usr/local/propellor/.git ] ; then (if ! git --version >/dev/null; then apt-get update && apt-get --no-install-recommends --no-upgrade -y install git; fi && echo STATUSNeedGitClone) || echo STATUSNeedPrecompiled ; else cd /usr/local/propellor && if ! test -x ./propellor; then ( apt-get update ; apt-get --no-upgrade --no-install-recommends -y install gnupg ; apt-get --no-upgrade --no-install-recommends -y install ghc ; apt-get --no-upgrade --no-install-recommends -y install cabal-install ; apt-get --no-upgrade --no-install-recommends -y install libghc-async-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-missingh-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-hslogger-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-unix-compat-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-ansi-terminal-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-ifelse-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-network-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-quickcheck2-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-mtl-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-monadcatchio-transformers-dev ; cabal update ; cabal install --only-dependencies ) || true && cabal configure && cabal build && ln -sf dist/build/propellor-config/propellor-config propellor; fi && ./propellor --boot softland ; fi'"] exited 1)
+rx@varenne ~/work/propellor $
+```
+
+I should add, that I have tried to --spin to another
+machine, and ... finally got that working:
+
+
+```
+ , host "laptop"
+ & os (System (Debian Testing) "amd64")
+```
+
+Not sure, if I need more than that, want to keep it to the
+minimum first, anyway:
+
+
+```
+ propellor --spin laptop
+```
+
+this works, yeah - sorry for the noise, above - but still I get
+
+
+```
+Git commit ... done
+To git://propellor.branchable.com/
+ ! [rejected] master -> master (fetch first)
+error: failed to push some refs to 'git://propellor.branchable.com/'
+hint: Updates were rejected because the remote contains work that you do
+hint: not have locally. This is usually caused by another repository pushing
+hint: to the same ref. You may want to first integrate the remote changes
+hint: (e.g., 'git pull ...') before pushing again.
+hint: See the 'Note about fast-forwards' in 'git push --help' for details.
+Push to central git repository ... failed
+```
+
+Possible to turn off these git push attempts?
+
+
+Thanks,
+ Andreas
diff --git a/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_1_df7ac45d7e576e8d73a8665521dbd6e0._comment b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_1_df7ac45d7e576e8d73a8665521dbd6e0._comment
new file mode 100644
index 00000000..cfe1750a
--- /dev/null
+++ b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_1_df7ac45d7e576e8d73a8665521dbd6e0._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm-czsfuWENKQ0GI8l0gnGTeF1JEli1mA0"
+ nickname="Andreas"
+ subject="finally got it working"
+ date="2015-03-27T05:15:26Z"
+ content="""
+can spin to softland, my sid+experimental host now.
+
+with recent git://propellor.branchable.com/ updates
+and have used:
+
+```
+ & os (System (Debian Experimental) \"amd64\")
+```
+
+so sorry for the noise, still not sure about:
+
+* how to express my installation properly:
+ mostly unstable, ghc stuff from experimental
+
+* how to turn off the git push to branchable attempts
+ when just spinning to one of my mashines:
+ have set now:
+ ```
+ git branch --unset-upstream
+ ```
+ which shortcuts these attempts at least.
+
+"""]]
diff --git a/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_2_8600d257d92f786f2fcf0d4934f727d5._comment b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_2_8600d257d92f786f2fcf0d4934f727d5._comment
new file mode 100644
index 00000000..51c3fc53
--- /dev/null
+++ b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_2_8600d257d92f786f2fcf0d4934f727d5._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2015-03-30T23:22:17Z"
+ content="""
+Pushing to origin is needed when using propellor in the central git
+repository deployment mode. So it makes sense for --spin to try to push.
+If that push fails for some reason, it's not a fatal error, since propellor
+--spin also does peer-to-peer pushes.
+
+I don't think I want to get into trying to determine if a particular origin
+repo url is read-only or read-write. It can be hard to tell with eg
+a https url.
+
+Why don't you just `git remote rename origin upstream`? If the remote
+is not called origin, propellor will ignore it.
+"""]]
diff --git a/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_3_f1ca62944fe0303db6f1dc0916e8c967._comment b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_3_f1ca62944fe0303db6f1dc0916e8c967._comment
new file mode 100644
index 00000000..ed34d6a7
--- /dev/null
+++ b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_3_f1ca62944fe0303db6f1dc0916e8c967._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2015-03-30T23:26:38Z"
+ content="""
+As to a mixed unstable/experimental machine, such a machine has a Property
+of having somepackage installed from experimental. One way to represent
+that is by defining a property:
+
+installedFromExperimental :: [Package] -> Property NoInfo
+installedFromExperimental = Apt.installed' ["-y", "-texperimental"]
+
+"""]]
diff --git a/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_4_d0d946df7455d079af9bc331da6fac55._comment b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_4_d0d946df7455d079af9bc331da6fac55._comment
new file mode 100644
index 00000000..72b21450
--- /dev/null
+++ b/doc/forum/trying_to_--spin_to_a_sid+experimental_machine/comment_4_d0d946df7455d079af9bc331da6fac55._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm-czsfuWENKQ0GI8l0gnGTeF1JEli1mA0"
+ nickname="Andreas"
+ subject="thanks a lot"
+ date="2015-04-06T21:11:46Z"
+ content="""
+thanks for your your commments (both of them),
+and fair enough: have just renamed my origin remote to upstream,
+will try your installedFromExperimental suggestion next.
+
+
+I will have more questions about propellor,
+but aske them in a different thread
+(as they are not really about installation)
+
+"""]]
diff --git a/doc/haskell_newbie.mdwn b/doc/haskell_newbie.mdwn
index 24839b12..ec42629c 100644
--- a/doc/haskell_newbie.mdwn
+++ b/doc/haskell_newbie.mdwn
@@ -114,7 +114,8 @@ That's really all there is to configuring Propellor. Once you
have a `config.hs` ready to try out, you can run `propellor --spin $host`
on one of the hosts configured in it.
-See the [[README]] for a further quick start.
+See the [[README]] for a further quick start and [[Writing Properties]]
+for guidance on extending propellor with your own custom properties.
(If you'd like to learn a little Haskell after all, check out
[Learn You a Haskell for Great Good](http://learnyouahaskell.com/).)
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.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/news/version_1.3.2.mdwn b/doc/news/version_1.3.2.mdwn
new file mode 100644
index 00000000..77902008
--- /dev/null
+++ b/doc/news/version_1.3.2.mdwn
@@ -0,0 +1,5 @@
+propellor 1.3.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * SSHFP records are also generated for CNAMES of hosts.
+ * Merge Utiity modules from git-annex.
+ * Ignore bogus DNS when spinning the local host."""]] \ No newline at end of file
diff --git a/doc/news/version_2.3.0.mdwn b/doc/news/version_2.3.0.mdwn
new file mode 100644
index 00000000..232ab49c
--- /dev/null
+++ b/doc/news/version_2.3.0.mdwn
@@ -0,0 +1,13 @@
+propellor 2.3.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Make propellor resistent to changes to shared libraries, such as libffi,
+ which might render the propellor binary unable to run. This is dealt with
+ by checking the binary both when running propellor on a remote host,
+ and by Cron.runPropellor. If the binary doesn't work, it will be rebuilt.
+ * Note that since a new switch had to be added to allow testing the binary,
+ upgrading to this version will cause a rebuild from scratch of propellor.
+ * Added hasLoginShell and shellEnabled.
+ * debCdn changed to new httpredir.debian.org official replacement for
+ http.debian.net.
+ * API change: Added User and Group newtypes, and Properties that
+ used to use the type UserName = String were changed to use them."""]] \ No newline at end of file
diff --git a/doc/news/version_2.4.0.mdwn b/doc/news/version_2.4.0.mdwn
new file mode 100644
index 00000000..ba66b462
--- /dev/null
+++ b/doc/news/version_2.4.0.mdwn
@@ -0,0 +1,13 @@
+propellor 2.4.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Propellor no longer supports Debian wheezy (oldstable).
+ * Git.bareRepo: Fix bug in calls to userScriptProperty.
+ Thanks, Jelmer Vernooij.
+ * Removed Obnam.latestVersion which was only needed for Debian wheezy
+ backport.
+ * Merged Utility changes from git-annex.
+ * Switched from MonadCatchIO-transformers to the newer transformers and
+ exceptions libraries.
+ * Ensure build deps are installed before building propellor in --spin
+ and cron job, even if propellor was already built before, to deal with
+ upgrades that add new dependencies."""]] \ 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/Bug_in_Property.Ssh.authorizedKey.mdwn b/doc/todo/Bug_in_Property.Ssh.authorizedKey.mdwn
new file mode 100644
index 00000000..7a59fc20
--- /dev/null
+++ b/doc/todo/Bug_in_Property.Ssh.authorizedKey.mdwn
@@ -0,0 +1,8 @@
+If Ssh.authorizedKey in propellor 2.0.0 is used to create .ssh/authorized_keys for
+a user other than root, it will be owned by root:root and won't
+work for the user. Adding a key to an existing authorized_keys
+file doesn't change its ownership and therefore works fine.
+
+-- weinzwang
+
+> Thanks, [[fixed|done]] this and will make a release.
diff --git a/doc/todo/HostingProvider_for_AWS.mdwn b/doc/todo/HostingProvider_for_AWS.mdwn
new file mode 100644
index 00000000..fc381afe
--- /dev/null
+++ b/doc/todo/HostingProvider_for_AWS.mdwn
@@ -0,0 +1 @@
+I'd really love to be able to use propellor to manage my AWS services.
diff --git a/doc/todo/HostingProvider_for_AWS/comment_1_9db50a3f4fef8e10261e3e29dbd90e73._comment b/doc/todo/HostingProvider_for_AWS/comment_1_9db50a3f4fef8e10261e3e29dbd90e73._comment
new file mode 100644
index 00000000..71ded884
--- /dev/null
+++ b/doc/todo/HostingProvider_for_AWS/comment_1_9db50a3f4fef8e10261e3e29dbd90e73._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-05-14T16:19:00Z"
+ content="""
+So there's something here that propellor doesn't yet have a concept of,
+and that's spinning up a VM. Propellor can deploy itself to an existing VM
+pretty well, but getting the VM running isn't something it tries to do.
+
+I imagine that --spin could be extended to support this though.
+Make a Property like `vm AWS`, which tells propellor that the host
+is a VM, and that the VM is hosted on AWS. Then when you run propellor
+--spin, it could set up the VM if it doesn't exist yet.
+
+I don't use AWS currently, so don't have plans to work on this myself,
+although I think it would be a great direction to move in. Happy to help
+with advice, code review, etc.
+
+<http://hackage.haskell.org/package/aws>
+or <http://hackage.haskell.org/package/amazonka>
+are good haskell libraries for working with AWS.
+"""]]
diff --git a/doc/todo/Manage_DNS_with_Route53.mdwn b/doc/todo/Manage_DNS_with_Route53.mdwn
new file mode 100644
index 00000000..b35a37cb
--- /dev/null
+++ b/doc/todo/Manage_DNS_with_Route53.mdwn
@@ -0,0 +1 @@
+I currently use Route53 to manage the DNS for my service. I'd really like to use Propellor to take care of that for me.
diff --git a/doc/todo/Manage_DNS_with_Route53/comment_1_dfa93678644b72781afda4fdc9d0da31._comment b/doc/todo/Manage_DNS_with_Route53/comment_1_dfa93678644b72781afda4fdc9d0da31._comment
new file mode 100644
index 00000000..8836beaa
--- /dev/null
+++ b/doc/todo/Manage_DNS_with_Route53/comment_1_dfa93678644b72781afda4fdc9d0da31._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-05-14T16:18:37Z"
+ content="""
+I think this would be great. Patches accepted.
+
+If I were going to implement this, I'd use
+<http://hackage.haskell.org/package/amazonka-route53>
+to write the propellor Property.
+
+A question is, what host would the Property be attached to?
+One way to do it would be to make the property be called something like
+`route53Controller`. So then you pick a host, or hosts, and give them this
+property for a domain, and those hosts then take care of making the
+necessary API calls to route53. Presumably some API keys will be needed
+on those hosts, which can be provided via the privdata.
+
+I'm happy to offer advice on implementation, but don't plan to code this up
+myself, as I'm happily self-hosting my DNS servers.
+"""]]
diff --git a/doc/todo/Manage_DNS_with_Route53/comment_2_a6c1ace47d5387d0b1559266ca124525._comment b/doc/todo/Manage_DNS_with_Route53/comment_2_a6c1ace47d5387d0b1559266ca124525._comment
new file mode 100644
index 00000000..9b5150bf
--- /dev/null
+++ b/doc/todo/Manage_DNS_with_Route53/comment_2_a6c1ace47d5387d0b1559266ca124525._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~jml"
+ nickname="jml"
+ subject="comment 2"
+ date="2015-05-15T08:53:34Z"
+ content="""
+Glad you think so. I had a very quick poke around and also discovered [aws-ec2](https://hackage.haskell.org/package/aws-ec2) as well as the amazonka package. Any particular reason for preferring amazonka to aws-ec2?
+"""]]
diff --git a/doc/todo/Push_2.4.0_to_Hackage.mdwn b/doc/todo/Push_2.4.0_to_Hackage.mdwn
new file mode 100644
index 00000000..a176f416
--- /dev/null
+++ b/doc/todo/Push_2.4.0_to_Hackage.mdwn
@@ -0,0 +1,4 @@
+https://propellor.branchable.com/news/version_2.4.0/ says that version 2.4.0, but as of today, 2.3.0 is the latest version on Hackage: http://hackage.haskell.org/package/propellor
+
+> Seems the upload must have failed and I didn't notice. re-uploaded;
+> [[done]] --[[Joey]]
diff --git a/doc/todo/Wishlist:_User.hasLoginShell.mdwn b/doc/todo/Wishlist:_User.hasLoginShell.mdwn
new file mode 100644
index 00000000..cf8aa73c
--- /dev/null
+++ b/doc/todo/Wishlist:_User.hasLoginShell.mdwn
@@ -0,0 +1,9 @@
+As far as I can tell there is no easy way to set a user's
+login shell. A Property User.hasLoginShell, which ensures
+that a user has a specified login shell and that said shell
+is in /etc/shells would be really helpful. Sadly, I lack the
+skills to put this together myself :(
+
+-- weinzwang
+
+> patched in and so [[done]] --[[Joey]]
diff --git a/doc/todo/Wishlist:_User.hasLoginShell/comment_1_c02e8783b91c3c0326bf1b317be4694f._comment b/doc/todo/Wishlist:_User.hasLoginShell/comment_1_c02e8783b91c3c0326bf1b317be4694f._comment
new file mode 100644
index 00000000..52043406
--- /dev/null
+++ b/doc/todo/Wishlist:_User.hasLoginShell/comment_1_c02e8783b91c3c0326bf1b317be4694f._comment
@@ -0,0 +1,59 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-19T16:07:24Z"
+ content="""
+Propellor makes it very easy to put together a property like this.
+
+Let's start with a property that combines the two properties you mentioned:
+
+ hasLoginShell :: UserName -> FilePath -> Property
+ hasLoginShell user shell = shellSetTo user shell `requires` shellEnabled shell
+
+The shellEnabled property can be easily written using propellor's file
+manipulation properties.
+
+ -- Need to add an import to the top of the source file.
+ import qualified Propellor.Property.File as File
+
+ shellEnabled :: FilePath -> Property
+ shellEnabled shell = "/etc/shells" `File.containsLine` shell
+
+And then, we want to actually change the user's shell. The `chsh(1)`
+program can do that, so we can simply tell propellor the command line to
+run:
+
+ shellSetTo :: UserName -> FilePath -> Property
+ shellSetTo user shell = cmdProperty "chsh" ["--shell", shell, user]
+
+The only remaining problem with this is that shellSetTo runs chsh every
+time, and propellor will always display that it's made a change each time
+it runs, even when it didn't really do much. Now, there's an easy way to
+avoid that problem, we could just tell propellor that it's a trivial
+property, and then it will run chsh every time and not think it made any
+change:
+
+ shellSetTo :: UserName -> FilePath -> Property
+ shellSetTo user shell = trivial $
+ cmdProperty "chsh" ["--shell", shell, user]
+
+But, it's not much harder to do this right. Let's make the property
+check if the user's shell is already set to the desired value and avoid
+doing anything in that case.
+
+ shellSetTo :: UserName -> FilePath -> Property
+ shellSetTo user shell = check needchangeshell $
+ cmdProperty "chsh" ["--shell", shell, user]
+ where
+ needchangeshell = do
+ currshell <- userShell <$> getUserEntryForName user
+ return (currshell /= shell)
+
+And that will probably all work, although I've not tested it. You might
+want to throw in some uses of `describe` to give the new properties
+more useful descriptions.
+
+I hope this has been helpful as an explanation of how to add properties to
+Propellor, and if you get these properties to work, a patch adding them
+to Propellor.User would be happily merged.
+"""]]
diff --git a/doc/todo/bytes_in_privData__63__.mdwn b/doc/todo/bytes_in_privData__63__.mdwn
new file mode 100644
index 00000000..27297fd5
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__.mdwn
@@ -0,0 +1,17 @@
+It seems like I can't set the content of a PrivFile to arbitrary bytes.
+
+ $ propellor --set 'PrivFile "mysecret.key"' 'mycontext' < ~/mysecret.key
+ find . | grep -v /.git/ | grep -v /tmp/ | grep -v /dist/ | grep -v /doc/ | egrep '\.hs$' | xargs hothasktags | perl -ne 'print; s/Propellor\.Property\.//; print' | sort > tags 2>/dev/null || true
+ cabal build
+ Building propellor-2.2.1...
+ Preprocessing library propellor-2.2.1...
+ In-place registering propellor-2.2.1...
+ Preprocessing executable 'propellor' for propellor-2.2.1...
+ Preprocessing executable 'propellor-config' for propellor-2.2.1...
+ [70 of 70] Compiling Main ( src/config.hs, dist/build/propellor-config/propellor-config-tmp/Main.o )
+ Linking dist/build/propellor-config/propellor-config ...
+ ln -sf dist/build/propellor-config/propellor-config propellor
+
+
+ Enter private data on stdin; ctrl-D when done:
+ propellor: <stdin>: hGetContents: invalid argument (invalid byte sequence)
diff --git a/doc/todo/bytes_in_privData__63__/comment_1_42c107179b091f74ef55aff1fc240c5e._comment b/doc/todo/bytes_in_privData__63__/comment_1_42c107179b091f74ef55aff1fc240c5e._comment
new file mode 100644
index 00000000..5c1508fd
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__/comment_1_42c107179b091f74ef55aff1fc240c5e._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-20T01:04:26Z"
+ content="""
+I imagine that adding `fileEncoding stdin` to setPrivData will fix
+this crash, but I'd expect there are also other problems with encodings
+for privdata that haskell doesn't like. Similar fixes would probably
+be needed in several other places.
+
+Probably cleaner and better to convert
+`PrivData` from a String to a ByteString, and so avoid encodings
+being applied to it. I think this could be done without changing the
+file format; the privdata file uses Read/Show for serialization,
+and happily ByteString uses the same Read/Show format as String does.
+
+So, changing the type and following the compile errors should get you
+there, I think!
+"""]]
diff --git a/doc/todo/bytes_in_privData__63__/comment_2_60f577b476adc6ee1e4f18e11843df90._comment b/doc/todo/bytes_in_privData__63__/comment_2_60f577b476adc6ee1e4f18e11843df90._comment
new file mode 100644
index 00000000..10ff956a
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__/comment_2_60f577b476adc6ee1e4f18e11843df90._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 2"
+ date="2015-04-21T12:59:42Z"
+ content="""
+Would you accept a patch converting PrivData from String to ByteString?
+"""]]
diff --git a/doc/todo/bytes_in_privData__63__/comment_3_55f34128de77b7947d32fac71071e033._comment b/doc/todo/bytes_in_privData__63__/comment_3_55f34128de77b7947d32fac71071e033._comment
new file mode 100644
index 00000000..a1c7f62f
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__/comment_3_55f34128de77b7947d32fac71071e033._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2015-04-21T16:52:06Z"
+ content="""
+Absolutely. Thought that went w/o saying. ;)
+"""]]
diff --git a/doc/todo/bytes_in_privData__63__/comment_4_f34a8f82c7bce7224e4edc59410c741f._comment b/doc/todo/bytes_in_privData__63__/comment_4_f34a8f82c7bce7224e4edc59410c741f._comment
new file mode 100644
index 00000000..bd7a0618
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__/comment_4_f34a8f82c7bce7224e4edc59410c741f._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 4"
+ date="2015-04-23T09:21:07Z"
+ content="""
+I tried to do the conversion, but then it started a kind of chain reaction... (PrivData=ByteString to writeFileProtected to Line=ByteString to ... to readProcess to ...) Should I use FilePath=String? ... To be honest, the patch became a lot bigger that what I am comfortable with. :-)
+
+I guess you should have a look at it...
+
+At least, I think there is a type bug in Propellor.Property.File:
+
+ hasPrivContent' :: (IsContext c, IsPrivDataSource s) => (String -> FilePath -> IO ()) -> s -> FilePath -> c -> Property HasInfo
+
+but it should be
+
+ hasPrivContent' :: (IsContext c, IsPrivDataSource s) => (FilePath -> String -> IO ()) -> s -> FilePath -> c -> Property HasInfo
+
+(it is hidden by FilePath = String)
+"""]]
diff --git a/doc/todo/bytes_in_privData__63__/comment_5_f4db6ffad054feb7eb299708fcd7d05c._comment b/doc/todo/bytes_in_privData__63__/comment_5_f4db6ffad054feb7eb299708fcd7d05c._comment
new file mode 100644
index 00000000..45c97b97
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__/comment_5_f4db6ffad054feb7eb299708fcd7d05c._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2015-04-23T13:25:50Z"
+ content="""
+Can you put the patch up somewhere? I'll take a look. Might see a way to
+short-curcuit the bytestring before everything becomes one..
+
+One way might be:
+
+ writeFileProtected :: FileContent content => FilePath -> content -> IO ()
+
+Which would also at least partly avoid foot-shooting over which parameter is which.
+(Fixed that type signature.)
+"""]]
diff --git a/doc/todo/bytes_in_privData__63__/comment_6_545e1c26a042b9f8347496a1bfb61548._comment b/doc/todo/bytes_in_privData__63__/comment_6_545e1c26a042b9f8347496a1bfb61548._comment
new file mode 100644
index 00000000..29b07e5c
--- /dev/null
+++ b/doc/todo/bytes_in_privData__63__/comment_6_545e1c26a042b9f8347496a1bfb61548._comment
@@ -0,0 +1,48 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 6"""
+ date="2015-04-28T19:24:12Z"
+ content="""
+I've followed the same path in the wip-bytestring-privdata branch.
+
+It needs to round trip through String anyway to handle Read/Show
+serialization the same as before. I think this is doable without falling
+over on invalid encodings, but it's certianly ugly.
+
+And yeah, changing Line to ByteString and all the other follow-on changes
+just don't seem right. Everything that uses withPrivData would need to deal
+with it being a ByteString, and would need to worry about encoding problems
+when it needed to convert to a String, or Text, or whatever.
+
+So this feels like kicking the can down the road in the wrong direction...
+
+----
+
+Maybe it would be better to handle this by adding a type to wrap up an
+encoded ByteString in the PrivData. Could use base64 or something like
+that for the encoding. Then only consumers of these ByteStrings would be a
+little complicated by needing to unwrap it.
+
+Then it would be handly to give --set, --dump and --edit some
+special handling of fields encoded like that. They could operate on raw
+ByteStrings when handling such fields, and take care of the encoding
+details.
+
+Add a new constructor to PrivDataField for binary files:
+
+ | PrivBinaryFile FilePath
+
+And a function to get the encoder and decoder:
+
+ type Encoder = ByteString -> PrivData
+ type Decoder = PrivData -> ByteString
+
+ privDataEncoding :: PrivDataField -> Maybe (Encoder, Decoder)
+
+Then --set, --dump, and --edit could use that to encode and decode the
+data.
+
+And finally, a `withBinaryPrivData` that uses ByteString.
+
+(Maybe this could be made more type safe though..)
+"""]]
diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn
index 72ded426..1321445d 100644
--- a/doc/todo/docker_todo_list.mdwn
+++ b/doc/todo/docker_todo_list.mdwn
@@ -1,5 +1,3 @@
* There is no way for a property of a docker container to require
some property be met outside the container. For example, some servers
need ntp installed for a good date source.
-* The SimpleSh was added before `docker exec` existed, and could probably
- be eliminated by using that.
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 e6427069..536d6719 100644
--- a/doc/todo/info_propigation_out_of_nested_properties.mdwn
+++ b/doc/todo/info_propigation_out_of_nested_properties.mdwn
@@ -1,36 +1,97 @@
> Now [[fixed|done]]!! --[[Joey]]
-Currently, Info about a Host's Properties is manually gathered and
-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!).
+Currently, Info about a Host's Properties is propigated to the host by
+examining the tree of Properties.
-This works, but it's error-prone. Consider this example:
+This works, but there's one problem. Consider this example:
withOS desc $ \o -> case o of
(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..
+It's not really clear if just one Info, or both 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 =<< liftIO (getBarParam)
+
+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.
+
+Worse, the bar property is not fully known until IO can be performed to get
+its parameter.
+
+----
+
+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 adds foo and bar as child properties of the demo 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.
+
+And again this doesn't solve the problem that IO can be needed to get
+a parameter of a child property.
+
+----
+
+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've tried to make this change a couple times now, and not been completely
+successful so far.
+
+(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/issue_after_upgrading_shared_library.mdwn b/doc/todo/issue_after_upgrading_shared_library.mdwn
new file mode 100644
index 00000000..52e72d4a
--- /dev/null
+++ b/doc/todo/issue_after_upgrading_shared_library.mdwn
@@ -0,0 +1,25 @@
+After upgrading my server to jessie, I noticed that propellor does not work anymore. The issue seems to be that, libffi was upgraded from libffi5:amd64 to libffi6:amd64
+
+ $ ./propellor --spin myserver
+ Building propellor-2.2.1...
+ Preprocessing library propellor-2.2.1...
+ In-place registering propellor-2.2.1...
+ Preprocessing executable 'propellor' for propellor-2.2.1...
+ Preprocessing executable 'propellor-config' for propellor-2.2.1...
+ Propellor build ... done
+
+ You need a passphrase to unlock the secret key for
+ user: bla
+
+ [master 2aabb40] propellor spin
+ Git commit ... done
+ Counting objects: 1, done.
+ Writing objects: 100% (1/1), 852 bytes | 0 bytes/s, done.
+ Total 1 (delta 0), reused 0 (delta 0)
+ To root@myserver:/var/lib/git/private/propellor.git
+ b16f1a6..2aabb40 master -> master
+ Push to central git repository ... done
+ ./propellor: error while loading shared libraries: libffi.so.5: cannot open shared object file: No such file or directory
+ propellor: user error (ssh ["-o","ControlPath=/home/myuser/.ssh/propellor/myserver.sock","-o","ControlMaster=auto","-o","ControlPersist=yes","root@myserver","sh -c 'if [ ! -d /usr/local/propellor/.git ] ; then (if ! git --version >/dev/null; then apt-get update && apt-get --no-install-recommends --no-upgrade -y install git; fi && echo STATUSNeedGitClone) || echo STATUSNeedPrecompiled ; else cd /usr/local/propellor && if ! test -x ./propellor; then ( apt-get update ; apt-get --no-upgrade --no-install-recommends -y install gnupg ; apt-get --no-upgrade --no-install-recommends -y install ghc ; apt-get --no-upgrade --no-install-recommends -y install cabal-install ; apt-get --no-upgrade --no-install-recommends -y install libghc-async-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-missingh-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-hslogger-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-unix-compat-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-ansi-terminal-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-ifelse-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-network-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-quickcheck2-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-mtl-dev ; apt-get --no-upgrade --no-install-recommends -y install libghc-monadcatchio-transformers-dev ; cabal update ; cabal install --only-dependencies ) || true && cabal configure && cabal build && ln -sf dist/build/propellor-config/propellor-config propellor; fi && ./propellor --boot myserver ; fi'"] exited 127)
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/todo/issue_after_upgrading_shared_library/comment_1_8d9144d57871cb5d234710d1ab1b7183._comment b/doc/todo/issue_after_upgrading_shared_library/comment_1_8d9144d57871cb5d234710d1ab1b7183._comment
new file mode 100644
index 00000000..77c7df83
--- /dev/null
+++ b/doc/todo/issue_after_upgrading_shared_library/comment_1_8d9144d57871cb5d234710d1ab1b7183._comment
@@ -0,0 +1,20 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-02T01:14:06Z"
+ content="""
+I think I saw this once myself (have no servers older than jessie left
+now).
+
+I believe the problem can be worked around by running make clean
+in /usr/local/propellor on the server.
+
+I'm not clear yet on a good way for --spin to detect that propellor
+has failed due to this, rather than some other problem, and try
+a clean and rebuild.
+
+Hmm, xmonad should have a similar problem, since it builds a haskell
+program locally. I wonder how the debian package deals with it there.
+
+Note there's a libffi6, so this will presumably happen again..
+"""]]
diff --git a/doc/todo/issue_after_upgrading_shared_library/comment_2_01a3d5e006158302e12862cacee3327e._comment b/doc/todo/issue_after_upgrading_shared_library/comment_2_01a3d5e006158302e12862cacee3327e._comment
new file mode 100644
index 00000000..3f7a7bbc
--- /dev/null
+++ b/doc/todo/issue_after_upgrading_shared_library/comment_2_01a3d5e006158302e12862cacee3327e._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 2"
+ date="2015-04-02T09:24:07Z"
+ content="""
+Indeed, \"make clean\" on the server worked. I don't know it could be made more robust to this kind of upgrade...
+"""]]
diff --git a/doc/todo/issue_after_upgrading_shared_library/comment_2_6025ec35330fbac220f2888e60be1e78._comment b/doc/todo/issue_after_upgrading_shared_library/comment_2_6025ec35330fbac220f2888e60be1e78._comment
new file mode 100644
index 00000000..bc89ad7f
--- /dev/null
+++ b/doc/todo/issue_after_upgrading_shared_library/comment_2_6025ec35330fbac220f2888e60be1e78._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2015-04-02T14:27:26Z"
+ content="""
+So I thought of two approaches.
+
+1. Propellor could copy in all the shared libraries. It already contains
+ code to do this. But, this would add overhead to every build. And it
+ might not guard against all snafus.
+
+2. Make propellor --check that should exit 0. Make --spin check that
+ propellor works and rebuild if not. Also make the runPropellor cron job
+ do that.
+
+I've gone with option #2.
+"""]]
diff --git a/doc/todo/lxc_containers_support.mdwn b/doc/todo/lxc_containers_support.mdwn
new file mode 100644
index 00000000..5e9da306
--- /dev/null
+++ b/doc/todo/lxc_containers_support.mdwn
@@ -0,0 +1 @@
+Adding lxc containers support would be great, as an alternative to docker, chroot, or systemd containers.
diff --git a/doc/todo/missing_dependencies.mdwn b/doc/todo/missing_dependencies.mdwn
new file mode 100644
index 00000000..55490a86
--- /dev/null
+++ b/doc/todo/missing_dependencies.mdwn
@@ -0,0 +1,39 @@
+After upgrading to 2.4.0, I get this error:
+
+ ./propellor --spin myserver
+ Building propellor-2.4.0...
+ Preprocessing library propellor-2.4.0...
+ In-place registering propellor-2.4.0...
+ Preprocessing executable 'propellor' for propellor-2.4.0...
+ Preprocessing executable 'propellor-config' for propellor-2.4.0...
+ Propellor build ... done
+ Git commit ... done
+ Enter passphrase for /home/user/.ssh/id_rsa:
+ Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
+ Counting objects: 253, done.
+ Delta compression using up to 4 threads.
+ Compressing objects: 100% (253/253), done.
+ Writing objects: 100% (253/253), 173.59 KiB | 0 bytes/s, done.
+ Total 253 (delta 172), reused 0 (delta 0)
+ To root@myserver:/var/lib/git/private/propellor.git
+ d81fb7d..6f7f041 master -> master
+ Push to central git repository ... done
+ From myserver:/var/lib/git/private/propellor
+ d81fb7d..6f7f041 master -> origin/master
+ Pull from central git repository ... done
+ ** warning: git branch origin/master is not signed with a trusted gpg key; refusing to deploy it! (Running with previous configuration instead.)
+ Sending privdata (87652 bytes) to myserver ... done
+ From .
+ * branch HEAD -> FETCH_HEAD
+ Sending git update to myserver ... done
+ Warning: The package list for 'hackage.haskell.org' is 47 days old.
+ Run 'cabal update' to get the latest list of available packages.
+ Resolving dependencies...
+ Configuring propellor-2.4.0...
+ cabal: At least the following dependencies are missing:
+ exceptions -any
+ propellor: failed to make dist/setup-config
+ Shared connection to myserver closed.
+ propellor: remote propellor failed
+
+As in https://propellor.branchable.com/todo/issue_after_upgrading_shared_library/, manually running "make clean" on the server fixed the issue
diff --git a/doc/todo/missing_dependencies/comment_1_826a75052e87c04489aa07c3d322a54f._comment b/doc/todo/missing_dependencies/comment_1_826a75052e87c04489aa07c3d322a54f._comment
new file mode 100644
index 00000000..2ccb179d
--- /dev/null
+++ b/doc/todo/missing_dependencies/comment_1_826a75052e87c04489aa07c3d322a54f._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-05-22T18:13:15Z"
+ content="""
+`exceptions` is indeed a new dependency.
+
+This is supposed to be handled by Propellor.Bootstrap.checkDepsCommand
+which is run by --spin.
+
+Maybe check if your propellor.cabal includes the `exceptions` dependency,
+and check if `cabal configure` fails. If it does, it seems like that code
+would fire, and should install the missing dependency. It worked when I
+upgraded my systems with it, is all I know.
+"""]]
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/publish_propellor_as_library_to_hackage.mdwn b/doc/todo/publish_propellor_as_library_to_hackage.mdwn
new file mode 100644
index 00000000..709ee35b
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage.mdwn
@@ -0,0 +1,4 @@
+Currently, AFAIK, one needs to fork propellor repo, add its own configuration and compile propellor binary from all the source tree.
+It would be handy and more modular to allow one to have a propellor configuration linked to propellor as a library, hosted on hackage.
+
+> [[done]] --[[Joey]]
diff --git a/doc/todo/publish_propellor_as_library_to_hackage/comment_1_00a865bf7977c0e49f54a365f4b60ce8._comment b/doc/todo/publish_propellor_as_library_to_hackage/comment_1_00a865bf7977c0e49f54a365f4b60ce8._comment
new file mode 100644
index 00000000..8d56f0f1
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage/comment_1_00a865bf7977c0e49f54a365f4b60ce8._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-02-28T15:01:24Z"
+ content="""
+Unusual as it is for propellor's configuration git repo to include the full
+source code to propellor, I like this approach. It lets users change any
+existing property that is not generic enough, or makes assumptions they
+don't like, or needs porting to their OS of choice.
+
+But still, propellor is
+[on hackage](http://hackage.haskell.org/package/propellor), as
+a library. It can be used that way if you want to.
+
+I don't think that any of propellor's code cares how it's distributed,
+except for src/wrapper.hs (which cabal will install as
+~/.cabal/bin/propellor), which sets up the ~/.propellor/ repository. You
+can bypass using that wrapper if you like, and cabal install propellor and
+create your own ~/.propellor/ repository containing only your own
+config.hs, and build and use propellor that way.
+
+Where that approach becomes a problem is that propellor --spin currently
+relies on propellor's Makefile being in the repository, when bootstrapping
+propellor on a remote host. So you'll need to include a copy of that in
+your repo for --spin to work. I'd like to get rid of the need for the
+Makefile. (Only the build and deps targets are used by --spin.)
+"""]]
diff --git a/doc/todo/publish_propellor_as_library_to_hackage/comment_2_29cc276929020e68eae8ae04110a3f5f._comment b/doc/todo/publish_propellor_as_library_to_hackage/comment_2_29cc276929020e68eae8ae04110a3f5f._comment
new file mode 100644
index 00000000..af61b1db
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage/comment_2_29cc276929020e68eae8ae04110a3f5f._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2015-02-28T17:08:28Z"
+ content="""
+Ok, I got --spin to not use the Makefile any more. So with the 2.2.0
+release, if you want to make ~/.propellor contain only a config.hs
+file and a foo.cabal file, that will work. The cabal file would contain
+something like:
+
+<pre>
+Executable propellor-config
+ Main-Is: config.hs
+ GHC-Options: -Wall -threaded -O0
+ Build-Depends: propellor, base >= 4.5, base < 5
+</pre>
+"""]]
diff --git a/doc/todo/publish_propellor_as_library_to_hackage/comment_3_efbe0ef77be957c37e745ec64452ae99._comment b/doc/todo/publish_propellor_as_library_to_hackage/comment_3_efbe0ef77be957c37e745ec64452ae99._comment
new file mode 100644
index 00000000..09628e53
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage/comment_3_efbe0ef77be957c37e745ec64452ae99._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="You rocks!"
+ date="2015-03-05T15:24:49Z"
+ content="""
+Apologies for wrong information, I did not check if propellor was on hackage. Anyway, thanks a lot for caring to \"fix\" that, will give it a try this week and keep you posted.
+
+Thanks a lot
+"""]]
diff --git a/doc/todo/publish_propellor_as_library_to_hackage/comment_4_6ebf2e30596ddf6eba91717576837019._comment b/doc/todo/publish_propellor_as_library_to_hackage/comment_4_6ebf2e30596ddf6eba91717576837019._comment
new file mode 100644
index 00000000..737e7066
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage/comment_4_6ebf2e30596ddf6eba91717576837019._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Propellor 2.2.0 not on hackage"
+ date="2015-03-08T20:21:42Z"
+ content="""
+So I cannot depend on it right now. Do you know when it will be available there?
+"""]]
diff --git a/doc/todo/publish_propellor_as_library_to_hackage/comment_5_4a4e94c637e0380adc1a43ec3d0633e1._comment b/doc/todo/publish_propellor_as_library_to_hackage/comment_5_4a4e94c637e0380adc1a43ec3d0633e1._comment
new file mode 100644
index 00000000..85f95c17
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage/comment_5_4a4e94c637e0380adc1a43ec3d0633e1._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2015-03-09T17:00:35Z"
+ content="""
+SImply because 2.2.0 had not been released yet. (UNRELEASED in
+changelog..)
+"""]]
diff --git a/doc/todo/publish_propellor_as_library_to_hackage/comment_6_19470170c3ef461f446b0af1d8501640._comment b/doc/todo/publish_propellor_as_library_to_hackage/comment_6_19470170c3ef461f446b0af1d8501640._comment
new file mode 100644
index 00000000..143f1dea
--- /dev/null
+++ b/doc/todo/publish_propellor_as_library_to_hackage/comment_6_19470170c3ef461f446b0af1d8501640._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="comment 6"
+ date="2015-03-10T06:28:52Z"
+ content="""
+Sorry, I did not read the changelog. Thanks for all the hard work on propellor.
+"""]]
diff --git a/doc/todo/ssh__95__user_+_sudo/comment_4_7fc635a8d6e4c903eaefa7383d2c37ac._comment b/doc/todo/ssh__95__user_+_sudo/comment_4_7fc635a8d6e4c903eaefa7383d2c37ac._comment
new file mode 100644
index 00000000..af5e120a
--- /dev/null
+++ b/doc/todo/ssh__95__user_+_sudo/comment_4_7fc635a8d6e4c903eaefa7383d2c37ac._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~jml"
+ nickname="jml"
+ subject="comment 4"
+ date="2015-05-15T08:57:04Z"
+ content="""
+Just want to add that it's not only a security issue: it's also a convenience issue. Many machines are configured by default to not allow remote root logins, but to allow user logins followed by sudo. If propellor can't do that, then there's an extra step in the whole process that can't be easily automated within propellor.
+"""]]
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/doc/writing_properties.mdwn b/doc/writing_properties.mdwn
new file mode 100644
index 00000000..c7183e09
--- /dev/null
+++ b/doc/writing_properties.mdwn
@@ -0,0 +1,82 @@
+Propellor comes with a lot of properties you can use. But eventually,
+you'll want to write a property of your own.
+
+This isn't hard. Often propellor has some properties you can use to build
+the property you want. Need to modify the content of a file? Use any of
+the properties in
+[Propellor.Property.File](http://hackage.haskell.org/package/propellor-2.2.1/docs/Propellor-Property-File.htm)
+Need to run some commands? Use [Propellor.Property.Cmd](http://hackage.haskell.org/package/propellor-2.2.1/docs/Propellor-Property-Cmd.html).
+
+To combine properties, the easiest way is to use `requires`.
+
+ someproperty `requires` otherproperty
+
+[Propellor.Property.List](http://hackage.haskell.org/package/propellor-2.2.1/docs/Propellor-Property-List.html)
+has a `propertyList` combinator that's also useful.
+
+[Propellor.Property](http://hackage.haskell.org/package/propellor-2.2.1/docs/Propellor-Property.html)
+has some other functions to modify Properties in useful ways.
+For example, `check` makes a Property call an `IO Bool` to check if the
+Property needs be run.
+
+## example: User.hasLoginShell
+
+> As far as I can tell there is no easy way to set a user's
+> login shell. A Property User.hasLoginShell, which ensures
+> that a user has a specified login shell and that said shell
+> is in /etc/shells would be really helpful. Sadly, I lack the
+> skills to put this together myself :( -- weinzwang
+
+Propellor makes it very easy to put together a property like this.
+
+Let's start with a property that combines the two properties you mentioned:
+
+ hasLoginShell :: UserName -> FilePath -> Property
+ hasLoginShell user shell = shellSetTo user shell `requires` shellEnabled shell
+
+The shellEnabled property can be easily written using propellor's file
+manipulation properties.
+
+ -- Need to add an import to the top of the source file.
+ import qualified Propellor.Property.File as File
+
+ shellEnabled :: FilePath -> Property
+ shellEnabled shell = "/etc/shells" `File.containsLine` shell
+
+And then, we want to actually change the user's shell. The `chsh(1)`
+program can do that, so we can simply tell propellor the command line to
+run:
+
+ shellSetTo :: UserName -> FilePath -> Property
+ shellSetTo user shell = cmdProperty "chsh" ["--shell", shell, user]
+
+The only remaining problem with this is that shellSetTo runs chsh every
+time, and propellor will always display that it's made a change each time
+it runs, even when it didn't really do much. Now, there's an easy way to
+avoid that problem, we could just tell propellor that it's a trivial
+property, and then it will run chsh every time and not think it made any
+change:
+
+ shellSetTo :: UserName -> FilePath -> Property
+ shellSetTo user shell = trivial $
+ cmdProperty "chsh" ["--shell", shell, user]
+
+But, it's not much harder to do this right. Let's make the property
+check if the user's shell is already set to the desired value and avoid
+doing anything in that case.
+
+ shellSetTo :: UserName -> FilePath -> Property
+ shellSetTo user shell = check needchangeshell $
+ cmdProperty "chsh" ["--shell", shell, user]
+ where
+ needchangeshell = do
+ currshell <- userShell <$> getUserEntryForName user
+ return (currshell /= shell)
+
+And that will probably all work, although I've not tested it. You might
+want to throw in some uses of `describe` to give the new properties
+more useful descriptions.
+
+I hope this has been helpful as an explanation of how to add properties to
+Propellor, and if you get these properties to work, a patch adding them
+to Propellor.User would be happily merged.
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 6dd6cbcc..00000000
--- a/privdata.joey/privdata.gpg
+++ /dev/null
@@ -1,1427 +0,0 @@
------BEGIN PGP MESSAGE-----
-Version: GnuPG v1
-
-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
-lMipZBz5jdrNnip9n7rV5d1Yz3F4J3xcPwEEIv8MYtbbT9QJwLm53H6W843pbo1D
-gt9CXc8RQCuQffsYT77j6dHTn9jx0w34MFk5O8zI0JpMUn4OXXS571nnVbl1TZvC
-N6s28Tx5KsXTemPMbYsGPrGN27//k7emQBuQllTd0IgzbYrRNHu5pNIObnZ9FRFy
-L5VqlPA8gInhT7aMeYzXCHrms4VnusBN0id+WMHNeUPHaadmlzX5nOFFz/Uw+ktv
-tCNqSRsgVtajLufKyhZFciYn8G09Y4POtumKeTxqUfTnyUu5WhElx7emOJ9m41zr
-w/G3Qf/afE+jEKQ6MwadkNM21RnSm1nJ7Ie3xlWHXdibQoxKTxdzE5jiSOCo6s1S
-mGs3sID3YM40pZIAPNVVFmiykXdT9cIz7LPfQ0xRCnH4aMbOpVUe39rYUb415jvF
-wKfU0v3PtP1w5ayjCKXz0gutpR8CqF9/0Fg3paDXcR3+JGuZETdML+vjpzNdNFjA
-2sYZw/VyfKrQ1UJA1C2LeDAoNiyboE5Jbp9kC6cmMshw4XgGydEbn8r5keqBaIT5
-PO6NMpU08WcujbZJ5sMVKkNXNpPkjp/n50zB5h12qI7PuZOc3OcioJt+Nksld3be
-s8AqUDW7IHaO10Um6EMmB/Bwcp1OjQAMPOsDNJGRd9EeoD/a9JdU9IDMXS9/OPYd
-Ph3Aa0hdkAG9y88NN3n1prfWRt5lYAiB9eN1kyS0D3LOFXP4yIu15NT8+9l72vAJ
-gdH7nGCZ16VJtX9VQxGj2ex5aQljuWOYHF7Rlqe5uL7Vn+hlQoAijM+4J1S0TTby
-Kb6SsHaWgjoVY9bwcyy1Ff5BIEY1oYLGjNGgPjlK0DJ5SjhaH9oKjpFWRVgXVH6I
-eCi5EPZ5cp4KI1bI868dMQ7uMWEMzppOUcNnkoka5XN2fxHJ0I2v+1lO8dIYhxFG
-6dPfqVU803zXNedaf663zh5MfX4NFEq6dZjEYFu6xiUZTZh60EM6KSBP+z2C9uDp
-CYgKTpfM6kgduRDBGevcIi0T7IYUHrJmLra5Cemb4UW+y3hh4NajYgy/uodWiFd6
-0n8/X0aTDwildeWuGss2Rdh8fWfR8dfIElinc2q4DZabqS1L6D9OMoKgmnhWnyhp
-tmd6/O1OaQpw2k0N26WgvxQ9IkYNoBJWJK2UHjAPqddvEWR7EbOqLvmEz+IIuLe4
-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
-Y+R60poOd0bXb8u+OnQtCQmxVUM=
-=L1xV
------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"