Merge remote branch 'nico/master'

This commit is contained in:
Steven Armstrong 2011-03-07 23:08:37 +01:00
commit a6b88d323e
26 changed files with 1851 additions and 253 deletions

View file

@ -2,13 +2,16 @@ cat << eof
Hey hackers, Hey hackers,
cdist has not been published, you're accessing a early in developent this README is for you, for those who want to dig into cdist, hack it or try
code. to get a deeper understanding.
Do not believe anything written in cdist, besides what's written in this file A lot of documentation is still missing, but running cdist-quickstart should
(everything else may be future stuff for the initial release). give you an impression of how cdist works.
-- Nico, 20101201 I hope you have a lot of fun with cdist, because it was also a lot of fun to
develop it!
-- Nico, 20110304
## Conventions ## Conventions
@ -21,7 +24,7 @@ Do not believe anything written in cdist, besides what's written in this file
This file is suitable for execution and saving the objects and This file is suitable for execution and saving the objects and
explorers from cdist. I usually do it like this: explorers from cdist. I usually do it like this:
% rm -rf /tmp/localhost && ./HACKERS_README % ./HACKERS_README
################################################################################ ################################################################################
eof eof

View file

@ -8,47 +8,45 @@ A2X=a2x -f manpage --no-xmllint
WEBDIR=$$HOME/niconetz WEBDIR=$$HOME/niconetz
WEBPAGE=software/cdist.mdwn WEBPAGE=software/cdist.mdwn
MANSRC=doc/man/cdist-config-layout.text \ MANDIR=doc/man
doc/man/cdist-config.text \ MANSRC=$(MANDIR)/cdist-config-layout.text \
doc/man/cdist-explorer.text \ $(MANDIR)/cdist-config.text \
doc/man/cdist-quickstart.text \ $(MANDIR)/cdist-explorer.text \
doc/man/cdist-stages.text \ $(MANDIR)/cdist-quickstart.text \
doc/man/cdist-terms.text \ $(MANDIR)/cdist-stages.text \
doc/man/cdist-type.text $(MANDIR)/cdist-terms.text \
$(MANDIR)/cdist-type.text
MANSRC=doc/man/cdist.text \ MANSRC=$(MANDIR)/cdist.text \
doc/man/cdist-deploy-to.text \ $(MANDIR)/cdist-deploy-to.text \
doc/man/cdist-manifest.text \ $(MANDIR)/cdist-manifest.text \
################################################################################ ################################################################################
# User targets # User targets
# #
all: man all:
@echo ''
@echo 'Welcome to cdist!'
@echo ''
@echo 'Here are the possible targets:'
@echo ''
@echo ' man: Build manpages'
@echo ' clean: Remove build stuff'
@echo ''
@echo ''
man: doc/man/.marker man: doc/man/.marker
doc/man/.marker: $(MANSRC) doc/man/.marker: $(MANSRC)
for man in $(MANSRC); do $(A2X) $$man; done for mansrc in $(MANSRC); do $(A2X) $$mansrc; done
for manpage in $(MANDIR)/*.[1-9]; do cat=$${manpage##*.}; echo $$cat; mandir=$(MANDIR)/man$$cat; mkdir -p $$mandir; mv $$manpage $$mandir; done
touch $@ touch $@
clean: clean:
rm -f doc/man/*.html doc/man/*.[1-9] rm -f doc/man/*.html doc/man/*.[1-9]
################################################################################
# Install targets
#
# FIXME: some distro nerd, can you make this more beautiful?
# Like integrating install, ...
# I'm just a hacker, I don't really care...
install: install-man
cp bin/* $(BINDIR)
install-man:
for p in doc/man/*.[1-9]; do n=$${p##*.}; cp $$p $(MANDIR)/man$$n/; done
################################################################################ ################################################################################
# Developer targets # Developer targets
# #

2
README
View file

@ -1 +1 @@
HACKERS_README REAL_README

View file

@ -1,5 +1,7 @@
[[!meta title="cdist - configuration management"]] [[!meta title="cdist - configuration management"]]
[[!toc levels=2]]
## Introduction ## Introduction
cdist configures your system and is similar to cdist configures your system and is similar to
@ -11,23 +13,23 @@ and [puppet](http://www.puppetlabs.com/), but
it ticks differently: it ticks differently:
* cdist sticks completly to the KISS (keep it simple and stupid) paradigma * cdist sticks completly to the KISS (keep it simple and stupid) paradigma
* cdist's core is very small (currently around 400 lines of code) * cdist's core is very small (< 1k lines of code)
* There is only one type to extend cdist called ***type***. * There is only one type to extend cdist called ***type***.
* One main development target: ***It must be incredible easy to add new types.***
* cdist is UNIX * cdist is UNIX
* It reuses existing tools like cat, find, mv, ... * It reuses existing tools like cat, find, mv, ...
* cdist's documentation is bundled as manpages * cdist's documentation is bundled as manpages
* cdist is written in POSIX shell * cdist is written in POSIX shell
* No special requirements like high level interpreters needed on server or target * No special requirements like high level interpreters needed on server or target
MAIN AIM: It MUST be incredible easy/dumb to add new types.
### Architecture ### Architecture
* Push mode (server pushes configuration) * Push mode (server pushes configuration)
* Pull mode (client triggers configuration) * Pull mode planned (client triggers configuration)
* User defines configuration in shell scripts (called ***manifests***) * User defines configuration in shell scripts (called ***manifests***)
* Cdist generates internal configuration (cconfig style) and afterwards applies configuration * Generates internal configuration (cconfig style)
* Uses ***types*** to generate code be executed on the target
* And finally executes the code on the target / applies the configuration
### Features ### Features
@ -51,39 +53,69 @@ but is not. Or: The reason why I began to write cdist.
* sh * sh
* find, rm, ... * find, rm, ...
### Roadmap
[[!table data="""
**Version** | **Objectives** | **Status**
1.0.0 | Initial release |
1.0.1 | Documentation cleanup |
"""]]
## Requirements ## Requirements
### Server ### Server
* A posix like shell * A posix like shell
* SSH-Client (for push architecture) * SSH-Client
* SSH-Server (for pull architecture)
### Client ### Client ("target host")
* A posix like shell * A posix like shell
* SSH-Client (for pull architecture) * SSH-Server
* SSH-Server (for push architecture)
## Installation
Cdist stable always in master ## Getting cdist
* Create a new unpriviliged user (probably "cdist") You can clone cdist from git, which gives you the advantage of having
* Become that user, execute the following code: a version control in place for development of your own stuff as well.
git clone git://git.schottelius.org/cdist ### Installation
cd cdist
export PATH=$PATH:$(pwd -P)/bin
That's it. To install cdist, execute the following commands:
Operation on the server is run as "cdist" user. git clone git://git.schottelius.org/cdist
Operation on the client is run as "root" user. cd cdist
export PATH=$PATH:$(pwd -P)/bin
## Update
git pull && make install Afterwards you can run ***cdist-quickstart*** to get an impression on
how to use cdist.
### Available versions
There are at least two branches available:
* master: the development branch
* 1.0: stable branch of version 1.0
Other branches may be available as well for features or bugfixes, but they
may vanish at any point. To select a specific branch use
# Generic code
git checkout -b <name> origin/<name>
# Stay on version 1.0
git checkout -b 1.0 origin/1.0
### Update
To upgrade cdist in the current branch use
git pull
The version branches are designed to change if there are incompatibilities.
Or the other way round: As long as you stay on 1.0 and do git pull, nothing
should break.
## Support ## Support
@ -96,7 +128,3 @@ You can join the development ***IRC channel***
Bug reports, questions, patches, etc. should be send to the Bug reports, questions, patches, etc. should be send to the
[cdist mailing list](http://l.schottelius.org/mailman/listinfo/cdist). [cdist mailing list](http://l.schottelius.org/mailman/listinfo/cdist).
## Commercial Support
To be done.

View file

@ -1,73 +0,0 @@
Steps needed until 1.0:
x finish type __file
- finish type __package
- cleanup documentation (see below)
--------------------------------------------------------------------------------
This document defines how to continue work on cdist:
x general stuff
x Define configuration paths (doc/internal/config-layout)
x check whether remote and local view of objects can be the same,
i.e. local:/outdir == remote:/var/lib/cdist
x similar, but not the same
x get information from target (stage 1)
x Define how to get information from targets
x Create shell script that creates code to run on client (cdist-build-explorer)
x Redo explorers (see manpage)
x run initial manifest (stage 2)
x Create configuration tree from manifest
x write binaries, which create the tree when called from manifest (cdist_tree_wrapper)
x be able to run manifest of types (stage 3)
x Parse configuration tree/objects recursively
x can/may types modify tree?
-> yes, of everything a type created itself!
x may open door for getting information from manifest / other stuff
x Cleanly define paths for object creation, especially recursive calls
x doc/man/cdist-config-layout.text
x cd $__object_dir, before running manifest
x rename $__object_dir to $__object_base_dir
x use $type/manifest instead of $type/init
x find $object_id in recursive runner (before merge)
x move parameters of object to subdir parameter
x run explorers for every object
x generate code to be executed on clients (stage 4)
x for one object
x for all objects
x execute code on client (stage 5)
- Last doc stuff for 1.0.0:
x remove old documentation from doc/man/!
- Check all references in manpages, ensure all manpages exist
- cdist
- cdist-deploy-to
- cdist-manifest
- cdist-quickstart: how to get started
- ensure every file in bin/ has a correspondent manpage
- cdist-type [IMPORTANT]
- only do necessary work [TYPE IMPLEMENTATION HINTS]
- install packages only if not existent
- copy file only if different
- cdist-type-integration
- cdist [IMPORTANT]
- explain the general approach
- give right pointers
- cdist-explorer
- DOC document "cd $__object_dir, before running manifest" in doc/man/cdist-types.text
- DOC document that $type/manifest is executed for every object/instance
- DOC: exported variables: __type, __explorer, __type_explorer, __object, __object_id
- Cleanup READMEs
- Ensure manpages are formatted correctly
- Ensure html output of manpages are published on the web
- Makefile:
- Add install target
- Include manpage generation

View file

@ -41,4 +41,11 @@ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
# Transfer cdist-* to the remote host # Transfer cdist-* to the remote host
scp -qr "${__cdist_src_base}"* \ scp -qr "${__cdist_src_base}"* \
"root@${__cdist_target_host}:${__cdist_my_remote_out_dir}" "${__cdist_remote_user}@${__cdist_target_host}:${__cdist_my_remote_out_dir}"
# Adjust cdist-config to contain static version string
tmp_version="$__cdist_version"
sed "s/^: \${\(__cdist_version\):=.*/\1=\"$tmp_version\"/" "$(which cdist-config)" | \
ssh -q "${__cdist_remote_user}@${__cdist_target_host}" \
"cat > \"${__cdist_my_remote_out_dir}\"/cdist-config"

