From b29a52db1a954249cae052ff80c1df6cf3d56f80 Mon Sep 17 00:00:00 2001 From: Daniel Heule 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 . +# +# +# 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 + + +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 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 . +# +# +# 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 . +# +# +# 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 . +# +# +# 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 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 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 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 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 Date: Wed, 4 Dec 2013 15:15:21 +0100 Subject: [PATCH 07/93] add old workflow example Signed-off-by: Nico Schottelius --- 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 z2unV#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;)|=pPD_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-tTiz6@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 zti9s)?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 Date: Wed, 4 Dec 2013 15:16:31 +0100 Subject: [PATCH 08/93] add more old workflow examples Signed-off-by: Nico Schottelius --- 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 zcmV;P2VwXhiwFP!000021MOT(bK5o$zWY~jluJ9KKmdpb5y#G?>9jqh&7sLz1Cg-A zh9Wg2LoH$D9#o_S;QwqV?>}VDRwp0HUW%>LdkGI0u;; z{3oMG4$PoI@Ak@Z)&&GoOM7f_RBD}uqq$a2ET`(GHahlBIpjV7qjPsKyNu7Hc z-Sl4F<)7YQA!e{4=NZ{EIaZ@o$*=XIq4@}LjOdw4%VMXqBn!*mNq$D-RQjP zqVuXt&#NxXhO;EqsSNeD%2AR;O2&m&ozB(qdNN-|#>JjnR)baCg<2;&=6@%nY@Y=b zhrdPJp^-aI!{GVA-560L(=V73-9d5Qcrbg0aF>J8Q>g93!8m2f@O4hlGNIt1_A^w+D znsyc!c!4;M^mTZ@{I+J3Wb}{n^PUH z_I5aW5c>K!=_*pwp`WDjHvd?&83Qa|4Q-$#2dZtutrB4q;S&{(C%Rrb1+Lim9I4FY zJ+*5k5FohuK@F5yh?%F`4zS5fAv{jST^L1ssMuuHhpEu&QSb8K(wI8lku%$kaU~M` ztGZWFVz_h-7k(yz)EOv=b(KbY+_{s}FnTf*lX2E_GW}$c&Hz<$>K`h)S330NIv^iD zgDuytbUCl&a-^BkO$e=nQO{r-ZKh~5sqX3F$0#zCbsSGs_0?4Id|JUap5q%;DYGu^ z4^}zu`K0$LKU9(RP}8hOfXP9~1*pZeXLMKKYW$`2Ly~?q<;Dj?M}oC#11+iz+_c&-DT-iW zQWXSLVA5jEQPOmcIiMVx?;McJEj&(QzkSLNTig&RT*f?MfKCY9V)?-gvU27Mh&Xqt zi@E5UaA&FwauBQ7Ki|DMc(ASV)Lm9klN#zbst!>*lR>b_VYZyXxErOeaXl)G-?`j< z`6bpk)RXz>%~erkO{L|n&M1|!Kj|1*+l&k&<1*N_%^!gn?uxA=+1Xtb&W4jD4gWPB zC8M_ZQ?AC)80(L%Daqy|d*_4d9gSc6u(Q7ny9s0(7<%^6z-dJ<*ge4xD8XLe16&BV z&4w@s%;n7P6L8{Da_s?^A&l~tD#J%o4L^zFp^AfiLB}k!vadKjsA{5+SUO;zk(c)ZGd+rh)OA|UxjFZL{SiS>;^8_X^Z?ghJ02i^tFcH_L zbm5F3+og0((6=1pwacumsn{~5d(`cM{KpD%)F8<5=DFk~LB49U{H{#3Z>;daFsZp^ z@jrb|9#r~sMdyV!je7ww?c;X$c|8+A7!#`ovTK9^#Ki4m4=}G3$s~&2z0$;)EZ&tHOocJ7@ zUsda@tfB~~EFVf>7v(=#l-EbM=XXt2eJ7V_?$3c;CpHHbi0l23vEou-6!4p7|NwM%~gxD98awV7= zOyagVie5e*&E`?mLD4y&Xv+aREV@K2YW%_nds|Na@`6_DpF#;X)eg0H{<*k#VS-C9 z0g|#wM~}{cNfnORVbUdHQsc)$JwWqk8aZwC?!-a~qWODhNdC$M2*k@rq@Z|vRfkDu kc$LPsBX*edT`{Tnp1()(_G;rrlebs@12D-Lj*MCW0HX5OlmGw# 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 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 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 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 Date: Wed, 4 Dec 2013 21:22:18 +0100 Subject: [PATCH 12/93] update cdist hacker with git workflow Signed-off-by: Nico Schottelius --- 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 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 --- 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 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 --- 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 Date: Wed, 4 Dec 2013 21:30:34 +0100 Subject: [PATCH 15/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 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 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 Date: Fri, 6 Dec 2013 13:49:45 +0100 Subject: [PATCH 19/93] make __postfix_* types depend on __postfix Signed-off-by: Steven Armstrong --- 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 . +# + +__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 . +# + +__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 . +# + +__postfix From 2ea2e640c93d5bec4a4c4422c63ac098ec8d2737 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 6 Dec 2013 14:19:36 +0100 Subject: [PATCH 20/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 Date: Fri, 6 Dec 2013 23:55:53 +0100 Subject: [PATCH 22/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 --- 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 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 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 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 . +# + +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 Date: Mon, 9 Dec 2013 23:17:06 +0100 Subject: [PATCH 27/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 --- 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 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 . +# +# +# 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 . +# +# +# 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 . +# +# +# 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 . +# +# +# 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 . +# +# +# 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 + + +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 . +# +# +# 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 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 Date: Tue, 10 Dec 2013 15:39:27 +0100 Subject: [PATCH 31/93] ++changes (3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Tue, 10 Dec 2013 15:48:04 +0100 Subject: [PATCH 32/93] ++changes (3.0.0) Signed-off-by: Nico Schottelius --- 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 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 . # # -# 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 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 Date: Tue, 10 Dec 2013 17:51:48 +0100 Subject: [PATCH 35/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 Date: Wed, 11 Dec 2013 13:42:12 +0100 Subject: [PATCH 37/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 Date: Wed, 11 Dec 2013 14:43:05 +0100 Subject: [PATCH 39/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Wed, 11 Dec 2013 14:43:35 +0100 Subject: [PATCH 40/93] 2012 -> 2013 Signed-off-by: Nico Schottelius --- 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 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 . # # -# 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 +Daniel Heule 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 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 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 . +# +# +# 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 . +# +# +# 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 + + +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 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 + + +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 Date: Thu, 12 Dec 2013 18:04:49 +0100 Subject: [PATCH 45/93] +begin of discussion with steven Signed-off-by: Nico Schottelius --- 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 Date: Fri, 13 Dec 2013 11:42:12 +0100 Subject: [PATCH 46/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Fri, 13 Dec 2013 14:33:22 +0100 Subject: [PATCH 47/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 --- 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 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 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 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 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 Date: Wed, 18 Dec 2013 17:20:30 +0100 Subject: [PATCH 53/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 --- 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 Date: Wed, 18 Dec 2013 18:13:32 +0100 Subject: [PATCH 55/93] changes for __start_on_boot Signed-off-by: Nico Schottelius --- 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 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 Date: Thu, 19 Dec 2013 11:21:26 +0100 Subject: [PATCH 57/93] implement messaging for __group type Signed-off-by: Steven Armstrong --- 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 Date: Thu, 19 Dec 2013 11:21:44 +0100 Subject: [PATCH 58/93] implement messaging for __user type Signed-off-by: Steven Armstrong --- 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 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 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 --- 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 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 Date: Thu, 19 Dec 2013 15:06:51 +0100 Subject: [PATCH 62/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 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 --- 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 Date: Fri, 20 Dec 2013 08:46:33 +0100 Subject: [PATCH 64/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Fri, 20 Dec 2013 08:50:45 +0100 Subject: [PATCH 65/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Fri, 20 Dec 2013 08:54:16 +0100 Subject: [PATCH 66/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Fri, 20 Dec 2013 08:56:23 +0100 Subject: [PATCH 67/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Fri, 20 Dec 2013 10:56:46 +0100 Subject: [PATCH 68/93] bugfix: handle non-existent default Signed-off-by: Steven Armstrong --- 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 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 --- 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 Date: Fri, 20 Dec 2013 22:57:15 +0100 Subject: [PATCH 70/93] ++changes(3.0.0) Signed-off-by: Nico Schottelius --- 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 Date: Sat, 21 Dec 2013 21:59:47 +0100 Subject: [PATCH 71/93] default to None, not empty list Signed-off-by: Steven Armstrong --- 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 Date: Sat, 21 Dec 2013 22:00:57 +0100 Subject: [PATCH 72/93] test for feature instead of type Signed-off-by: Steven Armstrong --- 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 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 --- 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 Date: Tue, 24 Dec 2013 23:05:56 +0100 Subject: [PATCH 74/93] update releasedate Signed-off-by: Nico Schottelius --- 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 Date: Tue, 24 Dec 2013 23:07:43 +0100 Subject: [PATCH 75/93] fix typo Signed-off-by: Nico Schottelius --- 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 Date: Tue, 24 Dec 2013 23:25:54 +0100 Subject: [PATCH 76/93] add link to messaging Signed-off-by: Nico Schottelius --- 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 Date: Tue, 24 Dec 2013 23:29:13 +0100 Subject: [PATCH 77/93] update link to messaging Signed-off-by: Nico Schottelius --- 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 Date: Tue, 24 Dec 2013 23:30:33 +0100 Subject: [PATCH 78/93] use absolute links Signed-off-by: Nico Schottelius --- 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 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 Date: Tue, 7 Jan 2014 16:31:32 +0100 Subject: [PATCH 80/93] install rubygems for ubuntu/debian Signed-off-by: Steven Armstrong --- 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 . +# + + +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 Date: Tue, 7 Jan 2014 17:03:14 +0100 Subject: [PATCH 81/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius --- 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 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 Date: Tue, 7 Jan 2014 20:40:46 +0100 Subject: [PATCH 83/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius --- 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 Date: Tue, 7 Jan 2014 22:30:59 +0100 Subject: [PATCH 84/93] do not escape \ in --line Signed-off-by: Nico Schottelius --- 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 Date: Tue, 7 Jan 2014 22:32:08 +0100 Subject: [PATCH 85/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius --- 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 Date: Tue, 7 Jan 2014 23:09:56 +0100 Subject: [PATCH 86/93] add old notifications sketch Signed-off-by: Nico Schottelius --- 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 Date: Tue, 7 Jan 2014 23:13:36 +0100 Subject: [PATCH 87/93] remove unneeded changelog.future Signed-off-by: Nico Schottelius --- 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 Date: Tue, 7 Jan 2014 23:14:07 +0100 Subject: [PATCH 88/93] +factsheets Signed-off-by: Nico Schottelius --- 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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

