summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
l---------config.hs2
-rwxr-xr-xdebian/rules2
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn34
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment30
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment38
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment11
-rw-r--r--doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment16
-rw-r--r--doc/forum/Propellor_without_superuser_privileges.mdwn3
-rw-r--r--doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment26
-rw-r--r--doc/forum/Supported_OS.mdwn5
-rw-r--r--doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment23
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn12
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment10
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment19
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment11
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment11
-rw-r--r--doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment7
-rw-r--r--doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn1
-rw-r--r--doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment10
-rw-r--r--doc/forum/propellor_with_no_central_repository__63__.mdwn1
-rw-r--r--doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment7
-rw-r--r--doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment9
-rw-r--r--doc/forum/property_combinator_ordering.mdwn8
-rw-r--r--doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment31
-rw-r--r--doc/news/propellor_demo.mdwn8
-rw-r--r--doc/news/version_1.1.0.mdwn33
-rw-r--r--doc/news/version_1.2.0.mdwn9
-rw-r--r--doc/news/version_1.2.1.mdwn6
-rw-r--r--doc/news/version_1.2.2.mdwn4
-rw-r--r--doc/news/version_1.3.0.mdwn17
-rw-r--r--doc/security.mdwn2
-rw-r--r--doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment10
-rw-r--r--doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment8
-rw-r--r--doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment17
-rw-r--r--doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment22
-rw-r--r--doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment13
-rw-r--r--doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment11
-rw-r--r--doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment8
-rw-r--r--doc/todo/editor_for_privdata__63__.mdwn4
-rw-r--r--doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment9
-rw-r--r--doc/todo/etckeeper.mdwn1
-rw-r--r--doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment9
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn3
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment30
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment7
-rw-r--r--doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment19
-rw-r--r--doc/todo/git_push_over_propellor_ssh_channel.mdwn13
-rw-r--r--doc/todo/info_propigation_out_of_nested_properties.mdwn109
-rw-r--r--doc/todo/port_info_for_properties_for_firewall.mdwn24
-rw-r--r--doc/todo/type_level_port_conflict_detection.mdwn5
-rw-r--r--privdata.joey/keyring.gpgbin113014 -> 0 bytes
-rw-r--r--privdata.joey/privdata.gpg858
-rw-r--r--src/Propellor/PrivData/Paths.hs2
53 files changed, 704 insertions, 884 deletions
diff --git a/config.hs b/config.hs
index 07959a0a..ec313725 120000
--- a/config.hs
+++ b/config.hs
@@ -1 +1 @@
-config-joey.hs \ No newline at end of file
+config-simple.hs \ No newline at end of file
diff --git a/debian/rules b/debian/rules
index c553132f..bcb681c1 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,4 +1,4 @@
-#!/bin/false
+#!/usr/bin/make -f
# Avoid using cabal, as it writes to $HOME
export CABAL=./Setup
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn
new file mode 100644
index 00000000..b678d8d0
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn
@@ -0,0 +1,34 @@
+Hello,
+
+Still working on the reprepro property :)
+
+Here A property that I am using to publish a repository via apache (this is a prototype)
+
+ website :: String -> Property
+ website hn = toProp $ Apache.siteEnabled hn apachecfg
+ where
+ apachecfg = [ "<VirtualHost *>"
+ , "DocumentRoot " ++ basePath
+ , "<Directory " ++ basePath ++ ">"
+ , " Options Indexes FollowSymLinks Multiviews"
+ , " Order allow,deny"
+ , Apache.allowAll
+ , "</Directory>"
+ ] ++ concatMap deny ["db", "conf", "incoming"]
+ ++ ["</VirtualHost>"]
+
+ deny dir = [ "<Directory \"" ++ basePath ++ "apt/*/" ++ dir ++ "\">"
+ , " Order deny,allow"
+ , " Deny from all"
+ , "</Directory>"
+ ]
+
+during my test I am runing the config.hs with
+runhaskell config.hs (it work the first time, the apache config files are ok)
+
+but when I do a modification on the apachecfg and rerun the runhaskell,
+the config files are not updated. I need to remove them to have an updated version.
+
+cheers
+
+Fred
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment
new file mode 100644
index 00000000..0101ccb2
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="first run"
+ date="2014-12-08T09:31:46Z"
+ content="""
+root@mordor:~/propellor/src# PROPELLOR_DEBUG=1 runhaskell config.hs
+[2014-12-08 10:27:10 CET] read: hostname [\"-f\"]
+[2014-12-08 10:27:10 CET] command line: Run \"mordor\"
+[2014-12-08 10:27:10 CET] read: git [\"remote\"]
+[2014-12-08 10:27:10 CET] read: git [\"symbolic-ref\",\"--short\",\"HEAD\"]
+[2014-12-08 10:27:10 CET] call: git [\"fetch\"]
+Pull from central git repository ... done
+[2014-12-08 10:27:12 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+[2014-12-08 10:27:12 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+mordor has Operating System (Debian Unstable) \"i386\" ... ok
+[2014-12-08 10:27:12 CET] read: apt-cache [\"policy\",\"etckeeper\"]
+mordor apt installed etckeeper ... ok
+[2014-12-08 10:27:13 CET] read: apt-cache [\"policy\",\"ssh\"]
+mordor apt installed ssh ... ok
+[2014-12-08 10:27:13 CET] read: passwd [\"-S\",\"root\"]
+mordor root has password ... ok
+[2014-12-08 10:27:13 CET] call: a2query [\"-q\",\"-s\",\"reprepro\"]
+[2014-12-08 10:27:14 CET] read: apt-cache [\"policy\",\"apache2\"]
+[2014-12-08 10:27:14 CET] call: a2ensite [\"--quiet\",\"reprepro\"]
+Enabling site reprepro.
+[2014-12-08 10:27:15 CET] call: sh [\"-c\",\"set -e ; service 'apache2' reload >/dev/null 2>&1 || true\"]
+mordor create reprepro ... done
+mordor overall ... done
+
+"""]]
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment
new file mode 100644
index 00000000..85a57383
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment
@@ -0,0 +1,38 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="second run with content modified"
+ date="2014-12-08T09:37:43Z"
+ content="""
+Second run after adding a space here
+
+ - , \" Options Indexes FollowSymLinks Multiviews\"
+ + , \" Options Indexes FollowSymLinks Multiviews\"
+
+
+ root@mordor:~/propellor/src# PROPELLOR_DEBUG=1 runhaskell config.hs
+ [2014-12-08 10:34:19 CET] read: hostname [\"-f\"]
+ [2014-12-08 10:34:19 CET] command line: Run \"mordor\"
+ [2014-12-08 10:34:19 CET] read: git [\"remote\"]
+ [2014-12-08 10:34:19 CET] read: git [\"symbolic-ref\",\"--short\",\"HEAD\"]
+ [2014-12-08 10:34:19 CET] call: git [\"fetch\"]
+ remote: Counting objects: 32, done.
+ remote: Compressing objects: 100% (6/6), done.
+ remote: Total 6 (delta 3), reused 0 (delta 0)
+ Dépaquetage des objets: 100% (6/6), fait.
+ Depuis git://git.kitenet.net/propellor
+ c5a8cae..9ac0dfb master -> origin/master
+ Pull from central git repository ... done
+ [2014-12-08 10:34:20 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+ [2014-12-08 10:34:20 CET] read: git [\"show-ref\",\"--hash\",\"master\"]
+ mordor has Operating System (Debian Unstable) \"i386\" ... ok
+ [2014-12-08 10:34:20 CET] read: apt-cache [\"policy\",\"etckeeper\"]
+ mordor apt installed etckeeper ... ok
+ [2014-12-08 10:34:21 CET] read: apt-cache [\"policy\",\"ssh\"]
+ mordor apt installed ssh ... ok
+ [2014-12-08 10:34:21 CET] read: passwd [\"-S\",\"root\"]
+ mordor root has password ... ok
+ [2014-12-08 10:34:21 CET] call: a2query [\"-q\",\"-s\",\"reprepro\"]
+ mordor create reprepro ... ok
+ mordor overall ... ok
+
+"""]]
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment
new file mode 100644
index 00000000..5dc67fb0
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="comment 3"
+ date="2014-12-08T10:47:59Z"
+ content="""
+I forgot to say that the content of
+
+/etc/apache2/site-xxx/reprepro[.conf]
+
+is unmodifed after this second run
+"""]]
diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment
new file mode 100644
index 00000000..a9201541
--- /dev/null
+++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2014-12-09T04:35:12Z"
+ content="""
+Pretty obvious why if you look at the code:
+
+ enable = check (not <$> isenabled) $
+ cmdProperty "a2ensite" ["--quiet", hn]
+ `describe` ("apache site enabled " ++ hn)
+ `requires` siteAvailable hn cf
+
+So that property was skipped entirely if the site was already enabled and never looked at the config file.
+
+I've put in a fix.
+"""]]
diff --git a/doc/forum/Propellor_without_superuser_privileges.mdwn b/doc/forum/Propellor_without_superuser_privileges.mdwn
new file mode 100644
index 00000000..d7288a72
--- /dev/null
+++ b/doc/forum/Propellor_without_superuser_privileges.mdwn
@@ -0,0 +1,3 @@
+Joey uses propellor to popular his /home/joey on hosts he controls. I'd like to use it to populate my home directory on hosts where I don't have root. If someone gives me a shell account on a Debian box, it would be great to just run `propellor --spin` to have apply properties such as having certain stuff downloaded and compiled in `~/local/bin`, putting cronjobs in place, and checking stuff out with `myrepos`.
+
+Does propellor assume root access at a deep enough level that writing properties to do this stuff would be impractical?
diff --git a/doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment b/doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment
new file mode 100644
index 00000000..1a38ef94
--- /dev/null
+++ b/doc/forum/Propellor_without_superuser_privileges/comment_1_021ecbb1b8bd7e26776b49ec75e90d0c._comment
@@ -0,0 +1,26 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-12-26T19:26:00Z"
+ content="""
+I think that the root assumptions are in basically 3 places:
+
+* Many Properties assume they're run as root, and will fail if they're not.
+ Probably not a problem in practice for most of them. It might be nice
+ to make a few, such as `User.hasSomePassword` work when run as a normal
+ user.
+
+* Propellor's self-deployment involves running apt-get to instal ghc,
+ etc. This could be modified to check if it's not root and do a local
+ user of ghc if necessary.
+
+* `localdir = "/usr/local" and this is used in various places by eg,
+ `--spin`. It is, however, entirely possible to run "./propellor" in
+ some other directory, which causes it to run in that directory
+ and ensure the properties of localhost. `--spin` could certianly be
+ taught to run in a user mode where it uses "~/.propellor/" instead of
+ `localdir`.
+
+I think that's all! I don't plan to try to add this feature myself, but
+will be happy to support anyone who wants to work on it.
+"""]]
diff --git a/doc/forum/Supported_OS.mdwn b/doc/forum/Supported_OS.mdwn
new file mode 100644
index 00000000..f17b9054
--- /dev/null
+++ b/doc/forum/Supported_OS.mdwn
@@ -0,0 +1,5 @@
+What are the requirements for the configured OS ? Does it need to be Debian ?
+
+Would Propellor work for Arch linux, RHEL, Windows, AIX or linux on pSeries) ?
+
+Cheers
diff --git a/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
new file mode 100644
index 00000000..3a2055ea
--- /dev/null
+++ b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-12-07T15:58:03Z"
+ content="""
+I have heard of propellor being used on OSX. Probably that user wrote their
+own code for OSX specific stuff.
+
+Propellor properites can be parameterized by OS. Currently it has support
+for Debian and some untested support for Ubuntu. A property can be parameterized
+like this:
+
+ foo :: Property
+ foo = property "foo" withOS desc $ \o -> case o of
+ (Just (System (Debian _) _)) -> ensureProperty fooDebian
+ (Just (System (Ubuntu _) _)) -> ensureProperty fooUbuntu
+
+The first step for adding a new OS will be to modify <http://hackage.haskell.org/package/propellor-1.0.0/docs/Propellor-Types-OS.html>.
+Compilation will then warn about all OS parameterized properties that
+need to be updated to support your added OS, and it can be taken from there.
+
+I'll accept reasonable patches to support other OS's.
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn
new file mode 100644
index 00000000..c88defcf
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn
@@ -0,0 +1,12 @@
+Hello,
+
+I am trying propellor on Debian Jessie (haskell is fantastic for this sort or things) to setup one of my computer.
+
+On my network, the system administrator set proxies for http and https.
+These information are available via a http://proxy/proxy.pac URL.
+
+So I would like to know what should be done to extract this information and set it for all users on the system ?
+
+Cheers
+
+Frederic
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment
new file mode 100644
index 00000000..6bf8844d
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-25T15:44:13Z"
+ content="""
+You could, for example, use Propellor.Propety.Cmd.cmdProperty
+to run a command that sets up the proxying. If there's not a single command
+that does it, you could cause propellor to fetch the url and deploy the
+info itself.
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment
new file mode 100644
index 00000000..8458ee49
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="comment 2"
+ date="2014-11-25T17:55:25Z"
+ content="""
+In my case I need to wget the proxy.pac file and parse it to find the right proxy.
+
+what worried me is that these proxy.pac things are dynamical depending on the ip of the sender AND the receive.
+It work nicely with web browser, but not with the unix http_proxy and HTTPS_PROXY env.
+
+nevertheless, I can create something to parse my local setup and extract the right http_proxy.
+
+Is there something available in Propellor to set a global environment variable in /etc/environment (the right place for this ?)
+
+cheers
+
+Frederic
+
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment
new file mode 100644
index 00000000..9bdcb4df
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-25T19:37:46Z"
+ content="""
+There's no Property that handles setting global environment currently, but
+it's a reasonable one to add.
+
+I think that /etc/environment is read by `pam_env` logins, but maybe not
+other things, so dunno.
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment
new file mode 100644
index 00000000..d2a0b45e
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="picca"
+ subject="comment 4"
+ date="2014-11-25T20:01:12Z"
+ content="""
+I saw that there is an haskell binding for augeas.
+
+Maybe this could be a nice uniform interface to deal with all the system configuration files.
+then no need to deal with the config file formats.
+
+"""]]
diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment
new file mode 100644
index 00000000..d670fa3b
--- /dev/null
+++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 5"
+ date="2014-11-27T08:17:36Z"
+ content="""
+Just looked at augeas, and add it to propellor would be great. Much more robust than Propellor.Property.File.{containsLine,containsLines,lacksLine}, at least.
+"""]]
diff --git a/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn
new file mode 100644
index 00000000..0815b4b3
--- /dev/null
+++ b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn
@@ -0,0 +1 @@
+How can I modify the configuration of a managed host (which seems to be stored in /usr/local/propellor/.git/config) from the host on which I run propellor?
diff --git a/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment
new file mode 100644
index 00000000..f034a377
--- /dev/null
+++ b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-10-31T14:40:33Z"
+ content="""
+I'm curious what you need to configure there..
+
+But, there seems to be a simple solution: Add a Property that configures
+the .git/config however you need to! :)
+"""]]
diff --git a/doc/forum/propellor_with_no_central_repository__63__.mdwn b/doc/forum/propellor_with_no_central_repository__63__.mdwn
new file mode 100644
index 00000000..5f322878
--- /dev/null
+++ b/doc/forum/propellor_with_no_central_repository__63__.mdwn
@@ -0,0 +1 @@
+Is there a way to use propellor with no central repository?
diff --git a/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment b/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment
new file mode 100644
index 00000000..1f1456c5
--- /dev/null
+++ b/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-10-31T14:39:48Z"
+ content="""
+Not yet, but see [[todo/git_push_over_propellor_ssh_channel]]
+"""]]
diff --git a/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment b/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment
new file mode 100644
index 00000000..6a6aa946
--- /dev/null
+++ b/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""yay!"""
+ date="2014-11-19T01:31:14Z"
+ content="""
+propellor now supports this mode by default, just use `propellor --spin
+hostname` and the changes in the local repo will be pushed and deployed to
+the host, w/o needing a centralized git repo.
+"""]]
diff --git a/doc/forum/property_combinator_ordering.mdwn b/doc/forum/property_combinator_ordering.mdwn
new file mode 100644
index 00000000..25549bb4
--- /dev/null
+++ b/doc/forum/property_combinator_ordering.mdwn
@@ -0,0 +1,8 @@
+when I write
+
+ setDistribution cfg = f `File.hasContent` cfg
+ `onChange` update
+ `requires` File.dirExists confDir
+
+is update called before ensuring the confiDir Exist ?
+It seems to me but who knows ?
diff --git a/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment b/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment
new file mode 100644
index 00000000..c41abd90
--- /dev/null
+++ b/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment
@@ -0,0 +1,31 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-12-01T15:53:11Z"
+ content="""
+I think that should behave intuitively, but of course if you're unsure
+of this kind of thing, adding parens is a good way to disambiguate the
+code.
+
+ (f `File.hasContent` cfg `onChange` update)
+ `requires` File.dirExists confDir
+
+Written that way, it's explicit that the parenthesized part runs
+together as one action.
+
+Or, we can do a quick test in ghci:
+
+ joey@darkstar:~/src/propellor/src#joeyconfig>ghci Propellor.hs Propellor/Property.hs
+ *Propellor> let f1 = property "hasContent" (liftIO (print "f1") >> return MadeChange)
+ *Propellor> let f2 = property "update" (liftIO (print "f2") >> return MadeChange)
+ *Propellor> let f3 = property "dirExists" (liftIO (print "f3") >> return MadeChange)
+ *Propellor> runPropellor (Host "foo" [] mempty) $ ensureProperty $ f1 `onChange` f2 `requires` f3
+ "dirExists"
+ "hasContent"
+ "update"
+ MadeChange
+
+So, yes, it's behaving as it should, first ensuring that the `requires`
+property is met, and then running the main property, and since it made a
+change, following up by running the `onChange` property.
+"""]]
diff --git a/doc/news/propellor_demo.mdwn b/doc/news/propellor_demo.mdwn
new file mode 100644
index 00000000..362f56e6
--- /dev/null
+++ b/doc/news/propellor_demo.mdwn
@@ -0,0 +1,8 @@
+A quick demo of propellor.
+
+<video controls src="http://downloads.kitenet.net/talks/propellor_demo/propellor_demo.webm"></video>
+
+[video](http://downloads.kitenet.net/talks/propellor_demo/propellor_demo.webm)
+
+(Audio quality is clipped/fast in places, unfortunately this was a problem
+with the source recording.)
diff --git a/doc/news/version_1.1.0.mdwn b/doc/news/version_1.1.0.mdwn
new file mode 100644
index 00000000..4bf09cc4
--- /dev/null
+++ b/doc/news/version_1.1.0.mdwn
@@ -0,0 +1,33 @@
+propellor 1.1.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * --spin target --via relay causes propellor to bounce through an
+ intermediate relay host, which handles any necessary uploads
+ when provisioning the target host.
+ * --spin can be passed multiple hosts, and it will provision each host
+ in turn.
+ * Add --merge, to combine multiple --spin commits into a single, more useful
+ commit.
+ * Hostname parameters not containing dots are looked up in the DNS to
+ find the full hostname.
+ * propellor --spin can now deploy propellor to hosts that do not have
+ git, ghc, or apt-get. This is accomplished by uploading a fairly
+ portable precompiled tarball of propellor.
+ * Propellor.Property.OS contains properties that can be used to do a clean
+ reinstall of the OS of an existing host. This can be used, for example,
+ to do an in-place conversion from Fedora to Debian.
+ This is experimental; use with caution!
+ * Added group-related properties. Thanks, Félix Sipma.
+ * Added Git.barerepo. Thanks, Félix Sipma.
+ * Added Grub.installed and Grub.boots properties.
+ * New HostContext can be specified when a PrivData value varies per host.
+ * hasSomePassword and hasPassword now default to using HostContext.
+ To specify a different context, use hasSomePassword' and
+ hasPassword' (API change)
+ * hasSomePassword and hasPassword now make sure shadow passwords are enabled.
+ * cron.runPropellor now runs propellor, rather than using its Makefile.
+ This is more robust.
+ * propellor.debug can be set in the git config to enable more persistent
+ debugging output.
+ * Run apt-cache policy with LANG=C so it works on other locales.
+ * endAction can be used to register an action to run once propellor
+ has successfully run on a host."""]] \ No newline at end of file
diff --git a/doc/news/version_1.2.0.mdwn b/doc/news/version_1.2.0.mdwn
new file mode 100644
index 00000000..6ea5581e
--- /dev/null
+++ b/doc/news/version_1.2.0.mdwn
@@ -0,0 +1,9 @@
+propellor 1.2.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Display a warning when ensureProperty is used on a property which has
+ Info and is so prevented from propigating it.
+ * Removed boolProperty; instead the new toResult can be used. (API change)
+ * Include Propellor.Property.OS, which was accidentially left out of the
+ cabal file in the last release.
+ * Fix Apache.siteEnabled to update the config file and reload apache when
+ configuration has changed."""]] \ No newline at end of file
diff --git a/doc/news/version_1.2.1.mdwn b/doc/news/version_1.2.1.mdwn
new file mode 100644
index 00000000..59dd4cee
--- /dev/null
+++ b/doc/news/version_1.2.1.mdwn
@@ -0,0 +1,6 @@
+propellor 1.2.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added CryptPassword to PrivDataField, for password hashes as produced
+ by crypt(3).
+ * User.hasPassword and User.hasSomePassword will now use either
+ a CryptPassword or a Password from privdata, depending on which is set."""]] \ No newline at end of file
diff --git a/doc/news/version_1.2.2.mdwn b/doc/news/version_1.2.2.mdwn
new file mode 100644
index 00000000..c10940fd
--- /dev/null
+++ b/doc/news/version_1.2.2.mdwn
@@ -0,0 +1,4 @@
+propellor 1.2.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Revert ensureProperty warning message, too many false positives in places
+ where Info is correctly propigated. Better approach needed."""]] \ No newline at end of file
diff --git a/doc/news/version_1.3.0.mdwn b/doc/news/version_1.3.0.mdwn
new file mode 100644
index 00000000..87abb2f7
--- /dev/null
+++ b/doc/news/version_1.3.0.mdwn
@@ -0,0 +1,17 @@
+propellor 1.3.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * --spin checks if the DNS matches any configured IP address property
+ of the host, and if not, sshes to the host by IP address.
+ * Detect #774376 and refuse to use docker if the system is so broken
+ that docker exec doesn't enter a chroot.
+ * Update intermediary propellor in --spin --via
+ * Added support for DNSSEC.
+ * Ssh.hostKey and Ssh.hostKeys no longer install public keys from
+ the privdata. Instead, the public keys are included in the
+ configuration. (API change)
+ * Ssh.hostKeys now removes any host keys of types that the host is not
+ configured to have.
+ * sshPubKey is renamed to Ssh.pubKey, and has an added SshKeyType
+ parameter. (API change)
+ * CloudAtCost.deCruft no longer forces randomHostKeys.
+ * Fix build with process 1.2.1.0."""]] \ No newline at end of file
diff --git a/doc/security.mdwn b/doc/security.mdwn
index 12ae18de..831b2b41 100644
--- a/doc/security.mdwn
+++ b/doc/security.mdwn
@@ -29,7 +29,7 @@ in cleartext private data such as passwords, ssh private keys, etc.
Instead, `propellor --spin $host` looks for a
`~/.propellor/privdata/privdata.gpg` file and if found decrypts it,
-extracts the private that that the $host needs, and sends it to to the
+extracts the private data that the $host needs, and sends it to to the
$host using ssh. This lets a host know its own private data, without
seeing all the rest.
diff --git a/doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment b/doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment
new file mode 100644
index 00000000..4ed9ecdb
--- /dev/null
+++ b/doc/security/comment_1_6b4d8f45fc60f12b2b8c41046390cf43._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Is it ok to publish to a public repository?"
+ date="2014-08-29T21:13:19Z"
+ content="""
+It is not clear to me whether or not it is safe to publish my own propellor repository to a publicly hosted service. It seems to me that when I do ./propellor --add-key MYKEYID, the private key data is stored in the repository as a commit, so pushing it exposes this data to the public. Am I wrong?
+
+Thanks
+"""]]
diff --git a/doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment b/doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment
new file mode 100644
index 00000000..4d209b03
--- /dev/null
+++ b/doc/security/comment_2_7cd009d097b01bb3197210b5ea77c7d5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="131.252.200.111"
+ subject="comment 2"
+ date="2014-08-29T21:52:02Z"
+ content="""
+--add-key puts your **public** key in the repository, not the private key.
+"""]]
diff --git a/doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment b/doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment
new file mode 100644
index 00000000..4d75842d
--- /dev/null
+++ b/doc/security/comment_3_91876d995c40a24858bce61a749a3c16._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Remote host fails to connect"
+ date="2014-08-30T06:40:33Z"
+ content="""
+Makes sense of course, but the message one gets when doing that is a bit misleading.
+
+I ran into another issue: propellor deploys itself to remote host, but then the propellor instance run on remote host cannot read the remote git repo, because:
+
+1. the host key is not initially present in root's known_hosts, then
+2. the user's (root) public key is unknown to the remote git repo, in my case bitbucket.org, and the URL used is git@bitbucket.org:abailly/capital-match-infra.git which implies connection goes through SSH
+
+I am puzzled: Does this mean I should add some for use by the remote host deployed to? This does not make sense so there should be another way... If I change the origin url to use https, then I cannot push locally anymore.
+
+Thanks for your help
+"""]]
diff --git a/doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment b/doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment
new file mode 100644
index 00000000..b2ac4d57
--- /dev/null
+++ b/doc/security/comment_4_347ce6a229a2347c5fd945eef72fd7f7._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Output from propellor --spin $host"
+ date="2014-08-30T07:17:52Z"
+ content="""
+Here is the output (truncated):
+
+
+ Permission denied (publickey).
+ fatal: Could not read from remote repository.
+
+ Please make sure you have the correct access rights
+ and the repository exists.
+ Git fetch ... failed
+ fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.
+ Use '--' to separate paths from revisions, like this:
+ 'git <command> [<revision>...] -- [<file>...]'
+ propellor: user error (git [\"log\",\"-n\",\"1\",\"--format=%G?\",\"origin/master\"] exited 128)
+
+
+"""]]
diff --git a/doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment b/doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment
new file mode 100644
index 00000000..cc26f42d
--- /dev/null
+++ b/doc/security/comment_5_0c682e12a21d1477628ff0b80e6505d4._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmtnXa0F3OsNh8H7yf5EEbtuufPZG-3StI"
+ nickname="Arnaud"
+ subject="Got it working..."
+ date="2014-08-31T12:50:17Z"
+ content="""
+OK, I manage to get my first propellor config run fine by setting different branch.master.url and branch.master.pushUrl configurations:
+
+* Use a https:// based url for the first
+* Use a git:// based url for the second
+
+I had to nuke the remote /usr/local/propellor directory because it still had wrong configuration with a single remote url.
+"""]]
diff --git a/doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment b/doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment
new file mode 100644
index 00000000..be8ac7f9
--- /dev/null
+++ b/doc/security/comment_6_e5f2fdced08fb823efed35684110a840._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 6"""
+ date="2014-11-19T01:35:59Z"
+ content="""
+@Arnaud, see [[centralized_repository]], including its documentation of a
+"deploy" remote, which can be used to configure the url that remote hosts
+should pull from.
+
+Also, propellor can be used now without any centralized repository.
+"""]]
diff --git a/doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment b/doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment
new file mode 100644
index 00000000..e9d20642
--- /dev/null
+++ b/doc/security/comment_7_ebbb6f3617c879715a35900a07ea1909._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkgUir7k_amh9RFp4D3QutX1fGh_nd7ko4"
+ nickname="Philipp"
+ subject="Passwords in PrivData"
+ date="2014-12-13T18:25:23Z"
+ content="""
+I wonder if there could be a shortcut in PrivData handling that hashes the input with crypt() instead of passing it raw to a machine. For instance passwords are stored in plain on the target machines, while this is not required to set the password in shadow: the hash would suffice. I think this page should at least spell out that fact.
+"""]]
diff --git a/doc/todo/editor_for_privdata__63__.mdwn b/doc/todo/editor_for_privdata__63__.mdwn
new file mode 100644
index 00000000..8b91338c
--- /dev/null
+++ b/doc/todo/editor_for_privdata__63__.mdwn
@@ -0,0 +1,4 @@
+Would adding a way to call $EDITOR to edit privdata be possible?
+It would make sense for editing data like logcheck files.
+
+> [[done]]
diff --git a/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment b/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment
new file mode 100644
index 00000000..bbe93fe3
--- /dev/null
+++ b/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ subject="comment 2"
+ date="2014-11-11T21:16:09Z"
+ content="""
+Already exists in `propellor --edit`
+
+Documentation patches accepted! :)
+"""]]
diff --git a/doc/todo/etckeeper.mdwn b/doc/todo/etckeeper.mdwn
new file mode 100644
index 00000000..7dc80cef
--- /dev/null
+++ b/doc/todo/etckeeper.mdwn
@@ -0,0 +1 @@
+It would be cool to have an etckeeper module :-).
diff --git a/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment b/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment
new file mode 100644
index 00000000..f080f70e
--- /dev/null
+++ b/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-06T15:46:56Z"
+ content="""
+All I've needed for this is `& Apt.installed ["etckeeper"]`
+
+Patches welcome, I suppose.
+"""]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn b/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn
new file mode 100644
index 00000000..046f4a6f
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn
@@ -0,0 +1,3 @@
+Sometimes I forget to commit a modification, and running "propellor --spin" automatically commits this stuff. It would be better if "propellor --spin" failed (or, even better, warned the user) that there are uncommited changes, and "propellor --spin" would just always add an empty commit.
+
+> --merge added; [[done]] --[[Joey]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment
new file mode 100644
index 00000000..19b2fab6
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-23T18:41:40Z"
+ content="""
+Letting --spin commit is part of my workflow. It's great when you're just
+changing config.hs to quickly blast out the changes.
+
+Granted, it is not so nice when doing Property development, as changes get
+fragmented across the spins used to test them. I'd be happy to find some
+way to improve that. Perhaps a way could be found to get this structure of
+git commits:
+
+ manual commit------------------------->manual commit--merge
+ \--spin--spin--spin--spin--spin------------/
+
+Where the second manual commit has an identical tree committed as does the
+spin just underneath it, and so the following merge doesn't change any files,
+just grafts the two branches back together.
+
+I guess that could be handled by haing a checkpoint command, that squashes
+all the previous spins since the last checkpoint together into one commit,
+lets the user edit the commit message of that, and the juggles the branches
+into place and creates the merge commit -- which then becomes the new last
+checkpoint.
+
+I'll take patches for such a thing, or more simply a way to configure --spin's
+auto-committing behavior. However, I don't want to change the default
+behavior to not commit.
+"""]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment
new file mode 100644
index 00000000..3e8e5f62
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="gueux"
+ subject="comment 2"
+ date="2014-11-23T20:23:24Z"
+ content="""
+Your solution seems a lot better :-).
+"""]]
diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment
new file mode 100644
index 00000000..8ad6ab49
--- /dev/null
+++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2014-11-23T21:12:19Z"
+ content="""
+Here's a almost-script to do it, which worked when it did it by hand:
+
+<pre>
+get old-head (git show-ref HEAD -s)
+get curr-branch (refs/heads/master eg)
+find old-commit (look back through git log for the first commit that was not "propellor spin")
+git reset old-commit
+git commit -a # user gets to edit commit message for all the spins and any staged changes here
+git merge -S -s ours old-head
+get current-commit (result of merge)
+git update-ref curr-branch current-commit
+git checkout curr-branch
+</pre>
+"""]]
diff --git a/doc/todo/git_push_over_propellor_ssh_channel.mdwn b/doc/todo/git_push_over_propellor_ssh_channel.mdwn
new file mode 100644
index 00000000..c6d42fcf
--- /dev/null
+++ b/doc/todo/git_push_over_propellor_ssh_channel.mdwn
@@ -0,0 +1,13 @@
+Propellor currently needs a central git server. And it has a special-cased
+protocol during bootstrap that transfers the git repo over to a new host,
+using the ssh connection that will be used to run propellor.
+
+This could be improved by making a git push be done whenever
+`propellor spin $host` runs. The remote propellor runs `git receive-pack`;
+the local one runs `git send-pack`.
+
+Then there would be no need for a central git repo. Although still very
+useful if you have multiple propellor driven hosts and you want to just git
+commit and let cron sort them out.
+
+> [[done]]! --[[Joey]]
diff --git a/doc/todo/info_propigation_out_of_nested_properties.mdwn b/doc/todo/info_propigation_out_of_nested_properties.mdwn
index 1a586be6..b08e326f 100644
--- a/doc/todo/info_propigation_out_of_nested_properties.mdwn
+++ b/doc/todo/info_propigation_out_of_nested_properties.mdwn
@@ -1,7 +1,7 @@
Currently, Info about a Host's Properties is manually gathered and
-propigated. propertyList combines the Info of the Properties in the list.
+propigated. propertyList combines the Info of the Properties in the list;
Docker.docked extracts relevant Info from the Properties of the container
-(but not al of it, intentionally!).
+(but not al of it, intentionally!); etc.
This works, but it's error-prone. Consider this example:
@@ -9,26 +9,91 @@ This works, but it's error-prone. Consider this example:
(Just (System (Debian Unstable) _)) -> ensureProperty foo
_ -> ensureProperty bar
-Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info.
-Of course, only one of them will be run, and only its info should be propigated
-out..
+Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info. Of
+course, only one of them will be run, and only its info should be
+propigated out..
-This commonly afflicts eg, privData. For example, `User.hasPassword'`
-has this problem, and this prevents --list-fields from listing privdata
-that's not set from that property.
+----
One approach might be to make the Propellor monad be able to be run in two
-modes. In one mode, it actually perform IO, etc. In the other mode, all
-liftIO is a no-op, but all Info encountered is accumulated using a Reader
-monad. This might need two separate monad definitions.
-
-That is surely doable, but the withOS example above shows a problem with it --
-the OS is itself part of a Host's info, so won't be known until all its
-properties have been examined for info!
-
-Perhaps that can be finessed. We don't really need to propigate out OS info.
-Just DNS and PrivDataField Info. So info could be collected in 2 passes,
-first as it's done now by static propertyInfo values. Then take that
-and use it as the Info when running the Properties in the Reader monad.
-Combine what the Reader accumulates with the static info to get the full
-info.
+modes. In run mode, it actually performs IO, etc. In introspection mode, all
+liftIO is a no-op, but all Info encountered is accumulated using a Reader.
+This might need two separate monad definitions.
+
+That is surely doable, but consider this example:
+
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then ensureProperty foo
+ else ensureProperty bar
+
+In introspection mode, the liftIO is a no-op, but needs to return a Bool.
+That seems unlikely (how to pick which?), but even if some defaulting is
+used, only one of foo or bar's info will be seen.
+
+----
+
+Another approach could be something like this:
+
+ withInfoFrom foo $ \callfoo ->
+ withInfoFrom bar $ \callbar ->
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then callfoo
+ else callbar
+
+Here withInfoFrom is able to add foo and bar's Info to the info of the
+property that (may) call them.
+
+This approach is not fully type safe; it would be possible to call
+withInfoFrom in a way that didn't let it propigate the info.
+
+Also it has the problem that it doesn't support this:
+
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then do
+ foop <- liftIO getFooParam
+ ensureProperty (foo foop)
+ else ensureProperty bar
+
+----
+
+Another approach would be to add a new SimpleProperty, which is a property
+that has no Info. Only allow calling ensureProperty on this new type.
+
+(Or, remove propertyInfo from Property, and add a new InfoProperty that
+has the info.)
+
+But, propertyList can only contain one type at a time,
+not a mixed list of Property and SimpleProperty.
+
+Could a GADT be used instead?
+
+ {-# LANGUAGE GADTs #-}
+ {-# LANGUAGE EmptyDataDecls #-}
+
+ data HasInfo
+ data NoInfo
+
+ data Property = IProperty (GProperty HasInfo) | SProperty (GProperty NoInfo)
+
+ data GProperty i where
+ GIProperty :: Desc -> Propellor Result -> Info -> GProperty HasInfo
+ GSProperty :: Desc -> Propellor Result -> GProperty NoInfo
+
+ ensureProperty :: GProperty NoInfo -> Propellor Result
+ ensureProperty (GSProperty d r) = r
+
+That works. I made a `gadtwip` git branch that elaborated on that,
+to the point that Property.File compiles, but is otherwise
+unfinished. Most definitions of `Property` need to be changed to
+`GProperty NoInfo`, so that ensureProperty can call them. It's a big,
+intrusive change, and it may complicate propellor too much.
+
+(I may need to make instances of Prop for `GProperty NoInfo` and `GProperty
+HasInfo`, if that's possible, and make more Property combinators work on
+Prop.)
diff --git a/doc/todo/port_info_for_properties_for_firewall.mdwn b/doc/todo/port_info_for_properties_for_firewall.mdwn
new file mode 100644
index 00000000..efaaba05
--- /dev/null
+++ b/doc/todo/port_info_for_properties_for_firewall.mdwn
@@ -0,0 +1,24 @@
+The firewall module could be improved if properties that set up a service
+on a port included info (see Propellor.Info and Propellor.Types.Info)
+about the port(s) used.
+
+While currently the ports have to be explicitly listed:
+
+ & Apache.installed
+ & Firewall.installed
+ & Firewall.addRule (Rule INPUT ACCEPT (Proto TCP :- Port 80))
+ & Firewall.addRule (Rule INPUT ACCEPT (Proto TCP :- Port 443))
+
+Instead the ports would be derived from the installed services.
+
+ & Apache.installed
+ & Firewall.installed
+
+There could also be some combinators to adjust the exposed
+ports of a property.
+
+ & localOnly Apache.installed
+ & exposedPorts [443,80] (Apt.serviceInstalledRunning "apache2")
+
+Such port enformation is also going to be needed as a basis of
+[[type_level_port_conflict_detection]]. --[[Joey]]
diff --git a/doc/todo/type_level_port_conflict_detection.mdwn b/doc/todo/type_level_port_conflict_detection.mdwn
new file mode 100644
index 00000000..5aec5775
--- /dev/null
+++ b/doc/todo/type_level_port_conflict_detection.mdwn
@@ -0,0 +1,5 @@
+See <http://stackoverflow.com/questions/26027765/using-types-to-prevent-conflicting-port-numbers-in-a-list> --[[Joey]]
+
+Needs ghc newer than 7.6.3. It may be possible to port Data.Type.Equality
+and Data.Type.Bool to older versions; I got them to compile but they didn't
+work right. --[[Joey]]
diff --git a/privdata.joey/keyring.gpg b/privdata.joey/keyring.gpg
deleted file mode 100644
index 01dd24e7..00000000
--- a/privdata.joey/keyring.gpg
+++ /dev/null
Binary files differ
diff --git a/privdata.joey/privdata.gpg b/privdata.joey/privdata.gpg
deleted file mode 100644
index 1e3c2182..00000000
--- a/privdata.joey/privdata.gpg
+++ /dev/null
@@ -1,858 +0,0 @@
------BEGIN PGP MESSAGE-----
-Version: GnuPG v1
-
-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
-=tleV
------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"