2.2.1
	scli: type section added. This is a special case of shellcommands, which
	send commands to the special shell scli by Juergen Schoenwaelder for
	communicating with snmp devices.

	Code refactoring for package management.

	Bug fixes for problems introduced in 2.2.0.
	
2.2.0
	Apart from minor changes, this version is about structural internal
	changes that ease the eventual confluence with cfengine 3 and the work
	going on behind the scenes there. Every effort is being made to
	make this change easy for users and existing installations. New features
	will be introduced into 2.2.x gradually, and the new front-end will
	eventually merge into this.

	This version accompanies a new introduction to cfengine published as
	a SAGE Short Topics book.

	* Some changes

	EMANICS extensions and reference testing for context sensitive
	network navigation patterns using voluntary cooperation contracts.
	
	PrintFile("name") function added to alerts
	
	!! List expansion in editfiles actions. This is an important change 
	because it can potentially affect existing configurations that contain
	variables with a list separator in them. EditSplit is used for this.

	elsdefine fixed in tidy
	
	processes with action=warn only install fix

	ifelapsed/expireafter fixed in editfiles

	Instrumentation of copy/shellcommands measuring time/averages
	use cfshow --performance

	background=true in shellcommands was not implemented! (Fixed)

	SLES10 recognition
	RedHat/Fedora further classes

	SELinux support begun by Jeff Sheltren UCSB, who notes. 

	> Currently, I have editfiles and copy working with selinux security
	> contexts, although so far copy only has support for regular files; I
	> haven't worked on links, etc. yet.
	> Use --enable-selinux during compilation

	Bug / misleading error message in ReadArray fixed

	HostRange bug for numericals in hostname fixed by Steve Radar.
	
2.1.22 

	IMPORTANT: cfshow output formatting changes
	           database internal format changes

	Rewritten the checksum subsystem to allow for future development
	and improvements and tidied the fragile Berkeley DB code. Cfservd
	no longer caches checksums, as this causes update issues. This could
	lead to additional load.

	The checksum code has been rewritten with a new database model, so all
	old data will be rebuilt. The checksum database has been renamed.
	
	ChecksumDatabase variable is not longer used.

	Package manager debian patch added to iterate over packages
	under installation.
	
	Package manager for AIX code added, courtesy of Anthony Rassin

	Package manager for Gentoo added, courtesy of Eric Searcy 
	
	ShowState(rootprocs), ShowState(otherprocs) added for
	better process reporting

	General code reorganization for better separation of concerns, looking
	towards cfengine 3.

	cfconvert removed. Change of future strategy for cfengine 3 migration.

	Rationalization of internal instrumentation and better integration
	with cfenvd.

	Bug fixes to miscmounts. Editing was broken with respect to editfilesize variable.
	Option processing for miscmounts was also broken.

	Support for old Berkeley DB APIs abandoned.

	Encryption level added for full encryption of opendir traffic.
	Must set FullEncryption = ( true ) in control for compatability

	server=none now signals noop in method execution and copy.

        Varstring expansion bug for nested variables.
	
2.1.21

	copy action now supports this $(this) variable which is made equal to the
	current server. This allows separating files from multiple hosts when downloading.
	
	cfenvd LDT fixes

	Bugs in PeerLeader/Group functions fixed.

	Some buffer limits too small and hardcoded in item.c - fix
	PH support removed from cfenvd during code rationalization - never used

	Cfenvd code rationalization and channge in database format.
	THe first time cfenvd runs, it will convert the database into the new format,
	be aware that this could take some time as it is disk intensive.

	Matt Shibla (ARM) ReturnsZeroShell function added.
	Cfrun ignored port number, fix


2.1.20
	ipv6 structure compilation error for Tru64

	Tested for compilation with latest Berkeley4.4-NC

	New option in cfservd.conf "LogEncryptedTransfers" (true/false).
	If true, any file that is granted access and is marked "encrypt=true"
	will be logged in syslog. i.e. one can keep a record of sensitive
	transfers.

	Linkcopy fix in 2.1.19 broke copying of links that point
	nowhere. Fixed.

	Copy was missing from the multi-pass detection. Fixed

	Patch to debian package management. (bastiaans@sara.nl) fixed -
	debian package always returned eq/true without cmp/version
	statement" (checking if a package is installed, regardless of
	version, now works
	
	However the "Comparison result" is always "eq" (equal) somehow for
	me... "

	If you are experiencing problems with 2.1.19 please get 2.1.19a.
	One of the changes in 2.1.19 has had bizarre side effects in links
	and disks.
	
2.1.19 

	cfagent will now exit and cease processing if any class in the defined
	control list

	 AbortClasses = ( class_name_1 class_name_2 ... )

	The singlecopy feature has been rewritten after reports of it not
	working, besides, the code was bizarre and the documentation was
	even worse.

	The autodefine code also patched and tested. In both these cases,
	there are lists of *patterns* or wildcards. The code and docs now
	agree

	ExecResult now runs its command in -n mode
	
	Error parsing strings (esp shellcommands) that contain the $
	symbol due to a bug in 2D-lists.
	
	VMWare ESX recognition.
	
	Bug in cfservd stat-mode on symbolic links not correctly
	evaluated.  Bug in linktype=copy for copy fixed.
	
	Bug in array expansion fixed - would truncate string after expansion

	Constant-cosmetics and length alterations. CF_SMALLBUF introduced,
	and MAXHOSTNAMELEN used

	PID file added for each daemin in WORKDIR == /var/cfengine
	
	Patch for function argument parsing
	
	Typo in docs. SelectPartitionGroup -> SelectPartitionNeighbours
	
	Inform=true support for packages
	
	HostRange bug - recoding not implemented properly from
	2.1.16. Caused seg fault.

	Joe Buehler's harmless patch to cfexecd to flag daemon and batch mode.
	
	Serious bug in binserver handling fixed. (Rarely used feature)
	
	home tidying did not set the "done flag" for multiple pass avoidance.
	
	Patches to setting unqualified and qualified names
	
	SuSE 10 detection patch

	Minor error fixes discovered by Joe Buehler and his wonderful
	software.
	
        Files is the "suspicious" list were marked "not sensible" so that
	follow-up rules e.g. to delete them would not be triggered This is
	now considered a confusion of roles. Suspicious files are no
	longer skipped.

	More memory leaks in cfservd

	Compilation fix for non-IPv6 savvy machines
	
2.1.18
	
	
	Error in FileExists() left over from 2.1.16 changes. Fixed

	elsedefine was not defined if a copy was requested of a non-existent file. Fixed.
	
	HostnameKeys (dynamic keys for dhcp clients) fix for cfservd.
	
	Error in stat'ing links that point to non-existent files in
	cfservd. Missing "else" caused this to be reported as an error in
	remote file copy.

	5 second timeout reduced to 10 in cfservd file change check.
	
	Error message returned by cfservd is non-specific and previously
	said authentication denied, regardless of failure. The daemon now replies
	"Unspecified refusal". Users should use -v or -d2 on both sides of a connection
	to diagnose the true cause of failure,
	
	Segmentation fault when in verbose mode fixed - editfiles pointer.
	
	Error in parsing quotes and escaped quotes in functions.

	Bug in implementation of tidy scheduling during dependent classes fixed.

	BeginGroupIfLineMatch
	BeginGroupIfMatch
	BeginGroupIfLineContaining operations added

	Function ExecShellResult similar to ExecResult, but a shell is used,

	cfservd some additional memory reclamation during file updates, could cause memory leaks..
	
2.1.17

		This is a minor bugfix release

	
	WARNING	- the handling of function arguments has been changed. You are recommended to
	use normal C/Perl quoting of argument strings., e.g.

	  result = ( ExecResult("/bin/sh -c \"${pf_cc} -V | head -1 | cut -d\  -f3\"") )

	not

  	  result = ( ExecResult(/bin/sh -c "${pf_cc} -V | head -1 | cut -d\  -f3") )
	
	IsWildItemIn now has reflexive check - some confusion in the code about whether
	the needle or the haystack is the wildcard.
	
	Templating in editfiles. A new editfiles directive "ExpandVariables"
	adds an "m4" like function to cfengine -- allowing predefined variable strings
	to be expanded into text.
	
	Patch contributed to expansvariables: Davor Ocelic <docelic@mail.inet.hr>
	
	Alerts patch - some alerts not installed, if classes not defined.
	
	Patch for missing variable expansion after function
	parameter rewrite in 2.1.16. Some functions were not fully ported.

	vicf eliminated from distribution	

	PrepModule environment fix

	Compilation error C++ mixed into cfetool fix

	Chdir to / when ascting as a daemon for cfservd, cfexecd etc