View file

@ -22,17 +22,30 @@
# Fail if something bogus is going on and export all variables # Fail if something bogus is going on and export all variables
set -u set -u
__cdist_version="1.0.0" ################################################################################
# cconf standard vars prefixed with cdist
__cdist_pwd="$(pwd -P)"
__cdist_mydir="${0%/*}";
__cdist_abs_mydir="$(cd "$__cdist_mydir" && pwd -P)"
__cdist_myname=${0##*/};
__cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname"
: ${__cdist_version:="$(cd "$__cdist_abs_mydir/.." && git describe)"}
################################################################################
# Names / Constants
#
# Most values can be overriden from outside, so you can # Most values can be overriden from outside, so you can
# customise paths as you like (for distributors, geeks and hackers) # customise paths as you like (for distributors, geeks and hackers)
#
# Names / Constants
: ${__cdist_name_bin:=bin} : ${__cdist_name_bin:=bin}
: ${__cdist_name_code:=code} : ${__cdist_name_code:=code}
: ${__cdist_name_conf_dir:=conf} : ${__cdist_name_conf_dir:=conf}
: ${__cdist_name_explorer:=explorer} : ${__cdist_name_explorer:=explorer}
: ${__cdist_name_gencode:=gencode} : ${__cdist_name_gencode:=gencode}
: ${__cdist_name_global:=global}
: ${__cdist_name_host:=host} : ${__cdist_name_host:=host}
: ${__cdist_name_init:=init} : ${__cdist_name_init:=init}
: ${__cdist_name_manifest:=manifest} : ${__cdist_name_manifest:=manifest}
@ -49,10 +62,19 @@ __cdist_version="1.0.0"
: ${__cdist_name_type_bin:=type_bin} : ${__cdist_name_type_bin:=type_bin}
: ${__cdist_name_type_explorer:=type_explorer} : ${__cdist_name_type_explorer:=type_explorer}
# Used for IDs
: ${__cdist_sane_regexp:=[A-Za-z0-9/]*[-A-Za-z0-9_/]*}
# Exported variable names (usable for non core) # Default remote user
: ${__cdist_remote_user:=root}
################################################################################
# Exported variable names (usable for non core
#
: ${__cdist_name_var_explorer:=__$__cdist_name_explorer} : ${__cdist_name_var_explorer:=__$__cdist_name_explorer}
: ${__cdist_name_var_type_explorer:=__$__cdist_name_type_explorer} : ${__cdist_name_var_type_explorer:=__$__cdist_name_type_explorer}
: ${__cdist_name_var_global:=__$__cdist_name_global}
: ${__cdist_name_var_manifest:=__$__cdist_name_manifest} : ${__cdist_name_var_manifest:=__$__cdist_name_manifest}
: ${__cdist_name_var_target_host:=__$__cdist_name_target_host} : ${__cdist_name_var_target_host:=__$__cdist_name_target_host}
: ${__cdist_name_var_object:=__$__cdist_name_object} : ${__cdist_name_var_object:=__$__cdist_name_object}
@ -60,52 +82,48 @@ __cdist_version="1.0.0"
: ${__cdist_name_var_type:=__$__cdist_name_type} : ${__cdist_name_var_type:=__$__cdist_name_type}
# Base ################################################################################
: ${__cdist_conf_dir:=/etc/cdist} # Tempfiles
#
__cdist_tmp_dir=$(mktemp -d "/tmp/cdist.XXXXXXXXXXXX")
__cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX")
################################################################################
# Local Base
#
: ${__cdist_local_base_dir:=$__cdist_tmp_dir}
: ${__cdist_conf_dir:="$(cd "$__cdist_abs_mydir/../conf" && pwd -P)"}
: ${__cdist_explorer_dir:=$__cdist_conf_dir/$__cdist_name_explorer} : ${__cdist_explorer_dir:=$__cdist_conf_dir/$__cdist_name_explorer}
: ${__cdist_manifest_dir:=$__cdist_conf_dir/$__cdist_name_manifest} : ${__cdist_manifest_dir:=$__cdist_conf_dir/$__cdist_name_manifest}
: ${__cdist_manifest_init:=$__cdist_manifest_dir/$__cdist_name_init} : ${__cdist_manifest_init:=$__cdist_manifest_dir/$__cdist_name_init}
: ${__cdist_type_dir:=$__cdist_conf_dir/$__cdist_name_type} : ${__cdist_type_dir:=$__cdist_conf_dir/$__cdist_name_type}
# Used for IDs ################################################################################
__cdist_sane_regexp='[A-Za-z0-9/]*[-A-Za-z0-9_/]*' # Local output
#
# Default remote user
: ${__cdist_remote_user:=root}
# Remote base
: ${__cdist_remote_base_dir:=/var/lib/cdist}
# Remote config
: ${__cdist_remote_conf_dir:=$__cdist_remote_base_dir/$__cdist_name_conf_dir}
: ${__cdist_remote_explorer_dir:=$__cdist_remote_conf_dir/$__cdist_name_explorer}
: ${__cdist_remote_bin_dir:=$__cdist_remote_conf_dir/$__cdist_name_bin}
: ${__cdist_remote_type_dir:=$__cdist_remote_conf_dir/$__cdist_name_type}
# Remote out
: ${__cdist_remote_out_dir:=$__cdist_remote_base_dir/$__cdist_name_out_dir}
: ${__cdist_remote_out_explorer_dir:=$__cdist_remote_out_dir/$__cdist_name_explorer}
: ${__cdist_remote_out_object_base_dir:=$__cdist_remote_out_dir/$__cdist_name_object}
# Tempfiles
__cdist_tmp_dir=$(mktemp -d "/tmp/cdist.XXXXXXXXXXXX")
__cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX")
# Local output base directory
: ${__cdist_local_base_dir:=$__cdist_tmp_dir}
: ${__cdist_out_dir:=$__cdist_local_base_dir/$__cdist_name_out_dir} : ${__cdist_out_dir:=$__cdist_local_base_dir/$__cdist_name_out_dir}
: ${__cdist_out_explorer_dir:=$__cdist_out_dir/$__cdist_name_explorer} : ${__cdist_out_explorer_dir:=$__cdist_out_dir/$__cdist_name_explorer}
: ${__cdist_out_object_dir:=$__cdist_out_dir/$__cdist_name_object} : ${__cdist_out_object_dir:=$__cdist_out_dir/$__cdist_name_object}
: ${__cdist_out_type_bin_dir:=$__cdist_out_dir/$__cdist_name_type_bin} : ${__cdist_out_type_bin_dir:=$__cdist_out_dir/$__cdist_name_type_bin}
################################################################################
# Remote base
#
: ${__cdist_remote_base_dir:=/var/lib/cdist}
: ${__cdist_remote_bin_dir:=$__cdist_remote_base_dir/$__cdist_name_bin}
: ${__cdist_remote_conf_dir:=$__cdist_remote_base_dir/$__cdist_name_conf_dir}
: ${__cdist_remote_explorer_dir:=$__cdist_remote_conf_dir/$__cdist_name_explorer}
: ${__cdist_remote_type_dir:=$__cdist_remote_conf_dir/$__cdist_name_type}
################################################################################ ################################################################################
# cconf standard vars prefixed with cdist # Remote output
__cdist_pwd="$(pwd -P)" #
__cdist_mydir="${0%/*}"; : ${__cdist_remote_out_dir:=$__cdist_remote_base_dir/$__cdist_name_out_dir}
__cdist_abs_mydir="$(cd "$__cdist_mydir" && pwd -P)" : ${__cdist_remote_out_explorer_dir:=$__cdist_remote_out_dir/$__cdist_name_explorer}
__cdist_myname=${0##*/}; : ${__cdist_remote_out_object_base_dir:=$__cdist_remote_out_dir/$__cdist_name_object}
__cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname"
################################################################################ ################################################################################
# Function list # Function list

View file

@ -40,7 +40,7 @@ echo "cdist $__cdist_version: Configuring $__cdist_target_host"
# #
# Prepare local and remote directories # Prepare local and remote directories
__cdist_init_deploy "$__cdist_target_host" __cdist_init_deploy "$__cdist_target_host"
# Transfer cdist "binaries" # Transfer cdist "binaries"
cdist-bin-transfer "$__cdist_target_host" "$__cdist_remote_bin_dir" cdist-bin-transfer "$__cdist_target_host" "$__cdist_remote_bin_dir"

View file

@ -34,7 +34,10 @@ __cdist_output_dir="$1"; shift
__cdist_work_dir="$__cdist_local_base_dir" __cdist_work_dir="$__cdist_local_base_dir"
# Export information for cdist-type-emulator # Export information for cdist-type-emulator
export __cdist_output_dir __cdist_manifest export __cdist_conf_dir __cdist_output_dir __cdist_manifest __cdist_version
# Export information for manifests
export __global="$__cdist_out_dir"
# Ensure binaries exist and are up-to-date # Ensure binaries exist and are up-to-date
cdist-type-build-emulation "${__cdist_out_type_bin_dir}" \ cdist-type-build-emulation "${__cdist_out_type_bin_dir}" \

View file

@ -40,6 +40,7 @@ gencode="$(__cdist_type_gencode "$__cdist_type")"
# export variables for gencode # export variables for gencode
export __object_id="$__cdist_object_id" export __object_id="$__cdist_object_id"
export __object="$__cdist_object_dir" export __object="$__cdist_object_dir"
export __global="$__cdist_out_dir"
cd "$__cdist_local_base_dir" cd "$__cdist_local_base_dir"

View file

@ -35,100 +35,231 @@ __prompt()
} }
################################################################################ ################################################################################
# Intro # Intro of quickstart
# #
cat << eof cat << eof
$banner cdist version $__cdist_version $banner cdist version $__cdist_version
Welcome to the interactive guide to cdist! Welcome to the interactive guide to cdist!
This is the interactive tutorial and beginners help for cdist. This is the interactive tutorial and beginners help for cdist and here's
our schedule:
If you would like to run this tutorial completly without root priveliges, - Stages: How cdist operates
setup the variables __cdist_conf_dir to point to a writable locaction - Explorer: Explore facts of the target host
(i.e. $HOME/cdist-config). - Manifest: Map configurations to hosts
- Types: Bundled functionality
- Deploy a configuration to the local host!
eof eof
__prompt "$continue" __prompt "$continue"
################################################################################ ################################################################################
# /etc/cdist via root # Stages
# #
cat << eof cat << eof
To make any use of cdist, we need to create the configuration base, which
can normally be found below ${__cdist_conf_dir}. As cdist does not need
any root priveliges normally, it is recommended that you create this
directory as root and change the owner to a dedicated user (for instance
cdist).
MANUAL STEP: To deploy configurations to a host, you call
- Become root: su - cdist-deploy-to <hostname>
- Create ${__cdist_conf_dir}: mkdir ${__cdist_conf_dir}
- Change owner to $USER: chown $USER ${__cdist_conf_dir} which makes calls to other scripts, which realise the so called "stages".
Usually you'll not notice this, but in case you want to debug or hack cdist,
you can run each stage on its own. Besides that, you just need to remember
that the command cdist-deploy-to is the main cdist command.
See also:
Source of cdist-deploy-to, cdist-stages(7)
eof eof
__prompt "$continue" __prompt "$continue"
################################################################################ ################################################################################
# Basic directories # Explorer
# #
cat << eof cat << eof
Now we need to create some basic directories:
- ${__cdist_explorer_dir}: Contains explorer, which explore the target The first thing cdist always does is running different explorers on the
- ${__cdist_manifest_dir}: Contains manifests which define types being used target host. The explorers can be found in the directory
- ${__cdist_type_dir}: Contains types
${__cdist_explorer_dir}
An explorer is executed on the target host and its output is saved to a file.
You can use these files later to decide what or how to configure the host.
For a demonstration, we'll call the OS explorer locally now, but remember:
This is only for demonstration, normally it is run on the target host.
The os explorer will which either displays the detected operating system or
nothing if it does not know your OS.
See also:
cdist-explorer(7)
eof eof
__prompt "$create_continue" explorer="${__cdist_explorer_dir}/os"
__prompt "Press enter to execute $explorer"
set -x set -x
mkdir -p ${__cdist_explorer_dir} "$explorer"
mkdir -p ${__cdist_manifest_dir}
mkdir -p ${__cdist_type_dir}
set +x set +x
################################################################################ ################################################################################
# create manifest/init # Manifest
# #
cat << eof cat << eof
At the beginning of a configuration deployment the first file cdist reads is
${__cdist_manifest_init}, which defines the types to be created on
a specific host.
We'll create the initial manifest and add some example types to it. The initial manifest is the entry point for cdist to find out, what you would
like to have configured. It is located at
eof ${__cdist_manifest_init}
__prompt "$create_continue"
set -x And can be as simple as
cat << eof > "${__cdist_manifest_init}"
# Always create a marker --------------------------------------------------------------------------------
__file /etc/cdist-configured --type file __file /etc/cdist-configured --type file
case "\$__target_host" in
$(hostname)*)
__file /tmp/cdist-quickstart --type file
;;
esac
eof
set +x
################################################################################
# show generated manifest/niit
#
cat << eof
Let's have a look how the initial manifest looks like currently:
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
eof
cat "${__cdist_manifest_init}"
cat << eof
--------------------------------------------------------------------------------
eof
See also:
cdist-manifest(7)
eof
__prompt "$continue"
cat << eof
Let's take a deeper look at the initial manifest to understand what it means:
__file /etc/cdist-configured --type file
| | | \\
| | The parameter type \\ With the value file
| |
| |
| | This is the object id
|
__file is a so called "type"
This essentially looks like a standard command executed in the shell.
eof
__prompt "$continue"
cat << eof
And that's exactly true. Manifests are shell snippets that can use
types as commands with arguments. cdist prepends a special path
that contain links to the cdist-type-emulator, to \$PATH, so you
can use your types as a command.
This is also the reason why types should always be prefixed with
"__", to prevent collisions with existing binaries.
The object id is unique per type and used to prevent you from creating
the same object twice.
Parameters are type specific and are always specified as --parameter <value>.
See also:
cdist-type-build-emulation(1), cdist-type-emulator(1)
eof
__prompt "$continue" __prompt "$continue"
################################################################################ ################################################################################
# add type file # Types
# #
cat << eof
Types are bundled functionality and are the main component of cdist.
If you want to have a feature x, you write the type __x. Types are stored in
${__cdist_type_dir}
And cdist ships with some types already!
See also:
cdist-type(7)
eof
__prompt "Press enter to see available types"
set -x
ls ${__cdist_type_dir}
set +x
cat << eof
Types consist of the following parts:
- ${__cdist_name_parameter} (${__cdist_name_parameter_required}/${__cdist_name_parameter_optional}
- ${__cdist_name_manifest}
- ${__cdist_name_explorer}
- ${__cdist_name_gencode}
eof
__prompt "$continue"
cat << eof
Every type must have a directory named ${__cdist_name_parameter}, which
contains required or optional parameters (in newline seperated files).
If an object of a specific type was created in the initial manifest,
the manifest of the type is run and may create other objects.
A type may have ${__cdist_name_explorer}, which are very similar to the
${__cdist_name_explorer} seen above, but with a different purpose:
They are specific to the type and are not relevant for other types.
You may use them for instance to find out details on the target host,
so you can decide what to do on the target host eventually.
After the ${__cdist_name_manifest} and the ${__cdist_name_explorer} of
a type have been run, ${__cdist_name_gencode} is executed, which creates
code to be executed on the target on stdout.
eof
__prompt "$continue"
################################################################################
# Deployment
#
cat << eof
Now you've got some basic knowledge about cdist, let's configure your localhost!
Ensure that you have a ssh server running locally and that you can login as root.
The cdist distribution contains some sensible default initial manifest, which
will create 2 files, /etc/cdist-configured (for every host) and
/tmp/cdist-testfile (only for localhost).
eof
cmd="cdist-deploy-to localhost"
__prompt "Press enter to run \"$cmd\""
# No quotes, we need field splitting
$cmd
################################################################################
# End
#
cat << eof
That's it, this is the end of the cdist-introduction.
I hope you've got some impression on how cdist works, here are again some
pointers on where to continue to read:
cdist(7), cdist-deploy-to(1), cdist-type(7), cdist-stages(7)
eof

View file

@ -39,12 +39,10 @@ __cdist_explorer_dir="$1"; shift
# Write output here # Write output here
__cdist_my_out_dir="$1"; shift __cdist_my_out_dir="$1"; shift
# cd to this dir
__cdist_work_dir="$__cdist_remote_base_dir"
# Setup environment # Setup environment
export $__cdist_variable_name="$__cdist_explorer_dir" export $__cdist_variable_name="$__cdist_explorer_dir"
cd "${__cdist_work_dir}" export __global="$__cdist_remote_out_dir"
mkdir -p "$__cdist_my_out_dir" mkdir -p "$__cdist_my_out_dir"
# Ensure there is at least one explorer # Ensure there is at least one explorer

View file

@ -28,13 +28,56 @@ if grep -q ^DISTRIB_ID=Ubuntu /etc/lsb-release 2>/dev/null; then
exit 0 exit 0
fi fi
[ -f /etc/arch-release ] && echo archlinux if [ -f /etc/arch-release ]; then
echo archlinux
exit 0
fi
[ -f /etc/debian_version ] && echo debian if [ -f /etc/debian_version ]; then
echo debian
exit 0
fi
[ -f /etc/gentoo-release ] && echo gentoo if [ -f /etc/gentoo-release ]; then
echo gentoo
exit 0
fi
[ -f /etc/redhat-release ] && echo redhat if [ -f /etc/redhat-release ]; then
echo redhat
exit 0
fi
# ensure correct exit, otherwise other explorer won't get started if [ -f /etc/SuSE-release ]; then
exit 0 echo suse
exit 0
fi
uname_s="$(uname -s)"
# Assume there is no tr on the client -> do lower case ourselves
case "$uname_s" in
Darwin)
echo macosx
exit 0
;;
NetBSD)
echo netbsd
exit 0
;;
FreeBSD)
echo freebsd
exit 0
;;
OpenBSD)
echo openbsd
exit 0
;;
SunOS)
echo solaris
exit 0
;;
esac
echo "Unknown OS" >&2
exit 1

