From b29a52db1a954249cae052ff80c1df6cf3d56f80 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 09:37:01 +0100 Subject: [PATCH 01/93] Initial add vom type __zypper_repo --- .../type/__zypper_repo/explorer/all_repo_ids | 3 + .../__zypper_repo/explorer/enabled_repo_ids | 3 + .../conf/type/__zypper_repo/explorer/repo_id | 8 ++ cdist/conf/type/__zypper_repo/gencode-remote | 94 +++++++++++++++++++ cdist/conf/type/__zypper_repo/man.text | 68 ++++++++++++++ .../__zypper_repo/parameter/default/state | 1 + .../type/__zypper_repo/parameter/optional | 4 + docs/man/man7/.directory | 4 + 8 files changed, 185 insertions(+) create mode 100644 cdist/conf/type/__zypper_repo/explorer/all_repo_ids create mode 100644 cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids create mode 100644 cdist/conf/type/__zypper_repo/explorer/repo_id create mode 100644 cdist/conf/type/__zypper_repo/gencode-remote create mode 100644 cdist/conf/type/__zypper_repo/man.text create mode 100644 cdist/conf/type/__zypper_repo/parameter/default/state create mode 100644 cdist/conf/type/__zypper_repo/parameter/optional create mode 100644 docs/man/man7/.directory diff --git a/cdist/conf/type/__zypper_repo/explorer/all_repo_ids b/cdist/conf/type/__zypper_repo/explorer/all_repo_ids new file mode 100644 index 00000000..e1772956 --- /dev/null +++ b/cdist/conf/type/__zypper_repo/explorer/all_repo_ids @@ -0,0 +1,3 @@ +#!/bin/sh +# +echo $(zypper lr -u | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids b/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids new file mode 100644 index 00000000..6ece6e05 --- /dev/null +++ b/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids @@ -0,0 +1,3 @@ +#!/bin/sh +# +echo $(zypper lr -E | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_repo/explorer/repo_id b/cdist/conf/type/__zypper_repo/explorer/repo_id new file mode 100644 index 00000000..aa1e5f99 --- /dev/null +++ b/cdist/conf/type/__zypper_repo/explorer/repo_id @@ -0,0 +1,8 @@ +#!/bin/sh +# +if [ -f "$__object/parameter/repo_uri" ]; then + uri="$(cat "$__object/parameter/repo_uri")" +else + uri="/$__object_id" +fi +echo $(zypper lr -u | grep -E "\<$uri\>" | cut -d'|' -f 1 | grep -E '^[0-9]' ) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote new file mode 100644 index 00000000..b56518c9 --- /dev/null +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -0,0 +1,94 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage repo services with Zypper (mostly suse) +# + +# Debug +#exec >&2 +#set -x + +zypper_def_opts=" -q " + +if [ -f "$__object/parameter/repo_desc" ]; then + desc="$(cat "$__object/parameter/repo_desc")" +else + desc="$__object_id" +fi + +if [ -f "$__object/parameter/repo_uri" ]; then + uri="$(cat "$__object/parameter/repo_uri")" +else + uri="$__object_id" +fi + +if [ -f "$__object/parameter/repo_id" ]; then + id="$(cat "$__object/parameter/repo_id")" +else + id="$__object_id" +fi + +if [ -f "$__object/parameter/state" ]; then + state="$(cat "$__object/parameter/state")" +else + state="present" +fi + +all_repo_ids="$(cat "$__object/explorer/all_repo_ids")" +enabled_repo_ids="$(cat "$__object/explorer/enabled_repo_ids")" +repo_id="$(cat "$__object/explorer/repo_id")" + +act_id="" +if grep -q $id $__object/explorer/all_repo_ids; then + act_id="$id" +elif grep -q $repo_id $__object/explorer/all_repo_ids; then + act_id="$repo_id" +fi + +case "$state" in + present) + if [ -z "$desc" ] || [ -z "$uri" ]; then + echo "parameter repo_desc and repo_uri for $state needed" >&2 + exit 4 + fi + if [ -z "$repo_id" ]; then + echo zypper $zypper_def_opts addrepo "'$uri'" "'$desc'" + fi + ;; + absent) + if [ ! -z "$act_id" ]; then + echo zypper $zypper_def_opts removerepo $act_id + fi + ;; + enabled) + if [ ! -z "$act_id" ]; then + echo zypper $zypper_def_opts modifyrepo -e $act_id + fi + ;; + disabled) + if [ ! -z "$act_id" ]; then + echo zypper $zypper_def_opts modifyrepo -d $act_id + fi + ;; + *) + echo "Unknown state: $state" >&2 + exit 1 + ;; +esac diff --git a/cdist/conf/type/__zypper_repo/man.text b/cdist/conf/type/__zypper_repo/man.text new file mode 100644 index 00000000..c5d23713 --- /dev/null +++ b/cdist/conf/type/__zypper_repo/man.text @@ -0,0 +1,68 @@ +cdist-type__zypper_repo(7) +========================== +Daniel Heule <hda--@--sfs.biz> + + +NAME +---- +cdist-type__zypper_repo - repository management with zypper + + +DESCRIPTION +----------- +Zypper is usually used on the SuSE distribution to manage repositorys. + + +REQUIRED PARAMETERS +------------------- +None + + +OPTIONAL PARAMETERS +------------------- +state:: + Either "present" or "absent" or "enabled" or "disabled", defaults to "present" + +repo_uri:: + If supplied, use the uri and not the object id as the repo uri. + +repo_desc:: + If supplied, use the description and not the object id as the repo description, only used for state present if the repo must created + +repo_id:: + If supplied, use the id and not the object id as the repo id, can be used for with states absent,enabled,disabled + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure testrepo in installed +__zypper_repo testrepo --state present --repo_uri http://url.to.your.repo/with/path + +# Drop repo by repo uri +__zypper_repo testrepo --state absent --repo_uri http://url.to.your.repo/with/path + +# Drop repo by id nummber, attention: on every call to absent, repos are new numbered from 1 to max +__zypper_repo testrepo --state absent --repo_id 1 + +# enable repo by id +__zypper_repo testrepo2 --state enabled --repo_id 2 + +# enable repo by uri +__zypper_repo testrepo3 --state enabled --repo_uri http://url.to.your.repo/with/path + +# disable a repo works like enabling +__zypper_repo testrepo4 --state disabled --repo_id 4 +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) + + +COPYING +------- +Copyright \(C) 2013 Daniel Heule. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/cdist/conf/type/__zypper_repo/parameter/default/state b/cdist/conf/type/__zypper_repo/parameter/default/state new file mode 100644 index 00000000..e7f6134f --- /dev/null +++ b/cdist/conf/type/__zypper_repo/parameter/default/state @@ -0,0 +1 @@ +present diff --git a/cdist/conf/type/__zypper_repo/parameter/optional b/cdist/conf/type/__zypper_repo/parameter/optional new file mode 100644 index 00000000..6f5a8325 --- /dev/null +++ b/cdist/conf/type/__zypper_repo/parameter/optional @@ -0,0 +1,4 @@ +state +repo_uri +repo_desc +repo_id diff --git a/docs/man/man7/.directory b/docs/man/man7/.directory new file mode 100644 index 00000000..e2ac7573 --- /dev/null +++ b/docs/man/man7/.directory @@ -0,0 +1,4 @@ +[Dolphin] +Timestamp=2013,12,4,9,33,47 +Version=3 +ViewMode=2 From 19219fe1f96b30ed5c8a38f40d3a2e63b7c4466a Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 09:44:45 +0100 Subject: [PATCH 02/93] An allen orten correcte gpl headers eingesetzt ... --- .../type/__zypper_repo/explorer/all_repo_ids | 23 ++++++++++++++++++- .../__zypper_repo/explorer/enabled_repo_ids | 21 +++++++++++++++++ .../conf/type/__zypper_repo/explorer/repo_id | 21 +++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__zypper_repo/explorer/all_repo_ids b/cdist/conf/type/__zypper_repo/explorer/all_repo_ids index e1772956..b37d8ac5 100644 --- a/cdist/conf/type/__zypper_repo/explorer/all_repo_ids +++ b/cdist/conf/type/__zypper_repo/explorer/all_repo_ids @@ -1,3 +1,24 @@ #!/bin/sh # -echo $(zypper lr -u | cut -d'|' -f 1 | grep -E '^[0-9]') +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Retrieve all repo id nummbers - parsed zypper output +# +# +echo $(zypper lr | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids b/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids index 6ece6e05..a0d092b1 100644 --- a/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids +++ b/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids @@ -1,3 +1,24 @@ #!/bin/sh # +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Retrieve all repo id nummbers from enabled repos - parsed zypper output +# +# echo $(zypper lr -E | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_repo/explorer/repo_id b/cdist/conf/type/__zypper_repo/explorer/repo_id index aa1e5f99..8184860d 100644 --- a/cdist/conf/type/__zypper_repo/explorer/repo_id +++ b/cdist/conf/type/__zypper_repo/explorer/repo_id @@ -1,5 +1,26 @@ #!/bin/sh # +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Retrieve the id from the repo with the uri from parameter repo_uri - parsed zypper output +# +# if [ -f "$__object/parameter/repo_uri" ]; then uri="$(cat "$__object/parameter/repo_uri")" else From b5a0c52684eb82d12c31ab8d5887695cb640b78e Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 10:15:24 +0100 Subject: [PATCH 03/93] =?UTF-8?q?aus=20versehen=20eine=20.direcotry=20date?= =?UTF-8?q?i=20vom=20dolphin=20eingecheckt,=20nun=20wieder=20gel=C3=B6scht?= =?UTF-8?q?=20...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/man/man7/.directory | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 docs/man/man7/.directory diff --git a/docs/man/man7/.directory b/docs/man/man7/.directory deleted file mode 100644 index e2ac7573..00000000 --- a/docs/man/man7/.directory +++ /dev/null @@ -1,4 +0,0 @@ -[Dolphin] -Timestamp=2013,12,4,9,33,47 -Version=3 -ViewMode=2 From 6a68c14a7632db061e7fe18d80e78ce9e0e531da Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 10:56:45 +0100 Subject: [PATCH 04/93] letzter feinschliff bei der man page ... --- cdist/conf/type/__zypper_repo/man.text | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/man.text b/cdist/conf/type/__zypper_repo/man.text index c5d23713..4f2de508 100644 --- a/cdist/conf/type/__zypper_repo/man.text +++ b/cdist/conf/type/__zypper_repo/man.text @@ -10,7 +10,7 @@ cdist-type__zypper_repo - repository management with zypper DESCRIPTION ----------- -Zypper is usually used on the SuSE distribution to manage repositorys. +zypper is usually used on the SuSE distribution to manage repositories. REQUIRED PARAMETERS @@ -24,13 +24,13 @@ state:: Either "present" or "absent" or "enabled" or "disabled", defaults to "present" repo_uri:: - If supplied, use the uri and not the object id as the repo uri. + If supplied, use the uri and not the object id as repo uri. repo_desc:: - If supplied, use the description and not the object id as the repo description, only used for state present if the repo must created + If supplied, use the description and not the object id as repo description, only used if the state is present and the repo has to be created repo_id:: - If supplied, use the id and not the object id as the repo id, can be used for with states absent,enabled,disabled + If supplied, use the id and not the object id as repo id, can be used with state absent, enabled and disabled EXAMPLES @@ -43,7 +43,7 @@ __zypper_repo testrepo --state present --repo_uri http://url.to.your.repo/with/p # Drop repo by repo uri __zypper_repo testrepo --state absent --repo_uri http://url.to.your.repo/with/path -# Drop repo by id nummber, attention: on every call to absent, repos are new numbered from 1 to max +# Drop repo by id number (attention: repos are always numbered from 1 to max) __zypper_repo testrepo --state absent --repo_id 1 # enable repo by id @@ -52,7 +52,7 @@ __zypper_repo testrepo2 --state enabled --repo_id 2 # enable repo by uri __zypper_repo testrepo3 --state enabled --repo_uri http://url.to.your.repo/with/path -# disable a repo works like enabling +# disable a repo works like enabling it __zypper_repo testrepo4 --state disabled --repo_id 4 -------------------------------------------------------------------------------- From 808ea306347ae98f122dc453e9d4e416b166ad12 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 14:50:11 +0100 Subject: [PATCH 05/93] Korrektur der intention, vim hat mich verschaukelt ... --- cdist/conf/type/__zypper_repo/gencode-remote | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index b56518c9..c2302662 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -65,27 +65,27 @@ fi case "$state" in present) if [ -z "$desc" ] || [ -z "$uri" ]; then - echo "parameter repo_desc and repo_uri for $state needed" >&2 - exit 4 - fi + echo "parameter repo_desc and repo_uri for $state needed" >&2 + exit 4 + fi if [ -z "$repo_id" ]; then - echo zypper $zypper_def_opts addrepo "'$uri'" "'$desc'" - fi + echo zypper $zypper_def_opts addrepo "'$uri'" "'$desc'" + fi ;; absent) if [ ! -z "$act_id" ]; then echo zypper $zypper_def_opts removerepo $act_id - fi + fi ;; enabled) if [ ! -z "$act_id" ]; then echo zypper $zypper_def_opts modifyrepo -e $act_id - fi + fi ;; disabled) if [ ! -z "$act_id" ]; then echo zypper $zypper_def_opts modifyrepo -d $act_id - fi + fi ;; *) echo "Unknown state: $state" >&2 From ea33b093f0e4c9f2c97a76d7e628937afe71012f Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 14:58:15 +0100 Subject: [PATCH 06/93] cleanup of variable quoting --- cdist/conf/type/__zypper_repo/gencode-remote | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index c2302662..83b05dd0 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -56,9 +56,9 @@ enabled_repo_ids="$(cat "$__object/explorer/enabled_repo_ids")" repo_id="$(cat "$__object/explorer/repo_id")" act_id="" -if grep -q $id $__object/explorer/all_repo_ids; then +if grep -q "$id" "$__object/explorer/all_repo_ids"; then act_id="$id" -elif grep -q $repo_id $__object/explorer/all_repo_ids; then +elif grep -q "$repo_id" "$__object/explorer/all_repo_ids"; then act_id="$repo_id" fi @@ -74,17 +74,17 @@ case "$state" in ;; absent) if [ ! -z "$act_id" ]; then - echo zypper $zypper_def_opts removerepo $act_id + echo zypper $zypper_def_opts removerepo "'$act_id'" fi ;; enabled) if [ ! -z "$act_id" ]; then - echo zypper $zypper_def_opts modifyrepo -e $act_id + echo zypper $zypper_def_opts modifyrepo -e "'$act_id'" fi ;; disabled) if [ ! -z "$act_id" ]; then - echo zypper $zypper_def_opts modifyrepo -d $act_id + echo zypper $zypper_def_opts modifyrepo -d "'$act_id'" fi ;; *) From 71f5709fca00b4e0844ca200e3454c79017c8cb3 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 4 Dec 2013 15:15:21 +0100 Subject: [PATCH 07/93] add old workflow example Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/dev/logs/2011-11-17.workflow-example.dia | Bin 0 -> 1343 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/dev/logs/2011-11-17.workflow-example.dia diff --git a/docs/dev/logs/2011-11-17.workflow-example.dia b/docs/dev/logs/2011-11-17.workflow-example.dia new file mode 100644 index 0000000000000000000000000000000000000000..7a9cd0f7078452472ccfa26b0dc3f6a66b8d8d84 GIT binary patch literal 1343 zcmV-F1;F|riwFP!000021MON_kJ~m7e&1gqXn~+DytFRr$i^F_DT+QMNPsra1})Jt z8%i=L%DaB)Z!dLtZCySj%V-K2*abw5<{OUY_{Q|R_b&mJHkidE3TLtk6j{Qd8+j!3 zXY#kdet)p#_fL24Jc8beKcAsM5>JG2dNq?*oUh+br_ayNfNo>NBL*l*K#ZsVAWG3x z2u<auJ4rfJ;31CEwPF=<&d4I+SPD^qXYvBM-+dM(p(p23g`6AFh)EknXY&0r`^eKm z&9tQFi0(D=@q%IWy<N2;K918x^%}FP+F%{UM2PV1x+c=1C;fjQQ%J=^DD<E1KN$D9 zNyWlmSCgTwAUr_KCt)2&_=e_=(15LJns5emY)7#SOWpb8a=689;plDQ*lpoRJYPqQ zGemeDauG!oqcBJ1EWzDzVi!>nV#l`CV;4)pd33`5C8F^;8_1Vmv+dH%^%?PwCvHii zMawhs_-g(#kh^m2+kv!iNK6(KH(5_Yel_*m>!`23oveEAAMY6rxwh8!;Mo{rczJv9 z6XN0cM3|LjS~RT+vFRzVSLM!iOukfU))@pvTg(dezwX<#RJ`D#;z-ElWV5?E@JY1z z8@s&N?6=RKqzCDPD>#F^Cm@1;5N{@bQOcgG?oDVCMX=_ob@Uof7H}peP+)cY_2SW{ zf3c{lXTo|E`V{97CeWa&!HEv^M+ZQ|w&27Db~nTTb0nV#bdR{an|4fbFn1#s*7?VQ z&rD!uyMaAGvO-mN+`bX^QNF^&U-5SB5a>?n(-BPcJ$z~>3Q(2uN9_TYmY9Uq1E9=H z6{Q=*l2CdEM444z2Ep+QKNY_fnKs^$G24<{g#`bGH<(6(OSf?0BMqd@K~cz?5Yu&O zi2_2m!Y~xZvJ~@eTIocg${+m$(+%dtMTZ6Xatmsq-57FqCFG2Lpyd+URz_`6+h9MS za#KAs!n*(o%Ib#!Zho6MOo9fsag1*?wam7*Ki&7Zwx;)|=pP<pp6Gm^MA|nrKDBS- zOFNNeI}-??2{moN{^tP0hPIY<4AXd2O#m&$6u_ot>D_SMC=BN~^s@bQ+GSl-*kzcy zF3g0wVs|u5M2@?z+S5c{FY0NbH%E*`&sD|yK<)YhUsca34*lbO4EBXM*(uLNNZ-B) zF_8~(t&{BTNGp*+MFHkf#uTOf-I;9HLZRVVwRl!*eRh}l6@$*n@toLx$(9-tT<e?Q zDg*|csKB&UXb+g)DNYKb3z$bu2acVkP-oEp0>iz6@6KVlwy2D4efsL8SFN%F{Rbeu zDHR-;^p3pxQeORw^ijNOj;9|*q4aTD8<)f%N%qhrTXlfxOf+CwCbUPQeTrze#y4g- zN;9IGFT40|jO2^z@k`7_ehj8RzrIzvkBL2WVk;Bn|CP?l?b4aV^Za|{YC0S{BD$zv zti<S&FUCV*1PSG2P5bZR3WJB<d+-ngK7<ofOacQ>9s)?ofU?;`Pg$oXXuAqDT{VB; z>Ej9xJZJn+bznG_aqvC(fa8Y&v~pF|#_?kuKe~+{Uz2!MOdS%BB%knAvbamvDLq(s zJrZ+86*uBkKE0Ci%fu`0?xY_!(i_SjIbuHM^Hmh{pW>h2`22AsKSPrrO$WN7+Y=io z<6JY&HRD_}&Nbs)GtM<b9GV)}I5f3YO;B^)GIVp`LsQ2{fmCS1^w88a3~geGnZVR; zaA?}N%jQu<H=wXf%n`aV9-5Aarn^H^z3-uEex3c6@aeAfW5cJre*su7_@$6A002!6 Bp3(pS literal 0 HcmV?d00001 From 54bed4d254c4d99aa2b7b598d2721ab61dda852e Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 4 Dec 2013 15:16:31 +0100 Subject: [PATCH 08/93] add more old workflow examples Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/dev/logs/2011-11-16.workflow-example.dia | Bin 0 -> 1950 bytes docs/dev/logs/2011-11-16.workflow-example.png | Bin 0 -> 20490 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/dev/logs/2011-11-16.workflow-example.dia create mode 100644 docs/dev/logs/2011-11-16.workflow-example.png diff --git a/docs/dev/logs/2011-11-16.workflow-example.dia b/docs/dev/logs/2011-11-16.workflow-example.dia new file mode 100644 index 0000000000000000000000000000000000000000..8dab4a2cc30425f34ba78ef02cff47ee00a89143 GIT binary patch literal 1950 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 literal 0 HcmV?d00001 diff --git a/docs/dev/logs/2011-11-16.workflow-example.png b/docs/dev/logs/2011-11-16.workflow-example.png new file mode 100644 index 0000000000000000000000000000000000000000..07a0f12645a58531abd96335cc572aeea49d62ae GIT binary patch literal 20490 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 literal 0 HcmV?d00001 From 33a4f07bb40a2406fddeb41e81c734bc3424d45f Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 15:22:48 +0100 Subject: [PATCH 09/93] in der manpage state parameter besser erlaeutert ... TODO: howto line breaks in html ? --- cdist/conf/type/__zypper_repo/man.text | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__zypper_repo/man.text b/cdist/conf/type/__zypper_repo/man.text index 4f2de508..6ea88f16 100644 --- a/cdist/conf/type/__zypper_repo/man.text +++ b/cdist/conf/type/__zypper_repo/man.text @@ -21,7 +21,12 @@ None OPTIONAL PARAMETERS ------------------- state:: - Either "present" or "absent" or "enabled" or "disabled", defaults to "present" + Either "present" or "absent" or "enabled" or "disabled", defaults to "present" + + #present# - make sure that the repo is aviable, needs repo_uri and repo_desc + + for all following states, the repo can be searched via repo_id or repo_uri + + #absent# - drop the repo if found + + #enabled# - a repo can have state disabled if installed via zypper service (ris), in this case, you can enable the repo + + #disabled# - instead of absent (drop), a repo can also set to disabled, wich makes it inaccessible + repo_uri:: If supplied, use the uri and not the object id as repo uri. From a37c48ed439ba90c2bc59dcd3c4b9cf37f4e3433 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 15:24:18 +0100 Subject: [PATCH 10/93] bei dem repo_id eine kleine verschoenerung --- cdist/conf/type/__zypper_repo/explorer/repo_id | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdist/conf/type/__zypper_repo/explorer/repo_id b/cdist/conf/type/__zypper_repo/explorer/repo_id index 8184860d..83a698b7 100644 --- a/cdist/conf/type/__zypper_repo/explorer/repo_id +++ b/cdist/conf/type/__zypper_repo/explorer/repo_id @@ -24,6 +24,6 @@ if [ -f "$__object/parameter/repo_uri" ]; then uri="$(cat "$__object/parameter/repo_uri")" else - uri="/$__object_id" + uri="$__object_id" fi echo $(zypper lr -u | grep -E "\<$uri\>" | cut -d'|' -f 1 | grep -E '^[0-9]' ) From 72bbf932826a94077287cbbdd6cd9985cddddc18 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 4 Dec 2013 15:32:31 +0100 Subject: [PATCH 11/93] korrekte ids, hier werden von zypper keine quotes erwartet, da nur zahlen moeglich sind --- cdist/conf/type/__zypper_repo/gencode-remote | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index 83b05dd0..efe0a8f5 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -74,17 +74,17 @@ case "$state" in ;; absent) if [ ! -z "$act_id" ]; then - echo zypper $zypper_def_opts removerepo "'$act_id'" + echo zypper $zypper_def_opts removerepo "$act_id" fi ;; enabled) if [ ! -z "$act_id" ]; then - echo zypper $zypper_def_opts modifyrepo -e "'$act_id'" + echo zypper $zypper_def_opts modifyrepo -e "$act_id" fi ;; disabled) if [ ! -z "$act_id" ]; then - echo zypper $zypper_def_opts modifyrepo -d "'$act_id'" + echo zypper $zypper_def_opts modifyrepo -d "$act_id" fi ;; *) From 4947b154eecbb5a47add911db0ed35534b327c12 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 4 Dec 2013 21:22:18 +0100 Subject: [PATCH 12/93] update cdist hacker with git workflow Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/man/man7/cdist-hacker.text | 66 ++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/docs/man/man7/cdist-hacker.text b/docs/man/man7/cdist-hacker.text index 9dd52d35..b147808e 100644 --- a/docs/man/man7/cdist-hacker.text +++ b/docs/man/man7/cdist-hacker.text @@ -33,7 +33,6 @@ nearby, so grepping for FIXME gives all positions that need to be fixed. Indention is 4 spaces (welcome to the python world). - HOW TO SUBMIT STUFF FOR INCLUSION INTO UPSTREAM CDIST ----------------------------------------------------- If you did some cool changes to cdist, which you value as a benefit for @@ -75,14 +74,77 @@ code and thus such a type introduces redundant functionality that is given by core cdist already. +EXAMPLE GIT WORKFLOW +--------------------- +The following workflow works fine for most developers: + +-------------------------------------------------------------------------------- +# get latest upstream master branch +git clone https://github.com/telmich/cdist.git + +# update if already existing +cd cdist; git fetch -v; git merge origin/master + +# create a new branch for your feature/bugfix +cd cdist # if you haven't done before +git checkout -b documentation_cleanup + +# *hack* +*hack* + +# clone the cdist repository on github if you haven't done so + +# configure your repo to know about your clone (only once) +git remote add github git@github.com:YOURUSERNAME/cdist.git + +# push the new branch to github +git push github documentation_cleanup + +# (or everything) +git push --mirror github + +# create a pull request at github (use a browser) +# *fixthingsbecausequalityassurancefoundissuesinourpatch* +*hack* + +# push code to github again +git push ... # like above + +# add comment that everything should be green now (use a browser) + +# go back to master branch +git checkout master + +# update master branch that includes your changes now +git fetch -v origin +git diff master..origin/master +git merge origin/master +-------------------------------------------------------------------------------- + +If at any point you want to go back to the original master branch, you can +use **git stash** to stash your changes away: + +-------------------------------------------------------------------------------- +# assume you are on documentation_cleanup +git stash + +# change to master and update to most recent upstream version +git checkout master +git fetch -v origin +git merge origin/master +-------------------------------------------------------------------------------- + SEE ALSO -------- - cdist(7) +- git(1) +- git-checkout(1) +- git-stash(1) COPYING ------- -Copyright \(C) 2011-2012 Nico Schottelius. Free use of this software is +Copyright \(C) 2011-2013 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). From 5f5b9f8cc4a79d9296b234d2c1d66f589c11474f Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 4 Dec 2013 21:25:10 +0100 Subject: [PATCH 13/93] describe how to develop multiple features at the same time Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/man/man7/cdist-hacker.text | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/man/man7/cdist-hacker.text b/docs/man/man7/cdist-hacker.text index b147808e..2cbf5a8b 100644 --- a/docs/man/man7/cdist-hacker.text +++ b/docs/man/man7/cdist-hacker.text @@ -134,6 +134,20 @@ git fetch -v origin git merge origin/master -------------------------------------------------------------------------------- +Similar when you want to develop another new feature, you go back +to the master branch and create another branch based on it: + +-------------------------------------------------------------------------------- +# change to master and update to most recent upstream version +git checkout master +git fetch -v origin +git merge origin/master + +git checkout -b another_feature +-------------------------------------------------------------------------------- + +(you can repeat the code above for as many features as you want to develop +in parallel) SEE ALSO From a5fc3f5002bd63f9cd9d8ef3323ff1b86dbcff8b Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 4 Dec 2013 21:29:56 +0100 Subject: [PATCH 14/93] remove changed attribute of an object - was never used and will never be used Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- cdist/core/cdist_object.py | 1 - cdist/test/cdist_object/__init__.py | 8 -------- 2 files changed, 9 deletions(-) diff --git a/cdist/core/cdist_object.py b/cdist/core/cdist_object.py index e3c1c532..45b5e3ff 100644 --- a/cdist/core/cdist_object.py +++ b/cdist/core/cdist_object.py @@ -201,7 +201,6 @@ class CdistObject(object): autorequire = fsproperty.FileListProperty(lambda obj: os.path.join(obj.absolute_path, 'autorequire')) parameters = fsproperty.DirectoryDictProperty(lambda obj: os.path.join(obj.base_path, obj.parameter_path)) explorers = fsproperty.DirectoryDictProperty(lambda obj: os.path.join(obj.base_path, obj.explorer_path)) - changed = fsproperty.FileBooleanProperty(lambda obj: os.path.join(obj.absolute_path, "changed")) state = fsproperty.FileStringProperty(lambda obj: os.path.join(obj.absolute_path, "state")) source = fsproperty.FileListProperty(lambda obj: os.path.join(obj.absolute_path, "source")) code_local = fsproperty.FileStringProperty(lambda obj: os.path.join(obj.base_path, obj.code_local_path)) diff --git a/cdist/test/cdist_object/__init__.py b/cdist/test/cdist_object/__init__.py index ffb2ba79..54ecf637 100644 --- a/cdist/test/cdist_object/__init__.py +++ b/cdist/test/cdist_object/__init__.py @@ -102,7 +102,6 @@ class ObjectTestCase(test.CdistTestCase): self.cdist_object = core.CdistObject(self.cdist_type, object_base_path, 'moon') def tearDown(self): - self.cdist_object.changed = False self.cdist_object.prepared = False self.cdist_object.ran = False self.cdist_object.source = [] @@ -172,13 +171,6 @@ class ObjectTestCase(test.CdistTestCase): expected = [] self.assertEqual(list(self.cdist_object.requirements), expected) - def test_changed(self): - self.assertFalse(self.cdist_object.changed) - - def test_changed_after_changing(self): - self.cdist_object.changed = True - self.assertTrue(self.cdist_object.changed) - def test_state(self): self.assertEqual(self.cdist_object.state, '') From 87dcc6ed52ff7e1322e22f0887c35aa762e0de77 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 4 Dec 2013 21:30:34 +0100 Subject: [PATCH 15/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 577194bf..87b32175 100644 --- a/docs/changelog +++ b/docs/changelog @@ -7,6 +7,7 @@ Changelog 3.0.0: * Core: Messaging support added + * Core: Removed unused "changed" attribute of objects * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx From e1a2ebab5c4d6727cae37fb829c671c1cd0e7f56 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 5 Dec 2013 08:45:12 +0100 Subject: [PATCH 16/93] gencode-remote gibt nur noch befehle aus wenn was zu tun ist ... --- cdist/conf/type/__zypper_repo/gencode-remote | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index efe0a8f5..c93ca229 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -51,8 +51,6 @@ else state="present" fi -all_repo_ids="$(cat "$__object/explorer/all_repo_ids")" -enabled_repo_ids="$(cat "$__object/explorer/enabled_repo_ids")" repo_id="$(cat "$__object/explorer/repo_id")" act_id="" @@ -62,6 +60,13 @@ elif grep -q "$repo_id" "$__object/explorer/all_repo_ids"; then act_id="$repo_id" fi +if grep -q "$act_id" "$__object/explorer/enabled_repo_ids"; then + state="enabled" +else + state="disabled" +fi + + case "$state" in present) if [ -z "$desc" ] || [ -z "$uri" ]; then @@ -78,12 +83,12 @@ case "$state" in fi ;; enabled) - if [ ! -z "$act_id" ]; then + if [ ! -z "$act_id" ] && [ "$state" = "disabled" ]; then echo zypper $zypper_def_opts modifyrepo -e "$act_id" fi ;; disabled) - if [ ! -z "$act_id" ]; then + if [ ! -z "$act_id" ] && [ "$state" = "disabled" ]; then echo zypper $zypper_def_opts modifyrepo -d "$act_id" fi ;; From 512b4100123c649ee4958ba54272e5c3ca055856 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 5 Dec 2013 08:47:57 +0100 Subject: [PATCH 17/93] korrektur eines typos ... --- cdist/conf/type/__zypper_repo/gencode-remote | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index c93ca229..e2cc25e5 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -60,10 +60,9 @@ elif grep -q "$repo_id" "$__object/explorer/all_repo_ids"; then act_id="$repo_id" fi +state="disabled" if grep -q "$act_id" "$__object/explorer/enabled_repo_ids"; then state="enabled" -else - state="disabled" fi @@ -88,7 +87,7 @@ case "$state" in fi ;; disabled) - if [ ! -z "$act_id" ] && [ "$state" = "disabled" ]; then + if [ ! -z "$act_id" ] && [ "$state" = "enabled" ]; then echo zypper $zypper_def_opts modifyrepo -d "$act_id" fi ;; From 59de2afdaaa7b122744dac5c5eab27d36fa07ed4 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 5 Dec 2013 13:14:15 +0100 Subject: [PATCH 18/93] ups, was a variable collision --- cdist/conf/type/__zypper_repo/gencode-remote | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index e2cc25e5..4698582e 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -60,9 +60,9 @@ elif grep -q "$repo_id" "$__object/explorer/all_repo_ids"; then act_id="$repo_id" fi -state="disabled" +repostate="disabled" if grep -q "$act_id" "$__object/explorer/enabled_repo_ids"; then - state="enabled" + repostate="enabled" fi @@ -82,12 +82,12 @@ case "$state" in fi ;; enabled) - if [ ! -z "$act_id" ] && [ "$state" = "disabled" ]; then + if [ ! -z "$act_id" ] && [ "$repostate" = "disabled" ]; then echo zypper $zypper_def_opts modifyrepo -e "$act_id" fi ;; disabled) - if [ ! -z "$act_id" ] && [ "$state" = "enabled" ]; then + if [ ! -z "$act_id" ] && [ "$repostate" = "enabled" ]; then echo zypper $zypper_def_opts modifyrepo -d "$act_id" fi ;; From 367ef21bd8bcf761789db470e8cbd85f1ab01c97 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Fri, 6 Dec 2013 13:49:45 +0100 Subject: [PATCH 19/93] make __postfix_* types depend on __postfix Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/conf/type/__postfix_master/manifest | 3 ++- cdist/conf/type/__postfix_postconf/manifest | 21 +++++++++++++++++++++ cdist/conf/type/__postfix_postmap/manifest | 21 +++++++++++++++++++++ cdist/conf/type/__postfix_reload/manifest | 21 +++++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100755 cdist/conf/type/__postfix_postconf/manifest create mode 100755 cdist/conf/type/__postfix_postmap/manifest create mode 100755 cdist/conf/type/__postfix_reload/manifest diff --git a/cdist/conf/type/__postfix_master/manifest b/cdist/conf/type/__postfix_master/manifest index 1642e91b..87e2329b 100755 --- a/cdist/conf/type/__postfix_master/manifest +++ b/cdist/conf/type/__postfix_master/manifest @@ -1,6 +1,6 @@ #!/bin/sh # -# 2012 Steven Armstrong (steven-cdist at armstrong.cc) +# 2012 - 2013 Steven Armstrong (steven-cdist at armstrong.cc) # # This file is part of cdist. # @@ -32,6 +32,7 @@ case "$os" in ;; esac +__postfix # Default to object_id service="$(cat "$__object/parameter/service" 2>/dev/null || echo "$__object_id")" diff --git a/cdist/conf/type/__postfix_postconf/manifest b/cdist/conf/type/__postfix_postconf/manifest new file mode 100755 index 00000000..0dde64e9 --- /dev/null +++ b/cdist/conf/type/__postfix_postconf/manifest @@ -0,0 +1,21 @@ +#!/bin/sh +# +# 2012 - 2013 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 <http://www.gnu.org/licenses/>. +# + +__postfix diff --git a/cdist/conf/type/__postfix_postmap/manifest b/cdist/conf/type/__postfix_postmap/manifest new file mode 100755 index 00000000..0dde64e9 --- /dev/null +++ b/cdist/conf/type/__postfix_postmap/manifest @@ -0,0 +1,21 @@ +#!/bin/sh +# +# 2012 - 2013 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 <http://www.gnu.org/licenses/>. +# + +__postfix diff --git a/cdist/conf/type/__postfix_reload/manifest b/cdist/conf/type/__postfix_reload/manifest new file mode 100755 index 00000000..0dde64e9 --- /dev/null +++ b/cdist/conf/type/__postfix_reload/manifest @@ -0,0 +1,21 @@ +#!/bin/sh +# +# 2012 - 2013 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 <http://www.gnu.org/licenses/>. +# + +__postfix From 2ea2e640c93d5bec4a4c4422c63ac098ec8d2737 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 6 Dec 2013 14:19:36 +0100 Subject: [PATCH 20/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 87b32175..dd0e7dce 100644 --- a/docs/changelog +++ b/docs/changelog @@ -10,6 +10,7 @@ Changelog * Core: Removed unused "changed" attribute of objects * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx + * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From a271244cfb77aa7a70ac2af836fcdc7aa4fa41c4 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Fri, 6 Dec 2013 15:23:09 +0100 Subject: [PATCH 21/93] Die 4 codepaths mit comments erklaert ... --- cdist/conf/type/__zypper_repo/gencode-remote | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cdist/conf/type/__zypper_repo/gencode-remote b/cdist/conf/type/__zypper_repo/gencode-remote index 4698582e..4d834c47 100644 --- a/cdist/conf/type/__zypper_repo/gencode-remote +++ b/cdist/conf/type/__zypper_repo/gencode-remote @@ -73,21 +73,25 @@ case "$state" in exit 4 fi if [ -z "$repo_id" ]; then + # Repo not present, so we need to create it echo zypper $zypper_def_opts addrepo "'$uri'" "'$desc'" fi ;; absent) if [ ! -z "$act_id" ]; then + # Repo present (act_id not ""), so we ned to delete it echo zypper $zypper_def_opts removerepo "$act_id" fi ;; enabled) if [ ! -z "$act_id" ] && [ "$repostate" = "disabled" ]; then + # Repo present (act_id not "") and repostate not enabled, so a enable call is needed echo zypper $zypper_def_opts modifyrepo -e "$act_id" fi ;; disabled) if [ ! -z "$act_id" ] && [ "$repostate" = "enabled" ]; then + # Repo present (act_id not "") and repostate enabled, so a disable call is needed echo zypper $zypper_def_opts modifyrepo -d "$act_id" fi ;; From a420ee105d485cb94e9457dbb897816e60aff72e Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 6 Dec 2013 23:55:53 +0100 Subject: [PATCH 22/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index dd0e7dce..67ea7e42 100644 --- a/docs/changelog +++ b/docs/changelog @@ -8,6 +8,7 @@ Changelog 3.0.0: * Core: Messaging support added * Core: Removed unused "changed" attribute of objects + * New Type: __zypper_repo (Daniel Heule) * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) From fe20da65949f5eed385eba7998ffe5ac6c442bf2 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Sat, 7 Dec 2013 00:13:28 +0100 Subject: [PATCH 23/93] note hint from Axel Beckert for debian prios Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- cdist/conf/type/__package_apt/gencode-remote | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__package_apt/gencode-remote b/cdist/conf/type/__package_apt/gencode-remote index 7aba76d5..57339db3 100755 --- a/cdist/conf/type/__package_apt/gencode-remote +++ b/cdist/conf/type/__package_apt/gencode-remote @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) +# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -42,6 +42,8 @@ case "$state_is" in ;; esac +# Hint if we need to avoid questions at some point: +# DEBIAN_PRIORITY=critical can reduce the number of questions aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes --no-install-recommends -o DPkg::Options::=\"--force-confold\"" [ "$state_is" = "$state_should" ] && exit 0 From c0da6fcc897c38efe1514be65218200aaaeba87a Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Mon, 9 Dec 2013 09:44:40 +0100 Subject: [PATCH 24/93] =?UTF-8?q?Verbesserungen=20am=20=5F=5Fcron=20type?= =?UTF-8?q?=201.=20Filter=20messages=20from=20crontab=20-l=20welche=20das?= =?UTF-8?q?=20ganze=20file=20f=C3=BCllen=202.=20neuer=20parameter=20raw=5F?= =?UTF-8?q?command,=20um=20globale=20variablen=20zu=20setzen=20...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdist/conf/type/__cron/explorer/entry | 0 cdist/conf/type/__cron/gencode-remote | 9 ++++++--- cdist/conf/type/__cron/man.text | 8 ++++++++ cdist/conf/type/__cron/parameter/boolean | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) mode change 100755 => 100644 cdist/conf/type/__cron/explorer/entry mode change 100755 => 100644 cdist/conf/type/__cron/gencode-remote create mode 100644 cdist/conf/type/__cron/parameter/boolean diff --git a/cdist/conf/type/__cron/explorer/entry b/cdist/conf/type/__cron/explorer/entry old mode 100755 new mode 100644 diff --git a/cdist/conf/type/__cron/gencode-remote b/cdist/conf/type/__cron/gencode-remote old mode 100755 new mode 100644 index c04a7245..6f1feb90 --- a/cdist/conf/type/__cron/gencode-remote +++ b/cdist/conf/type/__cron/gencode-remote @@ -26,6 +26,8 @@ command="$(cat "$__object/parameter/command")" if [ -f "$__object/parameter/raw" ]; then raw="$(cat "$__object/parameter/raw")" entry="$raw $command" +elif [ -f "$__object/parameter/raw_command" ]; then + entry="$command" else minute="$(cat "$__object/parameter/minute" 2>/dev/null || echo "*")" hour="$(cat "$__object/parameter/hour" 2>/dev/null || echo "*")" @@ -55,8 +57,9 @@ state_should="$(cat "$__object/parameter/state" 2>/dev/null || echo "present")" # These are the old markers prefix="#cdist:__cron/$__object_id" suffix="#/cdist:__cron/$__object_id" +filter="^# DO NOT EDIT THIS FILE|^# \(.* installed on |^# \(Cron version V" cat << DONE -crontab -u $user -l | awk -v prefix="$prefix" -v suffix="$suffix" ' +crontab -u $user -l | grep -v -E "$filter" | awk -v prefix="$prefix" -v suffix="$suffix" ' { if (index(\$0,prefix)) { triggered=1 @@ -75,12 +78,12 @@ DONE case "$state_should" in present) echo "(" - echo "crontab -u $user -l 2>/dev/null || true" + echo "crontab -u $user -l | grep -v -E "$filter" 2>/dev/null || true" echo "echo '$entry'" echo ") | crontab -u $user -" ;; absent) - echo "( crontab -u $user -l 2>/dev/null || true ) | \\" + echo "( crontab -u $user -l | grep -v -E "$filter" 2>/dev/null || true ) | \\" echo "grep -v \"# $name\\$\" | crontab -u $user -" ;; esac diff --git a/cdist/conf/type/__cron/man.text b/cdist/conf/type/__cron/man.text index 22627234..f4e80a08 100644 --- a/cdist/conf/type/__cron/man.text +++ b/cdist/conf/type/__cron/man.text @@ -41,6 +41,10 @@ raw:: Can for example be used to specify cron EXTENSIONS like reboot, yearly etc. See crontab(5) for the extensions if any that your cron implementation implements. +raw_command:: + Take whatever the user has given in the commmand and ignore everything else. + If given, the command will be added to crontab. + Can for example be used to define variables like SHELL or MAILTO. EXAMPLES @@ -57,6 +61,10 @@ __cron some-id --user root --command "/path/to/script" \ # remove cronjob __cron some-id --user root --command "/path/to/script" --state absent + +# define default shell +__cron some-id --user root --raw_command --command "SHELL=/bin/bash" \ + --state present -------------------------------------------------------------------------------- diff --git a/cdist/conf/type/__cron/parameter/boolean b/cdist/conf/type/__cron/parameter/boolean new file mode 100644 index 00000000..54cfb0b3 --- /dev/null +++ b/cdist/conf/type/__cron/parameter/boolean @@ -0,0 +1 @@ +raw_command From 02aad6f4ccd114378ae770e125c781c10eca18d2 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Mon, 9 Dec 2013 09:57:31 +0100 Subject: [PATCH 25/93] =?UTF-8?q?revert=20vom=20chmod=20der=20aus=20verseh?= =?UTF-8?q?en=20ge=C3=A4ndert=20wurde=20...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdist/conf/type/__cron/explorer/entry | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 cdist/conf/type/__cron/explorer/entry diff --git a/cdist/conf/type/__cron/explorer/entry b/cdist/conf/type/__cron/explorer/entry old mode 100644 new mode 100755 From e6420a49e88295ae50f265512d6af79389a23c74 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Mon, 9 Dec 2013 11:39:44 +0100 Subject: [PATCH 26/93] verhindern dass raw and raw_command zusammen angegeben werden --- cdist/conf/type/__cron/gencode-remote | 1 + cdist/conf/type/__cron/manifest | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 cdist/conf/type/__cron/manifest diff --git a/cdist/conf/type/__cron/gencode-remote b/cdist/conf/type/__cron/gencode-remote index 6f1feb90..e84cf66a 100644 --- a/cdist/conf/type/__cron/gencode-remote +++ b/cdist/conf/type/__cron/gencode-remote @@ -2,6 +2,7 @@ # # 2011 Steven Armstrong (steven-cdist at armstrong.cc) # 2013 Nico Schottelius (nico-cdist at schottelius.org) +# 2013 Thomas Oettli (otho at sfs.biz) # # This file is part of cdist. # diff --git a/cdist/conf/type/__cron/manifest b/cdist/conf/type/__cron/manifest new file mode 100644 index 00000000..9992df25 --- /dev/null +++ b/cdist/conf/type/__cron/manifest @@ -0,0 +1,24 @@ +#!/bin/sh +# +# 2013 Thomas Oettli (otho at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# + +if [ -f "$__object/parameter/raw" ] && [ -f "$__object/parameter/raw_command" ]; then + echo "ERROR: both raw and raw_command specified" >&2 + exit 1 +fi From 6bf235c698ce9f4be0288c7410d7b3fe68f8c073 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Mon, 9 Dec 2013 23:17:06 +0100 Subject: [PATCH 27/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 67ea7e42..e4c09e7b 100644 --- a/docs/changelog +++ b/docs/changelog @@ -12,6 +12,7 @@ Changelog * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) + * Type __cron: Add support for raw lines (Daniel Heule) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From d068dfd6218956a9bf07652327dc4e04209d3e95 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Tue, 10 Dec 2013 11:02:10 +0100 Subject: [PATCH 28/93] escape and thereby preserve quotes in values Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/conf/type/__key_value/gencode-remote | 27 ++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/cdist/conf/type/__key_value/gencode-remote b/cdist/conf/type/__key_value/gencode-remote index c1a6bca8..ec91894f 100755 --- a/cdist/conf/type/__key_value/gencode-remote +++ b/cdist/conf/type/__key_value/gencode-remote @@ -26,8 +26,8 @@ state_should=present file="$(cat "$__object/parameter/file")" delimiter="$(cat "$__object/parameter/delimiter")" -value="$(cat "$__object/parameter/value")" - +# escape double quotes, as that is what we use ourself below +value_escaped="$(cat "$__object/parameter/value" | sed -e "s/\([\"]\)/\\\\\1/g")" state_is="$(cat "$__object/explorer/state")" [ "$state_is" = "$state_should" ] && exit 0 @@ -35,20 +35,29 @@ state_is="$(cat "$__object/explorer/state")" case "$state_should" in absent) # remove lines starting with key - echo "sed '/^$key\($delimiter\+\)/d' \"$file\" > \"$file.cdist-tmp\"" - echo "mv \"$file.cdist-tmp\" \"$file\"" + cat << DONE +tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX) +# preserve ownership and permissions by copying existing file over tmpfile +cp -p "$file" "\$tmpfile" +sed '/^$key\($delimiter\+\)/d' "$file" > "\$tmpfile" +mv -f "\$tmpfile" "$file" +DONE ;; present) case "$state_is" in absent) # add new key and value - echo "echo \"${key}${delimiter}${value}\" >> \"$file\"" + printf 'echo "%s%s%s" >> "%s"' "$key" "$delimiter" "$value_escaped" "$file" ;; wrongvalue) # change exisiting value - printf 'sed "s|^%s\(%s\+\).*|%s\\1%s|" "%s" > "%s.cdist-tmp"\n' \ - "$key" "$delimiter" "$key" "$value" "$file" "$file" - echo "mv \"$file.cdist-tmp\" \"$file\"" + cat << DONE +tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX) +# preserve ownership and permissions by copying existing file over tmpfile +cp -p "$file" "\$tmpfile" +sed "s|^$key\($delimiter\+\).*|$key\\1$value_escaped|" "$file" > "\$tmpfile" +mv -f "\$tmpfile" "$file" +DONE ;; *) echo "Unknown explorer state: $state_is" >&2 @@ -58,4 +67,4 @@ case "$state_should" in *) echo "Unknown state: $state_should" >&2 exit 1 -esac +esac From 0f1dabb08028b79e7ee373da468291ccc7efb3df Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 10 Dec 2013 11:50:18 +0100 Subject: [PATCH 29/93] inital commit of __zypper_service --- .../type/__zypper_service/explorer/repo_ids | 24 +++++ .../type/__zypper_service/explorer/service_id | 28 ++++++ .../__zypper_service/explorer/service_ids | 23 +++++ .../__zypper_service/explorer/service_uri | 28 ++++++ .../conf/type/__zypper_service/gencode-remote | 94 +++++++++++++++++++ cdist/conf/type/__zypper_service/man.text | 67 +++++++++++++ cdist/conf/type/__zypper_service/manifest | 63 +++++++++++++ .../type/__zypper_service/parameter/boolean | 2 + .../__zypper_service/parameter/default/state | 1 + .../__zypper_service/parameter/default/type | 1 + .../type/__zypper_service/parameter/optional | 3 + .../type/__zypper_service/parameter/required | 1 + 12 files changed, 335 insertions(+) create mode 100644 cdist/conf/type/__zypper_service/explorer/repo_ids create mode 100644 cdist/conf/type/__zypper_service/explorer/service_id create mode 100644 cdist/conf/type/__zypper_service/explorer/service_ids create mode 100644 cdist/conf/type/__zypper_service/explorer/service_uri create mode 100644 cdist/conf/type/__zypper_service/gencode-remote create mode 100644 cdist/conf/type/__zypper_service/man.text create mode 100644 cdist/conf/type/__zypper_service/manifest create mode 100644 cdist/conf/type/__zypper_service/parameter/boolean create mode 100644 cdist/conf/type/__zypper_service/parameter/default/state create mode 100644 cdist/conf/type/__zypper_service/parameter/default/type create mode 100644 cdist/conf/type/__zypper_service/parameter/optional create mode 100644 cdist/conf/type/__zypper_service/parameter/required diff --git a/cdist/conf/type/__zypper_service/explorer/repo_ids b/cdist/conf/type/__zypper_service/explorer/repo_ids new file mode 100644 index 00000000..8c32b40b --- /dev/null +++ b/cdist/conf/type/__zypper_service/explorer/repo_ids @@ -0,0 +1,24 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage services with Zypper (mostly suse) +# +# +echo $(zypper lr -u -E | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_service/explorer/service_id b/cdist/conf/type/__zypper_service/explorer/service_id new file mode 100644 index 00000000..b473340c --- /dev/null +++ b/cdist/conf/type/__zypper_service/explorer/service_id @@ -0,0 +1,28 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage services with Zypper (mostly suse) +# +if [ -f "$__object/parameter/service_uri" ]; then + uri="$(cat "$__object/parameter/service_uri")" +else + uri="/$__object_id" +fi +echo $(zypper ls -u -E | grep -E "\<$uri\>" | cut -d'|' -f 1 ) diff --git a/cdist/conf/type/__zypper_service/explorer/service_ids b/cdist/conf/type/__zypper_service/explorer/service_ids new file mode 100644 index 00000000..460b2006 --- /dev/null +++ b/cdist/conf/type/__zypper_service/explorer/service_ids @@ -0,0 +1,23 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage services with Zypper (mostly suse) +# +echo $(zypper ls -u -E | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_service/explorer/service_uri b/cdist/conf/type/__zypper_service/explorer/service_uri new file mode 100644 index 00000000..aec93cb2 --- /dev/null +++ b/cdist/conf/type/__zypper_service/explorer/service_uri @@ -0,0 +1,28 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage services with Zypper (mostly suse) +# +if [ -f "$__object/parameter/service_uri" ]; then + uri="$(cat "$__object/parameter/service_uri")" +else + uri="/$__object_id" +fi +echo $(zypper ls -u -E | grep -E "\<$uri\>" | cut -d'|' -f 7 ) diff --git a/cdist/conf/type/__zypper_service/gencode-remote b/cdist/conf/type/__zypper_service/gencode-remote new file mode 100644 index 00000000..d11749ae --- /dev/null +++ b/cdist/conf/type/__zypper_service/gencode-remote @@ -0,0 +1,94 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage services with Zypper (mostly suse) +# + +# Debug +#exec >&2 +#set -x + +zypper_def_opts=" -q " + +if [ -f "$__object/parameter/service_desc" ]; then + desc="$(cat "$__object/parameter/service_desc")" +else + desc="$__object_id" +fi + +if [ -f "$__object/parameter/service_uri" ]; then + uri="$(cat "$__object/parameter/service_uri")" +else + uri="$__object_id" +fi + +if [ -f "$__object/parameter/state" ]; then + state_should="$(cat "$__object/parameter/state")" +else + state_should="present" +fi + +if [ -f "$__object/parameter/type" ]; then + stype="$(cat "$__object/parameter/type")" +else + stype="ris" +fi + +exp_uri="$(cat "$__object/explorer/service_uri")" +exp_id="$(cat "$__object/explorer/service_id")" + +# we need this list to remove ids, but we must do this in reverse order +exp_ids="$(cat "$__object/explorer/service_ids" | rev)" + +if [ "$uri" = "$exp_uri" ] ; then + state_is="present" +else + state_is="absent" +fi + +# remove all other services if needed ... +if [ -f "$__object/parameter/remove-all-other-services" ]; then + # file exists -> True + for i in $exp_ids; do + if [ "$i" != "$exp_id" ] ; then + echo zypper $zypper_def_opts removeservice "$i" "&>/dev/null" + fi + done + echo zypper $zypper_def_opts refs "&>/dev/null" +fi + + +# Exit if nothing is needed to be done +[ "$state_is" = "$state_should" ] && exit 0 + +case "$state_should" in + present) + echo zypper $zypper_def_opts addservice -t "$stype" "$uri" \"$desc\" + echo zypper $zypper_def_opts refs + ;; + absent) + echo zypper $zypper_def_opts removeservice "$service_id" + echo zypper $zypper_def_opts refs + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; +esac diff --git a/cdist/conf/type/__zypper_service/man.text b/cdist/conf/type/__zypper_service/man.text new file mode 100644 index 00000000..3345be60 --- /dev/null +++ b/cdist/conf/type/__zypper_service/man.text @@ -0,0 +1,67 @@ +cdist-type__zypper_service(7) +============================= +Daniel Heule <hda--@--sfs.biz> + + +NAME +---- +cdist-type__zypper_service - service management with zypper + + +DESCRIPTION +----------- +zypper is usually used on SuSE systems to manage services. + + +REQUIRED PARAMETERS +------------------- +service_uri:: + Uri of the service + + +OPTIONAL PARAMETERS +------------------- +service_desc:: + If supplied, use the service_desc and not the object id as descritpion for the service. + +state:: + Either "present" or "absent", defaults to "present" + +type:: + Defaults to "ris", the standard type of services at SLES11. For other values, see manpage of zypper. + + +BOOLEAN PARAMETERS +------------------ +remove-all-other-service:: + Drop all other services found on the target host before adding the new one. + +remove-all-repos:: + If supplied, remove all existing repos prior to setup the new service. + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure that internal SLES11 SP3 RIS is in installed and all other services and repos are discarded +__zypper_service SFS_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" --remove-all-other-service --remove-all-repos + +# Ensure that internal SLES11 SP3 RIS is in installed, no changes to ohter services or repos +__zypper_service SFS_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" + +# Drop service by uri, no changes to ohter services or repos +__zypper_service SFS_SLES11_SP3 --state absent --service_uri "http://path/to/your/ris/dir" + +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) + + +COPYING +------- +Copyright \(C) 2013 Daniel Heule. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/cdist/conf/type/__zypper_service/manifest b/cdist/conf/type/__zypper_service/manifest new file mode 100644 index 00000000..d8773605 --- /dev/null +++ b/cdist/conf/type/__zypper_service/manifest @@ -0,0 +1,63 @@ +#!/bin/sh +# +# 2013 Daniel Heule (hda at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage services with Zypper (mostly suse) +# + +# Debug +#exec >&2 +#set -x + +zypper_def_opts=" -q " + +if [ -f "$__object/parameter/service_uri" ]; then + uri="$(cat "$__object/parameter/service_uri")" +else + uri="$__object_id" +fi + +if [ -f "$__object/parameter/state" ]; then + state_should="$(cat "$__object/parameter/state")" +else + state_should="present" +fi + +exp_uri="$(cat "$__object/explorer/service_uri")" + +if [ "$uri" = "$exp_uri" ] ; then + state_is="present" +else + state_is="absent" +fi + + +# Exit if nothing is needed to be done +[ "$state_is" = "$state_should" ] && exit 0 + +# we need this list to remove ids, but we must do this in reverse order +exp_repos="$(cat "$__object/explorer/repo_ids" | rev)" + +# boolean parameter +if [ -f "$__object/parameter/remove-all-repos" ]; then + # file exists -> True + for i in $exp_repos; do + __zypper_repo "droprepo${i}" --state absent --repo_id "${i}" + done +fi diff --git a/cdist/conf/type/__zypper_service/parameter/boolean b/cdist/conf/type/__zypper_service/parameter/boolean new file mode 100644 index 00000000..bc6a5629 --- /dev/null +++ b/cdist/conf/type/__zypper_service/parameter/boolean @@ -0,0 +1,2 @@ +remove-all-other-service +remove-all-repos diff --git a/cdist/conf/type/__zypper_service/parameter/default/state b/cdist/conf/type/__zypper_service/parameter/default/state new file mode 100644 index 00000000..e7f6134f --- /dev/null +++ b/cdist/conf/type/__zypper_service/parameter/default/state @@ -0,0 +1 @@ +present diff --git a/cdist/conf/type/__zypper_service/parameter/default/type b/cdist/conf/type/__zypper_service/parameter/default/type new file mode 100644 index 00000000..b928830f --- /dev/null +++ b/cdist/conf/type/__zypper_service/parameter/default/type @@ -0,0 +1 @@ +ris diff --git a/cdist/conf/type/__zypper_service/parameter/optional b/cdist/conf/type/__zypper_service/parameter/optional new file mode 100644 index 00000000..b26c78d8 --- /dev/null +++ b/cdist/conf/type/__zypper_service/parameter/optional @@ -0,0 +1,3 @@ +service_desc +state +type diff --git a/cdist/conf/type/__zypper_service/parameter/required b/cdist/conf/type/__zypper_service/parameter/required new file mode 100644 index 00000000..2b4645ee --- /dev/null +++ b/cdist/conf/type/__zypper_service/parameter/required @@ -0,0 +1 @@ +service_uri From f7f63aa7a2c44a23f7a2ac22f11285069d2117a2 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 10 Dec 2013 11:54:42 +0100 Subject: [PATCH 30/93] remove SFS from man page text ... --- cdist/conf/type/__zypper_service/man.text | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cdist/conf/type/__zypper_service/man.text b/cdist/conf/type/__zypper_service/man.text index 3345be60..b1717c96 100644 --- a/cdist/conf/type/__zypper_service/man.text +++ b/cdist/conf/type/__zypper_service/man.text @@ -45,13 +45,13 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure that internal SLES11 SP3 RIS is in installed and all other services and repos are discarded -__zypper_service SFS_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" --remove-all-other-service --remove-all-repos +__zypper_service INTERNAL_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" --remove-all-other-service --remove-all-repos # Ensure that internal SLES11 SP3 RIS is in installed, no changes to ohter services or repos -__zypper_service SFS_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" +__zypper_service INTERNAL_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" # Drop service by uri, no changes to ohter services or repos -__zypper_service SFS_SLES11_SP3 --state absent --service_uri "http://path/to/your/ris/dir" +__zypper_service INTERNAL_SLES11_SP3 --state absent --service_uri "http://path/to/your/ris/dir" -------------------------------------------------------------------------------- From a2106f655265e016f679c2d199a5ec2e918dbd1c Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 10 Dec 2013 15:39:27 +0100 Subject: [PATCH 31/93] ++changes (3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index e4c09e7b..cdbcc593 100644 --- a/docs/changelog +++ b/docs/changelog @@ -13,6 +13,7 @@ Changelog * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) * Type __cron: Add support for raw lines (Daniel Heule) + * Type __key_value: Fix quoting issue (Steven Armstrong) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From a5d2cdecf474e0276b7b3cb37bd2727e67c8b49b Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 10 Dec 2013 15:48:04 +0100 Subject: [PATCH 32/93] ++changes (3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index cdbcc593..023d0749 100644 --- a/docs/changelog +++ b/docs/changelog @@ -9,6 +9,7 @@ Changelog * Core: Messaging support added * Core: Removed unused "changed" attribute of objects * New Type: __zypper_repo (Daniel Heule) + * New Type: __zypper_service (Daniel Heule) * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) From e1eae5604ef816114b51c0ad695c44e0a24a0433 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 10 Dec 2013 16:57:02 +0100 Subject: [PATCH 33/93] unlock the whole power of zypper added the ptype parameter (package type of zypper install) --- .../__package_zypper/explorer/pkg_version | 19 +++++++++++++++++-- .../conf/type/__package_zypper/gencode-remote | 11 +++++++++-- cdist/conf/type/__package_zypper/man.text | 6 ++++++ .../__package_zypper/parameter/default/ptype | 1 + .../type/__package_zypper/parameter/optional | 1 + 5 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 cdist/conf/type/__package_zypper/parameter/default/ptype diff --git a/cdist/conf/type/__package_zypper/explorer/pkg_version b/cdist/conf/type/__package_zypper/explorer/pkg_version index 655b464d..64fd64c0 100644 --- a/cdist/conf/type/__package_zypper/explorer/pkg_version +++ b/cdist/conf/type/__package_zypper/explorer/pkg_version @@ -1,6 +1,7 @@ #!/bin/sh # # 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) +# 2013 Daniel Heule (hda at sfs.biz) # # This file is part of cdist. # @@ -18,7 +19,7 @@ # along with cdist. If not, see <http://www.gnu.org/licenses/>. # # -# Retrieve the status of a package +# Retrieve the status of a package off different types # if [ -f "$__object/parameter/name" ]; then @@ -27,4 +28,18 @@ else name="$__object_id" fi -rpm -q --whatprovides "$name" | grep -v 'no package provides' || true +if [ -f "$__object/parameter/ptype" ]; then + ptype="$(cat "$__object/parameter/ptype")" +else + ptype="package" +fi + +case "$ptype" in + package|patch|pattern|product|srcpackage) + zypper se --match-exact -i -t "$ptype" "$name" | grep -E '^i' | cut -d " " -f 3 || true + ;; + *) + echo "unknown type in __package_zypper explorer" &>2 + exit 1 + ;; +esac diff --git a/cdist/conf/type/__package_zypper/gencode-remote b/cdist/conf/type/__package_zypper/gencode-remote index d1766126..ef3bf029 100644 --- a/cdist/conf/type/__package_zypper/gencode-remote +++ b/cdist/conf/type/__package_zypper/gencode-remote @@ -1,6 +1,7 @@ #!/bin/sh # # 2012 Nico Schottelius (nico-cdist at schottelius.org) +# 2013 Daniel Heule (hda at sfs.biz) # # This file is part of cdist. # @@ -39,6 +40,12 @@ else state_should="present" fi +if [ -f "$__object/parameter/ptype" ]; then + ptype="$(cat "$__object/parameter/ptype")" +else + ptype="package" +fi + pkg_version="$(cat "$__object/explorer/pkg_version")" if [ -z "$pkg_version" ]; then state_is="absent" @@ -51,10 +58,10 @@ fi case "$state_should" in present) - echo zypper $globalopts install --auto-agree-with-licenses \"$name\" ">/dev/null" + echo zypper $globalopts install --type \"$ptype\" --auto-agree-with-licenses \"$name\" ">/dev/null" ;; absent) - echo zypper $globalopts remove \"$name\" ">/dev/null" + echo zypper $globalopts remove --type \"$ptype\" \"$name\" ">/dev/null" ;; *) echo "Unknown state: $state_should" >&2 diff --git a/cdist/conf/type/__package_zypper/man.text b/cdist/conf/type/__package_zypper/man.text index e2261d33..465b21be 100644 --- a/cdist/conf/type/__package_zypper/man.text +++ b/cdist/conf/type/__package_zypper/man.text @@ -26,6 +26,9 @@ name:: state:: Either "present" or "absent", defaults to "present" +ptype:: + Either "package", "patch", "pattern", "product" or "srcpackage", defaults to "package". For a description see man zypper. + EXAMPLES -------- @@ -39,6 +42,9 @@ __package_zypper python --state present --name python2 # Remove package __package_zypper cfengine --state absent + +# install all packages which belongs to pattern x11 +__package_zypper x11 --ptype pattern --state present -------------------------------------------------------------------------------- diff --git a/cdist/conf/type/__package_zypper/parameter/default/ptype b/cdist/conf/type/__package_zypper/parameter/default/ptype new file mode 100644 index 00000000..ba3bd787 --- /dev/null +++ b/cdist/conf/type/__package_zypper/parameter/default/ptype @@ -0,0 +1 @@ +package diff --git a/cdist/conf/type/__package_zypper/parameter/optional b/cdist/conf/type/__package_zypper/parameter/optional index 1b423dc4..b484bf07 100644 --- a/cdist/conf/type/__package_zypper/parameter/optional +++ b/cdist/conf/type/__package_zypper/parameter/optional @@ -1,2 +1,3 @@ name state +ptype From 0acf3c0118080369d73b7c0992fa68508df2619d Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 10 Dec 2013 17:25:03 +0100 Subject: [PATCH 34/93] type __postfix_postconf is tested and aproved to work on suse (SLES11) --- cdist/conf/type/__postfix_postconf/explorer/value | 2 +- cdist/conf/type/__postfix_postconf/gencode-remote | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__postfix_postconf/explorer/value b/cdist/conf/type/__postfix_postconf/explorer/value index edf48b48..e08c6da6 100755 --- a/cdist/conf/type/__postfix_postconf/explorer/value +++ b/cdist/conf/type/__postfix_postconf/explorer/value @@ -22,7 +22,7 @@ os=$("$__explorer/os") case "$os" in - ubuntu|debian|archlinux) + ubuntu|debian|archlinux|suse) : ;; *) diff --git a/cdist/conf/type/__postfix_postconf/gencode-remote b/cdist/conf/type/__postfix_postconf/gencode-remote index 60143590..43c0482e 100755 --- a/cdist/conf/type/__postfix_postconf/gencode-remote +++ b/cdist/conf/type/__postfix_postconf/gencode-remote @@ -21,7 +21,7 @@ os=$(cat "$__global/explorer/os") case "$os" in - ubuntu|debian|archlinux) + ubuntu|debian|archlinux|suse) : ;; *) From b2e39e3dc19f54320f72675ce0103cf31b2d1dda Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 10 Dec 2013 17:51:48 +0100 Subject: [PATCH 35/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 023d0749..06f70c84 100644 --- a/docs/changelog +++ b/docs/changelog @@ -13,6 +13,7 @@ Changelog * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) + * Type __postfix_postconf: Enable support for SuSE (Daniel Heule) * Type __cron: Add support for raw lines (Daniel Heule) * Type __key_value: Fix quoting issue (Steven Armstrong) From 01dc23b00c5a4814c5023ff9aa9d6441e54c89e9 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 11 Dec 2013 13:07:40 +0100 Subject: [PATCH 36/93] postfix install works also on suse (SLES11) --- cdist/conf/type/__postfix/manifest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdist/conf/type/__postfix/manifest b/cdist/conf/type/__postfix/manifest index 2dc70ce2..52a13919 100755 --- a/cdist/conf/type/__postfix/manifest +++ b/cdist/conf/type/__postfix/manifest @@ -22,7 +22,7 @@ os=$(cat "$__global/explorer/os") case "$os" in - ubuntu|debian|archlinux) + ubuntu|debian|archlinux|suse) __package postfix --state present ;; *) From 05262ffe390ede87d5b80fd36ea571866918692c Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 11 Dec 2013 13:42:12 +0100 Subject: [PATCH 37/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 06f70c84..75182f5f 100644 --- a/docs/changelog +++ b/docs/changelog @@ -14,6 +14,7 @@ Changelog * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) * Type __postfix_postconf: Enable support for SuSE (Daniel Heule) + * Type __postfix: Enable support for SuSE (Daniel Heule) * Type __cron: Add support for raw lines (Daniel Heule) * Type __key_value: Fix quoting issue (Steven Armstrong) From 785e54b3112e96f34ac026cec15385d22574bcc2 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 11 Dec 2013 13:44:01 +0100 Subject: [PATCH 38/93] =?UTF-8?q?vorbereitung=20um=20mit=20zypper=20auch?= =?UTF-8?q?=20spezifische=20versionen=20zu=20unterst=C3=BCtzen=20parameter?= =?UTF-8?q?=20ptype=20auch=20beim=20package=20type=20zulassen,=20analog=20?= =?UTF-8?q?anderer=20parameter=20von=20subtypes=20...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdist/conf/type/__package/parameter/optional | 1 + cdist/conf/type/__package_zypper/explorer/pkg_version | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cdist/conf/type/__package/parameter/optional b/cdist/conf/type/__package/parameter/optional index 9982507e..5a89ffc6 100644 --- a/cdist/conf/type/__package/parameter/optional +++ b/cdist/conf/type/__package/parameter/optional @@ -3,3 +3,4 @@ version type pkgsite state +pstate diff --git a/cdist/conf/type/__package_zypper/explorer/pkg_version b/cdist/conf/type/__package_zypper/explorer/pkg_version index 64fd64c0..aaa1da89 100644 --- a/cdist/conf/type/__package_zypper/explorer/pkg_version +++ b/cdist/conf/type/__package_zypper/explorer/pkg_version @@ -35,11 +35,14 @@ else fi case "$ptype" in - package|patch|pattern|product|srcpackage) - zypper se --match-exact -i -t "$ptype" "$name" | grep -E '^i' | cut -d " " -f 3 || true + package) + zypper search --details --match-exact --installed-only --type "$ptype" "$name" | grep -E '^i' | cut -d " " -f 3,7 || true + ;; + patch|pattern|product|srcpackage) + zypper search --match-exact --installed-only --type "$ptype" "$name" | grep -E '^i' | cut -d " " -f 3 || true ;; *) - echo "unknown type in __package_zypper explorer" &>2 + echo "unknown ptype in __package_zypper explorer" &>2 exit 1 ;; esac From 5d5b1fdc05411283098874651fceaa7fb7295ee8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 11 Dec 2013 14:43:05 +0100 Subject: [PATCH 39/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 75182f5f..ff480a93 100644 --- a/docs/changelog +++ b/docs/changelog @@ -17,6 +17,7 @@ Changelog * Type __postfix: Enable support for SuSE (Daniel Heule) * Type __cron: Add support for raw lines (Daniel Heule) * Type __key_value: Fix quoting issue (Steven Armstrong) + * Type __package_zypper: Support non packages as well (Daniel Heule) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From 4bb8dc2f5385ff86b12f4f6af60b09eb5ea78e9d Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 11 Dec 2013 14:43:35 +0100 Subject: [PATCH 40/93] 2012 -> 2013 Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- cdist/conf/type/__package_zypper/man.text | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdist/conf/type/__package_zypper/man.text b/cdist/conf/type/__package_zypper/man.text index 465b21be..b7cb5582 100644 --- a/cdist/conf/type/__package_zypper/man.text +++ b/cdist/conf/type/__package_zypper/man.text @@ -56,5 +56,5 @@ SEE ALSO COPYING ------- -Copyright \(C) 2012 Nico Schottelius. Free use of this software is +Copyright \(C) 2013 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). From aaa142d76b1e577be629e9ad669b7aa7cbde148b Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 11 Dec 2013 17:11:22 +0100 Subject: [PATCH 41/93] __package_zypper can now handle the version parameter --- .../__package_zypper/explorer/pkg_version | 2 +- .../conf/type/__package_zypper/gencode-remote | 53 ++++++++++++------- cdist/conf/type/__package_zypper/man.text | 17 ++++-- .../type/__package_zypper/parameter/optional | 1 + 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/cdist/conf/type/__package_zypper/explorer/pkg_version b/cdist/conf/type/__package_zypper/explorer/pkg_version index aaa1da89..7f203067 100644 --- a/cdist/conf/type/__package_zypper/explorer/pkg_version +++ b/cdist/conf/type/__package_zypper/explorer/pkg_version @@ -19,7 +19,7 @@ # along with cdist. If not, see <http://www.gnu.org/licenses/>. # # -# Retrieve the status of a package off different types +# Retrieve the status of a package of different types # if [ -f "$__object/parameter/name" ]; then diff --git a/cdist/conf/type/__package_zypper/gencode-remote b/cdist/conf/type/__package_zypper/gencode-remote index ef3bf029..51713590 100644 --- a/cdist/conf/type/__package_zypper/gencode-remote +++ b/cdist/conf/type/__package_zypper/gencode-remote @@ -29,42 +29,59 @@ globalopts="--quiet --non-interactive" if [ -f "$__object/parameter/name" ]; then - name="$__object/parameter/name" + name="$__object/parameter/name" else - name="$__object_id" + name="$__object_id" fi if [ -f "$__object/parameter/state" ]; then - state_should="$(cat "$__object/parameter/state")" + state_should="$(cat "$__object/parameter/state")" else - state_should="present" + state_should="present" fi if [ -f "$__object/parameter/ptype" ]; then - ptype="$(cat "$__object/parameter/ptype")" + ptype="$(cat "$__object/parameter/ptype")" else - ptype="package" + ptype="package" +fi + +if [ -f "$__object/parameter/version" ]; then + version_should="$(cat "$__object/parameter/version")" + if [ "$ptype" != "package" ]; then + echo "version support only for type package implemented" >&2 + exit 2 + fi +else + version_should="" fi pkg_version="$(cat "$__object/explorer/pkg_version")" if [ -z "$pkg_version" ]; then state_is="absent" + version_is="" else state_is="present" + version_is=${pkg_version##* } fi -# Exit if nothing is needed to be done -[ "$state_is" = "$state_should" ] && exit 0 case "$state_should" in - present) - echo zypper $globalopts install --type \"$ptype\" --auto-agree-with-licenses \"$name\" ">/dev/null" - ;; - absent) - echo zypper $globalopts remove --type \"$ptype\" \"$name\" ">/dev/null" - ;; - *) - echo "Unknown state: $state_should" >&2 - exit 1 - ;; + present) + if [ -z "$version_should" ]; then + [ "$state_is" = "present" ] && exit 0 # if state is present, we dont need to do anything + echo zypper $globalopts install --type \"$ptype\" --auto-agree-with-licenses \"$name\" ">/dev/null" + else + [ "$state_is" = "present" ] && [ "$version_should" = "$version_is" ] && exit 0 # if state is present and version is correct, we dont need to do anything + echo zypper $globalopts install --oldpackage --type \"$ptype\" --auto-agree-with-licenses \"$name\" = \"$version_should\" ">/dev/null" + fi + ;; + absent) + [ "$state_is" = "absent" ] && exit 0 # if state is absent, we dont need to do anything + echo zypper $globalopts remove --type \"$ptype\" \"$name\" ">/dev/null" + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; esac diff --git a/cdist/conf/type/__package_zypper/man.text b/cdist/conf/type/__package_zypper/man.text index 465b21be..21c5c5bb 100644 --- a/cdist/conf/type/__package_zypper/man.text +++ b/cdist/conf/type/__package_zypper/man.text @@ -1,6 +1,6 @@ cdist-type__package_zypper(7) ============================= -Nico Schottelius <nico-cdist--@--schottelius.org> +Daniel Heule <hda--@--sfs.biz> NAME @@ -26,6 +26,11 @@ name:: state:: Either "present" or "absent", defaults to "present" +version:: + The version of the package to install. Default is to install the version + choosen by the local package manager. For a list of version have a look to + the output of "zypper se -s packagename" + ptype:: Either "package", "patch", "pattern", "product" or "srcpackage", defaults to "package". For a description see man zypper. @@ -34,12 +39,15 @@ EXAMPLES -------- -------------------------------------------------------------------------------- -# Ensure zsh in installed +# Ensure zsh is installed __package_zypper zsh --state present # If you don't want to follow pythonX packages, but always use python __package_zypper python --state present --name python2 +# Ensure binutils is installed and the version is forced to be 2.23.1-0.19.2 +__package_zypper binutils --state present --version 2.23.1-0.19.2 + # Remove package __package_zypper cfengine --state absent @@ -56,5 +64,6 @@ SEE ALSO COPYING ------- -Copyright \(C) 2012 Nico Schottelius. Free use of this software is -granted under the terms of the GNU General Public License version 3 (GPLv3). +Copyright \(C) 2012 Nico Schottelius. +Copyright \(C) 2013 Daniel Heule. +Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/cdist/conf/type/__package_zypper/parameter/optional b/cdist/conf/type/__package_zypper/parameter/optional index b484bf07..bc8565fc 100644 --- a/cdist/conf/type/__package_zypper/parameter/optional +++ b/cdist/conf/type/__package_zypper/parameter/optional @@ -1,3 +1,4 @@ name state ptype +version From b12bd82fe21259be88cb310523afe30a2fded300 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 12 Dec 2013 09:29:22 +0100 Subject: [PATCH 42/93] corrected some minor spell misstakes --- cdist/conf/type/__package_zypper/man.text | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__package_zypper/man.text b/cdist/conf/type/__package_zypper/man.text index 21c5c5bb..104d3a7a 100644 --- a/cdist/conf/type/__package_zypper/man.text +++ b/cdist/conf/type/__package_zypper/man.text @@ -28,8 +28,8 @@ state:: version:: The version of the package to install. Default is to install the version - choosen by the local package manager. For a list of version have a look to - the output of "zypper se -s packagename" + choosen by the local package manager. For a list of available versions, + have a look at the output of "zypper se -s packagename" ptype:: Either "package", "patch", "pattern", "product" or "srcpackage", defaults to "package". For a description see man zypper. From fc8543eab6e32e2fcf9898108447cbf0b6b955b4 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 12 Dec 2013 10:56:15 +0100 Subject: [PATCH 43/93] initial submit of __package_emerge type --- .../__package_emerge/explorer/pkg_version | 35 +++++++++ .../conf/type/__package_emerge/gencode-remote | 72 +++++++++++++++++++ cdist/conf/type/__package_emerge/man.text | 60 ++++++++++++++++ .../type/__package_emerge/parameter/optional | 3 + 4 files changed, 170 insertions(+) create mode 100644 cdist/conf/type/__package_emerge/explorer/pkg_version create mode 100644 cdist/conf/type/__package_emerge/gencode-remote create mode 100644 cdist/conf/type/__package_emerge/man.text create mode 100644 cdist/conf/type/__package_emerge/parameter/optional diff --git a/cdist/conf/type/__package_emerge/explorer/pkg_version b/cdist/conf/type/__package_emerge/explorer/pkg_version new file mode 100644 index 00000000..7053eaff --- /dev/null +++ b/cdist/conf/type/__package_emerge/explorer/pkg_version @@ -0,0 +1,35 @@ +#!/bin/sh +# +# 2013 Thomas Oettli (otho at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Retrieve the status of a package +# + +if [ ! -x /usr/bin/equery ]; then + echo "gentoolkit not installed!" 1>&2 + exit 1 +fi + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +equery -q l -F '$cp $fullversion' "$name" || true diff --git a/cdist/conf/type/__package_emerge/gencode-remote b/cdist/conf/type/__package_emerge/gencode-remote new file mode 100644 index 00000000..d4cee37e --- /dev/null +++ b/cdist/conf/type/__package_emerge/gencode-remote @@ -0,0 +1,72 @@ +#!/bin/sh +# +# 2013 Thomas Oettli (otho at sfs.biz) +# +# 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 <http://www.gnu.org/licenses/>. +# +# +# Manage packages with Portage (mostly gentoo) +# + +if [ -f "$__object/parameter/name" ]; then + name="$__object/parameter/name" +else + name="$__object_id" +fi + +if [ -f "$__object/parameter/state" ]; then + state_should="$(cat "$__object/parameter/state")" +else + state_should="present" +fi + +pkg_version="$(cat "$__object/explorer/pkg_version")" +if [ -z "$pkg_version" ]; then + state_is="absent" +elif [ $(echo "$pkg_version" | wc -l) -gt 1 ]; then + echo "Package name is not unique! The following packages are installed:" + echo "$pkg_version" + exit 1 +else + state_is="present" + installed_version="$(echo "$pkg_version" | cut -d " " -f 2)" +fi + +if [ -f "$__object/parameter/version" ]; then + version="$(cat "$__object/parameter/version")" + if [ ! -z "$version" ]; then + name="=$name-$version" + fi +else + version="" +fi + +# Exit if nothing is needed to be done +[ "$state_is" = "$state_should" ] && ( [ -z "$version" ] || [ "$installed_version" = "$version" ] ) && exit 0 +[ "$state_should" = "absent" ] && [ ! -z "$version" ] && [ "$installed_version" != "$version" ] && exit 0 + +case "$state_should" in + present) + echo "emerge \"$name\" &>/dev/null || exit 1" + ;; + absent) + echo "emerge -C \"$name\" &>/dev/null || exit 1" + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; +esac diff --git a/cdist/conf/type/__package_emerge/man.text b/cdist/conf/type/__package_emerge/man.text new file mode 100644 index 00000000..983b49a8 --- /dev/null +++ b/cdist/conf/type/__package_emerge/man.text @@ -0,0 +1,60 @@ +cdist-type__package_emerge(7) +============================= +Thomas Oettli <otho--@--sfs.biz> + + +NAME +---- +cdist-type__package_emerge - Manage packages with portage + + +DESCRIPTION +----------- +Portage is usually used on the gentoo distribution to manage packages. +This type requires app-portage/gentoolkit installed on the target host. +cdist-type__package_emerge_dependencies is supposed to install the needed +packages on the target host. + + +REQUIRED PARAMETERS +------------------- +None + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + +state:: + Either "present" or "absent", defaults to "present". + +version:: + If supplied, use to install or uninstall a specific version of the package named. + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure sys-devel/gcc is installed +__package_emerge sys-devel/gcc --state present + +# If you want a specific version of a package +__package_emerge app-portage/gentoolkit --state present --version 0.3.0.8-r2 + +# Remove package +__package_emerge sys-devel/gcc --state absent +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) +- cdist-type__package_emerge_dependencies(7) + + +COPYING +------- +Copyright \(C) 2013 Thomas Oettli. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/cdist/conf/type/__package_emerge/parameter/optional b/cdist/conf/type/__package_emerge/parameter/optional new file mode 100644 index 00000000..f5c897df --- /dev/null +++ b/cdist/conf/type/__package_emerge/parameter/optional @@ -0,0 +1,3 @@ +name +state +version From c48f31389f4e739615dca8194d50ab2c153e2b17 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 12 Dec 2013 10:59:45 +0100 Subject: [PATCH 44/93] initial submit of type __package_emerge_dependencies --- .../explorer/flaggie_installed | 7 +++ .../explorer/gentoolkit_installed | 7 +++ .../gencode-remote | 15 ++++++ .../__package_emerge_dependencies/man.text | 48 +++++++++++++++++++ .../__package_emerge_dependencies/singleton | 0 5 files changed, 77 insertions(+) create mode 100644 cdist/conf/type/__package_emerge_dependencies/explorer/flaggie_installed create mode 100644 cdist/conf/type/__package_emerge_dependencies/explorer/gentoolkit_installed create mode 100644 cdist/conf/type/__package_emerge_dependencies/gencode-remote create mode 100644 cdist/conf/type/__package_emerge_dependencies/man.text create mode 100644 cdist/conf/type/__package_emerge_dependencies/singleton diff --git a/cdist/conf/type/__package_emerge_dependencies/explorer/flaggie_installed b/cdist/conf/type/__package_emerge_dependencies/explorer/flaggie_installed new file mode 100644 index 00000000..1652ffc3 --- /dev/null +++ b/cdist/conf/type/__package_emerge_dependencies/explorer/flaggie_installed @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ -x /usr/bin/flaggie ]; then + echo "true" +else + echo "false" +fi diff --git a/cdist/conf/type/__package_emerge_dependencies/explorer/gentoolkit_installed b/cdist/conf/type/__package_emerge_dependencies/explorer/gentoolkit_installed new file mode 100644 index 00000000..74c2378d --- /dev/null +++ b/cdist/conf/type/__package_emerge_dependencies/explorer/gentoolkit_installed @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ -x /usr/bin/q ]; then + echo "true" +else + echo "false" +fi diff --git a/cdist/conf/type/__package_emerge_dependencies/gencode-remote b/cdist/conf/type/__package_emerge_dependencies/gencode-remote new file mode 100644 index 00000000..0c84e53d --- /dev/null +++ b/cdist/conf/type/__package_emerge_dependencies/gencode-remote @@ -0,0 +1,15 @@ +#!/bin/sh + +gentoolkit_installed="$(cat "$__object/explorer/gentoolkit_installed")" +flaggie_installed="$(cat "$__object/explorer/flaggie_installed")" + +if [ "${gentoolkit_installed}" != "true" ]; then + # emerge app-portage/gentoolkit + echo "emerge app-portage/gentoolkit &> /dev/null || exit 1" +fi + +if [ "${flaggie_installed}" != "true" ]; then + # emerge app-portage/flaggie + echo "emerge app-portage/flaggie &> /dev/null || exit 1" +fi + diff --git a/cdist/conf/type/__package_emerge_dependencies/man.text b/cdist/conf/type/__package_emerge_dependencies/man.text new file mode 100644 index 00000000..0862256b --- /dev/null +++ b/cdist/conf/type/__package_emerge_dependencies/man.text @@ -0,0 +1,48 @@ +cdist-type__package_emerge_dependencies(7) +========================================== +Thomas Oettli <otho--@--sfs.biz> + + +NAME +---- +cdist-type__package_emerge_dependencies - Install dependencies for __package_emerge + + +DESCRIPTION +----------- +Portage is usually used on the gentoo distribution to manage packages. +This type installs the following tools which are required by __package_emerge to work: +app-portage/flaggie +app-portage/gentoolkit + + +REQUIRED PARAMETERS +------------------- +None + + +OPTIONAL PARAMETERS +------------------- +None + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure app-portage/flaggie and app-portage/gentoolkit are installed +__package_emerge_dependencies +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) +- cdist-type__package_emerge(7) + + +COPYING +------- +Copyright \(C) 2013 Thomas Oettli. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/cdist/conf/type/__package_emerge_dependencies/singleton b/cdist/conf/type/__package_emerge_dependencies/singleton new file mode 100644 index 00000000..e69de29b From 8749ce61783359944adb4c291746d0c823509c23 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Thu, 12 Dec 2013 18:04:49 +0100 Subject: [PATCH 45/93] +begin of discussion with steven Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/dev/logs/2013-12-12.discussion | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/dev/logs/2013-12-12.discussion diff --git a/docs/dev/logs/2013-12-12.discussion b/docs/dev/logs/2013-12-12.discussion new file mode 100644 index 00000000..58d25517 --- /dev/null +++ b/docs/dev/logs/2013-12-12.discussion @@ -0,0 +1,6 @@ +With Steven + +- Implement environments + - for configuring "anything" including switches + - can disable / use other global explorers +- 98% of our framework is generic and can be used for any applikation From 976ce8c44ee198e0426dc8e1ff3eb79ff3d7a7ba Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 13 Dec 2013 11:42:12 +0100 Subject: [PATCH 46/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index ff480a93..8aebcc3f 100644 --- a/docs/changelog +++ b/docs/changelog @@ -18,6 +18,7 @@ Changelog * Type __cron: Add support for raw lines (Daniel Heule) * Type __key_value: Fix quoting issue (Steven Armstrong) * Type __package_zypper: Support non packages as well (Daniel Heule) + * Type __package_zypper: Support package versions (Daniel Heule) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From f165b5611e83745e2febb05dc916e9db948901a4 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 13 Dec 2013 14:33:22 +0100 Subject: [PATCH 47/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog b/docs/changelog index 8aebcc3f..a8fe33b4 100644 --- a/docs/changelog +++ b/docs/changelog @@ -10,6 +10,8 @@ Changelog * Core: Removed unused "changed" attribute of objects * New Type: __zypper_repo (Daniel Heule) * New Type: __zypper_service (Daniel Heule) + * New Type: __package_emerge (Daniel Heule) + * New Type: __package_emerge_dependencies (Daniel Heule) * Type: __iptables_rule: Use default parameter * Type __file: Do not generate code if mode is 0xxx * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) From 14dee79a9ba1149a05aea097025ab4fb57f8a54f Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Mon, 16 Dec 2013 13:29:43 +0100 Subject: [PATCH 48/93] handle parameter --state explicilty to respect defaults Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/conf/type/__package/manifest | 8 +++++--- cdist/conf/type/__package/parameter/default/state | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 cdist/conf/type/__package/parameter/default/state diff --git a/cdist/conf/type/__package/manifest b/cdist/conf/type/__package/manifest index 6a84cb7f..0ebf0099 100755 --- a/cdist/conf/type/__package/manifest +++ b/cdist/conf/type/__package/manifest @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011 Steven Armstrong (steven-cdist at armstrong.cc) +# 2011-2013 Steven Armstrong (steven-cdist at armstrong.cc) # # This file is part of cdist. # @@ -44,10 +44,12 @@ else esac fi -set -- "$@" "$__object_id" +state="$(cat "$__object/parameter/state")" + +set -- "$@" "$__object_id" "--state" "$state" cd "$__object/parameter" for property in $(ls .); do - if [ "$property" != "type" ]; then + if [ "$property" != "type" -a "$property" != "state" ]; then set -- "$@" "--$property" "$(cat "$property")" fi done diff --git a/cdist/conf/type/__package/parameter/default/state b/cdist/conf/type/__package/parameter/default/state new file mode 100644 index 00000000..e7f6134f --- /dev/null +++ b/cdist/conf/type/__package/parameter/default/state @@ -0,0 +1 @@ +present From aec163262741d9427057e0caeff3e0d6e16c7ef7 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Mon, 16 Dec 2013 16:19:27 +0100 Subject: [PATCH 49/93] on older systems, zypper service and zypper repos doesn't know the parameter -E, so we need a way which works on older releases too --- cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids | 4 +++- cdist/conf/type/__zypper_service/explorer/repo_ids | 5 ++++- cdist/conf/type/__zypper_service/explorer/service_id | 4 +++- cdist/conf/type/__zypper_service/explorer/service_ids | 4 +++- cdist/conf/type/__zypper_service/explorer/service_uri | 4 +++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids b/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids index a0d092b1..2dfb946f 100644 --- a/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids +++ b/cdist/conf/type/__zypper_repo/explorer/enabled_repo_ids @@ -21,4 +21,6 @@ # Retrieve all repo id nummbers from enabled repos - parsed zypper output # # -echo $(zypper lr -E | cut -d'|' -f 1 | grep -E '^[0-9]') +# simpler command which works only on SLES11 SP3 or newer: +# echo $(zypper lr -E | cut -d'|' -f 1 | grep -E '^[0-9]') +echo $(zypper lr | grep -E '^[0-9]([^|]+\|){3,3} Yes' | cut -d'|' -f 1) diff --git a/cdist/conf/type/__zypper_service/explorer/repo_ids b/cdist/conf/type/__zypper_service/explorer/repo_ids index 8c32b40b..e831b76c 100644 --- a/cdist/conf/type/__zypper_service/explorer/repo_ids +++ b/cdist/conf/type/__zypper_service/explorer/repo_ids @@ -21,4 +21,7 @@ # Manage services with Zypper (mostly suse) # # -echo $(zypper lr -u -E | cut -d'|' -f 1 | grep -E '^[0-9]') +# simpler command which works only on SLES11 SP3 or newer: +# echo $(zypper lr -u -E | cut -d'|' -f 1 | grep -E '^[0-9]') +# on older systems, zypper doesn't know the parameter -E +echo $(zypper lr -u | grep -E '^([^|]+\|){3,3} Yes' | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_service/explorer/service_id b/cdist/conf/type/__zypper_service/explorer/service_id index b473340c..9c3d3a2d 100644 --- a/cdist/conf/type/__zypper_service/explorer/service_id +++ b/cdist/conf/type/__zypper_service/explorer/service_id @@ -25,4 +25,6 @@ if [ -f "$__object/parameter/service_uri" ]; then else uri="/$__object_id" fi -echo $(zypper ls -u -E | grep -E "\<$uri\>" | cut -d'|' -f 1 ) +# simpler command which works only on SLES11 SP3 or newer: +# echo $(zypper ls -u -E | grep -E "\<$uri\>" | cut -d'|' -f 1 ) +echo $(zypper ls -u | grep -E '^([^|]+\|){3,3} Yes' | grep -E "\<$uri\>" | cut -d'|' -f 1 ) diff --git a/cdist/conf/type/__zypper_service/explorer/service_ids b/cdist/conf/type/__zypper_service/explorer/service_ids index 460b2006..0f1f4186 100644 --- a/cdist/conf/type/__zypper_service/explorer/service_ids +++ b/cdist/conf/type/__zypper_service/explorer/service_ids @@ -20,4 +20,6 @@ # # Manage services with Zypper (mostly suse) # -echo $(zypper ls -u -E | cut -d'|' -f 1 | grep -E '^[0-9]') +# simpler command which works only on SLES11 SP3 or newer: +# echo $(zypper ls -u -E | cut -d'|' -f 1 | grep -E '^[0-9]') +echo $(zypper ls -u | grep -E '^([^|]+\|){3,3} Yes' | cut -d'|' -f 1 | grep -E '^[0-9]') diff --git a/cdist/conf/type/__zypper_service/explorer/service_uri b/cdist/conf/type/__zypper_service/explorer/service_uri index aec93cb2..2f4f8960 100644 --- a/cdist/conf/type/__zypper_service/explorer/service_uri +++ b/cdist/conf/type/__zypper_service/explorer/service_uri @@ -25,4 +25,6 @@ if [ -f "$__object/parameter/service_uri" ]; then else uri="/$__object_id" fi -echo $(zypper ls -u -E | grep -E "\<$uri\>" | cut -d'|' -f 7 ) +# simpler command which works only on SLES11 SP3 or newer: +# echo $(zypper ls -u -E | grep -E "\<$uri\>" | cut -d'|' -f 7) +echo $(zypper ls -u | grep -E '^([^|]+\|){3,3} Yes' | grep -E "\<$uri\>" | cut -d'|' -f 7 ) From a70d478f9e6b26d86f51615e2087ad4df854e79f Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Mon, 16 Dec 2013 17:07:49 +0100 Subject: [PATCH 50/93] fixed a minor type with param remove-all-other-services --- cdist/conf/type/__zypper_service/man.text | 4 ++-- cdist/conf/type/__zypper_service/parameter/boolean | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cdist/conf/type/__zypper_service/man.text b/cdist/conf/type/__zypper_service/man.text index b1717c96..31543d93 100644 --- a/cdist/conf/type/__zypper_service/man.text +++ b/cdist/conf/type/__zypper_service/man.text @@ -33,7 +33,7 @@ type:: BOOLEAN PARAMETERS ------------------ -remove-all-other-service:: +remove-all-other-services:: Drop all other services found on the target host before adding the new one. remove-all-repos:: @@ -45,7 +45,7 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure that internal SLES11 SP3 RIS is in installed and all other services and repos are discarded -__zypper_service INTERNAL_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" --remove-all-other-service --remove-all-repos +__zypper_service INTERNAL_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" --remove-all-other-services --remove-all-repos # Ensure that internal SLES11 SP3 RIS is in installed, no changes to ohter services or repos __zypper_service INTERNAL_SLES11_SP3 --service_desc "Internal SLES11 SP3 RIS" --service_uri "http://path/to/your/ris/dir" diff --git a/cdist/conf/type/__zypper_service/parameter/boolean b/cdist/conf/type/__zypper_service/parameter/boolean index bc6a5629..ca711ded 100644 --- a/cdist/conf/type/__zypper_service/parameter/boolean +++ b/cdist/conf/type/__zypper_service/parameter/boolean @@ -1,2 +1,2 @@ -remove-all-other-service +remove-all-other-services remove-all-repos From 138d26e398ae333db032adad78ac608426c2d7e0 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 17 Dec 2013 14:13:20 +0100 Subject: [PATCH 51/93] extended type __user: parameter state, system, remove-home new --- cdist/conf/type/__user/TODO | 2 - cdist/conf/type/__user/explorer/group | 0 cdist/conf/type/__user/explorer/passwd | 0 cdist/conf/type/__user/explorer/shadow | 0 cdist/conf/type/__user/gencode-remote | 153 ++++++++++-------- cdist/conf/type/__user/man.text | 28 +++- cdist/conf/type/__user/parameter/boolean | 2 + .../conf/type/__user/parameter/default/state | 1 + cdist/conf/type/__user/parameter/optional | 1 + 9 files changed, 113 insertions(+), 74 deletions(-) delete mode 100644 cdist/conf/type/__user/TODO mode change 100755 => 100644 cdist/conf/type/__user/explorer/group mode change 100755 => 100644 cdist/conf/type/__user/explorer/passwd mode change 100755 => 100644 cdist/conf/type/__user/explorer/shadow mode change 100755 => 100644 cdist/conf/type/__user/gencode-remote create mode 100644 cdist/conf/type/__user/parameter/default/state diff --git a/cdist/conf/type/__user/TODO b/cdist/conf/type/__user/TODO deleted file mode 100644 index fa6aeee7..00000000 --- a/cdist/conf/type/__user/TODO +++ /dev/null @@ -1,2 +0,0 @@ -- delete users - diff --git a/cdist/conf/type/__user/explorer/group b/cdist/conf/type/__user/explorer/group old mode 100755 new mode 100644 diff --git a/cdist/conf/type/__user/explorer/passwd b/cdist/conf/type/__user/explorer/passwd old mode 100755 new mode 100644 diff --git a/cdist/conf/type/__user/explorer/shadow b/cdist/conf/type/__user/explorer/shadow old mode 100755 new mode 100644 diff --git a/cdist/conf/type/__user/gencode-remote b/cdist/conf/type/__user/gencode-remote old mode 100755 new mode 100644 index a2cdfd22..de559435 --- a/cdist/conf/type/__user/gencode-remote +++ b/cdist/conf/type/__user/gencode-remote @@ -2,6 +2,7 @@ # # 2011 Steven Armstrong (steven-cdist at armstrong.cc) # 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2013 Daniel Heule (hda at sfs.biz) # # This file is part of cdist. # @@ -21,11 +22,14 @@ # # Manage users. # +#set -x name="$__object_id" os="$(cat "$__global/explorer/os")" +state=$(cat "$__object/parameter/state") + # We need to shorten options for both usermod and useradd since on some # systems (such as *BSD, Darwin) those commands do not handle GNU style long # options. @@ -40,80 +44,97 @@ shorten_property() { shell) ret="-s";; uid) ret="-u";; create-home) ret="-m";; + system) ret="-r";; esac echo "$ret" } -cd "$__object/parameter" -if grep -q "^${name}:" "$__object/explorer/passwd"; then - for property in $(ls .); do - new_value="$(cat "$property")" - unset current_value +if [ "$state" = "present" ]; then + cd "$__object/parameter" + if grep -q "^${name}:" "$__object/explorer/passwd"; then + for property in $(ls .); do + new_value="$(cat "$property")" + unset current_value - file="$__object/explorer/passwd" + file="$__object/explorer/passwd" - case "$property" in - gid) - if $(echo "$new_value" | grep -q '^[0-9][0-9]*$'); then - field=4 + case "$property" in + gid) + if $(echo "$new_value" | grep -q '^[0-9][0-9]*$'); then + field=4 + else + # We were passed a group name. Compare the gid in + # the user's /etc/passwd entry with the gid of the + # group returned by the group explorer. + gid_from_group=$(awk -F: '{ print $3 }' "$__object/explorer/group") + gid_from_passwd=$(awk -F: '{ print $4 }' "$file") + if [ "$gid_from_group" != "$gid_from_passwd" ]; then + current_value="$gid_from_passwd" + else + current_value="$new_value" + fi + fi + ;; + password) + field=2 + file="$__object/explorer/shadow" + ;; + comment) field=5 ;; + home) field=6 ;; + shell) field=7 ;; + uid) field=3 ;; + create-home) continue;; # Does not apply to user modification + system) continue;; # Does not apply to user modification + state) continue;; # Does not apply to user modification + remove-home) continue;; # Does not apply to user modification + esac + + # If we haven't already set $current_value above, pull it from the + # appropriate file/field. + if [ -z "$current_value" ]; then + export field + current_value="$(awk -F: '{ print $ENVIRON["field"] }' < "$file")" + fi + + if [ "$new_value" != "$current_value" ]; then + set -- "$@" "$(shorten_property $property)" \'$new_value\' + fi + done + + if [ $# -gt 0 ]; then + if [ "$os" = "freebsd" ]; then + echo pw usermod "$@" "$name" + else + echo usermod "$@" "$name" + fi + else + true + fi + else + for property in $(ls .); do + [ "$property" = "state" ] && continue + [ "$property" = "remove-home" ] && continue + new_value="$(cat "$property")" + if [ -z "$new_value" ];then # Boolean values have no value + set -- "$@" "$(shorten_property $property)" else - # We were passed a group name. Compare the gid in - # the user's /etc/passwd entry with the gid of the - # group returned by the group explorer. - gid_from_group=$(awk -F: '{ print $3 }' "$__object/explorer/group") - gid_from_passwd=$(awk -F: '{ print $4 }' "$file") - if [ "$gid_from_group" != "$gid_from_passwd" ]; then - current_value="$gid_from_passwd" - else - current_value="$new_value" - fi + set -- "$@" "$(shorten_property $property)" \'$new_value\' fi - ;; - password) - field=2 - file="$__object/explorer/shadow" - ;; - comment) field=5 ;; - home) field=6 ;; - shell) field=7 ;; - uid) field=3 ;; - create-home) continue;; # Does not apply to user modification - esac + done - # If we haven't already set $current_value above, pull it from the - # appropriate file/field. - if [ -z "$current_value" ]; then - export field - current_value="$(awk -F: '{ print $ENVIRON["field"] }' < "$file")" - fi - - if [ "$new_value" != "$current_value" ]; then - set -- "$@" "$(shorten_property $property)" \'$new_value\' - fi - done - - if [ $# -gt 0 ]; then - if [ "$os" = "freebsd" ]; then - echo pw usermod "$@" "$name" - else - echo usermod "$@" "$name" - fi - else - true - fi + if [ "$os" = "freebsd" ]; then + echo pw useradd "$@" "$name" + else + echo useradd "$@" "$name" + fi + fi else - for property in $(ls .); do - new_value="$(cat "$property")" - if [ -z "$new_value" ];then # Boolean values have no value - set -- "$@" "$(shorten_property $property)" - else - set -- "$@" "$(shorten_property $property)" \'$new_value\' - fi - done - - if [ "$os" = "freebsd" ]; then - echo pw useradd "$@" "$name" - else - echo useradd "$@" "$name" - fi + if grep -q "^${name}:" "$__object/explorer/passwd"; then + #user exists, but state != present, so delete it + if [ -f "$__object/parameter/remove-home" ]; then + echo userdel -r "${name}" + else + echo userdel "${name}" + fi + fi fi diff --git a/cdist/conf/type/__user/man.text b/cdist/conf/type/__user/man.text index 9db4a9f0..2536c1bc 100644 --- a/cdist/conf/type/__user/man.text +++ b/cdist/conf/type/__user/man.text @@ -20,19 +20,29 @@ None. OPTIONAL PARAMETERS ------------------- +state:: + absent or present, defaults to present comment:: - see usermod(8) + see usermod(8) home:: - see above + see above gid:: - see above + see above password:: - see above + see above shell:: - see above + see above uid:: - see above + see above +system:: + see above +BOOLEAN PARAMETERS +------------------ +create-home:: + see useradd(8), apply only on user create +remove-home:: + see userdel(8), apply only on user delete EXAMPLES -------- @@ -44,8 +54,14 @@ __user foobar # Same but with a different shell __user foobar --shell /bin/zsh +# Same but for a system account +__user foobar --system + # Set explicit uid and home __user foobar --uid 1001 --shell /bin/zsh --home /home/foobar + +# Drop user if exists +__user foobar --state absent -------------------------------------------------------------------------------- diff --git a/cdist/conf/type/__user/parameter/boolean b/cdist/conf/type/__user/parameter/boolean index e0517c6a..83afdebe 100644 --- a/cdist/conf/type/__user/parameter/boolean +++ b/cdist/conf/type/__user/parameter/boolean @@ -1 +1,3 @@ create-home +remove-home +system diff --git a/cdist/conf/type/__user/parameter/default/state b/cdist/conf/type/__user/parameter/default/state new file mode 100644 index 00000000..e7f6134f --- /dev/null +++ b/cdist/conf/type/__user/parameter/default/state @@ -0,0 +1 @@ +present diff --git a/cdist/conf/type/__user/parameter/optional b/cdist/conf/type/__user/parameter/optional index e3cf52d5..de6c3838 100644 --- a/cdist/conf/type/__user/parameter/optional +++ b/cdist/conf/type/__user/parameter/optional @@ -1,3 +1,4 @@ +state comment home gid From 7d4c11a1860ffc6ef63c897264a19d9fc70507d7 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 17 Dec 2013 14:15:41 +0100 Subject: [PATCH 52/93] reset false mode changes --- cdist/conf/type/__user/explorer/group | 0 cdist/conf/type/__user/explorer/passwd | 0 cdist/conf/type/__user/explorer/shadow | 0 cdist/conf/type/__user/gencode-remote | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 cdist/conf/type/__user/explorer/group mode change 100644 => 100755 cdist/conf/type/__user/explorer/passwd mode change 100644 => 100755 cdist/conf/type/__user/explorer/shadow mode change 100644 => 100755 cdist/conf/type/__user/gencode-remote diff --git a/cdist/conf/type/__user/explorer/group b/cdist/conf/type/__user/explorer/group old mode 100644 new mode 100755 diff --git a/cdist/conf/type/__user/explorer/passwd b/cdist/conf/type/__user/explorer/passwd old mode 100644 new mode 100755 diff --git a/cdist/conf/type/__user/explorer/shadow b/cdist/conf/type/__user/explorer/shadow old mode 100644 new mode 100755 diff --git a/cdist/conf/type/__user/gencode-remote b/cdist/conf/type/__user/gencode-remote old mode 100644 new mode 100755 From 87336f9b4f3e7f7ed7967bd69342fe466a626ebe Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 18 Dec 2013 17:20:30 +0100 Subject: [PATCH 53/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index a8fe33b4..0a6ba0a1 100644 --- a/docs/changelog +++ b/docs/changelog @@ -21,6 +21,7 @@ Changelog * Type __key_value: Fix quoting issue (Steven Armstrong) * Type __package_zypper: Support non packages as well (Daniel Heule) * Type __package_zypper: Support package versions (Daniel Heule) + * Type __package: Use state --present by default (Steven Armstrong) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From 122fb9665411d16ad2b2207d10435d58574d3cd8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 18 Dec 2013 18:09:57 +0100 Subject: [PATCH 54/93] use default parameter for __start_on_boot type Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- cdist/conf/type/__start_on_boot/gencode-remote | 2 +- cdist/conf/type/__start_on_boot/parameter/default/state | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 cdist/conf/type/__start_on_boot/parameter/default/state diff --git a/cdist/conf/type/__start_on_boot/gencode-remote b/cdist/conf/type/__start_on_boot/gencode-remote index 58ff6a4a..a8abebbc 100755 --- a/cdist/conf/type/__start_on_boot/gencode-remote +++ b/cdist/conf/type/__start_on_boot/gencode-remote @@ -19,7 +19,7 @@ # # -state_should="$(cat "$__object/parameter/state" 2>/dev/null || echo present)" +state_should="$(cat "$__object/parameter/state")" state_is=$(cat "$__object/explorer/state") # Short circuit if nothing is to be done diff --git a/cdist/conf/type/__start_on_boot/parameter/default/state b/cdist/conf/type/__start_on_boot/parameter/default/state new file mode 100644 index 00000000..e7f6134f --- /dev/null +++ b/cdist/conf/type/__start_on_boot/parameter/default/state @@ -0,0 +1 @@ +present From 7d46156fd6becff0d70154ac678d3142d9bf93f9 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 18 Dec 2013 18:13:32 +0100 Subject: [PATCH 55/93] changes for __start_on_boot Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 0a6ba0a1..a8a686dd 100644 --- a/docs/changelog +++ b/docs/changelog @@ -22,6 +22,7 @@ Changelog * Type __package_zypper: Support non packages as well (Daniel Heule) * Type __package_zypper: Support package versions (Daniel Heule) * Type __package: Use state --present by default (Steven Armstrong) + * Type __start_on_boot: Use default parameter state 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From e5253e0330c2e5ad15dd3e38e4f7cfde6af3228f Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 19 Dec 2013 08:14:29 +0100 Subject: [PATCH 56/93] correct man page text of system parameter --- cdist/conf/type/__user/man.text | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__user/man.text b/cdist/conf/type/__user/man.text index 2536c1bc..47e63d3d 100644 --- a/cdist/conf/type/__user/man.text +++ b/cdist/conf/type/__user/man.text @@ -34,11 +34,11 @@ shell:: see above uid:: see above -system:: - see above BOOLEAN PARAMETERS ------------------ +system:: + see useradd(8), apply only on user create create-home:: see useradd(8), apply only on user create remove-home:: From 9d54eb7257a3b27830fc92f0855f6c01d807be8d Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Thu, 19 Dec 2013 11:21:26 +0100 Subject: [PATCH 57/93] implement messaging for __group type Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/conf/type/__group/gencode-remote | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cdist/conf/type/__group/gencode-remote b/cdist/conf/type/__group/gencode-remote index bb6797c2..1cffa8d4 100755 --- a/cdist/conf/type/__group/gencode-remote +++ b/cdist/conf/type/__group/gencode-remote @@ -58,10 +58,12 @@ if grep -q "^${name}:" "$__object/explorer/group"; then if [ "$new_value" != "$current_value" ]; then set -- "$@" "$proparg" \"$new_value\" + echo change $property $new_value $current_value >> "$__messages_out" fi done if [ $# -gt 0 ]; then + echo mod >> "$__messages_out" case $os in freebsd) echo pw group mod "$@" "$name" @@ -72,6 +74,7 @@ if grep -q "^${name}:" "$__object/explorer/group"; then esac fi else + echo add >> "$__messages_out" for property in $(ls .); do new_value="$(cat "$property")" if [ "$os" = "freebsd" ]; then @@ -95,6 +98,7 @@ else fi set -- "$@" "$proparg" \"$new_value\" + echo set $property $new_value >> "$__messages_out" done case $os in From 80fffbad1116d215669d2a716b1bc629f47ef6a5 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Thu, 19 Dec 2013 11:21:44 +0100 Subject: [PATCH 58/93] implement messaging for __user type Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/conf/type/__user/gencode-remote | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cdist/conf/type/__user/gencode-remote b/cdist/conf/type/__user/gencode-remote index a2cdfd22..892bb8e1 100755 --- a/cdist/conf/type/__user/gencode-remote +++ b/cdist/conf/type/__user/gencode-remote @@ -89,10 +89,12 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then if [ "$new_value" != "$current_value" ]; then set -- "$@" "$(shorten_property $property)" \'$new_value\' + echo change $property $new_value $current_value >> "$__messages_out" fi done if [ $# -gt 0 ]; then + echo mod >> "$__messages_out" if [ "$os" = "freebsd" ]; then echo pw usermod "$@" "$name" else @@ -102,12 +104,15 @@ if grep -q "^${name}:" "$__object/explorer/passwd"; then true fi else + echo add >> "$__messages_out" for property in $(ls .); do new_value="$(cat "$property")" if [ -z "$new_value" ];then # Boolean values have no value set -- "$@" "$(shorten_property $property)" + echo set $property >> "$__messages_out" else set -- "$@" "$(shorten_property $property)" \'$new_value\' + echo set $property $new_value >> "$__messages_out" fi done From d6f84d1ef0069c3663f56864626daed5d43370f8 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 19 Dec 2013 13:54:16 +0100 Subject: [PATCH 59/93] __start_on_boot incl. gentoo support --- cdist/conf/type/__start_on_boot/explorer/state | 8 ++++++-- cdist/conf/type/__start_on_boot/gencode-remote | 16 ++++++++-------- cdist/conf/type/__start_on_boot/man.text | 4 +++- .../parameter/default/target_runlevel | 1 + .../conf/type/__start_on_boot/parameter/optional | 1 + 5 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 cdist/conf/type/__start_on_boot/parameter/default/target_runlevel diff --git a/cdist/conf/type/__start_on_boot/explorer/state b/cdist/conf/type/__start_on_boot/explorer/state index 4e0c82c2..62f86332 100755 --- a/cdist/conf/type/__start_on_boot/explorer/state +++ b/cdist/conf/type/__start_on_boot/explorer/state @@ -1,6 +1,7 @@ #!/bin/sh # # 2012-2013 Nico Schottelius (nico-cdist at schottelius.org) +# 2013 Daniel Heule (hda at sfs.biz) # # This file is part of cdist. # @@ -23,9 +24,9 @@ os=$("$__explorer/os") runlevel=$("$__explorer/runlevel") +target_runlevel="$(cat "$__object/parameter/target_runlevel")" name="$__object_id" - case "$os" in archlinux) state=$(systemctl is-enabled "$name" >/dev/null 2>&1 \ @@ -42,7 +43,10 @@ case "$os" in state=$(chkconfig --level "$runlevel" "$name" || echo absent) [ "$state" ] || state="present" ;; - + gentoo) + state="present" + [ -f "/etc/runlevels/${target_runlevel}/${name}" ] || state="absent" + ;; *) echo "Unsupported os: $os" >&2 exit 1 diff --git a/cdist/conf/type/__start_on_boot/gencode-remote b/cdist/conf/type/__start_on_boot/gencode-remote index a8abebbc..61b2b9fe 100755 --- a/cdist/conf/type/__start_on_boot/gencode-remote +++ b/cdist/conf/type/__start_on_boot/gencode-remote @@ -1,6 +1,7 @@ #!/bin/sh # # 2012-2013 Nico Schottelius (nico-cdist at schottelius.org) +# 2013 Daniel Heule (hda at sfs.biz) # # This file is part of cdist. # @@ -21,6 +22,7 @@ state_should="$(cat "$__object/parameter/state")" state_is=$(cat "$__object/explorer/state") +target_runlevel="$(cat "$__object/parameter/target_runlevel")" # Short circuit if nothing is to be done [ "$state_should" = "$state_is" ] && exit 0 @@ -38,10 +40,9 @@ case "$state_should" in echo "update-rc.d \"$name\" defaults >/dev/null" ;; -# FIXME: Disabled until the explorer is checked -# gentoo) -# echo rc-update add \"$name\" default -# ;; + gentoo) + echo rc-update add \"$name\" \"$target_runlevel\" + ;; amazon|centos|fedora|owl|redhat|suse) echo chkconfig \"$name\" on @@ -70,10 +71,9 @@ case "$state_should" in echo update-rc.d -f \"$name\" remove ;; -# FIXME: Disabled until the explorer is checked -# gentoo) -# echo rc-update del \"$name\" -# ;; + gentoo) + echo rc-update del \"$name\" \"$target_runlevel\" + ;; centos|fedora|owl|redhat|suse) echo chkconfig \"$name\" off diff --git a/cdist/conf/type/__start_on_boot/man.text b/cdist/conf/type/__start_on_boot/man.text index 6d804884..dfada6d8 100644 --- a/cdist/conf/type/__start_on_boot/man.text +++ b/cdist/conf/type/__start_on_boot/man.text @@ -14,7 +14,7 @@ This cdist type allows you to enable or disable stuff to be started at boot of your operating system. Warning: This type has not been tested intensively and is not fully -supported (i.e. gentoo and *bsd are not implemented). +supported (i.e. *bsd are not implemented). REQUIRED PARAMETERS @@ -25,6 +25,8 @@ OPTIONAL PARAMETERS ------------------- state:: Either "present" or "absent", defaults to "present" +target_runlevel:: + Runlevel which should be modified, defaults to "default" (only used on gentoo systems). EXAMPLES diff --git a/cdist/conf/type/__start_on_boot/parameter/default/target_runlevel b/cdist/conf/type/__start_on_boot/parameter/default/target_runlevel new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/cdist/conf/type/__start_on_boot/parameter/default/target_runlevel @@ -0,0 +1 @@ +default diff --git a/cdist/conf/type/__start_on_boot/parameter/optional b/cdist/conf/type/__start_on_boot/parameter/optional index ff72b5c7..91685caf 100644 --- a/cdist/conf/type/__start_on_boot/parameter/optional +++ b/cdist/conf/type/__start_on_boot/parameter/optional @@ -1 +1,2 @@ state +target_runlevel From 17d36fdfab850739aab0ad4293b3f140afd97b95 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Thu, 19 Dec 2013 14:35:36 +0100 Subject: [PATCH 60/93] update changes for 3.0.0 release (5 more days to go) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/changelog b/docs/changelog index a8a686dd..4c689392 100644 --- a/docs/changelog +++ b/docs/changelog @@ -6,23 +6,24 @@ Changelog 3.0.0: - * Core: Messaging support added + * Core: Added messaging support * Core: Removed unused "changed" attribute of objects * New Type: __zypper_repo (Daniel Heule) * New Type: __zypper_service (Daniel Heule) * New Type: __package_emerge (Daniel Heule) * New Type: __package_emerge_dependencies (Daniel Heule) - * Type: __iptables_rule: Use default parameter + * Type __cron: Add support for raw lines (Daniel Heule) * Type __file: Do not generate code if mode is 0xxx + * Type: __iptables_rule: Use default parameter + * Type __key_value: Fix quoting issue (Steven Armstrong) + * Type __package: Use state --present by default (Steven Armstrong) + * Type __package_zypper: Support non packages as well (Daniel Heule) + * Type __package_zypper: Support package versions (Daniel Heule) * Type __postfix_*: Depend on __postfix Type (Steven Armstrong) * Type __postfix_postconf: Enable support for SuSE (Daniel Heule) * Type __postfix: Enable support for SuSE (Daniel Heule) - * Type __cron: Add support for raw lines (Daniel Heule) - * Type __key_value: Fix quoting issue (Steven Armstrong) - * Type __package_zypper: Support non packages as well (Daniel Heule) - * Type __package_zypper: Support package versions (Daniel Heule) - * Type __package: Use state --present by default (Steven Armstrong) * Type __start_on_boot: Use default parameter state + * Type __start_on_boot: Add support for gentoo (Daniel Heule) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From c50925cab5b6a8d5647092a46a5893fff944c4e9 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Thu, 19 Dec 2013 14:45:55 +0100 Subject: [PATCH 61/93] bugfix in __cron type, was a wrong quoting --- cdist/conf/type/__cron/explorer/entry | 0 cdist/conf/type/__cron/gencode-remote | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) mode change 100755 => 100644 cdist/conf/type/__cron/explorer/entry mode change 100644 => 100755 cdist/conf/type/__cron/gencode-remote diff --git a/cdist/conf/type/__cron/explorer/entry b/cdist/conf/type/__cron/explorer/entry old mode 100755 new mode 100644 diff --git a/cdist/conf/type/__cron/gencode-remote b/cdist/conf/type/__cron/gencode-remote old mode 100644 new mode 100755 index e84cf66a..712eb1a1 --- a/cdist/conf/type/__cron/gencode-remote +++ b/cdist/conf/type/__cron/gencode-remote @@ -60,7 +60,7 @@ prefix="#cdist:__cron/$__object_id" suffix="#/cdist:__cron/$__object_id" filter="^# DO NOT EDIT THIS FILE|^# \(.* installed on |^# \(Cron version V" cat << DONE -crontab -u $user -l | grep -v -E "$filter" | awk -v prefix="$prefix" -v suffix="$suffix" ' +crontab -u $user -l 2>/dev/null | grep -v -E "$filter" | awk -v prefix="$prefix" -v suffix="$suffix" ' { if (index(\$0,prefix)) { triggered=1 @@ -79,12 +79,12 @@ DONE case "$state_should" in present) echo "(" - echo "crontab -u $user -l | grep -v -E "$filter" 2>/dev/null || true" + echo "crontab -u $user -l 2>/dev/null | grep -v -E \"$filter\" 2>/dev/null || true" echo "echo '$entry'" echo ") | crontab -u $user -" ;; absent) - echo "( crontab -u $user -l | grep -v -E "$filter" 2>/dev/null || true ) | \\" + echo "( crontab -u $user -l 2>/dev/null | grep -v -E \"$filter\" 2>/dev/null || true ) | \\" echo "grep -v \"# $name\\$\" | crontab -u $user -" ;; esac From ad5c105858692fc5dd09fb641a43ae08a438ade0 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Thu, 19 Dec 2013 15:06:51 +0100 Subject: [PATCH 62/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog b/docs/changelog index 4c689392..764386b9 100644 --- a/docs/changelog +++ b/docs/changelog @@ -13,6 +13,8 @@ Changelog * New Type: __package_emerge (Daniel Heule) * New Type: __package_emerge_dependencies (Daniel Heule) * Type __cron: Add support for raw lines (Daniel Heule) + * Type __cron: Suppress stderr output from crontab (Daniel Heule) + * Type __cron: Fix quoting issue (Daniel Heule) * Type __file: Do not generate code if mode is 0xxx * Type: __iptables_rule: Use default parameter * Type __key_value: Fix quoting issue (Steven Armstrong) From 67f61eb7ec12745b9ab7c87eb014ee7fae96a0a7 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Thu, 19 Dec 2013 23:33:43 +0100 Subject: [PATCH 63/93] make default values for optional_multiple parameters work Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/emulator.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cdist/emulator.py b/cdist/emulator.py index b1cd8f2d..1e530fec 100644 --- a/cdist/emulator.py +++ b/cdist/emulator.py @@ -37,6 +37,21 @@ class MissingRequiredEnvironmentVariableError(cdist.Error): return self.message +class DefaultList(list): + """Helper class to allow default values for optional_multiple parameters. + + @see https://groups.google.com/forum/#!msg/comp.lang.python/sAUvkJEDpRc/RnRymrzJVDYJ + """ + def __copy__(self): + return [] + + @classmethod + def create(cls, initial=None): + if initial: + initial = initial.split('\n') + return cls(initial) + + class Emulator(object): def __init__(self, argv, stdin=sys.stdin.buffer, env=os.environ): self.argv = argv @@ -101,7 +116,7 @@ class Emulator(object): for parameter in self.cdist_type.optional_multiple_parameters: argument = "--" + parameter parser.add_argument(argument, dest=parameter, action='append', required=False, - default=self.cdist_type.parameter_defaults.get(parameter, None)) + default=DefaultList.create(self.cdist_type.parameter_defaults.get(parameter, None))) for parameter in self.cdist_type.boolean_parameters: argument = "--" + parameter parser.add_argument(argument, dest=parameter, action='store_const', const='') From 3c1e001f5e07335e6c2c4f9e79f3b17db751c34b Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 20 Dec 2013 08:46:33 +0100 Subject: [PATCH 64/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog b/docs/changelog index 764386b9..bc1b894d 100644 --- a/docs/changelog +++ b/docs/changelog @@ -26,6 +26,8 @@ Changelog * Type __postfix: Enable support for SuSE (Daniel Heule) * Type __start_on_boot: Use default parameter state * Type __start_on_boot: Add support for gentoo (Daniel Heule) + * Type __user: Add support for state parameter (Daniel Heule) + * Type __user: Add support for system users (Daniel Heule) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From b99af6663c8c58d70c9b4bda4fe279e0bae102a2 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 20 Dec 2013 08:50:45 +0100 Subject: [PATCH 65/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index bc1b894d..abe8626f 100644 --- a/docs/changelog +++ b/docs/changelog @@ -8,6 +8,7 @@ Changelog 3.0.0: * Core: Added messaging support * Core: Removed unused "changed" attribute of objects + * Core: Support default values for multiple parameters (Steven Armstrong) * New Type: __zypper_repo (Daniel Heule) * New Type: __zypper_service (Daniel Heule) * New Type: __package_emerge (Daniel Heule) From e5ab33651da3445572a068f0d3def154f4b0daa5 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 20 Dec 2013 08:54:16 +0100 Subject: [PATCH 66/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index abe8626f..a5f5d102 100644 --- a/docs/changelog +++ b/docs/changelog @@ -29,6 +29,7 @@ Changelog * Type __start_on_boot: Add support for gentoo (Daniel Heule) * Type __user: Add support for state parameter (Daniel Heule) * Type __user: Add support for system users (Daniel Heule) + * Type __user: Add messaging support (Steven Armstrong) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From d84a43960ba7c0e17bca917fc0d8b2bc2022b921 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 20 Dec 2013 08:56:23 +0100 Subject: [PATCH 67/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index a5f5d102..c51d38c9 100644 --- a/docs/changelog +++ b/docs/changelog @@ -30,6 +30,7 @@ Changelog * Type __user: Add support for state parameter (Daniel Heule) * Type __user: Add support for system users (Daniel Heule) * Type __user: Add messaging support (Steven Armstrong) + * Type __zypper_service: Support older SuSE releases (Daniel Heule) 2.3.7: 2013-12-02 * Type __file: Secure the file transfer by using mktemp (Steven Armstrong) From 8b0eb5766af4fb4545baa116237690e58ed36dec Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Fri, 20 Dec 2013 10:56:46 +0100 Subject: [PATCH 68/93] bugfix: handle non-existent default Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/emulator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/emulator.py b/cdist/emulator.py index 1e530fec..78597621 100644 --- a/cdist/emulator.py +++ b/cdist/emulator.py @@ -48,8 +48,8 @@ class DefaultList(list): @classmethod def create(cls, initial=None): if initial: - initial = initial.split('\n') - return cls(initial) + return cls(initial.split('\n')) + return cls() class Emulator(object): From 39f65d2ef7b3756bc7610b10bf136e5e8d97911c Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Fri, 20 Dec 2013 11:17:43 +0100 Subject: [PATCH 69/93] leave conversion of list to underlying fsproperty Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/emulator.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cdist/emulator.py b/cdist/emulator.py index 1e530fec..15728215 100644 --- a/cdist/emulator.py +++ b/cdist/emulator.py @@ -143,8 +143,6 @@ class Emulator(object): self.parameters = {} for key,value in vars(self.args).items(): if value is not None: - if isinstance(value, list): - value = '\n'.join(value) self.parameters[key] = value if self.cdist_object.exists: From 29ae02565cbdb1b5a190b7caad5ebd3f155b71ac Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Fri, 20 Dec 2013 22:57:15 +0100 Subject: [PATCH 70/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index c51d38c9..7be233dc 100644 --- a/docs/changelog +++ b/docs/changelog @@ -9,6 +9,7 @@ Changelog * Core: Added messaging support * Core: Removed unused "changed" attribute of objects * Core: Support default values for multiple parameters (Steven Armstrong) + * Core: Ensure Object Parameter file contains \n (Steven Armstrong) * New Type: __zypper_repo (Daniel Heule) * New Type: __zypper_service (Daniel Heule) * New Type: __package_emerge (Daniel Heule) From 08762330e177729372349b3fdde67e81a9fd3377 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Sat, 21 Dec 2013 21:59:47 +0100 Subject: [PATCH 71/93] default to None, not empty list Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/emulator.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cdist/emulator.py b/cdist/emulator.py index c9ce663a..b70ef956 100644 --- a/cdist/emulator.py +++ b/cdist/emulator.py @@ -49,7 +49,6 @@ class DefaultList(list): def create(cls, initial=None): if initial: return cls(initial.split('\n')) - return cls() class Emulator(object): From 49bdd83ea1191bf684c3e680b65cf9080d65cb81 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Sat, 21 Dec 2013 22:00:57 +0100 Subject: [PATCH 72/93] test for feature instead of type Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/util/fsproperty.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cdist/util/fsproperty.py b/cdist/util/fsproperty.py index 5814b2b4..797c929b 100644 --- a/cdist/util/fsproperty.py +++ b/cdist/util/fsproperty.py @@ -134,7 +134,11 @@ class DirectoryDict(collections.MutableMapping): def __setitem__(self, key, value): try: with open(os.path.join(self.path, key), "w") as fd: - if type(value) == type([]): + if (not hasattr(value, 'strip') and + hasattr(value, '__getitem__') or + hasattr(value, '__iter__')): + # if it looks like a sequence and quacks like a sequence, + # it is a sequence for v in value: fd.write(str(v) + '\n') else: From 7ab5cd35acafcb8b20a118cc1884e3e90ff0db42 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Sat, 21 Dec 2013 22:49:06 +0100 Subject: [PATCH 73/93] missing parens -> matched what we did not want to match Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/util/fsproperty.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/util/fsproperty.py b/cdist/util/fsproperty.py index 797c929b..49d4a32d 100644 --- a/cdist/util/fsproperty.py +++ b/cdist/util/fsproperty.py @@ -135,8 +135,8 @@ class DirectoryDict(collections.MutableMapping): try: with open(os.path.join(self.path, key), "w") as fd: if (not hasattr(value, 'strip') and - hasattr(value, '__getitem__') or - hasattr(value, '__iter__')): + (hasattr(value, '__getitem__') or + hasattr(value, '__iter__'))): # if it looks like a sequence and quacks like a sequence, # it is a sequence for v in value: From 2b0210b905a285c865c2759edee6e549622c225f Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 24 Dec 2013 23:05:56 +0100 Subject: [PATCH 74/93] update releasedate Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog b/docs/changelog index 7be233dc..586411fa 100644 --- a/docs/changelog +++ b/docs/changelog @@ -5,7 +5,7 @@ Changelog * Exception: No braces means author == Nico Schottelius -3.0.0: +3.0.0: 2013-12-24 * Core: Added messaging support * Core: Removed unused "changed" attribute of objects * Core: Support default values for multiple parameters (Steven Armstrong) From 241d8e6c3ab1817094e4c94e7c8cec51c0bb2ebf Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 24 Dec 2013 23:07:43 +0100 Subject: [PATCH 75/93] fix typo Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog b/docs/changelog index 586411fa..ee3e4c9c 100644 --- a/docs/changelog +++ b/docs/changelog @@ -18,7 +18,7 @@ Changelog * Type __cron: Suppress stderr output from crontab (Daniel Heule) * Type __cron: Fix quoting issue (Daniel Heule) * Type __file: Do not generate code if mode is 0xxx - * Type: __iptables_rule: Use default parameter + * Type __iptables_rule: Use default parameter * Type __key_value: Fix quoting issue (Steven Armstrong) * Type __package: Use state --present by default (Steven Armstrong) * Type __package_zypper: Support non packages as well (Daniel Heule) From 37e1c95bf0ca2d415d23c1a7b2729947e1249291 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 24 Dec 2013 23:25:54 +0100 Subject: [PATCH 76/93] add link to messaging Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/web/cdist/update.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/web/cdist/update.mdwn b/docs/web/cdist/update.mdwn index 9e47fccc..338cf9f8 100644 --- a/docs/web/cdist/update.mdwn +++ b/docs/web/cdist/update.mdwn @@ -55,6 +55,11 @@ To upgrade to the lastet version do ## General Update Instructions +### Updating from 2.3 to 3.0 + +The **changed** attribute of objects has been removed. +Use [messaging](man/3.0.0/man7/cdist-messaging.html) instead. + ### Updating from 2.2 to 2.3 No incompatiblities. From b0b0e46f037882d1bca3b4ca8ba807e8ab94b772 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 24 Dec 2013 23:29:13 +0100 Subject: [PATCH 77/93] update link to messaging Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/web/cdist/update.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/web/cdist/update.mdwn b/docs/web/cdist/update.mdwn index 338cf9f8..aea33c08 100644 --- a/docs/web/cdist/update.mdwn +++ b/docs/web/cdist/update.mdwn @@ -58,7 +58,7 @@ To upgrade to the lastet version do ### Updating from 2.3 to 3.0 The **changed** attribute of objects has been removed. -Use [messaging](man/3.0.0/man7/cdist-messaging.html) instead. +Use [messaging](../man/3.0.0/man7/cdist-messaging.html) instead. ### Updating from 2.2 to 2.3 From 9e153f5c18a6c2afe75cefa2b72f3369a87eb453 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 24 Dec 2013 23:30:33 +0100 Subject: [PATCH 78/93] use absolute links Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/web/cdist/update.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/web/cdist/update.mdwn b/docs/web/cdist/update.mdwn index aea33c08..2e3e9b92 100644 --- a/docs/web/cdist/update.mdwn +++ b/docs/web/cdist/update.mdwn @@ -58,7 +58,7 @@ To upgrade to the lastet version do ### Updating from 2.3 to 3.0 The **changed** attribute of objects has been removed. -Use [messaging](../man/3.0.0/man7/cdist-messaging.html) instead. +Use [messaging](/software/cdist/man/3.0.0/man7/cdist-messaging.html) instead. ### Updating from 2.2 to 2.3 From dc8e9c68552a7a5d418af349800da5b2368a693b Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 7 Jan 2014 13:23:39 +0100 Subject: [PATCH 79/93] fix typo on optional parameter which is only a passthrough to __package_zypper --- cdist/conf/type/__package/parameter/optional | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdist/conf/type/__package/parameter/optional b/cdist/conf/type/__package/parameter/optional index 5a89ffc6..d674f32e 100644 --- a/cdist/conf/type/__package/parameter/optional +++ b/cdist/conf/type/__package/parameter/optional @@ -3,4 +3,4 @@ version type pkgsite state -pstate +ptype From d2c45717f1172d83d64209cad12d1c84f3e16974 Mon Sep 17 00:00:00 2001 From: Steven Armstrong <steven@icarus.ethz.ch> Date: Tue, 7 Jan 2014 16:31:32 +0100 Subject: [PATCH 80/93] install rubygems for ubuntu/debian Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch> --- cdist/conf/type/__package_rubygem/manifest | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100755 cdist/conf/type/__package_rubygem/manifest diff --git a/cdist/conf/type/__package_rubygem/manifest b/cdist/conf/type/__package_rubygem/manifest new file mode 100755 index 00000000..7199d939 --- /dev/null +++ b/cdist/conf/type/__package_rubygem/manifest @@ -0,0 +1,33 @@ +#!/bin/sh +# +# 2014 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 <http://www.gnu.org/licenses/>. +# + + +os=$(cat "$__global/explorer/os") + +case "$os" in + debian|ubuntu) + __package rubygems + ;; + *) + echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 + echo "Please contribute an implementation for it if you can." >&2 + exit 1 + ;; +esac From 6dcf3e7c2651f656466bbf80915fd4cc661cf16c Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 17:03:14 +0100 Subject: [PATCH 81/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changelog b/docs/changelog index ee3e4c9c..6eebc74e 100644 --- a/docs/changelog +++ b/docs/changelog @@ -4,6 +4,9 @@ Changelog * Changes are always commented with their author in (braces) * Exception: No braces means author == Nico Schottelius +3.0.1: + * Type __package: Fix typo in optional parameter ptype (Daniel Heule) + * Type __package_rubygems: Require rubygems prior to use (Steven Armstrong) 3.0.0: 2013-12-24 * Core: Added messaging support From f5cee7a57d419baeb5256300e7a6133ebf0cd796 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Tue, 7 Jan 2014 17:31:45 +0100 Subject: [PATCH 82/93] suses chkconfig has the same name, but works different --- cdist/conf/type/__start_on_boot/explorer/state | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__start_on_boot/explorer/state b/cdist/conf/type/__start_on_boot/explorer/state index 62f86332..e9e4318e 100755 --- a/cdist/conf/type/__start_on_boot/explorer/state +++ b/cdist/conf/type/__start_on_boot/explorer/state @@ -39,10 +39,19 @@ case "$os" in [ -f "/etc/rc$runlevel.d/S"??"$name" ] || state="absent" ;; - amazon|centos|fedora|owl|redhat|suse) + amazon|centos|fedora|owl|redhat) state=$(chkconfig --level "$runlevel" "$name" || echo absent) [ "$state" ] || state="present" ;; + suse) + # check for target if set, usable for boot. services in runlevel B + if [ "$target_runlevel" != 'default' ]; then + runlevel="$target_runlevel" + fi + # suses chkconfig has the same name, but works different ... + state=$(chkconfig --check "$name" "$runlevel" || echo absent) + [ "$state" ] || state="present" + ;; gentoo) state="present" [ -f "/etc/runlevels/${target_runlevel}/${name}" ] || state="absent" From 71e5314ec1b7788bfe74ea3304b769af73bd1b2a Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 20:40:46 +0100 Subject: [PATCH 83/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 6eebc74e..75a7f329 100644 --- a/docs/changelog +++ b/docs/changelog @@ -7,6 +7,7 @@ Changelog 3.0.1: * Type __package: Fix typo in optional parameter ptype (Daniel Heule) * Type __package_rubygems: Require rubygems prior to use (Steven Armstrong) + * Type __start_on_boot: Fix for SuSE's chkconfig (Daniel Heule) 3.0.0: 2013-12-24 * Core: Added messaging support From f8c36c080e47f4139434658b28c099748fae5f15 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 22:30:59 +0100 Subject: [PATCH 84/93] do not escape \ in --line Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- cdist/conf/type/__line/gencode-remote | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__line/gencode-remote b/cdist/conf/type/__line/gencode-remote index 1c46c16c..d4796965 100755 --- a/cdist/conf/type/__line/gencode-remote +++ b/cdist/conf/type/__line/gencode-remote @@ -49,7 +49,15 @@ case "$state_should" in # Replace all \ so \t and other combinations are not interpreted # - line_sanitised=$(cat "$__object/parameter/line" | sed -e "s/'/'\"'\"'/g" -e 's/\\/\\\\/g') + + # line_sanitised=$(cat "$__object/parameter/line" | sed -e "s/'/'\"'\"'/g" -e 's/\\/\\\\/g') + # The one above does not work: + # --line "PS1='[\t] \[\033[1m\]\h\[\033[0m\]:\w\\$ '" + # becomes + # PS1='[\\t] \\[\\033[1m\\]\\h\\[\\033[0m\\]:\\w\\$ ' + + # Only replace ' with '"'"' and keep \ as they are + line_sanitised=$(cat "$__object/parameter/line" | sed -e "s/'/'\"'\"'/g") echo "printf '%s\n' '$line_sanitised' >> $file" ;; From 14ee9c4cc718c771aa6a44b77202996fceb1ce86 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 22:32:08 +0100 Subject: [PATCH 85/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog b/docs/changelog index 75a7f329..d606ba69 100644 --- a/docs/changelog +++ b/docs/changelog @@ -5,6 +5,7 @@ Changelog * Exception: No braces means author == Nico Schottelius 3.0.1: + * Type __line: Remove unecessary backslash escape * Type __package: Fix typo in optional parameter ptype (Daniel Heule) * Type __package_rubygems: Require rubygems prior to use (Steven Armstrong) * Type __start_on_boot: Fix for SuSE's chkconfig (Daniel Heule) From 52bcc8bc3b254670715a04ec081122f9ffe765ae Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 23:09:56 +0100 Subject: [PATCH 86/93] add old notifications sketch Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/dev/logs/2013-08-27-notifications.xoj | Bin 0 -> 38786 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/dev/logs/2013-08-27-notifications.xoj diff --git a/docs/dev/logs/2013-08-27-notifications.xoj b/docs/dev/logs/2013-08-27-notifications.xoj new file mode 100644 index 0000000000000000000000000000000000000000..c34c467640b7c303fb0aa160d8108c7aca8d9518 GIT binary patch literal 38786 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 OpZ+gcs}`Jw1Ofob4P%o4 literal 0 HcmV?d00001 From aea95d256fa9e928d6c450e0e31b83bda8bd66a2 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 23:13:36 +0100 Subject: [PATCH 87/93] remove unneeded changelog.future Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog.future | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 docs/changelog.future diff --git a/docs/changelog.future b/docs/changelog.future deleted file mode 100644 index 12adf8c3..00000000 --- a/docs/changelog.future +++ /dev/null @@ -1,10 +0,0 @@ -Changelog ---------- - - * Changes are always commented with their author in (braces) - * Exception: No braces means author == Nico Schottelius - -future (maybe 3.x?): - * Type __cron: Dropped support for old internal format - Using this version prior to running cdist 2.1.2 will - break add the cron entries twice. From baad4c3276b1f3923ccf6292dc630df441986443 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Tue, 7 Jan 2014 23:14:07 +0100 Subject: [PATCH 88/93] +factsheets Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/dev/factsheet.odt | Bin 0 -> 19072 bytes docs/dev/factsheet.pdf | Bin 0 -> 19974 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/dev/factsheet.odt create mode 100644 docs/dev/factsheet.pdf diff --git a/docs/dev/factsheet.odt b/docs/dev/factsheet.odt new file mode 100644 index 0000000000000000000000000000000000000000..2bb2a84bde5b59e530c628f9c3964d3bdbc9c1d6 GIT binary patch literal 19072 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 Ngx7%{nd}bY0RUA+EV2Lq literal 0 HcmV?d00001 diff --git a/docs/dev/factsheet.pdf b/docs/dev/factsheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c59a1a6f12563f84b4a4d4ea41bf5b7a11cc854c GIT binary patch literal 19974 zcma&O1y~$S(=JSKm*8$egS!*l-CZ}hOVHrK-6as*-7N%%;2zxF34s8C{dXhJllS}I z@0>GNnCa>1>8`%}uBzTn^-w8`OER)DaUfFl7W8)XHudHpvXQZnIha}_3J5UE1MDqa zEy>tHIjYQ(R<^DHXJ$!T6IXyZz|6rMAS8t7;_3`Au|xF8s??H;T$V=v_@H&rVXUMj zOoa|9XU4p^T=PyaIO_@z-aJ(v_3lA0_N|QBh{|*1o+Hi1qldDi@&vwDUwv;IRla}y zkU4p{x4V6oBb?#4U1n{V{bn1m|0CCq2%4kC$C6}xa$`GH$-x^2>RR?C`+?!2NvxKX zU#BhfT$v(QthM?~jf3|$Y5pHr4jb&fLUF@Z5E9GY>-ogO?&=mF1*Z}%bgibYS9hyd z59_>jJ@6U4td`F<`s5f56B1J=7LfS_xoK+-c0XJc`lvkfuSF2uv9=t(WaT@94vl@V zwawcX5?O5*q7bNt`gF_%(Z8Yf%-?`7r<XQmgl9hvoo^r(;?ni>-Xk$Pk#;)JAoRQ~ zXdSu>59|904HXIxC%G48HuZN!dm8z1^m^xPA7p+f^b6KJ<hb%rQHAO^oVZyv#A4_3 z<htz`rmWhp<o#_K*lO?`qC%i~S_dsnC6zyXuTC8eBO?z368IT@MoAyWk`EWoS;G$t z?o-RvRJ2M?8O^B2sb_2tnpj1T_+g3=`DI@tm=NAb;;ok;DFzHo?+;oNLv<)p%G*<~ z0@pY2nG_nx_TrzB47O+jzrkzWjQ4cK7Dil0HUox-PKh5O+NbtS9ak+(Se+tKqd326 zBWyh2SqfJ-KZn;h7el`^f--JHttNy}hvk+&-w5l%V0EQSo(Qzct~zLy%h;n@w(w-) zO-KA-25D+*S~OgXZk(s_O0av>jGWE!<9oXmV}<XRH++#wk>f8AUZ>gyhPp{`qH(?K z`Q{ucm>wgoz&rfPTzZLhMm^FKd+$KUmMk`5w?KlPxHm)Woa|*~3&B8OnEMX(O)fGE ztKk3yo9&_&%6IONqQq4;(<q6y3;4<f_KA$3)g;e;vO)RGEJI8*m<$J5(?e+r>HNiq zZ(n{CrH9u;LGB|0<mn*a!})u>uJ|fpBX^(9|M;FDj2G*4I5*sTTjeHEigvf!^+yan z;i`RR9DR_gE|tpF?6e{NUP>o>5aIbSURtyvPSDn__Wg=&U_b{)WMmW8MvL6_x`Yl& z(FX0aquLG0=*WuQPfpl;KCKpw_0_8hyf%^d6{_X!?#mDw_$!u9Q>+HEdD$-}SDkWc zMig;%tkh_t__AJN&$l<(k4Z}RZ-mlBmxvb;_{$FJnGRUqe<Ts$dDYm4ZDOIJXJfb2 z^Uh&V$NY@1({i(sLh^)3snbd#$^s|%$v9nMYQusu1~mjzCQ}|y1BTIQV^!IYs$Z2Q zL43rDS1)ycpK^9%$*|d$bN9UD%9qngh4|YT8d`WDD%@8Wl@kB#>1GXUXXO?qQO{F; zbLh|jN-A2?*n8}*mBrXbWI$QGmQo`2CeHBH{ZO<o><R=CA1vA$w=wcwHWFg>dDjWa znosT6w%^#yS?S%9K-SZbW$uafjL?zD#9iPs|KidYhyZ)@-$n$K0^1!#u(<&zSXp@3 zz>j}sa{OzR)IA*m%-Tw()&MhCW;HicSMa@zorwj2S<A{CY_C|^n56+$7M8ALtXy2o zqE@ah$^d6E2Rlaxdw@MC^N(TU1{*fSKbB2QOh#Q@(!}GJabx~<Q8sb5a{-w`IWk68 zW>H%cGaDHfRx(#-HvqGkgRPsLy$iTGkR=4)IykF2nwSAVuew{A0i>KwJQ06aqsL0d zVu1Ls!36F)TIR~$QzEfgB^Mhfz_VIm#ee9*akIjhH}0hqS#otEjtNthNiNk^?H0jQ z;CSTtoY^p=0N*g#Cob-}GUfipDXh-`!!}KF%2m!jVm%OAc_RRehb$0)q)J&3i1aFo z8Tde}U1$|NEnet@gQl4Qz@%1FD5Gc5g~x^j6^^1-2~L#82mu1G6Quoseuq@?3&6q0 z7YWia;i3<E2t^5rI1QO97@)(_Y<$cGBdm?z)c`lLz7vBOL%Y8K9z!e;o{=nYk}QG< zBRC}hlGafYoB6SzYkH*md&4Zgs|o5tVZn_0&vLol(6|Kw&^QU2Kg;0)ADO2Cx|G#G z;1fLVGCf0X7ZCUr;YA?QK?OAu;03+#l2uXSl8r*hVZ*GrL@owSutY9i*w=dfX;!=_ zNs5CLLsnc#3{hr0aaUDIN}QM%;8uPkAb|=`*6_2{m)G#<%&)+xfbx0@(6vSUfIy%K z3~+}4_`T1LV@5$FRT8Jt-Vnx8f-A#vz=3<|Pw8LP1=2c-z}$oIf@hor)uFCTiSV=E zzgm)*hHn$WRR>iG1oh_<_!v^tq$x{8)&;s>e@X?Ne<bA&f-b|N<Z`4BKssDtjUG&m z0jpI}2B>=q!3#BZ9GMCrF?2y7<79wO!Q$ek6appU?xx@lN=N7MaYRW{Vz`<-2MxD) zzU2~A<Nzf`SPx}h0vHKOjL2>f@UJ3>&_xX6i9H*@@Ph9sLZQ*MKKxFZkV!rlca0OV z1ZTtN{(K|A6E+SE%YWbox?$-8PKsEu82$un5(L;GONJZ}*n<Sm4C={yj9{dK8NIMD zFnW4NGZIrFC1Ix=Goq}7;C^sktGoWJm8{tc%(36llQmDiD)}jr(TA|Zzs8CZK8ovq zk>Um(7g!8x5ePi=14j6P6V<?7RCFUC@ErKi4G9D$@qmZ(NwMn&7Z@W9e3Gm1`;n?$ z5C_Ty-2#CMMV&<*x>iM<Tp;zyWCls8fb>&HOK~R<)L^W^xPy<du&+ZMrmTdcV5n^* z;Coo{^Y}pcN=%_~r-4v*iaN#%6X@Z^6-Nc-s{aw0rSwlH1A(tP|4ASH^E{3Q%qL2O zMdja={Dlc6Vk)o@c;|L+1iY8=yO;j}Op`AGNi0*8fs<h)i`;)<%E&QK0itL4HM#;v zT8)B8!;FIJA8z*iNsv|jq&aioKN&xH4{8KNT>0nHKZm<S7aBaQe`EqZjCx5AYHW)5 zEtsND3*SNK8+AV*a8cKn;U{^gp^+Xzqx}E_dQum3YyG(#xQ7d@E0bsbiUb4^<b)c; z-;A3yK6g7z1<4r&cDN-gjtncV46Bl`zm7;zipj7jDKLN-LI!veQ^e0N!}{#`K({Sn zU{t}%EHM@A3NFA5Vl(|8a)K;Mh|$4sw&F=Y|D7-S9QrrEF@gigev=!-XK3ub@IUB- zHT@49zvv9&&%F^y9Sgy#AB+QL5b)NjC?ppr!y2V1Bgm@g1IXGmQ)YpB0_HH>pVxc- z;cx`e9}z^bc>eGggz+zge=3v+Ov~TOXY!YLc;FU)9W#FtKd(<xykfz)zq3xtx*ljr zfdCC4u+Isccgisjg4Qy_Doxa?2n00e)-U;fQTCrRDcBBBAb?KW1t1E8RMV6j1HKJx z8fEG+!csxt{<Qah%-}!0d-aDBEOCFj6!iiDY|vkQ{B0JZ{yYG)7zrfPp&tm!L>WI& z@(~2uKL8F|N`c4=Lh|21`#pLfzWr$jG*W+10ga3dBum53C;wx(Kvjd<@eKr%@AuIS zdH*Z*Kwtgz84kGkYFY&50W1$lEjVVl!i&;_sWV>VTUCQZ`ip}x6cm&srXYO8pR?jc z4@&o$vJ8RY0ol?vmawoMrf{A<ke&VMqJC>8!fzf?B0&BD3PUUj{XeM)jr-wMzzcNU zf9Z-2GCDvY$WDU(KrRsY02XYPP=ON`q{K%HsiTw#gCN<)DdA%rUH>Pze-Y_F(Xu2{ zhbQZVhQ|#m_}i`<#e&-Tc|3;P8~sXw&JRC8$_sX>L;Ik+MGZgDNs{uW0{319V~VK@ zcoBFBwt*aDc~+H08Lz1^)lWH3sX>G%RQZQYpoFEkxTF9G7LaO+f>qVkgc#&-3P3c1 z4+bkLXx5QA9BhXxv5gV&msFs^#rp$@2#nXi8vDoJypZ}!TYl><SV7-Y@Javj*I?5G zX4#?NBlK^rc>1iFra%SUgo&SZ&#=ln=vlI=1oQ6Kze^0_qKvS^KcoU%0?;huw+9rl z|JPRh&LWe+nEq?bemO(Xq~woa&}wByz@LsA_%zNAvW*EwPdOkge;y!U!EWbHELchf zG+BY)l780(9Hoo|X+j<!AL!}53|S!Xa=;FZafX*2$3oFh-ws~{=BOd)#0qxuAg?1) z1oHB~T@T1yeifJc4eO9V4`n_GV9T%rkb~zM1!V_IiQmD3W&tdpi+);A-@oh}NPZKw z`#(s7W^#Y^jm+>6V<9gE4C5m;67UCE&8sd@GKrPNs1S$&g6|R}i!~(%#<Ue!8cAeb zj1PYqRGft0b%|gd%luIZM1*QEI>p8TexPd4LEadHSPPT_Ic6ev(3Gwy!^Wy8bjhk3 z>;pi$$GX!-nRl|Lfk6ziMVj%Tv)gw{#4hjv1N(f$L5G(C<MH4IBm~)i`4Iq~nu90) zY&`5N|NIEx{O>;k5dZlVAnD+2hsZ1{>foVA#>!2`&dW*0$;$!0GO>~wATmoiJGeQ5 zX7g&y>dq$iE{-P70DCh}W-+zjQ+8D;QP4~uJi7<a=zlMN@ci=&;jguizvl8DSx^w5 z<Jo`d1=qg<i;0l2FmWQ1k&!W*nfy$Gn)vhUhWFoczZ+#`0cHKSMVH@Fv68W|^RWE; zgTf>0RAbeKNCQjw&CSbjy9|XUPPdnxGgda%uV;K3`bC$Rh7~gu>K0GWipFPQ*cas! z7~AVd&Zs#=?UHqm{hz567-P@{N|&yPCkcK3Fe`)=^&u%tv>UD)PM8E*q^~Kvm7m&b zIA;Ty{r1hc;Qo(sUYGOt)}HhJ3XUZD=;Juos{ZJoj$cAdXT2|<9&Lg_+ags-O`})9 zJ!@cmL?(0HGLzrmFHXqm;D^}w81;3V{hg5KiEa(lZkMtUM^HrSx!^I>#RtKYY&!J` zhB!U@q#4?U-AEllh?^vuAZ7;<VKwUj;xvDY=K$*?nC-D@qaQH4NDx)*g{FlB{xfKk z-$=bbs&mO!p8Dy-m8=J_T|qv}7Se?78`%X`H*cVLpj3%rRRzL6Y(fl8qHH@tz6g6o z8g>D*66ml&-GPR?Y3G5k7I5p|4Tt{D#W6rX;Is;Rf^{PFB5QEs)$2*N(QL&MTT4YV zGGZIRn)|n~0XGXyuh96En0a(cw#NWFYcy6762-EJf^hP^1eeOB5X`cn9^J53z_LbC zAMR{>H-ItB{it)pL09>Cda(fj%7q|jk|SzAp4&n(Bu&e3MS_W(zcXnV8s8W%r=uma zyr;a3uXRxg?HsMvD?PhW=3^gAQtOR4)#nxOP`nrFBQ>tpK^B2|B`}OkR5l3;UzA6x z=)Sx#?He?|XJocWl)q&+@|G;TZsGWlQ$+tht0bi6lxulZT7l7Pg<z5@Quldr;>iX> zREl;^rLjpb&SY^sJF$)xc0ZXxZ4Jr+R=@2)){3}&lSIlvgcy^G8xJ-X{**crQiN=Z zcx4IIVUyTcKZ$6?@DuV_TJt*7C)lxAEaSzXf*cYfqwv!u3NwuPa`)wT)KnvbmZGO9 zZ)4b>-I>8BIvSDUf1HBW*>G6)kZ)X<(a898QuvV!Rs5)TJT&p>x$?op4I_rEqcO)w z6CwZ8_7Xk&tf|ojcAZwGzYS)v%miMxyhq^mcL^ZL6tg6>mmhblkKX|M&23|tH~yRN z=&g)V?PsEt_O}K~r-B|E%1XD}%T2I8hR&Y_oVLnz@WP{!6PNRA^E|0Y*ySkmmHF|D zBva7tDRFbwrypoeDz-BLp8J|@Z@*q3UwrEJvBtf>Q(WV39^aW_mqdRX5_TboOkPFo z5WG;|A5Q*(;Zsv65#eUOhLaU1bpUKq*!FJF1ks7;qXJwz1~dN`sLV}%IByjortb4M zg0LCE>%{V8WG{#rUgfjw8si?7qq<Xm+%ZNIAlG-Q!Tpxg1h}0#8z1lG;Ix_6X3}HQ z+<U2!ubivGzC0C2qMm>l-It6-99>+RC#hzo`}OcBPptkf%Vb)`x2J^bMS^VCbCKS) z$tlj*S#7_rJn?y-t-BTdaoQOX!5ro#!>P0$gXv*QQ}JBR5VJKgGcPylVy(#zRn{w* zRgP_{UimRx>WI4nR>91L5t|53*J)ZUXNg32H}^N!6{Wc-skcJ<t*hUu_%~Vduto#J z&5)gWwBAvu8<XVF<0*fN-;%M}l81X6z=0eHDdR(1wa*hnC!QZR%|rho&n{y7n}C6b zn!a#-oD^zMeRLoyW>`5MXE)`|Hl`EBjVOGK{ZM=$YeR#b-Ep+XRu&+JJz0fByhvcJ zU!#h4zO2Gb#>D_qvc<i#zjw;pBh@vEJ!r~pEmK5DGwx;V>U1p^COhpVz1o*SNKKu- z))&@Ao^Y<C)|8Rat~8z~*yb;<s@zOSK+=10HMq}ltpr)E6cg%m4+UxAc@n?VF%UI) zVJ@OaR0D*sK=5-9coFz@Dbd5(LOmL0>Dd#^jA~!`e=+Sp4fM}tDt2y;e+)S*Xr1TJ z>iN%gDoF=>S8;%gnX{Fns{?5D9CWK_Vh3705&<7Cl^g-~YMyqc4z?gCV{2mJLdF3~ zfC~NeVT`QYykv}^^(8X!S{NBGE0+PYjH`*Qm6?dWg)M-L1(8|A#SFZp#m&nLUTXSv z!^p-0dLm}x_<Ioy^d87Xx&rJp$#_5yz}15m^8ug=!9E7;$^Q5uP)q-a|JxC<v9bPH zAp6Vx{q1-R;zX4C$k0R1e?;(}k#IF+Wm3N$qZT|MC>QqcX-N1IAb*$(T%*%e5O{Uv zaUR5dU~~ILW#~R6|CqHGZ-|}A2@uM%fh9c$>*IK*40uzoAd9r@AUDvO&&m}&UA@Ja z&dnqEoo7Smkl%af6=v32b?3obg+ok>0_0?Cy$hbtf=XP1%lK}&Oz&~|cTOpWj5h4# z;EN9K+an@LQq76$3K2BaG#ELW^~&RZ2%nR^oAT98F=v!f!&j>tJXAb2du({t%qEw} z=3QDNOakxMMbqD)2Jn6MHqy@Xzm5B!<w?*q;-3-zX9A)QnmYW<6*X}IfPwz618wE( z;wolo;tU=@d6VC1R>WV+mo9qjT%2U=oSfhZ3%H7Z=|lFDUZ53Abq5W5EAW58ko_F7 z{~W`=mP-FjCcqP?|KntWm4}Um<L^OT^|mo4oJ&8rdwpHQu$VEWr}-kfl1FhXlxRfJ z^y;Fo7JI+)g}XJ?ixktv+HSOd&4ep!c^MC$0@k?c3rkj8V;!z$T69ra9mmDVRl^jj z_F#KD<rOM}re*=iu{zsN+Ye*-GAUvon!V4f`G-e+_W9R&L4U_S`%zhVUsgqs&BJQM zZO@|zm^;7T7YE1rkwMF!dOz<;_%<&AAB)-Z!^OhK;{0*K&^I1^PDZqW=FN@%g6G($ z{rACmZSd(f2S;H8^n82J@aZ|9g!bN$o2I(H$LZeI&R(3${NA*9aS)^}6uG-C_;@;{ zLE7=iM~-CQ=WOF}y?m*w!5_5iqK$K(*GZhsSA;OaQ}kA;!;b}nlAQ)YXN_`U5RPxl z=4}0vE#>@0FtG^HhVUI5SxNi|a=EHa18<vtCpq)_&?R+!zjZx-7EBeseXJHO!_^o= zwg#K`xc(JzzfefLqCloI7*8fksMz4dY3s!;2HRbLeukH<4K?#)*A9i0CoxrQeBute zXQHi~2DD6=YvO9y@W;23PYAVF*c5t0nC9PY+5{C9%{oPK$wPP3^)C_QN#lx#*A)n< z#Jz@5hDO+T6w;*L1{6&z355_jvwPxuKVmuARL^23#>Ofly1zDAr$A$Y8>ZhAz&T5_ z!4vL{XWtR|5+g|Cm>tT-Zulcv(SeeC(*^U8!W+FP)oVDli@I%Cc&oymqI~GhFxzzE z+?J<D*qFp4XJV*wk#IhbUz_T3pJ8v7X<E2<jU(=2_!}(8vr%&Q#RchuiH~1!65w3E znC7*sGO8&=O;Z(FUs3QU?j)oPBU!EN91RQCsgx?s6=mca=6UUA4ot2T9`(<gU%i<| zQI+phe8jUpb`tHw)@u&d)63wtTS3?DvOmq3E7#<zgy-U7s5YXWXEdnun9^uO!X2$n z*E+1GWzIBUEB7d>E}1;8xyWJ_R>~<KnX;axPkE+F{epZt%{&rD2=5!`eV)QDKr}zU zJh!7_3ODLSNJ(5@s&z_rX?UK`Q~^3hLj48yn5a|&g{r%uBprQ{>AUAVCagLPXq%V` z)m-0$XKDaqFMC1>d`!si$U_!XwK*eku4<IE!x(9`*qTMn*jkEhT37=GdJufioY${n zR<78bDYRlgkmT;z8vTGCHAKWRe$8#@7D&$Pc~!$RGhoSpzcjh@WrLmpIW@IXe(!<6 z5?e>HUEVr{rm;aTSMT+EA}qzEXq0u&3`%~A!gp!RIGt^r!;-b9EXzCsK6(kv3gefY zFZT8Q)&khirBm(*2oejOtIN4x59kPTzIZX$pQVKNgcdk+>HEFgRh}bc3d;p3V$L$m zpwu%kFM8(;qcY#yE0Tjw6oV|Kq=b5Ufsp0!J-C~N$U)pGQTe62lh;*iP?h<`xMM=3 zYq!Sc>}(LB7R?x8QxkRi)`v-K3FN2huh>kk*jM-&lM5P{SV)L)RQlSqk((P<@h6`| zoh`-6RdI$;7u3YBQ{N@Zi&x>xEokfQWaPRk6nXZAwi$Gmy783K8{&WE%<DswOcdjv zY^#dL-ri2Q%V|aQ?WHy>`4&o7>91cI<%T5ljREU<(`S2scS>&jJxg*R`|h_~B)GKx z%wSzocgowD1DmLVr}IN+V>n2}wo-N0;Jx{RFaG{`3RV@D;)SGo;*=#dXRu|X1?#v< zx<23VPe0pox;t1GDyWVnr0mK(w^C}9y(cU+LWu5-hYf*gWnO<bpA+|K=X<zy_cvF6 z^+d-Yd0V|0O|EjM7S8$fYe{|9>vqN5IgK=|-jdCl>PAY2Ok!Ef@s>yesk9|om*XRa zk8^}g4NUT^dFn%}r4fY8#{&yTs%;`r@_ShO@Rd=KD3s)(@Z@3s)o)pa5|_4!I(V^o z`ai$Z>(aJ_!Ie>?Bpl`yHIovHP-Id%R%gtdxhisXAZQJHWN>iCeutD?-VxPpP0q>E zG!!4QlvLHj5`xWZnKP0}E1Oa%#^seex3G!y&=y>PXPvxH9T_UiONC7THK{72IJqu3 z#FQdL`#sZ8k36iL!D5d>)rVdA+QYh|<U?x{p223XnVOYW<~eeaaV_d_+nz1aH3_qT zlS!edPRLLu1!Ax7!L*;pSKN|U!W{s%Uz$tZSPKU{oD+||JQ*-`P|7opM@Cp0=5j8& zPYD&n93P4pD}^^%m^(UKztO>_?Z)3<gr{pS++#k&MTr2IS41Tt1?tCnFNK8=$)4Yb zOAnz}YN$XnHs`>KI`LW&#of$A1#Tw=yq*dW?=g;+Eyb9brSIFNZ6S}yUqGOUlpocI z<jqs$VDXGPh8`*@M*m8*SIbAHL`a6FPg64|86kusM&p_%my0KgsIqx+lTw<i*VG_n z_i1iXB8Nx0(<ir;r%idWrGf*Iby3+K`3;IxPhC9*VHqq??75Geio(ajp|F9t(Qj_E zG~YgY;TzFxA7gb$4%keIcf)@1fp;U74YYlxr-w8}6%uIF@~#yPpb)}Zg6z`uQYySM z^M}8|;757e7Zgl;b6%MQn3qImw6;T=wm9>3<fBVrP$?0pC9eJ(5aZ8qi5%yj<)h*` zLu}=^zRHAZvRkGyg7UCimpqd7eC{|4BkPGdJAd^|h^4xYhtvnsNKjZAu<uJ%kKXhJ zQUmFW+t(O}c$^<kW6P4bN%peRxWKLI^Rv?Tyl_Hyy}?>-*J(yae7ExCMfB#_SNB4D z<FB`<#kRa6WtFlN75hCqUNd2F=|#U&{vzGLE^5NK-v=AzE0$J^!CV3FDRM1ZhzreZ z>^X`ghLsP25wYGBt!P5#4J$C7n^bT%s-CoHxig&R$X1{7N=AX)p&1AAJ$kH~nc@03 zD694AiEr07Z=q2T4qb-%8~hehF8r?njz~XlgrA*+z%lWCW`69`L9PCHG4p)S*HCdv znodamh*Lb4KbSP)eV_5<MaSyE5myKT648jRL^&PSK<kwxNwH1i7ZE_{QlvXxEfi+6 zSRX1mf0#R7z1TErego~7fO@FfUYH1xY1_|spBrtoBtz`#klCyms9;dfNSB)&^4X*j zAQ%XYrYZ<@a=374jOzWRSU;hddZyE+BuBQQ$&F7zDVKR^(M1~R?=mpIsS8wVYTp}1 zOIw&ad!1OLZBWvPwS$3_&dyyO*SIX0TQf3V>orShLzsbd*@~Wyl-o)+8bY%#x~#7) zj640~IR{&wHi5`DTE2wjq`jH~YGbL!S@nn9z}%Ci%DOvjs|uXV)n2yhobROFU1bb8 z&G*a9tGH(^ZAaCT?m`<mdh9j1fYUbbrrA5P{c()u!$&;=lJ<{F245ygIxcH&=M4Qy za@`F?H2SZ`#Md@;9ffwwGN)oS!>C&C?sVBlmWb(tNbFRL=Li{tF9>`3ZsMR4P)l6= zjoj1ipzxItl)c4n6dE-&>U`#C_1Co2;GWrhI#ToL&p@kTns)D1Aa(;@F-Ou@FYPQl z;C~rjQ8T<6ARNPdNSSjPAu_a<sxuM}xf+v*$;Nb$oS?Q2%zjUbxbGN66&w>V9+fS4 z=8yi(uD^D$)FD=dX{uMMByo@!J-4cgL+2V@B7~M66MN|TM%F_)W0T!ZKf+H1cjRLd zfpdC(E@Ep>L$p=78XuDSm_<%P#`xormILr=fu_sln6dqKt-}v~Ey3e3G4|t+3E`)s z!u^5uhfMb1BbZyG69*Mk_MtQnOx8?duON}*$u>dutlSIae0(G>DcUTX`i!`QU9NXJ zXK8Tb-WySH3?#~)A8?SQ1mZ4UjY5r)SYEtpgnRAvNuoTF#8^^*WhbBoj)DYT&~YBh ztihB6Dd*JO4xhCEy4Hq%O<4>cx^6cvp<neCtF~wVg1MFD9bK1=_QQ60RhQGNwwodp zMm_sQ8iRTpT)Z#RI;XexnJrrG0!40Wnch8FyFqT2v`QtU<V<PIPoK@}Ynf74v&x+( zYFe|Zl)qR};jrr>+HhG<*<R~9wu<b&i?sh<N_f*wzWFYVP<EB>N8|pg<2Z`NisLkj z6fKNq^|<xd1+1>*rds76FRcV_=1$(d<9I3)o{WiUHF;rEV$D5TfYpaG3d0@MzF9#i zxyrKhu7yyX8{U3nC9XgsW*Pv)mGtll;5<>)sXC_an(L(Oq~gs7o#D%gR3w4LJya!| ze6=h^;(7gGbG)C7t1+)()OH<Fz&F%1{<2h<-~R14SeqYDaG6~{Dr!19;%W*s5bGSu z^b4Rd?J(ZHP)xadbdM}DF7+l)f1fJ#`fir#O@KsmMRp}Z$Z26=tMvjyPQ)0%1;$Vt z3lWLP2pjP$yW)JWr65shXs(y^tXKs}#&K>gN!hW<YeDTJ5e>BMZ;n+Y14qxoV^y{u zXTq^%Rnc&dHwCDK*x&QqBn#Qp%fuFj*9~g=hLEurNLvMa8T0U+gm~3T?_DwMvdI*4 zh!$g2he`{ot8N{3=i4pJayn8GD=l1WA+X28Euh26=Cm1D$u1oFsf`$h&qD=>x=JGL zad5n1Eb-5PDU}8o880kpyH57_C~sk_k5$WrGB<rKR3i*>vz_s&A?~!e?Gh5Wi7b*n zZ6kd=aL9S7=&^oDtS>~<BFe|syf={B<s<3U_U8De>Wmm;FGY%keXYm)hNg|wc5z0p zzJAKbZA`6vtpn&}X76`6bj0j!-JkxLoT;@wbn?+^J-`6!;nq(t#*axKZp|cioBqPL zHahJ}o&LRy#ha2bE_SABu6#tb-RMn$@z;|k;}*n)7(NWdlQx6(rUJQ<qOTdHi_AI# zF^J-bKi5MoCqV&lT9@RN>xb~w=>6#93lEd(=}L$@Yxlj;zr6HKs^4mDLt2ML!;A4w zzkR=Jw06#5q^635Q-qnHCNRj0HyC3Y)f|Un%3D1b*lpZs<<a9JkXXH^GtlGYnag4^ zOW^FpJKor|_{j!p3ifkG;%BEF2_AnL)EvWibbbem5*Zb*YzApZi5NS}j$+C}3-3F< zy9@Mw9GTt#N+$rBB}!5Ys~TD}l-$$7SL^*xQ7zJ}huFv8v$jl=jahg!Y=<kh@>cRt zOhS|QSpl3^hS{t&0!q%#cDmT~gR&L5ESv9SKU6~ZJ%44qJWD}WZ&UW|r3`-Q7@~p? z{ew&;HkD<y&o|W)DC<DUi@8y_O51eHG^CB3vo4$F7wK?{K6TF52f5hgrkN2qLXbNt zddsNX4O+Fr594oWP<ck0(frLGP)4-p1gFX$+l{`-kR*F~8%-a_?Z)z!4}@Rkz$t|% zc8IW>Ns^}v5}IWOps0_P!-wqSTi}jwpzIdz=GH7|Tf13v@Vy6^X%8k3McUVP9GoG1 z+JhKH`!ovi1@Z&JCyQr1r2a0?zI#H%z-+8RoWMf_Lr$Xm%gS0H_|roe;7$kAK*hoP z<M~_bM!VrcU1&lKK*kmLo}j&Ah&vL^-JCYJfO4dU@FVuekaf3%z=3%s9b2o6Z_EJ^ z55ZA9STmWjZ#6>s46kRif4ag8*Umee?b8c7ku22Md;+MrL_{UK8H$-?(}m>idG)Uh zc@@!ee7Vv9tivn{{({1K#Kp4mtT<UlABnrD8yoiMjibT-fz`9dYEJzYMeA0Vh7Yy1 z<DW?rj?kJK8rGbpm!cF+UQ-roX)L77%lS!LkPf;ye^vjQ3P^~r@$N~Nku0eWp41Ao zl+qlXM-A7@f*1%SDxW&K;X&XFn>iMTbK*mxPGrR5a)SN#uBJOhrlHQICJrtPF6Esi zm*(NKZm29crUJ}5D~t$3oy+x2B?s3efMGaf8sg_O)51%`wLZiSY?f?X%?Zf41YiDr z($Wea*ROijKei($86Q8Clb(GfSmQuh$7MUj^?E4;@y#Mf_C4Wd_h77`uMyvCr<T;Y zc&WY?-JJ574WR&Z&hmla5idnFi)%+!w83jfakPhTag$>5XzbsNr-Ec-UosWqO>L(r zp<xIHUy~h~$fL;!Mom)`!{vn{HH5h?n$I9pH?C&Bc1Zs~8~N<EP3`k}>KnIwbmY%v zYV4@IvF6mm%3c08Q6WE6u6N3!aT@!r&6HOa<PEd?)5_<!3Op)VjjDwO?^->OG!Jyh z==JJR2y9tqV6#xvxmqlP61ngiyD<n)nneQVHB|%6u<+}jaglRneMA|bfrNE}m4RM@ zn@3(GGYvwoRKBpVyP!D5F5lv^%pZCwOGXuV7$do(@l235PH_|p71&^g(x`+c<T+Mn zZGi4b7x%gGY~8O}_TEak<NHSYIVbR#@K($sHRLdzr^hfh!9{_{n2-AHr<JIh<SG-z z(PzR^_~ZV!J9yUactj*LW`P39GUx7To?=2(`tv@NQ}*!n=CJmXe1bLj%_Jn>lkBy| zJva7Acy<H$4>Tp50=>}Grz#OMst2G9ay&OuNj!$3lsqBc@V@aj7A`z1Aj~8yWV-SX zx3^{T+E}L*JPTIz+NkAt^oMizFgEj|<QRc!;_!VJn>h2(6=k^jdeb6_uXilo^?a+j z?k-*CF8&e!@lBR}71q0$0`J(VR{Bn(0_dpc*lgq`op4dv@*SNF8)pPVYdAifHXQ;E zS=qdXydy8%G}0SFvn7q?5#$%6T4~+rYq4+&6hc3e<=nNq+58AugPE&*i7S08wXuV7 zSnqB8fO=R3h!4i%=zLzwyylV=t@iTB;w+x=V5BlOrb6|m-TVqF`3DRy>3zQpWB!Q6 zRkZ#`#gP)cm7db5C8D7ba$`A1^z9GnL9nQ0ylKM$AyC+GxV$_Q-Mpydj*baIW<*4r z#=>yxuY{lWCl{WKP+7dF?qyM-QF&zj-rex_nHY;-!NYxqyrWV7?pNi)OJcj8GG*&d zq^w?|W+;D0e^>;cbuW|#3g2$=ilo}T^G*+%J$|-LW#SiV<DV%&V<^RdV`2FA<9O*; zk5!o5noR8)<2R<7_RSgil9hYh@8(uYa0d=ssic(HY-(AyLU;uGMum2-r;jkaK9<g! z&gm?%9fnLX_}usa`HP?9oL;+xk0ij@&D6VnZtXK$c37n8zga`jII%FmcEPbgrEVfs zdM`KmEtouHnt&_Z)BinI0@N04tO|f_k+}6{g(7FwoHe8eM=Kj0aer}zsnSMFyKq-~ z6iqw-Ac&k4ope_7-gpJhtbyn<APr{Wt|$h2M+a4Y`2(%arv|}@EV)dz@UD(+Gsg!D zmzSl_X<IS)uBL3rL({!2cZXAfyU7OcGt3fNQo~mp9B$h#IF0IBRCHMCPo{zQ+HK}G z8I+r_Gu>5$4_2GduOE1fD01d<i4P82Z(tKOkEz|8SGO5I3F-tWn6c?FoV=?EQA2H! zC=<}Rqnt$^n9(Jc$$4#bXRfDmF`HC;)n`S>)}~bGlA$!w$hdTO=s7`eQjn{MONE&6 z25p_k=>qk_##Cz1@bQ!|(?|~vS23r7fcj*mS{*yanU2@beDz#7E$+!CC3T>XahjkA zX@4jYKQG|mN`o(XI7@1lNmYycv}3}&Uhk!UX(`u~ZR9hpi!}pbzvlL1Za=@rA?NSX z_o`mID|LHkz(5pIKj>rOt|H#=Dc4-Y`6Pqzg@cnAZbHM{=`IMZw#Y7Hsw|g8?BxZp zsW@3_MQ;~6yLTxUfR7GsZEq<ntqgBqXCaUX((W{C?v{W_iayuz*E{>NK7!#w-mg~0 zorkS!_2p)*I|D3vD?b3-Dl|vuhVWO6)7-*f$zbugKb1VAfc=!07vlO_<D#r%MqP1+ zwOcix6Z`8?#ufxSd=Y|hTA|WL(@|V`(Lf=hq|Mtz-Wd&t0*kgh9-AZiH!NBC0EQrw z0lK0ISE-rh>(Lr59vy(kI93T;EzuDdO0lBmM5pily<Qi89Nv;2rHgGIg6Sl(4LSW| z$n}faUgX2PYqP_aYq$$?r0(H$E7KudxvQ|m(HF@()=omb&uPEym8*a9(rDX)jI4U4 z#i?W_j6H9Yy;`<^S!t>+QLhwYfhE}PCJFP=0-e1o^J!W&eSyyh@P%`+o&pti$={i2 z6kAak=P6^xlxKA?`y?k!rkI2z1RG88exs;zU6*vJqflozHQV?5rWA?y!51j2B#BkJ zRjSpy9=ZeJ$CD{BILX*mcWpK~I3tgn(yn2$q;uS(<yo7sR|9>%I0^v)meMBi8_w-Z zJ@(w?GnaNI?;{$ULv+4oQyee^8e@#o2Tnw6<U~RYL~NL25WNhfl&I-~7nPV)hMtpP zsfSmWP>#Iqr{FPywxC^&uduFyPrIZD!xbrj@1sDENP-t~gHGv8X)K(HuQ*lE^vS$u zlJbbbnnrWM)>e%&5klG2tkg|z;h+$tAr7Ez(D!j@Ex)u_P)tB$e!Jq+cE#i4Bj>2e zDQ?WWwu~dU9XnPYZ<zR&sgtgg%Nuq@oyG6%v!yc%QT31`su!U=%BEs{W#eO<y3sI- z@2Q{9A705*a|L?0HPwWVaqi(S_jnfd!qikl+#`K5@+TDWXofIk@DHVZ?fYz2<;RQu zF3EViB->okTME012A>43WvOKkI_mcbuSK^S(0SwB=#%0X0jzac9$0Z+)`gfJkpqMF zt-#rssxB{W-P?h_muSSHau?lxkJ$=B_nqNTw?;`vrQE=h50Xodv0dVX34m!T;1e27 zMAz#EFTsgtdv|u5KAOc2NSLFrI+dEmV#5dWG@d*Iy%;1nU*k4%6GO)Ypgq(2gQDS3 z&~QD!bCZl;Ubv7bUS8m#dDH5+WSpc5WNnhS=OBwfp=k*Ce+mkL>oH3i==EH}e?H(* zqNv4!>w&kw$$(}i(C3NnS+cY1u8$)$+)G=Dq7qnbu5Py|Be|SZYj}udE{p4`m)$7v zwXu%6!N+6{(#2oFDq!(}V5b8^uWj_Y|2&4&0;k*s@#8_Azrj+mboRgnF`iW7LA%TF z>DIf&qAk<*)g1um-Q7WNA)tPYy55TAgga>Q#4J4YD+}NJ_T?QSY_AYwIVtjBqnPeM z2~1^*TLj?MXX6fJ$q_PDSZ#T@6@NdycSfHD96;0VP&X?x)t-z}F5j|I*putD+#;_O zQfnLr4aE}<$&1T0pCO#0ZxES3estnyPcEdU5*gn2dWW9#`FLneoaJVSr&oXUHHZ1} z{Ug5;ap;=GQ!W-_b~6HH?0J`1X1z)={{5L9cMI{LKix*58XRe(HZb9{>HBN86Uu7L zn51x26oMDJx#1d*=yn&El^H+ksl(D7Wub377D@dg<C6)}Clb^<LVVFy-(O>KbIgVv z@2_4aw%XthFa|Etj8}JNWS>^_WSueIC`4V5T-iAlQgwZ*m}9$((%M+fWx3E7v9Ibj zPE~TntJEb#EH}u55Q9X2W-SI8H7zO*(HB!_A~LkYb=dLxh=1%lhm`g$p)^e?5}VQa zA@{@Gb-th;$w`9yYL@qD@AOA*Al({s@)>`P<s_qDgT;EsbyikW03X2$^tm6TrD{KO zjLuaWTJrf#to%o~+Zy3sqH)E9EjL(Ed4lL(D^8)BxzDw2a7}f4E{Z(c!HJ4Id%=&2 z(mdpQ&{GJ>ifM<?k(la=t^%?gNmcglqCuGBuN$$lJ~=9qDYk3`tI$O8ke>yIVTv}? zN6|C_+NT;;6*QSx3dcr^eT0zSc@sd*MR&i_V9~~g=hB2DsLo!P<v<hJb0xz=HWq2h zg}HJtbegcDj*WDZbbuI|%2d~k%pUGnDCSy#hYd_G57$Q16KM!EhA|DP*Ob=XG<X@M zO>Q5eOwje6#W#B92m{gRLqDr7k*r#Eu?FvQu|#ZzaaC|k*&!*(N$ClVGE{`w<~?kP z#@A!APfW(@=L{!x9*?7?;mqCo5AOs0*LBA4$5!l8_k8c(ja=1T3w%p|?uvQGy`tzW zsh?RrXB`#1UGZUfWOzz@5i<24q9siQ7d_SAafow|;Eh#^V^u-qrhal*Sj%`DQws-l zcZ&`5rCHeIUQN|ZqM1@?Gw0Op63(uHn%ugn%3%j}F(a1yb0+3N>!#0o0X~%xbD5O{ zqnf)Y%6o&*c-m|aoS($YuzF)pDB5AaSE$n)mn8#o<<9kz85M5MDzWX?p4qs|;pR4~ zEj8;T*oVnH+>iu&Ua$%5&@(s7kt+C@556b#0dgJAjN+gIUic~ak=pf0jE55wbka?H zU}DkBqE8*M0*qN3W)@Gp-*k_h(oXzr=fuvwI(G*9X0&tNchq;lcieZaGVzifgDzi@ z;;Q2zkH1+ngeUz3-jtJ_u2DbNeWcDAmuuL;scLHNMOy&*nJl-YLveqS#b|GuDJ@I6 zD_8zhp~|7#y>i-=&hYHKyR5DMmG!cwZrM-;hn{8WI@>VC^vmZn3jEzu&mKND+!b*b zW)_m(iblKUl4iFYrq^@#4v-wWl+a1#cIzGnH+EzN<vXVOydd*M%mSSS$u)-R+MyPT zBU^-$N4lbG_me!}jd~tl3h<`1y3E;`q}enXrySOlFnu>!L9=*d*$YLw);Wahu7;M_ zt=Kw#OK3LEz=@raQMztEOji%*aNnCAG~&}g(Xe*cOLe-=d-48;3U|$8Cj{_u+}q)? zJK@F`?xvCX&az{FfpPLNs_XFLO-2**%WCZw&-JD$wZiH1*vg}5hUJce(Jsql#`x5= zG!5xT*ssLjR7T&7?&z5o>Xfq{y542@luIZ?3B2~<MV>giLb<aush{`nhCE8r4yY2g zPWCgB^h?2(_LEhgP3cq_gizA>^guT9PNO+1*oY|h?cJ4(Rrlq#BlFj!qx`^(j6i1j zGBu->9L3>}*YxXT3`5&iE9>~-2upoRcRu+lfX~~=u$3ulwXfw2g>quU>0|L@B`eu1 zH6&lnyL7uwLGCj;jzd~7I8H+jGC1}@J}}1Byc&fZ!?CP+)d=%i_mk<fWSA%Y`y~g< zIEBhQ4l^9%1RT7^Phl|c7|@$v4MFC?&@+;0``3Tsp=ygV?%XY3%;-q?k!}H46r%Dg z5Pw-QByNN`r)6jNIoy$1%B>%#?h{T=`E*47MI`P<B@Ojkr>jqWA<G*ZUERl=btytX z3aNRV6^hk@ql_<=CxZ^XZnu0_uvP7-DoPv#V%c?H60RY+ecghN3Cee|8PVk{&AXEf zNW|M+<7xUo>SsnT@V-Z$Xt6jTimy@8D%Ptu`_@uOX|0&kTc)#;RiaZIZ2>=n(}b?J zXF+#`rZqlkRA&Bm$axB7-%5p?VDLl14|A%scX3z8Nlg{?&8MFs4U#d8?$ey^ElOSS z5N8XTEPYIlD!+98;Pl1V>l)u4UE7Y@{(c$mCoJSN=+r-JgGeo85;Y6sJ_HG{rZ#k% zo9vo0g&(Ff{87%ey#+Mx_`DAH*eiHeRND0v7uYi67i|9IA<gSDk0Tqsqqmr5rBzyl zqZK4({yrj3L!OZiuv&n>jzfg1r5bU|t`x`T)4X*m>VZ1VZDqbB_9D2!W!6s$ufnA) zi3_I#34mwSykQV~A=An{hWR3_VXRD~PWl_kTJVXn^y?F;nl2dl)D1h)4E{KGj5Rjq z=3$my5B586ZREiXsPF#a?9U$(jsm?x`AX@gVH+p*v39ej9=*?y?ltaHk>}ni_Nw$U ze~q{z8Lb}o>-G?oYOy}UGwNG+pl5$n`s(xbG$m}eT@xi)mQF`<_A}|W@xUof8X>#i z$WvBL!#tEP{-WLZ5JsG{3*zgr6xSkSoYO{bnDV&28>|ZIyB$l!d1E4P1{j;+Z#(H& zSz-(uO5J=3Xd`NlOxNA-uqtTS({S1STD7`6k^{d=qm;{a-xc^9(7RM80Jjc!mNNob zZL~^NS;Ve1*wt9%_R7mtYY?s4RBJLul~=O^Is5YYQUV)y@{S5Yb-ylGDl{fe&wWxr z90#mv8p(Eh)v@fS(tUYVHNRWDA>bT+mVuR}ROYr%(Dufirmgxs458MNg1+H)u$u5- zZ7~`Bb@K#98U4Nn;>-JoH#e^EBM)#}k5E(MZ~TlT&aOs=%Yvi7NT_kBP*<GTRBO+4 z=8NTGbGaeAzOg^~(%MeLS7Te#na@1WN|uC_s-|zaw!+Fni(5ud|MKOY!knSviXg3c zNZ%`t`6)u;7R`h6tno0G$=Z5vmMK>Mp);Y}LQ}O6^ayIc`{$w!%+wqf1XbrJC-&zb zhHhd4#IeF3Fb#%|INRac;LKJ}uPlSG)A7y2&D8Qho~VW^L)sPj=5|gB&WT~CqP4x+ zuSWjM^4#hg)k!oeVr@+K*?V8@)@?o$FT!Uw`8=r~KRyY5+0Bk&+i7?CU{+J!?oiA^ ztHe8}EA1+Qc~#)e{~T)dbSgXhSlOb}$+i(HxuKbVDg^4*9U1YM?*@_Z!8_kqNu9Rh zgDsy*iRc>#pAUX$yR|+wz8~`Q(cmHn^7z}l+c3ZAX}OXu#XJ|Qb!$db4gWwE?9ou& z;dJ}TuLFwraXx}mEqLey#aQ=KwjfWP{OZCKMxvB>)2-{ZF(pw;aTie6Q|SF8)Q}~^ zlty;Hr-h#pWabUhlr}O=%=D4N`s&MLg#IjPc3eBsgTXcrC60j3YgA2Fs^^#GKb|_h zZ#Bi$%B-Zu)Qu;e9LnVManGd>&0d`qHd~;Sbt!4C+Lsx5KF`#w!k8aa5fU+1l*ULx zu$sxzVrAxpj;Q6&#;d?PIV(LN{c>nTsxL+$%?*lofjmE!feXiYc21j;58s&h_BqW$ z{4?3P5bc0b$rB<Ut$0~BG>3qSS7mQ2&bx0Qbz&|cni6tUmK=l+DY0Lq&ilAHXu#Xa zJ57n}rII&1Uv4%-v#D7{tr$DgBFm&LBHXT6ai&>}_7TUZk3u#rM=c0fL45YrWmD<q zviOKw&5}h;EyPD-s|#`GN!AXiKC${G^%da#2Tr!?&Lp4>#zO4rM;QvpX*cCZ6jKE_ z#(v9c=XFNu+HlnnOF11J1U_BTLhFw`VaHB=ini;DZs|p~#l9n4xz{VPj#{#13m^L6 zXyI6wm;{?ei0;byTI$?v^HxrC&8iALS_Pz!k7@<dGEyn(Uw@VmHU;RMNGR?&wbK$6 zUPVpK*Cl@|)IEFEj``7vh<uJKV_J@s*i0!xu2n%tcJ2K&uk_$)FDvxtoV?vbGbD9I z6?!*`nNID@4-Kbb=iPn_g+D5A3-h8HDR*VOOO4zMU$4kLU=Q*6oEK_NDSeyQ(iV3U zpu+CA=Tl3epKNjpemG>9c4jDUi?^5-;Z4q^{q{)wB`-9l@?u`1l2X=fIeywLaGZ>> zTHCsaZNVvmjwX7R$vpO4diYuok8WPSR!Smpv5D@uAoPkqZSD=}E>}u=K80O+84YIw z+cpV7eAU=NapF=Y#T4FY<qsS4H5ovnbo7!EZ^Wjs#CC+;H?!qcb<zl7y7{c{5j%P6 zA0JEIod{B&(;0e|`njqgMJ1NAG+$G`x#~i+4qY^y$-YXDz?yghy7Q-3^CTNL`5~Ko z97>QZ6m)bkZ@abE|KP3+SHKIJpY*^`T2x}8;@zwxF|TeFupZC9biQZ6vN;)W4!mNQ z2Iz?F*I*tmY{T1Fk|<OUi|!mEE+80KE}|ZgK^W8|riJ5Dm=ia|<7i8!_=h=Q93NeF z5{+E7L#D)$7w83kFVr@S`YwSd(D}Wh*IRHc^ip%PQdylMgmnE$y_IML@MVkB2eK1j zOKiG(OV7Z)=`C?YEbc@3kx*?nS$lvx++XvF67AjxLw#$8Md(?zf<FsrlIK5(%W{1< zR6I(9yXTS9aj^yS`f<>XRQQfn?~WBu_#M#|`K`%8?@;I^nw0SD4uLQP)E(5tc{KC& z$M&7~DeDZL?I9gO?B2y!?<e`i&R?vnbV1pUELV(;L?f6bn_brC*4CSCo8b;Pzca-1 z47khOe>B|wy0(vhK69M2cFRHNNfZ_9O==;ECJy?)S`z5(pf$Khw7T1Mt<6q{kimx_ zZ@G@`Tf>&rc(iY4W7|O!y<Xa4DIbs*1jiJ;a`az^H1aS~3UzusTpGr{5e9)W;ER^v zeR<PM;6%QB<2$*2+SY!3MtCOV(aiVuc(RhRxem1Eg36+F=IMmSj+e20dj9g;O=a4# z8!Qpy62x*|x5-X^UowA$1stVaUNcH~lYQy6y$<W34QiV1ERPBHa{?V^y}>GrhsEBL z$O<kCv!U%(|67j((J%}#KC#J`wf42HY(YU@Cie=azBSE$EtE=AE!cgJOihMs0xb`% z?^+#ATdUZl)sqdC{-GCs7sDHoBAUqKmvH?bidlH_hv!U@wDmk#njD{*AwiWKKv-Q8 z(nLp1eR;iNkreBPz-|u3ne{Fnb1YL<PAg|#(O&=kD1x0r&*|`%!j;-e4OMBYpp0&l zt)1Yri_VJxu~6wwZ?`&YH5;}q)M~{6baa3*{IhZ29?7HLprCM7FA*!cp7u)_**B>a z&JP~~snWev`QU@_@?otgX_FC>*f#3btHgp=P;0*3h)@Xcd{!-tU-4p@Bets$pxyZL z)b;F?R0#RM1>*kM4Frmf=H>o3g!!*MH~+-v{u@I3Zv?jJuLx{;D^q~8iK~@^y&AyT z>NP0j_WvJ-&B?(I3d3e$2SwX*bCdD%u>Nmh*gU+TDBgd=u)%THe}!T5fFAz0Fl<(E z#O{B_@c!BU^zTPlI9S;JZ*ka(BlbZo=n}U+A*rVnkc5!oSmabMq#5p&XWl{t$V8|k zI}cI#8BORf$r|{_obqo|as*2>R@-uiRNGs|aFn`O=t(VX?h&Zcw7GIkN;Vp>kG=Hd z_7#N9trlFX#{8Bnh?c2<{_(E<c<1cMWEqvl3%Lh(A>sH$LeK|Gs!M2X;4;#yE-@ld zK#TFcZ%(n7Pn9=fp|wimQ%mL<lF=2eM^|h?R0XGcMsDG;HusLTcdjv}MC(!#fF#Zi z_?`-us@UbL4nOIf5P^hMmN(Z%FfVL%I_9Q4n_P{#stG2m#Zc<#%ZmU{6vg!BjVRAh zA-O$B+qByu%RMNM3H?CcYD&j$WMGuH^>>Stip`wMPJ*Yy2+tb}3lw0|`P>C}LO@r% z&_(Q`RIhM~?svk=06z-U3nN+Br*MxR;XMb-4F`|)(WjO5Pr_?#6Hh($z!=cWN>ISU z>tMg0^_5S;@!1#Lb!b3ysvuS+h*<cEi;08My}c|_etg$-?(Bx~>GLiYR7$PkuP8E^ zV^05#vpoOC*Z)J#|3mQj|H{$-8bQv%_D={oH;AVkAl7oSu#kZ{%g)35^UB7_@-q*d z&(8kq`JXhn{O|V=!S8UhvHepPT;|Uo_`Sd1<pJIQEX&D7#s%6I0V;?1ryX!Tf8_Z2 zKBx@1Ecg#x27LW5VeViZ{?9OXutNN&iu|=_PLh?36^tw>#2vI%;^*gz{@&HV2Hr~t z-l_r8CU8JK8SAf&4}U%)0?L-L;~@K~g`karpgn`&x<JwJ%n}~1QfjWC4<3PvNJy!H z`uFFFva^Gk8o*VL8T0`qW_5sv>#r}6i2b_A{JMz#{N%?!n=Ag6;^){agTGh;`o0Kw z|Hd!rRRJyzZq8-^7qXust1>G9%&knoyBWbf-~z?^bMvwp{6Fntl=;1j5%gISdsk2k zpelch{zshuNky<YE{M$kQwGF;g#cCXj}+ihle02+0qwH{*9*QCb8rJ=``307w*R>s zM$81Xd&R*5)N4>%zdDV`4Bi7HVg|Or;IE|oe}!CKOT#b}eebWxi)=$=`MgPF2wj_k zPl7}6<7v!J#o0pFf%xk^*`}<mU?5F<I5#)xJvVPRm}`3f@W`s&W^;Jp;uKU#R4?PQ zy0}|RI*~o8SIKY_6-sPoMJNi+jpf{;4u(8NjS=dz5+Oz4o_DMAho`dxhrr$Q!PBrO zI(FETLI(~CSC~r%j3Qq75?x~5ITSL^FC`aBz_lRbl|Scx#QA7)@;^SCa-AR{Rf3t0 zjgc|Rur)hi!dVZI#m1^5hWDu0E+&M<=KGk3_`8^v7GdjQS|gu&nACkA!eJW&o^}IU z)YuNzY&=0>T^}UOU_R0~2KqdTg)SXiVGW9T`xwQv@9~@%@SGg1S-3xJ9nrwA=W5`? z3q<VKZ`&+UP1VHHW%2e^BD~Yvx^CHC{W!(0t98wA&OzGv$k`K{kxHEiiqbUaBIS87 z!Kcm^a&8I<nO!CSQ)0^H^(uQUSMS^12b(%CL&%iP=gJ4EWkyoYRhC=gl&Q?d#M!pX Rrrpa>cxW{_I}0~O@(p~QbbkN< literal 0 HcmV?d00001 From 3e398b233b4ab56f17b27cb0ddfa72041b55b775 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 8 Jan 2014 09:48:04 +0100 Subject: [PATCH 89/93] fix compare with leading 0 on directory mode --- cdist/conf/type/__directory/gencode-remote | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__directory/gencode-remote b/cdist/conf/type/__directory/gencode-remote index 800fc6e4..e206ca63 100755 --- a/cdist/conf/type/__directory/gencode-remote +++ b/cdist/conf/type/__directory/gencode-remote @@ -85,7 +85,13 @@ DONE if [ -f "$__object/parameter/$attribute" ]; then value_should="$(cat "$__object/parameter/$attribute")" value_is="$(get_current_value "$attribute" "$value_should")" - if [ "$set_attributes" -o "$value_should" != "$value_is" ]; then + # the compare isn't correct when eg 0700 = 700 so we prefix the value_is to 4 chars + if [ "$attribute" = "mode" ] && [ ${#value_should} != ${#value_is} ]; then + if [ ${#value_is} = 3 ]; then + value_is=0${value_is} + fi + fi + if [ "$set_attributes" = 1 ] || [ "$value_should" != "$value_is" ]; then "set_$attribute" "$value_should" fi fi From 3f08565e592eb0d7300397fff38afa4836652216 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 8 Jan 2014 11:09:01 +0100 Subject: [PATCH 90/93] Revert "install rubygems for ubuntu/debian" On request by Steven. This reverts commit d2c45717f1172d83d64209cad12d1c84f3e16974. --- cdist/conf/type/__package_rubygem/manifest | 33 ---------------------- 1 file changed, 33 deletions(-) delete mode 100755 cdist/conf/type/__package_rubygem/manifest diff --git a/cdist/conf/type/__package_rubygem/manifest b/cdist/conf/type/__package_rubygem/manifest deleted file mode 100755 index 7199d939..00000000 --- a/cdist/conf/type/__package_rubygem/manifest +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -# -# 2014 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 <http://www.gnu.org/licenses/>. -# - - -os=$(cat "$__global/explorer/os") - -case "$os" in - debian|ubuntu) - __package rubygems - ;; - *) - echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 - echo "Please contribute an implementation for it if you can." >&2 - exit 1 - ;; -esac From de1913049725f9fae6a266e4c66d6bd4ab65ac4d Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 8 Jan 2014 11:09:36 +0100 Subject: [PATCH 91/93] no changes for __package_rubygems Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/changelog b/docs/changelog index d606ba69..06f8a29c 100644 --- a/docs/changelog +++ b/docs/changelog @@ -7,7 +7,6 @@ Changelog 3.0.1: * Type __line: Remove unecessary backslash escape * Type __package: Fix typo in optional parameter ptype (Daniel Heule) - * Type __package_rubygems: Require rubygems prior to use (Steven Armstrong) * Type __start_on_boot: Fix for SuSE's chkconfig (Daniel Heule) 3.0.0: 2013-12-24 From afb06b729eab62352c3443cac7bc2e6721e9c415 Mon Sep 17 00:00:00 2001 From: Daniel Heule <hda@sfs.biz> Date: Wed, 8 Jan 2014 13:10:46 +0100 Subject: [PATCH 92/93] mode and message handling now like __file type --- cdist/conf/type/__directory/gencode-remote | 27 +++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/cdist/conf/type/__directory/gencode-remote b/cdist/conf/type/__directory/gencode-remote index e206ca63..05c301b3 100755 --- a/cdist/conf/type/__directory/gencode-remote +++ b/cdist/conf/type/__directory/gencode-remote @@ -56,15 +56,18 @@ get_current_value() { } set_group() { - echo chgrp $recursive \"$1\" \"$destination\" + echo chgrp $recursive \"$1\" \"$destination\" + echo chgrp $recursive $1 >> "$__messages_out" } set_owner() { - echo chown $recursive \"$1\" \"$destination\" + echo chown $recursive \"$1\" \"$destination\" + echo chown $recursive $1 >> "$__messages_out" } set_mode() { - echo chmod $recursive \"$1\" \"$destination\" + echo chmod $recursive \"$1\" \"$destination\" + echo chmod $recursive $1 >> "$__messages_out" } case "$state_should" in @@ -77,6 +80,7 @@ case "$state_should" in rm -f "$destination" mkdir $mkdiropt "$destination" DONE + echo "remove non directory" >> "$__messages_out" fi # Note: Mode - needs to happen last as a chown/chgrp can alter mode by @@ -85,12 +89,12 @@ DONE if [ -f "$__object/parameter/$attribute" ]; then value_should="$(cat "$__object/parameter/$attribute")" value_is="$(get_current_value "$attribute" "$value_should")" - # the compare isn't correct when eg 0700 = 700 so we prefix the value_is to 4 chars - if [ "$attribute" = "mode" ] && [ ${#value_should} != ${#value_is} ]; then - if [ ${#value_is} = 3 ]; then - value_is=0${value_is} - fi + + # change 0xxx format to xxx format => same as stat returns + if [ "$attribute" = mode ]; then + value_should="$(echo $value_should | sed 's/^0\(...\)/\1/')" fi + if [ "$set_attributes" = 1 ] || [ "$value_should" != "$value_is" ]; then "set_$attribute" "$value_should" fi @@ -98,9 +102,10 @@ DONE done ;; absent) - if [ "$type" = "directory" ]; then - echo rm -rf \"$destination\" - fi + if [ "$type" = "directory" ]; then + echo rm -rf \"$destination\" + echo remove >> "$__messages_out" + fi ;; *) echo "Unknown state: $state_should" >&2 From 57b700d11bbeb5cc65a5b203758f40484b3fa578 Mon Sep 17 00:00:00 2001 From: Nico Schottelius <nico@bento.schottelius.org> Date: Wed, 8 Jan 2014 14:54:21 +0100 Subject: [PATCH 93/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius <nico@bento.schottelius.org> --- docs/changelog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changelog b/docs/changelog index 06f8a29c..d83552f5 100644 --- a/docs/changelog +++ b/docs/changelog @@ -6,6 +6,9 @@ Changelog 3.0.1: * Type __line: Remove unecessary backslash escape + * Type __directory: Add messaging support (Daniel Heule) + * Type __directory: Do not generate code if mode is 0xxx ((Daniel Heule) + * Type __directory: Add messaging support (Daniel Heule) * Type __package: Fix typo in optional parameter ptype (Daniel Heule) * Type __start_on_boot: Fix for SuSE's chkconfig (Daniel Heule)