2.1.16
	Bugfix release

	Moved method parameter setting to fix a bug where parameters would
	be set too late to be used in the parser
	
	action=warn in copy required inform=true to work, fixed.
	
	Function arg expansion bug and improvement fix
	
	Include directive added to cfrun.hosts (Olivier Fauchon)
	
	MOUNT_RO name collision fix
	
	SEG fault fixed when signalling cfenvd

	SkipIdentify partial fix
	
	Alf Wachsmann and Elizabeth Cassel's cfetool added, based on cfenvd.

	"cfetool makes a standalone tool out of cfenvd that accepts arbitrary
	periodic data. In addition, it has support for yearly periodic data.
	It's function and the user interface is in many aspects like rrdtool's.
	cfetoolgraph was added to work with the new features of cfetool.
	It works basically like cfenvgraph."

	
	Bug fix for multipass evaluation when resolving dependencies.

	Cfservd reread patch. Timeout on polling for linux,

	Default route code now uses "route" command exclusively for portability.

	EmailFrom patch to cfexecd / redundant code was paste error

	Increase pass depth in evaluation of action sequence.

	Skipident patch

	Size increase for interface buffer list

	HPUX,AIX ifconfig location fix

	Methods documentation improved.

	New control function for testing tcp services
          var = ReadTCP(host,port,"send string",maxbytes)
	
2.1.15 

	-f removal in cfservd patch

	Segmentation fault in cfservd with RSA key exchange fixed.

	Disk freespace alerting bug - did not agree with manual specification. Message
	appears only in verbose. Fixed. 

	Autodefine install patch.

	Abspath in shellcommands was not parsed and acted on...

	Warnall action was not respected in copy. Permissions were altered on destination file anyway.

	cfcolon added to special symbols.

2.1.14

	Alerts processed now in update context.

	More locking canonification fixes
	
	Exception for ReplaceALL convergence warning. Warning is not fatal
	if the operation is inside an editgroup.

	md5/sha1 message incorrect on new file found.

       Fixup Makefile.am and doc/Makefile.am.  Docs are now installed
       in the CFEngine "share" directory where they belong.

	Directory iteration fixed. New: owner=LastNode sets the owner of 
	the directory to the name of the last node in the dir name. This allows
	the creation of homedirs.

	CentOS support added.

	Extra encryption stage added in C5 protocol. NOTE: This makes 2.1.14
	cfagent clients unable to talk to older servers. (Upgrade servers
	first, or at the same time.)

	Class "no_default_route" is now defined if a default route is not previously
	set, and a default route is defined for the current host.

	Added class functions IsGreaterThan, IsLessThan for numerical or string comparisons

	control:
	
  	 actionsequence = ( files )
	
	 a = ( 2.12 )
 	 b = ( 2.11 )	
	
	classes:

	lt = ( LessThan(${a},${b}) )
   	gt = ( GreaterThan(${a},${b}) )

	alerts:

	  lt:: "$(a) LESS THAN $(b)"
	  gt:: "$(a) GREATER THAN $(b)"


	Bugfix for cfshow -c options (Nathan Hruby)
	
2.1.13
	Mistake in placement of update.conf runs fixed.

	Alteration to lock hashing to avoid conflicts

	Mandrake version type patch/repatched 

	Error message in disable now
	underlines move to respository where defined.

	Locking patch to tidy. Did not release lock when tidying
	recursively with subdirectory deletions. (Eric Sorensen).

	Host range patched (again) (Bas VdV)

2.1.12
	cf.preconf can now cause an abort if the script prints out a string
	containing the substring "cfengine-preconf-abort".
	An exit code of 2 signals this failure

	Cfrun bug in placement of workdir initialization. Would try to open
	/inputs/cfrun.hosts instead of /var/cfengine/inputs/cfrun.hosts

	Moved mutex locks in address purging, to see if it prevents some
	segmentation faults.

	In image.c:	
	/*      if (TRAVLINKS || ip->linktype == 'n') */
	Took out linktype reference. This appears to be erroneous.

	Patch to tidy: "Guolin Cheng" <guolin@alexa.com>

	Patch to -Q to prevent update.conf from being executed.

	Patch to rationalize choice of port number for new getaddrinfo
	interfaces. (ip.c)

	small patch to allow the use of PCRE if it is compiled with
	--with-pcre.  This is using the POSIX compatible API that PCRE provides,
	so the change necessary is to use pcreposix.h instead of regex.h and to
	link in pcreposix.so. cindy.marasco@pnl.gov)
	
2.1.11

	SUPPORT FOR POSIX ACLS IN LINUX IS NOT AS STRAIGHTFORWARD AS
	ORIGINALLY THOUGHT.  THE API DOES NOT MATCH EXISTING
	IMPLEMENTATIONS AND SEEMS SIGNIFICANTLY MORE COMPLEX. IN THE
	INTERESTS OF STABILITY THIS WILL HAVE TO BE DEFERRED TO A LATER
	RELEASE.

	Comma in function argument bug in FileExists etc, fixed
	
	Option -z (--schedule) now prints only the run schedule.  Option
	-Q (--query) added to print values of variables defined in
	configuration
	 
	  cfagent -Q sysadm,domain,site,ipaddress

	in format  varname=value

	New variables can be used in cfagent.conf for cfexecd control:
	
	  EmailFrom = ( )
	  EmailTo   = ( )  - overrides sysadm if set

	
	White Box linux class recognition added


	When setting classes or variables by function call, the function
	evaluation is no longer performed if it is not in an active class.
	
	Cfexecd now calls cfagent with -D from_cfexecd to define the class
	"from_cfexecd::" when run from the executor
	
	WarnIfFileMissing added to editfiles and default is not to warn
	of non-existent files, except in inform/verbose modes.
	
	Check added for DefineInGroup, signals error if not in group
	Added copy type "any" for any matching criteria, date/sum etc.

	Respository variable was not expanded like a normal variable
	
	cfshow tool added for consulting the databases

	Better autodetection of Berkeley DB in some distros of Linux (SuSE) - has anyone heard of "standards"?
	Date format changed in cfexecd output files
	Errors if remote copy is not encrypted when server demands encryption. (patch)
	
	Renaming of directories is now allowed if dest= is set specifically.
	
	Check added for variables defined in terms of undefined variables.
	
	Patch for solaris package manager added (Louis Erickson - wwonko@rdwarf.com)

	file added as synonym til reg in filter
	
	Patch to HostRange (item.c) (rader@ginseng.hep.wisc.edu)
	Internal variable determining WORKDIR for non-privileged users.

	Various minor changes and cosmetics.
	
	Lock string must include server name in copy - added
	Method reply bundles fixed to work correctly with ipv6 addresses

	SIGPIPE and SIGCHLD added to signal handler (SIGCHILD ignored against posix, but
	how the hell do you sort this out?)
	srand -> srand48 typo in cfenvd

	Multiple method reply variables were incorrectly separated.
	Added options to disable LastSeen data recording feature.

	fclose used instead of pclose when calling ifconfig - resulted in zombies
	
2.1.10

	Persistent class protection added to returned remote vrpc calls to prevent
	meaningless multiple replies.
	
	Change added to IPRange to avoid possible bootstrap problem with unconfigured resolver.
	IP address setting was contingent on having DNS. Misplaced } fixed in nameinfo
		
	EmptyResolvConf removed only nameserver entries. Now removes everything.
	
	Due to an error in constructing 2.1.9 some of the advertised
	changes below were not included. They are included in this version.
	
	Workaround error message for parser bug with nested variables.

2.1.9

	WORKDIR/state/allclasses file caches all class date during cfagent execution, just
	like the $(allclasses) variable, but the file can grow much larger without
	overflow.
	
	.cfengine -> .cfagent in non-root public keys (some missing conversions)
	Expand buffer incorrectly zeroed out public name key causing empty keyname in RSA dialogue
	Old style bind reverse lookup added to Hostname2IPAddress
2.1.8 

	Additional checks added to bolster server transaction security.
	
	Fix of bug in copy server variable list expansion (unexpanded variables) introduced in 2.1.7
	Typo in locks fixed
	Mutex deadlock fix in cfservd for systems with up to date POSIX implementations.
	QNX class data added
	Syslog facility patches to cfservd. (Leonardo Helman)
	Fix to avoid recursive imports
	Variables were not expanded in PrepModule
	Symbolic links were not tidied
	Missing initializations in links could dump core
	Logging route switching  bug in disk/required fixed


	Bugs in implementation of remote method protocol. Classes were not
	transferred properly.

	Bug in HostnameKeys for cfrun fixed.
	