q*M-Z=X+hPd@r8!FLn8{FcK_sWoSW9G-ghmL9yf zeRj#Yu+tY0d0i1@Id$Ic(zV1LJ6OBriq)I>EWNlD)u--e+fbqv<#4M0+4JRo;_KZL z4ozG9;+5USrI5-6>JaN^%w?Y|88jn{>-$I@ z`xPjtwG~uc?poBYu&FRV_43c@8|V4XPk;TU)c7gyHS-SM*BOl}`K)^xugN-=Jak;Z z*l{bGpPxO9Z)Nbei#u+|Zjsm6%Gq@8nY>W8cD6ul&5UdJtM5#|DjR$?&6d~hWcOjO z>lf!M9CGnkdcfhem43*VfB9ekU4MOUx{y+tNX3r|%$uFOW&nSv=@QBk#xu zH%H-SZw4OE06Z}Wd;kNwF63RBpbiHDtOFW?ymud6C-TaB&@N5{xWI?9rxT_T)<{QR zn2*qCCW(8QKFkz&NFsFtP#yl-8nxd9(+RU5VIKnnsFQ#ITDF+2evB>yBpJY*0n!X> z_k%hO2#}7&FdSV7mGNnCa>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-Xk$Pk#;)JAoRQ~ zXdSu>59|904HXIxC%G48HuZN!dm8z1^m^xPA7p+f^b6KJjGWE!<9oXmV}f8AUZ>gyhPp{`qH(?K z`Q{ucm>wgoz&rfPTzZLhMm^FKd+$KUmMk`5w?KlPxHm)Woa|*~3&B8OnEMX(O)fGE ztKk3yo9&_&%6IONqQq4;(HNiq zZ(n{CrH9u;LGB|0uJ|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;_{$FJnGRUqe1GXUXXO?qQO{F; zbLh|jN-A2?*n8}*mBrXbWI$QGmQo`2CeHBH{ZOdDjWa znosT6w%^#yS?S%9K-SZbW$uafjL?zD#9iPs|KidYhyZ)@-$n$K0^1!#u(<&zSXp@3 zz>j}sa{OzR)IA*m%-Tw()&MhCW;HicSMa@zorwj2SH%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;i3iG1oh_<_!v^tq$x{8)&;s>e@X?Ne=q!3#BZ9GMCrF?2y7<79wO!Q$ek6appU?xx@lN=N7MaYRW{Vz`<-2MxD) zzU2~Af@UJ3>&_xX6i9H*@@Ph9sLZQ*MKKxFZkV!rlca0OV z1ZTtN{(K|A6E+SE%YWbox?$-8PKsEu82$un5(L;GONJZ}*nUm(7g!8x5ePi=14j6P6ViM&HOK~R<)L^W^xPy0nHKZmpVxc- z;cx`e9}z^bc>eGggz+zge=3v+Ov~TOXY!YLc;FU)9W#FtKd(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{A8!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>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+j6V<9gE4C5m;67UCE&8sd@GKrPNs1S$&g6|R}i!~(%#p8TexPd4LEadHSPPT_Ic6ev(3Gwy!^Wy8bjhk3 z>;pi$$GX!-nRl|Lfk6ziMVj%Tv)gw{#4hjv1N(f$L5G(C;k5dZlVAnD+2hsZ1{>foVA#>!2`&dW*0$;$!0GO>~wATmoiJGeQ5 zX7g&y>dq$iE{-P70DCh}W-+zjQ+8D;QP4~uJi70RAbeKNCQjw&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;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$+tht0bi6lxulZT7l7PgiX> 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?7qql-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`5MXE)`|Hl`EBjVOGK{ZM=$YeR#b-Ep+XRu&+JJz0fByhvcJ zU!#h4zO2Gb#>D_qvcU1p^COhpVz1o*SNKKu- z))&@Ao^YDd#^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_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!WV+mo9qjT%2U=oSfhZ3%H7Z=|lFDUZ53Abq5W5EAW58ko_F7 z{~W`=mP-FjCcqP?|KntWm4}Um@0FtG^HhVUI5SxNi|a=EHa18Ofly1zDAr$A$Y8>ZhAz&T5_ z!4vL{XWtR|5+g|Cm>tT-Zulcv(SeeC(*^U8!W+FP)oVDli@I%Cc&oymqI~GhFxzzE z+?JE}1;8xyWJ_R>~AUAVCagLPXq%V` z)m-0$XKDaqFMC1>d`!si$U_!XwK*eku4HUEVr{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%`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*gWnOvqN5IgK=|-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|_?Z)3KI`LW&#of$A1#Tw=yq*dW?=g;+Eyb9brSIFNZ6S}yUqGOUlpocI z3-*J(yae7ExCMfB#_SNB4D 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_5orShLzsbd*@~Wyl-o)+8bY%#x~#7) zj640~IR{&wHi5`DTE2wjq`jH~YGbL!S@nn9z}%Ci%DOvjs|uXV)n2yhobROFU1bb8 z&G*a9tGH(^ZAaCT?m`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_aV9+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+HhG<*N8|pg<2Z`NisLkj z6fKNq^|*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+)()OHgN!hWBMZ;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$WrGBvz_s&A?~!e?Gh5Wi7b*n zZ6kd=aL9S7=&^oDtS>~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(rUJQxb~w=>6#93lEd(=}L$@Yxlj;zr6HKs^4mDLt2ML!;A4w zzkR=Jw06#5q^635Q-qnHCNRj0HyC3Y)f|Un%3D1b*lpZs<cRt zOhS|QSpl3^hS{t&0!q%#cDmT~gR&L5ESv9SKU6~ZJ%44qJWD}WZ&UW|r3`-Q7@~p? z{ew&;HkDNs^}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 zs46kRif4ag8*Umee?b8c7ku22Md;+MrL_{UK8H$-?(}m>idG)Uh zc@@!ee7Vv9tivn{{({1K#Kp4mtTiMTbK*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`uMyvCr5XzbsNr-Ec-UosWqO>L(r zpKnIwbmY%v zYV4@IvF6mm%3c08Q6WE6u6N3!aT@!r&6HOaOG!Jyh z==JJR2y9tqV6#xvxmqlP61ngiyDlkBy| zJva7AcyTp50=>}Grz#OMst2G9ay&OuNj!$3lsqBc@V@aj7A`z1Aj~8yWV-SX zx3^{T+E}L*JPTIz+NkAt^oMizFgEj|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#SiV5$4_2GduOE1fD01d)}~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;~6yLTxUfR7GsZEqNK7!#w-mg~0 zorkS!_2p)*I|D3vD?b3-Dl|vuhVWO6)7-*f$zbugKb1VAfc=!07vlO_(Lr59vy(kI93T;EzuDdO0lBmM5pily+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(%I0^v)meMBi8_w-Z zJ@(w?GnaNI?;{$ULv+4oQyee^8e@#o2Tnw6#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~dU9XnPYZokTME012A>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@dgKbIgVv 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@)>`PifMyIVTv}? zN6|C_+NT;;6*QSx3dcr^eT0zSc@sd*MR&i_V9~~g=hB2DsLo!PQ5eOwje6#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!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~giLb^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%#?h{T=`E*47MI`PjqWASsnT@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|9IAjzfg1r5bU|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*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$rB3qSS7mQ2&bx0Qbz&|cni6tUmK=l+DY0Lq&ilAHXu#Xa zJ57n}rII&1Uv4%-v#D7{tr$DgBFm&LBHXT6ai&>}_7TUZk3u#rM=c0fL45YrWmD#zO4rM;QvpX*cCZ6jKE_ z#(v9c=XFNu+HlnnOF11J1U_BTLhFw`VaHB=ini;DZs|p~#l9n4xz{VPj#{#13m^L6 zXyI6wm;{?ei0;byTI$?v^HxrC&8iALS_Pz!k7@9c4jDUi?^5-;Z4q^{q{)wB`-9l@?u`1l2X=fIeywLaGZ>> zTHCsaZNVvmjwX7R$vpO4diYuok8WPSR!Smpv5D@uAoPkqZSD=}E>}u=K80O+84YIw z+cpV7eAU=NapF=Y#T4FYQZ6m)bkZ@abE|KP3+SHKIJpY*^`T2x}8;@zwxF|TeFupZC9biQZ6vN;)W4!mNQ z2Iz?F*I*tmY{T1Fk|XRQQfn?~WBu_#M#|`K`%8?@;I^nw0SD4uLQP)E(5tc{KC& z$M&7~DeDZL?I9gO?B2y!?B|wy0(vhK69M2cFRHNNfZ_9O==;ECJy?)S`z5(pf$Khw7T1Mt<6q{kimx_ zZ@G@`Tf>&rc(iY4W7|O!yGrhsEBL z$Oa 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<{_(EsH$LeK|Gs!M2X;4;#yE-@ld zK#TFcZ%(n7Pn9=fp|wimQ%mL>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*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#2vI%;^*gz{@&HV2Hr~t z-l_r8CU8JK8SAf&4}U%)0?L-L;~@K~g`karpgn`&x#r}6i2b_A{JMz#{N%?!n=Ag6;^){agTGh;`o0Kw z|Hd!rRRJyzZq8-^7qXust1>G9%&knoyBWbf-~z?^bMvwp{6Fntl=;1j5%gISdsk2k zpelch{zshuNkys zM$81Xd&R*5)N4>%zdDV`4Bi7HVg|Or;IE|oe}!CKOT#b}eebWxi)=$=`MgPF2wj_k zPl7}6<7v!J#o0pFf%xk^*`}T^}UOU_R0~2KqdTg)SXiVGW9T`xwQv@9~@%@SGg1S-3xJ9nrwA=W5`? z3qcxW{_I}0~O@(p~QbbkN< literal 0 HcmV?d00001 From 3e398b233b4ab56f17b27cb0ddfa72041b55b775 Mon Sep 17 00:00:00 2001 From: Daniel Heule 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 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 . -# - - -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 Date: Wed, 8 Jan 2014 11:09:36 +0100 Subject: [PATCH 91/93] no changes for __package_rubygems Signed-off-by: Nico Schottelius --- 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 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 Date: Wed, 8 Jan 2014 14:54:21 +0100 Subject: [PATCH 93/93] ++changes(3.0.1) Signed-off-by: Nico Schottelius --- 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)