Merge branch 'master' into preos

This commit is contained in:
Nico Schottelius 2014-01-20 08:48:44 +01:00
commit f89a720cd2
26 changed files with 439 additions and 85 deletions

View file

@ -0,0 +1,21 @@
#!/bin/sh
# 2013 Steven Armstrong (steven-cdist at armstrong.cc)
file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")"
# file does not exist, nothing we could do
[ -f "$file" ] || exit 0
prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id")
suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id")
awk -v prefix="$prefix" -v suffix="$suffix" '{
if (index($0,prefix)) {
triggered=1
}
if (triggered) {
if (index($0,suffix)) {
triggered=0
}
print
}
}' "$file"

View file

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
# #
# 2012-2013 Steven Armstrong (steven-cdist at armstrong.cc) # 2013 Steven Armstrong (steven-cdist at armstrong.cc)
# #
# This file is part of cdist. # This file is part of cdist.
# #
@ -18,38 +18,34 @@
# along with cdist. If not, see <http://www.gnu.org/licenses/>. # along with cdist. If not, see <http://www.gnu.org/licenses/>.
# #
owner="$(cat "$__object/parameter/owner" 2>/dev/null || echo "$__object_id")" file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")"
if [ -f "$__object/parameter/file" ]; then state_should=$(cat "$__object/parameter/state")
file="$(cat "$__object/parameter/file")" prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id")
else suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id")
home="$(cut -d':' -f 6 "$__object/explorer/passwd")"
file="$home/.ssh/authorized_keys"
fi
entry="$__object/files/entry" block="$__object/files/block"
if [ ! -s "$__object/explorer/entry" ]; then if [ ! -s "$__object/explorer/block" ]; then
state_is='absent' state_is='absent'
else else
state_is=$(diff -q "$entry" "$__object/explorer/entry" >/dev/null \ state_is=$(diff -q "$block" "$__object/explorer/block" >/dev/null \
&& echo present \ && echo present \
|| echo changed || echo changed
) )
fi fi
state_should="$(cat "$__object/parameter/state" 2>/dev/null || echo present)" state_should="$(cat "$__object/parameter/state")"
if [ "$state_should" = "$state_is" ]; then if [ "$state_should" = "$state_is" ]; then
# Nothing to do, move along # Nothing to do, move along
exit 0 exit 0
fi fi
remove_entry() { remove_block() {
# NOTE: keep variables in sync in manifest/explorer/gencode-*
prefix="#cdist:$__object_name"
suffix="#/cdist:$__object_name"
cat << DONE cat << DONE
tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX) tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX)
# preserve ownership and permissions by copying existing file over tmpfile # preserve ownership and permissions of existing file
cp -p "$file" "\$tmpfile" if [ -f "$file" ]; then
cp -p "$file" "\$tmpfile"
fi
awk -v prefix="$prefix" -v suffix="$suffix" ' awk -v prefix="$prefix" -v suffix="$suffix" '
{ {
if (index(\$0,prefix)) { if (index(\$0,prefix)) {
@ -70,15 +66,19 @@ DONE
case "$state_should" in case "$state_should" in
present) present)
if [ "$state_is" = "changed" ]; then if [ "$state_is" = "changed" ]; then
remove_entry echo update >> "$__messages_out"
remove_block
else
echo add >> "$__messages_out"
fi fi
cat << DONE cat << DONE
cat >> "$file" << ${__type##*/}_DONE cat >> "$file" << ${__type##*/}_DONE
$(cat "$entry") $(cat "$block")
${__type##*/}_DONE ${__type##*/}_DONE
DONE DONE
;; ;;
absent) absent)
remove_entry echo remove >> "$__messages_out"
remove_block
;; ;;
esac esac

View file

@ -0,0 +1,82 @@
cdist-type__block(7)
====================
Steven Armstrong <steven-cdist--@--armstrong.cc>
NAME
----
cdist-type__block - Manage blocks of text in files
DESCRIPTION
-----------
Manage a block of text in an existing file.
The block is identified using the prefix and suffix parameters.
Everything between prefix and suffix is considered to be a managed block
of text.
REQUIRED PARAMETERS
-------------------
text::
the text to manage.
If text is '-' (dash), take what was written to stdin as the text.
OPTIONAL PARAMETERS
-------------------
file::
the file in which to manage the text block.
Defaults to object_id.
prefix::
the prefix to add before the text.
Defaults to #cdist:__block/$__object_id
suffix::
the prefix to add after the text.
Defaults to #/cdist:__block/$__object_id
state::
'present' or 'absent', defaults to 'present'
MESSAGES
--------
add::
block was added
update::
block was updated/changed
remove::
block was removed
EXAMPLES
--------
--------------------------------------------------------------------------------
# text from argument
__block /path/to/file \
--prefix '#start' \
--suffix '#end' \
--text 'some\nblock of\ntext'
# text from stdin
__block some-id \
--file /path/to/file \
--text - << DONE
here some block
of text
DONE
--------------------------------------------------------------------------------
SEE ALSO
--------
- cdist-type(7)
COPYING
-------
Copyright \(C) 2013 Steven Armstrong. Free use of this software is
granted under the terms of the GNU General Public License version 3 (GPLv3).

View file

@ -0,0 +1,36 @@
#!/bin/sh
#
# 2013-2014 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
# cdist is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")"
prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id")
suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id")
text=$(cat "$__object/parameter/text")
mkdir "$__object/files"
# Generate text block for inclusion in file
block="$__object/files/block"
echo "$prefix" > "$block"
if [ "$text" = "-" ]; then
cat "$__object/stdin" >> "$block"
else
cat "$text" >> "$block"
fi
echo "$suffix" >> "$block"

View file

@ -0,0 +1 @@
present

View file

@ -0,0 +1,4 @@
file
prefix
state
suffix

View file

@ -0,0 +1 @@
text

View file

@ -78,8 +78,9 @@ DONE
case "$state_should" in case "$state_should" in
present) present)
# if we insert new entry, filter also all entrys out with the same id
echo "(" echo "("
echo "crontab -u $user -l 2>/dev/null | grep -v -E \"$filter\" 2>/dev/null || true" echo "crontab -u $user -l 2>/dev/null | grep -v -E \"$filter\" | grep -v \"# $name\\$\" 2>/dev/null || true"
echo "echo '$entry'" echo "echo '$entry'"
echo ") | crontab -u $user -" echo ") | crontab -u $user -"
;; ;;