2.1.7p1

	Bug in resolv node introduced in 2.1.7. Ordering of
	nameservers was reverse.
	
2.1.7

        Mandrake Linux detect patch

	Unbelievably no documentation about strategies ever found its way
	into the manual!! Fixed.
	Sorting of anomaly histogram data
	Date patch for SMTP in cfexecd

	Bugfix for TTime filters in ParseTTime() - submitted Bob B. Crosbie.
	Trinity Centre for High Performance Computing,
	
        ReplaceFirst function to replace first occurrence of a string in line.

	Umask saving patch in editfiles (Sergio Gelato)
	
	Patch for variable socket length structs (BSD)
	
        Apparent bug in local methods from recent change. Name localhost
	would be converted into an address which would then fail to match hail.

	Iteration over server= variable in copy added
	Iteration over resolver variables added


	Bug in class evaluation was introduced in 2.1.6 by a sorting
	algorithm. Some classes would evaluate to false even though true.

        Default route setting has been broken in linux for a long time.
        A workaround has been added using the shellcommand /sbin/route

	Bug in rmdirs in tidy - old type mismatch corrected. Might cause
	cfengine to delete an empty root-search directory undesirably.

	Some bizarre coding in the resolver section replaced. Could lead
	to incomplete class data.

	Added option SkipIdentify = ( true ) for avoiding DNS lookup in
	client side authentication.

	Bug in method evaluation if peers have inconsistent resolvers and
	cannot agree on whether to use IPv6/v4.

	ReadList() function added to control for reading an iterator
	from a file
	
2.1.6

	Patch for incorrect symbolic link resolution with ".." internals.
	Would chop off a leading slash.
	
	Patches for alerts appearing twice. InitAction added in install.c
	
	--with-docs option added and default is to not build the docs

	Change to df.c to avoid rounding errors in small blocks for linux

	wait status patch for returnszero()
	
	dpkg debian package management support (Morten Werner)

	tidy rmdirs=all did not remove top directory since v2.0.0. Fixed.
	Problem was new method to aviod races can never reach this location,
	so have to use absolute path for top dir.

	DARWIN patches to cfservd.c/ip.c to fix definitions

	Separate ExpandVarstring buffer-size with new expandsize value
        This removes some spurious use of VBUFF scratch space. One bug
        in tidy path expansion found here. Variables were not expanded.
	
2.1.5
	KNOWN BUG in persistent state memory for tcpdump data - long ipv6
	addresses can make a byte count > old for fewer incoming so it remembers
	wrong snapshot

	Double DeleteParser() fixed.

	Code cosmetics:

		Annoying tabs removed from sources
		bzero -> memset explicitly
		bcopy -> memcpy

        Segmentation fault in list handling fixed (seldom occurrence)
	
2.1.4

        "Bug" found in method recognition - only constant parameters allowed.
        Time of day or relative hostames as parameters will not work

	Mutexes around locking now.

	
	Variable expansion of server deferred in copy to allow dynamic server choice

        Removed old dns lookup caching for ipv4 - means no prior check for existing hostnames,
        but allows running with dynamical variables
	
	-q option added to cfexecd. If set it invokes cfagent with -q flag (--no-splay)
	Rewritten function analysis for multiple arguments in assignments
	ReadTable() and ReadArray() functions to read associative arrays from files
	hpux class changed from 9000* to * in class matching. Assume old versions now dead


	tcpdump interface for cfenvd
	Attempt to detect ipv6 address from ifconfig on unix and add classes. Cannot yet bind to interface.
	Make internal list representation of IP addresses.

	Error in -f evaluation introduced in recent version fixed.

	Bind to outgoing interface implemented for new getaddrinfo libs functions.
 	Same of fior cfservd 

	   BindToInterface = ( )

	editfiles additions:
	
        DeleteLinesContainingFileItems @var{filename}
        DeleteLinesMatchingFileItems @var{filename}
        DeleteLinesStartingFileItems @var{filename}
        DeleteLinesNotContainingFileItems @var{filename}
        DeleteLinesNotMatchingFileItems @var{filename}
        DeleteLinesNotStartingFileItems @var{filename}
	AppendIfNoSuchLinesFromFile @var{filename}

	Special function added to alerts:

   	   FriendStatus(hours)

	shows hosts that have not reported in for hours.
	
2.1.3


	Voluntary RPC remote methods implemented.
	
	Bug in ignore when doing file recursion fixed.
	Wildcard match did not include plain files when expanding wildcards

	Internal array representation added to expression evaluation
	
          $(array[key])  $(array[$(key)])

        Arrays may be defined using the association function:

	assoc_array = ( A(B,"is for bird") A(C,"is for cat") )
	
2.1.2

	Various minor patches

	singlecopy locking patch (Eric Sorenson)
	Patches Iain Morgen (NASA)

	cfexecd add From line to mail

	RegCmp(regex,$listvar) function added to match classes

	Documentation of iteration added to reference manual - was missing.
	
	Domain variable was overwritten in 2.1.0 when methods were initialized. Corrected.
	Cfexecd #ifdefs not compatible with cygwin - rewritten workaround
	Entropy measure anomaly classes

	Comparator uninitialized in process matches, creating bogus outout with -d3
	Chop function removes all trailing spaces.
	interfaces now records ip addreses

	Variables can override context using a dot notation:

	  ${context.variable}  ${global.env_time}

	Interface addresses on multiple interfaces:

   	  ${global.ipv4[hme0]} 
  	  ${global.ipv4[eth1]}

	cfservd list handling bugs after user patch, plus enchanced iteration:
        e.g. now make multiple rules in a sinlgle stanza
	
		control:

		  Split = ( " " )
		  hostlist = ( "10.10.10.1 10.10.10.2 10.10.10.3" )  
		  dirs =  ( "bin etc lib" )
		  base = ( /usr )

		#########################################################

		admit:

		   $(base)/$(dirs)   $(hostlist)

	results in:
	
		Path: /usr/bin (encrypt=0)
		   Admit: 10.10.10.1 10.10.10.2 10.10.10.3 root=
		Path: /usr/etc (encrypt=0)
		   Admit: 10.10.10.1 10.10.10.2 10.10.10.3 root=
		Path: /usr/lib (encrypt=0)
		   Admit: 10.10.10.1 10.10.10.2 10.10.10.3 root=

	
	Allow modules during parsing to initialize classes etc.
	
	control:
	
            gotinit = ( PrepModule(startup1,"arg1 arg2...") )
	
       classes:	
	
             gotinit = ( PrepModule(startup2,"arg1 arg2"}) )

	
2.1.1
	Permissions on explicitly mentioned links to files could result in file permission
	being changed instead.

	Error in permission evaluation for copied files fixed.
	
	Mac OSX finder patches added

	ID classes rationalized into nameinfo.c

	scanarrivals option to disks/required - for research.

	Improved anomaly analysis.
	
	setting repository in cfservd.conf caused crash - fixed.

	& is now a synonym for "." - the AND operator in class evaluation

	! negation of functions in class assignments is now handled

	New option noabspath=true for copy allows one to override the need for
	a full path in certain situations, e.g. "export A=x; /dothis""

	Redhat 9 class names patch JY.

	Case insensitive domain matching
	
