diff --git a/bin/cdist b/bin/cdist index 06e82cc9..5456b134 100755 --- a/bin/cdist +++ b/bin/cdist @@ -200,11 +200,13 @@ def emulator(): sys.exit(1) if __name__ == "__main__": + # Sys is needed for sys.exit() + import sys + try: import logging import os import re - import sys cdistpythonversion = '3.2' if sys.version < cdistpythonversion: @@ -228,7 +230,7 @@ if __name__ == "__main__": else: commandline() - except KeyboardInterrupt: sys.exit(0) - sys.exit(0) + except KeyboardInterrupt: + sys.exit(0) diff --git a/build b/build index 2d98e862..b209e1c2 100755 --- a/build +++ b/build @@ -130,6 +130,7 @@ case "$1" in git push --mirror git push --mirror github git push --mirror sf + git push --mirror ethz ;; clean) diff --git a/conf/type/__package/man.text b/conf/type/__package/man.text index d0460a31..071a8bfb 100644 --- a/conf/type/__package/man.text +++ b/conf/type/__package/man.text @@ -1,5 +1,5 @@ -cdist-type__user(7) -=================== +cdist-type__package(7) +====================== Steven Armstrong @@ -17,22 +17,23 @@ It dispatches the actual work to the package system dependant types. REQUIRED PARAMETERS ------------------- state:: - The state the package should be in, either "installed" or "removed" + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS ------------------- name:: - The name of the package to install. Default is to use the object_id as the - package name. + The name of the package to install. Default is to use the object_id as the + package name. version:: - The version of the package to install. Default is to install the version - choosen by the local package manager. + The version of the package to install. Default is to install the version + choosen by the local package manager. type:: - The package type to use. Default is determined based on the $os explorer - variable. - e.g. __package_apt for Debian - __package_emerge for Gentoo + The package type to use. Default is determined based on the $os explorer + variable. + e.g. __package_apt for Debian + __package_emerge for Gentoo EXAMPLES @@ -40,13 +41,13 @@ EXAMPLES -------------------------------------------------------------------------------- # Install the package vim on the target -__package vim --state installed +__package vim --state present # Same but install specific version -__package vim --state installed --version 7.3.50 +__package vim --state present --version 7.3.50 # Force use of a specific package type -__package vim --state installed --type __package_apt +__package vim --state present --type __package_apt -------------------------------------------------------------------------------- diff --git a/conf/type/__package_apt/explorer/pkg_status b/conf/type/__package_apt/explorer/state similarity index 84% rename from conf/type/__package_apt/explorer/pkg_status rename to conf/type/__package_apt/explorer/state index dbb3af3e..04926b60 100755 --- a/conf/type/__package_apt/explorer/pkg_status +++ b/conf/type/__package_apt/explorer/state @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -28,11 +28,11 @@ else fi # Except dpkg failing, if package is not known / installed -packages="$(apt-cache showpkg "$name" | sed -e "1,/Reverse Provides:/d" | cut -d ' ' -f 1) $name" +packages="$(apt-cache showpkg "$name" | sed -e "1,/Reverse Provides:/d" | cut -d ' ' -f 1) $name" for p in $packages; do if [ -n "$(dpkg -s "$p" 2>/dev/null | grep "^Status: install ok installed$")" ]; then - echo "installed $p" + echo "present $p" exit 0 fi done -echo "removed" +echo absent diff --git a/conf/type/__package_apt/gencode-remote b/conf/type/__package_apt/gencode-remote index 594ab8cb..0bcdb946 100755 --- a/conf/type/__package_apt/gencode-remote +++ b/conf/type/__package_apt/gencode-remote @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -28,28 +28,41 @@ else fi state_should="$(cat "$__object/parameter/state")" -state_is="$(cat "$__object/explorer/pkg_status")" + +# Correct pre 2.1 naming - FIXME in 2.1 +case "$state_should" in + installed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + removed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac + +# FIXME: use grep directly, state is a list, not a line! +state_is="$(cat "$__object/explorer/state")" case "$state_is" in - installed*) + present*) name="$(echo "$state_is" | cut -d ' ' -f 2)" - state_is="installed" + state_is="present" ;; esac aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes" -if [ "$state_is" != "$state_should" ]; then - case "$state_should" in - installed) - echo $aptget install \"$name\" - ;; - removed) - echo $aptget remove \"$name\" - ;; - *) - echo "Unknown state: $state" >&2 - exit 1 - ;; - esac -fi +[ "$state_is" = "$state_should" ] && exit 0 +case "$state_should" in + present) + echo $aptget install \"$name\" + ;; + absent) + echo $aptget remove \"$name\" + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; +esac diff --git a/conf/type/__package_apt/man.text b/conf/type/__package_apt/man.text index 905bfb5f..fd9c1a9c 100644 --- a/conf/type/__package_apt/man.text +++ b/conf/type/__package_apt/man.text @@ -17,7 +17,8 @@ manage packages. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "removed". + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS @@ -31,13 +32,13 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure zsh in installed -__package_apt zsh --state installed +__package_apt zsh --state present # In case you only want *a* webserver, but don't care which one -__package_apt webserver --state installed --name nginx +__package_apt webserver --state present --name nginx # Remove obsolete package -__package_apt puppet --state removed +__package_apt puppet --state absent -------------------------------------------------------------------------------- diff --git a/conf/type/__package_luarocks/gencode-remote b/conf/type/__package_luarocks/gencode-remote index 179022b1..327f812c 100755 --- a/conf/type/__package_luarocks/gencode-remote +++ b/conf/type/__package_luarocks/gencode-remote @@ -24,29 +24,43 @@ if [ -f "$__object/parameter/name" ]; then - name="$(cat "$__object/parameter/name")" + name="$(cat "$__object/parameter/name")" else - name="$__object_id" + name="$__object_id" fi -state="$(cat "$__object/parameter/state")" -is_installed="$(grep "(installed)" "$__object/explorer/pkg_status" || true)" - -case "$state" in - installed) - # Install only if non-existent - if [ -z "$is_installed" ]; then - echo luarocks install \"$name\" - fi - ;; - removed) - # Remove only if existent - if [ -n "$is_installed" ]; then - echo luarocks remove \"$name\" - fi - ;; - *) - echo "Unknown state: $state" >&2 - exit 1 - ;; +state_should="$(cat "$__object/parameter/state")" +# Correct pre 2.1 naming - FIXME in 2.1 +case "$state_should" in + installed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + removed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac + + +if grep -q "(installed)" "$__object/explorer/pkg_status"; then + state_is="present" +else + state_is="absent" +fi + +# Leave if nothing is to be done +[ "$state_is" = "$state_should" ] && exit 0 + +case "$state_should" in + present) + echo luarocks install \"$name\" + ;; + absent) + echo luarocks remove \"$name\" + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_luarocks/man.text b/conf/type/__package_luarocks/man.text index 6c1e6734..8b041b7c 100644 --- a/conf/type/__package_luarocks/man.text +++ b/conf/type/__package_luarocks/man.text @@ -1,5 +1,5 @@ cdist-type__package_luarocks(7) -============================== +=============================== Christian G. Warden @@ -16,13 +16,14 @@ LuaRocks is a deployment and management system for Lua modules. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "removed". + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS ------------------- name:: - If supplied, use the name and not the object id as the package name. + If supplied, use the name and not the object id as the package name. EXAMPLES @@ -30,10 +31,10 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure luasocket is installed -__package_luarocks luasocket --state installed +__package_luarocks luasocket --state present # Remove package -__package_luarocks luasocket --state removed +__package_luarocks luasocket --state absent -------------------------------------------------------------------------------- diff --git a/conf/type/__package_pacman/explorer/pkg_version b/conf/type/__package_pacman/explorer/pkg_version index 4f612423..c33820f8 100755 --- a/conf/type/__package_pacman/explorer/pkg_version +++ b/conf/type/__package_pacman/explorer/pkg_version @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -18,7 +18,7 @@ # along with cdist. If not, see . # # -# Retrieve the status of a package - parsed dpkg output +# Retrieve the status of a package - parsed pacman output # if [ -f "$__object/parameter/name" ]; then diff --git a/conf/type/__package_pacman/gencode-remote b/conf/type/__package_pacman/gencode-remote index 3c4fdda7..9defabe8 100755 --- a/conf/type/__package_pacman/gencode-remote +++ b/conf/type/__package_pacman/gencode-remote @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -33,24 +33,37 @@ else name="$__object_id" fi -state="$(cat "$__object/parameter/state")" +state_should="$(cat "$__object/parameter/state")" +case "$state_should" in + installed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + removed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac + pkg_version="$(cat "$__object/explorer/pkg_version")" +if [ -z "$pkg_version" ]; then + state_is="absent" +else + state_is="present" +fi -case "$state" in - installed) +# Exit if nothing is needed to be done +[ "$state_is" = "$state_should" ] && exit 0 - # Empty? Not installed. - if [ -z "$pkg_version" ]; then +case "$state_should" in + present) echo pacman "$pacopts" -S \"$name\" - fi ;; - removed) - if [ "$pkg_version" ]; then + absent) echo pacman "$pacopts" -R \"$name\" - fi ;; *) - echo "Unknown state: $state" >&2 + echo "Unknown state: $state_should" >&2 exit 1 ;; esac diff --git a/conf/type/__package_pacman/man.text b/conf/type/__package_pacman/man.text index 28766581..fe2abac8 100644 --- a/conf/type/__package_pacman/man.text +++ b/conf/type/__package_pacman/man.text @@ -17,13 +17,14 @@ packages. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "removed". + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS ------------------- name:: - If supplied, use the name and not the object id as the package name. + If supplied, use the name and not the object id as the package name. EXAMPLES @@ -31,13 +32,13 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure zsh in installed -__package_pacman zsh --state installed +__package_pacman zsh --state present # If you don't want to follow pythonX packages, but always use python -__package_pacman python --state installed --name python2 +__package_pacman python --state present --name python2 # Remove obsolete package -__package_pacman puppet --state removed +__package_pacman puppet --state absent -------------------------------------------------------------------------------- @@ -49,5 +50,5 @@ SEE ALSO COPYING ------- -Copyright \(C) 2011 Nico Schottelius. Free use of this software is +Copyright \(C) 2011-2012 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__package_pip/gencode-remote b/conf/type/__package_pip/gencode-remote index e60d74c5..0f15abdc 100644 --- a/conf/type/__package_pip/gencode-remote +++ b/conf/type/__package_pip/gencode-remote @@ -47,4 +47,8 @@ case "$state_should" in absent) echo $pip uninstall -q -y pyro ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_pip/man.text b/conf/type/__package_pip/man.text index 5ce45c50..2a620658 100644 --- a/conf/type/__package_pip/man.text +++ b/conf/type/__package_pip/man.text @@ -23,10 +23,10 @@ state:: OPTIONAL PARAMETERS ------------------- name:: - If supplied, use the name and not the object id as the package name. + If supplied, use the name and not the object id as the package name. pip:: - Instead of using pip from PATH, use the specific pip path. + Instead of using pip from PATH, use the specific pip path. EXAMPLES diff --git a/conf/type/__package_pkg_openbsd/gencode-remote b/conf/type/__package_pkg_openbsd/gencode-remote index eee2a3d9..26dd4689 100755 --- a/conf/type/__package_pkg_openbsd/gencode-remote +++ b/conf/type/__package_pkg_openbsd/gencode-remote @@ -1,6 +1,7 @@ #!/bin/sh # # 2011 Andi Brönnimann (andi-cdist at v-net.ch) +# 2012 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -28,7 +29,6 @@ os_version="$(cat "$__global/explorer/os_version")" machine="$(cat "$__global/explorer/machine")" - if [ -f "$__object/parameter/flavor" ]; then flavor="$(cat "$__object/parameter/flavor")" fi @@ -42,44 +42,60 @@ else name="$__object_id" fi -state="$(cat "$__object/parameter/state")" +state_should="$(cat "$__object/parameter/state")" +# Correct pre 2.1 naming - FIXME in 2.1 +case "$state_should" in + installed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + removed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac + pkg_version="$(cat "$__object/explorer/pkg_version")" # TODO: Shouldn't be hardcoded echo export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/$os_version/packages/$machine/ -case "$state" in - installed) - # Empty? Not installed. - if [ -z "$pkg_version" ]; then - # use this because pkg_add doesn't properly handle errors - cat << eof - status=\$(pkg_add "$pkgopts" "$name--$flavor") +if [ "$pkg_version" ]; then + state_is="present" +else + state_is="absent" +fi - # no error - if [ -n "\$status" ]; then - echo "Error: \$status" - exit 1 - fi -eof - fi - ;; - removed) - if [ "$pkg_version" ]; then - # use this because pkg_add doesn't properly handle errors - cat << eof - status=\$(pkg_delete "$pkgopts" "$name--$flavor") +[ "$state_is" = "$state_should" ] && exit 0 - # no error - if [ -n "\$status" ]; then - echo "Error: \$status" - exit 1 - fi +case "$state_should" in + present) + # use this because pkg_add doesn't properly handle errors + cat << eof +status=\$(pkg_add "$pkgopts" "$name--$flavor") + +# no error +if [ -n "\$status" ]; then + echo "Error: \$status" + exit 1 +fi +eof + ;; + + absent) + # use this because pkg_add doesn't properly handle errors + cat << eof +status=\$(pkg_delete "$pkgopts" "$name--$flavor") + +# no error +if [ -n "\$status" ]; then + echo "Error: \$status" + exit 1 +fi eof - fi ;; *) - echo "Unknown state: $state" >&2 + echo "Unknown state: $state_should" >&2 exit 1 ;; esac diff --git a/conf/type/__package_pkg_openbsd/man.text b/conf/type/__package_pkg_openbsd/man.text index 555bb0ac..71cf9d4e 100644 --- a/conf/type/__package_pkg_openbsd/man.text +++ b/conf/type/__package_pkg_openbsd/man.text @@ -16,16 +16,17 @@ This type is usually used on OpenBSD to manage packages. REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "removed". + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS ------------------- name:: - If supplied, use the name and not the object id as the package name. + If supplied, use the name and not the object id as the package name. flavor:: - If supplied, use to avoid ambiguity. + If supplied, use to avoid ambiguity. EXAMPLES @@ -33,16 +34,16 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure zsh is installed -__package_pkg_openbsd zsh --state installed +__package_pkg_openbsd zsh --state present # Ensure vim is installed, use flavor no_x11 -__package_pkg_openbsd vim --state installed --flavor no_x11 +__package_pkg_openbsd vim --state present --flavor no_x11 # If you don't want to follow pythonX packages, but always use python -__package_pkg_openbsd python --state installed --name python2 +__package_pkg_openbsd python --state present --name python2 # Remove obsolete package -__package_pkg_openbsd puppet --state removed +__package_pkg_openbsd puppet --state absent -------------------------------------------------------------------------------- diff --git a/conf/type/__package_rubygem/gencode-remote b/conf/type/__package_rubygem/gencode-remote index daaba524..638c4252 100755 --- a/conf/type/__package_rubygem/gencode-remote +++ b/conf/type/__package_rubygem/gencode-remote @@ -21,31 +21,42 @@ # Manage Rubygem packages # - if [ -f "$__object/parameter/name" ]; then - name="$(cat "$__object/parameter/name")" + name="$(cat "$__object/parameter/name")" else - name="$__object_id" + name="$__object_id" fi -state="$(cat "$__object/parameter/state")" -is_installed="$(grep "true" "$__object/explorer/pkg_status" || true)" - -case "$state" in - installed) - # Install only if non-existent - if [ -z "$is_installed" ]; then - echo gem install \"$name\" --no-ri --no-rdoc - fi - ;; - removed) - # Remove only if existent - if [ -n "$is_installed" ]; then - echo gem uninstall \"$name\" - fi - ;; - *) - echo "Unknown state: $state" >&2 - exit 1 - ;; +state_should="$(cat "$__object/parameter/state")" +# Correct pre 2.1 naming - FIXME in 2.1 +case "$state_should" in + installed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + removed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac + +if grep -q true "$__object/explorer/pkg_status"; then + state_is="present" +else + state_is="absent" +fi + +[ "$state_is" = "$state_should" ] && exit 0 + +case "$state_should" in + present) + echo gem install \"$name\" --no-ri --no-rdoc + ;; + absent) + echo gem uninstall \"$name\" + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_rubygem/man.text b/conf/type/__package_rubygem/man.text index c6248ee3..79bb8b52 100644 --- a/conf/type/__package_rubygem/man.text +++ b/conf/type/__package_rubygem/man.text @@ -16,13 +16,14 @@ Rubygems is the default package management system for the Ruby programming langu REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "removed". + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS ------------------- name:: - If supplied, use the name and not the object id as the package name. + If supplied, use the name and not the object id as the package name. EXAMPLES @@ -30,10 +31,10 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure sinatra is installed -__package_rubygem sinatra --state installed +__package_rubygem sinatra --state present # Remove package -__package_rubygem rails --state removed +__package_rubygem rails --state absent -------------------------------------------------------------------------------- diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote index b24ed220..a10e60dd 100755 --- a/conf/type/__package_yum/gencode-remote +++ b/conf/type/__package_yum/gencode-remote @@ -27,7 +27,17 @@ else name="$__object_id" fi -state="$(cat "$__object/parameter/state")" +state_should="$(cat "$__object/parameter/state")" +case "$state_should" in + installed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + removed) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac if grep -q -E "(centos|redhat|amazon)" "$__global/explorer/os"; then opts="-y --quiet" @@ -37,19 +47,23 @@ fi not_installed="^no package provides" -case "$state" in - installed) - if grep -q "$not_installed" "$__object/explorer/pkg_version"; then - echo yum $opts install \"$name\" - fi - ;; - removed) - if ! grep -q "$not_installed" "$__object/explorer/pkg_version"; then - echo yum $opts remove \"$name\" - fi - ;; - *) - echo "Unknown state: $state" >&2 - exit 1 - ;; +if grep -q "$not_installed" "$__object/explorer/pkg_version"; then + state_is="absent" +else + state_is="present" +fi + +[ "$state_is" = "$state_should" ] && exit 0 + +case "$state_should" in + present) + echo yum $opts install \"$name\" + ;; + absent) + echo yum $opts remove \"$name\" + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; esac diff --git a/conf/type/__package_yum/man.text b/conf/type/__package_yum/man.text index c9cad340..9dfb394e 100644 --- a/conf/type/__package_yum/man.text +++ b/conf/type/__package_yum/man.text @@ -18,13 +18,14 @@ slightly confusing error message "Error: Nothing to do". REQUIRED PARAMETERS ------------------- state:: - Either "installed" or "removed". + The state the package should be in, either "present" or "absent" + (the old values "installed" or "removed" will be removed in cdist 2.1). OPTIONAL PARAMETERS ------------------- name:: - If supplied, use the name and not the object id as the package name. + If supplied, use the name and not the object id as the package name. EXAMPLES @@ -32,13 +33,13 @@ EXAMPLES -------------------------------------------------------------------------------- # Ensure zsh in installed -__package_yum zsh --state installed +__package_yum zsh --state present # If you don't want to follow pythonX packages, but always use python -__package_yum python --state installed --name python2 +__package_yum python --state present --name python2 # Remove obsolete package -__package_yum puppet --state removed +__package_yum puppet --state absent -------------------------------------------------------------------------------- diff --git a/conf/type/__process/gencode-remote b/conf/type/__process/gencode-remote index be0e0cae..3411734e 100755 --- a/conf/type/__process/gencode-remote +++ b/conf/type/__process/gencode-remote @@ -1,6 +1,6 @@ #!/bin/sh # -# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) # # This file is part of cdist. # @@ -25,33 +25,44 @@ else name="$__object_id" fi -runs="$(cat "$__object/explorer/runs")" state_should="$(cat "$__object/parameter/state")" +case "$state_should" in + running) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="present" + ;; + stopped) + echo "WARNING: ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2 + state_should="absent" + ;; +esac + +runs="$(cat "$__object/explorer/runs")" +if [ "$runs" ]; then + state_is="present" +else + state_is="absent" +fi + +[ "$state_is" = "$state_should" ] && exit 0 case "$state_should" in - running|present) - # Does not run, start it! - if [ -z "$runs" ]; then - if [ -f "$__object/parameter/start" ]; then + present) + if [ -f "$__object/parameter/start" ]; then cat "$__object/parameter/start" - else + else echo "$name" - fi - fi - ;; - stopped|absent) - # Runs, kill it! - if [ "$runs" ]; then + fi + ;; + absent) if [ -f "$__object/parameter/stop" ]; then cat "$__object/parameter/stop" else echo kill "${runs}" fi - fi - ;; - *) - echo "Unknown state: $state_should" >&2 - exit 1 - ;; - + ;; + *) + echo "Unknown state: $state_should" >&2 + exit 1 + ;; esac diff --git a/conf/type/__process/man.text b/conf/type/__process/man.text index fbd54847..961a7f9a 100644 --- a/conf/type/__process/man.text +++ b/conf/type/__process/man.text @@ -16,7 +16,9 @@ This cdist type allows you to define the state of a process. REQUIRED PARAMETERS ------------------- state:: - State of the process: Either stopped or running. + State of the process: Either present or absent + (old values "stopped" and "running" are deprecated and will be removed in + cdist 2.1). OPTIONAL PARAMETERS @@ -40,23 +42,23 @@ EXAMPLES -------------------------------------------------------------------------------- # Start if not running -__process /usr/sbin/syslog-ng --state running +__process /usr/sbin/syslog-ng --state present # Start if not running with a different binary -__process /usr/sbin/nginx --state running --start "/etc/rc.d/nginx start" +__process /usr/sbin/nginx --state present --start "/etc/rc.d/nginx start" # Stop the process using kill (the type default) - DO NOT USE THIS -__process /usr/sbin/sshd --state stopped +__process /usr/sbin/sshd --state absent # Stop the process using /etc/rc.d/sshd stop - THIS ONE NOT AS WELL -__process /usr/sbin/sshd --state stopped --stop "/etc/rc.d/sshd stop" +__process /usr/sbin/sshd --state absent --stop "/etc/rc.d/sshd stop" # Ensure cups is running, which runs with -C ...: -__process cups --start "/etc/rc.d/cups start" --state running \ +__process cups --start "/etc/rc.d/cups start" --state present \ --name "/usr/sbin/cupsd -C /etc/cups/cupsd.conf" # Ensure rpc.statd is running (which usually runs with -L) using a regexp -__process rpcstatd --state running --start "/etc/init.d/statd start" \ +__process rpcstatd --state present --start "/etc/init.d/statd start" \ --name "rpc.statd.*" -------------------------------------------------------------------------------- @@ -68,5 +70,5 @@ SEE ALSO COPYING ------- -Copyright \(C) 2011 Nico Schottelius. Free use of this software is +Copyright \(C) 2011-2012 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/doc/changelog b/doc/changelog index 507726bc..96681617 100644 --- a/doc/changelog +++ b/doc/changelog @@ -4,11 +4,17 @@ Changelog * Changes are always commented with their author in (braces) * Exception: No braces means author == Nico Schottelius -2.0.8: +2.0.8: 2012-02-20 + * Bugfix core: Remove another nasty traceback when sending SIGINT (aka Ctrl-C) * Cleanup: Better hint to source of error * Cleanup: Do not output failing script, but path to script only * Cleanup: Remove support for __debug variable in manifests (Type != Core debugging) + * Cleanup: Change __package_* to support absent/present (default state + name now). The values removed/installed will be removed in cdist 2.1. + * Cleanup: Change __process to support absent/present (default state + name now). The values running/stopped will be removed in cdist 2.1. + * Feature Core: Support boolean parameters (Steven Armstrong) 2.0.7: 2012-02-13 * Bugfix __file: Use chmod after chown/chgrp (Matt Coddington) diff --git a/doc/dev/logs/2012-02-17.keyboardirq b/doc/dev/logs/2012-02-17.keyboardirq new file mode 100644 index 00000000..8ce59681 --- /dev/null +++ b/doc/dev/logs/2012-02-17.keyboardirq @@ -0,0 +1,48 @@ +Somewhere there is still a race condition: + +INFO: monitoring03: Running manifest and explorers for __file/etc/yum.repos.d/epel.repo +^C^CTraceback (most recent call last): + File "./bin/cdist", line 204, in + import logging + File "/usr/lib/python3.2/logging/__init__.py", line 27, in + from string import Template + File "/usr/lib/python3.2/string.py", line 178, in + class Formatter: + File "/usr/lib/python3.2/string.py", line 179, in Formatter + def format(self, format_string, *args, **kwargs): +KeyboardInterrupt + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "./bin/cdist", line 232, in + sys.exit(0) +NameError: name 'sys' is not defined +^C^CFatal Python error: Py_Initialize: can't initialize sys standard streams +Traceback (most recent call last): + File "/usr/lib/python3.2/encodings/latin_1.py", line 8, in + """ +KeyboardInterrupt +^C% [12:19] brief:cdist% + + +-------------------------------------------------------------------------------- +[13:50] brief:cdist% ./bin/cdist config -vp monitoring02 +INFO: monitoring02: Running global explorers +INFO: monitoring02: Running initial manifest /home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/manifest +INFO: monitoring02: Running object manifests and type explorers +INFO: monitoring02: Running manifest and explorers for __localch_shinken/singleton +^CTraceback (most recent call last): + File "/usr/lib/python3.2/site.py", line 58, in + import traceback + File "/usr/lib/python3.2/traceback.py", line 3, in + import linecache + File "/usr/lib/python3.2/linecache.py", line 10, in + import tokenize + File "/usr/lib/python3.2/tokenize.py", line 49, in + class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')): + File "/usr/lib/python3.2/collections.py", line 363, in namedtuple + exec(class_definition, namespace) + File "", line 1, in +KeyboardInterrupt + diff --git a/doc/dev/logs/2012-02-20.error-does-not-contain-host b/doc/dev/logs/2012-02-20.error-does-not-contain-host new file mode 100644 index 00000000..5838c011 --- /dev/null +++ b/doc/dev/logs/2012-02-20.error-does-not-contain-host @@ -0,0 +1,26 @@ +- errors do not contain host +- it's not logged which hosts failed! + +INFO: monitoring02: Running manifest and explorers for __directory/opt/local.ch/sys/shinken/host.d +INFO: monitoring03: Running manifest and explorers for __file/usr/sbin/iptables-rebuild +INFO: monitoring03: Running manifest and explorers for __git/opt/local.ch/sys/shinken/shinken +INFO: monitoring02: Running manifest and explorers for __file/etc/iptables.d/005_start +INFO: monitoring03: Running manifest and explorers for __localch_rsyncd/singleton +ERROR: Object __localch_iptables/xensnmp already exists with conflicting parameters: +/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/manifest/init: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 161 -j ACCEPT'} +/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 873 -j ACCEPT'} +ERROR: Command failed: /bin/sh -e /home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest +INFO: monitoring02: Running manifest and explorers for __file/etc/iptables.d/500_xensnmp +INFO: monitoring02: Running manifest and explorers for __file/etc/iptables.d/995_end +INFO: monitoring02: Running manifest and explorers for __file/etc/rsyncd.conf +INFO: monitoring02: Running manifest and explorers for __file/etc/yum.repos.d/epel.repo +INFO: monitoring02: Running manifest and explorers for __file/etc/yum.repos.d/rpmforge.repo +INFO: monitoring02: Running manifest and explorers for __file/usr/sbin/iptables-rebuild +INFO: monitoring02: Running manifest and explorers for __git/opt/local.ch/sys/shinken/shinken +INFO: monitoring02: Running manifest and explorers for __localch_rsyncd/singleton +ERROR: Object __localch_iptables/xensnmp already exists with conflicting parameters: +/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/manifest/init: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 161 -j ACCEPT'} +/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 873 -j ACCEPT'} +ERROR: Command failed: /bin/sh -e /home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest +INFO: Total processing time for 2 host(s): 14.245397090911865 +[16:53] brief:cdist% diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME index b40936f6..3007cedb 100644 --- a/doc/dev/todo/TAKEME +++ b/doc/dev/todo/TAKEME @@ -37,3 +37,4 @@ TYPES - Add testing framework (proposed by Evax Software) - __user add option to include --create-home +- Merge __addifnosuchline and __removeline into __line + --state present|absent diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext index bead6d72..aa5f6001 100644 --- a/doc/dev/todo/niconext +++ b/doc/dev/todo/niconext @@ -1,13 +1,13 @@ - introduce default parameters + - valid for optional parameters only + - stored in parameter/default/$name + + - when/where to save? in emulator? + - read vi fsproperty? - cleanup object_id handling - have a look at singletons -- ensure that all types, which support --state support - present and absent (consistent look and feel) - --------------------------------------------------------------------------------- - - update/create docs - cdist-cache:: How to get use information about the hosts we have been working on [advanced] diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index 81e58ab2..a76e7941 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -101,12 +101,15 @@ conf/type//gencode-local:: conf/type//gencode-remote:: Used to generate code to be executed on the client. -conf/type//parameters/required:: +conf/type//parameter/required:: Parameters required by type, \n seperated list. -conf/type//parameters/optional:: +conf/type//parameter/optional:: Parameters optionally accepted by type, \n seperated list. +conf/type//parameter/boolean:: + Boolean parameters accepted by type, \n seperated list. + conf/type//explorer:: Location of the type specific explorers. This directory is referenced by the variable __type_explorer (see below). diff --git a/doc/man/man7/cdist-type.text b/doc/man/man7/cdist-type.text index 48d412f1..1147511e 100644 --- a/doc/man/man7/cdist-type.text +++ b/doc/man/man7/cdist-type.text @@ -40,7 +40,7 @@ A list of supported types can be found in the cdist-reference(7) manpage. SINGLETON TYPES --------------- -If a type is flagged as a singleton, it may be used only +If a type is flagged as a singleton, it may be used only once per host. This is useful for types which can be used only once on a system. Singleton types do not take an object name as argument. @@ -72,15 +72,42 @@ To begin a new type, just create the directory **conf/type/__NAME**. DEFINING PARAMETERS ------------------- -Every type consists of optional and required parameters, which must -be created in a newline seperated file in ***parameters/required*** and -***parameters/optional***. If either or both missing, the type will have -no required, no optional or no parameters at all. +Every type consists of required, optional and boolean parameters, which must +be created in a newline seperated file in ***parameter/required***, +***parameter/optional*** and ***parameter/boolean***. If either is missing, +the type will have no required, no optional, no boolean or no parameters at +all. Example: -------------------------------------------------------------------------------- echo servername >> conf/type/__nginx_vhost/parameter/required echo logdirectory >> conf/type/__nginx_vhost/parameter/optional +echo use_ssl >> conf/type/__nginx_vhost/parameter/boolean +-------------------------------------------------------------------------------- + + +USING PARAMETERS +---------------- +The parameters given to a type can be accessed and used in all type scripts +(e.g manifest, gencode-*, explorer/*). Note that boolean parameters are +represented by file existence. File exists -> True, +file does not exist -> False + +Example: (e.g. in conf/type/__nginx_vhost/manifest) +-------------------------------------------------------------------------------- +# required parameter +servername="$(cat "$__object/parameter/servername")" + +# optional parameter +if [ -f "$__object/parameter/logdirectory" ]; then + logdirectory="$(cat "$__object/parameter/logdirectory")" +fi + +# boolean parameter +if [ -f "$__object/parameter/use_ssl" ]; then + # file exists -> True + # do some fancy ssl stuff +fi -------------------------------------------------------------------------------- @@ -116,7 +143,7 @@ SINGLETON - ONLY INSTANCE ONLY ------------------------------ If you want to ensure that a type can only be used once per target, you can mark it as a singleton: Just create the (empty) file "singleton" in your type -directory: +directory: -------------------------------------------------------------------------------- touch conf/type/__NAME/singleton @@ -128,7 +155,7 @@ This will also change the way your type must be called: __YOURTYPE --parameter value -------------------------------------------------------------------------------- -As you can see, the object ID is omitted, because it does not make any sense, +As you can see, the object ID is omitted, because it does not make any sense, if your type can be used only once. diff --git a/lib/cdist/__init__.py b/lib/cdist/__init__.py index 4742a937..c1e16ffb 100644 --- a/lib/cdist/__init__.py +++ b/lib/cdist/__init__.py @@ -19,7 +19,7 @@ # # -VERSION = "2.0.7" +VERSION = "2.0.8" BANNER = """ .. . .x+=:. s diff --git a/lib/cdist/core/cdist_type.py b/lib/cdist/core/cdist_type.py index 55609e7e..1d2472c4 100644 --- a/lib/cdist/core/cdist_type.py +++ b/lib/cdist/core/cdist_type.py @@ -82,6 +82,7 @@ class CdistType(object): self.__explorers = None self.__required_parameters = None self.__optional_parameters = None + self.__boolean_parameters = None def __repr__(self): return '' % self.name @@ -144,3 +145,19 @@ class CdistType(object): finally: self.__optional_parameters = parameters return self.__optional_parameters + + @property + def boolean_parameters(self): + """Return a list of boolean parameters""" + if not self.__boolean_parameters: + parameters = [] + try: + with open(os.path.join(self.absolute_path, "parameter", "boolean")) as fd: + for line in fd: + parameters.append(line.strip()) + except EnvironmentError: + # error ignored + pass + finally: + self.__boolean_parameters = parameters + return self.__boolean_parameters diff --git a/lib/cdist/emulator.py b/lib/cdist/emulator.py index 6d6050e8..c4b84feb 100644 --- a/lib/cdist/emulator.py +++ b/lib/cdist/emulator.py @@ -87,7 +87,7 @@ class Emulator(object): def commandline(self): """Parse command line""" - parser = argparse.ArgumentParser(add_help=False) + parser = argparse.ArgumentParser(add_help=False, argument_default=argparse.SUPPRESS) for parameter in self.cdist_type.optional_parameters: argument = "--" + parameter @@ -95,6 +95,9 @@ class Emulator(object): for parameter in self.cdist_type.required_parameters: argument = "--" + parameter parser.add_argument(argument, dest=parameter, action='store', required=True) + for parameter in self.cdist_type.boolean_parameters: + argument = "--" + parameter + parser.add_argument(argument, dest=parameter, action='store_const', const='') # If not singleton support one positional parameter if not self.cdist_type.is_singleton: diff --git a/lib/cdist/test/emulator/__init__.py b/lib/cdist/test/emulator/__init__.py index f1ea5832..370d3d82 100644 --- a/lib/cdist/test/emulator/__init__.py +++ b/lib/cdist/test/emulator/__init__.py @@ -126,7 +126,7 @@ class AutoRequireEmulatorTestCase(test.CdistTestCase): self.assertEqual(sorted(cdist_object.requirements), sorted(expected)) -class ArgumentsWithDashesTestCase(test.CdistTestCase): +class ArgumentsTestCase(test.CdistTestCase): def setUp(self): self.temp_dir = self.mkdtemp() @@ -159,3 +159,59 @@ class ArgumentsWithDashesTestCase(test.CdistTestCase): cdist_type = core.CdistType(self.local.type_path, '__arguments_with_dashes') cdist_object = core.CdistObject(cdist_type, self.local.object_path, 'some-id') self.assertTrue('with-dash' in cdist_object.parameters) + + def test_boolean(self): + type_name = '__arguments_boolean' + object_id = 'some-id' + argv = [type_name, object_id, '--boolean1'] + os.environ.update(self.env) + emu = emulator.Emulator(argv) + emu.run() + + cdist_type = core.CdistType(self.local.type_path, type_name) + cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id) + self.assertTrue('boolean1' in cdist_object.parameters) + self.assertFalse('boolean2' in cdist_object.parameters) + # empty file -> True + self.assertTrue(cdist_object.parameters['boolean1'] == '') + + def test_required(self): + type_name = '__arguments_required' + object_id = 'some-id' + value = 'some value' + argv = [type_name, object_id, '--required1', value, '--required2', value] + os.environ.update(self.env) + emu = emulator.Emulator(argv) + emu.run() + + cdist_type = core.CdistType(self.local.type_path, type_name) + cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id) + self.assertTrue('required1' in cdist_object.parameters) + self.assertTrue('required2' in cdist_object.parameters) + self.assertEqual(cdist_object.parameters['required1'], value) + self.assertEqual(cdist_object.parameters['required2'], value) + +# def test_required_missing(self): +# type_name = '__arguments_required' +# object_id = 'some-id' +# value = 'some value' +# argv = [type_name, object_id, '--required1', value] +# os.environ.update(self.env) +# emu = emulator.Emulator(argv) +# +# self.assertRaises(SystemExit, emu.run) + + def test_optional(self): + type_name = '__arguments_optional' + object_id = 'some-id' + value = 'some value' + argv = [type_name, object_id, '--optional1', value] + os.environ.update(self.env) + emu = emulator.Emulator(argv) + emu.run() + + cdist_type = core.CdistType(self.local.type_path, type_name) + cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id) + self.assertTrue('optional1' in cdist_object.parameters) + self.assertFalse('optional2' in cdist_object.parameters) + self.assertEqual(cdist_object.parameters['optional1'], value) diff --git a/lib/cdist/test/emulator/fixtures/conf/type/__arguments_boolean/parameter/boolean b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_boolean/parameter/boolean new file mode 100644 index 00000000..3215c409 --- /dev/null +++ b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_boolean/parameter/boolean @@ -0,0 +1,2 @@ +boolean1 +boolean2 diff --git a/lib/cdist/test/emulator/fixtures/conf/type/__arguments_optional/parameter/optional b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_optional/parameter/optional new file mode 100644 index 00000000..31647628 --- /dev/null +++ b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_optional/parameter/optional @@ -0,0 +1 @@ +optional1 diff --git a/lib/cdist/test/emulator/fixtures/conf/type/__arguments_required/parameter/required b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_required/parameter/required new file mode 100644 index 00000000..e0fba2c9 --- /dev/null +++ b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_required/parameter/required @@ -0,0 +1,2 @@ +required1 +required2 diff --git a/lib/cdist/test/type/__init__.py b/lib/cdist/test/type/__init__.py index 2ef14a4c..5e774aa9 100644 --- a/lib/cdist/test/type/__init__.py +++ b/lib/cdist/test/type/__init__.py @@ -145,3 +145,14 @@ class TypeTestCase(test.CdistTestCase): base_path = fixtures cdist_type = core.CdistType(base_path, '__without_optional_parameters') self.assertEqual(cdist_type.optional_parameters, []) + + def test_with_boolean_parameters(self): + base_path = fixtures + cdist_type = core.CdistType(base_path, '__with_boolean_parameters') + self.assertEqual(cdist_type.boolean_parameters, ['boolean1', 'boolean2']) + + def test_without_boolean_parameters(self): + base_path = fixtures + cdist_type = core.CdistType(base_path, '__without_boolean_parameters') + self.assertEqual(cdist_type.boolean_parameters, []) + diff --git a/lib/cdist/test/type/fixtures/__with_boolean_parameters/parameter/boolean b/lib/cdist/test/type/fixtures/__with_boolean_parameters/parameter/boolean new file mode 100644 index 00000000..3215c409 --- /dev/null +++ b/lib/cdist/test/type/fixtures/__with_boolean_parameters/parameter/boolean @@ -0,0 +1,2 @@ +boolean1 +boolean2 diff --git a/lib/cdist/test/type/fixtures/__without_boolean_parameters/.keep b/lib/cdist/test/type/fixtures/__without_boolean_parameters/.keep new file mode 100644 index 00000000..e69de29b diff --git a/other/types_submitted_for_inclusion/__run_command/README.inclusion b/other/types_submitted_for_inclusion/__run_command/README.inclusion new file mode 100644 index 00000000..f7c95da7 --- /dev/null +++ b/other/types_submitted_for_inclusion/__run_command/README.inclusion @@ -0,0 +1,6 @@ +This type is not much of use, as any type can issue code to be executed. +Thus you can implement the code directly in the calling type. + Or if you need to reuse it, create a type on its own. + +Because this seems to be a common misunderstanding when people come from "non managed areas", + where script iexecution is the main focus, I documented this in cdist-hacker to clearify. diff --git a/other/types_submitted_for_inclusion/__run_command/gencode-remote b/other/types_submitted_for_inclusion/__run_command/gencode-remote new file mode 100755 index 00000000..7ffd9a7b --- /dev/null +++ b/other/types_submitted_for_inclusion/__run_command/gencode-remote @@ -0,0 +1,26 @@ +#!/bin/sh +# +# 2012 Benedikt Koeppel (code at benediktkoeppel.ch) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# + +if [ -f "$__object/parameter/command" ]; then + cat "$__object/parameter/command" +else + echo "$name" +fi diff --git a/other/types_submitted_for_inclusion/__run_command/man.text b/other/types_submitted_for_inclusion/__run_command/man.text new file mode 100644 index 00000000..5ea553c3 --- /dev/null +++ b/other/types_submitted_for_inclusion/__run_command/man.text @@ -0,0 +1,70 @@ +cdist-type__run_command(7) +========================== +Benedikt Koeppel + + +NAME +---- +cdist-type__run_command - Run a command + + +DESCRIPTION +----------- +This cdist type allows you to run a specific command once at installation time. + + +REQUIRED PARAMETERS +------------------- + + +OPTIONAL PARAMETERS +------------------- +command:: + Command (with arguments) to run. + + If no command is give, then the object_id is executed. + + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Run a command +__run_command "/etc/init.d/mysql restart" +# runs `/etc/init.d/mysql restart` (the "object_id") + +# Run the same command: +__run_command restart-mysql --command "/etc/init.d/mysql restart" +# runs `/etc/init.d/mysql restart` (the --command argument) +# additionally, it can easily be referenced (for example in a require="..." +#as __run_command/restart-mysql + +# Run a script: +__run_command install-pear --command "$(cat <<-EOF + /usr/bin/pear install --force Auth + /usr/bin/pear install --force HTML_Template_IT-1.2.1 + /usr/bin/pear install --force MDB2 + /usr/bin/pear install --force MDB2#mysql + /usr/bin/pear config-set preferred_state beta; + /usr/bin/pear install --force --alldeps Spreadsheet_Excel_Writer; + /usr/bin/pear config-set preferred_state stable + /usr/bin/pear install --force HTTP_Request + /usr/bin/pear install --force Mail + /usr/bin/pear install --force Auth_HTTP + /usr/bin/pear install --force XML_RPC +EOF +)" + +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) + + +COPYING +------- +Copyright \(C) 2012 Benedikt Koeppel. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/other/types_submitted_for_inclusion/__run_command/parameter/optional b/other/types_submitted_for_inclusion/__run_command/parameter/optional new file mode 100644 index 00000000..aa56d324 --- /dev/null +++ b/other/types_submitted_for_inclusion/__run_command/parameter/optional @@ -0,0 +1 @@ +command diff --git a/other/types_submitted_for_inclusion/__run_command/parameter/required b/other/types_submitted_for_inclusion/__run_command/parameter/required new file mode 100644 index 00000000..e69de29b