View file

@ -26,6 +26,18 @@ password::
see above see above
MESSAGES
--------
mod::
group is modified
add::
New group added
change <property> <new_value> <current_value>::
Changed group property from current_value to new_value
set <property> <new_value>::
set property to new value, property was not set bevore
EXAMPLES EXAMPLES
-------- --------

View file

@ -0,0 +1,27 @@
#!/bin/sh
#
# 2014 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
# cdist is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
path="$(cat "$__object/parameter/path" 2>/dev/null || echo "/$__object_id")"
if mountpoint -q "$path"; then
echo yes
else
echo no
fi

View file

@ -0,0 +1,51 @@
#!/bin/sh
#
# 2014 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
# cdist is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
path="$(cat "$__object/parameter/path" 2>/dev/null || echo "/$__object_id")"
state_should="$(cat "$__object/parameter/state")"
state_is="$(grep -q -x yes "$__object/explorer/mounted" && echo present || echo absent)"
if [ "$state_should" = "$state_is" ]; then
# nothing to do
exit 0
fi
case "$state_should" in
present)
if [ -f "$__object/parameter/nofstab" ]; then
# mount manually
printf 'mount'
if [ -f "$__object/parameter/type" ]; then
printf ' -t %s' "$(cat "$__object/parameter/type")"
fi
if [ -f "$__object/parameter/options" ]; then
printf ' -o %s' "$(cat "$__object/parameter/options")"
fi
printf ' %s' "$(cat "$__object/parameter/device")"
printf " %s\n" "$path"
else
# mount using existing fstab entry
printf 'mount "%s"\n' "$path"
fi
;;
absent)
printf 'umount "%s"\n' "$path"
;;
esac

View file