2.1.0

	************************************************************************************
	* * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * *

	Main addition to 2.1.0 is * methods *. Methods replace modules for most applications
                                   =========
	* * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * *	
	************************************************************************************

	Error in cfenvd update policy for huge anomalies. Could never learn large values.
	
	New parser did not pick up restart sequence in processes if not enclosed by quotes.
	
	Bug in AppendIfNoLineMatching - infinite loop is SetLine not set, fixed,
	ExecProgram was incorrectly listed as Exec in filters. fixed

	Minor alterations to cfenvd policy. Calculational details, and
	persistent information now lasts up to 30 minutes.
	
        Patch for red hat enterprise server classes

	New variable 

	  HostnameKeys = ( true )

	if this is set, public keys are stored as user-hostname rather than
	user-ipaddress. This can be useful for dhcp hosts. However, there is
	a potential loss of security during key-exchange
	due to implicit reliance on DNS or asserted
	identity.
	
	------------------------------------------------------------------------------
	DeleteItemNotMatching added to editfiles
	DeleteItemNotStarting added to editfiles
	DeleteItemNotContaining added to editfiles
	

	SyslogFacility = ( ) new variable to alter syslog facility level.
	Possible values:

	LOG_USER, LOG_DAEMON, LOG_LOCAL0-4
	
	--------------------------------------------------------------------------------

	Persistent state memory can be added through a system alert functions:

	 SetState(name,ttl,policy)

	Set a class that acts like a non-resettable timer. It is defined for exactly 10
	minutes
	
          SetState("preserved_class",10,Preserve)

	Set a class that acts as a resettable timer. It is defined for 10 minutes unless
	the SetState call is called again to extend its lifetime.
	
          SetState(non_preserved_class,6,Reset)

	Delete a persistent class.

	Delete an existing class:
	
          UnsetState(myclass)

	--------------------------------------------------------------------------------
	
	rename: is now a synonym for disable: and a new option dest= is added to
	these so that you can formally rename a file with any destination, not just suffix ".cfdisabled"
	(though this remains the default).

	
	Classes now allowed in group / classes definitions for consistency and ANDing of classes

        Added to Alerts to send messages directly and silently to syslog

	   SysLog(LOG_ERR,"Test syslog message")

	--------------------------------------------------------------------------------
	
	b2

	cfservd no longer does reverse DNS lookup on keys that do not have to
	be trusted, i.e. existing keys whose identity has been confirmed.
	
	Strategy evaluation was performed too late, so that it could not be
	used to define variables. Fixed. Now strategies are evaluated as
	soon as they are defined,, just define them at the start of the program..

	Various minor patches.
	
	2.1.0b1
	
	Patch to packages for non linux rpm
	
	localhost method calls implemented
		- todo: multiple methods calls
	
	---------------------------------------------------------------------------------
	KNOWN BUGS : Functions cannot contain both subfunctions and spaces in strings
	This will not be fixed until the language becomes fixed
	---------------------------------------------------------------------------------	

	Error in init.c erroneously referred to old directory .cfengine instead of .cfagent for
	non-root users.
	
	Builtin function ReadFile(filename,maxbytes) allows us to read
	a maximum number of bytes from a file into a variable e.g. 

	control:
	  mylist = ( ReadFile("/etc/passwd",20) )

	  Split = ( "_" )  # NOTE careful with split character
	
	  myvar  = ( ReadFile(/etc/passwd,220) )

	
	2.0.8 - released this far as a 2.0.x patch
	
	Check for illegal characters in classes.
	Able to bind to a specific IP addressed interface in cfservd.
        	BindToInterface = ( 10.10.43.6 )

	Security fix to transaction lengths in remote copying.	
	Suspicious names now applies only to regular files 	

	2.1.a8
	
	Imports allowed in update.conf
	Extra locking applied to methods
	Parser error in cfservd fixed. Would ignore single character objects (ordering
	error in lexer).

	2.10a7

       	Methods parsing added

	Granular locking added to all parts of cfengine
	ifelapsed
	expireafter added to each action as options e.g. ifelapsed=20

	2.1.0a6
	
	Admit /deny did not do variable expansion on pathnames - fixed
	
	Reduced stating level during file transfer in cfservd - helps to prevent
	thrashing when transferring files with server fragmentation.
	
	class "windows" is added as a synonym for "nt"
	xdev=true option to image, tidy, files
        Timeout added to receive in file copying
	mounts are only performed in pass 1
	edit warnings are only carried out during pass 1

	Bug fix for Mode class in file filters - was not matching modes properly
	Can't copy files less than 17 bytes now supposedly fixed

	Add mutex around syslog() to see if it helps weird file errors.
	
2.0.7p3
        Parser bugfix for group defintions from script (in old compat obsolete syntax)