View file

@ -10,7 +10,6 @@ __file /etc/cdist-configured --type file
case "$__target_host" in case "$__target_host" in
# Everybody has this # Everybody has this
localhost) localhost)
__issue iddoesnotmatterhere
__file test --type file --destination /tmp/cdist-testfile __file test --type file --destination /tmp/cdist-testfile
;; ;;
@ -29,4 +28,7 @@ case "$__target_host" in
__package_apt zsh --state installed __package_apt zsh --state installed
__package_apt apache2 --state uninstalled __package_apt apache2 --state uninstalled
;; ;;
kr)
__issue iddoesnotmatterhere
;;
esac esac

View file

@ -24,12 +24,24 @@
if [ -f "$__object/parameter/destination" ]; then if [ -f "$__object/parameter/destination" ]; then
destination="$(cat "$__object/parameter/destination")" destination="$(cat "$__object/parameter/destination")"
else else
destination="$__object_id" destination="/$__object_id"
fi fi
os="$(cat $__global/explorer/os)"
case "$os" in
macosx)
md5sum="md5"
;;
*)
md5sum="md5sum"
;;
esac
# No output if file does not exist - does definitely not match the md5sum :-) # No output if file does not exist - does definitely not match the md5sum :-)
if [ -e "$destination" ]; then if [ -e "$destination" ]; then
md5sum "$destination" $md5sum < "$destination"
else else
echo "NO FILE NOT FOUND, NO CHECKSUM CALCULATED." echo "NO FILE FOUND, NO CHECKSUM CALCULATED."
fi fi

