diff options
47 files changed, 644 insertions, 775 deletions
@@ -1 +1 @@ -config-joey.hs
\ No newline at end of file +config-simple.hs
\ No newline at end of file diff --git a/debian/rules b/debian/rules index c553132f..bcb681c1 100755 --- a/debian/rules +++ b/debian/rules @@ -1,4 +1,4 @@ -#!/bin/false +#!/usr/bin/make -f # Avoid using cabal, as it writes to $HOME export CABAL=./Setup diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn new file mode 100644 index 00000000..b678d8d0 --- /dev/null +++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file.mdwn @@ -0,0 +1,34 @@ +Hello, + +Still working on the reprepro property :) + +Here A property that I am using to publish a repository via apache (this is a prototype) + + website :: String -> Property + website hn = toProp $ Apache.siteEnabled hn apachecfg + where + apachecfg = [ "<VirtualHost *>" + , "DocumentRoot " ++ basePath + , "<Directory " ++ basePath ++ ">" + , " Options Indexes FollowSymLinks Multiviews" + , " Order allow,deny" + , Apache.allowAll + , "</Directory>" + ] ++ concatMap deny ["db", "conf", "incoming"] + ++ ["</VirtualHost>"] + + deny dir = [ "<Directory \"" ++ basePath ++ "apt/*/" ++ dir ++ "\">" + , " Order deny,allow" + , " Deny from all" + , "</Directory>" + ] + +during my test I am runing the config.hs with +runhaskell config.hs (it work the first time, the apache config files are ok) + +but when I do a modification on the apachecfg and rerun the runhaskell, +the config files are not updated. I need to remove them to have an updated version. + +cheers + +Fred diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment new file mode 100644 index 00000000..0101ccb2 --- /dev/null +++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_1_932ba6f4e444c99d8d561149d17c8fe7._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="picca" + subject="first run" + date="2014-12-08T09:31:46Z" + content=""" +root@mordor:~/propellor/src# PROPELLOR_DEBUG=1 runhaskell config.hs +[2014-12-08 10:27:10 CET] read: hostname [\"-f\"] +[2014-12-08 10:27:10 CET] command line: Run \"mordor\" +[2014-12-08 10:27:10 CET] read: git [\"remote\"] +[2014-12-08 10:27:10 CET] read: git [\"symbolic-ref\",\"--short\",\"HEAD\"] +[2014-12-08 10:27:10 CET] call: git [\"fetch\"] +Pull from central git repository ... done +[2014-12-08 10:27:12 CET] read: git [\"show-ref\",\"--hash\",\"master\"] +[2014-12-08 10:27:12 CET] read: git [\"show-ref\",\"--hash\",\"master\"] +mordor has Operating System (Debian Unstable) \"i386\" ... ok +[2014-12-08 10:27:12 CET] read: apt-cache [\"policy\",\"etckeeper\"] +mordor apt installed etckeeper ... ok +[2014-12-08 10:27:13 CET] read: apt-cache [\"policy\",\"ssh\"] +mordor apt installed ssh ... ok +[2014-12-08 10:27:13 CET] read: passwd [\"-S\",\"root\"] +mordor root has password ... ok +[2014-12-08 10:27:13 CET] call: a2query [\"-q\",\"-s\",\"reprepro\"] +[2014-12-08 10:27:14 CET] read: apt-cache [\"policy\",\"apache2\"] +[2014-12-08 10:27:14 CET] call: a2ensite [\"--quiet\",\"reprepro\"] +Enabling site reprepro. +[2014-12-08 10:27:15 CET] call: sh [\"-c\",\"set -e ; service 'apache2' reload >/dev/null 2>&1 || true\"] +mordor create reprepro ... done +mordor overall ... done + +"""]] diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment new file mode 100644 index 00000000..85a57383 --- /dev/null +++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_2_5323336b92d9aef5a9021b924029f3af._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="picca" + subject="second run with content modified" + date="2014-12-08T09:37:43Z" + content=""" +Second run after adding a space here + + - , \" Options Indexes FollowSymLinks Multiviews\" + + , \" Options Indexes FollowSymLinks Multiviews\" + + + root@mordor:~/propellor/src# PROPELLOR_DEBUG=1 runhaskell config.hs + [2014-12-08 10:34:19 CET] read: hostname [\"-f\"] + [2014-12-08 10:34:19 CET] command line: Run \"mordor\" + [2014-12-08 10:34:19 CET] read: git [\"remote\"] + [2014-12-08 10:34:19 CET] read: git [\"symbolic-ref\",\"--short\",\"HEAD\"] + [2014-12-08 10:34:19 CET] call: git [\"fetch\"] + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (6/6), done. + remote: Total 6 (delta 3), reused 0 (delta 0) + Dépaquetage des objets: 100% (6/6), fait. + Depuis git://git.kitenet.net/propellor + c5a8cae..9ac0dfb master -> origin/master + Pull from central git repository ... done + [2014-12-08 10:34:20 CET] read: git [\"show-ref\",\"--hash\",\"master\"] + [2014-12-08 10:34:20 CET] read: git [\"show-ref\",\"--hash\",\"master\"] + mordor has Operating System (Debian Unstable) \"i386\" ... ok + [2014-12-08 10:34:20 CET] read: apt-cache [\"policy\",\"etckeeper\"] + mordor apt installed etckeeper ... ok + [2014-12-08 10:34:21 CET] read: apt-cache [\"policy\",\"ssh\"] + mordor apt installed ssh ... ok + [2014-12-08 10:34:21 CET] read: passwd [\"-S\",\"root\"] + mordor root has password ... ok + [2014-12-08 10:34:21 CET] call: a2query [\"-q\",\"-s\",\"reprepro\"] + mordor create reprepro ... ok + mordor overall ... ok + +"""]] diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment new file mode 100644 index 00000000..5dc67fb0 --- /dev/null +++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_3_531c2c5e78fb5c62e54d84231b129dc8._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="picca" + subject="comment 3" + date="2014-12-08T10:47:59Z" + content=""" +I forgot to say that the content of + +/etc/apache2/site-xxx/reprepro[.conf] + +is unmodifed after this second run +"""]] diff --git a/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment new file mode 100644 index 00000000..a9201541 --- /dev/null +++ b/doc/forum/Apache.siteEnabled_doesn_not_update_the_apache_config_file/comment_4_54281604c588a7229f9d987e8cdee802._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 4""" + date="2014-12-09T04:35:12Z" + content=""" +Pretty obvious why if you look at the code: + + enable = check (not <$> isenabled) $ + cmdProperty "a2ensite" ["--quiet", hn] + `describe` ("apache site enabled " ++ hn) + `requires` siteAvailable hn cf + +So that property was skipped entirely if the site was already enabled and never looked at the config file. + +I've put in a fix. +"""]] diff --git a/doc/forum/Supported_OS.mdwn b/doc/forum/Supported_OS.mdwn new file mode 100644 index 00000000..f17b9054 --- /dev/null +++ b/doc/forum/Supported_OS.mdwn @@ -0,0 +1,5 @@ +What are the requirements for the configured OS ? Does it need to be Debian ? + +Would Propellor work for Arch linux, RHEL, Windows, AIX or linux on pSeries) ? + +Cheers diff --git a/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment new file mode 100644 index 00000000..3a2055ea --- /dev/null +++ b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-12-07T15:58:03Z" + content=""" +I have heard of propellor being used on OSX. Probably that user wrote their +own code for OSX specific stuff. + +Propellor properites can be parameterized by OS. Currently it has support +for Debian and some untested support for Ubuntu. A property can be parameterized +like this: + + foo :: Property + foo = property "foo" withOS desc $ \o -> case o of + (Just (System (Debian _) _)) -> ensureProperty fooDebian + (Just (System (Ubuntu _) _)) -> ensureProperty fooUbuntu + +The first step for adding a new OS will be to modify <http://hackage.haskell.org/package/propellor-1.0.0/docs/Propellor-Types-OS.html>. +Compilation will then warn about all OS parameterized properties that +need to be updated to support your added OS, and it can be taken from there. + +I'll accept reasonable patches to support other OS's. +"""]] diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn new file mode 100644 index 00000000..c88defcf --- /dev/null +++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac.mdwn @@ -0,0 +1,12 @@ +Hello, + +I am trying propellor on Debian Jessie (haskell is fantastic for this sort or things) to setup one of my computer. + +On my network, the system administrator set proxies for http and https. +These information are available via a http://proxy/proxy.pac URL. + +So I would like to know what should be done to extract this information and set it for all users on the system ? + +Cheers + +Frederic diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment new file mode 100644 index 00000000..6bf8844d --- /dev/null +++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_1_69d7c8fb1d62300456575bb10e935d69._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-11-25T15:44:13Z" + content=""" +You could, for example, use Propellor.Propety.Cmd.cmdProperty +to run a command that sets up the proxying. If there's not a single command +that does it, you could cause propellor to fetch the url and deploy the +info itself. +"""]] diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment new file mode 100644 index 00000000..8458ee49 --- /dev/null +++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_2_da30b2621493e48ceabcfa5732dbcdf8._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="picca" + subject="comment 2" + date="2014-11-25T17:55:25Z" + content=""" +In my case I need to wget the proxy.pac file and parse it to find the right proxy. + +what worried me is that these proxy.pac things are dynamical depending on the ip of the sender AND the receive. +It work nicely with web browser, but not with the unix http_proxy and HTTPS_PROXY env. + +nevertheless, I can create something to parse my local setup and extract the right http_proxy. + +Is there something available in Propellor to set a global environment variable in /etc/environment (the right place for this ?) + +cheers + +Frederic + +"""]] diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment new file mode 100644 index 00000000..9bdcb4df --- /dev/null +++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_3_bd76d169af2ef2f154ad1f0f64506661._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-11-25T19:37:46Z" + content=""" +There's no Property that handles setting global environment currently, but +it's a reasonable one to add. + +I think that /etc/environment is read by `pam_env` logins, but maybe not +other things, so dunno. +"""]] diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment new file mode 100644 index 00000000..d2a0b45e --- /dev/null +++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_4_a6a49d35ee8a05abc982049b55d0397c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="picca" + subject="comment 4" + date="2014-11-25T20:01:12Z" + content=""" +I saw that there is an haskell binding for augeas. + +Maybe this could be a nice uniform interface to deal with all the system configuration files. +then no need to deal with the config file formats. + +"""]] diff --git a/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment new file mode 100644 index 00000000..d670fa3b --- /dev/null +++ b/doc/forum/how_to_set_the_proxy_using_an_automatix_proxy.pac/comment_5_7783b8a96c8032a39ff3b5b446a976ed._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="gueux" + subject="comment 5" + date="2014-11-27T08:17:36Z" + content=""" +Just looked at augeas, and add it to propellor would be great. Much more robust than Propellor.Property.File.{containsLine,containsLines,lacksLine}, at least. +"""]] diff --git a/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn new file mode 100644 index 00000000..0815b4b3 --- /dev/null +++ b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config.mdwn @@ -0,0 +1 @@ +How can I modify the configuration of a managed host (which seems to be stored in /usr/local/propellor/.git/config) from the host on which I run propellor? diff --git a/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment new file mode 100644 index 00000000..f034a377 --- /dev/null +++ b/doc/forum/modify_managed_host_propellor__39__s_.git__47__config/comment_1_da3ebb4736a1f1012b6d27bcd33ff44f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-10-31T14:40:33Z" + content=""" +I'm curious what you need to configure there.. + +But, there seems to be a simple solution: Add a Property that configures +the .git/config however you need to! :) +"""]] diff --git a/doc/forum/propellor_with_no_central_repository__63__.mdwn b/doc/forum/propellor_with_no_central_repository__63__.mdwn new file mode 100644 index 00000000..5f322878 --- /dev/null +++ b/doc/forum/propellor_with_no_central_repository__63__.mdwn @@ -0,0 +1 @@ +Is there a way to use propellor with no central repository? diff --git a/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment b/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment new file mode 100644 index 00000000..1f1456c5 --- /dev/null +++ b/doc/forum/propellor_with_no_central_repository__63__/comment_1_6a2a5068962b17dac08609cd65887f48._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-10-31T14:39:48Z" + content=""" +Not yet, but see [[todo/git_push_over_propellor_ssh_channel]] +"""]] diff --git a/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment b/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment new file mode 100644 index 00000000..6a6aa946 --- /dev/null +++ b/doc/forum/propellor_with_no_central_repository__63__/comment_2_0f035bb4bb5cc13574394505f28abe5e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="joey" + subject="""yay!""" + date="2014-11-19T01:31:14Z" + content=""" +propellor now supports this mode by default, just use `propellor --spin +hostname` and the changes in the local repo will be pushed and deployed to +the host, w/o needing a centralized git repo. +"""]] diff --git a/doc/forum/property_combinator_ordering.mdwn b/doc/forum/property_combinator_ordering.mdwn new file mode 100644 index 00000000..25549bb4 --- /dev/null +++ b/doc/forum/property_combinator_ordering.mdwn @@ -0,0 +1,8 @@ +when I write + + setDistribution cfg = f `File.hasContent` cfg + `onChange` update + `requires` File.dirExists confDir + +is update called before ensuring the confiDir Exist ? +It seems to me but who knows ? diff --git a/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment b/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment new file mode 100644 index 00000000..c41abd90 --- /dev/null +++ b/doc/forum/property_combinator_ordering/comment_1_0ea2186b5cfa7eadaf38ac2e97fc4a2c._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-12-01T15:53:11Z" + content=""" +I think that should behave intuitively, but of course if you're unsure +of this kind of thing, adding parens is a good way to disambiguate the +code. + + (f `File.hasContent` cfg `onChange` update) + `requires` File.dirExists confDir + +Written that way, it's explicit that the parenthesized part runs +together as one action. + +Or, we can do a quick test in ghci: + + joey@darkstar:~/src/propellor/src#joeyconfig>ghci Propellor.hs Propellor/Property.hs + *Propellor> let f1 = property "hasContent" (liftIO (print "f1") >> return MadeChange) + *Propellor> let f2 = property "update" (liftIO (print "f2") >> return MadeChange) + *Propellor> let f3 = property "dirExists" (liftIO (print "f3") >> return MadeChange) + *Propellor> runPropellor (Host "foo" [] mempty) $ ensureProperty $ f1 `onChange` f2 `requires` f3 + "dirExists" + "hasContent" + "update" + MadeChange + +So, yes, it's behaving as it should, first ensuring that the `requires` +property is met, and then running the main property, and since it made a +change, following up by running the `onChange` property. +"""]] diff --git a/doc/news/propellor_demo.mdwn b/doc/news/propellor_demo.mdwn new file mode 100644 index 00000000..362f56e6 --- /dev/null +++ b/doc/news/propellor_demo.mdwn @@ -0,0 +1,8 @@ +A quick demo of propellor. + +<video controls src="http://downloads.kitenet.net/talks/propellor_demo/propellor_demo.webm"></video> + +[video](http://downloads.kitenet.net/talks/propellor_demo/propellor_demo.webm) + +(Audio quality is clipped/fast in places, unfortunately this was a problem +with the source recording.) diff --git a/doc/news/version_1.1.0.mdwn b/doc/news/version_1.1.0.mdwn new file mode 100644 index 00000000..4bf09cc4 --- /dev/null +++ b/doc/news/version_1.1.0.mdwn @@ -0,0 +1,33 @@ +propellor 1.1.0 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * --spin target --via relay causes propellor to bounce through an + intermediate relay host, which handles any necessary uploads + when provisioning the target host. + * --spin can be passed multiple hosts, and it will provision each host + in turn. + * Add --merge, to combine multiple --spin commits into a single, more useful + commit. + * Hostname parameters not containing dots are looked up in the DNS to + find the full hostname. + * propellor --spin can now deploy propellor to hosts that do not have + git, ghc, or apt-get. This is accomplished by uploading a fairly + portable precompiled tarball of propellor. + * Propellor.Property.OS contains properties that can be used to do a clean + reinstall of the OS of an existing host. This can be used, for example, + to do an in-place conversion from Fedora to Debian. + This is experimental; use with caution! + * Added group-related properties. Thanks, Félix Sipma. + * Added Git.barerepo. Thanks, Félix Sipma. + * Added Grub.installed and Grub.boots properties. + * New HostContext can be specified when a PrivData value varies per host. + * hasSomePassword and hasPassword now default to using HostContext. + To specify a different context, use hasSomePassword' and + hasPassword' (API change) + * hasSomePassword and hasPassword now make sure shadow passwords are enabled. + * cron.runPropellor now runs propellor, rather than using its Makefile. + This is more robust. + * propellor.debug can be set in the git config to enable more persistent + debugging output. + * Run apt-cache policy with LANG=C so it works on other locales. + * endAction can be used to register an action to run once propellor + has successfully run on a host."""]]
\ No newline at end of file diff --git a/doc/news/version_1.2.0.mdwn b/doc/news/version_1.2.0.mdwn new file mode 100644 index 00000000..6ea5581e --- /dev/null +++ b/doc/news/version_1.2.0.mdwn @@ -0,0 +1,9 @@ +propellor 1.2.0 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * Display a warning when ensureProperty is used on a property which has + Info and is so prevented from propigating it. + * Removed boolProperty; instead the new toResult can be used. (API change) + * Include Propellor.Property.OS, which was accidentially left out of the + cabal file in the last release. + * Fix Apache.siteEnabled to update the config file and reload apache when + configuration has changed."""]]
\ No newline at end of file diff --git a/doc/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/todo/editor_for_privdata__63__.mdwn b/doc/todo/editor_for_privdata__63__.mdwn new file mode 100644 index 00000000..8b91338c --- /dev/null +++ b/doc/todo/editor_for_privdata__63__.mdwn @@ -0,0 +1,4 @@ +Would adding a way to call $EDITOR to edit privdata be possible? +It would make sense for editing data like logcheck files. + +> [[done]] diff --git a/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment b/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment new file mode 100644 index 00000000..bbe93fe3 --- /dev/null +++ b/doc/todo/editor_for_privdata__63__/comment_2_4fcbdf36f32ca7cf82593a8992167aff._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2014-11-11T21:16:09Z" + content=""" +Already exists in `propellor --edit` + +Documentation patches accepted! :) +"""]] diff --git a/doc/todo/etckeeper.mdwn b/doc/todo/etckeeper.mdwn new file mode 100644 index 00000000..7dc80cef --- /dev/null +++ b/doc/todo/etckeeper.mdwn @@ -0,0 +1 @@ +It would be cool to have an etckeeper module :-). diff --git a/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment b/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment new file mode 100644 index 00000000..f080f70e --- /dev/null +++ b/doc/todo/etckeeper/comment_1_8766da27c69bbae357d497e0e557fad2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-11-06T15:46:56Z" + content=""" +All I've needed for this is `& Apt.installed ["etckeeper"]` + +Patches welcome, I suppose. +"""]] diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn b/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn new file mode 100644 index 00000000..046f4a6f --- /dev/null +++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin.mdwn @@ -0,0 +1,3 @@ +Sometimes I forget to commit a modification, and running "propellor --spin" automatically commits this stuff. It would be better if "propellor --spin" failed (or, even better, warned the user) that there are uncommited changes, and "propellor --spin" would just always add an empty commit. + +> --merge added; [[done]] --[[Joey]] diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment new file mode 100644 index 00000000..19b2fab6 --- /dev/null +++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_1_7267d62ccc8db44bccb935836536e8a1._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 1""" + date="2014-11-23T18:41:40Z" + content=""" +Letting --spin commit is part of my workflow. It's great when you're just +changing config.hs to quickly blast out the changes. + +Granted, it is not so nice when doing Property development, as changes get +fragmented across the spins used to test them. I'd be happy to find some +way to improve that. Perhaps a way could be found to get this structure of +git commits: + + manual commit------------------------->manual commit--merge + \--spin--spin--spin--spin--spin------------/ + +Where the second manual commit has an identical tree committed as does the +spin just underneath it, and so the following merge doesn't change any files, +just grafts the two branches back together. + +I guess that could be handled by haing a checkpoint command, that squashes +all the previous spins since the last checkpoint together into one commit, +lets the user edit the commit message of that, and the juggles the branches +into place and creates the merge commit -- which then becomes the new last +checkpoint. + +I'll take patches for such a thing, or more simply a way to configure --spin's +auto-committing behavior. However, I don't want to change the default +behavior to not commit. +"""]] diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment new file mode 100644 index 00000000..3e8e5f62 --- /dev/null +++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_2_e4d170a14d689bef5d9174b251a4fe6f._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="gueux" + subject="comment 2" + date="2014-11-23T20:23:24Z" + content=""" +Your solution seems a lot better :-). +"""]] diff --git a/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment new file mode 100644 index 00000000..8ad6ab49 --- /dev/null +++ b/doc/todo/fail_if_modification_not_commited_when_using_--spin/comment_3_c69eaa9c6ae5b07b5c2dd2591de965a3._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 3""" + date="2014-11-23T21:12:19Z" + content=""" +Here's a almost-script to do it, which worked when it did it by hand: + +<pre> +get old-head (git show-ref HEAD -s) +get curr-branch (refs/heads/master eg) +find old-commit (look back through git log for the first commit that was not "propellor spin") +git reset old-commit +git commit -a # user gets to edit commit message for all the spins and any staged changes here +git merge -S -s ours old-head +get current-commit (result of merge) +git update-ref curr-branch current-commit +git checkout curr-branch +</pre> +"""]] diff --git a/doc/todo/git_push_over_propellor_ssh_channel.mdwn b/doc/todo/git_push_over_propellor_ssh_channel.mdwn new file mode 100644 index 00000000..c6d42fcf --- /dev/null +++ b/doc/todo/git_push_over_propellor_ssh_channel.mdwn @@ -0,0 +1,13 @@ +Propellor currently needs a central git server. And it has a special-cased +protocol during bootstrap that transfers the git repo over to a new host, +using the ssh connection that will be used to run propellor. + +This could be improved by making a git push be done whenever +`propellor spin $host` runs. The remote propellor runs `git receive-pack`; +the local one runs `git send-pack`. + +Then there would be no need for a central git repo. Although still very +useful if you have multiple propellor driven hosts and you want to just git +commit and let cron sort them out. + +> [[done]]! --[[Joey]] diff --git a/doc/todo/info_propigation_out_of_nested_properties.mdwn b/doc/todo/info_propigation_out_of_nested_properties.mdwn index 1a586be6..e4bb443a 100644 --- a/doc/todo/info_propigation_out_of_nested_properties.mdwn +++ b/doc/todo/info_propigation_out_of_nested_properties.mdwn @@ -1,7 +1,7 @@ Currently, Info about a Host's Properties is manually gathered and -propigated. propertyList combines the Info of the Properties in the list. +propigated. propertyList combines the Info of the Properties in the list; Docker.docked extracts relevant Info from the Properties of the container -(but not al of it, intentionally!). +(but not al of it, intentionally!); etc. This works, but it's error-prone. Consider this example: @@ -9,26 +9,97 @@ This works, but it's error-prone. Consider this example: (Just (System (Debian Unstable) _)) -> ensureProperty foo _ -> ensureProperty bar -Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info. -Of course, only one of them will be run, and only its info should be propigated -out.. +Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info. Of +course, only one of them will be run, and only its info should be +propigated out.. -This commonly afflicts eg, privData. For example, `User.hasPassword'` -has this problem, and this prevents --list-fields from listing privdata -that's not set from that property. +---- + +Currently, ensureProperty detects if it's called on a property with a +non-empty Info, and prints a warning. Would prefer to handle this at the +type level though.. + +---- One approach might be to make the Propellor monad be able to be run in two -modes. In one mode, it actually perform IO, etc. In the other mode, all -liftIO is a no-op, but all Info encountered is accumulated using a Reader -monad. This might need two separate monad definitions. +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 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! +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. -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. +(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 Binary files differdeleted file mode 100644 index 01dd24e7..00000000 --- a/privdata.joey/keyring.gpg +++ /dev/null diff --git a/privdata.joey/privdata.gpg b/privdata.joey/privdata.gpg deleted file mode 100644 index ec14e14b..00000000 --- a/privdata.joey/privdata.gpg +++ /dev/null @@ -1,751 +0,0 @@ ------BEGIN PGP MESSAGE----- -Version: GnuPG v1 - -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 -RFMS/Qn0N5a2wPrlw1WDQUbj5VS1Y+hkzS8fAiMY830l9g5MJDcb7U+bDpIiJV1N -QDV3aMCdJ84Wh9DK9Gw/mVgTjuA14xqt9N31wE293itQb+A6qeWcI5kXB4t5/2Xi -4jl6JEiWzfLOX6Jg0HO6R5ulL3TbgDGkOfZbQluumn2Jwmr51ZCYfUiLoUt5ffLe -a5dFe2lLDViztct/KS2rHMQ1kA093eqNyzek+f+Bgfssid6A0aULN8TVW5RfqMjP -pMNFSaiP7QJGxNvX8PW4PjiFqNGNg01FhFRaKGo5SxqbhdEVjDHkZdtoL/ovLz9i -BafP+EbNX1zx4GpDK4KNzn4YvZEf9OKO++SCDRjl785Gc9zB7AE7lRrvfjmKQjA2 -BMpIuo567Dsj5rMfyHWRFFCYXx+0rpItkEFfxTLs5TFaHc0gpyhCLSNnnsqdvCex -pqLawyd08lEsDA3Cfe+ZoBrJE+Igi1Sdzu+u37VEE0DAI8jZx2NqxHBFhEr4LrDc -9nAe3EDMsQZz6vrj8XLIX5H4+icF9kH0F8ti3I/MEarDfc4JJVXnCSFyohrqcQBX -sK2gXuFVZpww6JnvplGsuZdfvDUe9OF5bB/6Q2rf58t2X7siernKVbxmyFXhOueR -z9qdVpwwwAbp2q1TQBMiPS6vTZVfgjNqTjT2BSx8dRn4KQ01RABkC1Jip6N2ZFp5 -a/zYDz/cQsEDWRMVvw+vo0WTMn9uPaTFf3EmIdvkLgk0r8B1thQLdxDdmKsopWTj -0p3cz2/GiGysGeTNX3zw7M91p5DfJ0t+RpIWNdeyWuhJ2Q9yIawTDzIm5y/GHt11 -S20KiDrD83y3ycII8d/nVA0OWpOR7bfYNJuwnOqQLzXSIYDWslbpakK9HdlYhF7e -w+NgqDjrqs4nVaOu0SB5Ez7bRYGN9y7dGxzTu7wT/Q9HfZRUqFMTtmzDXD9uDXnr -ukmLpYjHEWn1oAGS3mU0K//wuX+xA1VA6bP/8Adaaiks95jTxIXucD5eh1jj+cRd -+UtMXmZvWdkQ/CNmpGoXn6c6NuDZZ3tPHpIaYJAYKAhq9BqFtIXyORKzDa0BeH2I -7AwmPli94uZE/yFv5H3FU7PSvUPqXaKPsIq999YzRofIie1vsFAAEJROVCVCAztF -5oqjwia9NIduO4+CfduwJeM+cMdXQRcV93FdFJVDYmdPd+ag30phJVzM6g91hy8U -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 -D2HIWUtfsGH91A/5sWbz738FOOWOy26+nQ== -=NAqV ------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" |