2.0.7

	Resolv.conf search directive removed from code. This was wrong, in spite
	of pressure to put it in.
	
	EditBackup -> Backup corrected in manual
	Check for class definitions that are not installable
	
	SMTP client handling patch in cfexecd - must wait for reply
	
        AppendIfNoLineMatching replaced with regex, not Setline value
        
	ChecksumPurge = ( on ) causes cfagent to purge its checksum database of
	files that no longer exist.
        
	Forgotten built in function RandomInt(a,b) - returns a random number in variable
	assignments. Actually introduced in 2.0.6. Forgot this

	control:
	
 	   rand = ( RandomInt(4,7) )

	Major rewrite of parser

	- code simplifications
	- Allowed escaping of quotes in strings and newlines e.g.

	var1 = ( "a b c\"substring\" d e" )
	var2 = ( "a b 
	c" )

	Tidy code tidied and bug fixed for new scheduler

	Moduledirectory defaults to /var/cfengine/modules
	
2.0.6
	SKIPVERIFY removed from AccessControl checks. This was wrongly allowing
	access to files if they only had an accepted encryption key.


	SetLine added to AppendIfNoLineMatching to allow current line to be added.
	
	 ForEachLineIn "/tmp/in"
            AppendIfNoLineMatching "ThisLine"
         EndLoop

	Changed /etc/services reference to port 5308 in ipv6 compatible calls.

	Efficiency, removed getpwnam from GetFile(). Was unnecessarily looking
	up the uid multiple times, which delays copying speed. Copy rates improved
	by five to ten times!!

        Single copy uses too much cache memory. Optimize by only caching
	copies that use the singlecopy keyword.

	Message status change: %s is a link which points to %s, but that file doesn't seem to exist
	Verbose only

        Patches to editfiles to check empty files. DefineinGroup added.
	
2.0.5

	Cfrun ipv6 patch
	
        Syslog messages name patch

	mountables, binservers variable usage fix
	
	backup=timestamp added in copy so that multiple backups can coexist.
	Other backups use this by default.
	
	Cfenvd records loadaverage - and av.db renamed to cf_averages.db since
	records in av.db no longer compatible.
	
	Iteration added to disk paths

	Typo in filters.c UID -> USER meant that Owner field in filters would not always
	work for processes.
	Bug in removal of spaces in process-filter matches could cause some criteria
	to fail to match.

	
        Netstat changed entry in solaris 2.9
	Hard class hpux10 -> hpux and the old hpux is deprecated

        tidy //tmp would start tidying / due to error in ExpandWildcardsAndDo. FIxed

	Cfenvd netstat state recorded in separate files now in WORKDIR, by
	protocol and incoming/outgoing. This allows accurate record of the
	state to which classes refer.

	excludes and ignores would not appended in a tidy command if 
	a path already existed in another previous command. Fixed so that all excludes
	and ignores are concatenated for all related paths.

	Local AF_LOCAL addresses not handled by sockaddr in IPv6 compatible functions.
	Now returns 127.0.0.1 (why not ::1??)

        Typo in tidy.c prevented tidy old links from working.
	Documentation patches.

	Checksums no longer performed on dry run (-n) in files, but still in
	copy.

	No errors written to syslog in dryrun mode.
	Umask patch in editfiles - umask was not properly installed

	New copy options / variables singlecopy= and autodefine added.

	Alerts added as own section alerts: allow users to define a custom message
	triggered by a class activation. Alerts can also quote state information
	from cfenvd and the process table.

	tidy define= does not set class if file could not be tidied.

	debian detect patch (Andy Stribblehill)
	cfservd descriptor leak (Andy Stribblehill)
	cfservd daemonize modification
2.0.4

	cfexecd now reports identical messages only once per day. (Bas)

	***************************************************************************
	File copying failover=classes sets classes if open server connection fails,
	or file is unavailable --
	this allows failover rules to be activated instead.
	***************************************************************************	
	***************************************************************************
	Evaluated classes added:
	IsDefined(varname)
	StrCmp(s1,s2)
	***************************************************************************	

	If a public key authentication succeeds, cfservd now adds a host to the
	skipverify list, so that we don't waste time checking ID by two separate
	methods. It has to succeed once though... and the is emptied if the config
	file changes, and we start over again.
	
	elsedef didn't work in processes
	
	New test in processes for executability of restart sequence would fail
	if the sequence had arguments. Fixed.

	---------------------------------------------------------------------------
	"AUTHENTICATION" BUGS:

	This seems to have been due to threading collisions.

	Malloc is not thread-safe. Added mutex to NewConn in cfservd. This
	could cause new connections to be mixed up in memory, under heavy
	load and result in authentication failure on multiprocessor
	systems.  Also changed pthread_mutex locking around gethostbyname
	- could cause reverse lookup to fail and create the illusion of a
	bad public key authentication.

	Implicit mallocs are also in some of the public/private key functions.
	Moved some of the mutexs to encompass these, and it seems to have
	fixed the authentication errors.

	Change in mutex locking policy of CheckFileChanges. Don't need a mutex
	there, just check that ACTIVE_THREADS is 0 and we're single threaded.

	---------------------------------------------------------------------------
	
	Tidying directories with atime is meaningless, since the necessary
	stat'ing automatically invalidates the result except for age=0.
	Thus all directory time comparisons are now changed to mtime, regardless
	of the type.
	
	Default preview value for shellcommands was true - shuld be false.
	cfrun - with -T did not accept keys on trust (typo) fixed
	Classes defined within update.conf are now also private, like a
	separate module. These go away before cfagent.conf
	
	Typo in item-ext.c in regfree of GlobalRreplace led to segmentation
	fault for some edits.
	AllowRedefinitionOf = ( variable name list ) allows redefintion of the
	named variables during parsing.
	
	Editfiles scheduling error for classes not immediately defined, fixed.
	
	Inform=false didn't affect purge=true
	Setting chmod 000 on a directory could prevent 2.0.3 from fixing it.
	Fix for hyphen fix - can have numbers and hyphens in hostnames...
        Fix for freebsd fix...ugh
	IP address range minor fix >= -> > in lower range

        $ cfagent --avoid resolve,copy
	$ cfagent --just tidy --just shellcommands

	The latter does tidy and shellcommands, but nothing else in the
	action sequence.
	
	
2.0.3
	import in cfservd.conf was blocked.  update.conf run when doing -a
	or -z DESTINATION used in link.c (legacy) without allocation -
	caused segfault.  IMPORT in cfservd was excluded -b for
	--update-only was used up, changed to -B (too many options!)

	hyphen in cfservd.conf admit/deny hostname was misinterpreted as IP range in 2.0.2
	Fixed

	Interface detection on FreeBSD messed up. Fixed.
	Unknown edit command error in include/exclude.

	SECURITY : Recursive descent functions vulernable to race
	conditions. Directories could be replaced by symbolic links and
	this would affect any operation that relies on directory parsing;
	files, tidy, editfiles (copy is non-destructive). Recursive
	descent functions are reworked to check inode numbers and device
	numbers in order to detect attacks. This leads to a small inefficiency
	in recursive descent. The solution is to chdir to the actual directory
	concerned, check that it is the same one we stat'ed and scan only those
	relative names afterwards, so we freeze each directory one at a
	time.  The problem only applies to systems who have non-trusted
	users.

	Editfiles error messages added for class definitions within conditionals.
	Some segmentation faults corrected.

	Check added to prevent cfagent from following links it does not own.
	
	Work around to delete cfparse.c from the distribution cause autoconf won't do it.
	This was causing incorrect alloca() usage for HPUX and AIX.

	
2.0.2
	New option -b --update-only (changed in 2.0.3 to -B)
        Runs only the update.conf script
	
        Host ranges in IP addresses 128.39.89.10-34 or CIDR notation 129.39.89.1/24
	to specify groups / classes or host lists in cfservd.conf.
        groups:

	   myseries = ( IpRange(128.39.74-75.10-20) )
	   myseries = ( IpRange(128.39.74.10/24) )
	
	128.39.74.10/23 == 128.39.75.56	
	128.39.74-75.10-20 == 128.39.75.12
	2001:700:700:3:290:27ff:fea2:4730-4790 == 2001:700:700:3:290:27ff:fea2:477b
	2001:700:700:3:290:27ff:fea2:4730/64 == 2001:700:700:3:290:27ff:fea2:477b

	New list in cfservd.conf, DynamicAddresses = ( ipranges )
	this assumes that hosts get IP addresses from DHCP or someting
	and can change over time. This changes the security model somewhat.
	(see reference manual)

	Bug in cfservd for files which were unreadably by the daemon.
	Could lead to incorrect file being transmitted instead of rejection.
	
        Changes to mount list. Can now include mount options in the
	cfengine mount model (see reference manual) 
	Bug in classification of variable assignment and authorization
	assignments fixed.
        Structures for convergence analysis added. Option -g (future work)
	NAT handling in cfservd.c patch
	Signal names were wrong in some cases due to differing conventions - OS dependent.
	Incorrect code in file time filter comparisons fixed.

	License ammendment in COPYING makes it clear that users are encouraged to
	use the OpenSSL library. I see no problems with this.

	Purge exclusions segfault bug fix.
	Purge should not purge patterns in include= (fixed)
	Purge symbolic link error fixed. (Bas)

	/* Bas
	The following patch helps with the, for me at least, irritating
	problem where I have a cf.<conf> file which has sections depending
	upon classes which do file checks or copy based upon a user/group
	which doesn't exist on certain machines :-

        flagisoff::
           file owner=user group=group

	cfengine complains about this even though flagisoff is off :-)

	It also means that a user can be created earlier in a configuration
	and used later on without the warnings.
	Anyway patch does :-
	- don't complain about missing uid/gid while parsing
	- set uid/gid to -2 if missing and copy the name to the uid/gid
	  structure
	- when actually doing things, recheck to see if the user exists use it
	  if its now found, otherwise complain
	*/

	SMTP \r added to cfexecd, caused problems for stricter mailers.
	(I wasn't reading RFC2822!!)

	Connection from version 1 client could cause version 2 server to segfault.
	Fixed uninitialized field.

	If we specify purge, then the following options will also be set
	and cannot be altered: forcedirs=true typecheck=false - for safety sake.

        Some windows patches.
	
2.0.1
        Some error messages demoted to verbose only
        Some documentation corrections
        cfenvd given a -H option for histogram measurement. (research)
        More problems with configure finding libraries fixed
        Extra time classes Q1,Q2,Q3,Q4 are set in each quarter of the hour.
	Also abbreviations of HrXX.Q1 ca write Hr12_Q1, for instance.
        VSYSTEMHARDCLASS was not defined in cfservd
	tidy .cfengine files could have permission 777. Missing permission added.
	openbsd bind() fix in cfservd - openbsd does not map ipv4 addresses in ipv6!!!
        error in assigning hardclass for openbsd (typo) and this affected several other operating systems. Fixed
	
2.0.0
	Hpux config changes
	Red Hat compilation issues with Berekely DB
	cfservd.conf did not re-read input file properly if -f was used.
	mode checks patch (Martin Jost)
	GNU autoconf classes renamed to compiled_on_solaris2.7

Cfengine 2.0 ----------------------------------------------------------------

b4
        configure changes to compile on systems without pthread.
        Increase thread stacksize to avoid seg fault on some systems, which
        set a small basic pthread stack.
	parser checks update.conf on -p
	bug in reading imported files if CFINPUTS set to non-abolsute path
	
b3
	Some typos and solaris memory error fixed, in cfpopen().
	Add optional argument to disable to warn only about existing files.
	Modules no longer time-locked
	
b2
	IPv6 implementation 
	Bug fix in access lists of cfservd
	
a23     
	Added support for variable and class built-in functions.

a21
	Martin Andrews' NT/Windows patches incorporated.

a20
	Code tidying

a19
	cfrun fixed for RSA usage, and 
	AllowUsers = ( )  added to cfservd.conf
	Bas' NAT fixes to cfrun included
	BeginGroupIfDefined in editfiles incorporated

a18
	Symmetric key encryption rewritten, using Blowfish and RSA key exchange
        Several efficiency modifications have been added, and this change allows
	for future multiple enryption schemes.
	
	install.c rationalized, to standardize true/false switches

	Standardedized true/false api in switches with HandleCharSwitch.
	Internal representation is now 'y'/'n' not t/f and y/n.

	verify= added to file transfers allowing cfengine to compute an
	MD5 verification of the transmitted data before installling.

	secure= -> (encrypt=,type=) split up, so encryption can be used
	independentently of the update method.
	
a17
	RSA authentication added
	cfkey changed to generate public/private keys

a16:
	Cfagent will now attempt to rename non-directories which
	are "in the way" during copying, if forcedirs=true
	The function MakeDirectoriesFor thus has a new argument
	for whether this should be forced or not. THe policy regarding
	other uses of the function has changed:

	 - For creation of essential cfengine directories, it is compulsory
	 - For other optional actions dirs a re not forced

         exclude= and ignore= now allowed in tidy
	 include= is a synonym for pattern=

	Replace old checksum functions with OpenSSL interfaces. Larger
	checksum database, due to longer hashes. Can now have checksum=sha1
	in files.

        Checksum databases will be rewritten in a new format, as the datasize has changed.
        Might result in checksum changed warnings when installing new version.
	
	Editfiles scheduling bug, with new scheduler, fixed. Classes
	specified in the action sequence would not be executed.

	Exclamation = ( off ) - to switch of exclamations in alerts

	% included in filename spec
	
a14/15:
	Compilation issues. Restructuring and fiddling with cfenvd.
	
a13:

	control option EmptyResolvConf = ( true ) removes old nameserver entries.

	Bug fix in file copying. A missing test could cause problems when cfservd
	was remote copied by itself, if error strings were aligned on page boundaries.

	Typo in popen.c fixed. Shouldn't have any effect on code.

	Hosts with multiple interfaces now register all subnets as classes.

	Now adds ipv4 address groups in the form ipv4_128_39_89
	                                         ip43_128_39
	                                         ipv4_128

	Owner filter added to process filters (oversight)
a12:

	Editfiles filters implemented
	
	cfengine.conf -> cfagent.conf
	WORKDIR = LOGDIR = LOCKDIR = /var/cfengine (like /var/mail)

	/var/cfengine/bin     - default local binary
	             /inputs  - default inputs dir
	             /outputs - record of old runs
	
	 cfexecd a replacement scheduler. Used as cfexecd -F (no fork)
	it can be placed in cron to replace "cfwrap cfengine". It needs
	you to define smtphost = ( smtpmailer ) in cfagent.conf.
	This program stores the output of cfagent in the outputs directory
	and then mails a copy if smtphost or sysadm are defined.
	It truncates long mail.

	Cfengine could be used to pick up the output files for collation by a central
	monitor, if desired.

	Cfengine now looks for a config file called /var/cfengine/inputs/cf.update which
	is run before the main configuration. This is intended to be used
	to get an updated configuration, so that it can be parsed
	immediately afterwards. If there is an error in cfagent.conf, 
	cf.update will still be able to run. 

	Don't forget to move the keys file to /var/cfengine
	
	a11:
	  resolver uses search directive, deprecating "domain" once and for all.
	  This might hit really old systems...?
          Using shellcommands to set classes noe suppresses output from command.
	
        a8: 

        snprintf for added security or just for certainty, where appropriate.
	
	If CFINPUTS is not defined, cfengine will look in CONFIGDIR
	for input. Files are always checked for their security by checking
	the owner and permissions.

            --with-lockdir=LOCKDIR  deprecated
	    --with-CFINPUTS=CONFIGDIR  - default CFINPUTS internal (/etc/cfengine/inputs)

	Extensive changes to locking policy.

	LockDirectory = ()
	LogDirectory = ()  --- are no longer configurable from cfengine.conf
	                       due to required compatibilty with cfenvd.c

	cfenvd added. Records long term data and transfers class information
	to cfengine aboutthe average state of the system.  Classes pin-<number>
	also defined for every open service-port on the host.
	
        a6: undefined_domain is now removed from the class list when
	a proper doman is defined. This allows us to test for this
	as a class for debugging.
	
	recurse option in home tidy now allowed.

	Option LogTidyHomeFiles to switch off generation of
	log files in user homedirs.
	
	Bug in DeleteToLineMatching, mismatch with documentation
	functionality. Fixed.

	Process options changes from ax to auxw for BSD-like ps.
	
	cfenvd introduced

	Some FreeBSD patches.
	
	Locking changed to use Berkeley DB if available

	Default workdir changed to /var/cfengine from /var/run
	since /var/run gets emplied on reboot in linux.
	
Cfengine 2.0 -alphas---------------------------------------------------
	
	* Expansion of $(dollar) broken in 1.6.0 - fixed
	
	* Locking problem in cfd fixed. Problem causing access
	denied while re-reading config files. MAXTRIES increased
	for high volume services, was causing premature apoptosis.

	dest= could not refer to a filename with spaces, fixed.
	
	* Made recipient variables in client.c long instead of
	size_t in rstat, for 64 bits. With %ld in scanf.
	
	* Cfengine 1.6.0-1.6.3 introduces filters into processes
	and files. 

	* 1.6.3 change from Berkeley DB2 to DB3 - not backward compatible!!!
	  Update Berkeley db with
	     cd build_unix
	     ../dist/configure
	     make; make install
	     ln -s /usr/local/BerkeleyDB.3.2 /usr/local/BerkeleyDB

2000-06-13  David Masterson  <David.Masterson@kla-tencor.com>

	* 1.6.0.a2: re-released to Mark after stupid mistakes.

	* src/Makefile.am (noinst_HEADERS): add cfparse.h

	* Makefile.am (EXTRA_DIST): add acconfig.h

2000-06-12  David Masterson <David.Masterson@kla-tencor.com>

	* 1.6.0.a2: released to Mark
	
	* General: Attempted to convert to reincorporate all my Automake
	stuff into the release.
	
2000-06-12  Mark Burgess <Mark.Burgess@hio.no>

	* 1.6.0-alpha1: released
	
	* General: Rewrite of DCE code by Transarc/IBM.  Add elsedefine=
	tag as complement to define=.  CompressCommand action=compress in
	files, tidy, compress=true for compressing files on the fly.  Bug
	in copy with size= fixed.  Was ignored if file didn't exist.
	Modules: in addition to setting classes, can return lines
	=ENVVAR=value which sets cfengine environment variables.  This
	allows modules to set variables which can be inherited directly by
	scripts.

2000-05-11  David Masterson  <David.Masterson@kla-tencor.com>

	* contrib/Makefile.am (pkgdata_SCRIPTS): change cfemacs.el to
	cfengine.el in keeping with internal documentation.  Also renamed
	the file as well.

2000-05-08  David Masterson  <David.Masterson@kla-tencor.com>

	* Release: V1.6 released to Mark for verification.

	* Everything:  Many things have been changed and reorganized for
	the shift to automake generated Makefiles.  See the end of the
	NEWS file for more information.

2000-04-24  David Masterson  <David.Masterson@kla-tencor.com>

	* ChangeLog: Created and initialized with old VERSION.DIFF


***************** Minor Version 5 ******************** 

KNOWN BUGS: linux, when making directories, ownership can perms can be wrong.


1.5.4
  Added security message in checksum=md5 for cfengine if new files appear
  Bug in class evaluation with multiple embedded groups fixed
  Bug in file transfer could hang a server in special circumstances.
  Bug in secure recursive copy (access denied incorrectly).

  Type change, size is off_t in cfstat struct

  Multiple define bug in copy: could cause endless loop
  Thread counting error fixed in cfd
  Required/disk suspicious warnings now cause classes to be defined
  Resolver could delete substring lines

  Extra measures against Denial of Service attacks on cfd, only one
  instance of a host-IP may be connected at one time.

  1) Multiple connections from the same host are refused by default
     (before any recv())
  2) A DenyConnectionsFrom list will prevent named IP adresses from connecting
     (before any recv) or a general AllowConnectionsFrom mask...
  3) If the thread table is full for more than five requests, cfd commits
     suicide (apoptosis) to avoid resource usage by spamming.

  The control variable "DenyConnectionsFrom = ( ip1 ip2 ... )" allows a list
  of numerical IP masks to be specified, which cfd will deny connections from.
  This can be used to prevent hanging connection attacks from malicous hosts
  and other Denial of Service attacks.

   e.g. cfd.conf   

     control:

      AllowConnectionsFrom ( 128.39.89 )
      DenyConnectionsFrom = ( 128.39.89.4 )

  This is in addition to tcp wrapper stuff, but the TCP wrapper code cannot
  protect against denial of service attacks.
  typecheck=false in copy switches off error messages on type mismatch.