View file

@ -40,20 +40,26 @@ if ! $(echo "$destination" | grep -q ^/); then
exit 1 exit 1
fi fi
case "$os" in
macosx)
md5sum="md5"
;;
*)
md5sum="md5sum"
;;
esac
# Copy source if existing # Copy source if existing
# FIXME: directory handling not supported - add recursive flag? # FIXME: directory handling not supported - add recursive flag?
if [ -f "$__object/parameter/source" ]; then if [ -f "$__object/parameter/source" ]; then
source="$(cat "$__object/parameter/source")" source="$(cat "$__object/parameter/source")"
exec 3>&1 local_md5sum="$($md5sum < "$source")"
exec 1>&2
set -x
md5sum="$(md5sum "$source")"
remote_md5sum="$(cat "$__object/explorer/md5sum")" remote_md5sum="$(cat "$__object/explorer/md5sum")"
# Is md5sum the right approach? # Is md5sum the right approach?
if [ "$md5sum" != "$remote_md5sum" ]; then if [ "$local_md5sum" != "$remote_md5sum" ]; then
# FIXME: This is ugly and hardcoded, replace after 1.0! # FIXME: This is ugly and hardcoded, replace after 1.0!
# Probably a better aproach is to have the user configured # Probably a better aproach is to have the user configured
# ~/.ssh/config to contain the right username # ~/.ssh/config to contain the right username

