mcm - Machine Configuration Manager
mcm [OPTION..] [STARTINGPOINT..] [OPTION..]
Configure the specified files and directories (both file/directory contents and permissions). Changes to be made (if any) are displayed before they are enacted.
Configuration Manager can be used to maintain directories,
configuration files and to build scripts in a declarative
way. MCM is designed such that it is easy for its inputs and
outputs to be reviewed and audited.
starting point (default = "Go.<lowercase_hostname>"). The starting point may be provided partially. E.g. ".blue" would result in the starting point "Go.blue" being used; similarly "MyUserConfigs." would result in "MyUserConfigs.<lowercase_hostname>" being used. Multiple starting points may be provided, though it only really makes sense to provide multiple starting points together with the options --parse-only or --compile-to.
-P PATH, --config-path=PATH
colon-separated list of directories holding configs (default = ".")
-r DIRECTORY, --root=DIRECTORY
path to manage (default = "./build")
whether to enact the changes (default = prompt). no and yes result in the changes being only displayed or unconditionally enacted respectively. ifnew causes the changes to be made if the root directory does not exist. prompt asks the user whether to enact the changes, promptunlessonlyadditions automatically enacts the changes if the changes would only result in the addition of new files and/or directories, otherwise prompts the user.
display differences (requires ’diff’)
parse configuration(s) only
-c DIRECTORY, --compile-to=DIRECTORY
compile (each provided starting point) to a single (but separate) file. Compiled files can then, for example, be sent to destination hosts for implementation.
read (initial) config from stdin
complain if there are fragments without corresponding files
when errors are encountered in either reading the config files or implementing the changes,
if --fix=ifnew but the root path to manage already exists,
if --fix=prompt or --fix=promptunlessonlyadditions and the changes are not enacted (e.g. "N" is entered).
The use of aliases/functions (e.g. in ~/.bashrc) is recommended for frequently used invocations. For example:
mcmroot=’sudo mcm -r / -P ~/mcm’
alias mcmhome=’mcm -r / -P ~/mcm MyUserConfigs.’
Or if using the grc colouriser:
mcmroot=’grc sudo mcm -r / -P ~/mcm’
alias mcmhome=’grc mcm -r / -P ~/mcm MyUserConfigs.’
You might also like to create an alias along the lines of the following, where mcmuserscripts and mcmrootscripts run any Machine Configuration Manager-generated scripts:
alias mcmall=’mcmuser && mcmuserscripts; mcmroot && mcmrootscripts’
None but those within directories specified with --config-path.
$PATH can be altered to change the version of diff invoked when the -d, --diff option is provided.
Starting with the define "mystart" in the file "Go.mcm" in the current directory (with the MCM Package of "Go"), show what changes would be made to the root ./build and then prompt whether to enact them:
Starting with the define "<lowercase_hostname>" in the file "MyUserConfigs.mcm" in the current directory (with the MCM Package of "MyUserConfigs"), show what changes would be made to the root ~/ and then prompt whether to enact them:
mcm -r ~/ MyUserConfigs.
Test a long list of starting points (e.g. that a change made for one of them has not broken any others):
--parse-only --error-on-leftover-fragments .oak .beech
.birch .maple \
MyUserConfigs.oak MyUserConfigs.beech MyUserConfigs.birch MyUserConfigs.maple \
LiveCD.basic LiveCD.X11 LiveCD.friends \
DebianInstaller.basic DebianInstaller.home DebianInstaller.work DebianInstaller.friends \
Deb.basic Deb.mypackage \
Website.main Website.photos \
RaspberryInstallation.simple RaspberryInstallation.maple RaspberryInstallation.demo
Compile the starting points (Go).maple and MyUserConfigs.maple to single files. The single files can then, for example, be copied to the destination host for implementation, or compared to other compiled files.
grc mcm -d -r / -c compiled/ .maple MyUserConfigs.maple
Written by Anthony Doggett <firstname.lastname@example.org>
Please email the author at the above address, preferably with sufficient information to reproduce the bug.
Copyright (c) 2014-2018 Anthony Doggett