1.5.3
  Configuration fixes for strange platforms. 
  Segmentation fault with long hostnames in cfd.
  A number of security minded improvements to coding.

1.5.2 (Minor patches)
  DeleteNonOwnerMail excluded check of NonUserMail
  Almost complete port to SCO, missing data on mount model
  Some compilation problems addressed. Move to OpenSSL
  latest version.
  Domain name issue fix in remote copying between domains.
  Exec strings in variable assignments are now chopped.

1.5.1 (bugfixes only)
  Segmentation fault with blank lines fixed in editfiles.
  Segmentation fault with remote copy access denied fixed.

  IP address and subnet (first three bytes of IP) are now
  added as classes e.g. 128_39_89 and 128_39_89_10

  Checksum update bug fix

  ->! works on directories, with some care checks

  mutex variables in cfd made static. Serialized gethostbyname()
  to avoid races in multithreaded lookup.

 BUG: cfd seems unable to copy itself on memory mapped solaris

1.5.0
  Security enhancements and bug fixes.

  !! GNU Regular expression library replaced by POSIX calls.        !!
  !! The old code is still present for legacy systems but           !!
  !! this will not be supported in the future. Legacy systems       !!
  !! should install the GNU Posix library rx-1.5 for compatibility. !!
  !!       *** check complex regex's before using this! ***         !! 

   RFC931 user authentication for cfd, on systems 
          supporting/running identd.

   Editfiles: Checks that the file differs
              from the disk version after multiple edits
              before saving (fixes circular do-undo problems)

   All pthread libraries are now trusted to work by default
   (make of this what you will).

   BSD chflags attributes now handled (by Andreas KluBmann)

   home/ in directories

   LogDirectory
   LockDirectory - variables in control: can override defaults.

   define= added to shellcommands. Defined if shellcommand
   returns zero.

   Cfengine will not edit a link to a file unless the
   owner of the link is the owner of the file.

   Careful attempts to avoid exploitation of race conditions
   during file writing.

   New copy option, secure=true allows 3DES encryption with
   secret keys in file LOCKDIR/keys. Filenames and contents
   are encrypted only.

   New threading policy makes compatibility with earlier versions
   of cfd impossible. Should be more effective now. Discontinued
   -m flag.

   cfd options: root=host1,host2 determines whether a connecting host
                can read files on the remote system which are not
                owned by the initiator of the connection.

                secure=true means that cfd will only serve the file
                on a secure line.

   New cfkey program which generates a key file, e.g.
    cfkey > /var/run/cfengine/keys; chmod 600 /var/run/cfengine/keys

   New copy type "mtime"

   Control variable: DefaultCopyType = ( mtime ) can be used to set on all
                     copies following this.

   Problem with pthreads and GNU/Linux fixed

 ***************** Minor Version 4 ******************** 