1354
doc/dev/config.guess vendored Normal file

File diff suppressed because it is too large Load diff

9
doc/dev/logs/2011-03-03 Normal file
View file

@ -0,0 +1,9 @@
Update on env:
general explorer: __explorer
initial manifest: __manifest, __global
type manifests __object, __object_id, __global
type explorers: __object, __object_id, __type_explorers
type codegen: __object, __object_id, __global
type code: -

9
doc/dev/logs/2011-03-07 Normal file
View file

@ -0,0 +1,9 @@
Update on env:
general explorer: __explorer
initial manifest: __manifest, __global
type manifests __object, __object_id, __global
type explorers: __object, __object_id, __type_explorers, __global
type codegen: __object, __object_id, __global
type code: -

View file

@ -1,5 +1 @@
Prepare documentation for 1.0.0. Prepare release 1.0.0
- Check all references in manpages
- cdist.text, cdist-quickstart
- write cdist-quickstart
- redefine installation + configuration base?

View file

@ -40,3 +40,56 @@ Documentation:
- Different environments (production, integration, development) - Different environments (production, integration, development)
- via version control - via version control
- Define how to raise errors in types - Define how to raise errors in types
- = todo
+ = in progress -> S|N
x = done
x remove old documentation from doc/man/!
- Check all references in manpages, ensure all manpages exist, generic ones:
+ cdist
+ cdist-deploy-to
+ cdist-manifest
- cdist-quickstart: how to get started
- cdist-type [IMPORTANT]
- only do necessary work [TYPE IMPLEMENTATION HINTS]
- install packages only if not existent
- copy file only if different
- DOC document that $type/manifest is executed for every object/instance
- cdist-explorer
- exported variables:
- general explorer: __explorer # cdist-explorer
- initial manifest: __manifest, __global # cdist-manifest
- type manifests __object, __object_id, __global # cdist-type
- type explorers: __object, __object_id, __type_explorers # cdist-type
- type codegen: __object, __object_id, __global # cdist-type
- type code: - # cdist-code
- cdist-type-integration
- Ensure available types are documented (!)
- define how to in cdist-type-integration
- referenced on the webpage via cdist-type(7)!
- ensure every file in bin/ has a correspondent manpage
- cdist-bin-transfer
- cdist-code-run-all
- cdist-config
- cdist-deploy-to
- cdist-dir
- cdist-explorer-run-init
- cdist-manifest-run
- cdist-manifest-run-all
- cdist-manifest-run-init
- cdist-object-codegen
- cdist-object-codegen-all
- cdist-object-explorer-all
- cdist-quickstart
- cdist-remote-code-run-all
- cdist-remote-explorer-run
- cdist-run-remote
- cdist-type-build-emulation
- cdist-type-emulator
- Cleanup READMEs
- Ensure html output of manpages are published on the web
- Makefile:
- Include manpage generation