summaryrefslogtreecommitdiffstats
path: root/zarb-ml/mageia-sysadm/2010-November/000498.html
diff options
context:
space:
mode:
Diffstat (limited to 'zarb-ml/mageia-sysadm/2010-November/000498.html')
-rw-r--r--zarb-ml/mageia-sysadm/2010-November/000498.html649
1 files changed, 649 insertions, 0 deletions
diff --git a/zarb-ml/mageia-sysadm/2010-November/000498.html b/zarb-ml/mageia-sysadm/2010-November/000498.html
new file mode 100644
index 000000000..b9021db3b
--- /dev/null
+++ b/zarb-ml/mageia-sysadm/2010-November/000498.html
@@ -0,0 +1,649 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+ <HEAD>
+ <TITLE> [Mageia-sysadm] [241] Add a module to construct files from fragments.
+ </TITLE>
+ <LINK REL="Index" HREF="index.html" >
+ <LINK REL="made" HREF="mailto:mageia-sysadm%40mageia.org?Subject=Re%3A%20%5BMageia-sysadm%5D%20%5B241%5D%20Add%20a%20module%20to%20construct%20files%20from%0A%09fragments.&In-Reply-To=%3C20101112174223.467123FC0F%40valstar.mageia.org%3E">
+ <META NAME="robots" CONTENT="index,nofollow">
+ <META http-equiv="Content-Type" content="text/html; charset=us-ascii">
+ <LINK REL="Previous" HREF="000546.html">
+ <LINK REL="Next" HREF="000526.html">
+ </HEAD>
+ <BODY BGCOLOR="#ffffff">
+ <H1>[Mageia-sysadm] [241] Add a module to construct files from fragments.</H1>
+ <B>root at mageia.org</B>
+ <A HREF="mailto:mageia-sysadm%40mageia.org?Subject=Re%3A%20%5BMageia-sysadm%5D%20%5B241%5D%20Add%20a%20module%20to%20construct%20files%20from%0A%09fragments.&In-Reply-To=%3C20101112174223.467123FC0F%40valstar.mageia.org%3E"
+ TITLE="[Mageia-sysadm] [241] Add a module to construct files from fragments.">root at mageia.org
+ </A><BR>
+ <I>Fri Nov 12 18:42:23 CET 2010</I>
+ <P><UL>
+ <LI>Previous message: <A HREF="000546.html">[Mageia-sysadm] Installing firewall
+</A></li>
+ <LI>Next message: <A HREF="000526.html">[Mageia-sysadm] [241] Add a module to construct files from fragments.
+</A></li>
+ <LI> <B>Messages sorted by:</B>
+ <a href="date.html#498">[ date ]</a>
+ <a href="thread.html#498">[ thread ]</a>
+ <a href="subject.html#498">[ subject ]</a>
+ <a href="author.html#498">[ author ]</a>
+ </LI>
+ </UL>
+ <HR>
+<!--beginarticle-->
+<PRE>Revision: 241
+Author: boklm
+Date: 2010-11-12 18:42:22 +0100 (Fri, 12 Nov 2010)
+Log Message:
+-----------
+Add a module to construct files from fragments.
+
+Downloaded from <A HREF="https://github.com/ripienaar/puppet-concat/">https://github.com/ripienaar/puppet-concat/</A>
+
+Added Paths:
+-----------
+ puppet/modules/concat/
+ puppet/modules/concat/CHANGELOG
+ puppet/modules/concat/README.markdown
+ puppet/modules/concat/files/
+ puppet/modules/concat/files/concatfragments.sh
+ puppet/modules/concat/files/null/
+ puppet/modules/concat/files/null/.gitignore
+ puppet/modules/concat/manifests/
+ puppet/modules/concat/manifests/fragment.pp
+ puppet/modules/concat/manifests/init.pp
+ puppet/modules/concat/manifests/setup.pp
+
+Added: puppet/modules/concat/CHANGELOG
+===================================================================
+--- puppet/modules/concat/CHANGELOG (rev 0)
++++ puppet/modules/concat/CHANGELOG 2010-11-12 17:42:22 UTC (rev 241)
+@@ -0,0 +1,27 @@
++KNOWN ISSUES:
++- In 0.24.8 you will see inintended notifies, if you build a file
++ in a run, the next run will also see it as changed. This is due
++ to how 0.24.8 does the purging of unhandled files, this is improved
++ in 0.25.x and we cannot work around it in our code.
++
++CHANGELOG:
++- 2010/02/19 - initial release
++- 2010/03/12 - add support for 0.24.8 and newer
++ - make the location of sort configurable
++ - add the ability to add shell comment based warnings to
++ top of files
++ - add the ablity to create empty files
++- 2010/04/05 - fix parsing of WARN and change code style to match rest
++ of the code
++ - Better and safer boolean handling for warn and force
++ - Don't use hard coded paths in the shell script, set PATH
++ top of the script
++ - Use file{} to copy the result and make all fragments owned
++ by root. This means we can chnage the ownership/group of the
++ resulting file at any time.
++ - You can specify ensure =&gt; &quot;/some/other/file&quot; in concat::fragment
++ to include the contents of a symlink into the final file.
++- 2010/04/16 - Add more cleaning of the fragment name - removing / from the $name
++- 2010/05/22 - Improve documentation and show the use of ensure =&gt;
++- 2010/07/14 - Add support for setting the filebucket behavior of files
++- 2010/10/04 - Make the warning message configurable
+
+Added: puppet/modules/concat/README.markdown
+===================================================================
+--- puppet/modules/concat/README.markdown (rev 0)
++++ puppet/modules/concat/README.markdown 2010-11-12 17:42:22 UTC (rev 241)
+@@ -0,0 +1,103 @@
++What is it?
++===========
++
++A Puppet module that can construct files from fragments.
++
++Please see the comments in the various .pp files for details
++as well as posts on my blog at <A HREF="http://www.devco.net/">http://www.devco.net/</A>
++
++Released under the Apache 2.0 licence
++
++Usage:
++------
++
++If you wanted a /etc/motd file that listed all the major modules
++on the machine. And that would be maintained automatically even
++if you just remove the include lines for other modules you could
++use code like below, a sample /etc/motd would be:
++
++&lt;pre&gt;
++Puppet modules on this server:
++
++ -- Apache
++ -- MySQL
++&lt;/pre&gt;
++
++Local sysadmins can also append to the file by just editing /etc/motd.local
++their changes will be incorporated into the puppet managed motd.
++
++&lt;pre&gt;
++# class to setup basic motd, include on all nodes
++class motd {
++ include concat::setup
++ $motd = &quot;/etc/motd&quot;
++
++ concat{$motd,
++ owner =&gt; root,
++ group =&gt; root,
++ mode =&gt; 644
++ }
++
++ concat::fragment{&quot;motd_header&quot;:
++ target =&gt; $motd,
++ content =&gt; &quot;\nPuppet modules on this server:\n\n&quot;,
++ order =&gt; 01,
++ }
++
++ # local users on the machine can append to motd by just creating
++ # /etc/motd.local
++ concat::fragment{&quot;motd_local&quot;:
++ target =&gt; $motd,
++ ensure =&gt; &quot;/etc/motd.local&quot;,
++ order =&gt; 15
++ }
++}
++
++# used by other modules to register themselves in the motd
++define motd::register($content=&quot;&quot;, $order=10) {
++ if $content == &quot;&quot; {
++ $body = $name
++ } else {
++ $body = $content
++ }
++
++ concat::fragment{&quot;motd_fragment_$name&quot;:
++ target =&gt; &quot;/etc/motd&quot;,
++ content =&gt; &quot; -- $body\n&quot;
++ }
++}
++
++# a sample apache module
++class apache {
++ include apache::install, apache::config, apache::service
++
++ motd::register{&quot;Apache&quot;: }
++}
++&lt;/pre&gt;
++
++Known Issues:
++-------------
++* In 0.24.8 you will see inintended notifies, if you build a file
++ in a run, the next run will also see it as changed. This is due
++ to how 0.24.8 does the purging of unhandled files, this is improved
++ in 0.25.x and we cannot work around it in our code.
++
++Contributors:
++-------------
++**Paul Elliot**
++
++ * Provided 0.24.8 support, shell warnings and empty file creation support.
++
++**Chad Netzer**
++
++ * Various patches to improve safety of file operations
++ * Symlink support
++
++**David Schmitt**
++
++ * Patch to remove hard coded paths relying on OS path
++ * Patch to use file{} to copy the resulting file to the final destination. This means Puppet client will show diffs and that hopefully we can change file ownerships now
++
++Contact:
++--------
++You can contact me on <A HREF="https://www.mageia.org/mailman/listinfo/mageia-sysadm">rip at devco.net</A> or follow my blog at <A HREF="http://www.devco.net">http://www.devco.net</A> I am also on twitter as ripienaar
+
+Added: puppet/modules/concat/files/concatfragments.sh
+===================================================================
+--- puppet/modules/concat/files/concatfragments.sh (rev 0)
++++ puppet/modules/concat/files/concatfragments.sh 2010-11-12 17:42:22 UTC (rev 241)
+@@ -0,0 +1,123 @@
++#!/bin/bash
++
++# Script to concat files to a config file.
++#
++# Given a directory like this:
++# /path/to/conf.d
++# |-- fragments
++# | |-- 00_named.conf
++# | |-- 10_domain.net
++# | `-- zz_footer
++#
++# The script supports a test option that will build the concat file to a temp location and
++# use /usr/bin/cmp to verify if it should be run or not. This would result in the concat happening
++# twice on each run but gives you the option to have an unless option in your execs to inhibit rebuilds.
++#
++# Without the test option and the unless combo your services that depend on the final file would end up
++# restarting on each run, or in other manifest models some changes might get missed.
++#
++# OPTIONS:
++# -o The file to create from the sources
++# -d The directory where the fragments are kept
++# -t Test to find out if a build is needed, basically concats the files to a temp
++# location and compare with what's in the final location, return codes are designed
++# for use with unless on an exec resource
++# -w Add a shell style comment at the top of the created file to warn users that it
++# is generated by puppet
++# -f Enables the creation of empty output files when no fragments are found
++# -n Sort the output numerically rather than the default alpha sort
++#
++# the command:
++#
++# concatfragments.sh -o /path/to/conffile.cfg -d /path/to/conf.d
++#
++# creates /path/to/conf.d/fragments.concat and copies the resulting
++# file to /path/to/conffile.cfg. The files will be sorted alphabetically
++# pass the -n switch to sort numerically.
++#
++# The script does error checking on the various dirs and files to make
++# sure things don't fail.
++
++OUTFILE=&quot;&quot;
++WORKDIR=&quot;&quot;
++TEST=&quot;&quot;
++FORCE=&quot;&quot;
++WARN=&quot;&quot;
++SORTARG=&quot;-z&quot;
++
++PATH=/sbin:/usr/sbin:/bin:/usr/bin
++
++while getopts &quot;o:s:d:tnw:f&quot; options; do
++ case $options in
++ o ) OUTFILE=$OPTARG;;
++ d ) WORKDIR=$OPTARG;;
++ n ) SORTARG=&quot;-zn&quot;;;
++ w ) WARNMSG=&quot;$OPTARG&quot;;;
++ f ) FORCE=&quot;true&quot;;;
++ t ) TEST=&quot;true&quot;;;
++ * ) echo &quot;Specify output file with -o and fragments directory with -d&quot;
++ exit 1;;
++ esac
++done
++
++# do we have -o?
++if [ x${OUTFILE} = &quot;x&quot; ]; then
++ echo &quot;Please specify an output file with -o&quot;
++ exit 1
++fi
++
++# do we have -d?
++if [ x${WORKDIR} = &quot;x&quot; ]; then
++ echo &quot;Please fragments directory with -d&quot;
++ exit 1
++fi
++
++# can we write to -o?
++if [ -a ${OUTFILE} ]; then
++ if [ ! -w ${OUTFILE} ]; then
++ echo &quot;Cannot write to ${OUTFILE}&quot;
++ exit 1
++ fi
++else
++ if [ ! -w `dirname ${OUTFILE}` ]; then
++ echo &quot;Cannot write to `dirname ${OUTFILE}` to create ${OUTFILE}&quot;
++ exit 1
++ fi
++fi
++
++# do we have a fragments subdir inside the work dir?
++if [ ! -d &quot;${WORKDIR}/fragments&quot; ] &amp;&amp; [ ! -x &quot;${WORKDIR}/fragments&quot; ]; then
++ echo &quot;Cannot access the fragments directory&quot;
++ exit 1
++fi
++
++# are there actually any fragments?
++if [ ! &quot;$(ls -A ${WORKDIR}/fragments)&quot; ]; then
++ if [ x${FORCE} = &quot;x&quot; ]; then
++ echo &quot;The fragments directory is empty, cowardly refusing to make empty config files&quot;
++ exit 1
++ fi
++fi
++
++cd ${WORKDIR}
++
++if [ x${WARNMSG} = &quot;x&quot; ]; then
++ : &gt; &quot;fragments.concat&quot;
++else
++ echo -e &quot;$WARNMSG&quot; &gt; &quot;fragments.concat&quot;
++fi
++
++# find all the files in the fragments directory, sort them numerically and concat to fragments.concat in the working dir
++find fragments/ -type f -follow -print0 |sort ${SORTARG}|xargs -0 cat &gt;&gt;&quot;fragments.concat&quot;
++
++if [ x${TEST} = &quot;x&quot; ]; then
++ # This is a real run, copy the file to outfile
++ cp fragments.concat ${OUTFILE}
++ RETVAL=$?
++else
++ # Just compare the result to outfile to help the exec decide
++ cmp ${OUTFILE} fragments.concat
++ RETVAL=$?
++fi
++
++exit $RETVAL
+
+
+Property changes on: puppet/modules/concat/files/concatfragments.sh
+___________________________________________________________________
+Added: svn:executable
+ + *
+Added: svn:eol-style
+ + native
+
+Added: puppet/modules/concat/files/null/.gitignore
+===================================================================
+Added: puppet/modules/concat/manifests/fragment.pp
+===================================================================
+--- puppet/modules/concat/manifests/fragment.pp (rev 0)
++++ puppet/modules/concat/manifests/fragment.pp 2010-11-12 17:42:22 UTC (rev 241)
+@@ -0,0 +1,51 @@
++# Puts a file fragment into a directory previous setup using concat
++#
++# OPTIONS:
++# - target The file that these fragments belong to
++# - content If present puts the content into the file
++# - source If content was not specified, use the source
++# - order By default all files gets a 10_ prefix in the directory
++# you can set it to anything else using this to influence the
++# order of the content in the file
++# - ensure Present/Absent or destination to a file to include another file
++# - mode Mode for the file
++# - owner Owner of the file
++# - group Owner of the file
++# - backup Controls the filebucketing behavior of the final file and
++# see File type reference for its use. Defaults to 'puppet'
++define concat::fragment($target, $content='', $source='', $order=10, $ensure = &quot;present&quot;, $mode = 0644, $owner = root, $group = root, $backup = &quot;puppet&quot;) {
++ $safe_name = regsubst($name, '/', '_', 'G')
++ $safe_target_name = regsubst($target, '/', '_', 'G')
++ $concatdir = $concat::setup::concatdir
++ $fragdir = &quot;${concatdir}/${safe_target_name}&quot;
++
++ # if content is passed, use that, else if source is passed use that
++ # if neither passed, but $ensure is in symlink form, make a symlink
++ case $content {
++ &quot;&quot;: {
++ case $source {
++ &quot;&quot;: {
++ case $ensure {
++ &quot;&quot;, &quot;absent&quot;, &quot;present&quot;, &quot;file&quot;, &quot;directory&quot;: {
++ crit(&quot;No content, source or symlink specified&quot;)
++ }
++ }
++ }
++ default: { File{ source =&gt; $source } }
++ }
++ }
++ default: { File{ content =&gt; $content } }
++ }
++
++ file{&quot;${fragdir}/fragments/${order}_${safe_name}&quot;:
++ mode =&gt; $mode,
++ owner =&gt; $owner,
++ group =&gt; $group,
++ ensure =&gt; $ensure,
++ backup =&gt; $backup,
++ alias =&gt; &quot;concat_fragment_${name}&quot;,
++ notify =&gt; Exec[&quot;concat_${target}&quot;]
++ }
++}
++
++# vi:tabstop=4:expandtab:ai
+
+Added: puppet/modules/concat/manifests/init.pp
+===================================================================
+--- puppet/modules/concat/manifests/init.pp (rev 0)
++++ puppet/modules/concat/manifests/init.pp 2010-11-12 17:42:22 UTC (rev 241)
+@@ -0,0 +1,164 @@
++# A system to construct files using fragments from other files or templates.
++#
++# This requires at least puppet 0.25 to work correctly as we use some
++# enhancements in recursive directory management and regular expressions
++# to do the work here.
++#
++# USAGE:
++# The basic use case is as below:
++#
++# concat{&quot;/etc/named.conf&quot;:
++# notify =&gt; Service[&quot;named&quot;]
++# }
++#
++# concat::fragment{&quot;foo.com_config&quot;:
++# target =&gt; &quot;/etc/named.conf&quot;,
++# order =&gt; 10,
++# content =&gt; template(&quot;named_conf_zone.erb&quot;)
++# }
++#
++# # add a fragment not managed by puppet so local users
++# # can add content to managed file
++# concat::fragment{&quot;foo.com_user_config&quot;:
++# target =&gt; &quot;/etc/named.conf&quot;,
++# order =&gt; 12,
++# ensure =&gt; &quot;/etc/named.conf.local&quot;
++# }
++#
++# This will use the template named_conf_zone.erb to build a single
++# bit of config up and put it into the fragments dir. The file
++# will have an number prefix of 10, you can use the order option
++# to control that and thus control the order the final file gets built in.
++#
++# SETUP:
++# The class concat::setup defines a variable $concatdir - you should set this
++# to a directory where you want all the temporary files and fragments to be
++# stored. Avoid placing this somewhere like /tmp since you should never
++# delete files here, puppet will manage them.
++#
++# There's some regular expression magic to figure out the puppet version but
++# if you're on an older 0.24 version just set $puppetversion = 24
++#
++# Before you can use any of the concat features you should include the
++# class concat::setup somewhere on your node first.
++#
++# DETAIL:
++# We use a helper shell script called concatfragments.sh that gets placed
++# in /usr/local/bin to do the concatenation. While this might seem more
++# complex than some of the one-liner alternatives you might find on the net
++# we do a lot of error checking and safety checks in the script to avoid
++# problems that might be caused by complex escaping errors etc.
++#
++# LICENSE:
++# Apache Version 2
++#
++# LATEST:
++# <A HREF="http://github.com/ripienaar/puppet-concat/">http://github.com/ripienaar/puppet-concat/</A>
++#
++# CONTACT:
++# R.I.Pienaar &lt;<A HREF="https://www.mageia.org/mailman/listinfo/mageia-sysadm">rip at devco.net</A>&gt;
++# Volcane on freenode
++# @ripienaar on twitter
++# www.devco.net
++
++
++# Sets up so that you can use fragments to build a final config file,
++#
++# OPTIONS:
++# - mode The mode of the final file
++# - owner Who will own the file
++# - group Who will own the file
++# - force Enables creating empty files if no fragments are present
++# - warn Adds a normal shell style comment top of the file indicating
++# that it is built by puppet
++# - backup Controls the filebucketing behavior of the final file and
++# see File type reference for its use. Defaults to 'puppet'
++#
++# ACTIONS:
++# - Creates fragment directories if it didn't exist already
++# - Executes the concatfragments.sh script to build the final file, this script will create
++# directory/fragments.concat. Execution happens only when:
++# * The directory changes
++# * fragments.concat != final destination, this means rebuilds will happen whenever
++# someone changes or deletes the final file. Checking is done using /usr/bin/cmp.
++# * The Exec gets notified by something else - like the concat::fragment define
++# - Copies the file over to the final destination using a file resource
++#
++# ALIASES:
++# - The exec can notified using Exec[&quot;concat_/path/to/file&quot;] or Exec[&quot;concat_/path/to/directory&quot;]
++# - The final file can be referened as File[&quot;/path/to/file&quot;] or File[&quot;concat_/path/to/file&quot;]
++define concat($mode = 0644, $owner = &quot;root&quot;, $group = &quot;root&quot;, $warn = &quot;false&quot;, $force = &quot;false&quot;, $backup = &quot;puppet&quot;) {
++ $safe_name = regsubst($name, '/', '_', 'G')
++ $concatdir = $concat::setup::concatdir
++ $version = $concat::setup::majorversion
++ $fragdir = &quot;${concatdir}/${safe_name}&quot;
++ $concat_name = &quot;fragments.concat.out&quot;
++ $default_warn_message = '# This file is managed by Puppet. DO NOT EDIT.'
++
++ case $warn {
++ 'true',true,yes,on: { $warnmsg = &quot;$default_warn_message&quot; }
++ 'false',false,no,off: { $warnmsg = &quot;&quot; }
++ default: { $warnmsg = &quot;$warn&quot; }
++ }
++
++ $warnmsg_escaped = regsubst($warnmsg, &quot;'&quot;, &quot;'\\\\''&quot;, 'G')
++ $warnflag = $warnmsg_escaped ? {
++ '' =&gt; '',
++ default =&gt; &quot;-w '$warnmsg_escaped'&quot;
++ }
++
++ case $force {
++ 'true',true,yes,on: { $forceflag = &quot;-f&quot; }
++ 'false',false,no,off: { $forceflag = &quot;&quot; }
++ default: { fail(&quot;Improper 'force' value given to concat: $force&quot;) }
++ }
++
++ File{
++ owner =&gt; root,
++ group =&gt; root,
++ mode =&gt; $mode,
++ backup =&gt; $backup
++ }
++
++ file{$fragdir:
++ ensure =&gt; directory;
++
++ &quot;${fragdir}/fragments&quot;:
++ ensure =&gt; directory,
++ recurse =&gt; true,
++ purge =&gt; true,
++ force =&gt; true,
++ ignore =&gt; [&quot;.svn&quot;, &quot;.git&quot;, &quot;.gitignore&quot;],
++ source =&gt; $version ? {
++ 24 =&gt; &quot;<A HREF="puppet:///concat/null">puppet:///concat/null</A>&quot;,
++ default =&gt; undef,
++ },
++ notify =&gt; Exec[&quot;concat_${name}&quot;];
++
++ &quot;${fragdir}/fragments.concat&quot;:
++ ensure =&gt; present;
++
++ &quot;${fragdir}/${concat_name}&quot;:
++ ensure =&gt; present;
++
++ $name:
++ source =&gt; &quot;${fragdir}/${concat_name}&quot;,
++ owner =&gt; $owner,
++ group =&gt; $group,
++ checksum =&gt; md5,
++ mode =&gt; $mode,
++ ensure =&gt; present,
++ alias =&gt; &quot;concat_${name}&quot;;
++ }
++
++ exec{&quot;concat_${name}&quot;:
++ user =&gt; root,
++ group =&gt; root,
++ notify =&gt; File[$name],
++ subscribe =&gt; File[$fragdir],
++ alias =&gt; &quot;concat_${fragdir}&quot;,
++ require =&gt; [ File[&quot;/usr/local/bin/concatfragments.sh&quot;], File[$fragdir], File[&quot;${fragdir}/fragments&quot;], File[&quot;${fragdir}/fragments.concat&quot;] ],
++ unless =&gt; &quot;/usr/local/bin/concatfragments.sh -o ${fragdir}/${concat_name} -d ${fragdir} -t ${warnflag} ${forceflag}&quot;,
++ command =&gt; &quot;/usr/local/bin/concatfragments.sh -o ${fragdir}/${concat_name} -d ${fragdir} ${warnflag} ${forceflag}&quot;,
++ }
++}
+
+Added: puppet/modules/concat/manifests/setup.pp
+===================================================================
+--- puppet/modules/concat/manifests/setup.pp (rev 0)
++++ puppet/modules/concat/manifests/setup.pp 2010-11-12 17:42:22 UTC (rev 241)
+@@ -0,0 +1,36 @@
++# Sets up the concat system.
++#
++# $concatdir should point to a place where you wish the fragments to
++# live. This should not be somewhere like /tmp since ideally these files
++# should not be deleted ever, puppet should always manage them
++#
++# $puppetversion should be either 24 or 25 to enable a 24 compatible
++# mode, in 24 mode you might see phantom notifies this is a side effect
++# of the method we use to clear the fragments directory.
++#
++# The regular expression below will try to figure out your puppet version
++# but this code will only work in 0.24.8 and newer.
++#
++# It also copies out the concatfragments.sh file to /usr/local/bin
++class concat::setup {
++ $concatdir = &quot;/var/lib/puppet/concat&quot;
++ $majorversion = regsubst($puppetversion, '^[0-9]+[.]([0-9]+)[.][0-9]+$', '\1')
++
++ file{&quot;/usr/local/bin/concatfragments.sh&quot;:
++ owner =&gt; root,
++ group =&gt; root,
++ mode =&gt; 755,
++ source =&gt; $majorversion ? {
++ 24 =&gt; &quot;<A HREF="puppet:///concat/concatfragments.sh">puppet:///concat/concatfragments.sh</A>&quot;,
++ default =&gt; &quot;<A HREF="puppet:///modules/concat/concatfragments.sh">puppet:///modules/concat/concatfragments.sh</A>&quot;
++ };
++
++ $concatdir:
++ ensure =&gt; directory,
++ owner =&gt; root,
++ group =&gt; root,
++ mode =&gt; 755;
++ }
++}
++
++# vi:tabstop=4:expandtab:ai
+-------------- next part --------------
+An HTML attachment was scrubbed...
+URL: &lt;/pipermail/mageia-sysadm/attachments/20101112/c7579815/attachment-0001.html&gt;
+</PRE>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<!--endarticle-->
+ <HR>
+ <P><UL>
+ <!--threads-->
+ <LI>Previous message: <A HREF="000546.html">[Mageia-sysadm] Installing firewall
+</A></li>
+ <LI>Next message: <A HREF="000526.html">[Mageia-sysadm] [241] Add a module to construct files from fragments.
+</A></li>
+ <LI> <B>Messages sorted by:</B>
+ <a href="date.html#498">[ date ]</a>
+ <a href="thread.html#498">[ thread ]</a>
+ <a href="subject.html#498">[ subject ]</a>
+ <a href="author.html#498">[ author ]</a>
+ </LI>
+ </UL>
+
+<hr>
+<a href="https://www.mageia.org/mailman/listinfo/mageia-sysadm">More information about the Mageia-sysadm
+mailing list</a><br>
+</body></html>