1.4.17
   Multihomed host fixes for hosts with multiple names on
   interfaces.
1.4.16
   Options owner= group= in shellcommands, allow running
   programs with effective user id, i.e. su -c user command

   ShowActions = ( on ) makes cfengine print out the exact action
   in output, using the adaptive lock string. For specialized
   processing only.

   Symbolic link attack security hole closed.

1.4.15
   Bug in size= in tidy files which could cause parsed value to
   be incorrect if the size value had many digits.
   Setuid logs were not saved after copy:
   stealth on remote copies was broken.
   Username authentication added (weak and discretionary).
   Bug with new Berkeley database v2 fixed. Seems to work now.
   New class name digital added causing incorrect class id's!

   Option checksum=md5 added to files to give Tripwire functionality.
   (Requires libdb v2 from sleepycat)

1.4.14a
   Editfiles Replace/With error incorrectly fixed in 1.4.13.
   Caused segmentation fault if last line of file.

1.4.14 (Post LISA changes)
   SuspiciousNames = ( .mo lrk3 ) in control adds a list of filenames which
   cfengine will warn about if it detects them in the course of scanning
   directories.

   SecureInput = ( false/true ) option which switches on checking of the
   permissions on the input files. If this is set cfengine will not
   read files which are not owned by the uid running the program, or
   which are writable by groups or others.

   Copy default to source=destination name if dest not specified (assumes
   that server is not localhost)

1.4.13
   N.B. When upgrading to this version. ALL systems should be upgraded.

   Debian ID changed to use /etc/debian_version.
   Special GNU/linux distributions detected incorrectly.

   cfd patches: removed forking from 1.4.12 and fixed error protocol bug which
                allowed files to be overwritten with an error message (ouch!)
                Multi-homed host fix which works with solaris nsswitch/nis

   When copying symbolic links, both image and link, the file pointed to
   by the link could end up with the permissions of the link. Fixed.

   File recursion was broken in some earlier version.
   Process match/define fix. Classes got defined even when processes missing.

   In file,copy,link new option ignore= allows locally defined ignores. Often
   a better alternative to the global ignore list which affects all three and
   tidy as well. (This is like include/exclude but also works on directories/recursion)

   AutoCreate/dry-run created file. Fixed.

   Variable expansion in import.
   Imported files which are not found now give only warning in verbose
   mode. They do not stop execution. This allows inclusion of
   possibly existing files like cf.local

   Obscure bug in class evaluation fixed.

   OpenBSD classes added.

   Purging without authentication disabled, otherwise possible to
   wipe out a whole directory.

   Link defaults changed during copying so that links will be created
   to nonexistent files.

   Didn't find some processes if username contained a number on sys V.

   Bug in macro hashing could cause segmentation fault.

   When recursively copying dirctories with non-alphanumeric filenames
   it was possible to enter into enter into silly loops which looked
   for non-existent files. Fixed.

   Variables allowed in defaultroute.

   control: variable = ( `exec shellcommand` ) now sets variable to output
   of command.

   New options for unmount deletefstab=true/false deletedir=true/false

   New option stealth=true/false determines whether the access/ctime of
   source files are modified during copy.

   Security feature tests ownership and permissions of input files.
   Files writable by others than the owner are skipped. If cfengine.conf
   is not secure program terminates.

   New List in control FileExtensions = ( c gif txt ) etc
   If directories have these names they will be reported as
   security warnings.

   NonAlphaNumFiles = ( on ) switches on disabling (marking) of
   files with control character filenames and other non-alphanumeric
   names, with some exceptions. These are suffixed with .cf-nonalpha
   which can then be removed if desired by tidy.

1.4.12
   Ownership of links was not checked, fixed for those systems which have
   lchown() (solaris and osf/digital)

   Automatic domain name detection in cases where sites use fully qualified
   domain names locally (eg in /etc/hosts) Helps to solve the problem of
   what to do if you havge multiple domains in a cfengine.conf file
   and want to define classes based on the domain name which hasn'r been
   set yet.

   processes: include and exclude lists can be added to match or exclude specific
   literals in addition to the regular expressions (which don't seem to
   work very reliably) when searching through the process table.

   Tidy with single / as root ignored command. Fixed

   miscmounts rw/ro only option made more like other options with mode=rw,mode=ro etc.
   Default value is rw. Backward compatibility maintained.

   Variable expansion now performed in owner= and group=

   Error capture while checking link permissions fixed. Old perror() method missed.

   Multithreaded cfd. stat error message fixed.
   -m option to cfd to switch on multithreaded operation.
   Systems which do not have working pthreads fork() processes
   during copy commands only. Note that solaris 2.[56] is the only working
   pthread implementation that is implemented, since I only have linux
   and solaris to test on. To get pthreads working on other platforms
   you have to add a NOTBROKEN to configure.in and rerun autoconf/autoheader.

   cfd now is able to run cfengine at timely intervals in collaboration with,
   or instead of cron. This allows cron to be restarted by cfengine/cfd on linux boxes, where
   it crashes all the time, and it allows cfd to be restarted by cfengine/cron
   if it crashes (occasionally). See AutoExecInterval/AutoExecCommand

   Purging files didn't remove deep directories on client, fixed.

   Domain name case control tweaks.

   File recursion bug fix.
   Bug in execute bit permissions on directories.

   Support for multiple network interfaces

   Copy could lead to empty file.

   New db v2* api used.

   dirlinks=tidy didn't work, fixed.
   Bug in home expansion of user patterns

   Multiple timezone aliases

1.4.11
   Copy repatched. Erroneous patch in filedir.c copy modes not settable
   Lexer tweaking
   Travlinks patch in tidyfiles. Did not detect links properly.
   Home tidy optimization.
   Bug in IsMountedFileSystem fixed
   Bug in relative linking from / , missing / fixed.
   Link update in copy files repaired.
   Editfiles:  Backup, Syslog, Inform
   New class additions are automatically canonified to protect from plugins.

   Can now set syslog=on/off, inform=on/off per action so that output can be
   routed as desired, overriding global settings. (For Greg Maples)

   processes, useshell=dumb ignores I/O and allows programs like cron to
   be restarted without hanging cfengine with a zombie. This doesn't
   work via cfrun, unfortunately...

   Bug in parser, defaults not reset if previous action was not installed.
   Global replace bug fixed.
   internal variable $(ipaddress) contains numerical form of IP for current host.
   addinstallable for declaring dynamical classes before they are used.
   Memory leak in cfd fixed.