@ -0,0 +1,84 @@
cdist-type__mount(7)
====================
Steven Armstrong <steven-cdist--@--armstrong.cc>
NAME
----
cdist-type__mount - manage filesystem mounts
DESCRIPTION
-----------
Manage filesystem mounts either via /etc/fstab or manually.
REQUIRED PARAMETERS
-------------------
None.
OPTIONAL PARAMETERS
-------------------
device::
device to mount at path, defaults to 'none'. see mount(8)
dump::
value for the dump field in fstab. see fstab(5)
defaults to 0.
This parameter is ignored, if the nofstab parameter is given.
options::
comma separated string of options, see mount(8)
pass::
value for the pass field in fstab. see fstab(5)
defaults to 0.
This parameter is ignored, if the nofstab parameter is given.
path::
mount point where to mount the device, see mount(8).
Defaults to __object_id
state::
either present or absent. Defaults to present.
type::
vfstype, see mount(8)
BOOLEAN PARAMETERS
------------------
nofstab::
do not manage an entry in /etc/fstab
EXAMPLES
--------
--------------------------------------------------------------------------------
__mount /some/dir \
--device /dev/sdc3 \
--type xfs \
--options "defaults,ro"
--dump 0 \
--pass 1
__mount /var/lib/one \
--device mfsmount \
--type fuse \
--options "mfsmaster=mfsmaster.domain.tld,mfssubfolder=/one,nonempty,_netdev"
--------------------------------------------------------------------------------
SEE ALSO
--------
- cdist-type(7)
COPYING
-------
Copyright \(C) 2014 Steven Armstrong. Free use of this software is
granted under the terms of the GNU General Public License version 3 (GPLv3).

View file

@ -0,0 +1,42 @@
#!/bin/sh
#
# 2014 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
# cdist is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
path="$(cat "$__object/parameter/path" 2>/dev/null || echo "/$__object_id")"
state="$(cat "$__object/parameter/state")"
if [ ! -f "$__object/parameter/nofstab" ]; then
# Generate an entry for /etc/fstab
(
printf "%s" "$(cat "$__object/parameter/device")"
printf " %s" "$path"
type="$(cat "$__object/parameter/type" 2>/dev/null || echo "auto")"
printf " %s" "$type"
options="$(cat "$__object/parameter/options" 2>/dev/null || echo "defaults")"
printf " %s" "$options"
printf " %s" "$(cat "$__object/parameter/dump")"
printf " %s\n" "$(cat "$__object/parameter/pass")"
) | \
__block "$__object_name" \
--file "/etc/fstab" \
--prefix "#cdist:$__object_name" \
--suffix "#/cdist:$__object_name" \
--state "$state" \
--text -
fi

View file

@ -0,0 +1 @@
nofstab

View file

@ -0,0 +1 @@
none

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
present

View file

@ -0,0 +1,7 @@
device
dump
options
pass
path
state
type

View file

@ -1,45 +0,0 @@
#!/bin/sh
#
# 2012 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
# cdist is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
owner="$(cat "$__object/parameter/owner" 2>/dev/null || echo "$__object_id")"
if [ -f "$__object/parameter/file" ]; then
file="$(cat "$__object/parameter/file")"
else
home="$("$__type_explorer/passwd" | cut -d':' -f 6)"
file="$home/.ssh/authorized_keys"
fi
# no authorized_keys file, nothing we could do
[ -f "$file" ] || exit 0
# NOTE: keep variables in sync in manifest/explorer/gencode-*
prefix="#cdist:$__object_name"
suffix="#/cdist:$__object_name"
awk -v prefix="$prefix" -v suffix="$suffix" '{
if (index($0,prefix)) {
triggered=1
}
if (triggered) {
if (index($0,suffix)) {
triggered=0
}
print
}
}' "$file"

View file

