diff --git a/conf/explorer/lsb_codename b/conf/explorer/lsb_codename index bc742cf7..22b6d51e 100755 --- a/conf/explorer/lsb_codename +++ b/conf/explorer/lsb_codename @@ -20,7 +20,14 @@ # set +e -lsb_release=$(which lsb_release 2>/dev/null) -if [ -x "$lsb_release" ]; then - $lsb_release --short --codename -fi +case "$($__explorer/os)" in + openwrt) + (. /etc/openwrt_release && echo "$DISTRIB_CODENAME") + ;; + *) + lsb_release=$(which lsb_release 2>/dev/null) + if [ -x "$lsb_release" ]; then + $lsb_release --short --codename + fi + ;; +esac diff --git a/conf/explorer/lsb_description b/conf/explorer/lsb_description index f6c30322..48aff30d 100755 --- a/conf/explorer/lsb_description +++ b/conf/explorer/lsb_description @@ -20,7 +20,14 @@ # set +e -lsb_release=$(which lsb_release 2>/dev/null) -if [ -x "$lsb_release" ]; then - $lsb_release --short --description -fi +case "$($__explorer/os)" in + openwrt) + (. /etc/openwrt_release && echo "$DISTRIB_DESCRIPTION") + ;; + *) + lsb_release=$(which lsb_release 2>/dev/null) + if [ -x "$lsb_release" ]; then + $lsb_release --short --description + fi + ;; +esac diff --git a/conf/explorer/lsb_id b/conf/explorer/lsb_id index 6cb2359b..0dd0f9f4 100755 --- a/conf/explorer/lsb_id +++ b/conf/explorer/lsb_id @@ -20,7 +20,14 @@ # set +e -lsb_release=$(which lsb_release 2>/dev/null) -if [ -x "$lsb_release" ]; then - $lsb_release --short --id -fi +case "$($__explorer/os)" in + openwrt) + (. /etc/openwrt_release && echo "$DISTRIB_ID") + ;; + *) + lsb_release=$(which lsb_release 2>/dev/null) + if [ -x "$lsb_release" ]; then + $lsb_release --short --id + fi + ;; +esac diff --git a/conf/explorer/lsb_release b/conf/explorer/lsb_release index a96ac50b..8266171a 100755 --- a/conf/explorer/lsb_release +++ b/conf/explorer/lsb_release @@ -20,7 +20,14 @@ # set +e -lsb_release=$(which lsb_release 2>/dev/null) -if [ -x "$lsb_release" ]; then - $lsb_release --short --release -fi +case "$($__explorer/os)" in + openwrt) + (. /etc/openwrt_release && echo "$DISTRIB_RELEASE") + ;; + *) + lsb_release=$(which lsb_release 2>/dev/null) + if [ -x "$lsb_release" ]; then + $lsb_release --short --release + fi + ;; +esac diff --git a/conf/explorer/os b/conf/explorer/os index 3f3ce266..e67d87ab 100755 --- a/conf/explorer/os +++ b/conf/explorer/os @@ -56,6 +56,11 @@ if [ -f /etc/gentoo-release ]; then exit 0 fi +if [ -f /etc/openwrt_version ]; then + echo openwrt + exit 0 +fi + if [ -f /etc/owl-release ]; then echo owl exit 0 diff --git a/conf/explorer/os_version b/conf/explorer/os_version index 73d3ecd7..8e6d37d3 100755 --- a/conf/explorer/os_version +++ b/conf/explorer/os_version @@ -45,6 +45,9 @@ case "$($__explorer/os)" in *bsd|solaris) uname -r ;; + openwrt) + cat /etc/openwrt_version + ;; owl) cat /etc/owl-release ;; diff --git a/conf/type/__package/manifest b/conf/type/__package/manifest index 181da077..118525b1 100755 --- a/conf/type/__package/manifest +++ b/conf/type/__package/manifest @@ -30,10 +30,12 @@ else # By default determine package manager based on operating system os="$(cat "$__global/explorer/os")" case "$os" in + amazon|centos|fedora|redhat) type="yum" ;; archlinux) type="pacman" ;; debian|ubuntu) type="apt" ;; + freebsd) type="pkg_freebsd" ;; gentoo) type="emerge" ;; - amazon|centos|fedora|redhat) type="yum" ;; + openwrt) type="opkg" ;; *) echo "Don't know how to manage packages on: $os" >&2 exit 1 diff --git a/conf/type/__package/parameter/optional b/conf/type/__package/parameter/optional index 712ea892..6f793411 100644 --- a/conf/type/__package/parameter/optional +++ b/conf/type/__package/parameter/optional @@ -1,3 +1,4 @@ name version type +pkgsite diff --git a/conf/type/__package_opkg/explorer/pkg_status b/conf/type/__package_opkg/explorer/pkg_status new file mode 100755 index 00000000..5da4f742 --- /dev/null +++ b/conf/type/__package_opkg/explorer/pkg_status @@ -0,0 +1,39 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2012 Giel van Schijndel (giel plus cdist at mortis dot eu) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Retrieve the status of a package - parsed opkg output +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +# Except dpkg failing, if package is not known / installed +if opkg status "$name" 2>/dev/null | grep -q "^Status: install user installed$"; then + echo "present" + exit 0 +elif [ "$(opkg info "$name" 2> /dev/null | wc -l)" -eq 0 ]; then + echo "absent notpresent" + exit 0 +fi +echo "absent" diff --git a/conf/type/__package_opkg/gencode-remote b/conf/type/__package_opkg/gencode-remote new file mode 100755 index 00000000..bd9a599b --- /dev/null +++ b/conf/type/__package_opkg/gencode-remote @@ -0,0 +1,57 @@ +#!/bin/sh +# +# 2011 Nico Schottelius (nico-cdist at schottelius.org) +# 2012 Giel van Schijndel (giel plus cdist at mortis dot eu) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Manage packages on OpenWRT and co. +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +state_should="$(cat "$__object/parameter/state")" +state_is="$(cat "$__object/explorer/pkg_status")" +case "$state_is" in + absent*) + present="$(echo "$state_is" | cut -d ' ' -f 2)" + state_is="absent" + ;; +esac + +if [ "$state_is" != "$state_should" ]; then + case "$state_should" in + present) + if [ "$present" = "notpresent" ]; then + echo opkg --verbosity=0 update + fi + echo opkg --verbosity=0 install \"$name\" + ;; + absent) + echo opkg --verbosity=0 remove \"$name\" + ;; + *) + echo "Unknown state: $state" >&2 + exit 1 + ;; + esac +fi + diff --git a/conf/type/__package_opkg/man.text b/conf/type/__package_opkg/man.text new file mode 100644 index 00000000..19d26af6 --- /dev/null +++ b/conf/type/__package_opkg/man.text @@ -0,0 +1,49 @@ +cdist-type__package_opkg(7) +========================== +Giel van Schijndel + + +NAME +---- +cdist-type__package_opkg - Manage packages with opkg + + +DESCRIPTION +----------- +opkg is usually used on OpenWRT to manage packages. + + +REQUIRED PARAMETERS +------------------- +state:: + The state the package should be in, either "present" or "absent" + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure lsof is installed +__package_opkg lsof --state present + +# Remove obsolete package +__package_opkg dnsmasq --state absent +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) + + +COPYING +------- +Copyright \(C) 2012 Giel van Schijndel. 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_opkg/parameter/optional b/conf/type/__package_opkg/parameter/optional new file mode 100644 index 00000000..f121bdbf --- /dev/null +++ b/conf/type/__package_opkg/parameter/optional @@ -0,0 +1 @@ +name diff --git a/conf/type/__package_opkg/parameter/required b/conf/type/__package_opkg/parameter/required new file mode 100644 index 00000000..ff72b5c7 --- /dev/null +++ b/conf/type/__package_opkg/parameter/required @@ -0,0 +1 @@ +state diff --git a/conf/type/__package_pkg_freebsd/explorer/pkg_version b/conf/type/__package_pkg_freebsd/explorer/pkg_version new file mode 100755 index 00000000..4bca24b6 --- /dev/null +++ b/conf/type/__package_pkg_freebsd/explorer/pkg_version @@ -0,0 +1,35 @@ +#!/bin/sh +# +# 2012 Jake Guffey (jake.guffey at eprotex.com) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Retrieve the status of a package - parsed dpkg output +# + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +# Don't produce "no pkgs installed" output -- breaks things +PKG_OUTPUT=$(pkg_info 2>&1) +if [ ! "$PKG_OUTPUT" = "pkg_info: no packages installed" ]; then + echo "$(echo "$PKG_OUTPUT" | grep "^$name-" | cut '-d ' -f1 | sed "s/$name-//g")" +fi + diff --git a/conf/type/__package_pkg_freebsd/gencode-remote b/conf/type/__package_pkg_freebsd/gencode-remote new file mode 100755 index 00000000..fa962970 --- /dev/null +++ b/conf/type/__package_pkg_freebsd/gencode-remote @@ -0,0 +1,136 @@ +#!/bin/sh +# +# 2012 Jake Guffey (jake.guffey at eprotex.com) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# +# Manage packages with pkg on FreeBSD +# + +assert () # If condition false, +{ #+ exit from script with error message. + E_PARAM_ERR=98 + E_ASSERT_FAILED=99 + + if [ -z "$2" ] # Not enough parameters passed. + then + return $E_PARAM_ERR # No damage done. + fi + + lineno=$2 + + if [ ! $1 ] + then + echo "Assertion failed: \"$1\"" + echo "File \"$0\", line $lineno, called by $(caller 0)" + exit $E_ASSERT_FAILED + fi +} + +# Debug +#exec >&2 +#set -x + +if [ -f "$__object/parameter/name" ]; then + name="$(cat "$__object/parameter/name")" +else + name="$__object_id" +fi + +if [ -f "$__object/parameter/flavor" ]; then + flavor="$(cat "$__object/parameter/flavor")" +fi + +if [ -f "$__object/parameter/version" ]; then + version="$(cat "$__object/parameter/version")" +fi + +if [ -f "$__object/parameter/pkgsite" ]; then + pkgsite="$(cat "$__object/parameter/pkgsite")" +fi + +state="$(cat "$__object/parameter/state")" +curr_version="$(cat "$__object/explorer/pkg_version")" +add_cmd="pkg_add" +rm_cmd="pkg_delete" +cmd="" + +# Print the command to be executed +# Parms: $1 -- mode, "remove" or "add" +# $2 -- the command to be echoed +# FIXME: This is ugly. +execcmd(){ + # Set the PACKAGESITE if we're ADDing a new package + if [ "$1" = "add" -a -n "$pkgsite" ]; then + # Use http.../All/ if we know the exact version we want, use .../Latest/ otherwise + pkgsite="export PACKAGESITE=${pkgsite}" + [ -n "$version" ] && pkgsite="${pkgsite}/All/" || pkgsite="${pkgsite}/Latest/" + echo "${pkgsite}" + fi + echo "${2} 2>&- >&-" # Silence the output of the command + echo "status=\$?" + echo "if [ \"\$status\" -ne \"0\" ]; then" + echo " echo \"Error: ${cmd} exited nonzero with \$status\"'!' >&2" + echo " exit 1" + echo "fi" +} + +if [ -n "$curr_version" ]; then # PKG *is* installed + if [ "$state" = "absent" ]; then # Shouldn't be installed + if [ -n "$flavor" ]; then + cmd="${rm_cmd} ${name}-${flavor}-${curr_version}" + else + cmd="${rm_cmd} ${name}-${curr_version}" + fi + execcmd "remove" "${cmd}" + exit 0 + else # Should be installed + if [ -n "$version" ]; then # Want a specific version + if [ "$version" = "$curr_version" ]; then # Current version is correct + exit 0 + else # Current version is wrong, fix + #updatepkg "$name" "$version" + assert "! ${version} = ${curr_version}" $LINENO + cmd="${rm_cmd} ${name}-${curr_version}" + execcmd "remove" "${cmd}" + cmd="${add_cmd} ${name}-${version}" + execcmd "add" "${cmd}" + fi + else # Don't care what version to use + exit 0 + fi + fi +else # PKG *isn't* installed + if [ "$state" = "absent" ]; then # Shouldn't be installed + exit 0 + elif [ "$state" = "present" ]; then # Is not currently installed, should be + if [ -n "$flavor" ]; then + cmd="${add_cmd} -r ${name}-${flavor}" + else + cmd="${add_cmd} -r ${name}" + fi + if [ -n "$version" ]; then + cmd="${cmd}-${version}" + fi + execcmd "add" "${cmd}" + exit 0 + fi +fi + +# Debug +#set +x + diff --git a/conf/type/__package_pkg_freebsd/man.text b/conf/type/__package_pkg_freebsd/man.text new file mode 100644 index 00000000..f41ac47a --- /dev/null +++ b/conf/type/__package_pkg_freebsd/man.text @@ -0,0 +1,64 @@ +cdist-type__package_pkg_freebsd(7) +================================== +Jake Guffey + + +NAME +---- +cdist-type__package_pkg_freebsd - Manage FreeBSD packages + + +DESCRIPTION +----------- +This type is usually used on FreeBSD to manage packages. + + +REQUIRED PARAMETERS +------------------- +state:: + Either "present" or "absent". + + +OPTIONAL PARAMETERS +------------------- +name:: + If supplied, use the name and not the object id as the package name. + +flavor:: + If supplied, use to avoid ambiguity. + +version:: + If supplied, use to install a specific version of the package named. + +pkgsite:: + If supplied, use to install from a specific package repository. + + +EXAMPLES +-------- + +-------------------------------------------------------------------------------- +# Ensure zsh is installed +__package_pkg_freebsd zsh --state installed + +# Ensure vim is installed, use flavor no_x11 +__package_pkg_freebsd vim --state installed --flavor no_x11 + +# If you don't want to follow pythonX packages, but always use python +__package_pkg_freebsd python --state installed --name python2 + +# Remove obsolete package +__package_pkg_freebsd puppet --state removed +-------------------------------------------------------------------------------- + + +SEE ALSO +-------- +- cdist-type(7) +- cdist-type__package(7) + + +COPYING +------- +Copyright \(C) 2012 Jake Guffey. Free use of this software is +granted under the terms of the GNU General Public License version 3 (GPLv3). diff --git a/conf/type/__package_pkg_freebsd/parameter/optional b/conf/type/__package_pkg_freebsd/parameter/optional new file mode 100644 index 00000000..3fb2f29e --- /dev/null +++ b/conf/type/__package_pkg_freebsd/parameter/optional @@ -0,0 +1,4 @@ +name +flavor +version +pkgsite diff --git a/conf/type/__package_pkg_freebsd/parameter/required b/conf/type/__package_pkg_freebsd/parameter/required new file mode 100644 index 00000000..ff72b5c7 --- /dev/null +++ b/conf/type/__package_pkg_freebsd/parameter/required @@ -0,0 +1 @@ +state diff --git a/doc/changelog b/doc/changelog index 96681617..dc498b9e 100644 --- a/doc/changelog +++ b/doc/changelog @@ -4,6 +4,13 @@ Changelog * Changes are always commented with their author in (braces) * Exception: No braces means author == Nico Schottelius +2.0.9: + * Cleanup documentation: Fix environment variable list to be properly + displayed (Giel van Schijndel) + * New Type: __package_opkg (Giel van Schijndel) + * New Type: __package_pkg_freebsd (Jake Guffey) + * Feature __package: Support OpenWRT (Giel van Schijndel) + 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 diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh index a76e7941..6bd5f1b8 100755 --- a/doc/man/cdist-reference.text.sh +++ b/doc/man/cdist-reference.text.sh @@ -188,6 +188,7 @@ __object_id:: the filesystem database and ensured by the core). Note: Double slashes ("//") will not be fixed and result in an error. + __self:: DEPRECATED: Same as __object_name, do not use anymore, use __object_name instead. Will be removed in cdist 3.x.