1.4.10
   Multi-homed host fix for cfd.
   Mail check extras: test for dubious files 
    Warn/DeleteNonOwnerMail
    Warn/DeleteNonUserMail
   Edit: CatchAbort markers introduced to add a kind of exception handling
         so searches do not have to abort an edit compeltely.
   Some typos fixed in the logging code. Segmentation faults caught 
   and erronenous messages fixed.
   Extra new lines from logging code fixed, e.g. with cfengine -a
   Bug fix to edit command DeleteLinesAfter...
   TimeOut parameter added to adjust network timeouts on slow networks.
   Access control in cfrun  (access = mark,uid,uid2 in cfrun.hosts)
   matches=0 allowed in processes
   Unixware support added
   8-bit clean for flex users
   percentages added for filessystem checking (diskusage=)
   extra options for rmdirs so top directory needn't be removed in tidy


1.4.9
   ReleaseCurrentLock exited if remove failed. This was wrong,
   should only have returned and caused a truncation of the 
   action sequence.

   ERESTARTSYS deadlock patch for POSIX.1/SVR4 while restarting
   daemons. Processes would hang, never receiving end-of-file on
   the pipe. A timeout has been added as a workaround.

   Support for Access Control Lists in files and copy. Currently
   implemented for solaris, and dfs only.

   blocksize calculations rewritten to avoid division by zero error.

   Error in installing required class info. Introduced in 1.4.8

   define= directives added to process, editfiles, files, tidy, link and disable

   DNS lookup case control to avoid unusual problems with case mismatch.

   $(host) not expanded when domain not set: fixed.

   Output rationalization in different modes, including possibility of logging.
   Note that the status of some messages has changed. You might need
   to set Inform = ( on ) in order to see the messages you want to see.
   Messages may now be routed to syslog.

   Bug in server= fixed for net copy. Previously a pointer error

   New option to shellcomand: useshell=true/false. If false, cfengine
   uses an internal popen replacement which does not use an intermediary
   shell to start programs. This addresses several security issues in
   starting programs with root privileges.

   New option to copy: purge=true/false. If true, cfengine will remove
   files in the destination dir which do not exist in the source dir
   when recursively copying directories.

   control options Verbose = ( on ), Inform = ( on ), Syslog = ( on )
   which switches the output level from within the config file. Also:
   Warnings = ( on ), DryRun = ( on ) to set other command line options.

   Bug in relative linking fixed.

   Bug in overlaying permissions mostly fixed in copy. Still some
   residual weirdness when using complex masks.

   Garbage appeared in copy define=classes. 

   AutoCreate would not work with BeginIfFileNewer

1.4.8
   Cfengine now detects redhat linux and defines a class. Welcome redhat.

   Variables can now be used in the control section itself, to define other
   variables and so forth.

   Drop setpgrp and use setsid instead, if it is found, to get around the
   incompatible argument.

   Non canonical $(arch) canonified so that it is not confused as a list variable.

   OutputPrefix doesn't automatically append hostname now, since you can always
   do this yourself with variables in the OutputPrefix string.

   Bug in copy, permissions finally fixed? Pleeeaasse?
   Output format changes.

   New option to links, nofile=force allows you to create links to files
   which do not presntly exist.

1.4.7
   Copy : "return" instead of "continue" in GetLock. Meant that if one
   lock failed, all copies were abandoned.
   Setuid root files copied without setuid bit. Fixed.
   Segmentation fault in "InsertFile" Fixed for empty files.

   Scanf workaround for linux in remote copying, caused incorrect
   values to be read and thereby incorrect file modes.

   Problem in variable expansion fixed?
   setpgrp() in cfd
   Documentation updates.
   Possible segmentation fault in inode caching fixed.
   Minor suggestions to autoconf implemented.

1.4.6
   CompressPath moved to filename.c to avoid linking problem in OSF.
   More Too Many open files bloopers fixed.
   cfd: transfer synchronization problem could break filenames in readdir() fixed.
   Recursive tidy including directories fixed so that top directory is now
   deleted.

   cfwrap altered so that identical multiple messages are filtered, or shown only
   once per day

1.4.5
   Symbolic link inode number transferred incorrectly from cfd, leads to remaking
   symbolic links during remote copies, owing to confusion of hard and soft links.
   Some unclosed socket loopholes fixed. Too many open files error.
   Variable syntax error, misdiagnozed if other braces used. Fixed.

1.4.4
   Repository error, files not being properly backed up. Fixed.
   Documentation config changes.

1.4.3
   AIX4 -> AIX in df.c. Typo in freespace code.
   Incorrect locking of editfiles fixed. Unique names previously omitted.
   Editfilesize can be set to zero to be ignored.
   Class defines in required: bugfix, items not installed.
   BeginGroupIfFileExists checked the wrong file!!
   cdrom filesystems do not generate warnings if not immediately mountable
   html files no longer distributed

   Binaries are now installed in sbin instead of bin.
   scripts are now installed in lib/cfengine instead of sbin

1.4.2
   Timeout for reading input files (can happen during hanging NFS) could lead to
   multiple cfengines being started unwillfully.
   Emacs major-mode contributed by Rolf Ebert
   include/exclude patterns in files fixed (broken in 1.4.0)
   Broken pipe error in cfrun fixed.
   Variable OutputPrefix can be used to change the default "cfengine:"
   prefix on output lines.


1.4.1
   Bug in parser. Trailing slashes defeat 2Dlist expansion. Fixed for tidy.
   cfd rereads system clock.
   Copy permission bug fixed.
   File reorganization to reflect inheritance structure.
   Change in cosmetic details of locking implementation.
   Some manual inconsistencies fixed.
   Bug in cfrun parsing comments fixed. (Missed next line)
   Bug in editfiles increment pointer fixed. Decrement to before start of file
   is not longer a fatal error.
   Permissions on rotated files were not preserved in 1.4.0. Fixed.
   Trailing dots from DNS/gethostbyname are now truncated away
   Editing symbolic links, edits file instead.
   Default value of IfElapsed is now zero, so that antispam locks are turned
    off by default.

1.4.0
   Debian systems now detected and have an additional class "debian" in addition to linux

   New option "define=class1,class2" to "copy" command defines a list
   of classes only if a file is copied.
   This allows followup actions to be added to other sections.

   Variable list iteration in shell-commands.   Enhanced iteration source code.

   New option in disable: size=, size=>, size=<  for byte size comparisons. Files are
   only disabled if the criterion is met.

   Hourly classes are added to the automatic class engine: Hr00 to Hr23 can now be used.

   Update messages in copy were erroneous in some cases, although copying was performed
   correctly. Fixed.

   Hyphens in hp-ux etc hard classes changed to underscores.

   It is now possible to override the name of the network interface in the control
   section of the program. This allows funny OS installations on unusual hardware
   to set the net interface for a specific class.
    control:

     nextstep::

      interfacename = ( blah0 )

  New editing commands:

     CommentLinesContaining,
     BeginGroupIfFileIsNewer,
     BeginGroupIfFileExists,
     BeginGroupIfNoLineContaining,
     AutoCreate


   Bug in alpha/netbsd with segmentation fault in exit() repaired, 
   some kind of pointer misunderstanding with a null string.

   New safer algorithm for copying files, first copies a modified
   file to a new file on the local filesystem. When transfer is complete it is
   renamed into place. This helps avoid race-conditions and problems
   where copying is halted underway due to network lossage.

   New debugging option d3 provides summarial info.

   Timeout option in shellcommands allows timeouts after a fixed number
   of seconds.

   Timeouts in place for all RPC operations connected with "mount".

   Sizes in disable and tidy now may specify units, bytes, kilobytes, megabytes (b,k,m)
   First character significant only. e.g. size=30kilobytes is okay.

   include=, exclude= patterns in file searches

   Remote copying partially implemented with server daemon cfd.

   Typo in tidy concatenation with multiple wildcards fixed.

   Extra time classes added allowing a complete front end for cron. Additional
   manual chapter on this.

   copying of links without a directory reference now prepends "./"

   Copying now preserves hard links where possible.

   File Rotation in disable does not break file handles any more.

   Copied/disabled files now back up to .cfsaved whereas edited files
   back up to .cfedited, to avoid overwriting the backup in copy-then-edit
   scenarios.

   Checksum comparisons are now optimized by checking the number of
   bytes before launching into a checksum computation.

   Several new edit commands.

   New locking mechanism with atomic locks which allow several cfengine's
   to coexist. Also antispamming mechanisms built in.

   CheckResolv reworked to avoid editing each time.

   AddToFstab will add to file if fs mounted

   SplayTimes added. causes cfengine to sleep a unique amount
   of time for each host, up to a maximum time. Can be used to
   avoid race conditions and contention.

   Improved expression evaluation with parentheses.

   Support for Cray. (Unsure whether these choices will match
   all cray systems).

  beta2:

   New options -q -K for switching off locks