@ -19,7 +19,7 @@
# #
owner="$(cat "$__object/parameter/owner" 2>/dev/null || echo "$__object_id")" owner="$(cat "$__object/parameter/owner" 2>/dev/null || echo "$__object_id")"
state="$(cat "$__object/parameter/state" 2>/dev/null || echo "present")" state="$(cat "$__object/parameter/state" 2>/dev/null)"
if [ -f "$__object/parameter/file" ]; then if [ -f "$__object/parameter/file" ]; then
file="$(cat "$__object/parameter/file")" file="$(cat "$__object/parameter/file")"
else else
@ -56,19 +56,16 @@ if [ ! -f "$__object/parameter/noparent" -o ! -f "$__object/parameter/nofile" ];
fi fi
fi fi
# NOTE: keep variables in sync in manifest/explorer/gencode-*
prefix="#cdist:$__object_name"
suffix="#/cdist:$__object_name"
mkdir "$__object/files"
# Generate entry for inclusion in authorized_keys file # Generate entry for inclusion in authorized_keys file
entry="$__object/files/entry" (
echo "$prefix" > "$entry"
if [ -f "$__object/parameter/comment" ]; then if [ -f "$__object/parameter/comment" ]; then
echo "# $(cat "$__object/parameter/comment")" >> "$entry" echo "# $(cat "$__object/parameter/comment")"
fi fi
cat "$__object/parameter/key" >> "$entry" cat "$__object/parameter/key"
# ensure we have a newline after keys ) | \
echo >> "$entry" __block "$__object_name" \
echo "$suffix" >> "$entry" --file "$file" \
--prefix "#cdist:$__object_name" \
--suffix "#/cdist:$__object_name" \
--state "$state" \
--text -

View file

@ -0,0 +1 @@
present

View file

@ -44,6 +44,15 @@ create-home::
remove-home:: remove-home::
see userdel(8), apply only on user delete see userdel(8), apply only on user delete
MESSAGES
--------
mod::
User is modified
add::
New user added
EXAMPLES EXAMPLES
-------- --------

View file

@ -192,9 +192,11 @@ class Emulator(object):
try: try:
cdist_object = self.cdist_object.object_from_name(requirement) cdist_object = self.cdist_object.object_from_name(requirement)
except core.cdist_type.NoSuchTypeError as e: except core.cdist_type.NoSuchTypeError as e:
self.log.error("%s requires object %s, but type %s does not exist (definded at %s)" % (self.cdist_object.name, requirement, e.name, self.object_source)) self.log.error("%s requires object %s, but type %s does not exist. Defined at %s" % (self.cdist_object.name, requirement, e.name, self.object_source))
raise
except core.cdist_object.MissingObjectIdError as e:
self.log.error("%s requires object %s without object id. Defined at %s" % (self.cdist_object.name, requirement, self.object_source))
raise raise
self.log.debug("Recording requirement: " + requirement) self.log.debug("Recording requirement: " + requirement)

View file

@ -4,7 +4,18 @@ Changelog
* Changes are always commented with their author in (braces) * Changes are always commented with their author in (braces)
* Exception: No braces means author == Nico Schottelius * Exception: No braces means author == Nico Schottelius
3.0.1: 3.0.3:
* Core: Enhance error message when requirement is missing object id
3.0.2: 2014-01-19
* Documentation: Document all messages sent by types (Daniel Heule)
* New Type: __block (Steven Armstrong)
* New Type: __mount (Steven Armstrong)
* Type __cron: Replace existing entry when changing it (Daniel Heule)
* Type __ssh_authorized_keys: Use new type __block (Steven Armstrong)
3.0.1: 2014-01-14
* Core: Copy only files, not directories (Steven Armstrong) * Core: Copy only files, not directories (Steven Armstrong)
* Core: Allow hostnames to start with / * Core: Allow hostnames to start with /
* Type __line: Remove unecessary backslash escape * Type __line: Remove unecessary backslash escape

View file

@ -5,6 +5,11 @@ import os
def data_finder(data_dir): def data_finder(data_dir):
entries = [] entries = []
for name in os.listdir(data_dir): for name in os.listdir(data_dir):
# Skip .gitignore files
if name == ".gitignore":
continue
entry = os.path.join(data_dir, name) entry = os.path.join(data_dir, name)
if os.path.isdir(entry): if os.path.isdir(entry):
entries.extend(data_finder(entry)) entries.extend(data_finder(entry))