From 815d8cc8cdb22a155062afdfc5e87f9bdf2d7830 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 10:03:43 +0200 Subject: [PATCH 0001/4996] no incompat between 1.3 and 1.5 Signed-off-by: Nico Schottelius --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 3a4b2051..1fd28ffd 100644 --- a/README +++ b/README @@ -166,7 +166,7 @@ If you stay on a version branche (i.e. 1.0, 1.1., ...), nothing should break. The master branch on the other hand is the development branch and may not be working, break your setup or eat the tree in your garden. -### Upgrading from 1.3 to 1.4 +### Upgrading from 1.3 to 1.5 No incompatiblities. From 659bb1d1ac53d0bcab69fec07cd99a8d6180bb72 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 10:47:09 +0200 Subject: [PATCH 0002/4996] create reference in man7 Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index 48954b8e..6358db9c 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -28,7 +28,7 @@ __cdist_myname=${0##*/}; __cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname" filename="${__cdist_myname%.sh}" -dest="$__cdist_abs_mydir/$filename" +dest="$__cdist_abs_mydir/man7/$filename" cd "$__cdist_abs_mydir" From 8828a69d608505d7c52fd6d9f942dcbe259ede46 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 11:04:31 +0200 Subject: [PATCH 0003/4996] unignore doc/man and update cdist-best-practice.text Signed-off-by: Nico Schottelius --- .gitignore | 4 +++- doc/man/man7/cdist-best-practice.text | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 68f829dc..89dba856 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,9 @@ # Ignore generated manpages doc/man/.marker -doc/man/man*/ +doc/man/man1/*.1 +doc/man/man7/*.7 +doc/man/man*/*.html # Ignore cache for version control cache/ diff --git a/doc/man/man7/cdist-best-practice.text b/doc/man/man7/cdist-best-practice.text index febe8f36..666dd414 100644 --- a/doc/man/man7/cdist-best-practice.text +++ b/doc/man/man7/cdist-best-practice.text @@ -60,6 +60,20 @@ machine-a % git clone git://your-git-server/cdist machine-b % git clone git://your-git-server/cdist -------------------------------------------------------------------------------- +SEPERATING WORK BY GROUPS +------------------------- +If you are working with different groups on one cdist-configuration, +you can delegate to other manifests and have the groups edit only +their manifests. You can use the following snippet in +**conf/manifests/init**: + +-------------------------------------------------------------------------------- +# Include other groups +sh -e "$__manifest/systems" + +sh -e "$__manifest/cbrg" +-------------------------------------------------------------------------------- + SEE ALSO -------- From 2d30dd6aad6617a0e7ecfba16cece7fdb85cddfa Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 1 Apr 2011 11:12:15 +0200 Subject: [PATCH 0004/4996] update to match new location of cdist-reference.text Signed-off-by: Steven Armstrong --- build.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index ab62287e..2df76539 100755 --- a/build.sh +++ b/build.sh @@ -57,12 +57,12 @@ case "$1" in for src in ${MANDIR}/man${section}/*.text; do manpage="${src%.text}.$section" if [ ! -f "$manpage" -o "$manpage" -ot "$src" ]; then - echo "Compiling manpage for $src" + echo "Compiling man page for $src" $A2XM "$src" fi htmlpage="${src%.text}.html" if [ ! -f "$htmlpage" -o "$htmlpage" -ot "$src" ]; then - echo "Compiling html for $src" + echo "Compiling html page for $src" $A2XH "$src" fi done @@ -99,7 +99,6 @@ case "$1" in ;; clean) - rm -f ${MANDIR}/cdist-reference.text find "${MANDIR}" -mindepth 2 -type l \ -o -name "*.1" \ -o -name "*.7" \ From afb1bf2373ce93b996681e0e5d5945848a894633 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 11:22:35 +0200 Subject: [PATCH 0005/4996] ignore type manpages and docbook stuff Signed-off-by: Nico Schottelius --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 89dba856..57950f3b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ doc/man/.marker doc/man/man1/*.1 doc/man/man7/*.7 doc/man/man*/*.html +doc/man/man7/cdist-type__*.text +doc/man/man*/docbook-xsl.css # Ignore cache for version control cache/ From 422bfd57d4664ab803461d4e45aaa70855f6c978 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 11:30:55 +0200 Subject: [PATCH 0006/4996] document multiple configuration workflow Signed-off-by: Nico Schottelius --- doc/man/man7/cdist-best-practice.text | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/doc/man/man7/cdist-best-practice.text b/doc/man/man7/cdist-best-practice.text index 666dd414..aa499790 100644 --- a/doc/man/man7/cdist-best-practice.text +++ b/doc/man/man7/cdist-best-practice.text @@ -75,6 +75,37 @@ sh -e "$__manifest/cbrg" -------------------------------------------------------------------------------- +MAINTAINING MULTIPLE CONFIGURATIONS +----------------------------------- +When you need to manage multiple sites with cdist, like company_a, company_b +and private for instance, you can easily use git for this purpose. +Including a possible common base that is reused accross the different sites: + +-------------------------------------------------------------------------------- +# create branches +git branch company_a company_b common private + +# make stuff for company a +git checkout company_a +# work, commit, etc. + +# make stuff for company b +git checkout company_b +# work, commit, etc. + +# make stuff relevant for all sites +git checkout common +# work, commit, etc. + +# change to private and include latest common stuff +git checkout private +git merge common +-------------------------------------------------------------------------------- + +Have a look at git-remote(1) to adjust the remote configuration, which allows +you to push certain branches to certain remotes. + + SEE ALSO -------- - cdist(7) From 2c3d71a7e7e43a7af275a93c991dadc51fd95a15 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 12:11:30 +0200 Subject: [PATCH 0007/4996] update todos Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 4 ---- doc/dev/todo/niconext | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index 67afba55..7a8c4583 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -45,7 +45,3 @@ Cache: - export variable $__cache -> for current host -> add function to cdist-config, import from cdist-cache - - -remove --preseed from package_apt and add debconf_set_selection or similar - -> much cleaner! diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index 29229d64..e7f2c72f 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1 +1,2 @@ -Release 1.5.0 correctly :-) +remove --preseed from package_apt and add debconf_set_selection or similar + -> much cleaner! From 48a96591d14910748744e256975c3fb55795f055 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 12:11:50 +0200 Subject: [PATCH 0008/4996] add template for type __debconf_set_selections/ Signed-off-by: Nico Schottelius --- .../explorer/pkg_status | 31 ++++++++++ .../__debconf_set_selections/gencode-remote | 53 +++++++++++++++++ conf/type/__debconf_set_selections/man.text | 59 +++++++++++++++++++ .../parameter/optional | 3 + .../parameter/required | 1 + 5 files changed, 147 insertions(+) create mode 100755 conf/type/__debconf_set_selections/explorer/pkg_status create mode 100755 conf/type/__debconf_set_selections/gencode-remote create mode 100644 conf/type/__debconf_set_selections/man.text create mode 100644 conf/type/__debconf_set_selections/parameter/optional create mode 100644 conf/type/__debconf_set_selections/parameter/required diff --git a/conf/type/__debconf_set_selections/explorer/pkg_status b/conf/type/__debconf_set_selections/explorer/pkg_status new file mode 100755 index 00000000..86b94825 --- /dev/null +++ b/conf/type/__debconf_set_selections/explorer/pkg_status @@ -0,0 +1,31 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Retrieve the status of a package - parsed dpkg output +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +# Except dpkg failing, if package is not known / installed +dpkg -s "$name" 2>/dev/null || exit 0 diff --git a/conf/type/__debconf_set_selections/gencode-remote b/conf/type/__debconf_set_selections/gencode-remote new file mode 100755 index 00000000..b2c7179d --- /dev/null +++ b/conf/type/__debconf_set_selections/gencode-remote @@ -0,0 +1,53 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Manage packages on Debian and co. +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +# Check for preseeding and add preseed as here document +if [ -f "$__object/parameter/preseed" ]; then + echo "debconf-set-selections << __file-eof" + cat "$(cat "$__object/parameter/preseed")" + echo "__file-eof" +fi + +state="$(cat "$__object/parameter/state")" +is_installed="$(grep "^Status: install ok installed" "$__object/explorer/pkg_status" || true)" + +case "$state" in + installed) + # Install only if non-existent + if [ -z "$is_installed" ]; then + echo apt-get --quiet --yes install \"$name\" + fi + ;; + uninstalled) + # Remove only if existent + if [ -n "$is_installed" ]; then + echo apt-get --quiet --yes remove \"$name\" + fi + ;; +esac diff --git a/conf/type/__debconf_set_selections/man.text b/conf/type/__debconf_set_selections/man.text new file mode 100644 index 00000000..8b7476b4 --- /dev/null +++ b/conf/type/__debconf_set_selections/man.text @@ -0,0 +1,59 @@ +cdist-type__package_apt(7) +========================== +Nico Schottelius + + +NAME +---- +cdist-type__package_apt - Manage packages with apt-get + + +DESCRIPTION +----------- +apt-get is usually used on Debian and variants (like Ubuntu) to +manage packages. + + +REQUIRED PARAMETERS +------------------- +state:: + Either "installed" or "deinstalled". + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + +preseed:: + If supplied, use the given filename as input for debconf-set-selections(1) + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure zsh in installed +__package_apt zsh --state installed + +# In case you only want *a* webserver, but don't care which one +__package_apt webserver --state installed --name nginx + +# Install package with defaults (from a type) +__package_apt postfix --state installed --preseed "$__type/files/postfix-seed" + +# Remove obsolete package +__package_apt puppet --state deinstalled +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) + + +COPYING +------- +Copyright \(C) 2011 Nico Schottelius. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__debconf_set_selections/parameter/optional b/conf/type/__debconf_set_selections/parameter/optional new file mode 100644 index 00000000..2dae648e --- /dev/null +++ b/conf/type/__debconf_set_selections/parameter/optional @@ -0,0 +1,3 @@ +name +preseed +version diff --git a/conf/type/__debconf_set_selections/parameter/required b/conf/type/__debconf_set_selections/parameter/required new file mode 100644 index 00000000..ff72b5c7 --- /dev/null +++ b/conf/type/__debconf_set_selections/parameter/required @@ -0,0 +1 @@ +state From 0db21eb308135cbc824675bce833a2924f6b6ead Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 12:47:48 +0200 Subject: [PATCH 0009/4996] document, cleanup and theoretically finish __debconf_set_selections Signed-off-by: Nico Schottelius --- .../explorer/pkg_status | 31 ---------------- .../__debconf_set_selections/gencode-remote | 35 +++--------------- conf/type/__debconf_set_selections/man.text | 36 ++++++------------- .../parameter/optional | 3 -- .../parameter/required | 2 +- 5 files changed, 15 insertions(+), 92 deletions(-) delete mode 100755 conf/type/__debconf_set_selections/explorer/pkg_status delete mode 100644 conf/type/__debconf_set_selections/parameter/optional diff --git a/conf/type/__debconf_set_selections/explorer/pkg_status b/conf/type/__debconf_set_selections/explorer/pkg_status deleted file mode 100755 index 86b94825..00000000 --- a/conf/type/__debconf_set_selections/explorer/pkg_status +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# -# 2011 Nico Schottelius (nico-cdist at schottelius.org) -# -# This file is part of cdist. -# -# cdist is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# cdist is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with cdist. If not, see . -# -# -# Retrieve the status of a package - parsed dpkg output -# - -if [ -f "$__object/parameter/name" ]; then - name="$(cat "$__object/parameter/name")" -else - name="$__object_id" -fi - -# Except dpkg failing, if package is not known / installed -dpkg -s "$name" 2>/dev/null || exit 0 diff --git a/conf/type/__debconf_set_selections/gencode-remote b/conf/type/__debconf_set_selections/gencode-remote index b2c7179d..156fc9f3 100755 --- a/conf/type/__debconf_set_selections/gencode-remote +++ b/conf/type/__debconf_set_selections/gencode-remote @@ -18,36 +18,9 @@ # along with cdist. If not, see . # # -# Manage packages on Debian and co. +# Setup selections # -if [ -f "$__object/parameter/name" ]; then - name="$(cat "$__object/parameter/name")" -else - name="$__object_id" -fi - -# Check for preseeding and add preseed as here document -if [ -f "$__object/parameter/preseed" ]; then - echo "debconf-set-selections << __file-eof" - cat "$(cat "$__object/parameter/preseed")" - echo "__file-eof" -fi - -state="$(cat "$__object/parameter/state")" -is_installed="$(grep "^Status: install ok installed" "$__object/explorer/pkg_status" || true)" - -case "$state" in - installed) - # Install only if non-existent - if [ -z "$is_installed" ]; then - echo apt-get --quiet --yes install \"$name\" - fi - ;; - uninstalled) - # Remove only if existent - if [ -n "$is_installed" ]; then - echo apt-get --quiet --yes remove \"$name\" - fi - ;; -esac +echo "debconf-set-selections << __file-eof" +cat "$__object/parameter/file" +echo "__file-eof" diff --git a/conf/type/__debconf_set_selections/man.text b/conf/type/__debconf_set_selections/man.text index 8b7476b4..b6b2ad18 100644 --- a/conf/type/__debconf_set_selections/man.text +++ b/conf/type/__debconf_set_selections/man.text @@ -1,31 +1,22 @@ -cdist-type__package_apt(7) -========================== +cdist-type__debconf_set_selections(7) +===================================== Nico Schottelius NAME ---- -cdist-type__package_apt - Manage packages with apt-get +cdist-type__debconf_set_selections - Setup debconf selections DESCRIPTION ----------- -apt-get is usually used on Debian and variants (like Ubuntu) to -manage packages. +On Debian and alike systems debconf-set-selections(1) can be used +to setup configuration parameters. REQUIRED PARAMETERS ------------------- -state:: - Either "installed" or "deinstalled". - - -OPTIONAL PARAMETERS -------------------- -name:: - If supplied, use the name and not the object id as the package name. - -preseed:: +file:: If supplied, use the given filename as input for debconf-set-selections(1) @@ -33,24 +24,17 @@ EXAMPLES -------- -------------------------------------------------------------------------------- -# Ensure zsh in installed -__package_apt zsh --state installed +# Setup configuration for nslcd +__debconf_set_selections nslcd --file /path/to/file -# In case you only want *a* webserver, but don't care which one -__package_apt webserver --state installed --name nginx - -# Install package with defaults (from a type) -__package_apt postfix --state installed --preseed "$__type/files/postfix-seed" - -# Remove obsolete package -__package_apt puppet --state deinstalled +# Setup configuration for nslcd from another type +__debconf_set_selections nslcd --file "$__type/files/preseed/nslcd" -------------------------------------------------------------------------------- SEE ALSO -------- - cdist-type(7) -- cdist-type__package(7) COPYING diff --git a/conf/type/__debconf_set_selections/parameter/optional b/conf/type/__debconf_set_selections/parameter/optional deleted file mode 100644 index 2dae648e..00000000 --- a/conf/type/__debconf_set_selections/parameter/optional +++ /dev/null @@ -1,3 +0,0 @@ -name -preseed -version diff --git a/conf/type/__debconf_set_selections/parameter/required b/conf/type/__debconf_set_selections/parameter/required index ff72b5c7..f73f3093 100644 --- a/conf/type/__debconf_set_selections/parameter/required +++ b/conf/type/__debconf_set_selections/parameter/required @@ -1 +1 @@ -state +file From e21283c579ef4e5da7d590a2b0338668cd2f16fc Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 13:08:47 +0200 Subject: [PATCH 0010/4996] remove preseeding support from __package_apt Signed-off-by: Nico Schottelius --- conf/type/__package_apt/man.text | 6 ------ conf/type/__package_apt/parameter/optional | 1 - 2 files changed, 7 deletions(-) diff --git a/conf/type/__package_apt/man.text b/conf/type/__package_apt/man.text index 8b7476b4..0780124d 100644 --- a/conf/type/__package_apt/man.text +++ b/conf/type/__package_apt/man.text @@ -25,9 +25,6 @@ OPTIONAL PARAMETERS name:: If supplied, use the name and not the object id as the package name. -preseed:: - If supplied, use the given filename as input for debconf-set-selections(1) - EXAMPLES -------- @@ -39,9 +36,6 @@ __package_apt zsh --state installed # In case you only want *a* webserver, but don't care which one __package_apt webserver --state installed --name nginx -# Install package with defaults (from a type) -__package_apt postfix --state installed --preseed "$__type/files/postfix-seed" - # Remove obsolete package __package_apt puppet --state deinstalled -------------------------------------------------------------------------------- diff --git a/conf/type/__package_apt/parameter/optional b/conf/type/__package_apt/parameter/optional index 2dae648e..a52167d3 100644 --- a/conf/type/__package_apt/parameter/optional +++ b/conf/type/__package_apt/parameter/optional @@ -1,3 +1,2 @@ name -preseed version From 1b87fc7c3f0a6d3e6135d59f8a0452b7cdf3f907 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 13:10:41 +0200 Subject: [PATCH 0011/4996] changes for 1.6.0 Signed-off-by: Nico Schottelius --- doc/changelog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/changelog b/doc/changelog index 2fcb8b46..1b9ede30 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,3 +1,7 @@ +1.6.0: + * Removed --preseed support from __package_apt + * New type __debconf_set_selections which allows to preseed debian packages + 1.5.0: 2011-04-01 * Add basic cache functionality * New type __process From cee51f00880919638eab04c40dc988c3adf9f81f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 1 Apr 2011 13:12:00 +0200 Subject: [PATCH 0012/4996] make __package_apt use DEBIAN_FRONTEND=noninteractive Signed-off-by: Nico Schottelius --- conf/type/__package_apt/gencode-remote | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/type/__package_apt/gencode-remote b/conf/type/__package_apt/gencode-remote index b2c7179d..e38653e9 100755 --- a/conf/type/__package_apt/gencode-remote +++ b/conf/type/__package_apt/gencode-remote @@ -37,17 +37,19 @@ fi state="$(cat "$__object/parameter/state")" is_installed="$(grep "^Status: install ok installed" "$__object/explorer/pkg_status" || true)" +aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes" + case "$state" in installed) # Install only if non-existent if [ -z "$is_installed" ]; then - echo apt-get --quiet --yes install \"$name\" + echo $aptget install \"$name\" fi ;; uninstalled) # Remove only if existent if [ -n "$is_installed" ]; then - echo apt-get --quiet --yes remove \"$name\" + echo $aptget remove \"$name\" fi ;; esac From e700437b01f7bebb6496aba9d55b6a0894319ccd Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 01:20:24 +0200 Subject: [PATCH 0013/4996] also detect fedora Signed-off-by: Nico Schottelius --- conf/explorer/os | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/explorer/os b/conf/explorer/os index f7481193..b636d980 100755 --- a/conf/explorer/os +++ b/conf/explorer/os @@ -43,6 +43,12 @@ if [ -f /etc/gentoo-release ]; then exit 0 fi +# Fedora is also Redhat, thus return before redhat! +if grep -q ^Fedora /etc/redhat-release 2>/dev/null; then + echo fedora + exit 0 +fi + if [ -f /etc/redhat-release ]; then echo redhat exit 0 From bcfba18e6f15a13bbb7533d9106ad7e65aa0e24d Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 01:22:09 +0200 Subject: [PATCH 0014/4996] more upcoming changes Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 1b9ede30..c54a5358 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,6 +1,7 @@ 1.6.0: * Removed --preseed support from __package_apt * New type __debconf_set_selections which allows to preseed debian packages + * Explorer/os: Support Fedora 1.5.0: 2011-04-01 * Add basic cache functionality From afc16667f40945b42a493d6610e49495fc13e330 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 01:25:57 +0200 Subject: [PATCH 0015/4996] more production machines Signed-off-by: Nico Schottelius --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 1fd28ffd..18352d5a 100644 --- a/README +++ b/README @@ -230,7 +230,7 @@ Yes, I'm actually eating my own dogfood and currently managing * [xfce](http://www.xfce.org/) (lightweight desktop environment) * [slim](http://slim.berlios.de/) (graphical login manager for X11) -with cdist on a total of **9** production machines of the +with cdist on a total of **20** production machines of the [Systems Group](http://www.systems.ethz.ch) at the [ETH Zurich](http://www.ethz.ch) as well at home. From c617dc0e8fc9e1e1949c40b2eb167957da969991 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 01:49:52 +0200 Subject: [PATCH 0016/4996] cleanup readme Signed-off-by: Nico Schottelius --- README | 65 +++++++++++++++++++--------------------------------------- 1 file changed, 21 insertions(+), 44 deletions(-) diff --git a/README b/README index 18352d5a..bb370b35 100644 --- a/README +++ b/README @@ -24,57 +24,34 @@ other configuration management systems like [cfengine](http://www.cfengine.org/), [bcfg2](http://trac.mcs.anl.gov/projects/bcfg2), [chef](http://wiki.opscode.com/display/chef/) -and [puppet](http://www.puppetlabs.com/), but -it ticks differently: +and [puppet](http://www.puppetlabs.com/), but it ticks differently. +Here are some features that makes it unique: - * cdist sticks completly to the KISS (keep it simple and stupid) paradigma - * cdist's core is very small (< 1k lines of code) - * There is only one type to extend cdist called ***type***. - * One main development target: ***It must be incredible easy to add new types.*** - * cdist is UNIX - * It reuses existing tools like cat, find, mv, ... - * cdist's documentation is bundled as manpages - * cdist is written in POSIX shell - * No special requirements like high level interpreters needed on server or target +[[!table data=""" +Simplicity | There is only one type to extend cdist called ***type*** +Design | Type and core cleanly seperated +Design | cdist sticks completly to the KISS (keep it simple and stupid) paradigma +Design | Meaningful error messages - do not lose time debugging error messages +Design | Consistency in behaviour, naming and documentation +Design | No surprise factor: Only do what is obviously clear, no magic +Design | Define target state, do not focus on methods or scripts +Small core | cdist's core is very small - less code, less bugs +Fast development | Focus on straightforwardness of type creation is a main development objective +Requirements, Scalability | No central server needed, cdist operates in push mode and can be run from any computer +Requirements, Scalability, Upgrade | cdist only needs to be updated on the master, not on the target hosts +Requirements | cdist requires only SSH and a shell on the target +Requirements | +UNIX | Reuse of existing tools like cat, find, mv, ... +UNIX, familar environment, documentation | Is available as manpages and HTML +UNIX, simplicity, familar environment | cdist is written in POSIX shell +UNIX, simplicity, familar environment | cdist is configured in POSIX shell +"""]] ### Documentation The cdist documentation is included as manpages in the distribution. You can [browse the documentation for the latest version online](man) as well. -### Architecture - - * Push mode (server pushes configuration) - * User defines configuration in shell scripts (called ***manifests***) - * Generates internal configuration (cconfig style) - * Uses ***types*** to generate code be executed on the target - * And finally executes the code on the target / applies the configuration - -### Features - - * Elegant code and clean design - * Type and core cleanly seperated - * Small codebase in core - * Good documentation (man pages) - * Consistency in behaviour, naming and documentation - * Meaningful error messages - * Either standard error messages from tools or added description for clearification - * The no surprise factor - * No magic guessing of what the user wants - * Simple and well-known DSL - * Posix shell - * Easy integration into bare metal installations - * requires only ssh + sh - * Easy upgrade - * ***There is no need to update cdist on target hosts!*** - * cdist only needs to be updated on the master server(s) - * Very easy to extend - * Can be done via types, which can be stacked on top of others - * Reuse of existing functionality - * sh, ssh, find, rm, mv, ... - * Very easy to debug - * Just add set -x in the scripts - ### OS support cdist was tested or is know to run on at least From 77766d29a21da7b7ba0e4a1e00fe1cd42578698f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 01:50:45 +0200 Subject: [PATCH 0017/4996] +header Signed-off-by: Nico Schottelius --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index bb370b35..26cd1ef2 100644 --- a/README +++ b/README @@ -28,6 +28,7 @@ and [puppet](http://www.puppetlabs.com/), but it ticks differently. Here are some features that makes it unique: [[!table data=""" +Keywords | Description Simplicity | There is only one type to extend cdist called ***type*** Design | Type and core cleanly seperated Design | cdist sticks completly to the KISS (keep it simple and stupid) paradigma From e19c079f24113f46cd006e37e47730ccf014c948 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:00:20 +0200 Subject: [PATCH 0018/4996] add template for new type __package_yum Signed-off-by: Nico Schottelius --- conf/type/__package_yum/explorer/pkg_version | 30 +++++++++++ conf/type/__package_yum/gencode-remote | 52 +++++++++++++++++++ conf/type/__package_yum/man.text | 53 ++++++++++++++++++++ conf/type/__package_yum/parameter/optional | 1 + conf/type/__package_yum/parameter/required | 1 + 5 files changed, 137 insertions(+) create mode 100755 conf/type/__package_yum/explorer/pkg_version create mode 100755 conf/type/__package_yum/gencode-remote create mode 100644 conf/type/__package_yum/man.text create mode 100644 conf/type/__package_yum/parameter/optional create mode 100644 conf/type/__package_yum/parameter/required diff --git a/conf/type/__package_yum/explorer/pkg_version b/conf/type/__package_yum/explorer/pkg_version new file mode 100755 index 00000000..4f612423 --- /dev/null +++ b/conf/type/__package_yum/explorer/pkg_version @@ -0,0 +1,30 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Retrieve the status of a package - parsed dpkg output +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +pacman -Q "$name" 2>/dev/null | awk '{ print $2 }' diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote new file mode 100755 index 00000000..536b7708 --- /dev/null +++ b/conf/type/__package_yum/gencode-remote @@ -0,0 +1,52 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Manage packages with Pacman (mostly archlinux) +# + +# Debug +# exec >&2 +# set -x + +pacopts="--noconfirm --noprogressbar" + +if [ -f "$__object/parameter/name" ]; then + name="$__object/parameter/name" +else + name="$__object_id" +fi + +state="$(cat "$__object/parameter/state")" +pkg_version="$(cat "$__object/explorer/pkg_version")" + +case "$state" in + installed) + + # Empty? Not installed. + if [ -z "$pkg_version" ]; then + echo pacman "$pacopts" -S \"$name\" + fi + ;; + uninstalled) + if [ "$pkg_version" ]; then + echo pacman "$pacopts" -R \"$name\" + fi + ;; +esac diff --git a/conf/type/__package_yum/man.text b/conf/type/__package_yum/man.text new file mode 100644 index 00000000..35a7e44c --- /dev/null +++ b/conf/type/__package_yum/man.text @@ -0,0 +1,53 @@ +cdist-type__package_pacman(7) +============================= +Nico Schottelius + + +NAME +---- +cdist-type__package_pacman - Manage packages with pacman + + +DESCRIPTION +----------- +Pacman is usually used on the Archlinux distribution to manage +packages. + + +REQUIRED PARAMETERS +------------------- +state:: + Either "installed" or "deinstalled". + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure zsh in installed +__package_pacman zsh --state installed + +# If you don't want to follow pythonX packages, but always use python +__package_pacman python --state installed --name python2 + +# Remove obsolete package +__package_pacman puppet --state deinstalled +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) + + +COPYING +------- +Copyright \(C) 2011 Nico Schottelius. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__package_yum/parameter/optional b/conf/type/__package_yum/parameter/optional new file mode 100644 index 00000000..f121bdbf --- /dev/null +++ b/conf/type/__package_yum/parameter/optional @@ -0,0 +1 @@ +name diff --git a/conf/type/__package_yum/parameter/required b/conf/type/__package_yum/parameter/required new file mode 100644 index 00000000..ff72b5c7 --- /dev/null +++ b/conf/type/__package_yum/parameter/required @@ -0,0 +1 @@ +state From d9e2493eb996e164a27826779477ce93a84cdda3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:13:44 +0200 Subject: [PATCH 0019/4996] add fedora support to __package Signed-off-by: Nico Schottelius --- conf/type/__package/manifest | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/type/__package/manifest b/conf/type/__package/manifest index d8b55814..f41cceac 100755 --- a/conf/type/__package/manifest +++ b/conf/type/__package/manifest @@ -33,6 +33,7 @@ else archlinux) type="pacman" ;; debian|ubuntu) type="apt" ;; gentoo) type="emerge" ;; + fedora) type="yum" ;; *) echo "Don't know how to manage packages on: $os" >&2 exit 1 From 981df12e9a341c38b279726c62832f1150a2e1f0 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:15:26 +0200 Subject: [PATCH 0020/4996] document changes Signed-off-by: Nico Schottelius --- doc/changelog | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/changelog b/doc/changelog index c54a5358..fe22e838 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,7 +1,9 @@ 1.6.0: + * New Type __package_yum + * New type __debconf_set_selections + * Type __package gained Fedora support * Removed --preseed support from __package_apt - * New type __debconf_set_selections which allows to preseed debian packages - * Explorer/os: Support Fedora + * explorer/os: gained Fedora support 1.5.0: 2011-04-01 * Add basic cache functionality From bcc7d0e795360489b61568f6ff108f8799ea2488 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:19:30 +0200 Subject: [PATCH 0021/4996] cleanup of gencode-remote Signed-off-by: Nico Schottelius --- conf/type/__package_yum/gencode-remote | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote index 536b7708..e20e0001 100755 --- a/conf/type/__package_yum/gencode-remote +++ b/conf/type/__package_yum/gencode-remote @@ -18,15 +18,9 @@ # along with cdist. If not, see . # # -# Manage packages with Pacman (mostly archlinux) +# Manage packages with yum (mostly Fedora) # -# Debug -# exec >&2 -# set -x - -pacopts="--noconfirm --noprogressbar" - if [ -f "$__object/parameter/name" ]; then name="$__object/parameter/name" else @@ -34,19 +28,17 @@ else fi state="$(cat "$__object/parameter/state")" -pkg_version="$(cat "$__object/explorer/pkg_version")" +opts="--assumeyes --quiet" case "$state" in installed) - - # Empty? Not installed. - if [ -z "$pkg_version" ]; then - echo pacman "$pacopts" -S \"$name\" + if grep -q "is not installed\$" "$__object/explorer/pkg_version"; then + echo yum $opts install \"$name\" fi ;; uninstalled) - if [ "$pkg_version" ]; then - echo pacman "$pacopts" -R \"$name\" + if ! grep -q "is not installed\$" "$__object/explorer/pkg_version"; then + echo yum $opts remove \"$name\" fi ;; esac From a778dee9fcdbc4d97f15b6a1832e3e1fe97b4ed1 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:19:47 +0200 Subject: [PATCH 0022/4996] use rpm -q to get status Signed-off-by: Nico Schottelius --- conf/type/__package_yum/explorer/pkg_version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__package_yum/explorer/pkg_version b/conf/type/__package_yum/explorer/pkg_version index 4f612423..66f76f12 100755 --- a/conf/type/__package_yum/explorer/pkg_version +++ b/conf/type/__package_yum/explorer/pkg_version @@ -27,4 +27,4 @@ else name="$__object_id" fi -pacman -Q "$name" 2>/dev/null | awk '{ print $2 }' +rpm -q "$name" 2>/dev/null || true From 740d279753e09c9178cdcc43f4302a86a1d331ba Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:20:19 +0200 Subject: [PATCH 0023/4996] add fedora to readme Signed-off-by: Nico Schottelius --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 26cd1ef2..e8f6e0bf 100644 --- a/README +++ b/README @@ -59,6 +59,7 @@ cdist was tested or is know to run on at least * [Archlinux](http://www.archlinux.org/) * [Debian](http://www.debian.org/) + * [Fedora](http://fedoraproject.org/) * [Gentoo](http://www.gentoo.org/) * [Mac OS X](http://www.apple.com/macosx/) * [OpenBSD](http://www.openbsd.org) From c532a2ccd3d19ebd36466be9231c68be7a68bbb7 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:22:08 +0200 Subject: [PATCH 0024/4996] remove one Error of Error: Error: /home/users/nico/oeffentlich/rechner/projekte/cdist-used/conf/type/__nico_desktop/manifest exited non-zero. Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index fac1b5c6..026d8419 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -158,7 +158,7 @@ __cdist_debug_echo() __cdist_exec_fail_on_error() { sh -e "$@" - [ "$?" -eq 0 ] || __cdist_exit_err "Error: $1 exited non-zero." + [ "$?" -eq 0 ] || __cdist_exit_err "$1 exited non-zero." } __cdist_exit_err() From 13f4140b3df9e6204451d444bdb6f504fd81771b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:26:42 +0200 Subject: [PATCH 0025/4996] update manpage for __package_yum Signed-off-by: Nico Schottelius --- conf/type/__package_yum/man.text | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/conf/type/__package_yum/man.text b/conf/type/__package_yum/man.text index 35a7e44c..262068c6 100644 --- a/conf/type/__package_yum/man.text +++ b/conf/type/__package_yum/man.text @@ -1,17 +1,16 @@ -cdist-type__package_pacman(7) -============================= +cdist-type__package_yum(7) +========================== Nico Schottelius NAME ---- -cdist-type__package_pacman - Manage packages with pacman +cdist-type__package_yum - Manage packages with yum DESCRIPTION ----------- -Pacman is usually used on the Archlinux distribution to manage -packages. +Yum is usually used on the Fedora distribution to manage packages. REQUIRED PARAMETERS @@ -31,13 +30,13 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure zsh in installed -__package_pacman zsh --state installed +__package_yum zsh --state installed # If you don't want to follow pythonX packages, but always use python -__package_pacman python --state installed --name python2 +__package_yum python --state installed --name python2 # Remove obsolete package -__package_pacman puppet --state deinstalled +__package_yum puppet --state deinstalled -------------------------------------------------------------------------------- From 44b11b99198ecdef188fb6819a9ff3a3de7b9d8b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:34:35 +0200 Subject: [PATCH 0026/4996] yum is funny Signed-off-by: Nico Schottelius --- doc/dev/logs/2011-04-02.yum | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/dev/logs/2011-04-02.yum diff --git a/doc/dev/logs/2011-04-02.yum b/doc/dev/logs/2011-04-02.yum new file mode 100644 index 00000000..dd3687c8 --- /dev/null +++ b/doc/dev/logs/2011-04-02.yum @@ -0,0 +1,9 @@ +Fun with yum: + +[root@brett ~]# yum --assumeyes --quiet install "vim" +Package 2:vim-enhanced-7.3.056-1.fc14.x86_64 already installed and latest version +[root@brett ~]# rpm -q vim +package vim is not installed +[root@brett ~]# + +(Me || yum) == dumb? From aedbc263d7325381a8bed03e24c31dbcf810e7d0 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:49:57 +0200 Subject: [PATCH 0027/4996] need to use --whatprovides This ensure we also check for other packages which are used instead of the requested one, which does not work with rpm -q: [root@brett ~]# rpm -q vim package vim is not installed [root@brett ~]# yum --assumeyes --quiet install "vim" Package 2:vim-enhanced-7.3.056-1.fc14.x86_64 already installed and latest version [root@brett ~]# rpm -q --whatprovides vim vim-enhanced-7.3.056-1.fc14.x86_64 Signed-off-by: Nico Schottelius --- conf/type/__package_yum/explorer/pkg_version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__package_yum/explorer/pkg_version b/conf/type/__package_yum/explorer/pkg_version index 66f76f12..0e078f68 100755 --- a/conf/type/__package_yum/explorer/pkg_version +++ b/conf/type/__package_yum/explorer/pkg_version @@ -27,4 +27,4 @@ else name="$__object_id" fi -rpm -q "$name" 2>/dev/null || true +rpm -q --whatprovides "$name" 2>/dev/null || true From 0b7024a2cc3449e2610fdd63dd57731ad1ebded5 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:53:07 +0200 Subject: [PATCH 0028/4996] adjust grep string Signed-off-by: Nico Schottelius --- conf/type/__package_yum/gencode-remote | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote index e20e0001..7d0d60b8 100755 --- a/conf/type/__package_yum/gencode-remote +++ b/conf/type/__package_yum/gencode-remote @@ -29,15 +29,20 @@ fi state="$(cat "$__object/parameter/state")" +cat "$__object/explorer/pkg_version" + opts="--assumeyes --quiet" + +not_installed="^no package provides" + case "$state" in installed) - if grep -q "is not installed\$" "$__object/explorer/pkg_version"; then + if grep -q "$not_installed" "$__object/explorer/pkg_version"; then echo yum $opts install \"$name\" fi ;; uninstalled) - if ! grep -q "is not installed\$" "$__object/explorer/pkg_version"; then + if ! grep -q "$not_installed" "$__object/explorer/pkg_version"; then echo yum $opts remove \"$name\" fi ;; From 4ab1fdceff36c983f07960d2a151560d668ecb60 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 02:57:02 +0200 Subject: [PATCH 0029/4996] remove evil debug Signed-off-by: Nico Schottelius --- conf/type/__package_yum/gencode-remote | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote index 7d0d60b8..033298b1 100755 --- a/conf/type/__package_yum/gencode-remote +++ b/conf/type/__package_yum/gencode-remote @@ -29,8 +29,6 @@ fi state="$(cat "$__object/parameter/state")" -cat "$__object/explorer/pkg_version" - opts="--assumeyes --quiet" not_installed="^no package provides" From 5f0ecb0831157bf0b5112afc6c4344adfc05cc3a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 03:12:31 +0200 Subject: [PATCH 0030/4996] yum confuses me, document it, so others are saved Signed-off-by: Nico Schottelius --- conf/type/__package_yum/man.text | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/type/__package_yum/man.text b/conf/type/__package_yum/man.text index 262068c6..b2f57606 100644 --- a/conf/type/__package_yum/man.text +++ b/conf/type/__package_yum/man.text @@ -11,6 +11,8 @@ cdist-type__package_yum - Manage packages with yum DESCRIPTION ----------- Yum is usually used on the Fedora distribution to manage packages. +If you specify an unknown package, yum will display the +slightly confusing error message "Error: Nothing to do". REQUIRED PARAMETERS From 762fa52638c2bd6c080396121377ab3eec005ac4 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 03:30:35 +0200 Subject: [PATCH 0031/4996] fixup cdist-reference: match only on .7 now, otherwise .html and .text is shown in manpage Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index 6358db9c..936e0bba 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -187,7 +187,7 @@ SEE ALSO -------- - cdist(7) eof -for type in man7/cdist-type__*; do +for type in man7/cdist-type__*.7; do name_1="${type#man7/}" name_2="${name_1%.7}" From 21aacd44b44c70e319c2c4991f9ee998666dfa92 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 03:36:41 +0200 Subject: [PATCH 0032/4996] remove double information from reference Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index 936e0bba..8fb24362 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -135,19 +135,8 @@ tmp_dir:: TYPES ----- -The following types are available: - -eof -for type in man7/cdist-type__*; do - name_1="${type#man7/cdist-type}" - name_2="${name_1%.7}" - - name="$name_2" - echo "- $name" -done - -cat << eof - +The available types are listed in the SEE ALSO section +and are referenced as cdist-type__TYPENAME. VARIABLES --------- From 18e433dd859644a8d69c07ff2a22e14c2091d963 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 14:24:20 +0200 Subject: [PATCH 0033/4996] import corrected __group from nico/nico Signed-off-by: Nico Schottelius --- conf/type/__group/gencode-remote | 45 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/conf/type/__group/gencode-remote b/conf/type/__group/gencode-remote index 527a6079..ac7e0ebb 100755 --- a/conf/type/__group/gencode-remote +++ b/conf/type/__group/gencode-remote @@ -1,6 +1,7 @@ #!/bin/sh # # 2011 Steven Armstrong (steven-cdist at armstrong.cc) +# 2011 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -23,16 +24,6 @@ name="$__object_id" -command= -if grep -q "^$name" "$__object/explorer/group"; then - # group exists - command="groupmod" -else - # group does not exist - command="groupadd" -fi - - get_current_value() { local key="$1" local index @@ -46,21 +37,29 @@ get_current_value() { cut -d':' -f $index "$__object/explorer/group" } - set -- "$@" cd "$__object/parameter" -for property in $(ls .); do - current_value=$(get_current_value "$property") - new_value="$(cat "$property")" - if [ "$new_value" != "$current_value" ]; then - # Shedule changed properties for update - set -- "$@" "--$property" \"$new_value\" + +if grep -q "^$name" "$__object/explorer/group"; then + # group exists, only change changed values + for property in $(ls .); do + current_value=$(get_current_value "$property") + new_value="$(cat "$property")" + if [ "$new_value" != "$current_value" ]; then + # Shedule changed properties for update + set -- "$@" "--$property" \"$new_value\" + fi + done + + if [ $# -gt 0 ]; then + # Update changed properties + echo groupmod $@ $name fi -done +else + for property in $(ls .); do + new_value="$(cat "$property")" + set -- "$@" "--$property" \"$new_value\" + done - -if [ $# -gt 0 ]; then - # Update changed properties - echo $command $@ $name + echo groupadd "$@" "$name" fi - From 69a17d0b0e6d9f12cbf743ce739aaef3caf93d65 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 14:25:00 +0200 Subject: [PATCH 0034/4996] remove unecessary set -- "$@" Signed-off-by: Nico Schottelius --- conf/type/__group/gencode-remote | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/type/__group/gencode-remote b/conf/type/__group/gencode-remote index ac7e0ebb..35df5424 100755 --- a/conf/type/__group/gencode-remote +++ b/conf/type/__group/gencode-remote @@ -37,9 +37,7 @@ get_current_value() { cut -d':' -f $index "$__object/explorer/group" } -set -- "$@" cd "$__object/parameter" - if grep -q "^$name" "$__object/explorer/group"; then # group exists, only change changed values for property in $(ls .); do From 252b511da7c4157b8950364cebc0ad6747965463 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 14:31:50 +0200 Subject: [PATCH 0035/4996] done++ Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index fe22e838..a1f218e8 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,6 +1,7 @@ 1.6.0: * New Type __package_yum * New type __debconf_set_selections + * Fix Type __group in case of __group NAME syntax * Type __package gained Fedora support * Removed --preseed support from __package_apt * explorer/os: gained Fedora support From 1310a1e42b3f0af84e7e5b8bb3299bd928ea60a8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 2 Apr 2011 14:40:31 +0200 Subject: [PATCH 0036/4996] ++todo Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index 7a8c4583..ad6561a6 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -26,13 +26,14 @@ CORE TYPES ------ -Types to be written/extended: - - __ssh-keys (host/user) - - Think about __service - necessary? - - __file_edit - - regexp replace (can probably cover all?) - -> aka sed. - - __cron +- __ssh-keys (host/user) +- __file_edit + - regexp replace (can probably cover all?) + -> aka sed. +- __cron +- __user: + add option to include --create-home + fix __user NAME case (same issue as __group) DOCUMENTATION -------------- From de879bf5215db28d82631fc3ec495233aad84c8f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 09:45:25 +0200 Subject: [PATCH 0037/4996] emphasise SSH Signed-off-by: Nico Schottelius --- README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README b/README index e8f6e0bf..aba67707 100644 --- a/README +++ b/README @@ -31,7 +31,7 @@ Here are some features that makes it unique: Keywords | Description Simplicity | There is only one type to extend cdist called ***type*** Design | Type and core cleanly seperated -Design | cdist sticks completly to the KISS (keep it simple and stupid) paradigma +Design | Sticks completly to the KISS (keep it simple and stupid) paradigma Design | Meaningful error messages - do not lose time debugging error messages Design | Consistency in behaviour, naming and documentation Design | No surprise factor: Only do what is obviously clear, no magic @@ -40,8 +40,8 @@ Small core | cdist's core is very small - less code, less bugs Fast development | Focus on straightforwardness of type creation is a main development objective Requirements, Scalability | No central server needed, cdist operates in push mode and can be run from any computer Requirements, Scalability, Upgrade | cdist only needs to be updated on the master, not on the target hosts -Requirements | cdist requires only SSH and a shell on the target -Requirements | +Requirements, Security | Uses well-know [SSH](http://www.openssh.com/) as transport protocol +Requirements, Simplicity | Requires only shell and SSH server on the target UNIX | Reuse of existing tools like cat, find, mv, ... UNIX, familar environment, documentation | Is available as manpages and HTML UNIX, simplicity, familar environment | cdist is written in POSIX shell From 674e1f58f8ff8924efe5d322d062451a1fa4b1e2 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 09:45:52 +0200 Subject: [PATCH 0038/4996] todo for 1.6 Signed-off-by: Nico Schottelius --- doc/dev/todo/1.6 | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/dev/todo/1.6 diff --git a/doc/dev/todo/1.6 b/doc/dev/todo/1.6 new file mode 100644 index 00000000..1be7274f --- /dev/null +++ b/doc/dev/todo/1.6 @@ -0,0 +1 @@ +- adjust documentation / stages From 4b76d8a7e087fe280cc11d8d91b99359b6fbac89 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 10:45:41 +0200 Subject: [PATCH 0039/4996] __user: remove =~, cleanup and beautify, replace cut with awk Signed-off-by: Nico Schottelius --- conf/type/__user/gencode-remote | 96 +++++++++++++++------------------ 1 file changed, 43 insertions(+), 53 deletions(-) diff --git a/conf/type/__user/gencode-remote b/conf/type/__user/gencode-remote index c53d8c40..c7dbac41 100755 --- a/conf/type/__user/gencode-remote +++ b/conf/type/__user/gencode-remote @@ -23,60 +23,50 @@ name="$__object_id" -command= -if grep -q "^$name" "$__object/explorer/passwd"; then - # user exists - command="usermod" -else - # user does not exist - command="useradd" -fi - - -get_current_value() { - local key="$1" - local new_value="$2" - - local explorer="$__object/explorer/passwd" - local index - case "$key" in - password) - explorer="$__object/explorer/shadow" - index=2 - ;; - uid) index=3;; - gid) - if [[ $new_value =~ ^[0-9]+$ ]]; then - # numeric gid - index=4 - else - # group name - explorer="$__object/explorer/group" - index=1 - fi - ;; - comment) index=5;; - home) index=6;; - shell) index=7;; - esac - cut -d':' -f $index "$explorer" -} - - -set -- "$@" cd "$__object/parameter" -for property in $(ls .); do - new_value="$(cat "$property")" - current_value=$(get_current_value "$property" "$new_value") - if [ "$new_value" != "$current_value" ]; then - # Shedule changed properties for update - set -- "$@" "--$property" \"$new_value\" +if grep -q "^${name}:" "$__object/explorer/passwd"; then + for property in $(ls .); do + new_value="$(cat "$property")" + + file="$__object/explorer/passwd" + + case "$key" in + password) + field=3 + file="$__object/explorer/shadow" + ;; + gid) + if $(echo "$new_value" | grep -q '^[0-9][0-9]*$'); then + field=4 + else + # group name + file="$__object/explorer/group" + field=1 + fi + ;; + uid) field=3 ;; + comment) field=5 ;; + home) field=6 ;; + shell) field=7 ;; + esac + + current_value="$(awk -F: '{ print $ENVIRON["field"] }' < "$file")" + + if [ "$new_value" != "$current_value" ]; then + # Shedule changed properties for update + set -- "$@" "--$property" \"$new_value\" + fi + done + + if [ $# -gt 0 ]; then + # Update changed properties + echo usermod "$@" "$name" fi -done +else + for property in $(ls .); do + new_value="$(cat "$property")" + set -- "$@" "--$property" \"$new_value\" + done - -if [ $# -gt 0 ]; then - # Update changed properties - echo $command $@ $name + echo useradd "$@" "$name" fi - From db425d39254c35c8fa8ba85678dafced87ef64ba Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 10:59:04 +0200 Subject: [PATCH 0040/4996] use property, not key anymore Signed-off-by: Nico Schottelius --- conf/type/__user/gencode-remote | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/conf/type/__user/gencode-remote b/conf/type/__user/gencode-remote index c7dbac41..8f4222c3 100755 --- a/conf/type/__user/gencode-remote +++ b/conf/type/__user/gencode-remote @@ -1,6 +1,7 @@ #!/bin/sh # # 2011 Steven Armstrong (steven-cdist at armstrong.cc) +# 2011 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -30,7 +31,7 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then file="$__object/explorer/passwd" - case "$key" in + case "$property" in password) field=3 file="$__object/explorer/shadow" @@ -50,18 +51,15 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then shell) field=7 ;; esac + export field current_value="$(awk -F: '{ print $ENVIRON["field"] }' < "$file")" if [ "$new_value" != "$current_value" ]; then - # Shedule changed properties for update set -- "$@" "--$property" \"$new_value\" fi done - if [ $# -gt 0 ]; then - # Update changed properties - echo usermod "$@" "$name" - fi + [ $# -gt 0 ] && echo usermod "$@" "$name" else for property in $(ls .); do new_value="$(cat "$property")" From d49e481a87d920fab6dc157e663cdf6d324c61fd Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 11:00:15 +0200 Subject: [PATCH 0041/4996] match on name: not name, may be invalid Signed-off-by: Nico Schottelius --- conf/type/__group/gencode-remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__group/gencode-remote b/conf/type/__group/gencode-remote index 35df5424..a8a8397d 100755 --- a/conf/type/__group/gencode-remote +++ b/conf/type/__group/gencode-remote @@ -38,7 +38,7 @@ get_current_value() { } cd "$__object/parameter" -if grep -q "^$name" "$__object/explorer/group"; then +if grep -q "^${name}:" "$__object/explorer/group"; then # group exists, only change changed values for property in $(ls .); do current_value=$(get_current_value "$property") From e464c5aaa223f3cfe80f20c3d42a1eb2b928adad Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 11:04:00 +0200 Subject: [PATCH 0042/4996] simplify Signed-off-by: Nico Schottelius --- conf/type/__group/gencode-remote | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/conf/type/__group/gencode-remote b/conf/type/__group/gencode-remote index a8a8397d..4cb05762 100755 --- a/conf/type/__group/gencode-remote +++ b/conf/type/__group/gencode-remote @@ -24,35 +24,26 @@ name="$__object_id" -get_current_value() { - local key="$1" - local index - case "$key" in - password) - cut -d':' -f 2 "$__object/explorer/gshadow" - break - ;; - gid) index=3;; - esac - cut -d':' -f $index "$__object/explorer/group" -} - cd "$__object/parameter" if grep -q "^${name}:" "$__object/explorer/group"; then - # group exists, only change changed values for property in $(ls .); do - current_value=$(get_current_value "$property") new_value="$(cat "$property")" + + case "$key" in + password) + current_value="$(awk -F: '{ print $2 }' < "$__object/explorer/gshadow")" + ;; + gid) + current_value="$(awk -F: '{ print $3 }' < "$__object/explorer/group")" + ;; + esac + if [ "$new_value" != "$current_value" ]; then - # Shedule changed properties for update set -- "$@" "--$property" \"$new_value\" fi done - if [ $# -gt 0 ]; then - # Update changed properties - echo groupmod $@ $name - fi + [ $# -gt 0 ] && echo groupmod $@ $name else for property in $(ls .); do new_value="$(cat "$property")" From 324fc13927b06ab201042e0e19912dd2e025dcd6 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 11:07:15 +0200 Subject: [PATCH 0043/4996] +changes Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index a1f218e8..f0641509 100644 --- a/doc/changelog +++ b/doc/changelog @@ -5,6 +5,7 @@ * Type __package gained Fedora support * Removed --preseed support from __package_apt * explorer/os: gained Fedora support + * Simplified types __user and __group 1.5.0: 2011-04-01 * Add basic cache functionality From a60e2838e324fe92e0bac7c12f46dc81d6509eff Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Mon, 4 Apr 2011 11:54:42 +0200 Subject: [PATCH 0044/4996] update .gitignore to match new man page locations Signed-off-by: Steven Armstrong --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 68f829dc..778fc944 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,12 @@ # Ignore generated manpages doc/man/.marker -doc/man/man*/ +doc/man/man*/*.1 +doc/man/man*/*.7 +doc/man/man*/*.html +doc/man/man*/*.xml +# Ignore type manpages +doc/man/man*/*__*.text # Ignore cache for version control cache/ From fc1000994677ff1aeeea30a6fa5c5cee03003e0a Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Mon, 4 Apr 2011 11:59:30 +0200 Subject: [PATCH 0045/4996] update and merge ignore files Signed-off-by: Steven Armstrong --- .gitignore | 1 + doc/man/.gitignore | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 doc/man/.gitignore diff --git a/.gitignore b/.gitignore index 778fc944..15be6dc2 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ doc/man/man*/*.1 doc/man/man*/*.7 doc/man/man*/*.html doc/man/man*/*.xml +doc/man/man*/cdist-reference.text # Ignore type manpages doc/man/man*/*__*.text diff --git a/doc/man/.gitignore b/doc/man/.gitignore deleted file mode 100644 index 8ed9d1e1..00000000 --- a/doc/man/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -cdist.7 -*.html -cdist-design.7 -cdist-reference.text From 74e3447c40cb0497f13ec22f2faf38f80a5be7fe Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 12:04:10 +0200 Subject: [PATCH 0046/4996] add example multi branch .git/config Signed-off-by: Nico Schottelius --- doc/man/man7/cdist-best-practice.text | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/doc/man/man7/cdist-best-practice.text b/doc/man/man7/cdist-best-practice.text index aa499790..5ec01d5f 100644 --- a/doc/man/man7/cdist-best-practice.text +++ b/doc/man/man7/cdist-best-practice.text @@ -102,6 +102,39 @@ git checkout private git merge common -------------------------------------------------------------------------------- +The following **.git/config** is taken from a a real world scenario: +-------------------------------------------------------------------------------- +# Track upstream, merge from time to time +[remote "upstream"] + url = git://git.schottelius.org/cdist + fetch = +refs/heads/*:refs/remotes/upstream/* + +# Same as upstream, but works when being offline +[remote "local"] + fetch = +refs/heads/*:refs/remotes/local/* + url = /home/users/nico/p/cdist + +# Remote containing various ETH internal branches +[remote "eth"] + url = sans.ethz.ch:/home/services/sans/git/cdist-eth + fetch = +refs/heads/*:refs/remotes/eth/* + +# Public remote that contains my private changes to cdist upstream +[remote "nico"] + url = git.schottelius.org:/home/services/git/cdist-nico + fetch = +refs/heads/*:refs/remotes/nico/* + +# The "nico" branch will be synced with the remote nico, branch master +[branch "nico"] + remote = nico + merge = refs/heads/master + +# ETH stable contains rock solid configurations used in various places +[branch "eth-stable"] + remote = eth + merge = refs/heads/stable +-------------------------------------------------------------------------------- + Have a look at git-remote(1) to adjust the remote configuration, which allows you to push certain branches to certain remotes. From a28ac9bedca9581b1c28d8af44f66bf8280094a8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 12:15:13 +0200 Subject: [PATCH 0047/4996] ++todo 1.6 Signed-off-by: Nico Schottelius --- doc/dev/todo/1.6 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/dev/todo/1.6 b/doc/dev/todo/1.6 index 1be7274f..12a83e93 100644 --- a/doc/dev/todo/1.6 +++ b/doc/dev/todo/1.6 @@ -1 +1,3 @@ -- adjust documentation / stages +Documentation: + - update stages + - go through all manpages and ensure __ and co are correct From 09bf63ffca43d10320f20fd41dfb0943275ccf9f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 12:19:02 +0200 Subject: [PATCH 0048/4996] [DOC] remove some formatting issues in cdist-reference Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index 8fb24362..a5d1698a 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -45,9 +45,11 @@ cdist-reference - Variable, path and type reference for cdist DESCRIPTION ----------- -Various scripts which are not in the core need information on how -to find information. This manpage summarises the available environment -variables, types and paths and clearifies with part may access which variables. +This reference summarises + +- environment variables +- paths +- types PATHS @@ -62,7 +64,6 @@ conf/manifest/init:: It is an executable (+x bit set) shell script that can use values from the explorers to decide which configuration to create for the specified target host. - It should be primary used to define mapping from configurations to hosts. conf/manifest/*:: @@ -103,15 +104,12 @@ conf/type//parameters/optional:: conf/type//explorer:: Location of the type specific explorers. - This directory is referenced by the variable __type_explorer (see below). - See cdist-explorer(7). out/:: This directory contains output of cdist and is usually located in a temporary directory and thus will be removed after the run. - This directory is referenced by the variable __global (see below). out/explorer:: @@ -122,7 +120,6 @@ out/object:: out/object/:: Contains all object specific information. - This directory is referenced by the variable __object (see below). out/object//explorers:: @@ -138,8 +135,8 @@ TYPES The available types are listed in the SEE ALSO section and are referenced as cdist-type__TYPENAME. -VARIABLES ---------- +ENVIRONMENT VARIABLES +--------------------- __explorer:: Directory that contains all explorers. Available for: explorer From 785ec3f36ff7315012cf0ac037a5e01d8a2210cd Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 13:20:22 +0200 Subject: [PATCH 0049/4996] sort fields by alphabet Signed-off-by: Nico Schottelius --- conf/type/__user/gencode-remote | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/type/__user/gencode-remote b/conf/type/__user/gencode-remote index 8f4222c3..7670b943 100755 --- a/conf/type/__user/gencode-remote +++ b/conf/type/__user/gencode-remote @@ -32,10 +32,6 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then file="$__object/explorer/passwd" case "$property" in - password) - field=3 - file="$__object/explorer/shadow" - ;; gid) if $(echo "$new_value" | grep -q '^[0-9][0-9]*$'); then field=4 @@ -45,10 +41,14 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then field=1 fi ;; - uid) field=3 ;; + password) + field=3 + file="$__object/explorer/shadow" + ;; comment) field=5 ;; home) field=6 ;; shell) field=7 ;; + uid) field=3 ;; esac export field From 654512c2096cedff06aa696e407f995034572397 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 23:50:48 +0200 Subject: [PATCH 0050/4996] add template for __package_openbsd_pkg Signed-off-by: Nico Schottelius --- .../explorer/pkg_version | 30 +++++++++++ .../type/__package_openbsd_pkg/gencode-remote | 52 ++++++++++++++++++ conf/type/__package_openbsd_pkg/man.text | 53 +++++++++++++++++++ .../__package_openbsd_pkg/parameter/optional | 1 + .../__package_openbsd_pkg/parameter/required | 1 + 5 files changed, 137 insertions(+) create mode 100755 conf/type/__package_openbsd_pkg/explorer/pkg_version create mode 100755 conf/type/__package_openbsd_pkg/gencode-remote create mode 100644 conf/type/__package_openbsd_pkg/man.text create mode 100644 conf/type/__package_openbsd_pkg/parameter/optional create mode 100644 conf/type/__package_openbsd_pkg/parameter/required diff --git a/conf/type/__package_openbsd_pkg/explorer/pkg_version b/conf/type/__package_openbsd_pkg/explorer/pkg_version new file mode 100755 index 00000000..4f612423 --- /dev/null +++ b/conf/type/__package_openbsd_pkg/explorer/pkg_version @@ -0,0 +1,30 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Retrieve the status of a package - parsed dpkg output +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +pacman -Q "$name" 2>/dev/null | awk '{ print $2 }' diff --git a/conf/type/__package_openbsd_pkg/gencode-remote b/conf/type/__package_openbsd_pkg/gencode-remote new file mode 100755 index 00000000..536b7708 --- /dev/null +++ b/conf/type/__package_openbsd_pkg/gencode-remote @@ -0,0 +1,52 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Manage packages with Pacman (mostly archlinux) +# + +# Debug +# exec >&2 +# set -x + +pacopts="--noconfirm --noprogressbar" + +if [ -f "$__object/parameter/name" ]; then + name="$__object/parameter/name" +else + name="$__object_id" +fi + +state="$(cat "$__object/parameter/state")" +pkg_version="$(cat "$__object/explorer/pkg_version")" + +case "$state" in + installed) + + # Empty? Not installed. + if [ -z "$pkg_version" ]; then + echo pacman "$pacopts" -S \"$name\" + fi + ;; + uninstalled) + if [ "$pkg_version" ]; then + echo pacman "$pacopts" -R \"$name\" + fi + ;; +esac diff --git a/conf/type/__package_openbsd_pkg/man.text b/conf/type/__package_openbsd_pkg/man.text new file mode 100644 index 00000000..35a7e44c --- /dev/null +++ b/conf/type/__package_openbsd_pkg/man.text @@ -0,0 +1,53 @@ +cdist-type__package_pacman(7) +============================= +Nico Schottelius + + +NAME +---- +cdist-type__package_pacman - Manage packages with pacman + + +DESCRIPTION +----------- +Pacman is usually used on the Archlinux distribution to manage +packages. + + +REQUIRED PARAMETERS +------------------- +state:: + Either "installed" or "deinstalled". + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure zsh in installed +__package_pacman zsh --state installed + +# If you don't want to follow pythonX packages, but always use python +__package_pacman python --state installed --name python2 + +# Remove obsolete package +__package_pacman puppet --state deinstalled +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) + + +COPYING +------- +Copyright \(C) 2011 Nico Schottelius. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__package_openbsd_pkg/parameter/optional b/conf/type/__package_openbsd_pkg/parameter/optional new file mode 100644 index 00000000..f121bdbf --- /dev/null +++ b/conf/type/__package_openbsd_pkg/parameter/optional @@ -0,0 +1 @@ +name diff --git a/conf/type/__package_openbsd_pkg/parameter/required b/conf/type/__package_openbsd_pkg/parameter/required new file mode 100644 index 00000000..ff72b5c7 --- /dev/null +++ b/conf/type/__package_openbsd_pkg/parameter/required @@ -0,0 +1 @@ +state From 02da74e4374732ba4e8060ed446e5960ac70d811 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Apr 2011 23:57:36 +0200 Subject: [PATCH 0051/4996] add explorer os_version supporting openbsd Signed-off-by: Nico Schottelius --- conf/explorer/os_version | 97 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 conf/explorer/os_version diff --git a/conf/explorer/os_version b/conf/explorer/os_version new file mode 100755 index 00000000..d4dd2bc9 --- /dev/null +++ b/conf/explorer/os_version @@ -0,0 +1,97 @@ +#!/bin/sh +# +# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# All os variables are lower case +# +# + +case "$($__explorer/os)" in + openbsd) + uname -r + ;; +esac + +exit 0 + +# Ubuntu is also Debian, thus return if Ubuntu was found +if grep -q ^DISTRIB_ID=Ubuntu /etc/lsb-release 2>/dev/null; then + echo ubuntu + exit 0 +fi + +if [ -f /etc/arch-release ]; then + echo archlinux + exit 0 +fi + +if [ -f /etc/debian_version ]; then + echo debian + exit 0 +fi + +if [ -f /etc/gentoo-release ]; then + echo gentoo + exit 0 +fi + +# Fedora is also Redhat, thus return before redhat! +if grep -q ^Fedora /etc/redhat-release 2>/dev/null; then + echo fedora + exit 0 +fi + +if [ -f /etc/redhat-release ]; then + echo redhat + exit 0 +fi + +if [ -f /etc/SuSE-release ]; then + echo suse + exit 0 +fi + +uname_s="$(uname -s)" + +# Assume there is no tr on the client -> do lower case ourselves +case "$uname_s" in + Darwin) + echo macosx + exit 0 + ;; + NetBSD) + echo netbsd + exit 0 + ;; + FreeBSD) + echo freebsd + exit 0 + ;; + OpenBSD) + echo openbsd + exit 0 + ;; + SunOS) + echo solaris + exit 0 + ;; +esac + +echo "Unknown OS" >&2 +exit 1 From b474960774607c03e96b967374478a1bb8c79e6e Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 00:03:23 +0200 Subject: [PATCH 0052/4996] explorer os_version supports macosx Signed-off-by: Nico Schottelius --- conf/explorer/os_version | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/conf/explorer/os_version b/conf/explorer/os_version index d4dd2bc9..02e2e2cd 100755 --- a/conf/explorer/os_version +++ b/conf/explorer/os_version @@ -23,7 +23,11 @@ # case "$($__explorer/os)" in - openbsd) + archlinux) + # empty, but well... + cat /etc/arch-release + ;; + macosx|openbsd) uname -r ;; esac @@ -36,11 +40,6 @@ if grep -q ^DISTRIB_ID=Ubuntu /etc/lsb-release 2>/dev/null; then exit 0 fi -if [ -f /etc/arch-release ]; then - echo archlinux - exit 0 -fi - if [ -f /etc/debian_version ]; then echo debian exit 0 @@ -71,10 +70,6 @@ uname_s="$(uname -s)" # Assume there is no tr on the client -> do lower case ourselves case "$uname_s" in - Darwin) - echo macosx - exit 0 - ;; NetBSD) echo netbsd exit 0 From edfedc5c064d38157f2abe5306297866e7e74b91 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 00:10:26 +0200 Subject: [PATCH 0053/4996] in theory finish os_version Signed-off-by: Nico Schottelius --- conf/explorer/os_version | 73 +++++++++------------------------------- 1 file changed, 16 insertions(+), 57 deletions(-) diff --git a/conf/explorer/os_version b/conf/explorer/os_version index 02e2e2cd..5f7120c0 100755 --- a/conf/explorer/os_version +++ b/conf/explorer/os_version @@ -27,66 +27,25 @@ case "$($__explorer/os)" in # empty, but well... cat /etc/arch-release ;; - macosx|openbsd) + debian) + cat /etc/debian_version + ;; + fedora) + cat /etc/fedora-release + ;; + gentoo) + cat /etc/gentoo-release + ;; + macosx|*bsd|solaris) uname -r ;; -esac - -exit 0 - -# Ubuntu is also Debian, thus return if Ubuntu was found -if grep -q ^DISTRIB_ID=Ubuntu /etc/lsb-release 2>/dev/null; then - echo ubuntu - exit 0 -fi - -if [ -f /etc/debian_version ]; then - echo debian - exit 0 -fi - -if [ -f /etc/gentoo-release ]; then - echo gentoo - exit 0 -fi - -# Fedora is also Redhat, thus return before redhat! -if grep -q ^Fedora /etc/redhat-release 2>/dev/null; then - echo fedora - exit 0 -fi - -if [ -f /etc/redhat-release ]; then - echo redhat - exit 0 -fi - -if [ -f /etc/SuSE-release ]; then - echo suse - exit 0 -fi - -uname_s="$(uname -s)" - -# Assume there is no tr on the client -> do lower case ourselves -case "$uname_s" in - NetBSD) - echo netbsd - exit 0 + redhat) + cat /etc/redhat-release ;; - FreeBSD) - echo freebsd - exit 0 + suse) + cat /etc/SuSE-release ;; - OpenBSD) - echo openbsd - exit 0 - ;; - SunOS) - echo solaris - exit 0 + ubuntu) + lsb_release -sr ;; esac - -echo "Unknown OS" >&2 -exit 1 From 1a9901989133203d9552b027d66383660efb8148 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 00:11:19 +0200 Subject: [PATCH 0054/4996] more stuff todo Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index ad6561a6..3adf4561 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -24,6 +24,7 @@ CORE - probably remove or improve cdist-type-template + TYPES ------ - __ssh-keys (host/user) @@ -40,6 +41,7 @@ DOCUMENTATION - asciidoc interprets __, which we use for variables names -> seek through docs and replace with \_\_! - check all all internal variables are prefixed with __cdist +- reference explorers in cdist-reference! Cache: - add example how to use From 5710d9a60690656e5d820ef24acce7f104c842a1 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 14:57:22 +0200 Subject: [PATCH 0055/4996] delay __package_openbsd_pkg / wait for input of justastudent Signed-off-by: Nico Schottelius --- .../explorer/pkg_version | 30 ----------- .../type/__package_openbsd_pkg/gencode-remote | 52 ------------------ conf/type/__package_openbsd_pkg/man.text | 53 ------------------- .../__package_openbsd_pkg/parameter/optional | 1 - .../__package_openbsd_pkg/parameter/required | 1 - 5 files changed, 137 deletions(-) delete mode 100755 conf/type/__package_openbsd_pkg/explorer/pkg_version delete mode 100755 conf/type/__package_openbsd_pkg/gencode-remote delete mode 100644 conf/type/__package_openbsd_pkg/man.text delete mode 100644 conf/type/__package_openbsd_pkg/parameter/optional delete mode 100644 conf/type/__package_openbsd_pkg/parameter/required diff --git a/conf/type/__package_openbsd_pkg/explorer/pkg_version b/conf/type/__package_openbsd_pkg/explorer/pkg_version deleted file mode 100755 index 4f612423..00000000 --- a/conf/type/__package_openbsd_pkg/explorer/pkg_version +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh -# -# 2011 Nico Schottelius (nico-cdist at schottelius.org) -# -# This file is part of cdist. -# -# cdist is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# cdist is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with cdist. If not, see . -# -# -# Retrieve the status of a package - parsed dpkg output -# - -if [ -f "$__object/parameter/name" ]; then - name="$(cat "$__object/parameter/name")" -else - name="$__object_id" -fi - -pacman -Q "$name" 2>/dev/null | awk '{ print $2 }' diff --git a/conf/type/__package_openbsd_pkg/gencode-remote b/conf/type/__package_openbsd_pkg/gencode-remote deleted file mode 100755 index 536b7708..00000000 --- a/conf/type/__package_openbsd_pkg/gencode-remote +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# -# 2011 Nico Schottelius (nico-cdist at schottelius.org) -# -# This file is part of cdist. -# -# cdist is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# cdist is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with cdist. If not, see . -# -# -# Manage packages with Pacman (mostly archlinux) -# - -# Debug -# exec >&2 -# set -x - -pacopts="--noconfirm --noprogressbar" - -if [ -f "$__object/parameter/name" ]; then - name="$__object/parameter/name" -else - name="$__object_id" -fi - -state="$(cat "$__object/parameter/state")" -pkg_version="$(cat "$__object/explorer/pkg_version")" - -case "$state" in - installed) - - # Empty? Not installed. - if [ -z "$pkg_version" ]; then - echo pacman "$pacopts" -S \"$name\" - fi - ;; - uninstalled) - if [ "$pkg_version" ]; then - echo pacman "$pacopts" -R \"$name\" - fi - ;; -esac diff --git a/conf/type/__package_openbsd_pkg/man.text b/conf/type/__package_openbsd_pkg/man.text deleted file mode 100644 index 35a7e44c..00000000 --- a/conf/type/__package_openbsd_pkg/man.text +++ /dev/null @@ -1,53 +0,0 @@ -cdist-type__package_pacman(7) -============================= -Nico Schottelius - - -NAME ----- -cdist-type__package_pacman - Manage packages with pacman - - -DESCRIPTION ------------ -Pacman is usually used on the Archlinux distribution to manage -packages. - - -REQUIRED PARAMETERS -------------------- -state:: - Either "installed" or "deinstalled". - - -OPTIONAL PARAMETERS -------------------- -name:: - If supplied, use the name and not the object id as the package name. - - -EXAMPLES --------- - --------------------------------------------------------------------------------- -# Ensure zsh in installed -__package_pacman zsh --state installed - -# If you don't want to follow pythonX packages, but always use python -__package_pacman python --state installed --name python2 - -# Remove obsolete package -__package_pacman puppet --state deinstalled --------------------------------------------------------------------------------- - - -SEE ALSO --------- -- cdist-type(7) -- cdist-type__package(7) - - -COPYING -------- -Copyright \(C) 2011 Nico Schottelius. Free use of this software is -granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__package_openbsd_pkg/parameter/optional b/conf/type/__package_openbsd_pkg/parameter/optional deleted file mode 100644 index f121bdbf..00000000 --- a/conf/type/__package_openbsd_pkg/parameter/optional +++ /dev/null @@ -1 +0,0 @@ -name diff --git a/conf/type/__package_openbsd_pkg/parameter/required b/conf/type/__package_openbsd_pkg/parameter/required deleted file mode 100644 index ff72b5c7..00000000 --- a/conf/type/__package_openbsd_pkg/parameter/required +++ /dev/null @@ -1 +0,0 @@ -state From 33e792540e38168b6f730ead3840809406a3a5bc Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 14:57:50 +0200 Subject: [PATCH 0056/4996] more stuff for 1.6.0 Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index f0641509..cec4a11a 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,6 +1,7 @@ 1.6.0: * New Type __package_yum * New type __debconf_set_selections + * New explorer os_version * Fix Type __group in case of __group NAME syntax * Type __package gained Fedora support * Removed --preseed support from __package_apt From 1fc90b2d8c5d5f09f14a951d0c21ad3adfcc4cfe Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 14:58:40 +0200 Subject: [PATCH 0057/4996] +obsd pkg tests Signed-off-by: Nico Schottelius --- doc/dev/logs/2011-04-04.openbsd | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 doc/dev/logs/2011-04-04.openbsd diff --git a/doc/dev/logs/2011-04-04.openbsd b/doc/dev/logs/2011-04-04.openbsd new file mode 100644 index 00000000..df1732c2 --- /dev/null +++ b/doc/dev/logs/2011-04-04.openbsd @@ -0,0 +1,24 @@ + +Some openbsd experiements: + +# pkg_add foo +Can't find foo +# echo $? +0 +# +# pkg_info foo +# echo $? +0 + +# pkg_add -s vim +Ambiguous: vim could be vim-7.2.444-gtk2 vim-7.2.444-no_x11 +# pkg_add -s vim--no_x11 +# echo $? +0 +# pkg_add -s vimfooooooooo +Can't find vimfooooooooo +# pkg_add -s vim--foooooooo +Can't find vim--foooooooo +# echo $? +0 + From 231d6a49868f7d7d63a1c6959b52a6e7980ed3a8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 15:19:33 +0200 Subject: [PATCH 0058/4996] more ideas for stuff todo Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index 3adf4561..ebf506d4 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -23,6 +23,9 @@ CORE [20:22] kr:bin% - probably remove or improve cdist-type-template +- add $__tmp? + - for use in manifest, code, etc.? + - for creating temporary files, etc. TYPES From 4ebcdc3ef1d1126ab7f7b0d1d64f9ce45b297b2f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 16:25:13 +0200 Subject: [PATCH 0059/4996] find __package* -type f -exec sed -i 's/deinstalled/removed/g' {} \; Signed-off-by: Nico Schottelius --- conf/type/__package_apt/man.text | 4 ++-- conf/type/__package_pacman/man.text | 4 ++-- conf/type/__package_yum/man.text | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/type/__package_apt/man.text b/conf/type/__package_apt/man.text index 0780124d..905bfb5f 100644 --- a/conf/type/__package_apt/man.text +++ b/conf/type/__package_apt/man.text @@ -17,7 +17,7 @@ manage packages. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "deinstalled". + Either "installed" or "removed". OPTIONAL PARAMETERS @@ -37,7 +37,7 @@ __package_apt zsh --state installed __package_apt webserver --state installed --name nginx # Remove obsolete package -__package_apt puppet --state deinstalled +__package_apt puppet --state removed -------------------------------------------------------------------------------- diff --git a/conf/type/__package_pacman/man.text b/conf/type/__package_pacman/man.text index 35a7e44c..28766581 100644 --- a/conf/type/__package_pacman/man.text +++ b/conf/type/__package_pacman/man.text @@ -17,7 +17,7 @@ packages. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "deinstalled". + Either "installed" or "removed". OPTIONAL PARAMETERS @@ -37,7 +37,7 @@ __package_pacman zsh --state installed __package_pacman python --state installed --name python2 # Remove obsolete package -__package_pacman puppet --state deinstalled +__package_pacman puppet --state removed -------------------------------------------------------------------------------- diff --git a/conf/type/__package_yum/man.text b/conf/type/__package_yum/man.text index b2f57606..c9cad340 100644 --- a/conf/type/__package_yum/man.text +++ b/conf/type/__package_yum/man.text @@ -18,7 +18,7 @@ slightly confusing error message "Error: Nothing to do". REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "deinstalled". + Either "installed" or "removed". OPTIONAL PARAMETERS @@ -38,7 +38,7 @@ __package_yum zsh --state installed __package_yum python --state installed --name python2 # Remove obsolete package -__package_yum puppet --state deinstalled +__package_yum puppet --state removed -------------------------------------------------------------------------------- From ac976c9f703ad319ff246ae0e2778a3f668ed2db Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 16:25:27 +0200 Subject: [PATCH 0060/4996] find __package* -type f -exec sed -i 's/uninstalled/removed/g' {} \; Signed-off-by: Nico Schottelius --- conf/type/__package/man.text | 2 +- conf/type/__package_apt/gencode-remote | 2 +- conf/type/__package_pacman/gencode-remote | 2 +- conf/type/__package_yum/gencode-remote | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/type/__package/man.text b/conf/type/__package/man.text index eeeceba0..46af7b3d 100644 --- a/conf/type/__package/man.text +++ b/conf/type/__package/man.text @@ -17,7 +17,7 @@ It dispatches the actual work to the package system dependant types. REQUIRED PARAMETERS ------------------- state:: - The state the package should be in, either "installed" or "uninstalled" + The state the package should be in, either "installed" or "removed" OPTIONAL PARAMETERS diff --git a/conf/type/__package_apt/gencode-remote b/conf/type/__package_apt/gencode-remote index e38653e9..aac9beb1 100755 --- a/conf/type/__package_apt/gencode-remote +++ b/conf/type/__package_apt/gencode-remote @@ -46,7 +46,7 @@ case "$state" in echo $aptget install \"$name\" fi ;; - uninstalled) + removed) # Remove only if existent if [ -n "$is_installed" ]; then echo $aptget remove \"$name\" diff --git a/conf/type/__package_pacman/gencode-remote b/conf/type/__package_pacman/gencode-remote index 536b7708..b31d097a 100755 --- a/conf/type/__package_pacman/gencode-remote +++ b/conf/type/__package_pacman/gencode-remote @@ -44,7 +44,7 @@ case "$state" in echo pacman "$pacopts" -S \"$name\" fi ;; - uninstalled) + removed) if [ "$pkg_version" ]; then echo pacman "$pacopts" -R \"$name\" fi diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote index 033298b1..215a1ae5 100755 --- a/conf/type/__package_yum/gencode-remote +++ b/conf/type/__package_yum/gencode-remote @@ -39,7 +39,7 @@ case "$state" in echo yum $opts install \"$name\" fi ;; - uninstalled) + removed) if ! grep -q "$not_installed" "$__object/explorer/pkg_version"; then echo yum $opts remove \"$name\" fi From 1687d82c9d88874bda757da031ce32b5379e1a31 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 16:26:56 +0200 Subject: [PATCH 0061/4996] ++changes in 1.6.0 Signed-off-by: Nico Schottelius --- doc/changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/changelog b/doc/changelog index cec4a11a..9672814f 100644 --- a/doc/changelog +++ b/doc/changelog @@ -3,6 +3,8 @@ * New type __debconf_set_selections * New explorer os_version * Fix Type __group in case of __group NAME syntax + * Fix __package* types: consistently name --state removed instead of + uninstalled or deinstalled * Type __package gained Fedora support * Removed --preseed support from __package_apt * explorer/os: gained Fedora support From 249977cca66bcff51778cf336ff377c076074016 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 16:49:09 +0200 Subject: [PATCH 0062/4996] document upcoming changes for 1.6 Signed-off-by: Nico Schottelius --- README | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README b/README index aba67707..52471068 100644 --- a/README +++ b/README @@ -106,14 +106,15 @@ how to use cdist. There are at least the following branches available: * master: the development branch - * 1.5: Focus on object orientation instead of global stage orientation + * 1.6: New types, cleaned up \_\_package* types, internal cleanup Old versions: + * 1.5: Focus on object orientation instead of global stage orientation * 1.4: Support for redefiniton of objects (if equal) * 1.3: Support for local and remote code execution (current stable) * 1.2: Dependencies supported - * 1.1: __file to __file, __directory, __link migration + * 1.1: \_\_file to \_\_file, \_\_directory, \_\_link migration * 1.0: First official release Other branches may be available for features or bugfixes, but they @@ -123,7 +124,7 @@ may vanish at any point. To select a specific branch use git checkout -b origin/ # Stay on a specific version - version=1.5 + version=1.6 git checkout -b $version origin/$version ### Mirrors @@ -145,6 +146,14 @@ If you stay on a version branche (i.e. 1.0, 1.1., ...), nothing should break. The master branch on the other hand is the development branch and may not be working, break your setup or eat the tree in your garden. +### Upgrading from 1.5 to 1.6 + +* If you used **\_\_package_apt --preseed**, you need to use the new + type **\_\_debconf_set_selections** instead. +* The **\_\_package** types accepted either --state deinstalled or + --state uninstaaled. Starting with 1.6, it was made consistently + to --state removed. + ### Upgrading from 1.3 to 1.5 No incompatiblities. From 519212e39684bc3d18e8ba6446496584365d02ca Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 16:53:56 +0200 Subject: [PATCH 0063/4996] error out if state given is unknown Signed-off-by: Nico Schottelius --- conf/type/__package_apt/gencode-remote | 4 ++++ conf/type/__package_pacman/gencode-remote | 4 ++++ conf/type/__package_yum/gencode-remote | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/conf/type/__package_apt/gencode-remote b/conf/type/__package_apt/gencode-remote index aac9beb1..df8fd823 100755 --- a/conf/type/__package_apt/gencode-remote +++ b/conf/type/__package_apt/gencode-remote @@ -52,4 +52,8 @@ case "$state" in echo $aptget remove \"$name\" fi ;; + *) + echo "Unknown state: $state" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_pacman/gencode-remote b/conf/type/__package_pacman/gencode-remote index b31d097a..347b037d 100755 --- a/conf/type/__package_pacman/gencode-remote +++ b/conf/type/__package_pacman/gencode-remote @@ -49,4 +49,8 @@ case "$state" in echo pacman "$pacopts" -R \"$name\" fi ;; + *) + echo "Unknown state: $state" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote index 215a1ae5..8bd81ca0 100755 --- a/conf/type/__package_yum/gencode-remote +++ b/conf/type/__package_yum/gencode-remote @@ -44,4 +44,8 @@ case "$state" in echo yum $opts remove \"$name\" fi ;; + *) + echo "Unknown state: $state" >&2 + exit 1 + ;; esac From c5925ff33153803ec50d718decf1dd4d6fced462 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 17:43:10 +0200 Subject: [PATCH 0064/4996] prepare version change Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index 026d8419..2e5c63b1 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -19,7 +19,7 @@ # # -__cdist_version="1.5.0" +__cdist_version="1.6.0pre" # Fail if something bogus is going on set -u From 4fc181273a0d56faaeef18fb762cdbd08cb061c1 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 17:58:09 +0200 Subject: [PATCH 0065/4996] ++todo Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index ebf506d4..abae0dcb 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -27,6 +27,7 @@ CORE - for use in manifest, code, etc.? - for creating temporary files, etc. +- How to cleanly implement "restart service if config file changed" TYPES ------ From 8ec728fd4bb24d7de7dd115cc513384c1b743942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Br=C3=B6nnimann?= Date: Tue, 5 Apr 2011 19:28:18 +0200 Subject: [PATCH 0066/4996] Type pkg_openbsd --- .../explorer/pkg_version | 31 +++++++++ .../type/__package_pkg_openbsd/gencode-remote | 64 +++++++++++++++++++ conf/type/__package_pkg_openbsd/man.text | 58 +++++++++++++++++ .../__package_pkg_openbsd/parameter/optional | 2 + .../__package_pkg_openbsd/parameter/required | 1 + 5 files changed, 156 insertions(+) create mode 100755 conf/type/__package_pkg_openbsd/explorer/pkg_version create mode 100755 conf/type/__package_pkg_openbsd/gencode-remote create mode 100644 conf/type/__package_pkg_openbsd/man.text create mode 100644 conf/type/__package_pkg_openbsd/parameter/optional create mode 100644 conf/type/__package_pkg_openbsd/parameter/required diff --git a/conf/type/__package_pkg_openbsd/explorer/pkg_version b/conf/type/__package_pkg_openbsd/explorer/pkg_version new file mode 100755 index 00000000..bc23a85d --- /dev/null +++ b/conf/type/__package_pkg_openbsd/explorer/pkg_version @@ -0,0 +1,31 @@ +#!/bin/sh +# +# 2011 Andi Brönnimann (andi-cdist at v-net.ch) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Retrieve the status of a package - parsed dpkg output +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +#TODO: Is there a better way? +pkg_info | grep "$name" | sed 's .*\(-[0-9.][0-9.]*\).* \1 ' | sed 's/-//' diff --git a/conf/type/__package_pkg_openbsd/gencode-remote b/conf/type/__package_pkg_openbsd/gencode-remote new file mode 100755 index 00000000..a5756c8d --- /dev/null +++ b/conf/type/__package_pkg_openbsd/gencode-remote @@ -0,0 +1,64 @@ +#!/bin/sh +# +# 2011 Andi Brönnimann (andi-cdist at v-net.ch) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Manage packages with Pacman (mostly archlinux) +# + +# Debug +# exec >&2 +# set -x + +os_version="$(cat "$__global/explorer/os_version")" +platform="$(cat "$__global/explorer/platform")" + + +if [ -f "$__object/parameter/flavor" ]; then + flavor="$(cat "$__object/parameter/flavor")" +fi + +# do not show progress bar +pkgopts="-x" + +if [ -f "$__object/parameter/name" ]; then + name="$__object/parameter/name" +else + name="$__object_id" +fi + +state="$(cat "$__object/parameter/state")" +pkg_version="$(cat "$__object/explorer/pkg_version")" + +# TODO: Shouldn't be hardcoded +echo export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/$os_version/packages/$platform/ + +case "$state" in + installed) + + # Empty? Not installed. + if [ -z "$pkg_version" ]; then + echo pkg_add "$pkgopts" \"$name--$flavor\" + fi + ;; + uninstalled) + if [ "$pkg_version" ]; then + echo pkg_delete "$pkgopts" \"$name--$flavor\" + fi + ;; +esac diff --git a/conf/type/__package_pkg_openbsd/man.text b/conf/type/__package_pkg_openbsd/man.text new file mode 100644 index 00000000..613c9045 --- /dev/null +++ b/conf/type/__package_pkg_openbsd/man.text @@ -0,0 +1,58 @@ +cdist-type__package_pkg(7) +============================= +Andreas Brönnimann + + +NAME +---- +cdist-type__package_pkg_openbsd - Manage OpenBSD packages + + +DESCRIPTION +----------- +This type is usually used on OpenBSD to manage packages. + + +REQUIRED PARAMETERS +------------------- +state:: + Either "installed" or "uninstalled". + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + +flavor:: + If supplied, use to avoid ambigous + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure zsh is installed +__package_pkg_openbsd zsh --state installed + +# Ensure vim is installed, use flavor no_x11 +__package_pkg_openbsd vim --state installed --flavor no_x11 + +# If you don't want to follow pythonX packages, but always use python +__package_pkg_openbsd python --state installed --name python2 + +# Remove obsolete package +__package_pkg_openbsd puppet --state uninstalled +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) + + +COPYING +------- +Copyright \(C) 2011 Andi Brönnimann. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__package_pkg_openbsd/parameter/optional b/conf/type/__package_pkg_openbsd/parameter/optional new file mode 100644 index 00000000..29b123ef --- /dev/null +++ b/conf/type/__package_pkg_openbsd/parameter/optional @@ -0,0 +1,2 @@ +name +flavor diff --git a/conf/type/__package_pkg_openbsd/parameter/required b/conf/type/__package_pkg_openbsd/parameter/required new file mode 100644 index 00000000..ff72b5c7 --- /dev/null +++ b/conf/type/__package_pkg_openbsd/parameter/required @@ -0,0 +1 @@ +state From aebf05001afd4a192bb49d228c7bae21b8c2540c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Br=C3=B6nnimann?= Date: Tue, 5 Apr 2011 19:40:54 +0200 Subject: [PATCH 0067/4996] Add platform explorer --- conf/explorer/platform | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100755 conf/explorer/platform diff --git a/conf/explorer/platform b/conf/explorer/platform new file mode 100755 index 00000000..a28f6d08 --- /dev/null +++ b/conf/explorer/platform @@ -0,0 +1,34 @@ +#!/bin/sh +# +# 2010-2011 Andi Brönnimann (andi-cdist at v-net.ch) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# All os variables are lower case +# +# + +os="$(cat "$__global/explorer/os")" + +case "$os" in + archlinux) + echo $(uname -m) + ;; + openbsd) + echo $(uname -m) + ;; +esac From 52fb8d5661d8a1004fcfa2cb45af31f5354bec04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Br=C3=B6nnimann?= Date: Tue, 5 Apr 2011 19:50:45 +0200 Subject: [PATCH 0068/4996] Change platform to hardware_type --- conf/explorer/{platform => hardware_type} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename conf/explorer/{platform => hardware_type} (100%) diff --git a/conf/explorer/platform b/conf/explorer/hardware_type similarity index 100% rename from conf/explorer/platform rename to conf/explorer/hardware_type From 864d25bd8cb2488be8f6e7964bfe9d7077bdb98e Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 20:26:00 +0200 Subject: [PATCH 0069/4996] reorder todos Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index abae0dcb..7e9d2d5d 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -29,6 +29,14 @@ CORE - How to cleanly implement "restart service if config file changed" +- Cache + - add example how to use + - export variable $__cache + -> for current host + -> add function to cdist-config, import from cdist-cache + +- check all all internal variables are prefixed with __cdist + TYPES ------ - __ssh-keys (host/user) @@ -36,19 +44,12 @@ TYPES - regexp replace (can probably cover all?) -> aka sed. - __cron -- __user: +- __user add option to include --create-home - fix __user NAME case (same issue as __group) DOCUMENTATION -------------- - asciidoc interprets __, which we use for variables names -> seek through docs and replace with \_\_! -- check all all internal variables are prefixed with __cdist - reference explorers in cdist-reference! -Cache: - - add example how to use - - export variable $__cache - -> for current host - -> add function to cdist-config, import from cdist-cache From c5675bc35240ba2711bc9e2cc00851ecdc068c90 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 20:38:22 +0200 Subject: [PATCH 0070/4996] add hint on asciidoc errors and how to fix Signed-off-by: Nico Schottelius --- doc/man/man7/cdist-hacker.text | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/man/man7/cdist-hacker.text b/doc/man/man7/cdist-hacker.text index d55f1c2f..03a348ed 100644 --- a/doc/man/man7/cdist-hacker.text +++ b/doc/man/man7/cdist-hacker.text @@ -59,7 +59,8 @@ HOW TO SUBMIT A NEW TYPE Submitting a type works as described above, with the additional requirement that a corresponding manpage named man.text in asciidoc format with the manpage-name "cdist-type__NAME" is included in the type directory -AND asciidoc is able to compile it. +AND asciidoc is able to compile it (i.e. do NOT have to many "=" in the second +line). SEE ALSO From 4701c14045b20681b05a41fb9266ad406e43822f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 20:55:35 +0200 Subject: [PATCH 0071/4996] new todo Signed-off-by: Nico Schottelius --- doc/dev/todo/niconext | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index e7f2c72f..1f01ff44 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1,2 +1,3 @@ -remove --preseed from package_apt and add debconf_set_selection or similar - -> much cleaner! +Cleanup documentation: + type reference -> add types + manpages + add explorer reference From d8eccddad089c3e07728c706f68805a5e21dcc95 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 5 Apr 2011 21:08:09 +0200 Subject: [PATCH 0072/4996] list types in type section Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index a5d1698a..be9c3bbf 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -132,8 +132,17 @@ tmp_dir:: TYPES ----- -The available types are listed in the SEE ALSO section -and are referenced as cdist-type__TYPENAME. +The following types are available: +eof + +for type in man7/cdist-type__*.text; do + name_1="${type#man7/}"; man="${name_1%.text}(7)" + name_2="${name_1%.7}"; + name="$name_2" + echo "- $name" "($man)" +done + +cat << eof ENVIRONMENT VARIABLES --------------------- @@ -172,16 +181,7 @@ __type_explorers:: SEE ALSO -------- - cdist(7) -eof -for type in man7/cdist-type__*.7; do - name_1="${type#man7/}" - name_2="${name_1%.7}" - name="$name_2" - echo "- ${name}(7)" -done - -cat < Date: Tue, 5 Apr 2011 22:46:51 +0200 Subject: [PATCH 0073/4996] import man pages changes Signed-off-by: Steven Armstrong --- doc/man/man1/cdist-object-all.text | 31 ++++++++++++++++++++++++++++++ doc/man/man7/cdist-stages.text | 22 ++++++++++----------- 2 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 doc/man/man1/cdist-object-all.text diff --git a/doc/man/man1/cdist-object-all.text b/doc/man/man1/cdist-object-all.text new file mode 100644 index 00000000..06d45268 --- /dev/null +++ b/doc/man/man1/cdist-object-all.text @@ -0,0 +1,31 @@ +cdist-object-all(1) +=================== +Steven Armstrong + + +NAME +---- +cdist-object-all - Run the given command on all objects + + +SYNOPSIS +-------- +cdist-object-all HOSTNAME COMMAND + + +DESCRIPTION +----------- +Iterates over all defined objects and executes the given command on each +of them. + + +SEE ALSO +-------- +- cdist(7) +- cdist-type(1) + + +COPYING +------- +Copyright \(C) 2011 Steven Armstrong. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/doc/man/man7/cdist-stages.text b/doc/man/man7/cdist-stages.text index e2eef3da..b95b58d2 100644 --- a/doc/man/man7/cdist-stages.text +++ b/doc/man/man7/cdist-stages.text @@ -11,8 +11,8 @@ DESCRIPTION ----------- Starting the execution of deployment with cdist-deploy-to(1), cdist passes through different stages, each can be triggered and debugged on its own. -Reading the source of the cdist-deploy-to and cdist-object-run-all executables -shows the scripts responsible for each stage. +Reading the source of the cdist-deploy-to executable shows the scripts +responsible for each stage. STAGE 0: INTERNAL PREPERATION @@ -56,7 +56,7 @@ STAGE 3: OBJECT INFORMATION RETRIEVAL ------------------------------------- Every object is checked whether its type has explorers and if so, these are transfered to the target host and executed. The results are transfered back -and can be used in the following stages to decide what changes need to made +and can be used in the following stages to decide what changes need to be made on the target to implement the desired state. Related documentation: @@ -68,10 +68,9 @@ Related documentation: STAGE 4: RUN THE OBJECT MANIFEST -------------------------------- -Every object is checked whether its type has a manifest file. If the type has -a manifest file and it is executable, it will be executed. The manifest script -may generate and change the created objects. In other words, one type can reuse -other types. +Every object is checked whether its type has a executable manifest. The +manifest script may generate and change the created objects. In other words, +one type can reuse other types. For instance the object __apache/www.test.ch is of type __apache, which may contain a manifest script, which creates new objects of type __file. @@ -88,11 +87,10 @@ Related documentation: STAGE 5: CODE GENERATION ------------------------ -In this stage for every created objects its type is checked whether it has a -gencode script. If the type has a gencode script and it is executable it will -be executed. This executable should create code to be executed on the target -on stdout. If the gencode executable fails, it must print diagnostic messages -on stderr and exit non-zero. +In this stage for every created objects its type is checked for executable +gencode whether scripts. The gencode scripts generate the code to be executed +on the target on stdout. If the gencode executables fail, they must print +diagnostic messages on stderr and exit non-zero. Related documentation: - cdist-object-gencode-run(1) From 3e46d593ae480599342f4a2aa906a921900c9df7 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 22:48:24 +0200 Subject: [PATCH 0074/4996] remove obsolete man page Signed-off-by: Steven Armstrong --- doc/man/man1/cdist-object-run-all.text | 33 -------------------------- 1 file changed, 33 deletions(-) delete mode 100644 doc/man/man1/cdist-object-run-all.text diff --git a/doc/man/man1/cdist-object-run-all.text b/doc/man/man1/cdist-object-run-all.text deleted file mode 100644 index 9e36b3d4..00000000 --- a/doc/man/man1/cdist-object-run-all.text +++ /dev/null @@ -1,33 +0,0 @@ -cdist-object-run-all(1) -======================= -Nico Schottelius - - -NAME ----- -cdist-object-run-all - Run all created objects on the target host - - -SYNOPSIS --------- -cdist-object-run-all HOSTNAME - - -DESCRIPTION ------------ -Transfers type explorers to the target then runs cdist-object-run(1) -for each created object. - - -SEE ALSO --------- -- cdist(7) -- cdist-type-explorer-push(1) -- cdist-object-run(1) -- cdist-type(1) - - -COPYING -------- -Copyright \(C) 2011 Nico Schottelius, Steven Armstrong. Free use of this software is -granted under the terms of the GNU General Public License version 3 (GPLv3). From 13ce077e8e5395a137a9935161b548aded6223c5 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 22:50:38 +0200 Subject: [PATCH 0075/4996] docfix Signed-off-by: Steven Armstrong --- doc/man/man7/cdist-stages.text | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/man/man7/cdist-stages.text b/doc/man/man7/cdist-stages.text index b95b58d2..294dffc7 100644 --- a/doc/man/man7/cdist-stages.text +++ b/doc/man/man7/cdist-stages.text @@ -87,10 +87,10 @@ Related documentation: STAGE 5: CODE GENERATION ------------------------ -In this stage for every created objects its type is checked for executable -gencode whether scripts. The gencode scripts generate the code to be executed -on the target on stdout. If the gencode executables fail, they must print -diagnostic messages on stderr and exit non-zero. +In this stage for every created object its type is checked for executable +gencode scripts. The gencode scripts generate the code to be executed on the +target on stdout. If the gencode executables fail, they must print diagnostic +messages on stderr and exit non-zero. Related documentation: - cdist-object-gencode-run(1) From 71765210bb8ac5bf9605abf0e9d9dac564cf831b Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 22:55:46 +0200 Subject: [PATCH 0076/4996] rename cdist-object-process to cdist-object-prepare Signed-off-by: Steven Armstrong --- bin/cdist-config | 6 +++--- bin/cdist-deploy-to | 2 +- bin/{cdist-object-process => cdist-object-prepare} | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) rename bin/{cdist-object-process => cdist-object-prepare} (85%) diff --git a/bin/cdist-config b/bin/cdist-config index 2e5c63b1..e1e82f28 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -55,7 +55,7 @@ __cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname" : ${__cdist_name_manifest:=manifest} : ${__cdist_name_object:=object} : ${__cdist_name_object_finished:=done} -: ${__cdist_name_object_processed:=processed} +: ${__cdist_name_object_prepared:=prepared} : ${__cdist_name_object_id:=object_id} : ${__cdist_name_object_source:=source} : ${__cdist_name_objects_created:=.objects_created} @@ -210,9 +210,9 @@ __cdist_object_code() echo "$(__cdist_object_dir "$1")/${__cdist_name_code}" } -__cdist_object_processed() +__cdist_object_prepared() { - echo "$(__cdist_object_dir "$1")/${__cdist_name_object_processed}" + echo "$(__cdist_object_dir "$1")/${__cdist_name_object_prepared}" } __cdist_object_finished() diff --git a/bin/cdist-deploy-to b/bin/cdist-deploy-to index 02fd34fa..dab5d9a5 100755 --- a/bin/cdist-deploy-to +++ b/bin/cdist-deploy-to @@ -49,7 +49,7 @@ cdist-dir push "$__cdist_target_host" \ "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}" cdist-explorer-run-global "$__cdist_target_host" cdist-manifest-run-init "$__cdist_target_host" -cdist-object-all "$__cdist_target_host" cdist-object-process +cdist-object-all "$__cdist_target_host" cdist-object-prepare cdist-object-all "$__cdist_target_host" cdist-object-run cdist-cache "$__cdist_target_host" diff --git a/bin/cdist-object-process b/bin/cdist-object-prepare similarity index 85% rename from bin/cdist-object-process rename to bin/cdist-object-prepare index 777d2c88..8c92ff73 100755 --- a/bin/cdist-object-process +++ b/bin/cdist-object-prepare @@ -36,13 +36,13 @@ __cdist_object_dir="$(__cdist_object_dir "$__cdist_object")" # Export to non-core for use in manifest and gencode scripts export $__cdist_name_var_self=$__cdist_object -__cdist_object_processed="$(__cdist_object_processed "$__cdist_object")" -if [ ! -f "$__cdist_object_processed" ]; then +__cdist_object_prepared="$(__cdist_object_prepared "$__cdist_object")" +if [ ! -f "$__cdist_object_prepared" ]; then echo - echo "Processing object $__cdist_object" + echo "Preparing object $__cdist_object" cdist-object-explorer-run "$__cdist_target_host" "$__cdist_object" cdist-object-manifest-run "$__cdist_target_host" "$__cdist_object" - # Mark this object as processed - touch "$__cdist_object_processed" + # Mark this object as prepared + touch "$__cdist_object_prepared" fi From b226b30dbad977bac321a0b23741584cedd6d1d2 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 23:02:34 +0200 Subject: [PATCH 0077/4996] add man page for cdist-object-prepare Signed-off-by: Steven Armstrong --- doc/man/man1/cdist-object-prepare.text | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 doc/man/man1/cdist-object-prepare.text diff --git a/doc/man/man1/cdist-object-prepare.text b/doc/man/man1/cdist-object-prepare.text new file mode 100644 index 00000000..c91a7b2e --- /dev/null +++ b/doc/man/man1/cdist-object-prepare.text @@ -0,0 +1,35 @@ +cdist-object-prepare(1) +======================= +Steven Armstrong + + +NAME +---- +cdist-object-prepare - Prepare an object + + +SYNOPSIS +-------- +cdist-object-prepare HOSTNAME OBJECT + + +DESCRIPTION +----------- +Prepare the given object by running it through stage 3 (object information +retrieval) and stage 4 (run the object manifest). +See related man pages for details. + + +SEE ALSO +-------- +- cdist(7) +- cdist-stages(7) +- cdist-object-explorer-run(1) +- cdist-object-manifest-run(1) +- cdist-type(1) + + +COPYING +------- +Copyright \(C) 2011 Steven Armstrong. Free use of this software is granted +under the terms of the GNU General Public License version 3 (GPLv3). From 40d4b4d1be7a49fed88323bf71644e8062a594df Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 23:10:58 +0200 Subject: [PATCH 0078/4996] update man page for cdist-object-run Signed-off-by: Steven Armstrong --- doc/man/man1/cdist-object-run.text | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/man/man1/cdist-object-run.text b/doc/man/man1/cdist-object-run.text index fca6db91..fc85a05f 100644 --- a/doc/man/man1/cdist-object-run.text +++ b/doc/man/man1/cdist-object-run.text @@ -1,6 +1,6 @@ cdist-object-run(1) =================== -Nico Schottelius +Steven Armstrong NAME @@ -15,15 +15,15 @@ cdist-object-run HOSTNAME OBJECT DESCRIPTION ----------- -Runs the given object on the given target host. -The different subtasks are dispatched to specialized exectuables. +Applies the given object on the target host by running it through stage 5 +(code generation) and stage 6 (code execution). See related man pages for details. SEE ALSO -------- - cdist(7) -- cdist-object-explorer-run(1) +- cdist-stages(7) - cdist-object-gencode-run(1) - cdist-object-push(1) - cdist-object-code-run(1) @@ -32,5 +32,5 @@ SEE ALSO COPYING ------- -Copyright \(C) 2011 Nico Schottelius, Steven Armstrong. Free use of this software is +Copyright \(C) 2011 Steven Armstrong. Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). From aeb7d34a8e81d829fd8af9c66707a8ebacefdaef Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 23:11:31 +0200 Subject: [PATCH 0079/4996] -todo Signed-off-by: Steven Armstrong --- doc/dev/todo/TAKEME | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index 7e9d2d5d..0fcced96 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -16,7 +16,6 @@ CORE - cdist-object-gencode: remove code if output empty? - also take care of that in cdist-code-run! -- cdist-object-process -> cdist-object-prepare - Remove cdist-object-push, covers only one line and is used only once: [20:22] kr:bin% grep cdist-object-push * cdist-object-run: cdist-object-push "$__cdist_target_host" "$__cdist_object" From ab741197ba7f22634090d6fec7b679e7aeaeca1b Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 23:17:37 +0200 Subject: [PATCH 0080/4996] docfix: /etc/cdist is no more Signed-off-by: Steven Armstrong --- doc/man/man1/cdist-deploy-to.text | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/man1/cdist-deploy-to.text b/doc/man/man1/cdist-deploy-to.text index acbb915a..93417a77 100644 --- a/doc/man/man1/cdist-deploy-to.text +++ b/doc/man/man1/cdist-deploy-to.text @@ -23,7 +23,7 @@ called stages. It is intented to run either from the command line or from cron. ENVIRONMENT ----------- If the environment variable **__cdist_conf_dir** is not set, the -configuration is read from /etc/cdist. The local output directory can +configuration is read from /conf. The local output directory can be changed by the variable **__cdist_local_base_dir**. All environment variables are handled by cdist-config. From ff2581a25fe1ce9197ddbc97e811ef6c058c3262 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 23:21:26 +0200 Subject: [PATCH 0081/4996] /cdist-object-run-all/cdist-object-run/ Signed-off-by: Steven Armstrong --- doc/man/man1/cdist-object-code-run.text | 2 +- doc/man/man1/cdist-object-gencode-run.text | 2 +- doc/man/man1/cdist-object-push.text | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/man/man1/cdist-object-code-run.text b/doc/man/man1/cdist-object-code-run.text index a055fc97..f8bae6a4 100644 --- a/doc/man/man1/cdist-object-code-run.text +++ b/doc/man/man1/cdist-object-code-run.text @@ -21,7 +21,7 @@ Execute the local and remote code for the given object. SEE ALSO -------- - cdist(7) -- cdist-object-run-all(1) +- cdist-object-run(1) - cdist-code-run(1) - cdist-run-remote(1) diff --git a/doc/man/man1/cdist-object-gencode-run.text b/doc/man/man1/cdist-object-gencode-run.text index be2d3448..7705815c 100644 --- a/doc/man/man1/cdist-object-gencode-run.text +++ b/doc/man/man1/cdist-object-gencode-run.text @@ -22,7 +22,7 @@ SEE ALSO -------- - cdist(7) - cdist-code-run(1) -- cdist-object-run-all(1) +- cdist-object-run(1) - cdist-object-gencode(1) diff --git a/doc/man/man1/cdist-object-push.text b/doc/man/man1/cdist-object-push.text index 5bff71cf..4c960eaa 100644 --- a/doc/man/man1/cdist-object-push.text +++ b/doc/man/man1/cdist-object-push.text @@ -21,7 +21,7 @@ Transfers the given object to the target host. SEE ALSO -------- - cdist(7) -- cdist-object-run-all(1) +- cdist-object-run(1) - cdist-type(1) From 836c2ae7b8ef412888fc596b6ee38cd32fbb2bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Br=C3=B6nnimann?= Date: Tue, 5 Apr 2011 23:23:24 +0200 Subject: [PATCH 0082/4996] Add error output to __package_pkg_openbsd --- conf/explorer/hardware_type | 7 ++-- .../type/__package_pkg_openbsd/gencode-remote | 35 +++++++++++++++---- conf/type/__package_pkg_openbsd/man.text | 6 ++-- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/conf/explorer/hardware_type b/conf/explorer/hardware_type index a28f6d08..5966b11e 100755 --- a/conf/explorer/hardware_type +++ b/conf/explorer/hardware_type @@ -22,13 +22,10 @@ # # -os="$(cat "$__global/explorer/os")" +os="$($__explorer/os)" case "$os" in - archlinux) - echo $(uname -m) - ;; - openbsd) + archlinux|*bsd) echo $(uname -m) ;; esac diff --git a/conf/type/__package_pkg_openbsd/gencode-remote b/conf/type/__package_pkg_openbsd/gencode-remote index a5756c8d..0ad85458 100755 --- a/conf/type/__package_pkg_openbsd/gencode-remote +++ b/conf/type/__package_pkg_openbsd/gencode-remote @@ -18,7 +18,7 @@ # along with cdist. If not, see . # # -# Manage packages with Pacman (mostly archlinux) +# Manage packages with pkg on OpenBSD # # Debug @@ -26,7 +26,7 @@ # set -x os_version="$(cat "$__global/explorer/os_version")" -platform="$(cat "$__global/explorer/platform")" +hardware_type="$(cat "$__global/explorer/hardware_type")" if [ -f "$__object/parameter/flavor" ]; then @@ -46,19 +46,40 @@ state="$(cat "$__object/parameter/state")" pkg_version="$(cat "$__object/explorer/pkg_version")" # TODO: Shouldn't be hardcoded -echo export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/$os_version/packages/$platform/ +echo export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/$os_version/packages/$hardware_type/ case "$state" in installed) - # Empty? Not installed. if [ -z "$pkg_version" ]; then - echo pkg_add "$pkgopts" \"$name--$flavor\" + # use this because pkg_add doesn't properly handle errors + cat << eof + status=\$(pkg_add "$pkgopts" "$name--$flavor") + + # no error + if [ -n "\$status" ]; then + echo "Error: \$status" + exit 1 + fi +eof fi ;; - uninstalled) + removed) if [ "$pkg_version" ]; then - echo pkg_delete "$pkgopts" \"$name--$flavor\" + # use this because pkg_add doesn't properly handle errors + cat << eof + status=\$(pkg_delete "$pkgopts" "$name--$flavor") + + # no error + if [ -n "\$status" ]; then + echo "Error: \$status" + exit 1 + fi +eof fi ;; + *) + echo "Unknown state: $state" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_pkg_openbsd/man.text b/conf/type/__package_pkg_openbsd/man.text index 613c9045..32501ba8 100644 --- a/conf/type/__package_pkg_openbsd/man.text +++ b/conf/type/__package_pkg_openbsd/man.text @@ -1,6 +1,6 @@ cdist-type__package_pkg(7) ============================= -Andreas Brönnimann +Andi Brönnimann NAME @@ -16,7 +16,7 @@ This type is usually used on OpenBSD to manage packages. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "uninstalled". + Either "installed" or "removed". OPTIONAL PARAMETERS @@ -42,7 +42,7 @@ __package_pkg_openbsd vim --state installed --flavor no_x11 __package_pkg_openbsd python --state installed --name python2 # Remove obsolete package -__package_pkg_openbsd puppet --state uninstalled +__package_pkg_openbsd puppet --state removed -------------------------------------------------------------------------------- From dcd96c04d40b3aed414c94fae0c327d26135fbeb Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Tue, 5 Apr 2011 23:27:51 +0200 Subject: [PATCH 0083/4996] explicitly delete generated cdist-reference.text man page Signed-off-by: Steven Armstrong --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index 2df76539..e033c007 100755 --- a/build.sh +++ b/build.sh @@ -99,6 +99,7 @@ case "$1" in ;; clean) + rm -f ${MAN7DSTDIR}/cdist-reference.text find "${MANDIR}" -mindepth 2 -type l \ -o -name "*.1" \ -o -name "*.7" \ From d3a376545f291d72323659930a8ee3bac4e0bf27 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 09:32:11 +0200 Subject: [PATCH 0084/4996] generate new type listing Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index be9c3bbf..67e16989 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -21,6 +21,8 @@ # Generate manpage that lists available types # +FIXME: __ breaks again in asciidoc! + __cdist_pwd="$(pwd -P)" __cdist_mydir="${0%/*}"; __cdist_abs_mydir="$(cd "$__cdist_mydir" && pwd -P)" @@ -133,12 +135,15 @@ tmp_dir:: TYPES ----- The following types are available: + eof for type in man7/cdist-type__*.text; do - name_1="${type#man7/}"; man="${name_1%.text}(7)" - name_2="${name_1%.7}"; - name="$name_2" + no_dir="${type#man7/}"; + no_type="${no_dir#cdist-type}"; + name="${no_type%.text}"; + man="${no_dir%.text}(7)" + echo "- $name" "($man)" done From 7496639e1fbba99fe98a38916eaffb7541c8346b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 13:56:16 +0200 Subject: [PATCH 0085/4996] add template for cdist-mass-deploy Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 56 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 bin/cdist-mass-deploy diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy new file mode 100755 index 00000000..dab5d9a5 --- /dev/null +++ b/bin/cdist-mass-deploy @@ -0,0 +1,56 @@ +#!/bin/sh +# +# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Deploy configuration to a host +# + +. cdist-config +[ $# -eq 1 ] || __cdist_usage "" +set -eu + +__cdist_target_host="$1" + +# Make target host available for non-core +export $__cdist_name_var_target_host="$__cdist_target_host" +export $__cdist_name_var_target_user="$__cdist_remote_user" + +# Export variables for core, which others do not reset +export __cdist_local_base_dir + +echo "cdist $__cdist_version: Configuring $__cdist_target_host" + +################################################################################ +# See cdist-stages(7) +# + +# Prepare local and remote directories +__cdist_init_deploy "$__cdist_target_host" + +# Transfer cdist executables +echo "Transferring cdist binaries to $__cdist_target_host ..." +cdist-dir push "$__cdist_target_host" \ + "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}" +cdist-explorer-run-global "$__cdist_target_host" +cdist-manifest-run-init "$__cdist_target_host" +cdist-object-all "$__cdist_target_host" cdist-object-prepare +cdist-object-all "$__cdist_target_host" cdist-object-run +cdist-cache "$__cdist_target_host" + +echo "cdist $__cdist_version: Successfully finished run on $__cdist_target_host" From e84ab9e14c4d86209c3bc63ec7ad177eca83f5ed Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 13:58:00 +0200 Subject: [PATCH 0086/4996] in theory finish cdist-mass-deploy Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index dab5d9a5..3adb166c 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -1,6 +1,6 @@ #!/bin/sh # -# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2011 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -18,39 +18,14 @@ # along with cdist. If not, see . # # -# Deploy configuration to a host +# Deploy configuration to many hosts # . cdist-config -[ $# -eq 1 ] || __cdist_usage "" +[ $# -lt 1 ] || __cdist_usage " [target host ...]" set -eu -__cdist_target_host="$1" - -# Make target host available for non-core -export $__cdist_name_var_target_host="$__cdist_target_host" -export $__cdist_name_var_target_user="$__cdist_remote_user" - -# Export variables for core, which others do not reset -export __cdist_local_base_dir - -echo "cdist $__cdist_version: Configuring $__cdist_target_host" - -################################################################################ -# See cdist-stages(7) -# - -# Prepare local and remote directories -__cdist_init_deploy "$__cdist_target_host" - -# Transfer cdist executables -echo "Transferring cdist binaries to $__cdist_target_host ..." -cdist-dir push "$__cdist_target_host" \ - "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}" -cdist-explorer-run-global "$__cdist_target_host" -cdist-manifest-run-init "$__cdist_target_host" -cdist-object-all "$__cdist_target_host" cdist-object-prepare -cdist-object-all "$__cdist_target_host" cdist-object-run -cdist-cache "$__cdist_target_host" - -echo "cdist $__cdist_version: Successfully finished run on $__cdist_target_host" +while [ $# -ge 1 ]; do + cdist-deploy-to "$1" + shift +done From 32c261293488196dc8f5c28c3fcc0d9bad46452e Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 13:59:34 +0200 Subject: [PATCH 0087/4996] ge vs lt Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 3adb166c..84e4376d 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -22,7 +22,7 @@ # . cdist-config -[ $# -lt 1 ] || __cdist_usage " [target host ...]" +[ $# -ge 1 ] || __cdist_usage " [target host ...]" set -eu while [ $# -ge 1 ]; do From 86a6b10ae9dcb2386154e2ba1feb19529f4e2c6b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:00:41 +0200 Subject: [PATCH 0088/4996] more stuff for the next wonderful release Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 9672814f..0ba6b2f0 100644 --- a/doc/changelog +++ b/doc/changelog @@ -9,6 +9,7 @@ * Removed --preseed support from __package_apt * explorer/os: gained Fedora support * Simplified types __user and __group + * New helper binary: cdist-mass-deploy 1.5.0: 2011-04-01 * Add basic cache functionality From b9ef12b48d20c284e3cbf986f7ba4ec824a7ee81 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:05:47 +0200 Subject: [PATCH 0089/4996] enhance cdist-mass-deploy and add parallel execution Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 84e4376d..f5790c03 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -22,10 +22,25 @@ # . cdist-config -[ $# -ge 1 ] || __cdist_usage " [target host ...]" +[ $# -ge 1 ] || __cdist_usage "[-p] [target host ...]" set -eu +if [ "$1" = "-p" ]; then + parallel=yes +else + parallel="" +fi + while [ $# -ge 1 ]; do - cdist-deploy-to "$1" + if [ "$parallel" ]; then + cdist-deploy-to "$1" & + else + cdist-deploy-to "$1" + fi shift done + +if [ "$parallel" ]; then + echo "Waiting for cdist-deploy-to jobs to finish..." + wait +fi From 5aa32fa42d042e82dc9a69f26ac8fba18ba27f2b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:16:33 +0200 Subject: [PATCH 0090/4996] beautify parallel mode Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index f5790c03..f3e526cc 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -25,21 +25,22 @@ [ $# -ge 1 ] || __cdist_usage "[-p] [target host ...]" set -eu +parallel="" if [ "$1" = "-p" ]; then parallel=yes -else - parallel="" + shift fi while [ $# -ge 1 ]; do - if [ "$parallel" ]; then - cdist-deploy-to "$1" & - else - cdist-deploy-to "$1" - fi + # always assume we run parallel + cdist-deploy-to "$1" | awk -v host=$1 '{ print "[" host "]" $0 }"' & shift + + # if not, wait for it _now_ + [ "$parallel" ] || fg done +# else wait after all are started if [ "$parallel" ]; then echo "Waiting for cdist-deploy-to jobs to finish..." wait From 75509dc8a53396dc3af2fb839e0c0163e1b98f9a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:18:14 +0200 Subject: [PATCH 0091/4996] PLUS whitespace (not only, but also for Steven) Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index f3e526cc..1bd6939e 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -33,7 +33,7 @@ fi while [ $# -ge 1 ]; do # always assume we run parallel - cdist-deploy-to "$1" | awk -v host=$1 '{ print "[" host "]" $0 }"' & + cdist-deploy-to "$1" | awk -v host=$1 '{ print "[" host "] " $0 }' & shift # if not, wait for it _now_ From 1973ac0787d70f4b164a0f3349a2965c2621ecca Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:22:44 +0200 Subject: [PATCH 0092/4996] use wait instead of fg Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 1bd6939e..2753bcab 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -37,7 +37,7 @@ while [ $# -ge 1 ]; do shift # if not, wait for it _now_ - [ "$parallel" ] || fg + [ "$parallel" ] || wait done # else wait after all are started From 7e1b7614b1b07acacc578a430f5040daf5e8bc5a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:44:19 +0200 Subject: [PATCH 0093/4996] finish manpage for cdist-mass-deploy Signed-off-by: Nico Schottelius --- doc/man/man1/cdist-mass-deploy.text | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 doc/man/man1/cdist-mass-deploy.text diff --git a/doc/man/man1/cdist-mass-deploy.text b/doc/man/man1/cdist-mass-deploy.text new file mode 100644 index 00000000..ac495b21 --- /dev/null +++ b/doc/man/man1/cdist-mass-deploy.text @@ -0,0 +1,41 @@ +cdist-mass-deploy(1) +==================== +Nico Schottelius + + +NAME +---- +cdist-mass-deploy - Deploy configuration to many hosts + + +SYNOPSIS +-------- +cdist-mass-deploy [-p] HOSTNAME [HOSTNAME ...] + + +DESCRIPTION +----------- +cdist-mass-deploy is essentially a wrapper around cdist-deploy-to to +be able to deploy to many hosts on one command line. + + +EXAMPLES +-------- +Deploy in parallel to all hosts specfied in the dsh group configuration ikr, +which is prefixed by "root@": + +-------------------------------------------------------------------------------- +cdist-mass-deploy -p $(cat ~/.dsh/group/ikr | sed 's/^root@//') +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist(7) +- cdist-deploy-to(1) + + +COPYING +------- +Copyright \(C) 2010-2011 Nico Schottelius. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). From 9c1d6061616af161fc9343a0c59be80201840cac Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 14:47:39 +0200 Subject: [PATCH 0094/4996] -fixme, __ issue needs to be fixed globally Signed-off-by: Nico Schottelius --- doc/man/cdist-reference.text.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index 67e16989..51ae2a55 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -21,8 +21,6 @@ # Generate manpage that lists available types # -FIXME: __ breaks again in asciidoc! - __cdist_pwd="$(pwd -P)" __cdist_mydir="${0%/*}"; __cdist_abs_mydir="$(cd "$__cdist_mydir" && pwd -P)" From 4aa0d803109f52054d97e5e65dd1c1a4d79b1dfa Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 19:36:57 +0200 Subject: [PATCH 0095/4996] prepare files for 1.6.0 release Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- doc/changelog | 2 +- doc/dev/todo/1.6 | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 doc/dev/todo/1.6 diff --git a/bin/cdist-config b/bin/cdist-config index e1e82f28..96de4664 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -19,7 +19,7 @@ # # -__cdist_version="1.6.0pre" +__cdist_version="1.6.0" # Fail if something bogus is going on set -u diff --git a/doc/changelog b/doc/changelog index 0ba6b2f0..9dda1806 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,4 +1,4 @@ -1.6.0: +1.6.0: 2011-04-06 * New Type __package_yum * New type __debconf_set_selections * New explorer os_version diff --git a/doc/dev/todo/1.6 b/doc/dev/todo/1.6 deleted file mode 100644 index 12a83e93..00000000 --- a/doc/dev/todo/1.6 +++ /dev/null @@ -1,3 +0,0 @@ -Documentation: - - update stages - - go through all manpages and ensure __ and co are correct From 4165b4fe15605d0fddac6f998b9d8d11e4dd1c75 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 19:40:42 +0200 Subject: [PATCH 0096/4996] rephrase introduction Signed-off-by: Nico Schottelius --- README | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README b/README index 52471068..54f792a7 100644 --- a/README +++ b/README @@ -15,17 +15,16 @@ "P' "" "" -[[!toc levels=2]] +[[!toc levels=2]] ## Introduction -cdist configures your system and is similar to -other configuration management systems like +cdist is an alternative to other configuration management systems like [cfengine](http://www.cfengine.org/), [bcfg2](http://trac.mcs.anl.gov/projects/bcfg2), [chef](http://wiki.opscode.com/display/chef/) -and [puppet](http://www.puppetlabs.com/), but it ticks differently. -Here are some features that makes it unique: +and [puppet](http://www.puppetlabs.com/). +But cdist ticks differently, here is the feature set that makes it unique: [[!table data=""" Keywords | Description From 723046fdd2756bd7a3ed4905b71b3bca40f654d9 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:00:36 +0200 Subject: [PATCH 0097/4996] introduce and use __cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-config | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/bin/cdist-config b/bin/cdist-config index 96de4664..efb8c3c0 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -148,22 +148,37 @@ __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX") ################################################################################ # Internal functions # -__cdist_debug_echo() +__cdist_echo() { - if [ "$__cdist_debug" ]; then - echo "Debug: $@" - fi + __cdist_echo_type="$1"; shift + + case "$__cdist_echo_type" in + debug) + if [ "$__cdist_debug" ]; then + echo "Debug: $@" + fi + ;; + info) + echo "$@" + ;; + error) + echo "Error: $@" >&2 + ;; + esac } __cdist_exec_fail_on_error() { sh -e "$@" - [ "$?" -eq 0 ] || __cdist_exit_err "$1 exited non-zero." + if [ "$?" -ne 0 ]; then + __cdist_echo error "$1 exited non-zero." + __cdist_exit_err "$1 exited non-zero." + fi } __cdist_exit_err() { - echo "Error: $@" >&2 + __cdist_echo error "$@" exit 1 } From aad8070d266b4efa68310c9151b6ba8bab1e0b55 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:00:53 +0200 Subject: [PATCH 0098/4996] todo/nico++ Signed-off-by: Nico Schottelius --- doc/dev/todo/niconext | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index 1f01ff44..5df1cb61 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1,3 +1,5 @@ +Introduce better logging + Cleanup documentation: type reference -> add types + manpages add explorer reference From 90f5d4716445cdfc6adc18d210344508dfb494ee Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:04:34 +0200 Subject: [PATCH 0099/4996] add warning level Signed-off-by: Nico Schottelius --- bin/cdist-config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/cdist-config b/bin/cdist-config index efb8c3c0..8195a304 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -161,6 +161,9 @@ __cdist_echo() info) echo "$@" ;; + warning) + echo "Warning: $@" + ;; error) echo "Error: $@" >&2 ;; From 08d18ec1ec029307e988a63137eefe38675226a3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:05:58 +0200 Subject: [PATCH 0100/4996] show broken code Signed-off-by: Nico Schottelius --- bin/cdist-config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/cdist-config b/bin/cdist-config index 8195a304..b5e1fe10 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -174,8 +174,9 @@ __cdist_exec_fail_on_error() { sh -e "$@" if [ "$?" -ne 0 ]; then - __cdist_echo error "$1 exited non-zero." - __cdist_exit_err "$1 exited non-zero." + __cdist_echo error "$1 exited non-zero, showing code:" + cat "$1" + __cdist_exit_err "Aborting due to non-zero exit code." fi } From 813b4e1f2be440b960c90c28e7bf62c7c8cc4ca7 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:11:39 +0200 Subject: [PATCH 0101/4996] use __cdist_exec_fail_on_error in bin/cdist-code-run Signed-off-by: Nico Schottelius --- bin/cdist-code-run | 2 +- bin/cdist-config | 12 ++++++++---- bin/cdist-object-code-run | 6 ++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/bin/cdist-code-run b/bin/cdist-code-run index 54cb312f..cf7e8e8d 100755 --- a/bin/cdist-code-run +++ b/bin/cdist-code-run @@ -40,7 +40,7 @@ if [ -e "$code" ]; then if [ -f "$code" ]; then if [ -x "$code" ]; then echo "Executing code-${__cdist_gencode_type} for $__cdist_object ..." - "$code" + __cdist_exec_fail_on_error "$code" else __cdist_exit_err "$code exists, but is not executable." fi diff --git a/bin/cdist-config b/bin/cdist-config index b5e1fe10..8678d205 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -152,20 +152,24 @@ __cdist_echo() { __cdist_echo_type="$1"; shift + if [ "$__cdist_object_self" ]; then + __cdist_echo_prefix="$__cdist_object_self" + fi + case "$__cdist_echo_type" in debug) if [ "$__cdist_debug" ]; then - echo "Debug: $@" + echo $__cdist_echo_prefix "Debug: $@" fi ;; info) - echo "$@" + echo $__cdist_echo_prefix "$@" ;; warning) - echo "Warning: $@" + echo $__cdist_echo_prefix "Warning: $@" ;; error) - echo "Error: $@" >&2 + echo $__cdist_echo_prefix "Error: $@" >&2 ;; esac } diff --git a/bin/cdist-object-code-run b/bin/cdist-object-code-run index 97cb58ac..fa63aaba 100755 --- a/bin/cdist-object-code-run +++ b/bin/cdist-object-code-run @@ -31,10 +31,8 @@ __cdist_object="$1"; shift # Code local export __cdist_out_object_dir="$__cdist_out_object_dir" -cdist-code-run "$__cdist_object" "${__cdist_name_gencode_local}" \ - || __cdist_exit_err "Local code failed for $__cdist_object" +cdist-code-run "$__cdist_object" "${__cdist_name_gencode_local}" # Code remote cdist-run-remote "$__cdist_target_host" \ - "cdist-code-run" "$__cdist_object" "${__cdist_name_gencode_remote}" \ - || __cdist_exit_err "Remote code failed for $__cdist_object" + "cdist-code-run" "$__cdist_object" "${__cdist_name_gencode_remote}" From d31833a78ebe1f23062b4729edaeb02fcb5ce62a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:16:16 +0200 Subject: [PATCH 0102/4996] begin use of __cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-code-run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-code-run b/bin/cdist-code-run index cf7e8e8d..3259fb1b 100755 --- a/bin/cdist-code-run +++ b/bin/cdist-code-run @@ -34,7 +34,7 @@ fi code="$(__cdist_object_code "$__cdist_object")-${__cdist_gencode_type}" -echo "Checking code-${__cdist_gencode_type} for $__cdist_object ..." +__cdist_echo info "Checking code-${__cdist_gencode_type}" if [ -e "$code" ]; then if [ -f "$code" ]; then From e28923558920bbe9bb8461c1710c00a1318c8131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Br=C3=B6nnimann?= Date: Wed, 6 Apr 2011 20:16:36 +0200 Subject: [PATCH 0103/4996] Fix typo --- conf/type/__package_pkg_openbsd/man.text | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__package_pkg_openbsd/man.text b/conf/type/__package_pkg_openbsd/man.text index 32501ba8..c0fae241 100644 --- a/conf/type/__package_pkg_openbsd/man.text +++ b/conf/type/__package_pkg_openbsd/man.text @@ -25,7 +25,7 @@ name:: If supplied, use the name and not the object id as the package name. flavor:: - If supplied, use to avoid ambigous + If supplied, use to avoid ambiguity. EXAMPLES From 3c7a226e0f256f0e825feb1d85b326ffbaf21c3f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:17:00 +0200 Subject: [PATCH 0104/4996] stuff for 1.6.1 Signed-off-by: Nico Schottelius --- doc/changelog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/changelog b/doc/changelog index 9dda1806..0ca26837 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,3 +1,6 @@ +1.6.1: + * Logging restructured + 1.6.0: 2011-04-06 * New Type __package_yum * New type __debconf_set_selections From a23c926df75749b18dca1f90e199600f1cd79bfd Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:17:28 +0200 Subject: [PATCH 0105/4996] add reference to cdist-mass-deploy in cdist-deploy-to manpage Signed-off-by: Nico Schottelius --- doc/man/man1/cdist-deploy-to.text | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/man/man1/cdist-deploy-to.text b/doc/man/man1/cdist-deploy-to.text index 93417a77..f42a0509 100644 --- a/doc/man/man1/cdist-deploy-to.text +++ b/doc/man/man1/cdist-deploy-to.text @@ -32,6 +32,7 @@ SEE ALSO -------- - cdist(7) - cdist-config(1) +- cdist-mass-deploy(1) - cdist-reference(7) - cdist-stages(7) From e4390da300a87ce4a97ed18985145b2b4adaf41b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:18:31 +0200 Subject: [PATCH 0106/4996] requiring set +e in __cdist_exec_fail_on_error to catch error ourselves Signed-off-by: Nico Schottelius --- bin/cdist-config | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/cdist-config b/bin/cdist-config index 8678d205..82d94753 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -176,6 +176,7 @@ __cdist_echo() __cdist_exec_fail_on_error() { + set +e sh -e "$@" if [ "$?" -ne 0 ]; then __cdist_echo error "$1 exited non-zero, showing code:" From e5d8843eddd5b961c5d9ef9c4da06a1908e0d393 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:21:36 +0200 Subject: [PATCH 0107/4996] [DOC] add hint on FIXME tag Signed-off-by: Nico Schottelius --- doc/man/man7/cdist-hacker.text | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/man/man7/cdist-hacker.text b/doc/man/man7/cdist-hacker.text index 03a348ed..27f92a4a 100644 --- a/doc/man/man7/cdist-hacker.text +++ b/doc/man/man7/cdist-hacker.text @@ -27,6 +27,11 @@ read the scripts bin/cdist-deploy-to calls. The magnificent HACKERS_README may be of great help as well. +CODING CONVENTIONS (EVERYWHERE) +------------------------------- +If something should be better done or needs to fixed, add the word FIXME +nearby, so grepping for FIXME gives all positions that need to be fixed. + CODING CONVENTIONS (CORE) ------------------------- - All variables exported by cdist are prefixed with a double underscore (__) From a4933344311c47dea957396a1da4800c8011ad51 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:24:01 +0200 Subject: [PATCH 0108/4996] [DOC] fixup manpage for type __package_pkg_openbsd Signed-off-by: Nico Schottelius --- conf/type/__package_pkg_openbsd/man.text | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__package_pkg_openbsd/man.text b/conf/type/__package_pkg_openbsd/man.text index c0fae241..98aeaccf 100644 --- a/conf/type/__package_pkg_openbsd/man.text +++ b/conf/type/__package_pkg_openbsd/man.text @@ -1,5 +1,5 @@ cdist-type__package_pkg(7) -============================= +========================== Andi Brönnimann From a76a9970a6c45e948ec4edb27bdb35acfb4e625f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:24:18 +0200 Subject: [PATCH 0109/4996] more stuff for 1.6.1 Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 0ca26837..eb3f2184 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,5 +1,6 @@ 1.6.1: * Logging restructured + * New Type __package_pkg_openbsd 1.6.0: 2011-04-06 * New Type __package_yum From e3f27f1794e5b1cbae87055ce751c470a4be57d3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:31:19 +0200 Subject: [PATCH 0110/4996] allow empty $__cdist_object_self Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/cdist-config b/bin/cdist-config index 82d94753..a19fdc01 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -152,9 +152,11 @@ __cdist_echo() { __cdist_echo_type="$1"; shift + set +u if [ "$__cdist_object_self" ]; then __cdist_echo_prefix="$__cdist_object_self" fi + set -u case "$__cdist_echo_type" in debug) From 290915ee647c8451066b1abba6cdb572be7b9827 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:34:07 +0200 Subject: [PATCH 0111/4996] __cdist_echo++ Signed-off-by: Nico Schottelius --- bin/cdist-cache | 2 +- bin/cdist-deploy-to | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/cdist-cache b/bin/cdist-cache index f9480162..5ba51442 100755 --- a/bin/cdist-cache +++ b/bin/cdist-cache @@ -32,6 +32,6 @@ __cdist_ddir="$(__cdist_host_cache_dir "$__cdist_target_host")" # Create base to move into mkdir -p "$(__cdist_cache_dir)" -echo "Saving cache to $__cdist_ddir ..." +__cdist_echo info "Saving cache to $__cdist_ddir ..." rm -rf "$__cdist_ddir" mv "$__cdist_local_base_dir" "$__cdist_ddir" diff --git a/bin/cdist-deploy-to b/bin/cdist-deploy-to index dab5d9a5..ddb36fca 100755 --- a/bin/cdist-deploy-to +++ b/bin/cdist-deploy-to @@ -34,7 +34,7 @@ export $__cdist_name_var_target_user="$__cdist_remote_user" # Export variables for core, which others do not reset export __cdist_local_base_dir -echo "cdist $__cdist_version: Configuring $__cdist_target_host" +__cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host ..." ################################################################################ # See cdist-stages(7) @@ -44,7 +44,7 @@ echo "cdist $__cdist_version: Configuring $__cdist_target_host" __cdist_init_deploy "$__cdist_target_host" # Transfer cdist executables -echo "Transferring cdist binaries to $__cdist_target_host ..." +__cdist_echo info "Transferring cdist binaries to the target host ..." cdist-dir push "$__cdist_target_host" \ "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}" cdist-explorer-run-global "$__cdist_target_host" @@ -53,4 +53,4 @@ cdist-object-all "$__cdist_target_host" cdist-object-prepare cdist-object-all "$__cdist_target_host" cdist-object-run cdist-cache "$__cdist_target_host" -echo "cdist $__cdist_version: Successfully finished run on $__cdist_target_host" +__cdist_echo info "cdist $__cdist_version: Successfully finished run" From 9d5d0b8cdd9b0572bcda496079e6e6ff0a7b2fca Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:34:46 +0200 Subject: [PATCH 0112/4996] always setup __cdist_echo_prefix Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/cdist-config b/bin/cdist-config index a19fdc01..755a3e60 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -155,6 +155,8 @@ __cdist_echo() set +u if [ "$__cdist_object_self" ]; then __cdist_echo_prefix="$__cdist_object_self" + else + __cdist_echo_prefix="" fi set -u From f08a9eaaa93f0624785382906000461de252bff1 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:35:27 +0200 Subject: [PATCH 0113/4996] +: after object_self Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index 755a3e60..ba45e927 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -154,7 +154,7 @@ __cdist_echo() set +u if [ "$__cdist_object_self" ]; then - __cdist_echo_prefix="$__cdist_object_self" + __cdist_echo_prefix="${__cdist_object_self}:" else __cdist_echo_prefix="" fi From d000de2be904d4c947a693584da9e70c62dcf073 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:36:21 +0200 Subject: [PATCH 0114/4996] code, not gencode Signed-off-by: Nico Schottelius --- bin/cdist-code-run | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/cdist-code-run b/bin/cdist-code-run index 3259fb1b..2aeefddd 100755 --- a/bin/cdist-code-run +++ b/bin/cdist-code-run @@ -26,20 +26,20 @@ set -ue __cdist_object="$1"; shift -__cdist_gencode_type="$1"; shift +__cdist_code_type="$1"; shift if [ ! -d "$(__cdist_object_dir "$__cdist_object")" ]; then __cdist_exit_err "Object $__cdist_object is missing." fi -code="$(__cdist_object_code "$__cdist_object")-${__cdist_gencode_type}" +code="$(__cdist_object_code "$__cdist_object")-${__cdist_code_type}" -__cdist_echo info "Checking code-${__cdist_gencode_type}" +__cdist_echo info "Checking code-${__cdist_code_type}" if [ -e "$code" ]; then if [ -f "$code" ]; then if [ -x "$code" ]; then - echo "Executing code-${__cdist_gencode_type} for $__cdist_object ..." + echo "Executing code-${__cdist_code_type} for $__cdist_object ..." __cdist_exec_fail_on_error "$code" else __cdist_exit_err "$code exists, but is not executable." From d75f2d4d29cfa2f7e84aff29dee896fbbc1e3703 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:38:31 +0200 Subject: [PATCH 0115/4996] ++__cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-code-run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-code-run b/bin/cdist-code-run index 2aeefddd..8a121a08 100755 --- a/bin/cdist-code-run +++ b/bin/cdist-code-run @@ -39,7 +39,7 @@ __cdist_echo info "Checking code-${__cdist_code_type}" if [ -e "$code" ]; then if [ -f "$code" ]; then if [ -x "$code" ]; then - echo "Executing code-${__cdist_code_type} for $__cdist_object ..." + __cdist_echo info "Executing code-${__cdist_code_type}" __cdist_exec_fail_on_error "$code" else __cdist_exit_err "$code exists, but is not executable." From 9610dbf10f53f247485dcb52fbb59ef6cee5c85f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:40:18 +0200 Subject: [PATCH 0116/4996] __debconf_set_selections: cat the file referenced, not the parameter! Signed-off-by: Nico Schottelius --- conf/type/__debconf_set_selections/gencode-remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__debconf_set_selections/gencode-remote b/conf/type/__debconf_set_selections/gencode-remote index 156fc9f3..62be6a12 100755 --- a/conf/type/__debconf_set_selections/gencode-remote +++ b/conf/type/__debconf_set_selections/gencode-remote @@ -22,5 +22,5 @@ # echo "debconf-set-selections << __file-eof" -cat "$__object/parameter/file" +cat "$(cat "$__object/parameter/file")" echo "__file-eof" From af0afcb55fdd395e7f9982065a40c5ed6b0c8c82 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:41:25 +0200 Subject: [PATCH 0117/4996] 1.6.1 contains __debconf_set_selections bugfix Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index eb3f2184..7b4052c2 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,6 +1,7 @@ 1.6.1: * Logging restructured * New Type __package_pkg_openbsd + * Bugfix: Type __debconf_set_selections used wrong contens for selection 1.6.0: 2011-04-06 * New Type __package_yum From cc67dfbfa1c32ddcbc4c45a7685d5b76c1db0cae Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:44:20 +0200 Subject: [PATCH 0118/4996] improved logging Signed-off-by: Nico Schottelius --- doc/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changelog b/doc/changelog index 7b4052c2..edc797b9 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,5 +1,5 @@ 1.6.1: - * Logging restructured + * Improved logging: Show code responsible for abort * New Type __package_pkg_openbsd * Bugfix: Type __debconf_set_selections used wrong contens for selection From 88a6ee385b87f31e1ce550742e87827296ceb106 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:46:21 +0200 Subject: [PATCH 0119/4996] always use uname -m, until it breaks Signed-off-by: Nico Schottelius --- conf/explorer/hardware_type | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/conf/explorer/hardware_type b/conf/explorer/hardware_type index 5966b11e..25fc76a9 100755 --- a/conf/explorer/hardware_type +++ b/conf/explorer/hardware_type @@ -22,10 +22,4 @@ # # -os="$($__explorer/os)" - -case "$os" in - archlinux|*bsd) - echo $(uname -m) - ;; -esac +uname -m From d0434ea56b70e4c62886fdd3c002990499c3275b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:46:40 +0200 Subject: [PATCH 0120/4996] 1.6.1++ Signed-off-by: Nico Schottelius --- bin/cdist-explorer-run-global | 2 +- doc/changelog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/cdist-explorer-run-global b/bin/cdist-explorer-run-global index 7a06a982..4b901964 100755 --- a/bin/cdist-explorer-run-global +++ b/bin/cdist-explorer-run-global @@ -27,7 +27,7 @@ set -ue __cdist_target_host="$1"; shift -echo "Running global explorers ..." +__cdist_info "Running global explorers ..." # copy the explorers cdist-dir push "$__cdist_target_host" \ diff --git a/doc/changelog b/doc/changelog index edc797b9..5f47e19f 100644 --- a/doc/changelog +++ b/doc/changelog @@ -2,6 +2,7 @@ * Improved logging: Show code responsible for abort * New Type __package_pkg_openbsd * Bugfix: Type __debconf_set_selections used wrong contens for selection + * New explorer: hardware_type 1.6.0: 2011-04-06 * New Type __package_yum From cb5fc962b3d11f69c82583e110df516baad44f3b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:50:09 +0200 Subject: [PATCH 0121/4996] use __cdist prefix Signed-off-by: Nico Schottelius --- bin/cdist-object-explorer-run | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index 4d8e2321..49480bfd 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -29,7 +29,7 @@ set -eu __cdist_target_host="$1"; shift __cdist_object="$1"; shift -__object_id="$(__cdist_object_id_from_object "$__cdist_object")" +__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" __cdist_type="$(__cdist_type_from_object "$__cdist_object")" # Check if type of object has >= 1 explorer @@ -53,7 +53,7 @@ if [ "$__cdist_has_explorer" ]; then # Execute explorers cdist-run-remote "$__cdist_target_host" \ "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object")\"" \ - "$__cdist_name_var_object_id=\"$__object_id\"" \ + "$__cdist_name_var_object_id=\"$__cdist_object_id\" \ "$__cdist_name_var_self=\"$__cdist_object\"" \ cdist-remote-explorer-run \ "$__cdist_name_var_type_explorer" \ From ec513eae49ad3a13c6758ee8664fc6dd9ee84b33 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:51:17 +0200 Subject: [PATCH 0122/4996] ++__cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-manifest-run-init | 2 +- bin/cdist-mass-deploy | 2 +- bin/cdist-object-explorer-run | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/cdist-manifest-run-init b/bin/cdist-manifest-run-init index 9f10c12c..da7af6ba 100755 --- a/bin/cdist-manifest-run-init +++ b/bin/cdist-manifest-run-init @@ -30,5 +30,5 @@ __cdist_target_host="$1"; shift eval export $__cdist_name_var_manifest=\"\$__cdist_manifest_dir\" -echo "Running initial manifest for $__cdist_target_host ..." +__cdist_echo info "Running initial manifest for $__cdist_target_host ..." cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest_init" diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 2753bcab..fae9e633 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -42,6 +42,6 @@ done # else wait after all are started if [ "$parallel" ]; then - echo "Waiting for cdist-deploy-to jobs to finish..." + __cdist_echo info "Waiting for cdist-deploy-to jobs to finish..." wait fi diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index 49480bfd..1e0fc36f 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -31,6 +31,7 @@ __cdist_object="$1"; shift __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" __cdist_type="$(__cdist_type_from_object "$__cdist_object")" +__cdist_object_self="$__cdist_type/$__cdist_object_id" # Check if type of object has >= 1 explorer __cdist_has_explorer="$(__cdist_type_has_explorer "$__cdist_type")" From 8924a9583d4390c997ece244641ef1581d4e113e Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:52:14 +0200 Subject: [PATCH 0123/4996] ++__cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-config | 4 ++++ bin/cdist-object-explorer-run | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index ba45e927..4bf08511 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -175,6 +175,10 @@ __cdist_echo() error) echo $__cdist_echo_prefix "Error: $@" >&2 ;; + *) + echo "CORE BUG, who created the broken commit?" >&2 + exit 23 + ;; esac } diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index 1e0fc36f..7a5068e4 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -40,7 +40,7 @@ if [ "$__cdist_has_explorer" ]; then if ! __cdist_type_explorer_pushed "$__cdist_type"; then src_dir="$(__cdist_type_explorer_dir "$__cdist_type")" dst_dir="$(__cdist_remote_type_explorer_dir "$__cdist_type")" - echo "Transfering explorers for $__cdist_type ..." + __cdist_echo info "Transfering explorers for $__cdist_type ..." cdist-dir push "$__cdist_target_host" "$src_dir" "$dst_dir" __cdist_type_explorer_pushed_add "$__cdist_type" fi From 1f4e8fe5648e8688d465304b2114800a4bc4b4eb Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:54:34 +0200 Subject: [PATCH 0124/4996] do not create code if there is no gencode Signed-off-by: Nico Schottelius --- bin/cdist-object-gencode | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-object-gencode b/bin/cdist-object-gencode index 1ba1116b..465d6f1e 100755 --- a/bin/cdist-object-gencode +++ b/bin/cdist-object-gencode @@ -44,14 +44,14 @@ export __global="$__cdist_out_dir" cd "$__cdist_local_base_dir" -cat << eof +if [ -x "$gencode" ]; then + cat << eof # # The following code is imported from output of $gencode # eof -if [ -x "$gencode" ]; then __cdist_exec_fail_on_error "$gencode" else if [ -f "$gencode" ]; then From 2162d444b3fd211a26af3c282544c41168402681 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:55:53 +0200 Subject: [PATCH 0125/4996] better logging in __cdist_exec_fail_on_error Signed-off-by: Nico Schottelius --- bin/cdist-config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index 4bf08511..789f41a8 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -187,7 +187,8 @@ __cdist_exec_fail_on_error() set +e sh -e "$@" if [ "$?" -ne 0 ]; then - __cdist_echo error "$1 exited non-zero, showing code:" + __cdist_echo error "$1 exited non-zero" + __cdist_echo info "Faulty code:" cat "$1" __cdist_exit_err "Aborting due to non-zero exit code." fi From caed694dee937a5302caf5416fb79bd9b22fd3d8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:58:34 +0200 Subject: [PATCH 0126/4996] ++__cdist_echo + FIXME Signed-off-by: Nico Schottelius --- bin/cdist-object-explorer-run | 2 +- bin/cdist-object-gencode-run | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index 7a5068e4..b782de55 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -45,7 +45,7 @@ if [ "$__cdist_has_explorer" ]; then __cdist_type_explorer_pushed_add "$__cdist_type" fi - echo "Running explorers for $__cdist_object ..." + __cdist_echo info "Running explorers for $__cdist_object ..." # Copy object parameters cdist-dir push "$__cdist_target_host" \ "$(__cdist_object_parameter_dir "$__cdist_object")" \ diff --git a/bin/cdist-object-gencode-run b/bin/cdist-object-gencode-run index 4d21fec9..a24d78bc 100755 --- a/bin/cdist-object-gencode-run +++ b/bin/cdist-object-gencode-run @@ -32,11 +32,14 @@ __cdist_object="$1"; shift __cdist_code_local="$(__cdist_object_code "$__cdist_object")-${__cdist_name_gencode_local}" __cdist_code_remote="$(__cdist_object_code "$__cdist_object")-${__cdist_name_gencode_remote}" -echo "Generating local code for $__cdist_object ..." +# FIXME: check that no file is created if there is no gencode +# probably move output code to cdist-object-gencode + +__cdist_echo info "Generating local code for $__cdist_object ..." cdist-object-gencode "$__cdist_target_host" "$__cdist_object" \ "${__cdist_name_gencode_local}" > "${__cdist_code_local}" -echo "Generating remote code for $__cdist_object ..." +__cdist_echo info "Generating remote code for $__cdist_object ..." cdist-object-gencode "$__cdist_target_host" "$__cdist_object" \ "${__cdist_name_gencode_remote}" > "${__cdist_code_remote}" From a08bd18f4ec8b51fa7aea2df9385335a992ae2cc Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 20:59:57 +0200 Subject: [PATCH 0127/4996] make first real use of new __cdist_echo with __cdist_object_self setup Signed-off-by: Nico Schottelius --- bin/cdist-object-gencode-run | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/bin/cdist-object-gencode-run b/bin/cdist-object-gencode-run index a24d78bc..375b7cc1 100755 --- a/bin/cdist-object-gencode-run +++ b/bin/cdist-object-gencode-run @@ -27,20 +27,19 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift +__cdist_object_self="$1"; shift -__cdist_code_local="$(__cdist_object_code "$__cdist_object")-${__cdist_name_gencode_local}" -__cdist_code_remote="$(__cdist_object_code "$__cdist_object")-${__cdist_name_gencode_remote}" +__cdist_code_local="$(__cdist_object_code "$__cdist_object_self")-${__cdist_name_gencode_local}" +__cdist_code_remote="$(__cdist_object_code "$__cdist_object_self")-${__cdist_name_gencode_remote}" # FIXME: check that no file is created if there is no gencode # probably move output code to cdist-object-gencode - -__cdist_echo info "Generating local code for $__cdist_object ..." -cdist-object-gencode "$__cdist_target_host" "$__cdist_object" \ +__cdist_echo info "Generating local code ..." +cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \ "${__cdist_name_gencode_local}" > "${__cdist_code_local}" -__cdist_echo info "Generating remote code for $__cdist_object ..." -cdist-object-gencode "$__cdist_target_host" "$__cdist_object" \ +__cdist_echo info "Generating remote code ..." +cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \ "${__cdist_name_gencode_remote}" > "${__cdist_code_remote}" chmod u+x "${__cdist_code_local}" "${__cdist_code_remote}" From dfd0eefb917018d5653c2641ddf762d292505ecd Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:01:27 +0200 Subject: [PATCH 0128/4996] include version in html directory on web Signed-off-by: Nico Schottelius --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index e033c007..d94b7a5d 100755 --- a/build.sh +++ b/build.sh @@ -88,6 +88,7 @@ case "$1" in cp README ${WEBDIR}/${WEBPAGE} rm -rf ${WEBDIR}/${WEBBASE}/man && mkdir ${WEBDIR}/${WEBBASE}/man cp ${MAN1DSTDIR}/*.html ${MAN7DSTDIR}/*.html ${WEBDIR}/${WEBBASE}/man + git describe > ${WEBDIR}/${WEBBASE}/man/VERSION cd ${WEBDIR} && git add ${WEBBASE}/man cd ${WEBDIR} && git commit -m "cdist update" ${WEBBASE} ${WEBPAGE} cd ${WEBDIR} && make pub From df58c4e5f5a3d6e28899d9fc98bd5f1e71167268 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:03:37 +0200 Subject: [PATCH 0129/4996] echo, not info Signed-off-by: Nico Schottelius --- bin/cdist-explorer-run-global | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-explorer-run-global b/bin/cdist-explorer-run-global index 4b901964..17bc3d79 100755 --- a/bin/cdist-explorer-run-global +++ b/bin/cdist-explorer-run-global @@ -27,7 +27,7 @@ set -ue __cdist_target_host="$1"; shift -__cdist_info "Running global explorers ..." +__cdist_echo info "Running global explorers ..." # copy the explorers cdist-dir push "$__cdist_target_host" \ From 96c4024a51eaff1e16474fe636076fe90a91b0d5 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:07:39 +0200 Subject: [PATCH 0130/4996] bugfix + real use of __cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-object-explorer-run | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index b782de55..ac39755b 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -27,11 +27,10 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift +__cdist_object_self="$1"; shift __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" __cdist_type="$(__cdist_type_from_object "$__cdist_object")" -__cdist_object_self="$__cdist_type/$__cdist_object_id" # Check if type of object has >= 1 explorer __cdist_has_explorer="$(__cdist_type_has_explorer "$__cdist_type")" @@ -45,7 +44,7 @@ if [ "$__cdist_has_explorer" ]; then __cdist_type_explorer_pushed_add "$__cdist_type" fi - __cdist_echo info "Running explorers for $__cdist_object ..." + __cdist_echo info "Running explorers ..." # Copy object parameters cdist-dir push "$__cdist_target_host" \ "$(__cdist_object_parameter_dir "$__cdist_object")" \ @@ -53,9 +52,9 @@ if [ "$__cdist_has_explorer" ]; then # Execute explorers cdist-run-remote "$__cdist_target_host" \ - "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object")\"" \ - "$__cdist_name_var_object_id=\"$__cdist_object_id\" \ - "$__cdist_name_var_self=\"$__cdist_object\"" \ + "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\"" \ + "$__cdist_name_var_object_id=\"$__cdist_object_id\"" \ + "$__cdist_name_var_self=\"$__cdist_object_self\"" \ cdist-remote-explorer-run \ "$__cdist_name_var_type_explorer" \ "$(__cdist_remote_type_explorer_dir "$__cdist_type")" \ From 0580406ff2d35fa4b7ca150f8c25004466adcad2 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:08:40 +0200 Subject: [PATCH 0131/4996] there is no __cdist_object in this context Signed-off-by: Nico Schottelius --- bin/cdist-object-explorer-run | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index ac39755b..ed001e83 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -29,8 +29,8 @@ set -eu __cdist_target_host="$1"; shift __cdist_object_self="$1"; shift -__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" -__cdist_type="$(__cdist_type_from_object "$__cdist_object")" +__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" +__cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" # Check if type of object has >= 1 explorer __cdist_has_explorer="$(__cdist_type_has_explorer "$__cdist_type")" @@ -47,8 +47,8 @@ if [ "$__cdist_has_explorer" ]; then __cdist_echo info "Running explorers ..." # Copy object parameters cdist-dir push "$__cdist_target_host" \ - "$(__cdist_object_parameter_dir "$__cdist_object")" \ - "$(__cdist_remote_object_parameter_dir "$__cdist_object")" + "$(__cdist_object_parameter_dir "$__cdist_object_self")" \ + "$(__cdist_remote_object_parameter_dir "$__cdist_object_self")" # Execute explorers cdist-run-remote "$__cdist_target_host" \ @@ -58,10 +58,10 @@ if [ "$__cdist_has_explorer" ]; then cdist-remote-explorer-run \ "$__cdist_name_var_type_explorer" \ "$(__cdist_remote_type_explorer_dir "$__cdist_type")" \ - "$(__cdist_remote_object_type_explorer_dir "$__cdist_object")" + "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")" # Copy back results cdist-dir pull "$__cdist_target_host" \ - "$(__cdist_remote_object_type_explorer_dir "$__cdist_object")" \ - "$(__cdist_object_type_explorer_dir "$__cdist_object")" + "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")" \ + "$(__cdist_object_type_explorer_dir "$__cdist_object_self")" fi From afdecb883686619cca5b39829a91745aa253b4e0 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:10:34 +0200 Subject: [PATCH 0132/4996] ++__cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-object-manifest-run | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/bin/cdist-object-manifest-run b/bin/cdist-object-manifest-run index ce44cbbc..56aec782 100755 --- a/bin/cdist-object-manifest-run +++ b/bin/cdist-object-manifest-run @@ -27,14 +27,15 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift +__cdist_object_self="$1"; shift -__cdist_cur_object_dir="$(__cdist_object_dir "$__cdist_object")" -__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" +# FIXME: rename to __cdist_object_dir (everywhere!) +__cdist_cur_object_dir="$(__cdist_object_dir "$__cdist_object_self")" +__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" -echo "Checking manifest for $__cdist_object ..." +__cdist_echo info "Checking manifest ..." -__cdist_type="$(__cdist_type_from_object "$__cdist_object")" +__cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" __cdist_manifest="$(__cdist_type_manifest "$__cdist_type")" if [ -f "$__cdist_manifest" ]; then @@ -42,7 +43,7 @@ if [ -f "$__cdist_manifest" ]; then # Make __cdist_manifest available for cdist-type-emulator export __cdist_manifest - echo "Executing manifest ${__cdist_manifest} ..." + __cdist_echo "Executing manifest ${__cdist_manifest} ..." export $__cdist_name_var_object="$__cdist_cur_object_dir" export $__cdist_name_var_object_id="$__cdist_object_id" export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")" From 4a7c6c2738a7427c01ba607a50333ab7e2b794f3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:12:00 +0200 Subject: [PATCH 0133/4996] ++__cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-object-prepare | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/bin/cdist-object-prepare b/bin/cdist-object-prepare index 8c92ff73..d21d8a63 100755 --- a/bin/cdist-object-prepare +++ b/bin/cdist-object-prepare @@ -29,19 +29,18 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift -__cdist_object_dir="$(__cdist_object_dir "$__cdist_object")" -[ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined: $__cdist_object" +__cdist_object_self="$1"; shift +__cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")" +[ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined" # Export to non-core for use in manifest and gencode scripts -export $__cdist_name_var_self=$__cdist_object +export $__cdist_name_var_self=$__cdist_object_self -__cdist_object_prepared="$(__cdist_object_prepared "$__cdist_object")" +__cdist_object_prepared="$(__cdist_object_prepared "$__cdist_object_self")" if [ ! -f "$__cdist_object_prepared" ]; then - echo - echo "Preparing object $__cdist_object" - cdist-object-explorer-run "$__cdist_target_host" "$__cdist_object" - cdist-object-manifest-run "$__cdist_target_host" "$__cdist_object" + __cdist_echo info "Preparing object" + cdist-object-explorer-run "$__cdist_target_host" "$__cdist_object_self" + cdist-object-manifest-run "$__cdist_target_host" "$__cdist_object_self" # Mark this object as prepared touch "$__cdist_object_prepared" From 35d4760c13c2532110417f7e318f3bd31f78847f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:15:11 +0200 Subject: [PATCH 0134/4996] ++__cdist_echo ++todo Signed-off-by: Nico Schottelius --- bin/cdist-object-push | 8 ++++---- bin/cdist-object-run | 16 +++++++--------- doc/dev/todo/TAKEME | 2 ++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/bin/cdist-object-push b/bin/cdist-object-push index f7d46be4..9fda2cea 100755 --- a/bin/cdist-object-push +++ b/bin/cdist-object-push @@ -27,9 +27,9 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift +__cdist_object_self="$1"; shift -echo "Transferring object $__cdist_object to $__cdist_target_host ..." +__cdist_echo info "Transferring object $__cdist_target_host ..." cdist-dir push "$__cdist_target_host" \ - "$(__cdist_object_dir "$__cdist_object")" \ - "$(__cdist_remote_object_dir "$__cdist_object")" + "$(__cdist_object_dir "$__cdist_object_self")" \ + "$(__cdist_remote_object_dir "$__cdist_object_self")" diff --git a/bin/cdist-object-run b/bin/cdist-object-run index 667bf386..c5f738ca 100755 --- a/bin/cdist-object-run +++ b/bin/cdist-object-run @@ -32,17 +32,17 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift -__cdist_object_dir="$(__cdist_object_dir "$__cdist_object")" -[ -d "$__cdist_object_dir" ] || __cdist_exit_err "Requested object is not defined: $__cdist_object" +__cdist_object_self="$1"; shift +__cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")" +[ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined" # Export to non-core for use in manifest and gencode scripts -export $__cdist_name_var_self=$__cdist_object +export $__cdist_name_var_self=$__cdist_object_self -__cdist_object_finished="$(__cdist_object_finished "$__cdist_object")" +__cdist_object_finished="$(__cdist_object_finished "$__cdist_object_self")" if [ ! -f "$__cdist_object_finished" ]; then # Resolve dependencies, if any - __cdist_object_require="$(__cdist_object_require "$__cdist_object")" + __cdist_object_require="$(__cdist_object_require "$__cdist_object_self")" if [ -f "$__cdist_object_require" ]; then echo # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP @@ -52,13 +52,11 @@ if [ ! -f "$__cdist_object_finished" ]; then while [ $# -gt 0 ]; do __cdist_requirement="$1"; shift - echo "Resolving dependency $__cdist_requirement for $__cdist_object ..." + echo "Resolving dependency $__cdist_requirement" cdist-object-run "$__cdist_target_host" "$__cdist_requirement" done fi - echo - echo "Running object $__cdist_object" cdist-object-gencode-run "$__cdist_target_host" "$__cdist_object" cdist-object-push "$__cdist_target_host" "$__cdist_object" cdist-object-code-run "$__cdist_target_host" "$__cdist_object" diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index 0fcced96..d456ae35 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -5,6 +5,8 @@ Feel free to pick one! CORE ---- +- Inconsistent error messages if object is not existing! + -> always use "Object undefined" - Add echo function / beautify output __cdist_echo [level] [messages...] level := syslog alike: From 838d43d74c70a301d76a47e271efd1cab2181049 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:17:11 +0200 Subject: [PATCH 0135/4996] do not fail if code is missing, but inform Signed-off-by: Nico Schottelius --- bin/cdist-code-run | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-code-run b/bin/cdist-code-run index 8a121a08..6389a060 100755 --- a/bin/cdist-code-run +++ b/bin/cdist-code-run @@ -29,7 +29,7 @@ __cdist_object="$1"; shift __cdist_code_type="$1"; shift if [ ! -d "$(__cdist_object_dir "$__cdist_object")" ]; then - __cdist_exit_err "Object $__cdist_object is missing." + __cdist_exit_err "Object undefined" fi code="$(__cdist_object_code "$__cdist_object")-${__cdist_code_type}" @@ -48,5 +48,5 @@ if [ -e "$code" ]; then __cdist_exit_err "$code exists, but is not a file." fi else - __cdist_exit_err "Missing code for ${__cdist_object}." + __cdist_echo info "No code-${__cdist_code_type}" fi From fb0dafba5c6131ade0f841b22163c86f5d672b6d Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:18:15 +0200 Subject: [PATCH 0136/4996] make faulty code a warning Signed-off-by: Nico Schottelius --- bin/cdist-config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-config b/bin/cdist-config index 789f41a8..273569a6 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -169,7 +169,7 @@ __cdist_echo() info) echo $__cdist_echo_prefix "$@" ;; - warning) + warn) echo $__cdist_echo_prefix "Warning: $@" ;; error) @@ -188,7 +188,7 @@ __cdist_exec_fail_on_error() sh -e "$@" if [ "$?" -ne 0 ]; then __cdist_echo error "$1 exited non-zero" - __cdist_echo info "Faulty code:" + __cdist_echo warn "Faulty code:" cat "$1" __cdist_exit_err "Aborting due to non-zero exit code." fi From 05c8634f8b3dc20fce2a9cc878deb7abefd8d4a4 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:19:21 +0200 Subject: [PATCH 0137/4996] correctly use __cdist_echo Signed-off-by: Nico Schottelius --- bin/cdist-object-manifest-run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-object-manifest-run b/bin/cdist-object-manifest-run index 56aec782..bf50fc2c 100755 --- a/bin/cdist-object-manifest-run +++ b/bin/cdist-object-manifest-run @@ -43,7 +43,7 @@ if [ -f "$__cdist_manifest" ]; then # Make __cdist_manifest available for cdist-type-emulator export __cdist_manifest - __cdist_echo "Executing manifest ${__cdist_manifest} ..." + __cdist_echo info "Executing manifest ${__cdist_manifest} ..." export $__cdist_name_var_object="$__cdist_cur_object_dir" export $__cdist_name_var_object_id="$__cdist_object_id" export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")" From bb96163315172a1195cb240e713b5dd8ecb4add6 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:19:47 +0200 Subject: [PATCH 0138/4996] blame on the right file Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index 273569a6..ca8525ea 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -176,7 +176,7 @@ __cdist_echo() echo $__cdist_echo_prefix "Error: $@" >&2 ;; *) - echo "CORE BUG, who created the broken commit?" >&2 + echo "CORE BUG, who created the broken commit in $0?" >&2 exit 23 ;; esac From 49e8efdaf5e62d04f0c7bcdf3f97f24abad3deb0 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:20:58 +0200 Subject: [PATCH 0139/4996] object self, not object Signed-off-by: Nico Schottelius --- bin/cdist-object-run | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/cdist-object-run b/bin/cdist-object-run index c5f738ca..3eb301f3 100755 --- a/bin/cdist-object-run +++ b/bin/cdist-object-run @@ -57,9 +57,9 @@ if [ ! -f "$__cdist_object_finished" ]; then done fi - cdist-object-gencode-run "$__cdist_target_host" "$__cdist_object" - cdist-object-push "$__cdist_target_host" "$__cdist_object" - cdist-object-code-run "$__cdist_target_host" "$__cdist_object" + cdist-object-gencode-run "$__cdist_target_host" "$__cdist_object_self" + cdist-object-push "$__cdist_target_host" "$__cdist_object_self" + cdist-object-code-run "$__cdist_target_host" "$__cdist_object_self" # Mark this object as done touch "$__cdist_object_finished" From c0a83f9d854096ccbdd338e8bc35f6b643cfba0b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:22:44 +0200 Subject: [PATCH 0140/4996] ++__cdist_exit_err Signed-off-by: Nico Schottelius --- bin/cdist-object-run | 2 +- bin/cdist-remote-explorer-run | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/bin/cdist-object-run b/bin/cdist-object-run index 3eb301f3..5224637e 100755 --- a/bin/cdist-object-run +++ b/bin/cdist-object-run @@ -52,7 +52,7 @@ if [ ! -f "$__cdist_object_finished" ]; then while [ $# -gt 0 ]; do __cdist_requirement="$1"; shift - echo "Resolving dependency $__cdist_requirement" + __cdist_echo info "Resolving dependency $__cdist_requirement" cdist-object-run "$__cdist_target_host" "$__cdist_requirement" done fi diff --git a/bin/cdist-remote-explorer-run b/bin/cdist-remote-explorer-run index cef91e0d..d95913ba 100755 --- a/bin/cdist-remote-explorer-run +++ b/bin/cdist-remote-explorer-run @@ -55,16 +55,14 @@ for explorer in "$__cdist_explorer_dir/"*; do if [ -f "$explorer" ]; then if [ ! -x "$explorer" ]; then - echo "Explorer \"$explorer\" exists, but is not executable." >&2 - exit 1 + __cdist_exit_err "Explorer \"$explorer\" exists, but is not executable." fi # Execute explorers and save results in remote destination directory "$explorer" > "${__cdist_my_out_dir}/$explorer_name" else if [ -e "$explorer" ]; then - echo "Explorer \"$explorer\" exists, but is not a file." >&2 - exit 1 + __cdist_exit_err "Explorer \"$explorer\" exists, but is not a file." fi fi done From 74c1147ec3f89df6eb9619a3f8a6dec761e387da Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:26:10 +0200 Subject: [PATCH 0141/4996] nicotodo++ Signed-off-by: Nico Schottelius --- doc/dev/todo/niconext | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index 5df1cb61..2e5a179b 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1,5 +1,8 @@ + Introduce better logging +Fix bin/cdist-type-template + Cleanup documentation: type reference -> add types + manpages add explorer reference From b86d3ba26a3a47c2a10c8997585c8f1f3f46cc15 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:38:41 +0200 Subject: [PATCH 0142/4996] remove ugly OBJECT messages Signed-off-by: Nico Schottelius --- bin/cdist-type-emulator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-type-emulator b/bin/cdist-type-emulator index 2dcb47b3..8ff190ad 100755 --- a/bin/cdist-type-emulator +++ b/bin/cdist-type-emulator @@ -99,7 +99,7 @@ done set +u for requirement in $require; do echo $requirement >> "$(__cdist_object_require "$__cdist_object_self")" - echo Object $__cdist_object_self requires $requirement + __cdist_echo info "Recording requirement $requirement" done set -u From 315de6fe159853c17f65f4e52cb6a3d18335b311 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:41:40 +0200 Subject: [PATCH 0143/4996] log improvements Signed-off-by: Nico Schottelius --- bin/cdist-object-gencode | 10 +++++----- bin/cdist-object-run | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/bin/cdist-object-gencode b/bin/cdist-object-gencode index 465d6f1e..2c89ce7c 100755 --- a/bin/cdist-object-gencode +++ b/bin/cdist-object-gencode @@ -27,12 +27,12 @@ set -eu __cdist_target_host="$1"; shift -__cdist_object="$1"; shift +__cdist_object_self="$1"; shift __cdist_gencode_type="$1"; shift -__cdist_object_dir="$(__cdist_object_dir "$__cdist_object")" -__cdist_type="$(__cdist_type_from_object "$__cdist_object")" -__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" +__cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")" +__cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" +__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" # Full path to where the executable of the type should exist, if the type has one gencode="$(__cdist_type_gencode "$__cdist_type")-${__cdist_gencode_type}" @@ -55,7 +55,7 @@ eof __cdist_exec_fail_on_error "$gencode" else if [ -f "$gencode" ]; then - echo "Warning: $gencode exists, but is not executable" >&2 + __cdist_exit_err "$gencode exists, but is not executable" fi # No gencode? also fine! Ensure we exit 0 diff --git a/bin/cdist-object-run b/bin/cdist-object-run index 5224637e..4f40e7c1 100755 --- a/bin/cdist-object-run +++ b/bin/cdist-object-run @@ -44,7 +44,6 @@ if [ ! -f "$__cdist_object_finished" ]; then # Resolve dependencies, if any __cdist_object_require="$(__cdist_object_require "$__cdist_object_self")" if [ -f "$__cdist_object_require" ]; then - echo # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP while read __cdist_requirement; do set -- "$@" "$__cdist_requirement" @@ -52,7 +51,7 @@ if [ ! -f "$__cdist_object_finished" ]; then while [ $# -gt 0 ]; do __cdist_requirement="$1"; shift - __cdist_echo info "Resolving dependency $__cdist_requirement" + __cdist_echo info "Resolving requirement $__cdist_requirement" cdist-object-run "$__cdist_target_host" "$__cdist_requirement" done fi From e7ad5987e425873c30752fe059f90d1dcad7cab3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:43:32 +0200 Subject: [PATCH 0144/4996] + self variable Signed-off-by: Nico Schottelius --- bin/cdist-code-run | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/cdist-code-run b/bin/cdist-code-run index 6389a060..17b7c4a1 100755 --- a/bin/cdist-code-run +++ b/bin/cdist-code-run @@ -25,14 +25,14 @@ [ $# -eq 2 ] || __cdist_usage " " set -ue -__cdist_object="$1"; shift +__cdist_object_self="$1"; shift __cdist_code_type="$1"; shift -if [ ! -d "$(__cdist_object_dir "$__cdist_object")" ]; then +if [ ! -d "$(__cdist_object_dir "$__cdist_object_self")" ]; then __cdist_exit_err "Object undefined" fi -code="$(__cdist_object_code "$__cdist_object")-${__cdist_code_type}" +code="$(__cdist_object_code "$__cdist_object_self")-${__cdist_code_type}" __cdist_echo info "Checking code-${__cdist_code_type}" From 31164be1d0c8c1b289c3525f8e36cd9a578e0b93 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:44:41 +0200 Subject: [PATCH 0145/4996] remove full path to manifest in logging (will be presented on error anyway) Signed-off-by: Nico Schottelius --- bin/cdist-object-manifest-run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-object-manifest-run b/bin/cdist-object-manifest-run index bf50fc2c..3b1b5254 100755 --- a/bin/cdist-object-manifest-run +++ b/bin/cdist-object-manifest-run @@ -43,7 +43,7 @@ if [ -f "$__cdist_manifest" ]; then # Make __cdist_manifest available for cdist-type-emulator export __cdist_manifest - __cdist_echo info "Executing manifest ${__cdist_manifest} ..." + __cdist_echo info "Executing manifest ..." export $__cdist_name_var_object="$__cdist_cur_object_dir" export $__cdist_name_var_object_id="$__cdist_object_id" export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")" From bc1c7f104eb30193df526e5761e3ee048ffb35e6 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:50:49 +0200 Subject: [PATCH 0146/4996] core prefix Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- bin/cdist-object-push | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-config b/bin/cdist-config index ca8525ea..a36af881 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -156,7 +156,7 @@ __cdist_echo() if [ "$__cdist_object_self" ]; then __cdist_echo_prefix="${__cdist_object_self}:" else - __cdist_echo_prefix="" + __cdist_echo_prefix="core: " fi set -u diff --git a/bin/cdist-object-push b/bin/cdist-object-push index 9fda2cea..62b00cb2 100755 --- a/bin/cdist-object-push +++ b/bin/cdist-object-push @@ -29,7 +29,7 @@ set -eu __cdist_target_host="$1"; shift __cdist_object_self="$1"; shift -__cdist_echo info "Transferring object $__cdist_target_host ..." +__cdist_echo info "Transferring object" cdist-dir push "$__cdist_target_host" \ "$(__cdist_object_dir "$__cdist_object_self")" \ "$(__cdist_remote_object_dir "$__cdist_object_self")" From 0a3a434269bbc00bcdf21556dc9e92c9a520951f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 21:51:43 +0200 Subject: [PATCH 0147/4996] remove ... dots ... make ... me ...feel ... weired Signed-off-by: Nico Schottelius --- bin/cdist-cache | 2 +- bin/cdist-config | 2 +- bin/cdist-deploy-to | 4 ++-- bin/cdist-explorer-run-global | 2 +- bin/cdist-manifest-run-init | 2 +- bin/cdist-mass-deploy | 4 ++-- bin/cdist-object-explorer-run | 4 ++-- bin/cdist-object-gencode-run | 4 ++-- bin/cdist-object-manifest-run | 4 ++-- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bin/cdist-cache b/bin/cdist-cache index 5ba51442..bfb1a5b3 100755 --- a/bin/cdist-cache +++ b/bin/cdist-cache @@ -32,6 +32,6 @@ __cdist_ddir="$(__cdist_host_cache_dir "$__cdist_target_host")" # Create base to move into mkdir -p "$(__cdist_cache_dir)" -__cdist_echo info "Saving cache to $__cdist_ddir ..." +__cdist_echo info "Saving cache to $__cdist_ddir " rm -rf "$__cdist_ddir" mv "$__cdist_local_base_dir" "$__cdist_ddir" diff --git a/bin/cdist-config b/bin/cdist-config index a36af881..4346c0cb 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -207,7 +207,7 @@ __cdist_usage() __cdist_init_deploy() { - echo "Creating clean directory structure ..." + __cdist_echo info "Creating clean directory structure " # Ensure there is no old stuff, neither local nor remote rm -rf "$__cdist_local_base_dir" diff --git a/bin/cdist-deploy-to b/bin/cdist-deploy-to index ddb36fca..138248d6 100755 --- a/bin/cdist-deploy-to +++ b/bin/cdist-deploy-to @@ -34,7 +34,7 @@ export $__cdist_name_var_target_user="$__cdist_remote_user" # Export variables for core, which others do not reset export __cdist_local_base_dir -__cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host ..." +__cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host " ################################################################################ # See cdist-stages(7) @@ -44,7 +44,7 @@ __cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host ..." __cdist_init_deploy "$__cdist_target_host" # Transfer cdist executables -__cdist_echo info "Transferring cdist binaries to the target host ..." +__cdist_echo info "Transferring cdist binaries to the target host " cdist-dir push "$__cdist_target_host" \ "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}" cdist-explorer-run-global "$__cdist_target_host" diff --git a/bin/cdist-explorer-run-global b/bin/cdist-explorer-run-global index 17bc3d79..b0c024f2 100755 --- a/bin/cdist-explorer-run-global +++ b/bin/cdist-explorer-run-global @@ -27,7 +27,7 @@ set -ue __cdist_target_host="$1"; shift -__cdist_echo info "Running global explorers ..." +__cdist_echo info "Running global explorers " # copy the explorers cdist-dir push "$__cdist_target_host" \ diff --git a/bin/cdist-manifest-run-init b/bin/cdist-manifest-run-init index da7af6ba..28acc623 100755 --- a/bin/cdist-manifest-run-init +++ b/bin/cdist-manifest-run-init @@ -30,5 +30,5 @@ __cdist_target_host="$1"; shift eval export $__cdist_name_var_manifest=\"\$__cdist_manifest_dir\" -__cdist_echo info "Running initial manifest for $__cdist_target_host ..." +__cdist_echo info "Running initial manifest for $__cdist_target_host " cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest_init" diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index fae9e633..8a555411 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -22,7 +22,7 @@ # . cdist-config -[ $# -ge 1 ] || __cdist_usage "[-p] [target host ...]" +[ $# -ge 1 ] || __cdist_usage "[-p] [target host ]" set -eu parallel="" @@ -42,6 +42,6 @@ done # else wait after all are started if [ "$parallel" ]; then - __cdist_echo info "Waiting for cdist-deploy-to jobs to finish..." + __cdist_echo info "Waiting for cdist-deploy-to jobs to finish" wait fi diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index ed001e83..79cd2865 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -39,12 +39,12 @@ if [ "$__cdist_has_explorer" ]; then if ! __cdist_type_explorer_pushed "$__cdist_type"; then src_dir="$(__cdist_type_explorer_dir "$__cdist_type")" dst_dir="$(__cdist_remote_type_explorer_dir "$__cdist_type")" - __cdist_echo info "Transfering explorers for $__cdist_type ..." + __cdist_echo info "Transfering explorers for $__cdist_type " cdist-dir push "$__cdist_target_host" "$src_dir" "$dst_dir" __cdist_type_explorer_pushed_add "$__cdist_type" fi - __cdist_echo info "Running explorers ..." + __cdist_echo info "Running explorers " # Copy object parameters cdist-dir push "$__cdist_target_host" \ "$(__cdist_object_parameter_dir "$__cdist_object_self")" \ diff --git a/bin/cdist-object-gencode-run b/bin/cdist-object-gencode-run index 375b7cc1..bada6aee 100755 --- a/bin/cdist-object-gencode-run +++ b/bin/cdist-object-gencode-run @@ -34,11 +34,11 @@ __cdist_code_remote="$(__cdist_object_code "$__cdist_object_self")-${__cdist_nam # FIXME: check that no file is created if there is no gencode # probably move output code to cdist-object-gencode -__cdist_echo info "Generating local code ..." +__cdist_echo info "Generating local code " cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \ "${__cdist_name_gencode_local}" > "${__cdist_code_local}" -__cdist_echo info "Generating remote code ..." +__cdist_echo info "Generating remote code " cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \ "${__cdist_name_gencode_remote}" > "${__cdist_code_remote}" diff --git a/bin/cdist-object-manifest-run b/bin/cdist-object-manifest-run index 3b1b5254..34d4f867 100755 --- a/bin/cdist-object-manifest-run +++ b/bin/cdist-object-manifest-run @@ -33,7 +33,7 @@ __cdist_object_self="$1"; shift __cdist_cur_object_dir="$(__cdist_object_dir "$__cdist_object_self")" __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" -__cdist_echo info "Checking manifest ..." +__cdist_echo info "Checking manifest " __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" __cdist_manifest="$(__cdist_type_manifest "$__cdist_type")" @@ -43,7 +43,7 @@ if [ -f "$__cdist_manifest" ]; then # Make __cdist_manifest available for cdist-type-emulator export __cdist_manifest - __cdist_echo info "Executing manifest ..." + __cdist_echo info "Executing manifest " export $__cdist_name_var_object="$__cdist_cur_object_dir" export $__cdist_name_var_object_id="$__cdist_object_id" export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")" From b0391ac0c9b8041c59d7aa8b2349bca1e0fbbb7d Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 22:09:04 +0200 Subject: [PATCH 0148/4996] BUGFIX: do not fail, if cache/ is missing Signed-off-by: Nico Schottelius --- bin/cdist-cache | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/cdist-cache b/bin/cdist-cache index bfb1a5b3..ee27ffb4 100755 --- a/bin/cdist-cache +++ b/bin/cdist-cache @@ -27,10 +27,12 @@ set -u __cdist_target_host="$1"; shift -__cdist_ddir="$(__cdist_host_cache_dir "$__cdist_target_host")" # Create base to move into -mkdir -p "$(__cdist_cache_dir)" +mkdir -p "${__cdist_local_base_cache_dir}" + +# Now determine absolute path +__cdist_ddir="$(__cdist_host_cache_dir "$__cdist_target_host")" __cdist_echo info "Saving cache to $__cdist_ddir " rm -rf "$__cdist_ddir" From d39457b0a740bff5f2059b9344887d62939a1c01 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 22:13:30 +0200 Subject: [PATCH 0149/4996] document how to report bugs Signed-off-by: Nico Schottelius --- doc/man/man7/cdist-hacker.text | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/man/man7/cdist-hacker.text b/doc/man/man7/cdist-hacker.text index 27f92a4a..f9f08e31 100644 --- a/doc/man/man7/cdist-hacker.text +++ b/doc/man/man7/cdist-hacker.text @@ -19,6 +19,13 @@ twice before merging or implementing a feature: Less features with good usability are far better than the opposite. +REPORTING BUGS +-------------- +If you believe you've found a bug and verified that it is +in the latest version, drop a mail to the cdist mailing list, +subject prefixed with "[BUG] ". + + UNDERSTANDING CDIST INTERNALS ----------------------------- IF you are interested in how cdist internally works, you can open @@ -32,6 +39,7 @@ CODING CONVENTIONS (EVERYWHERE) If something should be better done or needs to fixed, add the word FIXME nearby, so grepping for FIXME gives all positions that need to be fixed. + CODING CONVENTIONS (CORE) ------------------------- - All variables exported by cdist are prefixed with a double underscore (__) From ad9cac5fb604b7cd910e66ea23a90a7b8412b209 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 22:22:52 +0200 Subject: [PATCH 0150/4996] 1.6.1 has another bugfix Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 5f47e19f..4a9cb2a8 100644 --- a/doc/changelog +++ b/doc/changelog @@ -2,6 +2,7 @@ * Improved logging: Show code responsible for abort * New Type __package_pkg_openbsd * Bugfix: Type __debconf_set_selections used wrong contens for selection + * Bugfix: Don't fail, if cache directory is not existing * New explorer: hardware_type 1.6.0: 2011-04-06 From 3c37ac0b0f9746e3524c009027efd8377a1db609 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 22:24:11 +0200 Subject: [PATCH 0151/4996] do not fail if nothing todo (__user and __group) Signed-off-by: Nico Schottelius --- conf/type/__group/gencode-remote | 6 +++++- conf/type/__user/gencode-remote | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/conf/type/__group/gencode-remote b/conf/type/__group/gencode-remote index 4cb05762..5d43a054 100755 --- a/conf/type/__group/gencode-remote +++ b/conf/type/__group/gencode-remote @@ -43,7 +43,11 @@ if grep -q "^${name}:" "$__object/explorer/group"; then fi done - [ $# -gt 0 ] && echo groupmod $@ $name + if [ $# -gt 0 ]; then + echo groupmod "$@" "$name" + else + true + fi else for property in $(ls .); do new_value="$(cat "$property")" diff --git a/conf/type/__user/gencode-remote b/conf/type/__user/gencode-remote index 7670b943..31c93655 100755 --- a/conf/type/__user/gencode-remote +++ b/conf/type/__user/gencode-remote @@ -59,7 +59,11 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then fi done - [ $# -gt 0 ] && echo usermod "$@" "$name" + if [ $# -gt 0 ]; then + echo usermod "$@" "$name" + else + true + fi else for property in $(ls .); do new_value="$(cat "$property")" From 152efae913292e80a76c6af8b9a82990000291fb Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 22:24:57 +0200 Subject: [PATCH 0152/4996] document bugfix of __user and __group Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 4a9cb2a8..1a38a2bd 100644 --- a/doc/changelog +++ b/doc/changelog @@ -3,6 +3,7 @@ * New Type __package_pkg_openbsd * Bugfix: Type __debconf_set_selections used wrong contens for selection * Bugfix: Don't fail, if cache directory is not existing + * Bugfix: __user and __group exited non-zero if no change was necessary * New explorer: hardware_type 1.6.0: 2011-04-06 From 6648535c6d61755fe95c259da29862a63d97c9ee Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 22:39:00 +0200 Subject: [PATCH 0153/4996] --nicotodo Signed-off-by: Nico Schottelius --- doc/dev/todo/niconext | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index 2e5a179b..db1ba10a 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1,6 +1,3 @@ - -Introduce better logging - Fix bin/cdist-type-template Cleanup documentation: From b29538a78486b9aac975427c48f110255e3ed1b6 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Wed, 6 Apr 2011 23:26:28 +0200 Subject: [PATCH 0154/4996] new types: __autofs_map, __autofs_master Signed-off-by: Steven Armstrong --- conf/type/__autofs_map/man.text | 60 +++++++++++++++++++ conf/type/__autofs_map/manifest | 42 +++++++++++++ conf/type/__autofs_map/parameter/optional | 3 + conf/type/__autofs_map/parameter/required | 1 + .../__autofs_master/files/auto.master.header | 3 + conf/type/__autofs_master/gencode-local | 26 ++++++++ conf/type/__autofs_master/man.text | 47 +++++++++++++++ conf/type/__autofs_master/manifest | 31 ++++++++++ conf/type/__autofs_master/parameter/optional | 1 + conf/type/__autofs_master/singleton | 0 10 files changed, 214 insertions(+) create mode 100644 conf/type/__autofs_map/man.text create mode 100755 conf/type/__autofs_map/manifest create mode 100644 conf/type/__autofs_map/parameter/optional create mode 100644 conf/type/__autofs_map/parameter/required create mode 100644 conf/type/__autofs_master/files/auto.master.header create mode 100755 conf/type/__autofs_master/gencode-local create mode 100644 conf/type/__autofs_master/man.text create mode 100755 conf/type/__autofs_master/manifest create mode 100644 conf/type/__autofs_master/parameter/optional create mode 100644 conf/type/__autofs_master/singleton diff --git a/conf/type/__autofs_map/man.text b/conf/type/__autofs_map/man.text new file mode 100644 index 00000000..fbbd15d6 --- /dev/null +++ b/conf/type/__autofs_map/man.text @@ -0,0 +1,60 @@ +cdist-type__autofs_map(7) +======================== +Steven Armstrong + + +NAME +---- +cdist-type__autofs_map - Manage autofs maps + + +DESCRIPTION +----------- +This cdist type allows you to define maps for autofs. + + +OBJECT ID +--------- +The object_id Is used as the mount-point as described in auto.master(5). + + +REQUIRED PARAMETERS +------------------- +map:: + Name of the map to use. See auto.master(5). + + +OPTIONAL PARAMETERS +------------------- +type:: + Type of map used for this mount point. Defaults to 'file'. + See map-type in auto.master(5) for possible values. +options:: + See auto.master(5). +comment:: + A comment describing this map. Is added to the generated entry in + auto.master. + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Add auto mounter at /net +__autofs_map /net --map /etc/auto.net --type program + +# Add auto mounter at /pub +__autofs_map /pub --map /etc/auto.pub \ + --type file --options nosuid,rw,bg,hard,intr --ghost +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) + + +COPYING +------- +Copyright \(C) 2011 Steven Armstrong. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__autofs_map/manifest b/conf/type/__autofs_map/manifest new file mode 100755 index 00000000..74672e46 --- /dev/null +++ b/conf/type/__autofs_map/manifest @@ -0,0 +1,42 @@ +#!/bin/sh +# +# 2011 Steven Armstrong (steven-cdist at armstrong.cc) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# + +name="/$__object_id" +map="$(cat "$__object/parameter/map")" + +if [ -f "$__object/parameter/type" ]; then + type="$(cat "$__object/parameter/type")" +else + type="file" + echo "$type" > "$__object/parameter/type" +fi + +# Generate entry for use in auto.master +entry="${name} ${type}:${map}" +if [ -f "$__object/parameter/options" ]; then + entry="$entry $(cat "$__object/parameter/options")" +fi +if [ -f "$__object/parameter/comment" ]; then + echo "# $(cat "$__object/parameter/comment")" > "$__object/parameter/entry" +fi +echo "$entry" >> "$__object/parameter/entry" + +require="$__self" __autofs_master + diff --git a/conf/type/__autofs_map/parameter/optional b/conf/type/__autofs_map/parameter/optional new file mode 100644 index 00000000..b1aa3a7e --- /dev/null +++ b/conf/type/__autofs_map/parameter/optional @@ -0,0 +1,3 @@ +type +options +comment diff --git a/conf/type/__autofs_map/parameter/required b/conf/type/__autofs_map/parameter/required new file mode 100644 index 00000000..b4a284c5 --- /dev/null +++ b/conf/type/__autofs_map/parameter/required @@ -0,0 +1 @@ +map diff --git a/conf/type/__autofs_master/files/auto.master.header b/conf/type/__autofs_master/files/auto.master.header new file mode 100644 index 00000000..53590257 --- /dev/null +++ b/conf/type/__autofs_master/files/auto.master.header @@ -0,0 +1,3 @@ +# Generated from cdist __autofs_master +# Do not change this file. Changes will be overwritten. + diff --git a/conf/type/__autofs_master/gencode-local b/conf/type/__autofs_master/gencode-local new file mode 100755 index 00000000..701f97a8 --- /dev/null +++ b/conf/type/__autofs_master/gencode-local @@ -0,0 +1,26 @@ +#!/bin/sh +# +# 2011 Steven Armstrong (steven-cdist at armstrong.cc) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Generate auto.master config based on all defined __autofs_map ojbects. +# + +auto_master="$__object/files/auto.master" +cat "$(cat "$__object/parameter/header")" > "$auto_master" +find "$__global/object/__autofs_map" -path "*.cdist/parameter/entry" | xargs cat >> "$auto_master" diff --git a/conf/type/__autofs_master/man.text b/conf/type/__autofs_master/man.text new file mode 100644 index 00000000..d889b1f6 --- /dev/null +++ b/conf/type/__autofs_master/man.text @@ -0,0 +1,47 @@ +cdist-type__autofs_master(7) +======================== +Steven Armstrong + + +NAME +---- +cdist-type__autofs_master - Generate the auto.master file + + +DESCRIPTION +----------- +This cdist type generates a auto.master configuration from given __autofs_map +definitions. See cdist-type__auto_map(7). + + +REQUIRED PARAMETERS +------------------- +None + +OPTIONAL PARAMETERS +------------------- +header:: + Absolute path to a file used as the header for the generated auto.master + file. + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# auto.master with default header +__autofs_master + +# auto.master with custom header +__autofs_master --header /path/to/header +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) + + +COPYING +------- +Copyright \(C) 2011 Steven Armstrong. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__autofs_master/manifest b/conf/type/__autofs_master/manifest new file mode 100755 index 00000000..e37a5d34 --- /dev/null +++ b/conf/type/__autofs_master/manifest @@ -0,0 +1,31 @@ +#!/bin/sh +# +# 2011 Steven Armstrong (steven-cdist at armstrong.cc) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# + + +if [ ! -f "$__object/parameter/header" ]; then + echo "$__type/files/auto.master.header" > "$__object/parameter/header" +fi + +[ -d "$__object/files" ] || mkdir "$__object/files" +require="$__self" __file /etc/auto.master --source "$__object/files/auto.master" \ + --mode 644 \ + --owner root \ + --group root + diff --git a/conf/type/__autofs_master/parameter/optional b/conf/type/__autofs_master/parameter/optional new file mode 100644 index 00000000..8e83f898 --- /dev/null +++ b/conf/type/__autofs_master/parameter/optional @@ -0,0 +1 @@ +header diff --git a/conf/type/__autofs_master/singleton b/conf/type/__autofs_master/singleton new file mode 100644 index 00000000..e69de29b From 6784d4ca167902c978346f3f999058a88ef56990 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Wed, 6 Apr 2011 23:29:52 +0200 Subject: [PATCH 0155/4996] docfix: add missing = Signed-off-by: Steven Armstrong --- conf/type/__autofs_map/man.text | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/type/__autofs_map/man.text b/conf/type/__autofs_map/man.text index fbbd15d6..1584c16b 100644 --- a/conf/type/__autofs_map/man.text +++ b/conf/type/__autofs_map/man.text @@ -1,5 +1,5 @@ cdist-type__autofs_map(7) -======================== +========================= Steven Armstrong @@ -15,7 +15,7 @@ This cdist type allows you to define maps for autofs. OBJECT ID --------- -The object_id Is used as the mount-point as described in auto.master(5). +The object_id is used as the mount-point as described in auto.master(5). REQUIRED PARAMETERS From df6c2909cb1932364f3b19a2811576d7ba5fac9e Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Wed, 6 Apr 2011 23:31:38 +0200 Subject: [PATCH 0156/4996] bow infront of the whitespace nazi Signed-off-by: Steven Armstrong --- conf/type/__autofs_map/man.text | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__autofs_map/man.text b/conf/type/__autofs_map/man.text index 1584c16b..941e22da 100644 --- a/conf/type/__autofs_map/man.text +++ b/conf/type/__autofs_map/man.text @@ -41,7 +41,7 @@ EXAMPLES -------------------------------------------------------------------------------- # Add auto mounter at /net -__autofs_map /net --map /etc/auto.net --type program +__autofs_map /net --map /etc/auto.net --type program # Add auto mounter at /pub __autofs_map /pub --map /etc/auto.pub \ From 88a667b17fcddaaaba00d232636e51e340f4ef6a Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Wed, 6 Apr 2011 23:42:22 +0200 Subject: [PATCH 0157/4996] docfix: add missing = Signed-off-by: Steven Armstrong --- conf/type/__autofs_master/man.text | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/type/__autofs_master/man.text b/conf/type/__autofs_master/man.text index d889b1f6..641c8393 100644 --- a/conf/type/__autofs_master/man.text +++ b/conf/type/__autofs_master/man.text @@ -1,5 +1,5 @@ cdist-type__autofs_master(7) -======================== +============================ Steven Armstrong From 9c5e7f516164ef9b9caa4030a1ca598911ac872a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 23:43:22 +0200 Subject: [PATCH 0158/4996] much more fun with 1.6.1 Signed-off-by: Nico Schottelius --- doc/changelog | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/changelog b/doc/changelog index 1a38a2bd..b88705f8 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,10 +1,13 @@ 1.6.1: * Improved logging: Show code responsible for abort - * New Type __package_pkg_openbsd + * Improved logging: Consistently prefix with current object or core * Bugfix: Type __debconf_set_selections used wrong contens for selection * Bugfix: Don't fail, if cache directory is not existing * Bugfix: __user and __group exited non-zero if no change was necessary - * New explorer: hardware_type + * New Explorer: hardware_type + * New Type __package_pkg_openbsd (Andi Brönnimann) + * New Type: __autofs_map (Steven Armstrong) + * New Type: __autofs_master (Steven Armstrong) 1.6.0: 2011-04-06 * New Type __package_yum From ff184006cb540b49feb12400a784dd828b280c96 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Wed, 6 Apr 2011 23:46:15 +0200 Subject: [PATCH 0159/4996] colon gangster attack Signed-off-by: Nico Schottelius --- doc/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changelog b/doc/changelog index b88705f8..0560dee0 100644 --- a/doc/changelog +++ b/doc/changelog @@ -5,7 +5,7 @@ * Bugfix: Don't fail, if cache directory is not existing * Bugfix: __user and __group exited non-zero if no change was necessary * New Explorer: hardware_type - * New Type __package_pkg_openbsd (Andi Brönnimann) + * New Type: __package_pkg_openbsd (Andi Brönnimann) * New Type: __autofs_map (Steven Armstrong) * New Type: __autofs_master (Steven Armstrong) From c3341df08d5406bcbd1f49870765d3bb23d49577 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 7 Apr 2011 09:56:59 +0200 Subject: [PATCH 0160/4996] Upgrade to 1.6.1 Signed-off-by: Nico Schottelius --- bin/cdist-config | 2 +- doc/changelog | 82 ++++++++++++++++++++++++------------------------ 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/bin/cdist-config b/bin/cdist-config index 4346c0cb..5d19f854 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -19,7 +19,7 @@ # # -__cdist_version="1.6.0" +__cdist_version="1.6.1" # Fail if something bogus is going on set -u diff --git a/doc/changelog b/doc/changelog index 0560dee0..2fef50ca 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,30 +1,30 @@ -1.6.1: +1.6.1: 2011-04-07 * Improved logging: Show code responsible for abort * Improved logging: Consistently prefix with current object or core * Bugfix: Type __debconf_set_selections used wrong contens for selection * Bugfix: Don't fail, if cache directory is not existing * Bugfix: __user and __group exited non-zero if no change was necessary - * New Explorer: hardware_type - * New Type: __package_pkg_openbsd (Andi Brönnimann) - * New Type: __autofs_map (Steven Armstrong) - * New Type: __autofs_master (Steven Armstrong) + * New Explorer hardware_type + * New Type __package_pkg_openbsd (Andi Brönnimann) + * New Type __autofs_map (Steven Armstrong) + * New Type __autofs_master (Steven Armstrong) 1.6.0: 2011-04-06 - * New Type __package_yum - * New type __debconf_set_selections - * New explorer os_version - * Fix Type __group in case of __group NAME syntax - * Fix __package* types: consistently name --state removed instead of + * New Type: __package_yum + * New type: __debconf_set_selections + * New explorer: os_version + * Bugfix: Type __group failed in case of __group NAME syntax + * Bugfix: __package* types: consistently name --state removed instead of uninstalled or deinstalled - * Type __package gained Fedora support - * Removed --preseed support from __package_apt - * explorer/os: gained Fedora support + * Type __package: Added Fedora support + * Type __package_apt: Removed --preseed support + * Explorer os gained Fedora support * Simplified types __user and __group * New helper binary: cdist-mass-deploy 1.5.0: 2011-04-01 * Add basic cache functionality - * New type __process + * New type: __process * Restructured execution: (Steven Armstrong) Orientate processing on objects, resolve dependencies and ensure correct execution order. @@ -32,8 +32,8 @@ * Documentation: Remove legacy man pages (Steven Armstrong) 1.4.1: 2011-03-25 - * New type __key_value (Steven Armstrong) - * New type __apt_ppa (Steven Armstrong) + * New type: __key_value (Steven Armstrong) + * New type: __apt_ppa (Steven Armstrong) * Documentation: Manpage generation cleanup * Documentation: Manpage fix for __apt_ppa @@ -48,9 +48,9 @@ * Include HTML documentation of manpages and publish them 1.3.1: 2011-03-21 - * Document cdist-type-build-emulation - * Document cdist-type-emulator - * Document cdist-remote-explorer-run + * Document: cdist-type-build-emulation + * Document: cdist-type-emulator + * Document: cdist-remote-explorer-run * Fix dependencies in cdist-code-run * Fix dependencies in cdist-manifest-run-all * Add --source to __issue and fix os check @@ -62,33 +62,33 @@ 1.2.0: 2011-03-19 * Added dependencies (see cdist-type(7)) - * New type __removeline (Daniel Roth) - * New type __group (Steven Armstrong) - * New type __user (Steven Armstrong) - * Document cdist-run-remote - * Document cdist-code-run-all - * Document cdist-object-gencode - * Document cdist-explorer-run-global - * Document cdist-manifest-run-init - * Document cdist-manifest-run-all - * Document cdist-object-gencode-all - * Document cdist-manifest-run + * New type: __removeline (Daniel Roth) + * New type: __group (Steven Armstrong) + * New type: __user (Steven Armstrong) + * Documentation: cdist-run-remote + * Documentation: cdist-code-run-all + * Documentation: cdist-object-gencode + * Documentation: cdist-explorer-run-global + * Documentation: cdist-manifest-run-init + * Documentation: cdist-manifest-run-all + * Documentation: cdist-object-gencode-all + * Documentation: cdist-manifest-run 1.1.0: 2011-03-16 * Replace type __file with __file, __directory, __link - * Document cdist-env - * Document cdist-config - * Document cdist-dir - * Document cdist-quickstart + * Documentation: cdist-env + * Documentation: cdist-config + * Documentation: cdist-dir + * Documentation: cdist-quickstart 1.0.4: 2011-03-15 - * New type __motd - * New type __addifnosuchline (Daniel Roth) - * Document type __issue - * New type __user - * Document type __package - * Document type __package_pacman - * Document type __package_apt + * New type: __motd + * New type: __addifnosuchline (Daniel Roth) + * New type: __user + * Document type: __issue + * Document type: __package + * Document type: __package_pacman + * Document type: __package_apt * New parameter for __file: --owner and --group 1.0.3: 2011-03-11 From 965e80b0ef28d8dbb9ad6e5f0d464c167db7b2fe Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 7 Apr 2011 10:28:08 +0200 Subject: [PATCH 0161/4996] more stuff running in the systems group Signed-off-by: Nico Schottelius --- README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README b/README index 54f792a7..75b36581 100644 --- a/README +++ b/README @@ -211,13 +211,14 @@ Yes, I'm actually eating my own dogfood and currently managing * [moinmoin](http://moinmo.in/) (wiki) * [apache](http://httpd.apache.org/) (webserver) * [kerberos (mit)](http://web.mit.edu/kerberos/) (authentication) + * [nss-pam-ldapd](http://arthurdejong.org/nss-pam-ldapd/) * [ircd-hybrid](http://www.ircd-hybrid.org/) (chat) * [stunnel](http://stunnel.mirt.net/) (SSL tunnel) * [mercurial-server](http://www.lshift.net/mercurial-server.html) (version control) * [xfce](http://www.xfce.org/) (lightweight desktop environment) * [slim](http://slim.berlios.de/) (graphical login manager for X11) -with cdist on a total of **20** production machines of the +with cdist on a total of **50** production machines of the [Systems Group](http://www.systems.ethz.ch) at the [ETH Zurich](http://www.ethz.ch) as well at home. From bc77a637a986f41653e72224580b1920bf8a4f02 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 7 Apr 2011 11:57:50 +0200 Subject: [PATCH 0162/4996] more cdist on more nodes = more fun Signed-off-by: Nico Schottelius --- README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README b/README index 75b36581..350cd3e1 100644 --- a/README +++ b/README @@ -211,14 +211,14 @@ Yes, I'm actually eating my own dogfood and currently managing * [moinmoin](http://moinmo.in/) (wiki) * [apache](http://httpd.apache.org/) (webserver) * [kerberos (mit)](http://web.mit.edu/kerberos/) (authentication) - * [nss-pam-ldapd](http://arthurdejong.org/nss-pam-ldapd/) + * [nss-pam-ldapd](http://arthurdejong.org/nss-pam-ldapd/) (authentication) * [ircd-hybrid](http://www.ircd-hybrid.org/) (chat) * [stunnel](http://stunnel.mirt.net/) (SSL tunnel) * [mercurial-server](http://www.lshift.net/mercurial-server.html) (version control) * [xfce](http://www.xfce.org/) (lightweight desktop environment) * [slim](http://slim.berlios.de/) (graphical login manager for X11) -with cdist on a total of **50** production machines of the +with cdist on more than **60** production machines of the [Systems Group](http://www.systems.ethz.ch) at the [ETH Zurich](http://www.ethz.ch) as well at home. From 4895a92d95c4d2d842100dadace9956634f81fc7 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 7 Apr 2011 12:01:55 +0200 Subject: [PATCH 0163/4996] ++doc todo (funny item) Signed-off-by: Nico Schottelius --- doc/dev/todo/TAKEME | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index d456ae35..871045f2 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -53,4 +53,5 @@ DOCUMENTATION - asciidoc interprets __, which we use for variables names -> seek through docs and replace with \_\_! - reference explorers in cdist-reference! - +- compare running times: + one, 5, 10, 50, 100, 1000 hosts => how does cdist scale? From 59ec60ba0bbe6134609c9bf5571ba7be022475af Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 7 Apr 2011 12:07:06 +0200 Subject: [PATCH 0164/4996] ++todo Signed-off-by: Nico Schottelius --- doc/dev/todo/niconext | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index db1ba10a..a02d7013 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -3,3 +3,6 @@ Fix bin/cdist-type-template Cleanup documentation: type reference -> add types + manpages add explorer reference + +Catch broken instances in cdist-mass-deploy -p and report +broken deployements at the end! From 4873b046ba45527b2fe6685ff6fbfec5cee6b3fd Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 8 Apr 2011 10:51:27 +0200 Subject: [PATCH 0165/4996] allow user to change __cdist_tmp_base_dir to avoid using /tmp Signed-off-by: Nico Schottelius --- bin/cdist-config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/cdist-config b/bin/cdist-config index 5d19f854..44a95f01 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -98,7 +98,8 @@ __cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname" ################################################################################ # Tempfiles # -__cdist_tmp_dir=$(mktemp -d "/tmp/cdist.XXXXXXXXXXXX") +: ${__cdist_tmp_base_dir=/tmp} +__cdist_tmp_dir=$(mktemp -d "$__cdist_tmp_base_dir/cdist.XXXXXXXXXXXX") __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX") ################################################################################ From a4c0b3df1fb23d02b7eaaf1c32be93cbdf764ec1 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 8 Apr 2011 10:56:53 +0200 Subject: [PATCH 0166/4996] [DOC] explain and document __cdist_tmp_base_dir Signed-off-by: Nico Schottelius --- doc/man/man1/cdist-config.text | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/doc/man/man1/cdist-config.text b/doc/man/man1/cdist-config.text index 9d147988..0c8b0735 100644 --- a/doc/man/man1/cdist-config.text +++ b/doc/man/man1/cdist-config.text @@ -15,6 +15,28 @@ types, manifests, etc. Generally speaking, it's just usable from within the core and is only of interest for cdist-developers. +ENVIRONMENT VARIABLES +--------------------- +The following list contains environment variables that are known +to be changed by users in various situations. To change the variable, +use your current shell and export it, so all cdist-binaries know about it. + +__cdist_tmp_base_dir:: + Normally this points to /tmp. In case /tmp is not suitable for + cdist (i.e. has noexec flag setup) you can change this variable + to point to a better location. + + +EXAMPLES +-------- + +If /tmp has the noexec flag, you can use $HOME/.tmp for instance: + +-------------------------------------------------------------------------------- +export __cdist_tmp_base_dir=$HOME/.tmp +-------------------------------------------------------------------------------- + + SEE ALSO -------- cdist(7) From 10cc25330c7e397bf3788d5c49aaafafc4cbbbfb Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 8 Apr 2011 10:57:18 +0200 Subject: [PATCH 0167/4996] remove space at the end of the line Signed-off-by: Nico Schottelius --- bin/cdist-object-explorer-run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run index 79cd2865..b65c5cc1 100755 --- a/bin/cdist-object-explorer-run +++ b/bin/cdist-object-explorer-run @@ -44,7 +44,7 @@ if [ "$__cdist_has_explorer" ]; then __cdist_type_explorer_pushed_add "$__cdist_type" fi - __cdist_echo info "Running explorers " + __cdist_echo info "Running explorers" # Copy object parameters cdist-dir push "$__cdist_target_host" \ "$(__cdist_object_parameter_dir "$__cdist_object_self")" \ From bdb1c6e7a65e856bf6df121b26bd34d2dc6d065a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 8 Apr 2011 11:01:57 +0200 Subject: [PATCH 0168/4996] stuff for 1.6.2 Signed-off-by: Nico Schottelius --- doc/changelog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/changelog b/doc/changelog index 2fef50ca..83b2b6e3 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,3 +1,6 @@ +1.6.2: + * Core: Introduce __cdist_tmp_base_dir + 1.6.1: 2011-04-07 * Improved logging: Show code responsible for abort * Improved logging: Consistently prefix with current object or core From 08f37578fc1a685f60dfb69f14ec96f03b8dfe0d Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 11 Apr 2011 11:13:06 +0200 Subject: [PATCH 0169/4996] +linklist Signed-off-by: Nico Schottelius --- doc/dev/logs/linklist | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 doc/dev/logs/linklist diff --git a/doc/dev/logs/linklist b/doc/dev/logs/linklist new file mode 100644 index 00000000..4ec144cb --- /dev/null +++ b/doc/dev/logs/linklist @@ -0,0 +1,2 @@ +http://groups.google.com/group/puppet-users/browse_thread/thread/83801a03c0fea665 +http://lists.debian.org/debian-user/2011/04/msg00818.html From 64826ca5ce29e913ce04ba3628a69bfbbc9a2429 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 12 Apr 2011 12:18:46 +0200 Subject: [PATCH 0170/4996] +links Signed-off-by: Nico Schottelius --- doc/dev/logs/linklist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/dev/logs/linklist b/doc/dev/logs/linklist index 4ec144cb..29d5ab96 100644 --- a/doc/dev/logs/linklist +++ b/doc/dev/logs/linklist @@ -1,2 +1,4 @@ http://groups.google.com/group/puppet-users/browse_thread/thread/83801a03c0fea665 http://lists.debian.org/debian-user/2011/04/msg00818.html +http://sans.ethz.ch/projects/puppet/ +http://www.nico.schottelius.org/eth/puppet/ From 0e42e98bb93ad5361cfd0b56142bb708b804c5c6 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:27:01 +0200 Subject: [PATCH 0171/4996] begin to cleanup bin/cdist-type-template Signed-off-by: Nico Schottelius --- bin/cdist-type-template | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/cdist-type-template b/bin/cdist-type-template index dc853614..335a0ed9 100755 --- a/bin/cdist-type-template +++ b/bin/cdist-type-template @@ -26,9 +26,11 @@ set -eu __cdist_type="$1"; shift +__cdist_type_dir="$(__cdist_type_dir "$__cdist_type")" +echo "Creating type $__cdist_type in $__cdist_type_dir ..." # Base -mkdir -p "$(__cdist_type_dir "$__cdist_type")" +mkdir -p "$__cdist_type_dir" # Parameter mkdir -p "$(__cdist_type_parameter_dir "$__cdist_type")" From 10ebdd87d4e21c599dc29db6b604ed6e8d0fff0b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:31:15 +0200 Subject: [PATCH 0172/4996] fixes + local and remote gencode Signed-off-by: Nico Schottelius --- bin/cdist-type-template | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/bin/cdist-type-template b/bin/cdist-type-template index 335a0ed9..772b7486 100755 --- a/bin/cdist-type-template +++ b/bin/cdist-type-template @@ -26,11 +26,11 @@ set -eu __cdist_type="$1"; shift -__cdist_type_dir="$(__cdist_type_dir "$__cdist_type")" +__cdist_my_type_dir="$(__cdist_type_dir "$__cdist_type")" -echo "Creating type $__cdist_type in $__cdist_type_dir ..." +echo "Creating type $__cdist_type in $__cdist_my_type_dir ..." # Base -mkdir -p "$__cdist_type_dir" +mkdir -p "$__cdist_my_type_dir" # Parameter mkdir -p "$(__cdist_type_parameter_dir "$__cdist_type")" @@ -38,11 +38,11 @@ touch "$(__cdist_type_parameter_dir "$__cdist_type")/${__cdist_name_parameter_re touch "$(__cdist_type_parameter_dir "$__cdist_type")/${__cdist_name_parameter_optional}" # Manifest -cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_manifest}" +cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$__cdist_my_type_dir/${__cdist_name_manifest}" # # This is the manifest, which can be used to create other objects like this: -# __file /path/to/destination --source /from/where/ --type file +# __file /path/to/destination --source /from/where/ # # To tell cdist to make use of it, you need to make it executable (chmod +x) # @@ -50,8 +50,8 @@ cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cd eof -# Gencode -cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}" +# Gencode remote +cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}-${__cdist_name_gencode_remote}" # # This file should generate code on stdout, which will be collected by cdist @@ -63,5 +63,17 @@ cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cd eof +cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}-${__cdist_name_gencode_local}" + +# +# This file should generate code on stdout, which will be collected by cdist +# and run on the same machine cdist-deploy-to is executed. +# +# To tell cdist to make use of it, you need to make it executable (chmod +x) +# +# + +eof + # Explorer -mkdir -p "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_explorer}" +mkdir -p "$__cdist_my_type_dir/${__cdist_name_explorer}" From 231eb1214c4de9b284edc84124ba8480901f5aa3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:33:48 +0200 Subject: [PATCH 0173/4996] refuse to try to recreate a type Signed-off-by: Nico Schottelius --- bin/cdist-type-template | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/cdist-type-template b/bin/cdist-type-template index 772b7486..6d8a3f15 100755 --- a/bin/cdist-type-template +++ b/bin/cdist-type-template @@ -28,6 +28,10 @@ set -eu __cdist_type="$1"; shift __cdist_my_type_dir="$(__cdist_type_dir "$__cdist_type")" +if [ -d "$__cdist_my_type_dir" ]; then + __cdist_usage "Type $__cdist_type already exists" +fi + echo "Creating type $__cdist_type in $__cdist_my_type_dir ..." # Base mkdir -p "$__cdist_my_type_dir" From 24428b2070c22e96a8a19c878638610b4f3856bc Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:35:07 +0200 Subject: [PATCH 0174/4996] more stuff for 1.6.2 Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 83b2b6e3..2da35ad8 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,5 +1,6 @@ 1.6.2: * Core: Introduce __cdist_tmp_base_dir + * Core: Cleanup and enhance cdist-type-template 1.6.1: 2011-04-07 * Improved logging: Show code responsible for abort From da1d3fbc0469c56b393ee0df1d33096f2cfdb1e4 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:51:24 +0200 Subject: [PATCH 0175/4996] begin new error catching code and make filter a function Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 8a555411..294e1ca1 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -25,23 +25,38 @@ [ $# -ge 1 ] || __cdist_usage "[-p] [target host ]" set -eu +filter() +{ + awk -v host=$1 '{ print "[" host "] " $0 }' +} + parallel="" if [ "$1" = "-p" ]; then parallel=yes shift fi +i=0 while [ $# -ge 1 ]; do - # always assume we run parallel - cdist-deploy-to "$1" | awk -v host=$1 '{ print "[" host "] " $0 }' & - shift + if [ "$parallel" ]; then + cdist-deploy-to "$1" | filter + # Record pid and host for use later + eval pid_$i=$! + eval host_$i=\$1 + i=$((i+1)) + else + cdist-deploy-to "$1" | filter + fi - # if not, wait for it _now_ - [ "$parallel" ] || wait + shift done # else wait after all are started if [ "$parallel" ]; then __cdist_echo info "Waiting for cdist-deploy-to jobs to finish" + while [ $i -gt 0 ]; do + + done + wait fi From 0122ccc3eedabb8fcd07a9eacfe40dff5a7ec001 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:56:10 +0200 Subject: [PATCH 0176/4996] in theory finish new error catching + displaying code Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 294e1ca1..b78c032b 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -39,7 +39,7 @@ fi i=0 while [ $# -ge 1 ]; do if [ "$parallel" ]; then - cdist-deploy-to "$1" | filter + cdist-deploy-to "$1" | filter & # Record pid and host for use later eval pid_$i=$! eval host_$i=\$1 @@ -47,16 +47,20 @@ while [ $# -ge 1 ]; do else cdist-deploy-to "$1" | filter fi - shift done # else wait after all are started if [ "$parallel" ]; then __cdist_echo info "Waiting for cdist-deploy-to jobs to finish" - while [ $i -gt 0 ]; do - + while [ "$i" -gt 0 ]; do + eval pid=\$pid_$i + eval host=\$host_$i + wait "$pid" + if [ $? -ne 0 ]; then + __cdist_echo error "Configuration of host $host failed." + fi + i=$((i-1)) + shift done - - wait fi From 9c60a81d8a9ced7f9266602bc8a53b5ff226f661 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:57:20 +0200 Subject: [PATCH 0177/4996] decrease first, last number is unused Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index b78c032b..3d497436 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -53,14 +53,14 @@ done # else wait after all are started if [ "$parallel" ]; then __cdist_echo info "Waiting for cdist-deploy-to jobs to finish" - while [ "$i" -gt 0 ]; do + while [ "$i" -ge 0 ]; do + i=$((i-1)) eval pid=\$pid_$i eval host=\$host_$i wait "$pid" if [ $? -ne 0 ]; then __cdist_echo error "Configuration of host $host failed." fi - i=$((i-1)) shift done fi From 471b8a73088d0141cba6d59cd5cf04232b1e691b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 16 Apr 2011 23:57:46 +0200 Subject: [PATCH 0178/4996] pass hostname to filter Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 3d497436..b4ccc8ff 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -39,13 +39,13 @@ fi i=0 while [ $# -ge 1 ]; do if [ "$parallel" ]; then - cdist-deploy-to "$1" | filter & + cdist-deploy-to "$1" | filter "$1" & # Record pid and host for use later eval pid_$i=$! eval host_$i=\$1 i=$((i+1)) else - cdist-deploy-to "$1" | filter + cdist-deploy-to "$1" | filter "$1" fi shift done From a51267356297bacf3e90354bf672c246234a0610 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 17 Apr 2011 00:00:55 +0200 Subject: [PATCH 0179/4996] more small things for 1.6.2 Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 2da35ad8..1d2c3565 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,6 +1,7 @@ 1.6.2: * Core: Introduce __cdist_tmp_base_dir * Core: Cleanup and enhance cdist-type-template + * Core: cdist-mass-deploy: Report failed cdist-deploy-to instances 1.6.1: 2011-04-07 * Improved logging: Show code responsible for abort From 01a541d0176ff3d584d4ddc16b1ff85b2fc0366a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 17 Apr 2011 00:10:07 +0200 Subject: [PATCH 0180/4996] use different count to ignore case of 0 hosts Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index b4ccc8ff..bd6bd406 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -41,26 +41,33 @@ while [ $# -ge 1 ]; do if [ "$parallel" ]; then cdist-deploy-to "$1" | filter "$1" & # Record pid and host for use later + i=$((i+1)) eval pid_$i=$! eval host_$i=\$1 - i=$((i+1)) else cdist-deploy-to "$1" | filter "$1" fi shift done -# else wait after all are started +e=0 if [ "$parallel" ]; then __cdist_echo info "Waiting for cdist-deploy-to jobs to finish" - while [ "$i" -ge 0 ]; do - i=$((i-1)) + while [ "$i" -gt 0 ]; do eval pid=\$pid_$i - eval host=\$host_$i wait "$pid" if [ $? -ne 0 ]; then - __cdist_echo error "Configuration of host $host failed." + e=$((e+1)) + eval e_host_$e=\$host_$i fi + i=$((i-1)) shift done fi + +# Display all failed hosts after all runs are done +while [ "$e" -gt 0 ]; do + eval host=\$host_$e + __cdist_echo error "Configuration of host $host failed." + e=$((e-1)) +done From 91106ba0af4f7be86cfe25f3be62d6892eee8bd3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 17 Apr 2011 00:11:23 +0200 Subject: [PATCH 0181/4996] comment for sysadmins Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index bd6bd406..1c6baa69 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -65,7 +65,7 @@ if [ "$parallel" ]; then done fi -# Display all failed hosts after all runs are done +# Display all failed hosts after all runs are done, so the sysadmin gets them while [ "$e" -gt 0 ]; do eval host=\$host_$e __cdist_echo error "Configuration of host $host failed." From 20f0a788b143c45b19c09ae73293e76df3cffaa9 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 17 Apr 2011 11:32:11 +0200 Subject: [PATCH 0182/4996] use -gt consistently Signed-off-by: Nico Schottelius --- bin/cdist-mass-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cdist-mass-deploy b/bin/cdist-mass-deploy index 1c6baa69..e8e2594f 100755 --- a/bin/cdist-mass-deploy +++ b/bin/cdist-mass-deploy @@ -37,7 +37,7 @@ if [ "$1" = "-p" ]; then fi i=0 -while [ $# -ge 1 ]; do +while [ $# -gt 0 ]; do if [ "$parallel" ]; then cdist-deploy-to "$1" | filter "$1" & # Record pid and host for use later From 14cb98b4f980832d19ff193b777aa018e815de48 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 18 Apr 2011 08:35:52 +0200 Subject: [PATCH 0183/4996] seperate branches for more than one feature, please Signed-off-by: Nico Schottelius --- doc/man/man7/cdist-hacker.text | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/man/man7/cdist-hacker.text b/doc/man/man7/cdist-hacker.text index f9f08e31..027f28aa 100644 --- a/doc/man/man7/cdist-hacker.text +++ b/doc/man/man7/cdist-hacker.text @@ -55,12 +55,16 @@ There are though some requirements to ensure your changes don't break others work nor kill the authors brain: - Code submission must be done via git -- Code to be included should be branched of the upstream "master" branch - - Exception: Bugfixes to a version branch -- Code submissions must be in your master branch - - Exception: If you only want a comment on your code, but not an inclusion. - Do not add conf/manifest/init - This file should only be touched in your private branch! +- Code to be included should be branched of the upstream "master" branch + - Exception: Bugfixes to a version branch +- Code submissions should be in your master branch + - Other branches are fine as well, but you need to tell me which branch + your work is in! +- If you developed more than **one** feature, consider submitting them in + seperate branches. This way one feature can already be included, even if + the other needs to be improved. As soon as your work meets these requirements, you can contact me (IRC, Mailinglist, Phone, RFC 1149) and I'll check your code before From c929ce09776e0b335ef1de3bb24ca74e8ac3199e Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 13:42:14 +0200 Subject: [PATCH 0184/4996] begin logfile for today Signed-off-by: Nico Schottelius --- doc/dev/logs/2011-04-19 | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 doc/dev/logs/2011-04-19 diff --git a/doc/dev/logs/2011-04-19 b/doc/dev/logs/2011-04-19 new file mode 100644 index 00000000..65b9550b --- /dev/null +++ b/doc/dev/logs/2011-04-19 @@ -0,0 +1,67 @@ +Meeting with: Steven, Thorsten, Nico + +Problem: execute my code only if somebody else's changed something. + +Proposals: + +1) Introduce new binary (Steven) + +gencode: + +if has_changed __file/etc/nginx.conf; then + echo mycode +fi + +2) Use -f plus new variable to cover .cdist/has_code: + +if [ -f $global/objects/__file/etc/nginx.conf/$has_code ]; then + echo mycode +fi + +And $has_code resolves to .cdist/has_code to cover the .cdist +directory. + +3) Create a new tree that contains changed objects + +if [ -e $global/changed/__file/etc/nginx.conf ]; then + echo mycode +fi + +4) Use a \n seperated list + +if grep -q __file/etc/nginx.conf $global/changed; then + echo mycode +fi + +X) General problem (add to FAQ): + + When having "do something only if somebody else did something" + it is possible that users get confused, because code will not + be executed. + + This may especially happen in code development: + + a) User creates __file/etc/nginx.conf + b) User creates a new type __nginx that restarts + nginx, only if __file/etc/nginx.conf changed. + But __file/etc/nginx.conf has already been deployed + and thus will never be restarted. +-------------------------------------------------------------------------------- + +Introduce exclude/conflicts attribute for types? + + Handling in cdist vs. handling in the types themselves? + + Examples: __file, __link, __directory + + Need to handle errors on low level for those anyway. + + Conclusion: Wait until we need exclude in a different type. + + Pro: + Throw error as soon as possible without touching the target. + + Contra: + No needod for most cases. + Very controversal for stuff like __package and __package_gem + for instance: rails; Should those two conflict or not? From 0e5cb9b11f1c2609214711b22691b47b92101545 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 13:43:03 +0200 Subject: [PATCH 0185/4996] cdist type template works Signed-off-by: Nico Schottelius --- doc/dev/todo/niconext | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index a02d7013..887856d5 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1,5 +1,3 @@ -Fix bin/cdist-type-template - Cleanup documentation: type reference -> add types + manpages add explorer reference From 4d244e9ea2ff10521a9216166bacf53598f02d20 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:30:06 +0200 Subject: [PATCH 0186/4996] =?UTF-8?q?import=20=5F=5Fssh=5Fauthorized=5Fkey?= =?UTF-8?q?=20from=20Aur=C3=A9lien's=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nico Schottelius --- conf/type/__ssh_authorized_key/man.text | 46 ++++++++++++++++ conf/type/__ssh_authorized_key/manifest | 55 +++++++++++++++++++ .../__ssh_authorized_key/parameter/optional | 2 + 3 files changed, 103 insertions(+) create mode 100644 conf/type/__ssh_authorized_key/man.text create mode 100755 conf/type/__ssh_authorized_key/manifest create mode 100644 conf/type/__ssh_authorized_key/parameter/optional diff --git a/conf/type/__ssh_authorized_key/man.text b/conf/type/__ssh_authorized_key/man.text new file mode 100644 index 00000000..af0c2017 --- /dev/null +++ b/conf/type/__ssh_authorized_key/man.text @@ -0,0 +1,46 @@ +cdist-type__ssh_authorized_key(7) +================================= +Aurélien Bondis - aurelien.bondis AT gmail DOT com + + +NAME +---- +cdist-type__ssh_authorized_key - Sends a user's public key to another user's authorized_keys + + +DESCRIPTION +----------- +This type sends a rsa key. By default uses root's key and sends it to root's authorized_keys + + +REQUIRED PARAMETERS +------------------- +None. + + +OPTIONAL PARAMETERS +------------------- +srcuser:: the user to take the rsa public key from +dstuser:: the user to give the rsa public key to + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +#deploy root's public key +__ssh_authorized_key admin +#deploy bob's public key to alice's authorized_keys +__ssh_authorized_key --srcuser bob --dstuser alice +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) + + +COPYING +------- +Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__ssh_authorized_key/manifest b/conf/type/__ssh_authorized_key/manifest new file mode 100755 index 00000000..efadc3f6 --- /dev/null +++ b/conf/type/__ssh_authorized_key/manifest @@ -0,0 +1,55 @@ +#!/bin/sh +# +# 2011 Aurélien Bondis aurelien.bondis AT gmail DOT com +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# This type allows to send a public ssh key from a user to the +# authorized_keys of another +# +#require="__package openssh-server --state installed" +# Get option srcuser if defined +if [ -f "$__object/parameter/srcuser" ]; then + srcuser=`cat "$__object/parameter/srcuser"` +fi +# Get option dstuser if defined +if [ -f "$__object/parameter/dstuser" ]; then + dstuser=`cat "$__object/parameter/dstuser"` +fi + +# if a source user is defined, use it's public key +if [ "$srcuser" ]; then + srcrsa="/home/${srcuser}/.ssh/id_rsa.pub" +# if no source user is defined we use root's public key +else + srcrsa="/root/.ssh/id_rsa.pub" +fi +# if a destination user is defined, insert in it's authorized_keys +if [ "$dstuser" ]; then + sshpath="/home/$dstuser/.ssh" +# if no destination user is defined we use root's home +else + sshpath="/root/.ssh" +fi +rsa=`cat $srcrsa` +__directory $sshpath +# the file authorized_keys depends on the .ssh folder +require="__directory${sshpath}" __file "$sshpath/authorized_keys" --mode 640 +# the line added depends on authorized_keys existence +require="__file${sshpath}/authorized_keys" __addifnosuchline sshkey --file \ + "$sshpath/authorized_keys" --line "$rsa" + diff --git a/conf/type/__ssh_authorized_key/parameter/optional b/conf/type/__ssh_authorized_key/parameter/optional new file mode 100644 index 00000000..4903f5be --- /dev/null +++ b/conf/type/__ssh_authorized_key/parameter/optional @@ -0,0 +1,2 @@ +srcuser +dstuser From c6d7ad31243fd65a0e5127b80a9e87acabfecb27 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:30:56 +0200 Subject: [PATCH 0187/4996] =?UTF-8?q?++changes=20for=201.6.2:=20Imported?= =?UTF-8?q?=20=5F=5Fssh=5Fauthorized=5Fkey=20from=20Aur=C3=A9lien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nico Schottelius --- doc/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog b/doc/changelog index 1d2c3565..be175ffd 100644 --- a/doc/changelog +++ b/doc/changelog @@ -2,6 +2,7 @@ * Core: Introduce __cdist_tmp_base_dir * Core: Cleanup and enhance cdist-type-template * Core: cdist-mass-deploy: Report failed cdist-deploy-to instances + * New Type __ssh_authorized_key (Aurélien Bondis) 1.6.1: 2011-04-07 * Improved logging: Show code responsible for abort From 08db913134d6c3274c76f9b59cafb7434a1ebd98 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:34:13 +0200 Subject: [PATCH 0188/4996] add releasechecklist Signed-off-by: Nico Schottelius --- doc/dev/releasechecklist | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 doc/dev/releasechecklist diff --git a/doc/dev/releasechecklist b/doc/dev/releasechecklist new file mode 100644 index 00000000..aefbfe4d --- /dev/null +++ b/doc/dev/releasechecklist @@ -0,0 +1,16 @@ +# Stuff to take care of when doing a release + +# adjust version +vi bin/cdist-config + +# adjust release date +vi doc/changelog + +# Import into current version branch +git checkout 1.6 +git merge master + +# Ensure documentation builds cleanly +./build.sh clean && ./build.sh man + + From 458126e700c2211d3b43409bce46d5d28d522716 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:34:47 +0200 Subject: [PATCH 0189/4996] begin to make checklist a script Signed-off-by: Nico Schottelius --- doc/dev/releasechecklist | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/dev/releasechecklist b/doc/dev/releasechecklist index aefbfe4d..cbb5bb72 100644 --- a/doc/dev/releasechecklist +++ b/doc/dev/releasechecklist @@ -1,4 +1,7 @@ +#!/bin/sh + # Stuff to take care of when doing a release +echo "Preparing next release" # adjust version vi bin/cdist-config From 7a8559fe52104feaa1a3453ac6ffa6214d28a4ad Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:40:51 +0200 Subject: [PATCH 0190/4996] in theory finish releasechecklistscript Signed-off-by: Nico Schottelius --- doc/dev/releasechecklist | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) mode change 100644 => 100755 doc/dev/releasechecklist diff --git a/doc/dev/releasechecklist b/doc/dev/releasechecklist old mode 100644 new mode 100755 index cbb5bb72..379954e7 --- a/doc/dev/releasechecklist +++ b/doc/dev/releasechecklist @@ -1,19 +1,31 @@ -#!/bin/sh +#!/bin/sh -e + +files="bin/cdist-config doc/changelog" # Stuff to take care of when doing a release echo "Preparing next release" -# adjust version -vi bin/cdist-config - -# adjust release date -vi doc/changelog - -# Import into current version branch -git checkout 1.6 -git merge master - # Ensure documentation builds cleanly ./build.sh clean && ./build.sh man +# get version +version=$(awk -F'=' '/^__cdist_version/ { print $2 }' bin/cdist-config | sed 's/"//g') +# get target branch +branch=${version%.?} + +# adjust version and release date +vi $files + +# Commit stuff +git commit $files + +# Import into current version branch +git checkout $branch +git merge master + +# Publish manpages and sourcecode +./build.sh web +./build.sh pub + +# FIXME: add tagging somewhere! From efe1d3db7984f3715b8b657a2bca7a61ae83d31a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:43:18 +0200 Subject: [PATCH 0191/4996] Prepare files for the next release --- bin/cdist-config | 2 +- doc/changelog | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cdist-config b/bin/cdist-config index 44a95f01..366b7993 100755 --- a/bin/cdist-config +++ b/bin/cdist-config @@ -19,7 +19,7 @@ # # -__cdist_version="1.6.1" +__cdist_version="1.6.2" # Fail if something bogus is going on set -u diff --git a/doc/changelog b/doc/changelog index be175ffd..e2d6bb49 100644 --- a/doc/changelog +++ b/doc/changelog @@ -1,4 +1,4 @@ -1.6.2: +1.6.2: 2011-04-19 * Core: Introduce __cdist_tmp_base_dir * Core: Cleanup and enhance cdist-type-template * Core: cdist-mass-deploy: Report failed cdist-deploy-to instances From c2454b645b5be1b40c61dceb04a5e2e4f32ca7ba Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:43:49 +0200 Subject: [PATCH 0192/4996] add tag support Signed-off-by: Nico Schottelius --- doc/dev/releasechecklist | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/dev/releasechecklist b/doc/dev/releasechecklist index 379954e7..098ead06 100755 --- a/doc/dev/releasechecklist +++ b/doc/dev/releasechecklist @@ -20,6 +20,11 @@ vi $files # Commit stuff git commit $files +# add tag +printf "Enter description for %s>" "$version" +read tagmessage +git tag "$version" "$tagmessage" + # Import into current version branch git checkout $branch git merge master @@ -27,5 +32,3 @@ git merge master # Publish manpages and sourcecode ./build.sh web ./build.sh pub - -# FIXME: add tagging somewhere! From 3de78bfaed74cc64be364825cf6e20ab4546c583 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:45:05 +0200 Subject: [PATCH 0193/4996] + push architecture in readme Signed-off-by: Nico Schottelius --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 350cd3e1..2d97f20c 100644 --- a/README +++ b/README @@ -35,6 +35,7 @@ Design | Meaningful error messages - do not lose time debugging error messages Design | Consistency in behaviour, naming and documentation Design | No surprise factor: Only do what is obviously clear, no magic Design | Define target state, do not focus on methods or scripts +Design | Push architecture: Instantly apply your changes Small core | cdist's core is very small - less code, less bugs Fast development | Focus on straightforwardness of type creation is a main development objective Requirements, Scalability | No central server needed, cdist operates in push mode and can be run from any computer From 6d5962826a9bfda60ab914de59cd4d2f15404678 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 22:48:28 +0200 Subject: [PATCH 0194/4996] change back to master after everything is done Signed-off-by: Nico Schottelius --- doc/dev/releasechecklist | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/dev/releasechecklist b/doc/dev/releasechecklist index 098ead06..5568ee35 100755 --- a/doc/dev/releasechecklist +++ b/doc/dev/releasechecklist @@ -28,6 +28,7 @@ git tag "$version" "$tagmessage" # Import into current version branch git checkout $branch git merge master +git checkout master # Publish manpages and sourcecode ./build.sh web From 5cc626a2a10e771e34b2b5a78347ccc4f3a76bea Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 19 Apr 2011 23:47:26 +0200 Subject: [PATCH 0195/4996] add a video showing a cdist installation in less than 60 seconds Signed-off-by: Nico Schottelius --- ...st-installation-in-less-than-60-seconds.mp4 | Bin 0 -> 590996 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/video/cdist-installation-in-less-than-60-seconds.mp4 diff --git a/doc/video/cdist-installation-in-less-than-60-seconds.mp4 b/doc/video/cdist-installation-in-less-than-60-seconds.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cdccbe43406af40fa498799ffcd727acbba85201 GIT binary patch literal 590996 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 z z8HIex>{TrN7#-~N3h#D_%94I&sCAr>gwYiT<`(GU062M!HQ6Q)t{AR?zx*f&%ah>F zw^|*(6d~_)jmx5SSN0Bl+bBlQcjRo?gj}V1LUa>liq%v-$!t?sThxVF`eQ$kURCz= zTQFE}1iWdSbV87u7)R2l6Lh>fa3)+ge`i#av?k(hkcMWWZvDKip{?$n_QYe7?x#x;lbZc{utSg9_PcGF5#N$`d2lO%*EVczIl_&$fQ1EHEBF z8lj})Z_ibx-Xk}!;anox>-!^De>K>~>d4J7SxkdI2wayV^2CItN|z2YPzOq^+4c9H zFAS-S%O8Tx(XY@{-nZOYSOJMpn!)s9D;k3_MqG16heMn(!ORFusf3JsoH{&n?Wb>$ z4v5E@TJ1wYPbcGes8iZwlI5;$3~O;vV+CUze0?G2i^j9+p@dHT6?1M38f!MrREDa^8V&cEOJyZU z4XGFR(Icyag^+{IXZ%#=IolX}WA?!(LK|#|R%K&$hQr+? zZXY4MX1@NwEEUcVy~)6*8#-1ullbIY^qn^5%T*@ip|Y(d>@6_GBz}A?>Rr(^Pq(`u ziO)j_kwK*DKm_-tzLSU+%Cfvd`FTm(iS^&F4(G@jnS}G- zp16k)RStKPicj8!mg06X*)N0{598`U3xRO0K*^%<45%-iUu?Pq3}DnH)1Ry^=R7{j zB-1@kdj1;#y1Tv@r)j-~`zlY>Hh$L-R6c=TK?eDmpCeRwz5NYDS;3@U@6D=@9N1(x zrZhJh%RdZD5K^(yFNVFc-pzgVJB{~DY+0Md%$yCvLcah2?732ti{Tx^RBY9g^+3it z@pDgFNy6$iBD#Q2;Z z*L&K;v}IUf&Bu?5Ri z3&xWh4v(l5sn%Tc@S*0WNOW4eu7pB`Xugr&G(itz=mH9gTHvV*dZ z=ZSyuoquF(WHd3?;~#fV|GjH#F~}FX!QO+Rh~B2FYOhk?`xN>&Ju@PrB8g@Z&|Mc$ zBi7CqgH7UR&DmNrlC>0f1KrgB-77KB$9R+o9G;zoa=O2AmE1|$Lp@cSO|O7<9QsWS z`3f$}On-1;b${i*{AYG6MTce0)?fUvQH zcd1j5%Ka9e|Iw}^=4<-`AIC?s?V(a{udmAEjvz$kLLdVle#B_y@_oh@Udt#MfBT?* z5#&o7_1TRo#6S9Gil>%_N5c@MftdX+{^3;qvYhgwcmuKe+!MyViU485;7%H+>m!z3 z@IbkKW=X>R5 zOUg{i)nECCb3A|+NOzOAhL)g+?+7Z<0<@pjU`=^S-qM<_01AW4T!NZD`F8hpw*$k7 z!U3=@7p5dbSl*})j8>YY#e}uc_>Iu94M5^1^%8-jiiR1wDZWb@Fr`ZOhm|z`CxCw! zcSHkKf{>7hfRpJtfF0Zypn$CPn>84DZlP$)wld*hbNQq^h=RgenK-7?o2g~uN9yFg zBRSx~x-NJi&=bdGa1x~WVkq?rSnB{>X{JOa zTfCQ*+UftwFYr+1&qJ;3<{{4Nz@oacs;uNGF=+FCwPVN%aD1_MKq}q07x1GNaRkIg zKCrnQTz3ubGO`dK&n&%T7f&dS7!i+mZGVuLd(o05(k)7PIbzWCjc=H(-Uy@s8~_Q1 z85MoU%;Y)R-59PA^F*EWyGpAv3K_Xv=3qKA70$JM{By79(w+L!be?^d0SAaa%TjY8 zQY>+p)?~w0<2Q*bQ;~<2d^lb~4U=})-i8jIkfMTpdm_pXQM4pll5y2RkLtbz1`{`~ z;-bEvFdPvZb#;BS$isC5SH2l-j92F5;88}1AXFX#M#Qf-5Mtu!1}fJ*lYO&`N$`{I$%aW*hf!2El6-W~oS5^jw z!A1ChnhkO;l`S9MxI*@tCAu`0J4gBo5HX0Vckzpth6=q>AKwEe12GreA-a3Qlj$J^ z0_;#noppZ*9Bw`FVwTV%!nbsrr<&W9a?M5VZ=v#m|S&TI-p(`H_gnRlGRZkjqMj^`Izhy)K z&<;Bf!&%t$=wrKo5N-oB4vkZa{OL-=chSG5Pu@waSw2C}z<0oc+Zqq!{G64^ckGLwb*_jYy`z9^0)~6g!#GbYT$PJ5ah+De?%RG+LZ3 z2vK;1BW(Uw0a?j%l=f1nglJq^M{*B_%9#Okx;90CgAlqgxVMfc-Rm=&gAB{7UWP9` z-1IxWz*JPEHnF^zf0m$uk1y0?YWcLsb{7x)6J@+phTgVOu>1h*sx}sukf#xyNsWbP zqIMi1Oj4@s1*Au0j;>S1c8)Xv4J$90E2Z$z<65`wG>u!Jl{l*PA&=h;T-r=XKKH3NPS7Kt+Ik;ULk5LK@ zwmm)%oZZ{JMX^BJ@;0*DA}8#+t~np2H_cKnCet+#)jwv| zQsRs6KKn5REEgu{B1g*p+ptM?+A5KfDc)s>nOJ?$<0K2d` z*o_j*u&fhTTknSEDH7_kSSW1EXmrKZIb%hCvIZ3Dk{_ky{Rv`rG|3f7F7LW464WGI0tGFQkA_;AE5Ubb2?aIQGviRsmMG>k(xt&{l<@F z;U7uJE*ddd2Y)VD73jiz2mR`tE%^(4I8Z&z?g!r3EEh$mQrXPmVA@BuXTwt_^r0PO zcrTo&Yl*wlIS#iKBkI*J5WXB3K;@SFuROnck>CX%lL1P4ldO->0=08{Sgk8^Odn`E zr;F);PNuU(Ou((m1TUHnbg!=^?pj_grlXTb}kIkG$_pXGJDZ6e!_ZbT_}Qs z$S>V@@q=79RD%3%D=@a71s5K{iM8M8xu@G*W5Dh=xTa-xm24~g2j0V&*g|TrV;kMQ z$$&sFoS7_-ZL>Zm{Q^Y`I~P zdADYF@tZa#03q{u=5~e3m^auvI&=@@>!S-8;b3RC)~N`D3a+A)HKzFKvvE{|DH1L( z;-s~_8P<{N&N6&b!M)dhIm@j}d{U?^JdekgFQM!=CMG(2FK-jGorAUyER&=QGP71D z%yL>3Q^4dXS`mqjtG%VWf9E0l#GlbE&&stFt1R0t0#s4kS@{?dMk?+e&*>M5WYoqv zW5M$Q`^B-=_L{<$!@N0;!bVnnvFg!B%xSKBjtzYVhz}5xOS|QH2P$IqhIFA~ENICh_ zH=pS)(b#C*LN+xC$kS44#z^B+IouR|uK(fC)Ex=3$U{KXAZEcEg_KFjbcg~CbJnE@ zc7$id_g2~ZzQ9F&rG}#30qZb@?xDxbyfh^93-we`tdW3+%>iq$0H{$YRyVd>*3)FT zdHn^2wl0}z(be_%HNoW)B*ctcDG9Sls*&vK_-HqFHb`WqeLBmckQI_P8n%cBErY?^ z5Kmem&sGC(J)SG*cL8vvcX6@h6P8mie|fueyf6xg(u#mb%+@t98(ucdX5*JbgeWsN z{*3JkWS13L19AVnx!rBmx>Ou9zA2)p!Nz(nC>Vn z30nR*28r5=TTY6kuJ+I-=N@lNXk$Dhp!&il$y10p!d0I9y;{ytSxwN0Acy&fKrS6p zZ4=vy%tGU+Mj3Qx&F8BHgf;;bp&lWQYXh_LJB!$LwFk9;pW#(-Z|cg);ej18Arob+yS5A9{2m}K>38*s+jKIf`g0nU z5LL*y7%Jms$-!KAZ*xwUnbe4Vu=xHApoOBg?l5u9k-rV=4T&)mn8iGxVmbDg`S#R{ zkr4nTg_{nJ?Pr%JC9{=PVUI&~ifrIaF}Y2KeZ5pa%_;tu-pb6UBu1`r*VS79?a0YZjXX=D`IbpB|B zU;ua1UFBBT*ELH^`wJujzX3_q(mBE!Gndr?;`M~}7!X6aG8o3&3m+)FT;Bwz{1okBAR1Lw$+>Y)dz z7)?o%tkjnXzqTVsY&N!otbU3{)=H^l|3NnPvA1LbUzTUl4jR1js404Qhc4t1zIexg z-dIfSOetUtV$+oFSuh$=3vtN2-sYP3{@sWnSf?|0Fk(yt zTBIg}XA=y3u^K2i7351(XRY$1rbxYGYl|tNQ~8|!6totTy>5=ZCLHB>JB?&?YYlxi zl?qR-h$)0W3|hBlP-UB;@k|DQz=kkeB2T-UI0&NCR3kzrX72Y})yPUNK;@zA4%ioQ z&kXvvO6vjKp?&Yewz`poxh}iYw({x5=f&rE;ec7EA4W>dy4r#{>WRGK&&>`p%}E{1 z0NH+ZCP6~j?E_l#_jEi#YY@OCp3E<|>zUL()E1ros;qzsG_xTIYUFFpdCuEfO^cM& zSlMbOO%d-s5vPp}_o}bW;QwOot)u#Awrx=ePH+hxToNF-ySoH;4ekMgThQPV+}+*X zHMqOGyTk8g2hRDD?47)E?z{JmI|hFMvrFb&tJbQjuI`SSj5gE^FQo5{+sGPuIwV{D z&mk@#1e}3~$4iRfnk0zyP}+78-U+{D@Z$cVZuu_ZZcG#5hEDcPRIW;5*;K$usileL z;L15JAdK!YTLF2)I8HdD4w4K@6W<4?3|<}IcM3fD1I)w;I*T$Gq0+qI8wCy*x*AHZ zxoARoIBe3~J8kt4M6LDD3y~a|rc^m)^BC=ZmM`LEF)pIk>T}w~*6at$j*V^h+I#{N zJKv7f3=*QlDgVD%#gU8l++<#_T<`S2-D$IlbZr9 zPJH~l4;2m;u#+S^ff6EGO)@}AqXyJT0cv5RC3LfSy{YcDzU`?p!W=+#Qc~Ps^&xXS z+M!N=5HPoQ3Tn2fFUffHMc5V^oY(}Vfsgr!M#NEYJw1rBHC9x$e&`0W>J#``=wz`; z*uB+*Y0_HPC+yQR?y;WZxQT_V;~YZ@ZWT49R~{U~RRf?O;)rZbfdV$8zTZHg(Ld82 z@v64v3B`kMi`C56Yx*cDQiNSJfb4YKPD)&nla`YPN)dD$$FK_my?Iy>?idrGeRv+! z!I)=nX|_OM8Y$F7Yo{7y9x0+cZTXl^mYiiOgx(#SMX|$bls5Z@6Bt-i&s70r_^dHc zrnQoa7sM9L#vwU(ENs&6TBr*jTl*DZK6_%7=D{#eHZs-XHS<90!{O9hhF424%XSpU z3h1J>o$Zh?2AWmb%sSJ+;eI$0w=Q#K?ManiHOa5Zuc6V!Z!Eql!CfhYv+hoP6f@jK z=+Y2m<`4MNy-CKQr%);7QVlO5n}Rxej3&Z)%wK&Ct$fkRc3p3a@GmXiq*x*tE8@xhnCL^Z{pc zgXQ#cn1bVII&L7^xfkUKz$IZ*onUt!O}~$OdnA+`Ch5N4S>6nuzN7{$k5$05rTq0B zch}vUiRp;7jcJ=9=Qr4nuu_LDw$(}_ol%0N!NwX`!f?pLB@!Ns$(QPUYL=6rt~?LmYKIY2#Q{@Nhb{~CX>{12N2*5q{($OGwQE!QV47RA@FIvB z#K90KUBSm*0UGK7NviRq$mxW6=88B#_9h0{SZhL*;K3Ub1+2*xrl3G}^9=PgGT}yW z#2ZQw^ZfF=_hrFx9}Ikoe6rMHbn#D=e5uRUq+s{ov%)m&I$*^jW%`K&Ar-7UuCYT@L)G4p045=;sbUH+l6F44S&dgo&&6U+?}95Ocf7>xNOL^6|mz!leV;u`GLSdq&} z60%sIfiv!obt828J{6&^|Ujm%L z$`%3$!wht{9{30&puiHX2Q=?s|2)ArKyP4LJTw9d^Z3GscVZ6s%qxIzaxm2r;UEGm zJRgCvG&~mp(TG&-4K(#HE+>8B`43rVyUDmccGV?Q`f`K!LG=~)46pYJucVEH{Cm{&QHc?q z{vG$EE<5xRG;ily3nyx0aj)Jhmkw^G^zb_RlP&qm>+u@quk}~5aaE#*M#}VJu#;jf zd2S`G15ntJP!96hsf-<}U7}rZXLzFN$D(}>?SzkxL{zJ$kvZRAZ*ibB8kp~*M^@t{ z{xAh&Re>zdj-Nyl8sBASUm_o?xs_iBC1I{~P@4WZ_9eaO4AVY^F!^QO*U87#!(&HtbQ3ic{^zombfF?fS~?PWcC3^%8TVn8J+NBc#?J-61{qlY`ZEtwex80@=-N|Fhdk!2B%nJQWY-3oHP{GE4gxtSA=D9LMyh%XzXeX zI#X|Mj;O+go#3^_PB84t{ddrM%40-0-@mqbUKse2qLHxg9-GK>SSQ?eTCtL{whea0 zCPq@^#EV83075@zwgo!^%JN2zBsQ1^*X@;8Cn)9VYvWVRJSx@_M_Q@`X?E5DDx;;(U`b;=F=M&cwYF+^*{W)DKaf(zVLcRJ9oVpmGCiwvWq> zRRn2X2dOCjkapy%RxPifsvjms?n+0Famf}p?p^Qlu;X^5J?TsC7?-#8Sqk3fmCmiL zxS_Qb2zbRf(+77HhBTR70AFX8oOggQU5$e23xsp2W>A_7H=7d1X4&ZtQOJI^UFaY< zL|C^u(3RhbBC$=~pFJI*DNF&3^f~a^^aA3$Dwl<>Gq~z@ zM7|kta);{?G=WD{K$mnm`!j(jrqjGH*%Ml`kF-;(!}Ef>=Dh9AcHNqKUt1_bcJ5^x zj0b&&x^8o*^+uV5qnk2y%>xw`5zx~I@(`7pu*4)> zq*;6nli7>*)D=4Q$FL*Mf&ju;8FhL8^4h>hxko0Y`;n$pcj{ehq=dFWjH#klhm+tn9Ei$~$} zlzceV8e7GkD(%#SI%{>9Wx|K{xBaNd&E{f@CI_R+mZ+l_M+X@A9LjZzJtfx1 z4~FSCN}&2mkEyAjtiph6UowTz!HQ854mzdr$f0_9)I&hzXNXuRPK!gB)~a5DtI}ZJ znb8^md(kYq=}o^>JzYnT=EbB%wpS2tCeInEd3=X*n?@zVlJBKLNfGi1#=*1ZJtww( z=!U`hb6D2-A3u`%OBQ-cQgMnuMeU!1`ZH|zcR2d*aP`kHNIe?6C#;5H{*=-i?;3@@ zfh&#_gf&EmgO5}F$)`d~VT_#u{QGDCju8OV796UWI5M%4G)oQ+o9A@nG}m&E^yE4U z|HT#l*2l)20)VE_y`l%gOZ)K8bT3ZT`EK?4PEs{Myu^1{z{~L;n7pC&DTCJYJ4fbK zC)L-ksu}ykAU-F14E1WSuxE{4hmD0K+IgdMVWw@ZhxjKGqN(#RQ!1TJe0PDVGYnEw(@Qp;R0y-j4*yZ% z_{Lz}4baS{FZJ2o-Wu|V%G%8tm#(~Ns~1#z`g)_$qW5k?Z0It9hZupXU$id<`rfj^ z(xn9Qf#qrxauO!S(lD$90dJ=%CKG7vI!nxCV!INRo&TkUHl~yc@{TX7I z{asC093ZwB7d^<{TmT*BqR*N2>Ap*>9u-BHn#w2c`o_J$qI=}UOh}}Q87?DIABlyC z8*WKfZt)4?DnX0KLt>&Tw8hBbQu{y5en8SEHo0ljt0KQY%5%bm{tXYxWrPgxs$VEq z^}_{X%6|z)4>2+b|qDN3^?$}fRP7PxIMXT0p>FI~-cNC;j;d&+A_YdG9qGnmja zDM~5tyM@JeN0E-H(6}))YBAyN^?XZg)^296$$L3Ask2efPBiFPHeTc^?$l@z)neU&F39>j_%?qBFFKK!UnH9vGJQ^nYZ zB>TB0`zDY2j+wFcS|#bgK}bc{kI9q(7wVyga8F;te$%!^NzC&uB0`P!{F4|YtcvY+ zLx90YR1Tn;98fxXefF;!0bzDTYNO^0l733pG2-Cq%TZwlEz_)8#xZ3#pQ8W6V!K$F;msnI{6x%ka zQ$RQl2npR-!oyN1dX4VaR)-N$NW@kM@>~>PIs2rut{#1dHNA9*Y|Tyx1mWyh6L0Gg zh0}>)<`p}>66g5J0Sgq!YQSgk#)9S%^5$WU2D{}O1M+ZbzC--$dN0X5{0`wZPr+U5Otd6OQFclIWi~|GOmBKf@rOsP^!^$ok&4 zI8S`;Zyxa+%n2&IA5knSk$vg+Zojb}dbG~9n^sf2fW|uovjmk7>frO5Phd(tOuWcv zRKjUd?x!}Vey;SVHvhw<90bH*vKL~06Zan8pHt~L0Vp z^}R#o8@=JlCjTBJoyur$P7gWr@)-tQ#h{>x)($)F0k$6AVx8;Hcrn6)rnn66<%YJ| z%-}*$M)Du+_c@o2{o9lR;mByz*fFs(65(TFJJKjHNz<&1lOAx7Ip3hhet;tdGQQIv zgEuvlO7CD~Fl{ix+!eV_1h_y-=nLU5H~t{?KX}W+FDdOg{wn?~3CM@iO>TNhiIjTe ztI|bnr#IZh@%TxfZ31>xYgM+-8fG~etx)2=ii;IE60T$`1Q*M!lijBguorZyz^Ju2(QmYvvRTd(S6 z4Q{!PMn_y!sr!W#;s=*{FEIB3Ry)!`j8x z6HyotXY|lVppOQC9{&$5RSzOs`zANY#F@J?gp8=Atji4;3(bt1#ED5C)RW75i<=KI zZ;ETT*CT0|F_<4d-z10|8wMzVrdi7m7t#Y=!_TdTa> z|I!C{HWs0&i1mPKC+tN`xcRVY$&%?tHEqRFNh3}*vT7lv27ab-9j6lO~Y0=1k)(iuq|F~45(ews*}UU zAWAkD+hLwN0%5CQ`^vW`#OE+F;#@Ib=bDY2MaV*15%s32Z4-+gm(%P%9cr<$O!Jwo z7Ej#^uJbkZt3?mUbLBfNsaKJb)`zI8z7`hsF%A!9^_AERPq8CR`zG(NeH~rfHi;MmP z{5*fE{yRMN2lzkDBz|i9ImV*>we-(lTL1z9VJ}^QYLCw33(W+yT&tq%g;aJZlb)Em z-8~R~mFjD?+W?nP657b}5FY}Zyg8_H(|>Lcdgdw6DE^_b=f2qe0e+4{(SL`l{{TN% zKJ^FqKLxpelj(mHO+a{>Uc(>sKfd9K3 z0;ZwCY?$EDOyOk!d-Yz#p5hBHO#wbGVg5`eXPJpFp$o-BTuy5)vWp+SUJpV`u$&t% zpkzK%5Ks97=9oG;5a1FEXY32{`yTF@M}LXR$I(W1gP~lKlG*$&<1hH#o2{~+^zROO zO&wy%c?Y5A4C8WR>=Ej%2&Rx-xWU3-tl+g5K(9|WVeea#27TT0q6uXb}Q zlWsg{5-#XW(Smi$TkKg+P-@9td~Z6`w^Pht^EH`aW`P6MzG?4;NrE^3u2-yn0EzPK!~YXJ?(OxPDGhPfJz&s4t1<>6Nn130=gh=r>C(iF>4Wy+GyodJVZ8+W0 zNw*6%azXW2RH(|moI6Okxj^~(QInetq{i8 z;^y0j5d}l7fdtO4(o7`N<#eD8bTMy%IQ@Z;< zDVSKM97SvyaK#5dt`nyq=AfTeCqWK(LR|$CI%H9pk0f_J{WKSZBzsqiV&Y_SBT!GU`H1Eg9nAIu-+UUawWUNxO>+LNpmXeayP zE=@kfnfrqB4!!nz#f=`R{i*2Ybg%N{P1%7pBkaRtd$>O|FH;@AwRbEk!-LU{s2nXEOatF8aC7K)C3xCsGf6qV(;Jt4?`RnKf) zt-xZ`t~BKGQ;5G-!jP?9twf!-kp$$DN)iO3bB}W5Lh$hDM_K=AAv^FEl+hqWF-@%X z9Aj*}OIHn2cD|{+_uXvhr9G6}+=-+1E87nH=iv+cN}KL(?fcvSR-Ka7bdrO6g9!s? zz~v$A^$mW8;0H#kxKa5RdE9NLicQ@~eUv1sDYb=m{m5k*bZQoOwtD&izSY^U+ExV{ zu0Bm^>s8eoUrY#za1%;!NBu+9)-Ho3>NL!FD(HAawg}1>&>`!MWU-|Ax%fM1$?AFa zRl!WXlhBQ2wa3#(Xcf^pe5k?(ldlKwUbT7B-20c z-x@f=E5B0_h!YD4P<-uq6OkYd1B{3043q)D9hXO2WA`#w`P7qUz5wcfQBMg)Sm1fd zEzQRb)=$P}`O;fD%J5bGK5=$vnPNW%&1FjD$IabqdK{}XO>AY$QE>%p zNNe2`PTyh6CNY?b;8w-zGW`wgomZC-dKDSDWDk>c#WXZ!p|2FD%UWA(luc=N?!mdN z#2CH#gnSuD_@H(4FiEC*&{W2_%De(SU9c6CF`B2ARyQtA8u1YhrHhkA@8qg3YMG^z z6pQPqjb1QC)I$=|n%6w#Yo?z=-A_sJIcF;V0e%jYc7KPX{|;CG0e)_K>hJK?FK~28oNr>*5p$p4KET9&}1O{s?}^>U~i~Om*D2Ns1Tz?owQ|=4Ze!b z8#eX*A{8g@FILHlXj>l)?Q?t1?U3pBa0hWCe&*RZps3;19=$gQn1(#0gMY9_{7)mW z0lSEZau`Y+YLnS}L-*6!K*R)2OLl&k8F>ec(8j~oJ~K%flCFBmQ(2~8l>ObK{(sz; z{x^4x`@2v4y1)BV>HlwI;o0F7|0>JRpH})VS$$mQ+GD(Xh)h1dv?V9mjc!|gm)XWv z+bYWpynrP7-DNeB6Pv0`s2;rkOpybxirnMq0fQ*xgZ7tP_0C*;t^x{?A@Z^^dRsy? zt*K5N8Dusco)D26uX82@UQd)vSM}@ubM*+HXO1tZepoI(`tMz={sa6>@K-U&nD^8`@mmi2kY^WyR-P`kI`kjc-?YVA93Z zSyN}#q)E4%V_CC0wADt@uFH=Y2rOae$Tmwvc-J1<9}~+un9!%266Zrw&=B>wPM_tW zh1FP_dp53xCtr#(QP76z?Q-p03QuO?>FM}W zVDvSXla_vMt}XYQgtOkBG&uVJ*UL)OHo5M=k!PT@J};b1SY~X2*g`{C=3?)L*G9xV4nqy{zai`%xKzu zDUTE3f^T@Hqg#i`TBr=}OD;o;L6ok_E{`F%ArYr0jwo>kq;gJc#eW7#3j$KJ64 z!MQddl#jD5oO2eqNjOV!lb`2av(bn#f+HC zG8!GhgqMv(N26`XWpIZwn0yg}Q^_L6#}R_G_6N!_SYe@$@TVKH4Gt*cMPZK|N7nIR zI>STA6vRc95_@g#{ir(QMQ#pkT_(9G@d}e~82Fe~_JDKG8^-ZleKgF}RSWfS?;d*H zQQY<;^0yOlTE=H5$vg9psWf^LO>#`)kNUrvICx>s_>3!sB3|QUEggpw6|&=m$9;?W zu+cFXt5a-!L)o?K9($_ApSJX*X7w*}mAkkxP)bY(Fr4e&JB)wG0PhlTGrm8Gh_62G zD4QT)afDb~cAN>k6})cFx1vYqv6amCkrSGPJN*8lSy#TH34Ku)5)2I{_zL8{0}COT zx5?qfXrS*$m-TuV)E zo}Zs|EL?(cRpLKibJR?TiGzME_Il(91#8(HcV;)`hbF&nK>`&$xG_+)zC)UqqD>T9 zTg0S+SvrDguoh+mc$^4Ky+&<5vmoz7gD>J@p~>~4B#!K%DSdhNO>Eiu9h7(@7dRVt zr%N_Kq4e!iIk0g!{w8~Dl&d|WQ`k}9V0v4$zh>hDym%!obXySh3CGptFofksH^FE3 zPj^F>dtPL?86A0|2{W+c?{8^!j=!u@KP=Krv9ogP=N!us8j!?>o6;7#R1XAvlSyjc z#A6i8?&e34KU$~MyrpZmwo{o^lmB{SRM$D7xrLk7?QZ`Zku7+hcq;zgxOTt5dA1hC zJAm)Um4T5E7jA67zZ`*ilD4~_Tw4MD{_wL42I1pb{giMfrpW6OqGr9%kqc;gL1tu43yaCrYoSi^+-|uSwE15+9(zncjNYui&VUYlk)iC8K z?wQP?B?9O8NiD5D{>S!vX$i5EFM4wY!4P5%=k8A$07E?0Q~gUl|G59Ne^31aXFgbi z+c9pYm=sCc`ftobO{Oe@T}R7BuPj}^E_Cmr6G4|ry?VFx8rbQ`f(Df2Vi|=TBI+Hv z^nK$z+zLj&$~+zGdf9ZG4b2KiUKqV~@GAetUg*Hcs z5O1Bi_prUssCybqfXb()N<3C#c?DZ-S7f2}rEM#|7N8PJn3Xlx0%2cwjE}zwFM>M? zJVK!n(eAYKtRoP%+;+{BAw_oh8s`o1fR=SR7?Md4`$Qc^>52K(FVuc#{@XG&)wVgP zfZ`?udd9J^RQj5}>ZPrQcNzxqajLbq8TQI&AVat1#}bIyq-rsxyrupTJV~O`_+i08 z5ea_&$Jc)6?pCFEC6Z)h2o?S}g^+eVC=14!hfh5^H&IpH)7bVw)RI#v#{eRx#Fbn;nip3uL_pWF} z4xbUIf;7S*KOBZRqsKTlA52>BUdUpl^;ecZ`#je058A)YBfj(UrUz`Yle>R`+#kgc z*Mvr6Ru~yX9YuoQqVdB0XNI>w{enXv5CLc>=_3b9G;#ya~X57(pPwRGe_l^r2`9 zMg`&_zX2`;@tzMaMtPItMil_vU42)ZYE@pk(HON~xe`@wnx<-u<*KnOKWrZD0DDlC z9@i}2t!cWQ4jsUVsJPSJh>`J3@Xq6jpyDrfO*rSegtPt7F^eaZslCBA0g=iJHe#w?`lxVH5uvisMS|`2qa--&wP(O52W#%nUh1lw4uW!0$uwFa1qrrW zJT@{1ErHN+PA)ROYpanmK0%uTOO&_*>lf^Rpo3vXf{llH<^^W<#H;$Zj-M9Q`lT&M z^PO*c(W*aozwwIVnBNLqncq8)6C5Lo6Ec-@3yAbRyl^|_Bpc^zd8!R$^Qp3_Un=`Y zr2m-Mzuw_;!#a`mFCDQszP$0$2@da@j?>Y&3hEdt#=$}C-K80H@)sA9xo)eUI?t{K z_tYMwH`{RFEoCAxlzk*q=%=yDa^q{$0}bnj`W7D$X?0>9sBlhni=r@xn30&p_zqzA z2>hj-ATdK1xW5s>0y+N9y?nTMoyV&>R&|{u=i~j=ys+UmQ)bX$rk-_2QJp0V05A`8 zk^#zYCSz?UzJOV5#U@kRrHvHP3)cDAPJ;Ee2H;OGagMm{mek)NM(^tJ(VxFAvvgsn z^auUljxmQ)d5uRYbc`Wg)oHTIQoer+K-USXc&!~{jg;(hR7Xc{GheL*{wjNLbgOS6 z!MdotuYVYca2M$|2DnR4>-49bth=GyTH4fX$)!ef)UPWdfkQPmsVn z=Oi*Sw6|zhUg}ieP*70sV3T)@{W@NcS4IFa0EcRc=q6y$iG|>s=KbzFJP~#Bg_$a@ z?^C%JYtHpX;d{oKVRo2(TefMHTvA|4IaJ!B(=oamq5IzVm&8IVx{+KhSV-{C&hmVm z>$geD@Ai#X{Kfo%ceqBE+27+_m@FTI3|QH>T(DM`2@nm7%dhrr5U03FY_6A~Aj{$X z>E7hCyr7%GDyNB|GB{iBU0SQOCaBVZeHd)2oCvvIhpnkf#mZJyz85*V>cU9Kjif&e zdJ^33mj?go&vPb?{sj&sD)7lvnJ35TLWaf7Eb_KGE6QOXGJ&}W zj4~Y>rQWk>K!WdJLLloBTj|f`xx~h0vlR3Pw@2=dENM~AVkM*iC`;=3BtP3x^fW*$ zfivV;PMt$;xX=J&83|4Zb)P3pKU&o^#fDci*>d}1Y4aig_>3G;q`?r6?!D4i?k@c{ z`PB?jD_$|Zw69GHHX5XahU)0oa;j^u{mq@(JbXUg~1YmN*U z_kMw>GyKh#Q&`k${WCWPo~9Yt)<8G+54%2xw)pB_Wb$I!?mn{@xOJVIVlF8&BtW;O zdizLL4aE8QK?!Q8rY3<9$bcgEVMZEM&tN1V-Qb}!d~uc#Ma}`y*9*b9=2oQ%3QzT8 zYrm4#v-8k=|K(rPr>S3>`NvpK!Qp?lRQGx~y;nr$*K^wLZWpXN%K}Nd1P_KNR~A}! zroN)BmiYFPN<&N$Ls1`6F<7Ba!wcsv8!sI)KgUG#5DOR<;Cw!T*5@^kV+DJOuyYPi zoUf#gaZ}NIY=T@MF!W-KiCwl33%*UJ0md3-UNwaz^qvn=Va~kJjH&*ZxYRMrHBoxQ z$2!Qc^V}Ub;7jWCZ#mr)rZ0@3%j`#^kcmuL7?CL zHMi_y zA?K?KH(j$=M*>BoY0ZUpRAhnB57ls?Q#BXn!{psi*R*fWzpq<=9P7egeqy5d2NOSy z$N$-Gf%6K8ni412BSa_W8ij|A1|JUxc+`3RF!vF5Ri2zm-L;E2!CIUj_+!K9f+CBj zT~XU$;I)By7Y?M=ME=|+P!U^}XOMWlHfn?oV7!};XO!K z;rPs(1jn@ZuJMWSuVd#Qr+#MqtIxa8TW*lAQhlfNs+j!HAw+i@Gf>r!#+uO;s{i;C z3)kvdtf=0ktE|*AMXRwbMTs3Y>tP4vO@G;h?Y9+?9O1YA;2gmuP}2O$k0&qOuI}eG zU^f#Wv*m}bBtVp0>vIK}Rwcl7;@@o`1PeiW%YP#Q2+dn*?2QSm#ODp~zw)+G8TzT~0;p$&t$0pyp2*&V1 z+A|~_nhNx>V{u<@Gn=D8;M>YM#ZA#@kj6JL^L0D01rvlShEDE<3Ehvp?@urxzOF{l zKT86)^FxyVtpV$I#eN&~|G>|V^LNF58%Y*SUk7IU!mx8HmMNY$=pb*N%=#zoo}2ki zyXx*+esh9mx0dU4HN8+eV2I52O{mWsGqH*j6KS_m9jkOmG@OBdRJ zpt=$DQq2QvpJiLvzzjLc4~@)-OgwT8V5XZ~r$`}w!|d58u_@2W+HpViYU&r0{X_oA z;QtrhHfT|-(WEoN0I^WfGUoyuwi;GKTEe7-BtlT0R!L3e=bjqWs)zPDMpH61ZoH5X znd0zoTOIj!38D_4=}pS+kc&M2&W;?_2Z1oehp2E|*;^;D86cB1JL&9pG*9*ENLBzK z3MCYmCwz!D^wow4kTy1%ZeS9l&X(?R5o+94R+Pns7;`MXa_ANiVsWu4 z)W<+VTfF31RYa>Fs{Xb=VYRwfvtsw%lIkvyRDh;E49KRfZ^|EFI%?qURA*`h@&md* z&7LhR6z7zNA>Sgjpe>j07kj;X5AL{|+|{|c&6V?GX1+s`#}B#g{?ruk(|Ygc83PLZ zm(c2CYr;tX#YQd$3m`%b!@NWnbYIqdi-9-tci1UHX06w%lWZkuQTogx8|wTSjH%zI zV64n=%5xYNx(wbQ`VpW&%L zl>R?Df}h&{ZJF_V*M7V4_YeHkwckd`zrodiAokq$-+BMfCb7S_{l7IQ{8Ra}#r_xV z{cO;`^ZvgmV*k$jkM@2x=%4KU>@9!i{eQ^b&zdX#)fIo61N_7Lxpeg3OaF=Yv$y=i z8@M|lnAdL8ztQ${jH*)Ytt)+T?Y=5V0v#dG;l+&L=RQj2X-ezItR)RroPxkzV-rT} zR@?GAS$Sa49)L~+6}5pBig*9dS%MHpo&w-SBIy;nX_O}Lb*4Tx_ZdVB-6z* z<2|iQ8;t4J2Ko3-(`}9Z`;i_SdS^1bdtYl0p-Nqpss*UoD50beGPb&faq+>_2#~vm z9Eq;hYcgABkTO7_ANRIMyUlJac3JPY-tiVM)!%P?x;qNPbDep%-}m z{oX;~ZgLL@WfHWu-RRaX2plEkS-=;q^R$UEPqN1d2GB3aDlcuIiqv+&MB@>ZG0&q$ zDd$j_B~&@)@+|+=67aXD9L4nC`u+GX4-+lbstj{>jr+g;1m$?TNb$Fes9yCne_@-T zyZvs2@3V@v=j?9x%VqyUe*8S27W?CXdLA*=zm#rK>>HqPjZQ~4NPT@HWXI|a(0z-L z(y`5%^CgM3kvB^*X^))8pH1}BRA+E$>g`tY^;v-z*xYwB#|X((mG+GC1|@w`yL!;cYJT)^bz2a zFQAi;HHz>}yeA4}=`bf3%$lC(SzRjH-nJFoagIT%d4VZpIFVlwf-G&uEmNS0g$Lq- z*St`Zh4=QnMuy3IS(A;uS7IYPUiZV@?yOW`to-|e_zW65nTKXb!wXA8(pm+wnc_s8 zZTG54BGbwN%`~x$v<7}lB9BBLKE9UQmEZsovv0?iMyay?h{k#_H^VxnbfnqA*Up?{ zftV=hl9l~^TVNeM)@=q~b-%}_nv=}|88QgkWP99Sk7uOYMGa!jVFN;s!Pl{D7lGc0 z64fZCs1tmt0VaehKLo;`V)S7H-(=rQ198;PA;1muI`x}3mt?4Bvkh9&UWnT_nrWZy zleoG?Tc=7gdOmO{LI*FyHm*$dX+}T6GO-Vrpm?21WqzS-$uMA5XgG$;`ppP#`7D`u z5+)mSvZSz!Lkd9i=(co@fIM>X3j8`iPz~EoqWW-F7uVi-8greW)=W<10$h*J0Ml~a z;`cYx>S&bh8emZu9DtTr*WBUKyWZnly|#;vN4z|#s<0xmU0ttC*qkmMYu*R=kHBqn zn;KMy8hB~(7^5=r%*o~{M&b22I)1(F!*2{fCegD@qw@J8|;Q2Pt7Zq~OfISk!x@NHDQ$t3^*y^a7 zGY*`afmeD}VahPKUq zl6FYpBL&RHd({bZF~(4Hk=1Eb3MP$szu>7*y$WaQJ67t`^)7`Z3jW)5B%bwP8A4;#2;NShwuplangqUHL*+^v_wA_WlEpJ z5xgFOU7A2BIwLVZpf8bv&jUfIe2C-J1xIt2>ytkyD~nlD#q7m(>c;frI7b>w`OIM_ zZL(jok};<|gA<*8BYWL_kMSOHn1-%C4TsoVUcuEOZ?7iN-<4=BiJpd$JD5tx{}8G5 z-J!RDNd!VH1&f@7=J{5uc)blJ5!oag6$ga+fdo#CtiFT*$U3MW`-wiy+b_%p=92cM zG`Z|`tcOXq=r;JRY$az$Jufcg^n3|gxO-w$6Ld}R|})^`up$`)LGUn017u5B)!Po!Yh%|TQLrsK8_#yX_c*xjQa9%xz_ z^=5t;Kgb@;#|;K`L7^@k`UJVi7(CwKW|l~5QFotQA}atw7KVjK*=9_(xhu34L8=N= zM`Fb#5Pax9x=46U=|)#!IW`-1xs%)z%%I)YEtAPpPNV`?AvIRRd|Bqr*$_UIXHdhE z@$m80@!PNA9IK?%@=e$^T*n5+_O}h^zRYYkIMg&B(EFeM&*Q zBW#bP1P~+heEW|VNixf~TYUAAB;WY50bOjxpIF7#3Hx8|k(gxFbZULAd!y@+oSxn^ zyPk63S?77r*@JJl9Vlh}aHv{fTsn51ae=E+ma@H;?Fsv_70py&OmPQ=%0<_F4B{QtF4& z(n)vu-^w15B8IqiyK8JNfESNF4(GZQNSd8d=XuYGGxaEJ%#U=0?z$4>PV(q%D{)MA zS(oi3clsw*$)k`m2n?%ih$~Fq77Uh`jCLMXN|r~xg$dGV*CwRSMuxy@0#RmhyM38o zV+48|*78;zqgqz7doMjBenWC=Lew#}X{r+~7_ne)^~_8@CJaUaU<+&}=aVLO(E!Sg z_XbS@BDhchS8;qp$$kPz&%YW3`ywFVQBq`7z0lqcce&ZA#z}d51+?ZB1fYnR3e&g(sxb;vcS;z~9urW)!FYDve` z&mU9~fDO|akLvX{-+vzsnT1)k^#hY`W7Uk0Y+E7o)=PHhL~z^8ukeG#(`}tEeD2Nf zQ1l%pM0y6PwLsmhXF6wYy-3IAZ<`?k9JAWJUnGI%4_T^-=*uW`et#%oBUSz8VB(0e zGAMax__B4vA)Rq*T%)qW90hE6dQop@mtI}&3+3i1itIb(yPgNl9`Q4O0)M3bAs$BO z{GgD)9zRfa%*i=ZDh#Ic44R=m7GN6Dm~wf}Q2vdhroa%rP!~o%)+1L(!q@Jm>Zpc` z5EYK^sPdd6d3b`THpb-Dag{^q&T3;4^6QsvdgNJ23sG!d4`A&j&9m2KhP;dSkAOT=n0@p94Z7IU}m#EDlG6FK{_?)re76z~#}J673@kd$Snw zt}fX15TbctkN9HSx<~^e=xY%CJl>s8b$s=;q3TUf(Ar?G%L6uDM`d{&DaJis}=XX#8zd4WpEaQ zgA1Bs-nAhe1V$6g2w#Tq;bMUzQGQfmX+Js4O-T(U+U5Qrmq7aVG;NbxcAf(xvZHCe zufy52MRM(e32kxyg*+R>dZ!CxK_SZ}gf+1K77*-a{i8Si+kLrioRG34mqrYpsw07d z_VWd3k8m!gxGxgKiOK*#J?Zd;`6pls0m)(@^`w_1v!>y7NZZmaON@_hACt8?K*Mrt7%e+48)W%;a zbiAiY>5V~IG|c%3p^^fL7YqnwWkTW#%4R_lKO|>CZ9bZm{fK51U~0S%kBTiPN+uJ- zrN;Sg>T83OmycXFac%_Rt=PhVaHUctO*_~v11_~+^SG6A&vJiuzk+-EgKE&x*V4?Y z&nM#5v+Gew3uo;Jaar}4UYCICPyFw~?*^f0aYa>$K?ggyj)CU-q+qNQxwd9-%XdOR zOuh4Jicg}c_r|`e9>`Lz6{{n&U0MRkmiem4L{fyZOWS|eBpPKMg3d3$5nrgrdR~W3 z{j!q!w{_UnFYp_#Lu4p5UlOeBB(VNLj-n_`)vc9=7x!r4sh~d=a9K~a{2dg1aeRMU{*Z$qU`pfbV-(3vivMjQ;o*lF{r=Ra zQi{Ly=${Th?S_5dAnok7x;}}Y8&I?Kj)A3%C#UbUQu&{A#6ycB$0h{ zxHYNE$qxkweyRP|2xZQrbNi51Hy#;?{A$Q12!608%D+AD{EWWHlz%pCrfG4fE4b4= zkiL2l?}ti|%ujr;erfY}zVT>(fS(u2On-+Je}R89Z-KIJj_#eHx)Ig)V>oqdEvzh6 zNr0D<7%p*~321T~`nU<{ZJNCN%(8Y-(>Y&QdXI4}j_Y}Px*x7Bnr{^cIqT#wVBo(* zx^FlrfkHDMP)2f7k(~`d>`-G&R){i2+2Hdh0*D%gx`|(nCV#ADwuY*-%=8vvhLpyD z9+)s9jj8hpv^_r^(Sc$d6YG?J|K557e{yY5>LYu!DQD? zn}zc-VrWgke}b3u!v41KBs|D}9ig=QMI17Mz@WK*w>H-_djjKU`*g~!oub{eB5rh0 zO0V1uS#t=q^qSsaQwg<%mo8i@bek8da^K!CS>E`qe9;*aCX-l|1r;p=k(9cpUO;w; z>kpzMG}`m%tCD~@E5(18VUU44jP+JLlADek1juGh)?D4^nmZ~>synkHM>5|M zfQ&0z`GqlqekVLp1Q+h1_=bCxbgd-;6&nD!0F@D=Ie;x|j>AMU4&`Q`Q((sWwr$(C zcGWq(n`^G3`LOEC$?<8&2s$6h9f)>j)EMmm zyl&gs0#JJz)K?VCb_DIoOo_vfBWo5&M*LtOW{n_gH{=(LBO1(lFp+4T{4O7{-JUHQ;C4v_Ql$WNEye+aj<*&ts_$&ty)>3wT+a{!nnGly9XY6H|YwB$#WBva-T}l65 z|Ib7da>yN_PgVvpk;;YRn|q%>hwdg@%$>joQ8hf&eka@0&NM;3nRge+(gmZd@+?LS z5!2NN0|0RD#RtBm2hilUHmj`p)Yk}5Y4J@=aQxET&WXpit-erAgUq4SyPU3kywvNd z_iP0F^t-16UZSGj!ah#0@+Hm4zR}{vRF7=*Z)3iCGM(>|5$t$~VTcN_e|3$U`GZ3T@eNJj* zoSEMQj5BB%;IE;2zdvBV1Ursh{6`?qq(ACnFxQjIUk3{$Y|Q&&oj6pK@e7`ZwVkVA zO3Ii0P~9F>qK%@<;2J&P(08fsDI#OP2m+4T4X&oVpU6vigTu1-4MFnqtOoNdILXyB zJMtQ@_Dbc~M@D=)Pgl>I8p%2U3pQcw>qQlkQUBOeM~EG zC?J)(R2t7UCdxvtv^Cs}1AX%2rsTb7#YfMq574V)b>m~b7; z$0{L#!X{<;y5Aj5xG1Oa=|cae7R1de8%~Ag7zs>yPVWWpH_i=WCDAG*JA0rfyUYZ! zp?`w`vBfOs?9*{=aq@Kbt7Ots;C~_>koFwxqqkhsdT8Ge6rf3)u0xc0)(C#=q@4vkf_Pk~<_bMXjn>B7%JBl^t^fM6B2 z_|;Hy8dQ=UdJw#F&4(G>!pLBUq`_FimQ+!@4eeU<T z;aGInq7y$wt_na|4UPazsY^lpz&xW^$b^IV$itd3(~=L;!YE z#wJyQs7O|UHli2B5$GI4rCht=UwZ}WiG}LtbDx<#uk2mFulx_gkNleX=km1N_9*{=&W^}ah@LaW+iXYX(5v3gf-^XQb^3Y=X~ z_f*lTmzNlov{J7o;8I1YD73D9+R5F$`B$m0^!xEa8B5^8Roi8a(dq%ycq<( zF393`e~(yLVjb0*{g^psGXi`OE9=Cc3&CaJb4f)r(0Tb6 zWBosfXkgcqkB3`^BkwS*bk3)Mv$;N4Owmj_m({c7`jFHb}}?N!DE5R5$P* zp^?U{K&<($b1TrS%n?-8qT=GbEW>HwRj?>*S9G1!i%ra9cF5P)Tm$oTBaLZ6R=5CW-)sW6sX1fH^xV6YMu2bJ3#oYss>61FwOfvLU z1J+Nr=`tt4=%bcSc6beQDPgUS%Qo3HM0O$a8Y9MNM?e7CpxKnoji~mf#-i~yZ(V2y znNFcwl5;r@&XL|=3%nyws(f_~S4oU%c9t~~sHo1{rbaq{Yl%qE5@Y>rGv5mNe>b1b zfCfLiP>Lq6>wr^44_!uY*<=R)$+*Kr>WCUR5mbkwOO~S*5TFsZwo+6| z**8D;1W^Qr<_U#IZVNTQZabnfXY@+2GWKd5KfZ&m8dQH{Y_yEJB6;8Wo63Tg6h=Ph zGgn`s$!jJFSL=KJ9L(t7sXfJ*Xh0yf1~}`z__GCCeAl+RG*d(z6wZTCJXj*8!m{*Q zzz(Fur`0YlfURgD8p?*;nrU4Iw-G zJS?z)6oVK(j*GN)e+K5!^>%G!tWcdyBv(hI-WI;(-PB&Bqa1ugo~?h`xflYWo2K3=6GG+ zKiChCw|MI}mh7M)8AEh#x@b@v29M(Es2x?U&G+;l=}x;rbIeSllbWaSjx~PG-z^RT|vi}iHTxPL>aLjcd~ntai$gI;B81RtrIwO zfOq*tz(G0h=Pt%4|J0voTwzyaGa0c*S`{PPrqKw-kZdNy^Z_`Y%s{W-YlsvrF^Tcf zlZ!_Bz^Okag{YpjD7GRCs`{2U^J^jE4!K^HwvzkM(6jrG@+QxIva@;>KCc&_{>aaG zb(LKZ2gLWt(yNTTk{4ZaW=cYF%b%g1-{tD|>lwbE;RVTAbud*41|*14lUA`q=2t#$ zr1lbwak1%kK~M^dKhtzAh5U#$h`7Qy;i zkLy`s$AYTEoK6|5TNI1RPQUW zj#q(CPkDfh4-{LR6~|g2{B{NmwxrQfN}v{YZ&K}6{pEfrSQ=H6uBd$l0wBbK6E&I0*dAxAU}SaS)Vr z>jS}l;QJC=?<&4J*F>odWUT6J?MPf(nBdPjg8k4dj2zD0~!b5X1F3v?R%}) zsB*z3oMG{)0Z(y6`*_W-!KueIveJ?ZvIJwraI?^3eB0M(&zSV=Z&05yfGYX;`;>YX zgV$*h{I(}+(xixur`=CJRr+) zI>>g@#@wYy6T+ZGldS20&Nf?Z`udw2i8c)pQp)_pVFBWnyl*qdhEaod|L&EnHLLUa z0O~4mmfm^8N#)<4Zqgu2^GR$oPZ7Oz@J9jRrzgHk?A1xQQzfS;Ifnes!`ULy6yiX% z*hF#$p}F#rUpEY9sD0rU6nD=XAzO>)p*)Zca{K9AykF@3Cz9^m~s{a?f@w+RJ3h_m)7XPg-)e~y(|9b4pCz7<{`DDwta;Jx3vTy-5 zZqz{ctT$htuR+Aw1@PfN+3*D40)P$}9zR~~X^4uZ2>E861tA$PSz&PQrs*hX83z{! zLhC4I?bO_>ipRZkyA@1%2jnh_5H=rF|k3WPWdGaHqc$ z+MEDjQ}LGx(jkVVHYHee$hY4iV6)bHAXBBu-*;#zhN-+PFy;L0Pz7vaB0q#M=q;l} zm~FfuCgHu?=(}RlavGTu$v(PW&dZZdNSU1J3Z%M&=DaDyLj=Tnkh!{ce4}vZOFpEV z4bHyehXyc1s{g=F?_zGW+GFS-k<@{M+)8U>tukJlF{B7+6}kFT5;CL`1Eas(bSytt zqr!e}zeiVXOZ?Sk5H_3e%XbPx=oQs{PIVxDJ~a5qj%|~zdRU?YADKOA#g(_%G8Jgd z;1*pEe|>Ph?O-i>qzgdUBNW-tZN2LFL$Q2}tM{)=ZdtkgFtOf_af$@!ex0j4g*=J6-njlYU~{jFFK%v(q*sGad|^dnEVkr zA7Fv{Bt5w}mVGH47KezB0iEcI0X@PWBUi`32AL*lbl%(NaQvilU#hA)gDm5U?J$mv|(o<$_JkuXwE%rT?OW3LA7Ovh9(~990Fgab?Jzu%+*t9wYw-Z0o3*AiuYy}z)a3TvbJj_?{4V4b>w2fV$r@5kl)$W<#r#`bi)+*c zDb`#AI)NYbr6W<$a%d2XtQ;zLd&>LJZ|i5`Mi~4Bt9M?`Xjwq;t!jf`f_Y(jHHSto z%GM)F>@Q8&THo?~$tKN59d!xHJukVP04Kibd)IxydC?+WVm(FKe>=*bjGLY9@?f=C zv4-?;B*gUJr@+TW6NroS6+;lu5|u;r)Z0Zn>LpDzweqt3=_Ki>F@CK87awf|V2pZ& z_0+bl*v87oGN@c*Vhwl!n`~Et;E{%&HXt*6JjS_RAN>50i+up{VkHt%@F@qyB#@;! zC9nAs#1AKMbea4{=~`j#ATh~VR;N)fQk)6WOm8laY^R{$neDC4I*lK}u0GV?BJMT+|91;`KPOlLxP-e_u5!B=OQ z+IF;zo($8A!-3w{0sC))8HuJIIBkB`RCG72s5y$~f*g`Vs?%tK(=s+8&DStuYz^gpzJfxQ1yM5RjomrihaWb+rop2wu&>-V*lt`x_HZNPg*rL!z)ax>a! z2`N^lI8cUruJdrI6+wod$027pV<*mPPa_b1`u5}Ld(N<0o=fMy#(K%SU|{#PB;0Ov zgwnI30ad7<(?=|R#QSO6gd-w!LH|J%Q*Z3rZ3>b;P7RjFvORYR@26~S9))3o;wDfPgC?Z}_x zlD3@eB}#B(WQ^_S`7xtkJy z6K5D(YgucY;;3acG%bWKeGyM*vzns;D($F%`gY(_8=V`FOw0O@-DfP`fK7`_bi^cz zD}4=Y>cD7)f-&5pmkyGFX27f-yWZ%#_1vmZJ89_GB-@rLqiZa?+*p-S%eo78;`iM{ zjNbZdB!u6UE3X5BD_M4^DsOrR;)qYfO%*^3m*%dLjxy@Ufpgc@=$tcgz}oTBNM< znefiO=d&okaAOGQ9=A5xxjy6S5FSJsNKoUe*v?<8kREMBBRcC4mYeRvkAXgyiEWNf z!WTwAT1nkjbdVRaijyk*0cB}{Za5%*s7LCg?dE7TqnQ3#+WBFqMC8(~f+c@qoN!bW zxE?MmSN@`CY3z1sh&HX>uSj=R@DuXhO#(n}cvYBIn*}uJEzoliq&)wB9#sMw3vn+%#OGeQ2De=YP2!Y8bTkM$?uKa+R7j z@=f>jH3-sxx<~1L4E%9N!O8(5*ye?@5?d`xw_J}$NhHY8=bh6QVFdeBvYg7~E=>?F zPUKXsT>reej5&HMSb{JheZNGp&Vuu+ir(7^ep$w^dWrX{I!u}+ZC!;+e~(XR|C&>g zJy`}?GcG#Ia~_T#-m|D_DjaUz3eQ7oPtu@A;@WC`ZePJ@8kUHuzD76_&_+ zLzJ`%?UP>n>(j%nwB{}i9IqoRu5qc9ZMKu6nE9>f;|slyQt92EWr4ehUQ645eMv2Y z@s{_zbe~TN+cUbz%iyjLbC{s%g@kxn@5TgzW|Fu6cF*Z1H+F|(Z3gHZIQ`(~YhzgI z0++=@S|A)AJ_I*rkAl}C4HzL{9NBc3M@d=VCj1U`O9~q%#r3y3-|-6_EhxUu!+T(& z>nqu50WNqDKr#k+j8d5?$)U-~7;6E3hED>nrUjCD*Ip0QB^5$#T(aK2GuO`0KYu(XugkYGhH0x0e2bnmuRW&vMs#VEuIs8V8Y+ zAwOJ|i2($o&0i)ACO##`6gSD=7I{x(GdBL@n)_GtIi9qsb-G_e)`SLOfQo+xVT`B{ zN5y%yi|#|ob7Qve*Vh~FD>sN@p5LiZc$zz#pFrALan$ms@3LKPT0niK*FQk@DR21s za$)=7K(o?w?%Tcyi|%~L5bAczthA3-g6odBmbJTrgGxdQ^#aj4aOPqQKvgJ{0xY#V z-NH06MMYDFed*jCvI6FBeNJD|u`}*>)1RhGAkMVs_n3E$-8WW_$+3hAyn-TVlj z2OPp0_1^DHRL}5a(AVKO*|!K`6|i)U{_MQuxcUitmJUc zRpf2VHhEK;bF-iVQzqkC)WTv{Q#ESoDA^754p>-`jqE1}GCM7KR1#|(>Xz_zpcm#H z{igT7N2MPuQ0TgsL^1DwG})zPjnQ=RXy{Lix57XKY}2vp${u37nkp%R!`XIM6Gv@o z0%u4+A^Z_j)&*wjE>>wXV6;{$Ay1K6UpkoAhC0&q7nA#X-Nl>LHVIqHwK&^Dp0(M2 z>ZCL+*nw9Q(ZRHYC}M)wNs9aynOz?2xl55<~>6jXui< zRMplvVCC)3aEb9_CoR*=sE!K zL5A%;sY9DL>6Wo6=d<2T@(@3aj~ zv35A?3^e~rd;Bz&HQ)Xckum`5ji{2GWL5%x?e$J|U zn;00|fFzN2dCpU_oyoMB9ibiKgrkea5iDCCL5nP5)(+wH0s@YSpz7b(NPn)L3@f`F z+9-Z3Ma@K{o(2m2*<{spp$pS{JP@np%}wJ2-KQQvUT%JpufAWqy}6A5BQJe+tn8Q* z60U8XKb|pJ=g8e1%5AwzdgBhDBsdjJ@;IM4_9uR9HIHp3?(>D;Q6U)b(SE6wJ0OaR zu9F{gwnRdVhH9@|giWsLdm69wTd(a2LQ^JgS2+xWDhk-+ik}*kq%Z^L{3!)Gl#fE5kNLXOfLr8Be}p?ekj$+J54;I1*wV`8UL zGxx@4d~%0=*zAA^2lHJ5X1PMWlXcx#rKHtpPAP8Yx%{O=RwV(Bdk2qJ;(Mh8<^q@Nh$A>_Cs$wp{82(N6Z! z7g<84dsBSBHYw?Qo7^$@_-C0KTL&xFJS$j#Mb6689Idnfa|Vyv0np;>{z}x<8+UdN z>`V-!?Ru_kJERQ%b)l;nV9Kp_IEx1d1+GN-z2b(EZOS{*u-SM-aXTyew~C-hzH@FJ zTjBh<>GMynBP_UN40v0rJ^6@un%8a7e(}6|vwJ>k*j;OMO4xF|R1?*6zGvL|d#>`RyFcCY3kU8<@!!@l?|5R#~pm^ye*!a*5f!DK0$pEDc z`+OMBfOzpyO=ynN0457i1s4xX?O@f}%}}~Vubz8jTSvGsHv78V-QG#9DF|ExkxM4g znu&ggxcU(Xaet4folnb?JpJ1SFlj|E|G%B}%g|jGfSe(oP}{Pb2I||tICC~Gk>IHC zu+mGu+nt;xu(Fh3RpB%~#Ms-1gHFi^lopIu-wqDauOQMI(@^}2> z)yJ@zW#k{P=T~y{@kTq5n>RB;l6Go%j0759a4w*2L{crUW>0W{np;o&ab}D7PFT3T z{UuD-ey$(le-PUBln|;knpZq&hDHOJ!C60Cx&XfTS! zxGOw>Ut?9QwgC-lJB+JD5u9)$m9@WN3iRgv;J+N*?TrGf=vG!VX=D5pzlx1o_nY4At)v!hT9vDY6Sxtu zOJ$#yWpwegrR>g_MIIx&xJaUOTM44_9pnlSJYi2KQZvK&#(mfyP-{SmrZ)3e{fVf&`xzVS1=8eKM_( zb4L!^^j51jFR0-zzf`NmRFaFT^1OiRBvq=Z8Ov)wU4Kj zpOT9+@4cO84*+LjgwBK9ac7=&x8Dizy7CQ(P!}Z~+IcKafmP=K#d;zq)*L)tolhhK zcBM@rMjF>!JhJ)&SOn9%Q6@WD44xcccTp{Qd4q6sNUxo(u7_E?(F%db%4FbsI8KKy z6@RL9R0w~&DgrMET2AgVgOHGEq%{-_rHHlqPRbj9hcA{}+4&2R^|q6=Mg=@Jd!m z1f-sSbNk+)FL&i?m$BC@&3#hIPJV|(<}g=mbHwnmp+FoIlhfT+lUQqRsrJB_{g1Ui z{m38@fikL2=b|&CXqvLGw%%Z(=dBj!ryPzxiDhDX>>koe-=_p$7D(1BU$b?i3flnzQP^ zlKHF2ptSHKE7L#d8=eciS0g#)s(6G!BE_EuLb=vd0G+o(moue9JL^KtVqT$pHBX=O ztDhSg#~qk(_BfVppW@w)-IYKguH-_KM$!GK&N1Q5yKN??UbY`TLdFBy`uQ`#zxLc9 zP$j8E!bM1R-f<%PdQIa0<2Vh6uC0O4nFGL$2;rgo=vS6!K^``WoXvi?#V~Rc{RHY^ z#WSvi`wY)NbFLrSK9f)F7|6(S1dt#{xoU)$CN%jDm!0W1LpMcf$@0IZU#^&Mr)%39wCpMBos}6J_JhbB z-XGa>MAZlPGC0JVhsY@W7jor*HWy-y7ejA{P4@z& zl8#<~Md)SnKrAl>ojBxESKE{vP{rX5nkV-*H<~ycLFtem&WbD9jPd6$<{j}Kzo`SG zpWF0yV-EdMT@oM(eGk`_fy)`?=68@Zz?obhMVcs_$*hc*BbUgUyVOwl!taMTzCNU_ z{Ue1{K*x_kQ95%BLXQTIfV4G;=lOAtv8(2-gxZT=owDi~?hy%dJkp+=Nr17eUD&c9 zc`8h%Q<)n7;BAMAxDC|L$*AYM_~LzO6%ZQ?VH<{WUYRinsU(xdMtJSUy#P`$&pOq` zFuxPfdG!4FRV1b`R3#{TELw_W0nHM~xfR}=%duEMDX=F_u22j5u$ z*+s(`andf5`Ia@zbus@kMlvfH~eVFJr^O2$6y@r4Oo60FrGas2hFV z^v?y3G56f7&&lr-al5ZWevw0b8K|~`q{^A;C*lC@LgOXlO|e#XXt18Mm3*u)1oX>;NvQJ74$2ybla$!0>=$L;5w zteLw2>wf3M-jxsC899AsJ5AD4LXU`~(bhMwLqR?diQfyywC;zPTxjSFh&tK~*z~M{ zM$q%wMlfWv5O)k;{J0$%CrS!}V>ZAa;C|SRNqncg*~45PkssaaT@I}>-Aq#xN`#EQ zLJmF)qV|g*ncNU_CS0KA2)*w@cemJg10a03N#X3KXx6WujP7wCg%qNBmW980o?PeR z&&*94MjQUw;5TlS?R@C5pBrm~uv^(e``zo^HORkH_nZI7HWbpn^1v|9ce52K^TEB4 zBZ8`r8m6*yZ{EB|8& z@T<$OV$t05d*KJl)etQk@y?mkfO>%E@jA*73EC=Zottk46CB7b^=8i~E|l;ySmqZ=Ja&y)8J zN3E+k=hi!G3ok%4+z1gj!Qw1E-#eLi8a{-0($Rm1Z%>Bac#!urilm? z_P67ev243bw^z!#Y|IgMUDOH}gBMF*aSA4-X-ZBpp$CM2lGsSz-70x<`j>)ppi){g zB24fx^xP@k6t6YP*#uW*Tq_zU6V2-ct09Ktx{DYil(eneL-Bfnde2z4J`g@(w#jDb zm|o!~w^SW`HULF!oLZ~eJP;tbs9OtTN6}#j=t|CGqjr6H@JG0y;`aS5B3uqzQ=0!d zT?FyO^T$Kf7wX|BH(1Bp@?FJmz5!)AD>u`92X&Qq+Y77=1&8pS$N&{yMZ4gPN;w{+ z($OD;&Q1?{G_@b~J+g?Q&{w_=OKcZDn|1fA?Ic4?n(ke3pjdy<`H$AEfmHUHk87w@buYN=R6 zOB8*VnNA*QHeP32*wQD{OYE1>nb!&iGElsR94=T_-%R3JfT2{-FOZhuZ^1qPBiVo6 z;!g2Fwvn2&j104?i;9Nw@97r-;fSOx-Zf@e!*jF@o2N436L4tD( z36S{De0!uF2Ef+`l1~Q0Knopw=~AkOGEbUicDJeqw9eD1O~5DQa+Lf$VKgn(S%8-0 z&!)s}J^tq91VHGqxD1x9;Sz`8aHz1UQw~-k2-~@dw<LZ%f%4f@)W8Q1pxMab0YXn|D-7}RTaye00w+pXRQVzF#{Hhm zvhRTym`>4D1r0y-WC-Hxy>~S=*_-}CX+IYd0K4nsG6QKmj8O@M1tIc?nJ4XyWfL^` z0L-Lwnr4yqT`zWh5Vj{=O)Hwb*K!H+7wt?iHBQ&A?GVIzgn90$CxEH!C@X-={#o6( zFlMENZbaNW5SBQ~oekc~EQqVNFomJg^0WVad{HFbP8cb~Q9pM{WEH7WRB0^keE+n? zqAApsm|5CTMM(gRC>&MzVCzbDn#&Gy^6gY^4uJqdQN5l|KBbZb=clV&G=Uhjnl+uu;H+~QAh1X)|t&ezI+B*30m(@gMbY) z>im}s1hDOwLeTDl%$wsrvU|48Wv0q2dSiReUvZZV-D6|+iQ4VbZWhw&^d!9J3g#Ul z+;&`vvUa|arD8=_G5l7Sof4${JfFcm=Bbq88cP4!xugWIs)$qXlb1Gl2M3zyUUhOK z_MP=Sr4CSu4IhDlXUow#SE!CV#Bp(pB9RQCTE2gO5UL5+SMxdyrfUzk;z33}J*~Wk zc%JFX4^vh!n0$V2a0a3G_))PV(p?jT0j-uMu;M4lC>;^zh%80=&)L zR>QJL9>?FkH_#c5?2U5dl}}9C)yo`A8O z6_+H=NgY*HbknkOw6CJRoyjPcA<-B^8ukYYv%%QpRAJ6xh7&d!_dt2x1EGcKIubTq zeg%mqm~U7`qV1cf_8Kt*W%=)PRPCBqD-)Bii3p%0^w+G(Zq#+P4*zXHkxN< zkZOoYi;I{PmYw^VITcz!N;$QjC3xd)Q0#6WBRwQ5I!_w;V#dnM>v0%8x8JVx62I3& z9;^|m=G`fyQL({10Vrc+)?G=FPXj`d9#c5a*89udilB!BPznOt{Zb4b4|YW8S!7!m zE-$uJM_xbad^mA;5q)zQ02pB9kId?svY)@5dvcS-a~!Y^vX!?X;q)R^`Bb>!lUw@p z&r9V1z*y+#AG(S-D?;%23BUNx$f^BWmGJYIH`y1UiHJeeHDCGFC-n+4nS8!wz9M`~ zbXO_5Re?Tfj@lH}O(a#DR+3seqzIgb%eu+o#*z0Y*Y+i#NI)#*%9*lsltGoRxopaY zv)aHkY1?5-aAOCIT)F~pqyFmxRjeT9i*WUTGQvz;(7Y?7!yJ~x?j$O!CY8Wk!jZPQ^!uwBZq8q2Ca#|Nwsrjx0S^cjtx2+~7izA8~c%hT_ zw5t5)6V5lqOc#IaZ+H1jfyprW0+dvPa2D z?#lG62(5VPW(8>MMUs|Y_+s9z(GT)Wus?!(Zxu8bYBa#TBFt{7;2qqJc!tG$I|y0E zyODri1{#%kIjo;-8zzz-G9&UW~u*(oPh&BG_)3k_mYTz z#?{IcIxAoR;oK7b%vnS#WT?0ibDv&^I{Y-5)&R=6@$puzU%cJ?DT)E8bT)ENY6?7p z%{jw*cN`!9hDZU%j7^=k@z4rs@Manpk&FN$^F-=Y22h zGfZGXtgx}WL%zbJuo8d-uWO4^CbX>LOSAN7lz*`Byew2wH&_CG!-lhYY3yZ=4^ZY3 zWb68h&~}dSi0V{B@M_1a%8T7vloGYpdXZ5k`7~q?eQed)MI@R>S#6bzLFQ)-?NrZp zmCI|S{*E%DQKb;FVh#!12y`Eh3HuJ5H)82~65T(sGL!Vm`ay&G9xNnxkxNs@kjqDo z4Rc5MyV@f$(bpd+_L&BCfD;+cQLly7=7B~#8)Lkg<)m8a0wENc-XI7!fr~9OH}AO6 ze*UMNdl5w;@DJ)jc5SMQao4g&jK=bBh==)A{Z#st6hSs{2seJDtpnP(s%g>QVF7m- z+l}n7kx6JL^5yFS?1c0uNEJ!Pgki3_1E?V0n(m9V%0Y^qk16@gVh0Z#A*iYD^RIFT zWDXM|*YmJmde8I3z2VD?7Pu!KbFVn0KUv+7Y*tNWgV_M_CcZJ%zw0OX&eJI`kXS40 z&8~;pa_y}$A*AVT^Y0>P1&y{?T2tEHTu;trNYuPpy{v${d@q(gdM*px{0mhu1viP? zsH%<^2LK^Y%ne$8MPNJ_)cMHYxfJ%ZsA**&L^5WHQR%nGT8xeKD&U5HH1W`DAw{zlw;R8>0DNdgYDvi8+|@00!omoD|Bm!CF;}Z&fWxo9v7e#L&X~v;rpO#X3vPDf6`OK zSqfuTLvVwfb0%B8!Vo@7v@!{X0Q6-V3VPgz?H%y&aMH?0l(dD^Q(p?Ow#dO{vd>TM zVWZCM(tGa!Q?yE!Q|%$Gb!#~eR=RJAGc9NukB4;^M76&QdB-f0i`FY?VHRle{dYwT zDZk{eKjSYkow|SjzHS~&_t!69yDTP%J4R*an_ln$>-3KY?TZ_)9oe^$fI>jMq!QPz zY+2}%a)MJr**M56eqU0YpmzIu4;&ZjfE~41NLn6n7uTB`02byc4r|==+vws&*+Y{{ z_krPBp0OJ@;)t)j_o`guer1)m{J@52K7c&KS-6Sm>2BjMl?l2i}8^_}y=k69T2jE2Tf4k4tb#H=brH@zPv10VGl7mB^A1GZLE^+jW?pkk?88yyLwaM?1;`an z6HA0e1v8dK{|&JV8AcMVe*qyR`MIa0{jn=q)5NrBGpn7y3J_GRJTM?6u+M|+)bS@j z7CFr3C-x7aZGSeHM_$RgL{vK(PR(#%^V1%o;;^|F7Mh@bod2zi@7%LMDYG}CPjg@$ zcZx@37iDTu%gI_zC&4@0_W@O zi{{lnoQm5lBKXH>)`|}m1w4Vl8Bn8J=*XY{9JF3N3LKx6LgIf@Zd3822 zX7pTk+-R^<*~YG1?A5RI_ec}hKS_)a2#&Iok2gSo+T_1tV(*Z%dqwggx7-5n;PFpCD- zl7Sv?!tj?zQ%?(EgQd?5Wz;%Dj~U>8p;j*}AZ|XK%&KpHJw&+|ZFQzcz}^0`FUOx{ z!OxTJl)-egCwo^ash1>ZG~{vLiDk)a&q3#9+c|3yAtE>-JavQ%Q3z)m3`pHtoUefS zQHBBTA+d(g5mi)hQ`P!`;3rm|av z@K!y-i!6UqE$C>`FWic3=VJh6bt#QwwC-f4vF?f-m><`Fu|!SzyE`l9703Q1EjOOW zW;>Vi7&%qvYWsr69fK;Chc6O8Rr7xb;(#NyQiNdj2#1W$s$ZAQmT^C)VnK&|${ERl zUVq}(V>N*Gx~WOba=idtz2>?g9grCWR>G8deZ4hVPLwhg2G{}e8akgy>EVfAtDS1X z=Aj#{M&c+(4lcQGJr-H-_Kf?)Zz}~_&YnOosFwHLM@gX(&r&5w=czEQ^dl~&&{9Y4 zP&p#b%IkjZLi`>IB3mfcsFJ$0A-L|D0nEM-U^q|u!zQ6R{p5>#B^2%mnW@vP=oNor0Ey)IV7IAc9W5=S7(0>X`sofB<7bIs1KBjTCA(z=5IfC5L_xYA6L|(qI@jnYa)n< z9`T01@K?q?wUtFq;dZ|DId}K_u!$=(92%gJ0iy-7Pzzi_No1F}S&HANYWDAtDOhP3kJ{A>SXmt}!Ys;VGOUM!a#JEK_?()IW2x!JJ%6nv!cQ@mF;@X|dQtw7;a!U4tSlO(e zrA^sAM3Pj%w9zJ!`dKQl+S=+Y>GCz{^PABMpQ*GXLvizj#Q!!lB#cw~&ibGD5|m1f zF|e_*rw#wjWUzH`Vmlfpj>LonZ9L)udHfA8x1P`=(%AiGHr;r;l2;@(DhsS zcKKwercjLWVZPPTGM)uFQb{B?jpBzhr>vRxqDVa)wm;z!y6m(hClAJ_WecwA1#wc? zvzF;pGhfRaD&Pu}$u+>v~I%{>8TL_nr?{QwORHVTZ(X++M}(BO)Y6W*&2( zWLu;hNTdrXyqp2xs8t+8E*(dE5j66a;OE6LiCYksM@<6=xP-%JTC~mY>vgu~{0*IE zyCgR5k*f%pp?7xl0;Iqi$QhXQft<#Qa07i9a|n7NSLN*=ST+TMKn3*2&{BV`s!C?Ix?@p1a3T*A$&$3zA2;)V#2Yl>Q|Ua;>M6aPAd+uyncVn-5W2_e76DNj;Z%Y{ z!jB#4PmIJq-cFN!h6-HvRDk`Qm#vaW2JTOCY}em;bklyfDY2Hx>m!m<$p3)=i(bRJ zaqE^QR`X7l$GbldP`1S1?3+JTOn+qnTcwuxnn8$}wM>eg;eL}<)N_d8;y+4zXn(T; zPa(mh(>Scj38^NBg7F5q0%bv?zVaWrb47~Ve8jx3rI zP>D@m+?WLt=-_hoWLxN17;cj~VWE9z0}G zR2MIHh@O?leIVsMUAdAQYUdEHO|9jy2BvfaQ{=yRaN+qSjjULUwIQ?tC~E(hDI_k` zQ+#9k4ehv%IaOx?@DX9wce@)^N>(BADs9vTRg7mNw-2Ow7YO1-;=l2_jKmF$hZP6a zIoYDt?$82@adXGL$>LX@Pvm49)0l`Za%#SHAb9sg^QjBHQB93Bq5oYfJvbJwbY8wE z!8e?zZ!HurU?0HibGWupQNzC=?|+mBseES*kP39Q5PiJkT&(dt^kef{sm#UL0;#l*G@ZNo}6} z?hQN0zq`| z5i6hhST(zRw6ZgvWdczW^IJbG{C_da{6MMZN4#RSE~aGw6xY}uuC#s?+$qDK_I*)J z%5v(>b6e2cOCPY}+0ONsak+pJ?G}h~S@Y4|(*Jv#ZO7U>0*)(GKj4hYyv!SfB+TYb z2e&!Ula&1OQvPzWBhuGXx8-b`J7gK9(&F8QGrXYZi^cPUnN^t69GGDfc~_8g>D^#^ zb+>%pLch*%rguAKLYevzsf?rHrqd2B5zf;=1#U?Jf>o|||3{Zc2I-ooOcbPZ)+IlhwL7heK<-YpvmIqmUad=zPfZI&V%8J4kn6ajNJZjZl@^N zAYNYW4hks}zeu_Thw!(U&We&>Ar&#`3tqhoH|~aoI4b3z+va#$^68)>D4hOGv#|iO zZ~2__a*F>lxZOEZde!_~@pu#gg3x#Qh=310n#nTB22FJwaf>oauKD}vLK#F$sl@Gq zbI(wvq2Z?}NIGY#|44YAyHvN(c^mO+7?}_RB5FKFEHlTh*@PtH*`vZ&AI&9JT?9#L zI%OfS#xXu?<^xmz17%u2Ssp-Oj$=IqD4b3g(XKzLOe*w=@ShEFEZU^_9)Zp&l_}@r zr0`+$jnGih4iC-oupzcjU_iuQP0`hzp}DM%jZ0g2Ibn5FT^cwJp7hN6$(R$D7ct+p z?G#g_5vc)NmA0gyDATg$7+4u5%L~_}9Opxk9N?SfIAls_ z9JP)2=ewK}ZnliaaLQd3*5bUrUt^nsVTcJ;FT_(65fKv7C^1cv0;R)05d8O#IpV=; zJf|yZ@~>47)}?(Eh{`P(Dp4 zpR7f!NMCGvpxiOThpLHNT_X^~qhl8gL&t7#>6Y zFsd0_1C5p+I(&yuM)k?e9@4bUE5&c>v3&|S#+DsB`C=C^sWbGC(g&h#YjP9x?6osD=|&#ism`=}x} zMS;cTQjy~B4Y#+tO!*59w{#ndfb)iokS3&840$lfmulZ;Cx*nOcnByo0?$cPi(tPy zWOv*^+!|`N3%Q8T{6QkT(r#|+o@T9k;o`YzvZC?JjkIcB30C}C00>ws*SYc zjq2+gEg6gq)F?%mASvGY4e=Fq4>&u*>=D>sT2FRt)==!z3XUMkYK(Bzyh)nk!&K2&r%*k6)CVE-Nx$dti*7MR4Yv2?`_+mAZ-70n&q#3-mp;k-@Okfbu7e~{u~MUudnG>HigyzQ@@m(P#4d9)L%C+9%Az%s!Z9Y z^&vzAq_CF@2qAk9{_=f|&lWuM=qxo{B@5t=JO?{_G8`izvCL%vcYgJhV$X5qfjL5* zPrkKfEKSdRd^!PB18@RpDK`-Uwh2z|>aKzZFL8GglJu5Z$4(V%PDa5TZ!1cuY;ICm zsv=52j8Y^ozXTrqzLefniIpj0 zC;9P%>g4@@1$iW_^Yh_PQ8B5hDMG!7_87q4E9xk}F!V;xoM3N@;t%KlSbmNilh$L9 zhPTX9x+~0i``6$`iO;e_3YhA!2hxM`Wnkz&ugg$nT;5z`77;dw;kD-5c;$^e{!Fdf z$#Bh@|0iLn<&rp<8Go@g|D-r*L&~pcI)KrTqG6^u&uIfG+M<6IQG@2p?dynqI&W+JmCBwC|{W|1%53Pu}-5EjP{)%;FK<{>k~yEp3P~zg1<-1?grhAqc_1#Lge>9VODj5X2fy)Sm=R zs^$1oh^^ao1Y!Py4O?LiPU%dKcVHMQ+=HR@kZnhf4=Jhg3;r8xT%f5h=_a<+!bh5- zKB;fBAmzjmZHiaT?-hX{IUZuXaOdg!3wF#O#NmQhf(`b9>o(eRC2S{C2|YerUB6D| zY9^{H)x`l1(FlqyJN)TqMR1QdJA;G4Hlkf5{h>oa980}(qUczy9`Jf<2D*OgiiuKe zbD=J|W!F!D9+UL(5Ed~BXqyk71-<9<3`>Cl%dZA|`7ySMPSGpTP!7YjF|KK&wSrWy zn0_ydu|`Acz&FtGpH;#Zlht^Vs}Tb7inW5|^T}|Fo`Z9_%Gouy1VTe6Q?VR!$laWI zGNmq!u3!L1(#~+_Ei`TI6zep)+TswEt1O#Y+-;bu;_!;axChyQ( zHL<6J_Qqnb?bWuYMow0TBsZT$;uI6Ma~pb%zio z>xeGZ^cR@K(Ku&8!lHQ_JmgIZvIB{0)sie8fWX_2pF|P+*0o-Eb!ziHv3fAJx3}}% zYh6p*?~$B0iat$hUF)hCGtP0Y7H<2-aVa-b081la>|y7x$p!R~B%%KfghG1zMm`Eg z-SZN|oneM&UlD9s_iyx&!Q_Nu;wLjho^MBWJJ0M~?^Cu!z|*%#F&7&$FC9^ToNL0Y zCJWN?7e8C1w!46T# z((o~lW}LnOS?ujJYUGIV^Qd&Wz)^kco$^aYvqO^Yv7O1b*zmWp^0MZ@KwL``fI`Rf z1EiBYP=?+P?+5S7xY%WIHu5$_+ws=f%o=Ube1aG<(oLdBSvuVDMN!ZHkqlC)=c16~ zgj~7WaNI#EDeWo5q|X(Ysj=FBs-&4vk5mLb9k43+Mxvu&FnjzEy=;JgblSAa!`N*; zqBHAG>&?%3ILDbb;vPwMk#VfN0z$yF-1HZ6K1!Q^(KNK!G=ZyD;Y1c1tMU!I@bzgM zxAv#Rf~bkW6x>I|kZ+%c0rFuwN+GTyQ z3=x3zpY?s)Zy}1s27qFBD`j&@Z7R%>O2ymd%iOVOEXE%wTWQ5m{k$49x*n8X1nv!; znNESU?1_w@*3-bNF8hj1KG;luL9B++q?djZu1Qyq$;aO=6KnS2V1;RmtZSNLaJ?4I z|8k~}y7Z#FTjJPVwHASb_EN@3I5KJckfoU}uzzB9glca&$v557=a`Uz2u*C)?s+SX zuE7IZT6jf6dK(2inj(mo3tio1Ko!Y11w=oN_;`v)w3rFfVIPNSF1r^ny#p1y29}V? zw@St!g9vvY*2b_5Z~TBL+&)AyQget0$8wQw%lH@pt!E7YbPTl8B@oL_O-z)MDD-x0 z+7Kef7wVa7ClyWu&p(1ohw9G1oOT6=oDZKh>v3LTD;HSoy5BU=VMa;hzinlCknxg# z6yGju-(T;&l8-?ROo_O=(iw6c@cWAhS>`i&Ft+?dsz1E*B8P z7wS2ctBv*3&;42xn^CL6-9F5qEivz|Sb`c?6N=oi(A)grSLG@MS9-r5bevun$$>T| zv_)YqH?(NmCqeCZ zD>}{J208BaUhGfJRcn|AO|d#oFa~leUgV%tpQC4UxZD5?{LGPV z69ArYo*&1Ndupp;Oj~IacX@Zah#)n&kMCQYJj-w7-0J?=pc<(mYs}~u?RiwBs028> zrPW2&vmYyEGSQnHIYmd z7T6Pzv+b5j3^hQoZjfJ?V&N2&OKLZ>TehFZKN~}F3i~Hq*ZY~jw=c6(PKy>9w(;$I zdGum4%F1ATP&9sG2F6(jw5283>(*~gTd80Iwkct3^YCtFM}>?$;)ik2Z&d1hue*{X zK@)CC%R2?Px7KfKH3&^N=IAdNTSul zc{lMYrkoSo2&&0g>SWLaSAITElxfqFa0aj!YcjC9zjo)+mM70hwT@q5saYsa?nbNj zberQuRWmY=#q@PE2rYJ~aMG=4253?@MFN!!E&nt=tF z<7QO^q(+#BLF(eQK4ak`&c}HLP3LZq`!$|+1{Fj1I;4`d=JFCs(8I!~FsJcg7S$mJ zu?0;G=M;+Rk?fQs!a3DKZuz}!xsH!q$z09ga}rhJsEV{@SFgtPjTl&t43{hT>FC{( zUU%2vI%Xcq+Kd6c(hV7f-&1z6K4lcsk#7+$*f!ucR{)wLQ#Zfj4KcOm_AGJx{og`G z+$$c?ozVWcstSis_jL}AdehxtdESA9Pp z79;>qnRz4N5%wJn$1`eGnF$a#9gWi(uB+cPUx$1RuBe?v?>y$>Ov+7A^+^Mu6V5 zWcOUVf?g7NJktI7DE`3Gi=M&Pv~K( zx2TSgJ|es33aY=VB`l!_*`U!~b{iX45vzXch+?vARaWR)yLv!A`?k4qOyus^fKjd4 zpva0?Qr|3t9Ym~gx>wTo3)SJ7oM+7?vB=w?dq%T@56$v7V6ijy+nfb?>lyJ}e=oe< z_LPLWt4q9gDN=MjkzTAoXaal|*@o^!z}qqqj2lmK$GDbKLa=RYo?b{%163hW9`~f zJSj@Dw$`61Lx1281AoWytb!*u^$V3;GMX&iBFF}o9RUbB`JCiCj&&-QKB9=3s zvMu8{fkkHf9vQGSACT?M{Ua;YdlqI_;IoFF?@^XW4)V6QX^a~<^;3!^S?5*}4^0~0 zpR@#`0V5U&TSF#g)G>Eb$Mhq*WFuz%#SU3P^{uB>=2g)Ia> z5F98Pp*s)pzkxt(H8hmhQ%l^-p6j2m#eKuLQ6q%?CU*g`DBA^tlZht#&vN&7dG6A` z+{o2jNdJd6c1H~j_n3na^%^xt?j>ek^r&r->!%5cB_DQ^T5(p+T%Y&Aqq|0GCv!Py zvY}OgPzUlXuIi)}YT6uB+;mtJRhkYiU++)?cV((8$8*Zt?rYk$iA9^oJLq9v{1Qmi zc(&Ar`Z#SbHE`*URl;?0DLf$28Od$>z|wAtY!7~ZOtkGu6Hnt_2_UniaM$&-eV9!6 zBkdXzLdsXRzr@G8=;GU4`FV$B!$;f`H-1s3sMRKF!;^f`&o$`sFd-l%JZzFSN5bAvbwLG6(Zu^VAVHZwmk66PKLwCOGq)2xE27Z z&EHUVZtps{Ip*zfR}B4FLDdKqUAyx0C%^;?GOA@UFJ@ngJN~4Qvv$MQ@j!BVv99T?K$-^r=>+r`rgF+>Vsu2sr%O44_8I4m)N36hw7UtMx2x#P zE*q~NiU@a>mzoN{kk-3C{Yu$U{ny;zdO{Lnr-}q+2H(Z@jRcM7?A4b-~{-Qw2IN=sED?%L2N-nVSx*Qjq{s)rQ5OI*i6B8KQ*MNZ-c;MmhR zaSR3d!em6VLS=`KFuGGSM~zT)NmH0}RApe%@rARR6^NtJ=aDj7yYBHBEXk#vO-J`3 zLF*R|)^SKR2vVadSa9!Dw;;hfFj(8rZ8a5ri|+?P0ib5!MG#t zX5hy4i&HU`lQ7Hb@=W7OI@?GLeS9`*Avjlg_JvN{2qWNVIRR3SdHe<~#7kNkLNl&V z871%Knlk%|t8r%GarZzZFk4ntkY-D@1`PD{w|8cl8*;saUS=hRNIJh~jQBAJ=W7EnV@9esdu!GC)O7`j$V zMxg$JlwnH!gcY9u9lwP{J}-W^!$oEHEN7cp0RK^uhN= z9_3)T3$4KS?0ZN~LTudFkHf1OSVB(gQ9=B1-^kLx*pKX8XoB2)%~}x8_seF|8PJ;$ z-1+)yhlEQqV$(zypydxgK%NWGdkb(E@9cB=sIIpdFs}|78B_E8}grl!AcKTrmuI8$;zwQjLm92!ogtz}6ahw9Ml4mV^Zr%dY(gv4^&&DMR+L!~w9R3Ti8 zCPi}c^`yEq*`of?fqAPAo6n4wBa@`-;IBLA#dmZm+jQyx0;~>7=CQYsU%8DC402r6 zaN%zW)gdY`*^AzK442U`^mdBu$1D*oK)G&2M0gs(r~IJMB_}_}Gr=jz*P+Tt1T_Hd zQQ^BKs|QKoVkNz=>q>kws4#m6Gx~G_L8#n=y1`EDUIm7~8b^7N6BoVuVyc8UuNyex zb<#~Z*ml2}g(d={zD$j-j7e%ym{YBcYqxH9?kJl@Lx!AkB7}SAx8SJ$6bYV{2!dcl zS*b~Oz}7P!kFC;oDoL&OWt}QH?)Fs)jv3tNHfY}ckhJGIjnKf(99+&TMmCx_c`m!X zZ6FaEp~Cepd^9s;ChTT|w9ZPu{<7vs!0K7T)*{b^p+)sgD1qj->TzUFyS6Y~+&;w! z!#OUtPp>@FGpQL`q-%VPAd;ejA>>&G-Q~Q?Y#_@9d}6LB$AgHF1B`LJQG?#0GM+4H zdsP(UhdXiw!~W&XL=o$-+DaXk1_iDj6tmHqL1oTj#!d$?Qe?G7Uw})aQ$0mEucF8w zVN~Xtd2WawfwNvkgLV#6TMr$w9mHp}?-vaubptQAeWWwUIqhIzG9bDojTJV~z6_I) z#S?*pjVNX(g;vYct=%~-H(>}RYz@|r*P~$F+TJz}?Mx}Mo8xwM=f&VQ(SLc31Oyn(PAw1Dha8ga~bq<@>^Ya9w1ubl!ZGXi5jEEuOpn0jjKL{|26 z@bmY!1*l)7d&=Y>kEEw2Y7*hR|tJtlzBJJPhSDWWC z+ZDQ}(2AR_ok`v}S+BQpNK|MtUQ>f}0@aF`7mc-B7WtK9Z5Iqc6Xw}@eVVBWDH4T^ zA{4Nq;sduv@`P7f^}$|ynFe=Mw+tH8|3&b=?-vmQAN{sDZNU9CxaK9q12;G;5+q9pW^k#S5E52o(I?+LyOvA~EaAJ#$kNBU#G$zTfv5apJq62G|0n$@~{3ed&g4W<`<#{YYe@O6M8)2_F2 zGE^}-2DNQHiV_k3W!3ln41eZxOqkwtu%6HSinX2L&>|2q9$$`XMGq$e^-^wlo?V7cw}vjNlA$n{-gZ2`NjF=pHa#UDv)7-b(5Z#TU)V4wP>3kVmEoK>>Tr5J%0B1DkFb8Y-}!8 zQ;h2eAtJlOonIOB$j3*Uh13w9HBVAqY@CqE4sOJB;19aZ&-*{(n-{0oe&P&<4@oyD zk{#kjx`$9I3aFi;R(8bm4q_|p?05otS^H3^T%yCuqFEHWdtSkBZAp-dSz{;tRI8W)F?xm$02S4#D=M+-sX8A?In ztcHK7(jI}zQE()dRLtqcvYPkZw85cAHHZjsQlUwQ**xnm+Es&6? zs0J82A@UWS1r0C#I>P4Ca@agrchBJ|Tkjs6GcSQ~s%5|=o-6`Mm z%4vi*s5eB?O3|@#6WD9zd`U z?YM^D@d!l}FWG{E^`p&^ZBK+`T7IQ-a(4n3^O?Yv1AMq~wM_g&7h=1wp;e4OG9{1+*7zK&1y%-AP!>&q&BW2v9jxnKJ-c9;*uu~ve96`rLc z;Sf6hbjnl2fAh$bKdUs!{|GChX~)o7ha!z8q2@4JEe#2}X!71^ne5%RZIbWA#N*ou zu(-s+spX3}HefxkUEDI~DqlQamlkV6wcR1HV2#M^_crZpgrPSQ%g7Yac^N)!09NbC zq))@+-j|10!y*VZ)r+a117HK?j^yKd#=0VORg5L?&nh4=~kh5JH>`|S1h>$`#!r-I9Yb6wD-i3aXCbtt3B z4+UCyQUZ_JASFeRpfTT+yMjIXYVu8UEG@JF;_77MD_0N97`|fUA84&${cZpPdw