Compare commits
	
		
			115 commits
		
	
	
		
			
				master
			
			...
			
				archive_sh
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 159ac76134 | ||
|  | 0ec3c2d017 | ||
|  | 0b5e7b5855 | ||
|  | 279d519dda | ||
|  | adf2e05a08 | ||
|  | 44586bc6f9 | ||
|  | 512ff69574 | ||
|  | 06a6bf1a0d | ||
|  | 68a51da380 | ||
|  | bd85d22a89 | ||
|  | c3bf34bf3d | ||
|  | 74418c77e0 | ||
|  | fe68c5b556 | ||
|  | 2b955b09bc | ||
|  | a5564850ce | ||
|  | 368ea87b89 | ||
|  | f7f2194b8f | ||
|  | bea7d5f828 | ||
|  | 4440838650 | ||
|  | 86e30c7a8a | ||
|  | cdc6f0d0c0 | ||
|  | f65b61ee8f | ||
|  | 6886c2e6f1 | ||
|  | 8dbe6f9c77 | ||
|  | 8fe9e86254 | ||
|  | 160d85dee1 | ||
|  | 97e8c431af | ||
|  | c9f4455677 | ||
|  | b5b8bdc016 | ||
|  | f8595793c1 | ||
|  | c70bfb2e20 | ||
|  | a4f45dfcf4 | ||
|  | cb3b16d63f | ||
|  | 49bad52715 | ||
|  | 4ab6c5bbc9 | ||
|  | 765c3d152a | ||
|  | f6fac37f1d | ||
|  | 5c35cad477 | ||
|  | 8daa07acbf | ||
|  | bd39d5c185 | ||
|  | f6d7a3e478 | ||
|  | 07dc79410a | ||
|  | 2926532560 | ||
|  | 6bf1680f2d | ||
|  | 7fab1c9dd9 | ||
|  | 39f1c8a242 | ||
|  | 5bb177eef9 | ||
|  | 76a796103c | ||
|  | 815de25d9a | ||
|  | 0c00e4a0d2 | ||
|  | 3a1bf25398 | ||
|  | 6d3053a9bc | ||
|  | 8ad8ce162f | ||
|  | 67ba0f7e9f | ||
|  | 41a0c1dc8a | ||
|  | 197fa583b5 | ||
|  | cfd0f776c9 | ||
|  | 4a5c161e96 | ||
|  | 666744209e | ||
|  | b06f6be5a6 | ||
|  | 5b9881bef6 | ||
|  | a53782805d | ||
|  | eeaab438c2 | ||
|  | f544fc5c42 | ||
|  | bb06a69bd5 | ||
|  | 390d527515 | ||
|  | 29e029a2eb | ||
|  | e9fe915519 | ||
|  | a5b9713986 | ||
|  | 83e75666c3 | ||
|  | 3c903fae67 | ||
|  | 141b808603 | ||
|  | 6d0cdc9456 | ||
|  | 6a37d58cc8 | ||
|  | 4fbe2a2676 | ||
|  | a277d5a4d4 | ||
|  | 29450e5e99 | ||
|  | c474317a6a | ||
|  | f3a88ef98d | ||
|  | 75bff0b13f | ||
|  | 7d6b1b5236 | ||
|  | d680c8a5f1 | ||
|  | 1132ec8756 | ||
|  | 7050342d90 | ||
|  | 0fa95a5adc | ||
|  | 0e7d822d16 | ||
|  | cda6c24799 | ||
|  | 022db22924 | ||
|  | 00bbadef78 | ||
|  | 9e94bb56a2 | ||
|  | 188afa2777 | ||
|  | 2f5b416a33 | ||
|  | 1565c73559 | ||
|  | 9a86b392dc | ||
|  | 47c32d1b53 | ||
|  | da9974b9ce | ||
|  | 0167f4a9f3 | ||
|  | 5dff2157e2 | ||
|  | f7138c2921 | ||
|  | 5c378dcb1b | ||
|  | 95ce60637c | ||
|  | 0e2c221b43 | ||
|  | cc7da0c264 | ||
|  | ef2336cb1e | ||
|  | 27a810705e | ||
|  | 9e246b18ed | ||
|  | 580b5da688 | ||
|  | 152cc930e1 | ||
|  | 0603322bbd | ||
|  | cf88f9cacb | ||
|  | 6a500d5570 | ||
|  | 7fbc4b8b77 | ||
|  | e6d2a301c9 | ||
|  | abe6e695bc | ||
|  | 630fced69d | 
					 1909 changed files with 7551 additions and 79344 deletions
				
			
		.gitattributes.gitignore.gitlab-ci.ymlBUGHACKERS_READMELICENSEMANIFEST.inMakefilePKGBUILD.inREADMEREADME-maintainers
bin
build-helpercdist-configcdist-deploy-tocdist-envcdist-mass-deploycdist-quickstartcdist-type-emulatorcdist-type-template
build.shcdist
__init__.pyargparse.pyautil.pybanner.py
conf
explorer
cpu_corescpu_socketsdisksinitinterfacesis-freebsd-jailkernel_namelsb_codenamelsb_descriptionlsb_idlsb_releasemachine_typememoryosos_version
manifest
type
__acl
__apt_default_release
__apt_key
__apt_key_uri
__apt_mark
__apt_norecommends
__apt_ppa
__apt_source
__apt_update_index
__block
__ccollect_source
							
								
								
									
										8
									
								
								.gitattributes
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.gitattributes
									
										
									
									
										vendored
									
									
								
							|  | @ -1,8 +0,0 @@ | |||
| .gitignore export-ignore | ||||
| .gitattributes export-ignore | ||||
| .gitkeep export-ignore | ||||
| docs/speeches export-ignore | ||||
| docs/video export-ignore | ||||
| docs/src/man7 export-ignore | ||||
| bin/build-helper export-ignore | ||||
| README-maintainers export-ignore | ||||
							
								
								
									
										70
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										70
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1,63 +1,15 @@ | |||
| # -vim | ||||
| # Swap | ||||
| [._]*.s[a-v][a-z] | ||||
| [._]*.sw[a-p] | ||||
| [._]s[a-rt-v][a-z] | ||||
| [._]ss[a-gi-z] | ||||
| [._]sw[a-p] | ||||
| 
 | ||||
| # Session | ||||
| Session.vim | ||||
| 
 | ||||
| # Temporary | ||||
| .netrwhist | ||||
| *~ | ||||
| *.tmp | ||||
| # Auto-generated tag files | ||||
| tags | ||||
| # Persistent undo | ||||
| [._]*.un~ | ||||
| .*.swp | ||||
| 
 | ||||
| # Ignore generated manpages | ||||
| docs/src/.marker | ||||
| docs/src/man1/*.1 | ||||
| docs/src/man7/*.7 | ||||
| docs/src/man7/cdist-type__*.rst | ||||
| docs/src/cdist-reference.rst | ||||
| docs/src/cdist-types.rst | ||||
| docs/src/cdist.cfg.skeleton | ||||
| doc/man/.marker | ||||
| doc/man/man1/*.1 | ||||
| doc/man/man7/*.7 | ||||
| doc/man/man*/*.html | ||||
| doc/man/man*/*.xml | ||||
| doc/man/man7/cdist-type__*.text | ||||
| doc/man/man7/cdist-reference.text | ||||
| doc/man/man*/docbook-xsl.css | ||||
| 
 | ||||
| # Ignore cdist cache for version control | ||||
| /cache/ | ||||
| 
 | ||||
| # Ignore inventory basedir | ||||
| cdist/inventory/ | ||||
| 
 | ||||
| # Python: cache, distutils, distribution in general | ||||
| __pycache__/ | ||||
| *.pyc | ||||
| /MANIFEST | ||||
| dist/ | ||||
| cdist/version.py | ||||
| cdist.egg-info/ | ||||
| 
 | ||||
| # sphinx build dirs, cache | ||||
| _build/ | ||||
| docs/dist | ||||
| 
 | ||||
| # Ignore temp files used for signing | ||||
| cdist-*.tar | ||||
| cdist-*.tar.gz | ||||
| cdist-*.tar.gz.asc | ||||
| 
 | ||||
| # Packaging: Archlinux | ||||
| /PKGBUILD | ||||
| /cdist-*.pkg.tar.xz | ||||
| /cdist-*.tar.gz | ||||
| /pkg | ||||
| /src | ||||
| build | ||||
| .lock-* | ||||
| .git-current-branch | ||||
| .lock* | ||||
| .pypi-release | ||||
| # Ignore cache for version control | ||||
| cache/ | ||||
|  |  | |||
|  | @ -1,18 +0,0 @@ | |||
| stages: | ||||
|     - test | ||||
| 
 | ||||
| unit_tests: | ||||
|     stage: test | ||||
|     script: | ||||
|         - ./bin/build-helper version | ||||
|         - ./bin/build-helper test | ||||
| 
 | ||||
| pycodestyle: | ||||
|     stage: test | ||||
|     script: | ||||
|         - ./bin/build-helper pycodestyle | ||||
| 
 | ||||
| shellcheck: | ||||
|     stage: test | ||||
|     script: | ||||
|         - ./bin/build-helper shellcheck | ||||
							
								
								
									
										1
									
								
								BUG
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								BUG
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| See core/__cdist_object_run. | ||||
							
								
								
									
										40
									
								
								HACKERS_README
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								HACKERS_README
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| cat << eof | ||||
| 
 | ||||
| Hey hackers, | ||||
| 
 | ||||
| this README is for you, for those who want to dig into cdist, hack it or try | ||||
| to get a deeper understanding. Please read doc/man/man7/cdist-hacker.text. | ||||
| 
 | ||||
| I hope you have a lot of fun with cdist, because it was also a lot of fun to | ||||
| develop it! | ||||
| 
 | ||||
|    -- Nico, 20110324 | ||||
| 
 | ||||
| ## Running cdist when developing | ||||
| 
 | ||||
| This file is suitable for execution and saving the objects and | ||||
| explorers from cdist. I usually do it like this: | ||||
| 
 | ||||
|    % ./HACKERS_README | ||||
| 
 | ||||
| ################################################################################ | ||||
| eof | ||||
| 
 | ||||
| set -x | ||||
| # Tell the user what we do, so this script makes sense during execution | ||||
| 
 | ||||
| # prepare use (only from top level directory) | ||||
| export PATH="$(pwd -P)/bin:$PATH" | ||||
| export __cdist_conf_dir="$(pwd -P)/conf" | ||||
| 
 | ||||
| # Allow user to supply hostname | ||||
| target="${1:-localhost}" | ||||
| 
 | ||||
| # And use hostname as basedir (dangerous, but hackers know what they do) | ||||
| export __cdist_local_base_dir="/tmp/$target" | ||||
| 
 | ||||
| # Run the real script | ||||
| cdist-deploy-to "$target" | ||||
| 
 | ||||
| # Display results | ||||
| find "${__cdist_local_base_dir}" | ||||
							
								
								
									
										674
									
								
								LICENSE
									
										
									
									
									
								
							
							
						
						
									
										674
									
								
								LICENSE
									
										
									
									
									
								
							|  | @ -1,674 +0,0 @@ | |||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 29 June 2007 | ||||
| 
 | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
| 
 | ||||
|                             Preamble | ||||
| 
 | ||||
|   The GNU General Public License is a free, copyleft license for | ||||
| software and other kinds of works. | ||||
| 
 | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| the GNU General Public License is intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users.  We, the Free Software Foundation, use the | ||||
| GNU General Public License for most of our software; it applies also to | ||||
| any other work released this way by its authors.  You can apply it to | ||||
| your programs, too. | ||||
| 
 | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
| 
 | ||||
|   To protect your rights, we need to prevent others from denying you | ||||
| these rights or asking you to surrender the rights.  Therefore, you have | ||||
| certain responsibilities if you distribute copies of the software, or if | ||||
| you modify it: responsibilities to respect the freedom of others. | ||||
| 
 | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must pass on to the recipients the same | ||||
| freedoms that you received.  You must make sure that they, too, receive | ||||
| or can get the source code.  And you must show them these terms so they | ||||
| know their rights. | ||||
| 
 | ||||
|   Developers that use the GNU GPL protect your rights with two steps: | ||||
| (1) assert copyright on the software, and (2) offer you this License | ||||
| giving you legal permission to copy, distribute and/or modify it. | ||||
| 
 | ||||
|   For the developers' and authors' protection, the GPL clearly explains | ||||
| that there is no warranty for this free software.  For both users' and | ||||
| authors' sake, the GPL requires that modified versions be marked as | ||||
| changed, so that their problems will not be attributed erroneously to | ||||
| authors of previous versions. | ||||
| 
 | ||||
|   Some devices are designed to deny users access to install or run | ||||
| modified versions of the software inside them, although the manufacturer | ||||
| can do so.  This is fundamentally incompatible with the aim of | ||||
| protecting users' freedom to change the software.  The systematic | ||||
| pattern of such abuse occurs in the area of products for individuals to | ||||
| use, which is precisely where it is most unacceptable.  Therefore, we | ||||
| have designed this version of the GPL to prohibit the practice for those | ||||
| products.  If such problems arise substantially in other domains, we | ||||
| stand ready to extend this provision to those domains in future versions | ||||
| of the GPL, as needed to protect the freedom of users. | ||||
| 
 | ||||
|   Finally, every program is threatened constantly by software patents. | ||||
| States should not allow patents to restrict development and use of | ||||
| software on general-purpose computers, but in those that do, we wish to | ||||
| avoid the special danger that patents applied to a free program could | ||||
| make it effectively proprietary.  To prevent this, the GPL assures that | ||||
| patents cannot be used to render the program non-free. | ||||
| 
 | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
| 
 | ||||
|                        TERMS AND CONDITIONS | ||||
| 
 | ||||
|   0. Definitions. | ||||
| 
 | ||||
|   "This License" refers to version 3 of the GNU General Public License. | ||||
| 
 | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
| 
 | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
| 
 | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
| 
 | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
| 
 | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
| 
 | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
| 
 | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
| 
 | ||||
|   1. Source Code. | ||||
| 
 | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
| 
 | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
| 
 | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
| 
 | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
| 
 | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
| 
 | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
| 
 | ||||
|   2. Basic Permissions. | ||||
| 
 | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
| 
 | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
| 
 | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
| 
 | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
| 
 | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
| 
 | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
| 
 | ||||
|   4. Conveying Verbatim Copies. | ||||
| 
 | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
| 
 | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
| 
 | ||||
|   5. Conveying Modified Source Versions. | ||||
| 
 | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
| 
 | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
| 
 | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
| 
 | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
| 
 | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
| 
 | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
| 
 | ||||
|   6. Conveying Non-Source Forms. | ||||
| 
 | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
| 
 | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
| 
 | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
| 
 | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
| 
 | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
| 
 | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
| 
 | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
| 
 | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
| 
 | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
| 
 | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
| 
 | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
| 
 | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
| 
 | ||||
|   7. Additional Terms. | ||||
| 
 | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
| 
 | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
| 
 | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
| 
 | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
| 
 | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
| 
 | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
| 
 | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
| 
 | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
| 
 | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
| 
 | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
| 
 | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
| 
 | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
| 
 | ||||
|   8. Termination. | ||||
| 
 | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
| 
 | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
| 
 | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
| 
 | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
| 
 | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
| 
 | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
| 
 | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
| 
 | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
| 
 | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
| 
 | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
| 
 | ||||
|   11. Patents. | ||||
| 
 | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
| 
 | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
| 
 | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
| 
 | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
| 
 | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
| 
 | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
| 
 | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
| 
 | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
| 
 | ||||
|   12. No Surrender of Others' Freedom. | ||||
| 
 | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
| 
 | ||||
|   13. Use with the GNU Affero General Public License. | ||||
| 
 | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU Affero General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the special requirements of the GNU Affero General Public License, | ||||
| section 13, concerning interaction through a network will apply to the | ||||
| combination as such. | ||||
| 
 | ||||
|   14. Revised Versions of this License. | ||||
| 
 | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
| 
 | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
| 
 | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
| 
 | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
| 
 | ||||
|   15. Disclaimer of Warranty. | ||||
| 
 | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
| 
 | ||||
|   16. Limitation of Liability. | ||||
| 
 | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
| 
 | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
| 
 | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
| 
 | ||||
|                      END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|             How to Apply These Terms to Your New Programs | ||||
| 
 | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
| 
 | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
| 
 | ||||
|     cdist | ||||
|     Copyright (C) 2019  ungleich-public | ||||
| 
 | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
| 
 | ||||
|   If the program does terminal interaction, make it output a short | ||||
| notice like this when it starts in an interactive mode: | ||||
| 
 | ||||
|     cdist  Copyright (C) 2019  ungleich-public | ||||
|     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
| 
 | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, your program's commands | ||||
| might be different; for a GUI interface, you would use an "about box". | ||||
| 
 | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU GPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
|   The GNU General Public License does not permit incorporating your program | ||||
| into proprietary programs.  If your program is a subroutine library, you | ||||
| may consider it more useful to permit linking proprietary applications with | ||||
| the library.  If this is what you want to do, use the GNU Lesser General | ||||
| Public License instead of this License.  But first, please read | ||||
| <http://www.gnu.org/philosophy/why-not-lgpl.html>. | ||||
|  | @ -1,3 +0,0 @@ | |||
| include docs/changelog | ||||
| recursive-include docs/gfx *.png *.text | ||||
| recursive-include docs *.text *.html *.1 *.7 | ||||
							
								
								
									
										148
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										148
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -1,148 +0,0 @@ | |||
| #
 | ||||
| # 2013 Nico Schottelius (nico-cdist at schottelius.org)
 | ||||
| #
 | ||||
| # This file is part of cdist.
 | ||||
| #
 | ||||
| # cdist is free software: you can redistribute it and/or modify
 | ||||
| # it under the terms of the GNU General Public License as published by
 | ||||
| # the Free Software Foundation, either version 3 of the License, or
 | ||||
| # (at your option) any later version.
 | ||||
| #
 | ||||
| # cdist is distributed in the hope that it will be useful,
 | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| # GNU General Public License for more details.
 | ||||
| #
 | ||||
| # You should have received a copy of the GNU General Public License
 | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>.
 | ||||
| #
 | ||||
| #
 | ||||
| 
 | ||||
| .PHONY: help | ||||
| help: | ||||
| 	@echo "Please use \`make <target>' where <target> is one of" | ||||
| 	@echo "man             build only man user documentation" | ||||
| 	@echo "html            build only html user documentation" | ||||
| 	@echo "docs            build both man and html user documentation" | ||||
| 	@echo "dotman          build man pages for types in your ~/.cdist directory" | ||||
| 	@echo "speeches        build speeches pdf files" | ||||
| 	@echo "install         install in the system site-packages directory" | ||||
| 	@echo "install-user    install in the user site-packages directory" | ||||
| 	@echo "docs-clean      clean documentation" | ||||
| 	@echo "clean           clean" | ||||
| 
 | ||||
| DOCS_SRC_DIR=./docs/src | ||||
| SPEECHDIR=./docs/speeches | ||||
| TYPEDIR=./cdist/conf/type | ||||
| 
 | ||||
| SPHINXM=make -C $(DOCS_SRC_DIR) man | ||||
| SPHINXH=make -C $(DOCS_SRC_DIR) html | ||||
| SPHINXC=make -C $(DOCS_SRC_DIR) clean | ||||
| 
 | ||||
| ################################################################################
 | ||||
| # Manpages
 | ||||
| #
 | ||||
| MAN7DSTDIR=$(DOCS_SRC_DIR)/man7 | ||||
| 
 | ||||
| # Manpages #1: Types
 | ||||
| # Use shell / ls to get complete list - $(TYPEDIR)/*/man.rst does not work
 | ||||
| # Using ls does not work if no file with given pattern exist, so use wildcard
 | ||||
| MANTYPESRC=$(wildcard $(TYPEDIR)/*/man.rst) | ||||
| MANTYPEPREFIX=$(subst $(TYPEDIR)/,$(MAN7DSTDIR)/cdist-type,$(MANTYPESRC)) | ||||
| MANTYPES=$(subst /man.rst,.rst,$(MANTYPEPREFIX)) | ||||
| 
 | ||||
| # Link manpage: do not create man.html but correct named file
 | ||||
| $(MAN7DSTDIR)/cdist-type%.rst: $(TYPEDIR)/%/man.rst | ||||
| 	mkdir -p $(MAN7DSTDIR) | ||||
| 	ln -sf "../../../$^" $@ | ||||
| 
 | ||||
| # Manpages #2: reference
 | ||||
| DOCSREF=$(MAN7DSTDIR)/cdist-reference.rst | ||||
| DOCSREFSH=$(DOCS_SRC_DIR)/cdist-reference.rst.sh | ||||
| 
 | ||||
| $(DOCSREF): $(DOCSREFSH) | ||||
| 	$(DOCSREFSH) | ||||
| 
 | ||||
| # Html types list with references
 | ||||
| DOCSTYPESREF=$(MAN7DSTDIR)/cdist-types.rst | ||||
| DOCSTYPESREFSH=$(DOCS_SRC_DIR)/cdist-types.rst.sh | ||||
| 
 | ||||
| $(DOCSTYPESREF): $(DOCSTYPESREFSH) | ||||
| 	$(DOCSTYPESREFSH) | ||||
| 
 | ||||
| DOCSCFGSKEL=./configuration/cdist.cfg.skeleton | ||||
| 
 | ||||
| configskel: $(DOCSCFGSKEL) | ||||
| 	cp -f "$(DOCSCFGSKEL)" "$(DOCS_SRC_DIR)/" | ||||
| 
 | ||||
| version: | ||||
| 	@[ -f "cdist/version.py" ] || { \
 | ||||
| 		printf "Missing 'cdist/version.py', please generate it first.\n" && exit 1; \
 | ||||
| 	} | ||||
| 
 | ||||
| # Manpages #3: generic part
 | ||||
| man: version $(MANTYPES) $(DOCSREF) | ||||
| 	$(SPHINXM) | ||||
| 
 | ||||
| html: version configskel $(MANTYPES) $(DOCSREF) $(DOCSTYPESREF) | ||||
| 	$(SPHINXH) | ||||
| 
 | ||||
| docs: man html | ||||
| 
 | ||||
| docs-clean: | ||||
| 	$(SPHINXC) | ||||
| 
 | ||||
| # Manpages: .cdist Types
 | ||||
| DOT_CDIST_PATH=${HOME}/.cdist | ||||
| DOTMAN7DSTDIR=$(MAN7DSTDIR) | ||||
| DOTTYPEDIR=$(DOT_CDIST_PATH)/type | ||||
| DOTMANTYPESRC=$(wildcard $(DOTTYPEDIR)/*/man.rst) | ||||
| DOTMANTYPEPREFIX=$(subst $(DOTTYPEDIR)/,$(DOTMAN7DSTDIR)/cdist-type,$(DOTMANTYPESRC)) | ||||
| DOTMANTYPES=$(subst /man.rst,.rst,$(DOTMANTYPEPREFIX)) | ||||
| 
 | ||||
| # Link manpage: do not create man.html but correct named file
 | ||||
| $(DOTMAN7DSTDIR)/cdist-type%.rst: $(DOTTYPEDIR)/%/man.rst | ||||
| 	ln -sf "$^" $@ | ||||
| 
 | ||||
| dotman: version $(DOTMANTYPES) | ||||
| 	$(SPHINXM) | ||||
| 
 | ||||
| ################################################################################
 | ||||
| # Speeches
 | ||||
| #
 | ||||
| SPEECHESOURCES=$(SPEECHDIR)/*.tex | ||||
| SPEECHES=$(SPEECHESOURCES:.tex=.pdf) | ||||
| 
 | ||||
| # Create speeches and ensure Toc is up-to-date
 | ||||
| $(SPEECHDIR)/%.pdf: $(SPEECHDIR)/%.tex | ||||
| 	pdflatex -output-directory $(SPEECHDIR) $^ | ||||
| 	pdflatex -output-directory $(SPEECHDIR) $^ | ||||
| 	pdflatex -output-directory $(SPEECHDIR) $^ | ||||
| 
 | ||||
| speeches: $(SPEECHES) | ||||
| 
 | ||||
| ################################################################################
 | ||||
| # Misc
 | ||||
| #
 | ||||
| clean: docs-clean | ||||
| 	rm -f $(DOCS_SRC_DIR)/cdist-reference.rst | ||||
| 	rm -f $(DOCS_SRC_DIR)/cdist-types.rst | ||||
| 	rm -f $(DOCS_SRC_DIR)/cdist.cfg.skeleton | ||||
| 
 | ||||
| 	find "$(DOCS_SRC_DIR)" -mindepth 2 -type l \
 | ||||
| 	| xargs rm -f | ||||
| 
 | ||||
| 	find * -name __pycache__  | xargs rm -rf | ||||
| 
 | ||||
| 	# distutils | ||||
| 	rm -rf ./build | ||||
| 
 | ||||
| ################################################################################
 | ||||
| # install
 | ||||
| #
 | ||||
| 
 | ||||
| install: | ||||
| 	python3 setup.py install | ||||
| 
 | ||||
| install-user: | ||||
| 	python3 setup.py install --user | ||||
							
								
								
									
										29
									
								
								PKGBUILD.in
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								PKGBUILD.in
									
										
									
									
									
								
							|  | @ -1,29 +0,0 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| version="$1" | ||||
| outfile=${0%.in} | ||||
| 
 | ||||
| cat << eof > "${outfile}" | ||||
| pkgname=cdist | ||||
| pkgver=$version | ||||
| pkgrel=1 | ||||
| pkgdesc='A Usable Configuration Management System"' | ||||
| arch=('any') | ||||
| url='https://www.cdi.st/' | ||||
| license=('GPL3') | ||||
| depends=('python>=3.2.0') | ||||
| source=("http://pypi.python.org/packages/source/c/cdist/cdist-\${pkgver}.tar.gz") | ||||
| 
 | ||||
| package() { | ||||
|     cd cdist-\${pkgver} | ||||
|     python3 setup.py build install --root="\${pkgdir}" | ||||
|     find "\$pkgdir" -type d -exec chmod 0755 {} \; | ||||
|     find "\$pkgdir" -type f -exec chmod a+r {} \; | ||||
| } | ||||
| eof | ||||
| 
 | ||||
| makepkg -g >> "${outfile}" | ||||
| 
 | ||||
| # Fix this issue: | ||||
| # error: failed to upload cdist-3.1.6-1.src.tar.gz: Error - all files must have permissions of 644 or 755. | ||||
| chmod a+r "${outfile}" | ||||
							
								
								
									
										243
									
								
								README
									
										
									
									
									
								
							
							
						
						
									
										243
									
								
								README
									
										
									
									
									
								
							|  | @ -1,7 +1,240 @@ | |||
| cdist | ||||
| ----- | ||||
| [[!meta title="cdist - usable configuration management"]] | ||||
| 
 | ||||
|       | ||||
|                  ..          .       .x+=:.        s    | ||||
|                dF           @88>    z`    ^%      :8   | ||||
|               '88bu.        %8P        .   <k    .88  | ||||
|           .   '*88888bu      .       .@8Ned8"   :888ooo | ||||
|      .udR88N    ^"*8888N   .@88u   .@^%8888"  -*8888888 | ||||
|     <888'888k  beWE "888L ''888E` x88:  `)8b.   8888 | ||||
|     9888 'Y"   888E  888E   888E  8888N=*8888   8888 | ||||
|     9888       888E  888E   888E   %8"    R88   8888 | ||||
|     9888       888E  888F   888E    @8Wou 9%   .8888Lu= | ||||
|     ?8888u../ .888N..888    888&  .888888P`    ^%888* | ||||
|      "8888P'   `"888*""     R888" `   ^"F        'Y"  | ||||
|        "P'        ""         ""   | ||||
|       | ||||
| 
 | ||||
| [[!toc levels=2]] | ||||
| 
 | ||||
| ## Introduction | ||||
| 
 | ||||
| cdist is an alternative to other configuration management systems like | ||||
| [cfengine](http://www.cfengine.org/), | ||||
| [bcfg2](http://trac.mcs.anl.gov/projects/bcfg2), | ||||
| [chef](http://wiki.opscode.com/display/chef/) | ||||
| and [puppet](http://www.puppetlabs.com/). | ||||
| But cdist ticks differently, here is the feature set that makes it unique:  | ||||
| 
 | ||||
| [[!table  data=""" | ||||
| Keywords | Description | ||||
| Simplicity | There is only one type to extend cdist called ***type*** | ||||
| Design | Type and core cleanly seperated | ||||
| Design | Sticks completly to the KISS (keep it simple and stupid) paradigma | ||||
| Design | Meaningful error messages - do not lose time debugging error messages | ||||
| Design | Consistency in behaviour, naming and documentation | ||||
| Design | No surprise factor: Only do what is obviously clear, no magic | ||||
| Design | Define target state, do not focus on methods or scripts | ||||
| Design | Push architecture: Instantly apply your changes | ||||
| Small core | cdist's core is very small - less code, less bugs | ||||
| Fast development | Focus on straightforwardness of type creation is a main development objective | ||||
| Requirements, Scalability | No central server needed, cdist operates in push mode and can be run from any computer | ||||
| Requirements, Scalability, Upgrade | cdist only needs to be updated on the master, not on the target hosts | ||||
| Requirements, Security | Uses well-know [SSH](http://www.openssh.com/) as transport protocol | ||||
| Requirements, Simplicity | Requires only shell and SSH server on the target | ||||
| UNIX | Reuse of existing tools like cat, find, mv, ... | ||||
| UNIX, familar environment, documentation | Is available as manpages and HTML | ||||
| UNIX, simplicity, familar environment | cdist is written in POSIX shell | ||||
| UNIX, simplicity, familar environment | cdist is configured in POSIX shell | ||||
| """]] | ||||
| 
 | ||||
| ### Documentation | ||||
| 
 | ||||
| The cdist documentation is included as manpages in the distribution. | ||||
| 
 | ||||
|  * You can [browse the documentation of the latest version online](man) as well. | ||||
|  * Or you can watch the youtube **video** | ||||
| [cdist installation and first usage in less than 60 seconds][http://www.youtube.com/watch?v=PRMjzy48eTI). | ||||
|  * Have a look at the [given speeches](speeches) | ||||
| 
 | ||||
| ### OS support | ||||
| 
 | ||||
| cdist was tested or is know to run on at least | ||||
| 
 | ||||
|  * [Archlinux](http://www.archlinux.org/) | ||||
|  * [Debian](http://www.debian.org/) | ||||
|  * [Fedora](http://fedoraproject.org/) | ||||
|  * [Gentoo](http://www.gentoo.org/) | ||||
|  * [Mac OS X](http://www.apple.com/macosx/) | ||||
|  * [OpenBSD](http://www.openbsd.org) | ||||
|  * [Redhat](http://www.redhat.com/) | ||||
|  * [Ubuntu](http://www.ubuntu.com/) | ||||
| 
 | ||||
| 
 | ||||
| ## Requirements | ||||
| 
 | ||||
| ### Server | ||||
| 
 | ||||
|  * A posix like shell | ||||
|  * SSH-Client | ||||
| 
 | ||||
| ### Client ("target host") | ||||
| 
 | ||||
|  * A posix like shell | ||||
|  * SSH-Server | ||||
| 
 | ||||
| 
 | ||||
| ## Getting cdist | ||||
| 
 | ||||
| You can clone cdist from git, which gives you the advantage of having | ||||
| a version control in place for development of your own stuff as well. | ||||
| 
 | ||||
| ### Installation | ||||
| 
 | ||||
| To install cdist, execute the following commands: | ||||
| 
 | ||||
|     git clone git://git.schottelius.org/cdist | ||||
|     cd cdist | ||||
|     export PATH=$PATH:$(pwd -P)/bin | ||||
| 
 | ||||
|     # If you want the manpages (requires gmake and asciidoc to be installed) | ||||
|     ./build.sh man | ||||
|     export MANPATH=$MANPATH:$(pwd -P)/doc/man | ||||
| 
 | ||||
| 
 | ||||
| Afterwards you can run ***cdist-quickstart*** to get an impression on | ||||
| how to use cdist. | ||||
| 
 | ||||
| ### Available versions | ||||
| 
 | ||||
| There are at least the following branches available: | ||||
| 
 | ||||
|  * Development: master | ||||
|  * Current Stable: 1.7 (Bugfixes, cleanups, new type and explorer rename) | ||||
| 
 | ||||
| Old versions: | ||||
| 
 | ||||
|  * 1.6: New types, cleaned up \_\_package* types, internal cleanup | ||||
|  * 1.5: Focus on object orientation instead of global stage orientation | ||||
|  * 1.4: Support for redefiniton of objects (if equal) | ||||
|  * 1.3: Support for local and remote code execution (current stable) | ||||
|  * 1.2: Dependencies supported | ||||
|  * 1.1: \_\_file to \_\_file, \_\_directory, \_\_link migration | ||||
|  * 1.0: First official release | ||||
| 
 | ||||
| Other branches may be available 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 a specific version | ||||
|     version=1.7 | ||||
|     git checkout -b $version origin/$version | ||||
| 
 | ||||
| ### Mirrors | ||||
| 
 | ||||
|  * git://github.com/telmich/cdist.git ([github](https://github.com/telmich/cdist)) | ||||
|  * git://git.sans.ethz.ch/cdist ([sans](http://git.sans.ethz.ch/?p=cdist;a=summary)) | ||||
| 
 | ||||
| ## Update | ||||
| 
 | ||||
| To upgrade cdist in the current branch use | ||||
| 
 | ||||
|     git pull | ||||
| 
 | ||||
|     # Also update the manpages | ||||
|     ./build.sh man | ||||
|     export MANPATH=$MANPATH:$(pwd -P)/doc/man | ||||
| 
 | ||||
| If you stay on a version branche (i.e. 1.0, 1.1., ...), nothing should break. | ||||
| The master branch on the other hand is the development branch and may not be | ||||
| working, break your setup or eat the tree in your garden. | ||||
| 
 | ||||
| ### Upgrading from 1.6 to 1.7 | ||||
| 
 | ||||
| * If you used the global explorer **hardware_type**, you need to change | ||||
|   your code to use **machine** instead. | ||||
| 
 | ||||
| ### Upgrading from 1.5 to 1.6 | ||||
| 
 | ||||
| * If you used **\_\_package_apt --preseed**, you need to use the new | ||||
|   type **\_\_debconf_set_selections** instead. | ||||
| * The **\_\_package** types accepted either --state deinstalled or | ||||
|   --state uninstaaled. Starting with 1.6, it was made consistently | ||||
|   to --state removed. | ||||
| 
 | ||||
| ### Upgrading from 1.3 to 1.5 | ||||
| 
 | ||||
| No incompatiblities. | ||||
| 
 | ||||
| ### Upgrading from 1.2 to 1.3 | ||||
| 
 | ||||
| Rename **gencode** of every type to **gencode-remote**. | ||||
| 
 | ||||
| ### Upgrading from 1.1 to 1.2 | ||||
| 
 | ||||
| No incompatiblities. | ||||
| 
 | ||||
| ### Upgrading from 1.0 to 1.1 | ||||
| 
 | ||||
| In 1.1 the type **\_\_file** was split into **\_\_directory**, **\_\_file** and | ||||
| **\_\_link**. The parameter **--type** was removed from **\_\_file**. Thus you | ||||
| need to replace **\_\_file** calls in your manifests: | ||||
| 
 | ||||
|  * Remove --type from all \_\_file calls | ||||
|  * If type was symlink, use \_\_link and --type symbolic | ||||
|  * If type was directory, use \_\_directory | ||||
| 
 | ||||
| 
 | ||||
| ## Support | ||||
| 
 | ||||
| ### IRC | ||||
| 
 | ||||
| You can join the development ***IRC channel*** | ||||
| [#cstar on irc.freenode.org](irc://irc.freenode.org/#cstar). | ||||
| 
 | ||||
| ### Mailing list | ||||
| 
 | ||||
| Bug reports, questions, patches, etc. should be send to the | ||||
| [cdist mailing list](http://l.schottelius.org/mailman/listinfo/cdist). | ||||
| 
 | ||||
| ### Commercial support | ||||
| 
 | ||||
| You can request commercial support for cdist from | ||||
| [my company](http://firma.schottelius.org/english/). | ||||
| 
 | ||||
| ## Used by | ||||
| 
 | ||||
| If you're using cdist, feel free to send a report to the mailing list. | ||||
| Interesting information are for instance | ||||
| 
 | ||||
|  * Which services do you manage? | ||||
|  * How many machines do you manage? | ||||
|  * What are the pros/cons you see in cdist? | ||||
|  * General comments/critics | ||||
| 
 | ||||
| ### Nico Schottelius, Systems Group ETH Zurich and privately | ||||
| 
 | ||||
| Yes, I'm actually eating my own dogfood and currently managing | ||||
| 
 | ||||
|  * [plone](http://plone.org/) (cms) | ||||
|  * [moinmoin](http://moinmo.in/) (wiki) | ||||
|  * [apache](http://httpd.apache.org/) (webserver) | ||||
|  * [kerberos (mit)](http://web.mit.edu/kerberos/) (authentication) | ||||
|  * [nss-pam-ldapd](http://arthurdejong.org/nss-pam-ldapd/) (authentication) | ||||
|  * [ircd-hybrid](http://www.ircd-hybrid.org/) (chat) | ||||
|  * [stunnel](http://stunnel.mirt.net/) (SSL tunnel) | ||||
|  * [mercurial-server](http://www.lshift.net/mercurial-server.html) (version control) | ||||
|  * [xfce](http://www.xfce.org/) (lightweight desktop environment) | ||||
|  * [slim](http://slim.berlios.de/) (graphical login manager for X11) | ||||
| 
 | ||||
| with cdist on more than **60** production machines of the | ||||
| [Systems Group](http://www.systems.ethz.ch) at the | ||||
| [ETH Zurich](http://www.ethz.ch) as well at home. | ||||
| 
 | ||||
| ### Steven Armstrong, CBRG ETH Zurich | ||||
| 
 | ||||
| The CBRG is managing most of their compute clusters with cdist. | ||||
| 
 | ||||
| cdist is a usable configuration management system. | ||||
| 
 | ||||
| For the web documentation have a look at https://www.cdi.st/ | ||||
| or at docs/src for reStructuredText manual. | ||||
|  |  | |||
|  | @ -1,4 +0,0 @@ | |||
| Maintainers should use ./bin/build-helper script. | ||||
| 
 | ||||
| Makefile is intended for end users. It can be used for non-maintaining | ||||
| targets that can be run from pure source (without git repository). | ||||
							
								
								
									
										566
									
								
								bin/build-helper
									
										
									
									
									
								
							
							
						
						
									
										566
									
								
								bin/build-helper
									
										
									
									
									
								
							|  | @ -1,566 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011-2013 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # 2016-2019 Darko Poljak (darko.poljak at gmail.com) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # This file contains the heavy lifting found usually in the Makefile. | ||||
| # | ||||
| 
 | ||||
| usage() { | ||||
|     printf "usage: %s TARGET [TARGET-ARGS...] | ||||
|     Available targets: | ||||
|         changelog-changes | ||||
|         changelog-version | ||||
|         check-date | ||||
|         check-unittest | ||||
|         ml-release | ||||
|         archlinux-release | ||||
|         pypi-release | ||||
|         release-git-tag | ||||
|         sign-git-release | ||||
|         release | ||||
|         test | ||||
|         test-remote | ||||
|         pycodestyle | ||||
|         pep8 | ||||
|         check-pycodestyle | ||||
|         shellcheck-global-explorers | ||||
|         shellcheck-type-explorers | ||||
|         shellcheck-manifests | ||||
|         shellcheck-local-gencodes | ||||
|         shellcheck-remote-gencodes | ||||
|         shellcheck-scripts | ||||
|         shellcheck-gencodes | ||||
|         shellcheck-types | ||||
|         shellcheck | ||||
|         shellcheck-type-files | ||||
|         shellcheck-with-files | ||||
|         shellcheck-build-helper | ||||
|         check-shellcheck | ||||
|         version-branch | ||||
|         version | ||||
|         target-version | ||||
|         clean | ||||
|         distclean\n" "$1" | ||||
| } | ||||
| 
 | ||||
| basename="${0##*/}" | ||||
| 
 | ||||
| if [ $# -lt 1 ] | ||||
| then | ||||
|     usage "${basename}" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| option=$1; shift | ||||
| 
 | ||||
| SHELLCHECKCMD="shellcheck -s sh -f gcc -x" | ||||
| # Skip SC2154 for variables starting with __ since such variables are cdist | ||||
| # environment variables. | ||||
| SHELLCHECK_SKIP=': __.*is referenced but not assigned.*\[SC2154\]' | ||||
| SHELLCHECKTMP=".shellcheck.tmp" | ||||
| 
 | ||||
| # Change to checkout directory | ||||
| basedir="${0%/*}/../" | ||||
| cd "$basedir" | ||||
| 
 | ||||
| case "$option" in | ||||
|     changelog-changes) | ||||
|         if [ "$#" -eq 1 ]; then | ||||
|             start=$1 | ||||
|         else | ||||
|             start="[[:digit:]]" | ||||
|         fi | ||||
| 
 | ||||
|         end="[[:digit:]]" | ||||
| 
 | ||||
|         awk -F: "BEGIN { start=0 } | ||||
|             { | ||||
|                 if(start == 0) { | ||||
|                     if (\$0 ~ /^$start/) { | ||||
|                         start = 1 | ||||
|                     } | ||||
|                 } else { | ||||
|                     if (\$0 ~ /^$end/) { | ||||
|                         exit | ||||
|                     } else { | ||||
|                         print \$0  | ||||
|                     } | ||||
|                 } | ||||
|             }" "$basedir/docs/changelog" | ||||
|     ;; | ||||
| 
 | ||||
|     changelog-version) | ||||
|         # get version from changelog | ||||
|         grep '^[[:digit:]]' "$basedir/docs/changelog" | head -n1 | sed 's/:.*//' | ||||
|     ;; | ||||
| 
 | ||||
|     check-date) | ||||
|         # verify date in changelog is today | ||||
|         date_today="$(date +%Y-%m-%d)" | ||||
|         date_changelog=$(grep '^[[:digit:]]' "$basedir/docs/changelog" | head -n1 | sed 's/.*: //') | ||||
| 
 | ||||
|         if [ "$date_today" != "$date_changelog" ]; then | ||||
|             printf "Date in changelog is not today\n" | ||||
|             printf "Changelog date: %s\n" "${date_changelog}" | ||||
|             exit 1 | ||||
|         fi | ||||
|     ;; | ||||
| 
 | ||||
|     check-unittest) | ||||
|         "$0" test | ||||
|     ;; | ||||
| 
 | ||||
|     ml-release) | ||||
|         if [ $# -ne 1 ]; then | ||||
|             printf "%s ml-release version\n" "$0" >&2 | ||||
|             exit 1 | ||||
|         fi | ||||
| 
 | ||||
|         version=$1; shift | ||||
| 
 | ||||
|         (  | ||||
|         cat << eof | ||||
| Subject: cdist $version has been released | ||||
| 
 | ||||
| Hello .*, | ||||
| 
 | ||||
| cdist $version has been released with the following changes: | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
|         "$0" changelog-changes "$version" | ||||
|         cat << eof | ||||
| 
 | ||||
| eof | ||||
|         ) > mailinglist.tmp | ||||
|     ;; | ||||
| 
 | ||||
|     archlinux-release) | ||||
|         if [ $# -ne 1 ]; then | ||||
|             printf "%s archlinux-release version\n" "$0" >&2 | ||||
|             exit 1 | ||||
|         fi | ||||
|         version=$1; shift | ||||
| 
 | ||||
|         ARCHLINUXTAR="cdist-${version}-1.src.tar.gz" | ||||
|         ./PKGBUILD.in "${version}" | ||||
|         umask 022 | ||||
|         mkaurball | ||||
|         burp -c system "${ARCHLINUXTAR}" | ||||
|     ;; | ||||
| 
 | ||||
|     pypi-release) | ||||
|         # Ensure that pypi release has the right version | ||||
|         "$0" version | ||||
| 
 | ||||
|         make docs-clean | ||||
|         make docs | ||||
|         python3 setup.py sdist upload | ||||
|     ;; | ||||
| 
 | ||||
|     release-git-tag) | ||||
|         target_version=$($0 changelog-version) | ||||
|         if git rev-parse --verify "refs/tags/${target_version}" 2>/dev/null; then | ||||
|             printf "Tag for %s exists, aborting\n" "${target_version}" | ||||
|             exit 1 | ||||
|         fi | ||||
|         printf "Enter tag description for %s: " "${target_version}" | ||||
|         read -r tagmessage | ||||
| 
 | ||||
|         # setup for signed tags: | ||||
|         # gpg --fulL-gen-key | ||||
|         # gpg --list-secret-keys --keyid-format LONG | ||||
|         # git config --local user.signingkey <id> | ||||
|         # for exporting pub key: | ||||
|         #     gpg --armor --export <id> > pubkey.asc | ||||
|         #     gpg --output pubkey.gpg --export <id> | ||||
|         # show tag with signature | ||||
|         # git show <tag> | ||||
|         # verify tag signature | ||||
|         # git tag -v <tag> | ||||
|         # | ||||
|         # gpg verify signature | ||||
|         # gpg --verify <asc-file> <file> | ||||
|         # gpg --no-default-keyring --keyring <pubkey.gpg> --verify <asc-file> <file> | ||||
|         # Ensure gpg-agent is running. | ||||
|         GPG_TTY=$(tty) | ||||
|         export GPG_TTY | ||||
|         gpg-agent | ||||
| 
 | ||||
|         git tag -s "$target_version" -m "$tagmessage" | ||||
|         git push --tags | ||||
|     ;; | ||||
| 
 | ||||
|     sign-git-release) | ||||
|         if [ $# -lt 2 ] | ||||
|         then | ||||
|             printf "usage: %s sign-git-release TAG TOKEN [ARCHIVE]\n" "$0" | ||||
|             printf "    if ARCHIVE is not specified then it is created\n" | ||||
|             exit 1 | ||||
|         fi | ||||
|         tag="$1" | ||||
|         if ! git rev-parse -q --verify "${tag}" >/dev/null 2>&1 | ||||
|         then | ||||
|             printf "Tag \"%s\" not found.\n" "${tag}" | ||||
|             exit 1 | ||||
|         fi | ||||
|         token="$2" | ||||
|         if [ $# -gt 2 ] | ||||
|         then | ||||
|             archivename="$3" | ||||
|         else | ||||
|             archivename="cdist-${tag}.tar" | ||||
|             git archive --prefix="cdist-${tag}/" -o "${archivename}" "${tag}" \ | ||||
|                 || exit 1 | ||||
|             # make sure target version is generated | ||||
|             "$0" target-version | ||||
|             tar -x -f "${archivename}" || exit 1 | ||||
|             cp cdist/version.py "cdist-${tag}/cdist/version.py" || exit 1 | ||||
|             tar -c -f "${archivename}" "cdist-${tag}/" || exit 1 | ||||
|             rm -r -f "cdist-${tag}/" | ||||
|             gzip "${archivename}" || exit 1 | ||||
|             archivename="${archivename}.gz" | ||||
|         fi | ||||
|         gpg --armor --detach-sign "${archivename}" || exit 1 | ||||
| 
 | ||||
|         project="ungleich-public%2Fcdist" | ||||
|         sed_cmd='s/^.*"markdown":"\([^"]*\)".*$/\1/' | ||||
| 
 | ||||
|         # upload archive | ||||
|         response_archive=$(curl -f -X POST \ | ||||
|              --http1.1 \ | ||||
|              -H "PRIVATE-TOKEN: ${token}" \ | ||||
|              -F "file=@${archivename}" \ | ||||
|              "https://code.ungleich.ch/api/v4/projects/${project}/uploads" \ | ||||
|              | sed "${sed_cmd}") || exit 1 | ||||
| 
 | ||||
|         # upload archive signature | ||||
|         response_archive_sig=$(curl -f -X POST \ | ||||
|              --http1.1 \ | ||||
|              -H "PRIVATE-TOKEN: ${token}" \ | ||||
|              -F "file=@${archivename}.asc" \ | ||||
|             "https://code.ungleich.ch/api/v4/projects/${project}/uploads" \ | ||||
|              | sed "${sed_cmd}") || exit 1 | ||||
| 
 | ||||
|         # make release | ||||
|         changelog=$("$0" changelog-changes "$1" | sed 's/^[[:space:]]*//') | ||||
|         release_notes=$( | ||||
|             printf "%s\n\n%s\n\n**Changelog**\n\n%s\n" \ | ||||
|                 "${response_archive}" "${response_archive_sig}" "${changelog}" | ||||
|         ) | ||||
|         curl -f -X POST \ | ||||
|              -H "PRIVATE-TOKEN: ${token}" \ | ||||
|              -F "description=${release_notes}" \ | ||||
|             "https://code.ungleich.ch/api/v4/projects/${project}/repository/tags/${tag}/release" \ | ||||
|             || exit 1 | ||||
| 
 | ||||
|         # remove generated files (archive and asc) | ||||
|         if [ $# -eq 2 ] | ||||
|         then | ||||
|             rm -f "${archivename}" | ||||
|         fi | ||||
|         rm -f "${archivename}.asc" | ||||
|     ;; | ||||
| 
 | ||||
|     release) | ||||
|         set -e | ||||
|         target_version=$($0 changelog-version) | ||||
|         target_branch=$($0 version-branch) | ||||
| 
 | ||||
|         printf "Beginning release process for %s\n" "${target_version}" | ||||
| 
 | ||||
|         # First check everything is sane | ||||
|         "$0" check-date | ||||
|         "$0" check-unittest | ||||
|         "$0" check-pycodestyle | ||||
|         "$0" check-shellcheck | ||||
| 
 | ||||
|         # Generate version file to be included in packaging | ||||
|         "$0" target-version | ||||
| 
 | ||||
|         # Ensure the git status is clean, else abort | ||||
|         if ! git diff-index --name-only --exit-code HEAD ; then | ||||
|             printf "Unclean tree, see files above, aborting.\n" | ||||
|             exit 1 | ||||
|         fi | ||||
| 
 | ||||
|         # Ensure we are on the master branch | ||||
|         masterbranch=yes | ||||
|         if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ]; then | ||||
|             printf "Releases are happening from the master branch, aborting.\n" | ||||
| 
 | ||||
|             printf "Enter the magic word to release anyway:" | ||||
|             read -r magicword | ||||
| 
 | ||||
|             if [ "$magicword" = "iknowwhatido" ]; then | ||||
|                 masterbranch=no | ||||
|             else | ||||
|                 exit 1 | ||||
|             fi | ||||
|         fi | ||||
| 
 | ||||
|         if [ "$masterbranch" = yes ]; then | ||||
|             # Ensure version branch exists | ||||
|             if ! git rev-parse --verify "refs/heads/${target_branch}" 2>/dev/null; then | ||||
|                 git branch "$target_branch" | ||||
|             fi | ||||
| 
 | ||||
|             # Merge master branch into version branch | ||||
|             git checkout "$target_branch" | ||||
|             git merge master | ||||
|         fi | ||||
| 
 | ||||
|         # Verify that after the merge everything works | ||||
|         "$0" check-date | ||||
|         "$0" check-unittest | ||||
| 
 | ||||
|         # Generate documentation (man and html) | ||||
|         # First, clean old generated docs | ||||
|         make docs-clean | ||||
|         make docs | ||||
| 
 | ||||
|         #############################################################  | ||||
|         # Everything green, let's do the release | ||||
| 
 | ||||
|         # Tag the current commit | ||||
|         "$0" release-git-tag | ||||
| 
 | ||||
|         # Also merge back the version branch | ||||
|         if [ "$masterbranch" = yes ]; then | ||||
|             git checkout master | ||||
|             git merge "$target_branch" | ||||
|         fi | ||||
| 
 | ||||
|         # Publish git changes | ||||
|         # if you want to have mirror locally then uncomment this and comment below | ||||
|         #     git push --mirror | ||||
|             git push | ||||
|             # push also new branch and set up tracking | ||||
|             git push -u origin "${target_branch}" | ||||
|         # fi | ||||
| 
 | ||||
|         # Create and publish package for pypi | ||||
|         "$0" pypi-release | ||||
| 
 | ||||
|         # sign git tag | ||||
|         printf "Enter upstream repository authentication token: " | ||||
|         read -r token | ||||
|         "$0" sign-git-release "${target_version}" "${token}" | ||||
| 
 | ||||
|         # Announce change on ML | ||||
|         "$0" ml-release "${target_version}" | ||||
| 
 | ||||
|         cat << eof | ||||
| Manual steps post release: | ||||
|     - cdist-web | ||||
|     - send generated mailinglist.tmp mail | ||||
|     - twitter | ||||
| eof | ||||
|     ;; | ||||
| 
 | ||||
|     test) | ||||
|         if [ ! -f "cdist/version.py" ] | ||||
|         then | ||||
|             printf "cdist/version.py is missing, generate it first.\n" | ||||
|             exit 1 | ||||
|         fi | ||||
| 
 | ||||
|         PYTHONPATH="$(pwd -P)" | ||||
|         export PYTHONPATH | ||||
| 
 | ||||
|         if [ $# -lt 1 ]; then | ||||
|             python3 -m cdist.test | ||||
|         else | ||||
|             python3 -m unittest "$@" | ||||
|         fi | ||||
|     ;; | ||||
| 
 | ||||
|     test-remote) | ||||
|         if [ ! -f "cdist/version.py" ] | ||||
|         then | ||||
|             printf "cdist/version.py is missing, generate it first.\n" | ||||
|             exit 1 | ||||
|         fi | ||||
| 
 | ||||
|         PYTHONPATH="$(pwd -P)" | ||||
|         export PYTHONPATH | ||||
| 
 | ||||
|         python3 -m cdist.test.exec.remote | ||||
|     ;; | ||||
| 
 | ||||
|     pycodestyle|pep8) | ||||
|         pycodestyle "${basedir}" "${basedir}/scripts/cdist" | ||||
|     ;; | ||||
| 
 | ||||
|     check-pycodestyle) | ||||
|         "$0" pycodestyle | ||||
|         printf "\\nPlease review pycodestyle report.\\n" | ||||
|         while true | ||||
|         do | ||||
|             printf "Continue (yes/no)?\n" | ||||
|             any= | ||||
|             read -r any | ||||
|             case "$any" in | ||||
|                 yes) | ||||
|                     break | ||||
|                 ;; | ||||
|                 no) | ||||
|                     exit 1 | ||||
|                 ;; | ||||
|                 *) | ||||
|                     printf "Please answer with 'yes' or 'no' explicitly.\n" | ||||
|                 ;; | ||||
|         esac | ||||
|         done | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-global-explorers) | ||||
|         # shellcheck disable=SC2086 | ||||
|         find cdist/conf/explorer -type f -exec ${SHELLCHECKCMD} {} + | grep -v "${SHELLCHECK_SKIP}" > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-type-explorers) | ||||
|         # shellcheck disable=SC2086 | ||||
|         find cdist/conf/type -type f -path "*/explorer/*" -exec ${SHELLCHECKCMD} {} + | grep -v "${SHELLCHECK_SKIP}" > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-manifests) | ||||
|         # shellcheck disable=SC2086 | ||||
|         find cdist/conf/type -type f -name manifest -exec ${SHELLCHECKCMD} {} + | grep -v "${SHELLCHECK_SKIP}" > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-local-gencodes) | ||||
|         # shellcheck disable=SC2086 | ||||
|         find cdist/conf/type -type f -name gencode-local -exec ${SHELLCHECKCMD} {} + | grep -v "${SHELLCHECK_SKIP}" > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-remote-gencodes) | ||||
|         # shellcheck disable=SC2086 | ||||
|         find cdist/conf/type -type f -name gencode-remote -exec ${SHELLCHECKCMD} {} + | grep -v "${SHELLCHECK_SKIP}" > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-scripts) | ||||
|         # shellcheck disable=SC2086 | ||||
|         ${SHELLCHECKCMD} scripts/cdist-dump scripts/cdist-new-type > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-gencodes) | ||||
|         "$0" shellcheck-local-gencodes || exit 1 | ||||
|         "$0" shellcheck-remote-gencodes || exit 1 | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-types) | ||||
|         "$0" shellcheck-type-explorers || exit 1 | ||||
|         "$0" shellcheck-manifests || exit 1 | ||||
|         "$0" shellcheck-gencodes || exit 1 | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck) | ||||
|         "$0" shellcheck-global-explorers || exit 1 | ||||
|         "$0" shellcheck-types || exit 1 | ||||
|         "$0" shellcheck-scripts || exit 1 | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-type-files) | ||||
|         # shellcheck disable=SC2086 | ||||
|         find cdist/conf/type -type f -path "*/files/*" -exec ${SHELLCHECKCMD} {} + | grep -v "${SHELLCHECK_SKIP}" > "${SHELLCHECKTMP}" | ||||
|         test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-with-files) | ||||
|         "$0" shellcheck || exit 1 | ||||
|         "$0" shellcheck-type-files || exit 1 | ||||
|     ;; | ||||
| 
 | ||||
|     shellcheck-build-helper) | ||||
|         ${SHELLCHECKCMD} ./bin/build-helper | ||||
|     ;; | ||||
| 
 | ||||
|     check-shellcheck) | ||||
|         "$0" shellcheck | ||||
|         printf "\\nPlease review shellcheck report.\\n" | ||||
|         while true | ||||
|         do | ||||
|             printf "Continue (yes/no)?\n" | ||||
|             any= | ||||
|             read -r any | ||||
|             case "$any" in | ||||
|                 yes) | ||||
|                     break | ||||
|                 ;; | ||||
|                 no) | ||||
|                     exit 1 | ||||
|                 ;; | ||||
|                 *) | ||||
|                     printf "Please answer with 'yes' or 'no' explicitly.\n" | ||||
|                 ;; | ||||
|         esac | ||||
|         done | ||||
|     ;; | ||||
| 
 | ||||
|     version-branch) | ||||
|         "$0" changelog-version | cut -d. -f '1,2' | ||||
|     ;; | ||||
| 
 | ||||
|     version) | ||||
|         printf "VERSION = \"%s\"\n" "$(git describe)" > cdist/version.py | ||||
|     ;; | ||||
| 
 | ||||
|     target-version) | ||||
|         target_version=$($0 changelog-version) | ||||
|         printf "VERSION = \"%s\"\n" "${target_version}" > cdist/version.py | ||||
|     ;; | ||||
| 
 | ||||
|     clean) | ||||
|         make clean | ||||
| 
 | ||||
|         # Archlinux | ||||
|         rm -f cdist-*.pkg.tar.xz cdist-*.tar.gz | ||||
|         rm -rf pkg/ src/ | ||||
| 
 | ||||
|         rm -f MANIFEST PKGBUILD | ||||
|         rm -rf dist/ | ||||
| 
 | ||||
|         # Signed release | ||||
|         rm -f cdist-*.tar.gz | ||||
|         rm -f cdist-*.tar.gz.asc | ||||
| 
 | ||||
|         # Temp files | ||||
|         rm -f ./*.tmp | ||||
|         rm -f ./.*.tmp | ||||
|     ;; | ||||
| 
 | ||||
|     distclean) | ||||
|         "$0" clean | ||||
|         rm -f cdist/version.py | ||||
|     ;; | ||||
|     *) | ||||
|         printf "Unknown target: '%s'.\n" "${option}" >&2 | ||||
|         usage "${basename}" | ||||
|         exit 1 | ||||
|     ;; | ||||
| 
 | ||||
| esac | ||||
							
								
								
									
										355
									
								
								bin/cdist-config
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										355
									
								
								bin/cdist-config
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,355 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| __cdist_version="1.8.0" | ||||
| 
 | ||||
| # | ||||
| # Enable debugging: | ||||
| # | ||||
| # __cdist_debug unset -> no debug | ||||
| # __cdist_debug = 1 -> debug via __cdist_echo | ||||
| # __cdist_debug = 2 -> debug via set -x | ||||
| # | ||||
| 
 | ||||
| : ${__cdist_debug:=0} | ||||
| [ "$__cdist_debug" = 2 ] && set -x | ||||
| 
 | ||||
| # Fail if something bogus is going on | ||||
| set -u | ||||
| 
 | ||||
| ################################################################################ | ||||
| # 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" | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Names / Constants | ||||
| # | ||||
| # Most values can be overriden from outside, so you can | ||||
| # customise paths as you like (for distributors, geeks and hackers) | ||||
| # | ||||
| 
 | ||||
| : ${__cdist_name_bin:=bin} | ||||
| : ${__cdist_name_cache:=cache} | ||||
| : ${__cdist_name_code:=code} | ||||
| : ${__cdist_name_conf_dir:=conf} | ||||
| : ${__cdist_name_core_dir:=core} | ||||
| : ${__cdist_name_dot_cdist:=.cdist} | ||||
| : ${__cdist_name_explorer:=explorer} | ||||
| : ${__cdist_name_gencode:=gencode} | ||||
| : ${__cdist_name_gencode_local:=local} | ||||
| : ${__cdist_name_gencode_remote:=remote} | ||||
| : ${__cdist_name_global:=global} | ||||
| : ${__cdist_name_host:=host} | ||||
| : ${__cdist_name_init:=init} | ||||
| : ${__cdist_name_manifest:=manifest} | ||||
| : ${__cdist_name_object:=object} | ||||
| : ${__cdist_name_object_finished:=done} | ||||
| : ${__cdist_name_object_prepared:=prepared} | ||||
| : ${__cdist_name_object_id:=object_id} | ||||
| : ${__cdist_name_object_source:=source} | ||||
| : ${__cdist_name_objects_created:=.objects_created} | ||||
| : ${__cdist_name_out_dir:=out} | ||||
| : ${__cdist_name_parameter:=parameter} | ||||
| : ${__cdist_name_parameter_required:=required} | ||||
| : ${__cdist_name_parameter_optional:=optional} | ||||
| : ${__cdist_name_require:=require} | ||||
| : ${__cdist_name_self:=self} | ||||
| : ${__cdist_name_singleton:=singleton} | ||||
| : ${__cdist_name_target_host:=target_host} | ||||
| : ${__cdist_name_target_user:=target_user} | ||||
| : ${__cdist_name_type:=type} | ||||
| : ${__cdist_name_type_bin:=type_bin} | ||||
| : ${__cdist_name_type_explorer:=type_explorer} | ||||
| : ${__cdist_name_type_explorer_pushed:=.explorer_pushed} | ||||
| 
 | ||||
| # Used for IDs: Allow everything not starting with - and . | ||||
| : ${__cdist_sane_regexp:=[^-\.].*} | ||||
| 
 | ||||
| # Default remote user | ||||
| : ${__cdist_remote_user:=root} | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Exported variable names (usable for non core) | ||||
| # | ||||
| : ${__cdist_name_var_explorer:=__$__cdist_name_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_target_host:=__$__cdist_name_target_host} | ||||
| : ${__cdist_name_var_target_user:=__$__cdist_name_target_user} | ||||
| : ${__cdist_name_var_object:=__$__cdist_name_object} | ||||
| : ${__cdist_name_var_object_id:=__$__cdist_name_object_id} | ||||
| : ${__cdist_name_var_self:=__$__cdist_name_self} | ||||
| : ${__cdist_name_var_type:=__$__cdist_name_type} | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Tempfiles | ||||
| #  | ||||
| : ${__cdist_tmp_base_dir=/tmp} | ||||
| __cdist_tmp_dir=$(mktemp -d "$__cdist_tmp_base_dir/cdist.XXXXXXXXXXXX") | ||||
| __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX") | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Local Base | ||||
| #  | ||||
| : ${__cdist_local_base_dir:=$__cdist_tmp_dir} | ||||
| 
 | ||||
| # Cache may *NOT* be below __cdist_local_base_dir! | ||||
| : ${__cdist_local_base_cache_dir:=$__cdist_abs_mydir/../$__cdist_name_cache} | ||||
| 
 | ||||
| : ${__cdist_conf_dir:="$(cd "$__cdist_abs_mydir/../conf" && pwd -P)"} | ||||
| : ${__cdist_core_dir:="$(cd "$__cdist_abs_mydir/../$__cdist_name_core_dir" && pwd -P)"} | ||||
| 
 | ||||
| : ${__cdist_explorer_dir:=$__cdist_conf_dir/$__cdist_name_explorer} | ||||
| : ${__cdist_manifest_dir:=$__cdist_conf_dir/$__cdist_name_manifest} | ||||
| : ${__cdist_manifest_init:=$__cdist_manifest_dir/$__cdist_name_init} | ||||
| : ${__cdist_type_dir:=$__cdist_conf_dir/$__cdist_name_type} | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Local output | ||||
| #  | ||||
| : ${__cdist_out_dir:=$__cdist_local_base_dir/$__cdist_name_out_dir} | ||||
| : ${__cdist_out_explorer_dir:=$__cdist_out_dir/$__cdist_name_explorer} | ||||
| : ${__cdist_out_object_dir:=$__cdist_out_dir/$__cdist_name_object} | ||||
| : ${__cdist_out_type_dir:=$__cdist_out_dir/$__cdist_name_type} | ||||
| : ${__cdist_out_type_bin_dir:=$__cdist_out_dir/$__cdist_name_type_bin} | ||||
| 
 | ||||
| : ${__cdist_objects_created:=$__cdist_out_object_dir/$__cdist_name_objects_created} | ||||
| 
 | ||||
| ################################################################################ | ||||
| # 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_core_dir:=$__cdist_remote_base_dir/$__cdist_name_core_dir} | ||||
| 
 | ||||
| : ${__cdist_remote_explorer_dir:=$__cdist_remote_conf_dir/$__cdist_name_explorer} | ||||
| : ${__cdist_remote_type_dir:=$__cdist_remote_conf_dir/$__cdist_name_type} | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Remote output | ||||
| # | ||||
| : ${__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_dir:=$__cdist_remote_out_dir/$__cdist_name_object} | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Internal functions | ||||
| # | ||||
| 
 | ||||
| # *NEW* Load functions from library | ||||
| for __cdist_lib in $__cdist_core_dir/*; do | ||||
|    # echo Loading $__cdist_lib ... | ||||
|    . "$__cdist_lib" | ||||
| done | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Cache | ||||
| # | ||||
| __cdist_cache_dir() | ||||
| { | ||||
|    cd "${__cdist_local_base_cache_dir}" && pwd -P | ||||
| } | ||||
| 
 | ||||
| __cdist_host_cache_dir() | ||||
| { | ||||
|    echo "$(__cdist_cache_dir)/$1"  | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Object | ||||
| # | ||||
| 
 | ||||
| __cdist_object_code() | ||||
| { | ||||
|    echo "$(__cdist_object_dir "$1")/${__cdist_name_code}-$2" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_prepared() | ||||
| { | ||||
|    echo "$(__cdist_object_dir "$1")/${__cdist_name_object_prepared}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_finished() | ||||
| { | ||||
|    echo "$(__cdist_object_dir "$1")/${__cdist_name_object_finished}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_dir() | ||||
| { | ||||
|    echo "$(__cdist_object_base_dir "$1")/${__cdist_name_dot_cdist}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_base_dir() | ||||
| { | ||||
|    echo "${__cdist_out_object_dir}/$1" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_id_from_object() | ||||
| { | ||||
|    echo "${1#*/}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_parameter_dir() | ||||
| { | ||||
|    echo "$(__cdist_object_dir "$1")/${__cdist_name_parameter}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_require() | ||||
| { | ||||
|    echo "$(__cdist_object_dir "$1")/${__cdist_name_require}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_source_name() | ||||
| { | ||||
|    echo "$1/${__cdist_name_object_source}" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_source() | ||||
| { | ||||
|    cat "$(__cdist_object_source_name "$1")" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_source_add() | ||||
| { | ||||
|    echo "$__cdist_manifest" >> "$(__cdist_object_source_name "$1")" | ||||
| } | ||||
| 
 | ||||
| __cdist_object_type_explorer_dir() | ||||
| { | ||||
|    echo "$(__cdist_object_dir "$1")/${__cdist_name_explorer}" | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Remote | ||||
| # | ||||
| 
 | ||||
| __cdist_remote_object_base_dir() | ||||
| { | ||||
|    echo "${__cdist_remote_out_object_dir}/$1" | ||||
| } | ||||
| 
 | ||||
| __cdist_remote_object_dir() | ||||
| { | ||||
|    echo "$(__cdist_remote_object_base_dir "$1")/${__cdist_name_dot_cdist}" | ||||
| } | ||||
| 
 | ||||
| __cdist_remote_object_code() | ||||
| { | ||||
|    # FIXME: this should probably be __cdist_name_CODE_remote instead, although | ||||
|    # they have the same name always | ||||
|    echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_code}-${__cdist_name_gencode_remote}" | ||||
| } | ||||
| 
 | ||||
| __cdist_remote_object_parameter_dir() | ||||
| { | ||||
|    echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_parameter}" | ||||
| } | ||||
| 
 | ||||
| __cdist_remote_object_type_explorer_dir() | ||||
| { | ||||
|    echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_explorer}" | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| __cdist_remote_type_explorer_dir() | ||||
| { | ||||
|    echo "${__cdist_remote_type_dir}/$1/${__cdist_name_explorer}" | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Traps | ||||
| # | ||||
| 
 | ||||
| # Remove tempfiles at normal exit | ||||
| trap __cdist_tmp_removal EXIT | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Type | ||||
| # | ||||
| __cdist_type_dir() | ||||
| { | ||||
|    echo "${__cdist_type_dir}/$1" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_explorer_dir() | ||||
| { | ||||
|    echo "${__cdist_type_dir}/$1/${__cdist_name_explorer}" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_from_object() | ||||
| { | ||||
|    echo "${1%%/*}" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_explorer_pushed() | ||||
| { | ||||
|    [ -f "${__cdist_out_type_dir}/${__cdist_name_type_explorer_pushed}" ] \ | ||||
|       && grep -q "$1" "${__cdist_out_type_dir}/${__cdist_name_type_explorer_pushed}" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_explorer_pushed_add() | ||||
| { | ||||
|    [ -d "$__cdist_out_type_dir" ] || mkdir "$__cdist_out_type_dir" | ||||
|    echo "$1" >> "${__cdist_out_type_dir}/${__cdist_name_type_explorer_pushed}" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_gencode() | ||||
| { | ||||
|    echo "${__cdist_type_dir}/$1/${__cdist_name_gencode}-$2" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_manifest() | ||||
| { | ||||
|    echo "${__cdist_type_dir}/$1/${__cdist_name_manifest}" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_parameter_dir() | ||||
| { | ||||
|    echo "$(__cdist_type_dir "$1")/${__cdist_name_parameter}" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_parameter_optional() | ||||
| { | ||||
|    echo "$(__cdist_type_parameter_dir "$1")/$__cdist_name_parameter_optional" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_parameter_required() | ||||
| { | ||||
|    echo "$(__cdist_type_parameter_dir "$1")/$__cdist_name_parameter_required" | ||||
| } | ||||
| 
 | ||||
| __cdist_type_singleton() | ||||
| { | ||||
|    echo "${__cdist_type_dir}/$1/${__cdist_name_singleton}" | ||||
| } | ||||
							
								
								
									
										63
									
								
								bin/cdist-deploy-to
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										63
									
								
								bin/cdist-deploy-to
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,63 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Deploy configuration to a host | ||||
| # | ||||
| 
 | ||||
| . cdist-config | ||||
| [ $# -eq 1 ] || __cdist_usage "<target host>" | ||||
| set -eu | ||||
| 
 | ||||
| # Kill children on interrupt - only in interactive scripts | ||||
| trap __cdist_kill_on_interrupt INT TERM | ||||
| 
 | ||||
| __cdist_target_host="$1" | ||||
| 
 | ||||
| # Make target host available for non-core | ||||
| export $__cdist_name_var_target_host="$__cdist_target_host" | ||||
| export $__cdist_name_var_target_user="$__cdist_remote_user" | ||||
| 
 | ||||
| # Export variables for core, which others do not reset | ||||
| export __cdist_local_base_dir | ||||
| export __cdist_core_dir | ||||
| 
 | ||||
| __cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host " | ||||
| 
 | ||||
| ################################################################################ | ||||
| # See cdist-stages(7) | ||||
| # | ||||
| 
 | ||||
| # Prepare local and remote directories | ||||
| __cdist_init_deploy           "$__cdist_target_host" | ||||
| 
 | ||||
| # Transfer cdist executables | ||||
| __cdist_echo info "Transferring cdist binaries/functions to the target host " | ||||
| __cdist_dir push "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}" | ||||
| __cdist_dir push "${__cdist_core_dir}" "${__cdist_remote_core_dir}" | ||||
| 
 | ||||
| __cdist_explorer_run_global | ||||
| __cdist_manifest_run_init | ||||
| __cdist_object_all            __cdist_object_prepare | ||||
| __cdist_object_all            __cdist_object_run | ||||
| unset __cdist_object_self | ||||
| 
 | ||||
| __cdist_cache | ||||
| 
 | ||||
| __cdist_echo info "cdist $__cdist_version: Successfully finished run" | ||||
							
								
								
									
										33
									
								
								bin/cdist-env
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								bin/cdist-env
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Setup environment for use with cdist - must be standalone! | ||||
| # | ||||
| 
 | ||||
| export PATH="$(cd "${0%/*}" && pwd -P):$PATH" | ||||
| export MANPATH="$(cd "${0%/*}/../doc/man" && pwd -P):$MANPATH" | ||||
| 
 | ||||
| if [ "$(echo ${SHELL##*/} | grep 'csh$')" ]; then | ||||
|    echo setenv PATH $PATH \; | ||||
|    echo setenv MANPATH $MANPATH | ||||
| else | ||||
|    echo export PATH=$PATH | ||||
|    echo export MANPATH=$MANPATH | ||||
| fi | ||||
							
								
								
									
										75
									
								
								bin/cdist-mass-deploy
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								bin/cdist-mass-deploy
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,75 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Deploy configuration to many hosts | ||||
| # | ||||
| 
 | ||||
| . cdist-config | ||||
| [ $# -ge 1 ] || __cdist_usage "[-p] <target host> [target host ]" | ||||
| set -u | ||||
| 
 | ||||
| # Kill children on interrupt - only in interactive scripts | ||||
| trap __cdist_kill_on_interrupt INT TERM | ||||
| 
 | ||||
| filter() | ||||
| { | ||||
|    awk -v host=$1 '{ print "[" host "] " $0 }' | ||||
| } | ||||
| 
 | ||||
| parallel="" | ||||
| if [ "$1" = "-p" ]; then | ||||
|    parallel=yes | ||||
|    shift | ||||
| fi | ||||
| 
 | ||||
| i=0 | ||||
| while [ $# -gt 0 ]; do | ||||
|    if [ "$parallel" ]; then | ||||
|       cdist-deploy-to "$1" 2>&1 | filter "$1" & | ||||
|       # Record pid and host for use later | ||||
|       i=$((i+1)) | ||||
|       eval pid_$i=$! | ||||
|       eval host_$i=\$1 | ||||
|    else | ||||
|       cdist-deploy-to "$1" 2>&1 | filter "$1" | ||||
|    fi | ||||
|    shift | ||||
| done | ||||
| 
 | ||||
| e=0 | ||||
| if [ "$parallel" ]; then | ||||
|    __cdist_echo info "Waiting for cdist-deploy-to jobs to finish" | ||||
|    while [ "$i" -gt 0 ]; do | ||||
|       eval pid=\$pid_$i | ||||
|       wait "$pid" | ||||
|       if [ $? -ne 0 ]; then | ||||
|          e=$((e+1)) | ||||
|          eval e_host_$e=\$host_$i | ||||
|       fi | ||||
|       i=$((i-1)) | ||||
|    done | ||||
| fi | ||||
| 
 | ||||
| # Display all failed hosts after all runs are done, so the sysadmin gets them | ||||
| while [ "$e" -gt 0 ]; do | ||||
|    eval host=\$host_$e | ||||
|    __cdist_echo error "Configuration of host $host failed." | ||||
|    e=$((e-1)) | ||||
| done | ||||
							
								
								
									
										310
									
								
								bin/cdist-quickstart
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										310
									
								
								bin/cdist-quickstart
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,310 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Give the user an introduction into cdist | ||||
| # | ||||
| 
 | ||||
| . cdist-config | ||||
| set -eu | ||||
| 
 | ||||
| banner="cdist-quickstart>" | ||||
| continue="Press enter to continue or ctrl-c to abort." | ||||
| create_continue="Press enter to create the described files/directories" | ||||
| 
 | ||||
| __prompt() | ||||
| { | ||||
|    echo -n "$banner" "$@" | ||||
|    read answer | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Intro of quickstart | ||||
| # | ||||
| cat << eof | ||||
| $banner cdist version $__cdist_version | ||||
| 
 | ||||
| Welcome to the interactive guide to cdist! | ||||
| This is the interactive tutorial and beginners help for cdist and here's | ||||
| our schedule: | ||||
| 
 | ||||
|    - Stages:   How cdist operates | ||||
|    - Explorer: Explore facts of the target host | ||||
|    - Manifest: Map configurations to hosts | ||||
|    - Types:    Bundled functionality | ||||
|    - Deploy a configuration to the local host! | ||||
| 
 | ||||
| eof | ||||
| __prompt "$continue" | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Stages | ||||
| # | ||||
| cat << eof | ||||
| 
 | ||||
| To deploy configurations to a host, you call | ||||
| 
 | ||||
|    cdist-deploy-to <hostname> | ||||
| 
 | ||||
| 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(1), cdist-stages(7) | ||||
| 
 | ||||
| eof | ||||
| __prompt "$continue" | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Explorer | ||||
| # | ||||
| cat << eof | ||||
| 
 | ||||
| The first thing cdist always does is running different explorers on the | ||||
| target host. The explorers can be found in the directory | ||||
| 
 | ||||
|    ${__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 | ||||
| explorer="${__cdist_explorer_dir}/os" | ||||
| 
 | ||||
| __prompt "Press enter to execute $explorer" | ||||
| 
 | ||||
| set -x | ||||
| "$explorer" | ||||
| set +x | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Manifest | ||||
| # | ||||
| cat << eof | ||||
| 
 | ||||
| The initial manifest is the entry point for cdist to find out, what you would | ||||
| like to have configured. It is located at | ||||
| 
 | ||||
|    ${__cdist_manifest_init} | ||||
| 
 | ||||
| And can be as simple as | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| __file /etc/cdist-configured --type file | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 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" | ||||
| 
 | ||||
| ################################################################################ | ||||
| # 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 a host! | ||||
| 
 | ||||
| Ensure that you have a ssh server running on the host and that you can login as root. | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
| __prompt "Enter hostname or press enter for localhost: " | ||||
| 
 | ||||
| if [ "$answer" ]; then | ||||
|    host="$answer" | ||||
| else | ||||
|    host="localhost" | ||||
| fi | ||||
| 
 | ||||
| manifestinit="conf/manifest/init" | ||||
| cat << eof | ||||
| 
 | ||||
| I'll know setup $manifestinit, containing the following code: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| # Every machine becomes a marker, so sysadmins know that automatic | ||||
| # configurations are happening | ||||
| __file /etc/cdist-configured | ||||
| 
 | ||||
| case "\$__target_host" in | ||||
|    $host) | ||||
|       __link /tmp/cdist-testfile --source /etc/cdist-configured  --type symbolic | ||||
|       __addifnosuchline /tmp/cdist-welcome --line "Welcome to cdist" | ||||
|    ;; | ||||
| esac | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| WARNING: This will overwrite ${manifestinit}. | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
| cat > "$__cdist_abs_mydir/../$manifestinit" << eof | ||||
| 
 | ||||
| # Every machine becomes a marker, so sysadmins know that automatic | ||||
| # configurations are happening | ||||
| __file /etc/cdist-configured | ||||
| 
 | ||||
| case "\$__target_host" in | ||||
|    $host) | ||||
|       __link /tmp/cdist-testfile --source /etc/cdist-configured  --type symbolic | ||||
|       __addifnosuchline /tmp/cdist-welcome --line "Welcome to cdist" | ||||
|    ;; | ||||
| esac | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
| chmod u+x "$__cdist_abs_mydir/../$manifestinit" | ||||
| 
 | ||||
| cmd="cdist-deploy-to $host" | ||||
| 
 | ||||
| __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-quickstart. | ||||
| 
 | ||||
| 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 | ||||
							
								
								
									
										182
									
								
								bin/cdist-type-emulator
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										182
									
								
								bin/cdist-type-emulator
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,182 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| #  | ||||
| # Wrapper script that generates cconfig from arguments | ||||
| # | ||||
| # This script will be called everytime the manifest decides to create | ||||
| # a new type | ||||
| # | ||||
| 
 | ||||
| . cdist-config | ||||
| set -u | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Prepare object and type | ||||
| # | ||||
| 
 | ||||
| __cdist_type="$__cdist_myname" | ||||
| 
 | ||||
| # Find out whether type is a singleton or regular type | ||||
| if [ -f "$(__cdist_type_singleton "$__cdist_type")" ]; then | ||||
|    __cdist_object_id="$__cdist_name_singleton" | ||||
| else | ||||
|    [ $# -ge 1 ] || __cdist_usage "<id> <options>" | ||||
|    __cdist_object_id="$1"; shift | ||||
| fi | ||||
| 
 | ||||
| # Verify object id | ||||
| __cdist_object_id_sane=$(echo "$__cdist_object_id" | grep "^${__cdist_sane_regexp}\$") | ||||
| if [ -z "$__cdist_object_id_sane" ]; then | ||||
|    __cdist_usage "Insane object id, ${__cdist_object_id}." | ||||
| fi | ||||
| 
 | ||||
| # Prevent double slash if id begins with / | ||||
| if [ "$(echo $__cdist_object_id | grep "^/")" ]; then | ||||
|    __cdist_object_self="${__cdist_type}${__cdist_object_id}" | ||||
| else | ||||
|    __cdist_object_self="${__cdist_type}/${__cdist_object_id}" | ||||
| fi | ||||
| ################################################################################ | ||||
| # Internal quirks | ||||
| # | ||||
| 
 | ||||
| # Append id for error messages | ||||
| __cdist_myname="$__cdist_myname ($__cdist_object_id)" | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Create object in tmpdir first | ||||
| # | ||||
| 
 | ||||
| # Save original destination | ||||
| __cdist_out_object_dir_orig="$__cdist_out_object_dir" | ||||
| 
 | ||||
| # Store to tmp now | ||||
| __cdist_out_object_dir="$__cdist_tmp_dir" | ||||
| 
 | ||||
| __cdist_new_object_dir="$(__cdist_object_dir "$__cdist_object_self")" | ||||
| 
 | ||||
| # Initialise object | ||||
| mkdir -p "${__cdist_new_object_dir}" | ||||
| 
 | ||||
| # Record parameter | ||||
| __cdist_parameter_dir="$(__cdist_object_parameter_dir "$__cdist_object_self")" | ||||
| mkdir -p "${__cdist_parameter_dir}" | ||||
| 
 | ||||
| while [ $# -gt 0 ]; do | ||||
|    opt="$1"; shift | ||||
| 
 | ||||
|    echo "$opt" | grep -q "^--${__cdist_sane_regexp}\$" || \ | ||||
|       __cdist_usage "Provide sane options" | ||||
| 
 | ||||
|    opt_file="${opt#--}" | ||||
| 
 | ||||
|    [ $# -ge 1 ] || __cdist_usage "Missing value for $opt" | ||||
| 
 | ||||
|    value="$1"; shift | ||||
| 
 | ||||
|    echo "${value}" > "${__cdist_parameter_dir}/${opt_file}" | ||||
| done | ||||
| 
 | ||||
| # Record requirements | ||||
| # it's fine, if it's not set | ||||
| set +u | ||||
| for requirement in $require; do | ||||
|    echo $requirement >> "$(__cdist_object_require "$__cdist_object_self")" | ||||
|    __cdist_echo info "Recording requirement $requirement" | ||||
| done | ||||
| set -u | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Check newly created object | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Ensure required parameters are given | ||||
| # | ||||
| if [ -f "$(__cdist_type_parameter_required "$__cdist_type")" ]; then | ||||
|    while read required; do | ||||
|       if [ ! -f "${__cdist_parameter_dir}/${required}" ]; then | ||||
|          __cdist_usage "Missing required parameter $required" | ||||
|       fi | ||||
|    done < "$(__cdist_type_parameter_required "$__cdist_type")" | ||||
| fi | ||||
| 
 | ||||
| # | ||||
| # Ensure that only optional or required parameters are given | ||||
| # | ||||
| 
 | ||||
| if [ -f "$(__cdist_type_parameter_optional "$__cdist_type")" ]; then | ||||
|    cat "$(__cdist_type_parameter_optional "$__cdist_type")" > \ | ||||
|       "$__cdist_tmp_file" | ||||
| fi | ||||
|   | ||||
| if [ -f "$(__cdist_type_parameter_required "$__cdist_type")" ]; then | ||||
|    cat "$(__cdist_type_parameter_required "$__cdist_type")" >> \ | ||||
|       "$__cdist_tmp_file" | ||||
| fi | ||||
|     | ||||
| cd "$__cdist_parameter_dir" | ||||
| for parameter in $(ls -1); do | ||||
|    is_valid=$(grep "^$parameter\$" "$__cdist_tmp_file") | ||||
| 
 | ||||
|    [ "$is_valid" ] || __cdist_usage "Unknown parameter $parameter" | ||||
| done | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Merge object | ||||
| # | ||||
| # Restore original destination | ||||
| __cdist_out_object_dir="$__cdist_out_object_dir_orig" | ||||
| 
 | ||||
| __cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")" | ||||
| 
 | ||||
| # | ||||
| # If the object already exists and is exactly the same, merge it. Otherwise fail. | ||||
| # | ||||
| if [ -e "${__cdist_object_dir}" ]; then | ||||
|    # Allow diff to fail | ||||
|    set +e | ||||
|    diff -ru "${__cdist_new_object_dir}/${__cdist_name_parameter}" \ | ||||
|       "${__cdist_object_dir}/${__cdist_name_parameter}"           \ | ||||
|       > "$__cdist_tmp_file"; ret=$? | ||||
|    set -e | ||||
|     | ||||
|    if [ "$ret" != 0 ]; then | ||||
|       # Go to standard error | ||||
|       exec >&2 | ||||
|       echo "${__cdist_object_self} already exists differently." | ||||
|       echo "Recorded source(s):" | ||||
|       __cdist_object_source "${__cdist_object_dir}" | ||||
|       echo "Differences:" | ||||
|       cat "$__cdist_tmp_file" | ||||
|       __cdist_exit_err "Aborting due to object conflict." | ||||
|    fi | ||||
| else | ||||
|    # | ||||
|    # Move object into tree: | ||||
|    # Create full path minus .cdist and move .cdist | ||||
|    # | ||||
|    __cdist_new_object_base_dir="$(__cdist_object_base_dir "$__cdist_object_self")" | ||||
|    mkdir -p "$__cdist_new_object_base_dir" | ||||
|    mv "$__cdist_new_object_dir"  "$__cdist_new_object_base_dir" | ||||
| fi | ||||
| 
 | ||||
| # Add "I was here message" | ||||
| __cdist_object_source_add "${__cdist_object_dir}" | ||||
							
								
								
									
										83
									
								
								bin/cdist-type-template
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										83
									
								
								bin/cdist-type-template
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,83 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Create a new type from scratch | ||||
| # | ||||
| 
 | ||||
| . cdist-config | ||||
| [ $# -eq 1 ] || __cdist_usage "<type>" | ||||
| set -eu | ||||
| 
 | ||||
| __cdist_type="$1"; shift | ||||
| __cdist_my_type_dir="$(__cdist_type_dir "$__cdist_type")" | ||||
| 
 | ||||
| if [ -d "$__cdist_my_type_dir" ]; then | ||||
|    __cdist_usage "Type $__cdist_type already exists" | ||||
| fi | ||||
| 
 | ||||
| echo "Creating type $__cdist_type in $__cdist_my_type_dir ..." | ||||
| # Base | ||||
| mkdir -p "$__cdist_my_type_dir" | ||||
| 
 | ||||
| # Parameter | ||||
| mkdir -p "$(__cdist_type_parameter_dir "$__cdist_type")" | ||||
| touch "$(__cdist_type_parameter_dir "$__cdist_type")/${__cdist_name_parameter_required}" | ||||
| touch "$(__cdist_type_parameter_dir "$__cdist_type")/${__cdist_name_parameter_optional}" | ||||
| 
 | ||||
| # Manifest | ||||
| cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$__cdist_my_type_dir/${__cdist_name_manifest}" | ||||
| 
 | ||||
| # | ||||
| # This is the manifest, which can be used to create other objects like this: | ||||
| # __file /path/to/destination --source /from/where/ | ||||
| # | ||||
| # To tell cdist to make use of it, you need to make it executable (chmod +x) | ||||
| # | ||||
| # | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
| # Gencode remote | ||||
| cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}-${__cdist_name_gencode_remote}" | ||||
| 
 | ||||
| # | ||||
| # This file should generate code on stdout, which will be collected by cdist | ||||
| # and run on the target. | ||||
| # | ||||
| # To tell cdist to make use of it, you need to make it executable (chmod +x) | ||||
| # | ||||
| # | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
| cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}-${__cdist_name_gencode_local}" | ||||
| 
 | ||||
| # | ||||
| # This file should generate code on stdout, which will be collected by cdist | ||||
| # and run on the same machine cdist-deploy-to is executed. | ||||
| # | ||||
| # To tell cdist to make use of it, you need to make it executable (chmod +x) | ||||
| # | ||||
| # | ||||
| 
 | ||||
| eof | ||||
| 
 | ||||
| # Explorer | ||||
| mkdir -p "$__cdist_my_type_dir/${__cdist_name_explorer}" | ||||
							
								
								
									
										139
									
								
								build.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										139
									
								
								build.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,139 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Push a directory to a target, both sides have the same name (i.e. explorers) | ||||
| # or | ||||
| # Pull a directory from a target, both sides have the same name (i.e. explorers) | ||||
| # | ||||
| 
 | ||||
| # exit on any error | ||||
| #set -e | ||||
| 
 | ||||
| # Manpage and HTML | ||||
| A2XM="a2x -f manpage --no-xmllint" | ||||
| A2XH="a2x -f xhtml --no-xmllint" | ||||
| 
 | ||||
| # Developer webbase | ||||
| WEBDIR=$HOME/niconetz | ||||
| WEBBASE=software/cdist | ||||
| WEBPAGE=${WEBBASE}.mdwn | ||||
| 
 | ||||
| # Documentation | ||||
| MANDIR=doc/man | ||||
| MAN1DSTDIR=${MANDIR}/man1 | ||||
| MAN7DSTDIR=${MANDIR}/man7 | ||||
| SPEECHESDIR=doc/speeches | ||||
| 
 | ||||
| case "$1" in | ||||
|    man) | ||||
|       set -e | ||||
|       "$0" mangen | ||||
|       "$0" mantype | ||||
|       "$0" manbuild | ||||
|    ;; | ||||
| 
 | ||||
|    manbuild) | ||||
|       trap abort INT | ||||
|       abort() { | ||||
|          kill 0 | ||||
|       } | ||||
|       for section in 1 7; do | ||||
|          for src in ${MANDIR}/man${section}/*.text; do | ||||
|             manpage="${src%.text}.$section" | ||||
|             if [ ! -f "$manpage" -o "$manpage" -ot "$src" ]; then | ||||
|                echo "Compiling man page for $src" | ||||
|                $A2XM "$src" | ||||
|             fi | ||||
|             htmlpage="${src%.text}.html" | ||||
|             if [ ! -f "$htmlpage" -o "$htmlpage" -ot "$src" ]; then | ||||
|                echo "Compiling html page for $src" | ||||
|                $A2XH "$src" | ||||
|             fi | ||||
|          done | ||||
|       done | ||||
|    ;; | ||||
| 
 | ||||
|    mantype) | ||||
| 	   for mansrc in conf/type/*/man.text; do | ||||
|          dst="$(echo $mansrc | sed -e 's;conf/;cdist-;'  -e 's;/;;' -e 's;/man;;' -e 's;^;doc/man/man7/;')" | ||||
|          ln -sf "../../../$mansrc" "$dst" | ||||
|       done | ||||
|    ;; | ||||
| 
 | ||||
|    mangen) | ||||
|       ${MANDIR}/cdist-reference.text.sh | ||||
|    ;; | ||||
| 
 | ||||
|    release) | ||||
|       "$0" clean && "$0" man && "$0" web | ||||
|    ;; | ||||
| 
 | ||||
|    speeches) | ||||
|       cd "$SPEECHESDIR" | ||||
|       for speech in *tex; do | ||||
|          pdflatex "$speech" | ||||
|          pdflatex "$speech" | ||||
|          pdflatex "$speech" | ||||
|       done | ||||
|    ;; | ||||
|        | ||||
|    web) | ||||
|       cp README ${WEBDIR}/${WEBPAGE} | ||||
|       rm -rf ${WEBDIR}/${WEBBASE}/man && mkdir ${WEBDIR}/${WEBBASE}/man | ||||
|       rm -rf ${WEBDIR}/${WEBBASE}/speeches && mkdir ${WEBDIR}/${WEBBASE}/speeches | ||||
| 
 | ||||
|       cp ${MAN1DSTDIR}/*.html ${MAN7DSTDIR}/*.html ${WEBDIR}/${WEBBASE}/man | ||||
|       cp ${SPEECHESDIR}/*.pdf ${WEBDIR}/${WEBBASE}/speeches | ||||
|        | ||||
|       git describe > ${WEBDIR}/${WEBBASE}/man/VERSION | ||||
|       cd ${WEBDIR} && git add ${WEBBASE} | ||||
|       cd ${WEBDIR} && git commit -m "cdist update" ${WEBBASE} ${WEBPAGE} | ||||
|       cd ${WEBDIR} && make pub | ||||
|    ;; | ||||
| 
 | ||||
|    p|pu|pub) | ||||
|       git push --mirror | ||||
|       git push --mirror github | ||||
|    ;; | ||||
| 
 | ||||
|    clean) | ||||
|       rm -f ${MAN7DSTDIR}/cdist-reference.text | ||||
|       find "${MANDIR}" -mindepth 2 -type l \ | ||||
|          -o -name "*.1" \ | ||||
|          -o -name "*.7" \ | ||||
|          -o -name "*.html" \ | ||||
|          -o -name "*.xml" \ | ||||
|       | xargs rm -f | ||||
|    ;; | ||||
| 
 | ||||
|    *) | ||||
|       echo '' | ||||
|       echo 'Welcome to cdist!' | ||||
|       echo '' | ||||
|       echo 'Here are the possible targets:' | ||||
|       echo '' | ||||
|       echo '	man: Build manpages (requires Asciidoc)' | ||||
|       echo '	clean: Remove build stuff' | ||||
|       echo '' | ||||
|       echo '' | ||||
|       echo "Unknown target, \"$1\"" >&2 | ||||
|       exit 1 | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,271 +0,0 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # 2010-2015 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # 2012-2017 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| import os | ||||
| import hashlib | ||||
| 
 | ||||
| import cdist.log | ||||
| import cdist.version | ||||
| 
 | ||||
| VERSION = cdist.version.VERSION | ||||
| 
 | ||||
| BANNER = """ | ||||
|              ..          .       .x+=:.        s | ||||
|            dF           @88>    z`    ^%      :8 | ||||
|           '88bu.        %8P        .   <k    .88 | ||||
|       .   '*88888bu      .       .@8Ned8"   :888ooo | ||||
|  .udR88N    ^"*8888N   .@88u   .@^%8888"  -*8888888 | ||||
| <888'888k  beWE "888L ''888E` x88:  `)8b.   8888 | ||||
| 9888 'Y"   888E  888E   888E  8888N=*8888   8888 | ||||
| 9888       888E  888E   888E   %8"    R88   8888 | ||||
| 9888       888E  888F   888E    @8Wou 9%   .8888Lu= | ||||
| ?8888u../ .888N..888    888&  .888888P`    ^%888* | ||||
|  "8888P'   `"888*""     R888" `   ^"F        'Y" | ||||
|    "P'        ""         "" | ||||
| """ | ||||
| 
 | ||||
| REMOTE_COPY = "scp -o User=root -q" | ||||
| REMOTE_EXEC = "ssh -o User=root" | ||||
| REMOTE_CMDS_CLEANUP_PATTERN = "ssh -o User=root -O exit -S {}" | ||||
| 
 | ||||
| 
 | ||||
| class Error(Exception): | ||||
|     """Base exception class for this project""" | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class UnresolvableRequirementsError(cdist.Error): | ||||
|     """Resolving requirements failed""" | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class CdistBetaRequired(cdist.Error): | ||||
|     """Beta functionality is used but beta is not enabled""" | ||||
| 
 | ||||
|     def __init__(self, command, arg=None): | ||||
|         self.command = command | ||||
|         self.arg = arg | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         if self.arg is None: | ||||
|             err_msg = ("\'{}\' command is beta, but beta is " | ||||
|                        "not enabled. If you want to use it please enable beta " | ||||
|                        "functionalities by using the -b/--beta command " | ||||
|                        "line flag or setting CDIST_BETA env var.") | ||||
|             fmt_args = [self.command, ] | ||||
|         else: | ||||
|             err_msg = ("\'{}\' argument of \'{}\' command is beta, but beta " | ||||
|                        "is not enabled. If you want to use it please enable " | ||||
|                        "beta functionalities by using the -b/--beta " | ||||
|                        "command line flag or setting CDIST_BETA env var.") | ||||
|             fmt_args = [self.arg, self.command, ] | ||||
|         return err_msg.format(*fmt_args) | ||||
| 
 | ||||
| 
 | ||||
| class CdistEntityError(Error): | ||||
|     """Something went wrong while executing cdist entity""" | ||||
|     def __init__(self, entity_name, entity_params, stdout_paths, | ||||
|                  stderr_paths, subject=''): | ||||
|         self.entity_name = entity_name | ||||
|         self.entity_params = entity_params | ||||
|         self.stderr_paths = stderr_paths | ||||
|         self.stdout_paths = stdout_paths | ||||
|         if isinstance(subject, Error): | ||||
|             self.original_error = subject | ||||
|         else: | ||||
|             self.original_error = None | ||||
|         self.message = str(subject) | ||||
| 
 | ||||
|     def _stdpath(self, stdpaths, header_name): | ||||
|         result = {} | ||||
|         for name, path in stdpaths: | ||||
|             if name not in result: | ||||
|                 result[name] = [] | ||||
|             try: | ||||
|                 if os.path.exists(path) and os.path.getsize(path) > 0: | ||||
|                     output = [] | ||||
|                     label_begin = name + ":" + header_name | ||||
|                     output.append(label_begin) | ||||
|                     output.append('\n') | ||||
|                     output.append('-' * len(label_begin)) | ||||
|                     output.append('\n') | ||||
|                     with open(path, 'r') as fd: | ||||
|                         output.append(fd.read()) | ||||
|                     output.append('\n') | ||||
|                     result[name].append(''.join(output)) | ||||
|             except UnicodeError as ue: | ||||
|                 result[name].append(('Cannot output {}:{} due to: {}.\n' | ||||
|                                      'You can try to read the error file "{}"' | ||||
|                                      ' yourself.').format( | ||||
|                                          name, header_name, ue, path)) | ||||
|         return result | ||||
| 
 | ||||
|     def _stderr(self): | ||||
|         return self._stdpath(self.stderr_paths, 'stderr') | ||||
| 
 | ||||
|     def _stdout(self): | ||||
|         return self._stdpath(self.stdout_paths, 'stdout') | ||||
| 
 | ||||
|     def _update_dict_list(self, target, source): | ||||
|         for x in source: | ||||
|             if x not in target: | ||||
|                 target[x] = [] | ||||
|             target[x].extend(source[x]) | ||||
| 
 | ||||
|     @property | ||||
|     def std_streams(self): | ||||
|         std_dict = {} | ||||
|         self._update_dict_list(std_dict, self._stdout()) | ||||
|         self._update_dict_list(std_dict, self._stderr()) | ||||
|         return std_dict | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         output = [] | ||||
|         output.append(self.message) | ||||
|         output.append('\n\n') | ||||
|         header = "Error processing " + self.entity_name | ||||
|         under_header = '=' * len(header) | ||||
|         output.append(header) | ||||
|         output.append('\n') | ||||
|         output.append(under_header) | ||||
|         output.append('\n') | ||||
|         for param_name, param_value in self.entity_params: | ||||
|             output.append(param_name + ': ' + str(param_value)) | ||||
|             output.append('\n') | ||||
|         output.append('\n') | ||||
|         for x in self.std_streams: | ||||
|             output.append(''.join(self.std_streams[x])) | ||||
|         return ''.join(output) | ||||
| 
 | ||||
| 
 | ||||
| class CdistObjectError(CdistEntityError): | ||||
|     """Something went wrong while working on a specific cdist object""" | ||||
|     def __init__(self, cdist_object, subject=''): | ||||
|         params = [ | ||||
|             ('name', cdist_object.name, ), | ||||
|             ('path', cdist_object.absolute_path, ), | ||||
|             ('source', " ".join(cdist_object.source), ), | ||||
|             ('type', os.path.realpath( | ||||
|                 cdist_object.cdist_type.absolute_path), ), | ||||
|         ] | ||||
|         stderr_paths = [] | ||||
|         for stderr_name in os.listdir(cdist_object.stderr_path): | ||||
|             stderr_path = os.path.join(cdist_object.stderr_path, | ||||
|                                        stderr_name) | ||||
|             stderr_paths.append((stderr_name, stderr_path, )) | ||||
|         stdout_paths = [] | ||||
|         for stdout_name in os.listdir(cdist_object.stdout_path): | ||||
|             stdout_path = os.path.join(cdist_object.stdout_path, | ||||
|                                        stdout_name) | ||||
|             stdout_paths.append((stdout_name, stdout_path, )) | ||||
|         super().__init__("object '{}'".format(cdist_object.name), | ||||
|                          params, stdout_paths, stderr_paths, subject) | ||||
| 
 | ||||
| 
 | ||||
| class CdistObjectExplorerError(CdistEntityError): | ||||
|     """ | ||||
|     Something went wrong while working on a specific | ||||
|     cdist object explorer | ||||
|     """ | ||||
|     def __init__(self, cdist_object, explorer_name, explorer_path, | ||||
|                  stderr_path, subject=''): | ||||
|         params = [ | ||||
|             ('object name', cdist_object.name, ), | ||||
|             ('object path', cdist_object.absolute_path, ), | ||||
|             ('object source', " ".join(cdist_object.source), ), | ||||
|             ('object type', os.path.realpath( | ||||
|                 cdist_object.cdist_type.absolute_path), ), | ||||
|             ('explorer name', explorer_name, ), | ||||
|             ('explorer path', explorer_path, ), | ||||
|         ] | ||||
|         stdout_paths = [] | ||||
|         stderr_paths = [ | ||||
|             ('remote', stderr_path, ), | ||||
|         ] | ||||
|         super().__init__("explorer '{}' of object '{}'".format( | ||||
|             explorer_name, cdist_object.name), params, stdout_paths, | ||||
|             stderr_paths, subject) | ||||
| 
 | ||||
| 
 | ||||
| class InitialManifestError(CdistEntityError): | ||||
|     """Something went wrong while executing initial manifest""" | ||||
|     def __init__(self, initial_manifest, stdout_path, stderr_path, subject=''): | ||||
|         params = [ | ||||
|             ('path', initial_manifest, ), | ||||
|         ] | ||||
|         stdout_paths = [ | ||||
|             ('init', stdout_path, ), | ||||
|         ] | ||||
|         stderr_paths = [ | ||||
|             ('init', stderr_path, ), | ||||
|         ] | ||||
|         super().__init__('initial manifest', params, stdout_paths, | ||||
|                          stderr_paths, subject) | ||||
| 
 | ||||
| 
 | ||||
| class GlobalExplorerError(CdistEntityError): | ||||
|     """Something went wrong while executing global explorer""" | ||||
|     def __init__(self, name, path, stderr_path, subject=''): | ||||
|         params = [ | ||||
|             ('name', name, ), | ||||
|             ('path', path, ), | ||||
|         ] | ||||
|         stderr_paths = [ | ||||
|             ('remote', stderr_path, ), | ||||
|         ] | ||||
|         super().__init__("global explorer '{}'".format(name), | ||||
|                          params, [], stderr_paths, subject) | ||||
| 
 | ||||
| 
 | ||||
| def file_to_list(filename): | ||||
|     """Return list from \n seperated file""" | ||||
|     if os.path.isfile(filename): | ||||
|         file_fd = open(filename, "r") | ||||
|         lines = file_fd.readlines() | ||||
|         file_fd.close() | ||||
| 
 | ||||
|         # Remove \n from all lines | ||||
|         lines = map(lambda s: s.strip(), lines) | ||||
|     else: | ||||
|         lines = [] | ||||
| 
 | ||||
|     return lines | ||||
| 
 | ||||
| 
 | ||||
| def str_hash(s): | ||||
|     """Return hash of string s""" | ||||
|     if isinstance(s, str): | ||||
|         return hashlib.md5(s.encode('utf-8')).hexdigest() | ||||
|     else: | ||||
|         raise Error("Param should be string") | ||||
| 
 | ||||
| 
 | ||||
| def home_dir(): | ||||
|     if 'HOME' in os.environ: | ||||
|         home = os.environ['HOME'] | ||||
|         if home: | ||||
|             rv = os.path.join(home, ".cdist") | ||||
|         else: | ||||
|             rv = None | ||||
|     else: | ||||
|         rv = None | ||||
|     return rv | ||||
|  | @ -1,505 +0,0 @@ | |||
| import argparse | ||||
| import cdist | ||||
| import multiprocessing | ||||
| import logging | ||||
| import collections | ||||
| import functools | ||||
| import cdist.configuration | ||||
| import cdist.preos | ||||
| import cdist.info | ||||
| 
 | ||||
| 
 | ||||
| # set of beta sub-commands | ||||
| BETA_COMMANDS = set(('install', 'inventory', )) | ||||
| # set of beta arguments for sub-commands | ||||
| BETA_ARGS = { | ||||
|     'config': set(('tag', 'all_tagged_hosts', 'use_archiving', )), | ||||
| } | ||||
| EPILOG = "Get cdist at https://code.ungleich.ch/ungleich-public/cdist" | ||||
| # Parser others can reuse | ||||
| parser = None | ||||
| 
 | ||||
| 
 | ||||
| _verbosity_level_off = -2 | ||||
| _verbosity_level = { | ||||
|     None: logging.WARNING, | ||||
|     _verbosity_level_off: logging.OFF, | ||||
|     -1: logging.ERROR, | ||||
|     0: logging.WARNING, | ||||
|     1: logging.INFO, | ||||
|     2: logging.VERBOSE, | ||||
|     3: logging.DEBUG, | ||||
|     4: logging.TRACE, | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| # Generate verbosity level constants: | ||||
| # VERBOSE_OFF, VERBOSE_ERROR, VERBOSE_WARNING, VERBOSE_INFO, VERBOSE_VERBOSE, | ||||
| # VERBOSE_DEBUG, VERBOSE_TRACE. | ||||
| this_globals = globals() | ||||
| for level in _verbosity_level: | ||||
|     const = 'VERBOSE_' + logging.getLevelName(_verbosity_level[level]) | ||||
|     this_globals[const] = level | ||||
| 
 | ||||
| 
 | ||||
| # All verbosity levels above 4 are TRACE. | ||||
| _verbosity_level = collections.defaultdict( | ||||
|     lambda: logging.TRACE, _verbosity_level) | ||||
| 
 | ||||
| 
 | ||||
| def add_beta_command(cmd): | ||||
|     BETA_COMMANDS.add(cmd) | ||||
| 
 | ||||
| 
 | ||||
| def add_beta_arg(cmd, arg): | ||||
|     if cmd in BETA_ARGS: | ||||
|         if arg not in BETA_ARGS[cmd]: | ||||
|             BETA_ARGS[cmd].append(arg) | ||||
|     else: | ||||
|         BETA_ARGS[cmd] = set((arg, )) | ||||
| 
 | ||||
| 
 | ||||
| def check_beta(args_dict): | ||||
|     if 'beta' not in args_dict: | ||||
|         args_dict['beta'] = False | ||||
|     # Check only if beta is not enabled: if beta option is specified then | ||||
|     # raise error. | ||||
|     if not args_dict['beta']: | ||||
|         cmd = args_dict['command'] | ||||
|         # first check if command is beta | ||||
|         if cmd in BETA_COMMANDS: | ||||
|             raise cdist.CdistBetaRequired(cmd) | ||||
|         # then check if some command's argument is beta | ||||
|         if cmd in BETA_ARGS: | ||||
|             for arg in BETA_ARGS[cmd]: | ||||
|                 if arg in args_dict and args_dict[arg]: | ||||
|                     raise cdist.CdistBetaRequired(cmd, arg) | ||||
| 
 | ||||
| 
 | ||||
| def check_lower_bounded_int(value, lower_bound, name): | ||||
|     try: | ||||
|         val = int(value) | ||||
|     except ValueError: | ||||
|         raise argparse.ArgumentTypeError( | ||||
|                 "{} is invalid int value".format(value)) | ||||
|     if val < lower_bound: | ||||
|         raise argparse.ArgumentTypeError( | ||||
|                 "{} is invalid {} value".format(val, name)) | ||||
|     return val | ||||
| 
 | ||||
| 
 | ||||
| def get_parsers(): | ||||
|     global parser | ||||
| 
 | ||||
|     # Construct parser others can reuse | ||||
|     if parser: | ||||
|         return parser | ||||
|     else: | ||||
|         parser = {} | ||||
|     # Options _all_ parsers have in common | ||||
|     parser['loglevel'] = argparse.ArgumentParser(add_help=False) | ||||
|     parser['loglevel'].add_argument( | ||||
|             '-l', '--log-level', metavar='LOGLEVEL', | ||||
|             type=functools.partial(check_lower_bounded_int, lower_bound=-1, | ||||
|                                    name="log level"), | ||||
|             help=('Set the specified verbosity level. ' | ||||
|                   'The levels, in order from the lowest to the highest, are: ' | ||||
|                   'ERROR (-1), WARNING (0), INFO (1), VERBOSE (2), DEBUG (3), ' | ||||
|                   'TRACE (4 or higher). If used along with -v then -v ' | ||||
|                   'increases last set value and -l overwrites last set ' | ||||
|                   'value.'), | ||||
|             action='store', dest='verbose', required=False) | ||||
|     parser['loglevel'].add_argument( | ||||
|             '-q', '--quiet', | ||||
|             help='Quiet mode: disables logging, including WARNING and ERROR.', | ||||
|             action='store_true', default=False) | ||||
|     parser['loglevel'].add_argument( | ||||
|             '-v', '--verbose', | ||||
|             help=('Increase the verbosity level. Every instance of -v ' | ||||
|                   'increments the verbosity level by one. Its default value ' | ||||
|                   'is 0 which includes ERROR and WARNING levels. ' | ||||
|                   'The levels, in order from the lowest to the highest, are: ' | ||||
|                   'ERROR (-1), WARNING (0), INFO (1), VERBOSE (2), DEBUG (3) ' | ||||
|                   'TRACE (4 or higher). If used along with -l then -l ' | ||||
|                   'overwrites last set value and -v increases last set ' | ||||
|                   'value.'), | ||||
|             action='count', default=None) | ||||
| 
 | ||||
|     parser['beta'] = argparse.ArgumentParser(add_help=False) | ||||
|     parser['beta'].add_argument( | ||||
|            '-b', '--beta', | ||||
|            help=('Enable beta functionality. '), | ||||
|            action='store_true', dest='beta', default=None) | ||||
| 
 | ||||
|     # Main subcommand parser | ||||
|     parser['main'] = argparse.ArgumentParser( | ||||
|             description='cdist ' + cdist.VERSION) | ||||
|     parser['main'].add_argument( | ||||
|             '-V', '--version', help='Show version.', action='version', | ||||
|             version='%(prog)s ' + cdist.VERSION) | ||||
|     parser['sub'] = parser['main'].add_subparsers( | ||||
|             title="Commands", dest="command") | ||||
| 
 | ||||
|     # Banner | ||||
|     parser['banner'] = parser['sub'].add_parser( | ||||
|             'banner', parents=[parser['loglevel']]) | ||||
|     parser['banner'].set_defaults(func=cdist.banner.banner) | ||||
| 
 | ||||
|     parser['inventory_common'] = argparse.ArgumentParser(add_help=False) | ||||
|     parser['inventory_common'].add_argument( | ||||
|            '-I', '--inventory', | ||||
|            help=('Use specified custom inventory directory. ' | ||||
|                  'Inventory directory is set up by the following rules: ' | ||||
|                  'if cdist configuration resolves this value then specified ' | ||||
|                  'directory is used, ' | ||||
|                  'if HOME env var is set then ~/.cdist/inventory is ' | ||||
|                  'used, otherwise distribution inventory directory is used.'), | ||||
|            dest="inventory_dir", required=False) | ||||
| 
 | ||||
|     parser['common'] = argparse.ArgumentParser(add_help=False) | ||||
|     parser['common'].add_argument( | ||||
|            '-g', '--config-file', | ||||
|            help=('Use specified custom configuration file.'), | ||||
|            dest="config_file", required=False) | ||||
| 
 | ||||
|     # Config | ||||
|     parser['config_main'] = argparse.ArgumentParser(add_help=False) | ||||
|     parser['config_main'].add_argument( | ||||
|            '-4', '--force-ipv4', | ||||
|            help=('Force to use IPv4 addresses only. No influence for custom' | ||||
|                  ' remote commands.'), | ||||
|            action='store_const', dest='force_ipv', const=4) | ||||
|     parser['config_main'].add_argument( | ||||
|            '-6', '--force-ipv6', | ||||
|            help=('Force to use IPv6 addresses only. No influence for custom' | ||||
|                  ' remote commands.'), | ||||
|            action='store_const', dest='force_ipv', const=6) | ||||
|     parser['config_main'].add_argument( | ||||
|             '-C', '--cache-path-pattern', | ||||
|             help=('Specify custom cache path pattern. If ' | ||||
|                   'it is not set then default hostdir is used.'), | ||||
|             dest='cache_path_pattern', | ||||
|             default=None) | ||||
|     parser['config_main'].add_argument( | ||||
|             '-c', '--conf-dir', | ||||
|             help=('Add configuration directory (can be repeated, ' | ||||
|                   'last one wins).'), action='append') | ||||
|     parser['config_main'].add_argument( | ||||
|            '-i', '--initial-manifest', | ||||
|            help='Path to a cdist manifest or \'-\' to read from stdin.', | ||||
|            dest='manifest', required=False) | ||||
|     parser['config_main'].add_argument( | ||||
|            '-j', '--jobs', nargs='?', | ||||
|            type=functools.partial(check_lower_bounded_int, lower_bound=1, | ||||
|                                   name="positive int"), | ||||
|            help=('Operate in parallel in specified maximum number of jobs. ' | ||||
|                  'Global explorers, object prepare and object run are ' | ||||
|                  'supported. Without argument CPU count is used by default. '), | ||||
|            action='store', dest='jobs', | ||||
|            const=multiprocessing.cpu_count()) | ||||
|     parser['config_main'].add_argument( | ||||
|            '-n', '--dry-run', | ||||
|            help='Do not execute code.', action='store_true') | ||||
|     parser['config_main'].add_argument( | ||||
|            '-o', '--out-dir', | ||||
|            help='Directory to save cdist output in.', dest="out_path") | ||||
|     parser['config_main'].add_argument( | ||||
|            '-P', '--timestamp', | ||||
|            help=('Timestamp log messages with the current local date and time ' | ||||
|                  'in the format: YYYYMMDDHHMMSS.us.'), | ||||
|            action='store_true', dest='timestamp') | ||||
|     parser['config_main'].add_argument( | ||||
|            '-R', '--use-archiving', nargs='?', | ||||
|            choices=('tar', 'tgz', 'tbz2', 'txz',), | ||||
|            help=('Operate by using archiving with compression where ' | ||||
|                  'appropriate. Supported values are: tar - tar archive, ' | ||||
|                  'tgz - gzip tar archive (the default), ' | ||||
|                  'tbz2 - bzip2 tar archive and txz - lzma tar archive. ' | ||||
|                  'Currently in beta.'), | ||||
|            action='store', dest='use_archiving', | ||||
|            const='tgz') | ||||
| 
 | ||||
|     # remote-copy and remote-exec defaults are environment variables | ||||
|     # if set; if not then None - these will be futher handled after | ||||
|     # parsing to determine implementation default | ||||
|     parser['config_main'].add_argument( | ||||
|            '-r', '--remote-out-dir', | ||||
|            help='Directory to save cdist output in on the target host.', | ||||
|            dest="remote_out_path") | ||||
|     parser['config_main'].add_argument( | ||||
|            '--remote-copy', | ||||
|            help='Command to use for remote copy (should behave like scp).', | ||||
|            action='store', dest='remote_copy', | ||||
|            default=None) | ||||
|     parser['config_main'].add_argument( | ||||
|            '--remote-exec', | ||||
|            help=('Command to use for remote execution ' | ||||
|                  '(should behave like ssh).'), | ||||
|            action='store', dest='remote_exec', | ||||
|            default=None) | ||||
|     parser['config_main'].add_argument( | ||||
|            '-S', '--disable-saving-output-streams', | ||||
|            help='Disable saving output streams.', | ||||
|            action='store_false', dest='save_output_streams', default=True) | ||||
| 
 | ||||
|     # Config | ||||
|     parser['config_args'] = argparse.ArgumentParser(add_help=False) | ||||
|     parser['config_args'].add_argument( | ||||
|              '-A', '--all-tagged', | ||||
|              help=('Use all hosts present in tags db. Currently in beta.'), | ||||
|              action="store_true", dest="all_tagged_hosts", default=False) | ||||
|     parser['config_args'].add_argument( | ||||
|              '-a', '--all', | ||||
|              help=('List hosts that have all specified tags, ' | ||||
|                    'if -t/--tag is specified.'), | ||||
|              action="store_true", dest="has_all_tags", default=False) | ||||
|     parser['config_args'].add_argument( | ||||
|             '-f', '--file', | ||||
|             help=('Read specified file for a list of additional hosts to ' | ||||
|                   'operate on or if \'-\' is given, read stdin (one host per ' | ||||
|                   'line). If no host or host file is specified then, by ' | ||||
|                   'default, read hosts from stdin.'), | ||||
|             dest='hostfile', required=False) | ||||
|     parser['config_args'].add_argument( | ||||
|            '-p', '--parallel', nargs='?', metavar='HOST_MAX', | ||||
|            type=functools.partial(check_lower_bounded_int, lower_bound=1, | ||||
|                                   name="positive int"), | ||||
|            help=('Operate on multiple hosts in parallel for specified maximum ' | ||||
|                  'hosts at a time. Without argument CPU count is used by ' | ||||
|                  'default.'), | ||||
|            action='store', dest='parallel', | ||||
|            const=multiprocessing.cpu_count()) | ||||
|     parser['config_args'].add_argument( | ||||
|            '-s', '--sequential', | ||||
|            help='Operate on multiple hosts sequentially (default).', | ||||
|            action='store_const', dest='parallel', const=0) | ||||
|     parser['config_args'].add_argument( | ||||
|              '-t', '--tag', | ||||
|              help=('Host is specified by tag, not hostname/address; ' | ||||
|                    'list all hosts that contain any of specified tags. ' | ||||
|                    'Currently in beta.'), | ||||
|              dest='tag', required=False, action="store_true", default=False) | ||||
|     parser['config_args'].add_argument( | ||||
|             'host', nargs='*', help='Host(s) to operate on.') | ||||
|     parser['config'] = parser['sub'].add_parser( | ||||
|             'config', parents=[parser['loglevel'], parser['beta'], | ||||
|                                parser['common'], | ||||
|                                parser['config_main'], | ||||
|                                parser['inventory_common'], | ||||
|                                parser['config_args']]) | ||||
|     parser['config'].set_defaults(func=cdist.config.Config.commandline) | ||||
| 
 | ||||
|     # Install | ||||
|     parser['install'] = parser['sub'].add_parser('install', add_help=False, | ||||
|                                                  parents=[parser['config']]) | ||||
|     parser['install'].set_defaults(func=cdist.install.Install.commandline) | ||||
| 
 | ||||
|     # Inventory | ||||
|     parser['inventory'] = parser['sub'].add_parser('inventory') | ||||
|     parser['invsub'] = parser['inventory'].add_subparsers( | ||||
|             title="Inventory commands", dest="subcommand") | ||||
| 
 | ||||
|     parser['add-host'] = parser['invsub'].add_parser( | ||||
|             'add-host', parents=[parser['loglevel'], parser['beta'], | ||||
|                                  parser['common'], | ||||
|                                  parser['inventory_common']]) | ||||
|     parser['add-host'].add_argument( | ||||
|             'host', nargs='*', help='Host(s) to add.') | ||||
|     parser['add-host'].add_argument( | ||||
|            '-f', '--file', | ||||
|            help=('Read additional hosts to add from specified file ' | ||||
|                  'or from stdin if \'-\' (each host on separate line). ' | ||||
|                  'If no host or host file is specified then, by default, ' | ||||
|                  'read from stdin.'), | ||||
|            dest='hostfile', required=False) | ||||
| 
 | ||||
|     parser['add-tag'] = parser['invsub'].add_parser( | ||||
|             'add-tag', parents=[parser['loglevel'], parser['beta'], | ||||
|                                 parser['common'], | ||||
|                                 parser['inventory_common']]) | ||||
|     parser['add-tag'].add_argument( | ||||
|            'host', nargs='*', | ||||
|            help='List of host(s) for which tags are added.') | ||||
|     parser['add-tag'].add_argument( | ||||
|            '-f', '--file', | ||||
|            help=('Read additional hosts to add tags from specified file ' | ||||
|                  'or from stdin if \'-\' (each host on separate line). ' | ||||
|                  'If no host or host file is specified then, by default, ' | ||||
|                  'read from stdin. If no tags/tagfile nor hosts/hostfile' | ||||
|                  ' are specified then tags are read from stdin and are' | ||||
|                  ' added to all hosts.'), | ||||
|            dest='hostfile', required=False) | ||||
|     parser['add-tag'].add_argument( | ||||
|            '-T', '--tag-file', | ||||
|            help=('Read additional tags to add from specified file ' | ||||
|                  'or from stdin if \'-\' (each tag on separate line). ' | ||||
|                  'If no tag or tag file is specified then, by default, ' | ||||
|                  'read from stdin. If no tags/tagfile nor hosts/hostfile' | ||||
|                  ' are specified then tags are read from stdin and are' | ||||
|                  ' added to all hosts.'), | ||||
|            dest='tagfile', required=False) | ||||
|     parser['add-tag'].add_argument( | ||||
|            '-t', '--taglist', | ||||
|            help=("Tag list to be added for specified host(s), comma separated" | ||||
|                  " values."), | ||||
|            dest="taglist", required=False) | ||||
| 
 | ||||
|     parser['del-host'] = parser['invsub'].add_parser( | ||||
|             'del-host', parents=[parser['loglevel'], parser['beta'], | ||||
|                                  parser['common'], | ||||
|                                  parser['inventory_common']]) | ||||
|     parser['del-host'].add_argument( | ||||
|             'host', nargs='*', help='Host(s) to delete.') | ||||
|     parser['del-host'].add_argument( | ||||
|             '-a', '--all', help=('Delete all hosts.'), | ||||
|             dest='all', required=False, action="store_true", default=False) | ||||
|     parser['del-host'].add_argument( | ||||
|             '-f', '--file', | ||||
|             help=('Read additional hosts to delete from specified file ' | ||||
|                   'or from stdin if \'-\' (each host on separate line). ' | ||||
|                   'If no host or host file is specified then, by default, ' | ||||
|                   'read from stdin.'), | ||||
|             dest='hostfile', required=False) | ||||
| 
 | ||||
|     parser['del-tag'] = parser['invsub'].add_parser( | ||||
|             'del-tag', parents=[parser['loglevel'], parser['beta'], | ||||
|                                 parser['common'], | ||||
|                                 parser['inventory_common']]) | ||||
|     parser['del-tag'].add_argument( | ||||
|             'host', nargs='*', | ||||
|             help='List of host(s) for which tags are deleted.') | ||||
|     parser['del-tag'].add_argument( | ||||
|             '-a', '--all', | ||||
|             help=('Delete all tags for specified host(s).'), | ||||
|             dest='all', required=False, action="store_true", default=False) | ||||
|     parser['del-tag'].add_argument( | ||||
|             '-f', '--file', | ||||
|             help=('Read additional hosts to delete tags for from specified ' | ||||
|                   'file or from stdin if \'-\' (each host on separate line). ' | ||||
|                   'If no host or host file is specified then, by default, ' | ||||
|                   'read from stdin. If no tags/tagfile nor hosts/hostfile' | ||||
|                   ' are specified then tags are read from stdin and are' | ||||
|                   ' deleted from all hosts.'), | ||||
|             dest='hostfile', required=False) | ||||
|     parser['del-tag'].add_argument( | ||||
|             '-T', '--tag-file', | ||||
|             help=('Read additional tags from specified file ' | ||||
|                   'or from stdin if \'-\' (each tag on separate line). ' | ||||
|                   'If no tag or tag file is specified then, by default, ' | ||||
|                   'read from stdin. If no tags/tagfile nor' | ||||
|                   ' hosts/hostfile are specified then tags are read from' | ||||
|                   ' stdin and are added to all hosts.'), | ||||
|             dest='tagfile', required=False) | ||||
|     parser['del-tag'].add_argument( | ||||
|             '-t', '--taglist', | ||||
|             help=("Tag list to be deleted for specified host(s), " | ||||
|                   "comma separated values."), | ||||
|             dest="taglist", required=False) | ||||
| 
 | ||||
|     parser['list'] = parser['invsub'].add_parser( | ||||
|             'list', parents=[parser['loglevel'], parser['beta'], | ||||
|                              parser['common'], | ||||
|                              parser['inventory_common']]) | ||||
|     parser['list'].add_argument( | ||||
|             'host', nargs='*', help='Host(s) to list.') | ||||
|     parser['list'].add_argument( | ||||
|             '-a', '--all', | ||||
|             help=('List hosts that have all specified tags, ' | ||||
|                   'if -t/--tag is specified.'), | ||||
|             action="store_true", dest="has_all_tags", default=False) | ||||
|     parser['list'].add_argument( | ||||
|             '-f', '--file', | ||||
|             help=('Read additional hosts to list from specified file ' | ||||
|                   'or from stdin if \'-\' (each host on separate line). ' | ||||
|                   'If no host or host file is specified then, by default, ' | ||||
|                   'list all.'), dest='hostfile', required=False) | ||||
|     parser['list'].add_argument( | ||||
|             '-H', '--host-only', help=('Suppress tags listing.'), | ||||
|             action="store_true", dest="list_only_host", default=False) | ||||
|     parser['list'].add_argument( | ||||
|             '-t', '--tag', | ||||
|             help=('Host is specified by tag, not hostname/address; ' | ||||
|                   'list all hosts that contain any of specified tags.'), | ||||
|             action="store_true", default=False) | ||||
| 
 | ||||
|     parser['inventory'].set_defaults( | ||||
|             func=cdist.inventory.Inventory.commandline) | ||||
| 
 | ||||
|     # PreOS | ||||
|     parser['preos'] = parser['sub'].add_parser('preos', add_help=False) | ||||
| 
 | ||||
|     # Shell | ||||
|     parser['shell'] = parser['sub'].add_parser( | ||||
|             'shell', parents=[parser['loglevel']]) | ||||
|     parser['shell'].add_argument( | ||||
|             '-s', '--shell', | ||||
|             help=('Select shell to use, defaults to current shell. Used shell' | ||||
|                   ' should be POSIX compatible shell.')) | ||||
|     parser['shell'].set_defaults(func=cdist.shell.Shell.commandline) | ||||
| 
 | ||||
|     # Info | ||||
|     parser['info'] = parser['sub'].add_parser('info') | ||||
|     parser['info'].add_argument( | ||||
|             '-a', '--all', help='Display all info. This is the default.', | ||||
|             action='store_true', default=False) | ||||
|     parser['info'].add_argument( | ||||
|             '-c', '--conf-dir', | ||||
|             help='Add configuration directory (can be repeated).', | ||||
|             action='append') | ||||
|     parser['info'].add_argument( | ||||
|             '-e', '--global-explorers', | ||||
|             help='Display info for global explorers.', action='store_true', | ||||
|             default=False) | ||||
|     parser['info'].add_argument( | ||||
|             '-F', '--fixed-string', | ||||
|             help='Interpret pattern as a fixed string.', action='store_true', | ||||
|             default=False) | ||||
|     parser['info'].add_argument( | ||||
|             '-f', '--full', help='Display full details.', | ||||
|             action='store_true', default=False) | ||||
|     parser['info'].add_argument( | ||||
|            '-g', '--config-file', | ||||
|            help='Use specified custom configuration file.', | ||||
|            dest="config_file", required=False) | ||||
|     parser['info'].add_argument( | ||||
|             '-t', '--types', help='Display info for types.', | ||||
|             action='store_true', default=False) | ||||
|     parser['info'].add_argument( | ||||
|             'pattern', nargs='?', help='Glob pattern.') | ||||
|     parser['info'].set_defaults(func=cdist.info.Info.commandline) | ||||
| 
 | ||||
|     for p in parser: | ||||
|         parser[p].epilog = EPILOG | ||||
| 
 | ||||
|     return parser | ||||
| 
 | ||||
| 
 | ||||
| def handle_loglevel(args): | ||||
|     if hasattr(args, 'quiet') and args.quiet: | ||||
|         args.verbose = _verbosity_level_off | ||||
| 
 | ||||
|     logging.root.setLevel(_verbosity_level[args.verbose]) | ||||
| 
 | ||||
| 
 | ||||
| def parse_and_configure(argv, singleton=True): | ||||
|     parser = get_parsers() | ||||
|     parser_args = parser['main'].parse_args(argv) | ||||
|     try: | ||||
|         cfg = cdist.configuration.Configuration(parser_args, | ||||
|                                                 singleton=singleton) | ||||
|         args = cfg.get_args() | ||||
|     except ValueError as e: | ||||
|         raise cdist.Error(str(e)) | ||||
|     # Loglevels are handled globally in here | ||||
|     handle_loglevel(args) | ||||
| 
 | ||||
|     log = logging.getLogger("cdist") | ||||
| 
 | ||||
|     log.verbose("version %s" % cdist.VERSION) | ||||
|     log.trace('command line args: {}'.format(cfg.command_line_args)) | ||||
|     log.trace('configuration: {}'.format(cfg.get_config())) | ||||
|     log.trace('configured args: {}'.format(args)) | ||||
| 
 | ||||
|     check_beta(vars(args)) | ||||
| 
 | ||||
|     return parser, cfg | ||||
|  | @ -1,71 +0,0 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # 2017 Darko Poljak (darko.poljak at gmail.com) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| 
 | ||||
| import cdist | ||||
| import tarfile | ||||
| import os | ||||
| import glob | ||||
| import tempfile | ||||
| 
 | ||||
| 
 | ||||
| _ARCHIVING_MODES = { | ||||
|     'tar': '', | ||||
|     'tgz': 'gz', | ||||
|     'tbz2': 'bz2', | ||||
|     'txz': 'xz', | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| _UNARCHIVE_OPT = { | ||||
|     'tar': None, | ||||
|     'tgz': '-z', | ||||
|     'tbz2': '-j', | ||||
|     'txz': '-J', | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| # Archiving will be enabled if directory contains more than FILES_LIMIT files. | ||||
| FILES_LIMIT = 1 | ||||
| 
 | ||||
| 
 | ||||
| def get_extract_option(mode): | ||||
|     return _UNARCHIVE_OPT[mode] | ||||
| 
 | ||||
| 
 | ||||
| def tar(source, mode="tgz"): | ||||
|     if mode not in _ARCHIVING_MODES: | ||||
|         raise cdist.Error("Unsupported archiving mode {}.".format(mode)) | ||||
| 
 | ||||
|     files = glob.glob1(source, '*') | ||||
|     fcnt = len(files) | ||||
|     if fcnt <= FILES_LIMIT: | ||||
|         return None, fcnt | ||||
| 
 | ||||
|     tarmode = 'w:{}'.format(_ARCHIVING_MODES[mode]) | ||||
|     _, tarpath = tempfile.mkstemp(suffix='.' + mode) | ||||
|     with tarfile.open(tarpath, tarmode, dereference=True) as tar: | ||||
|         if os.path.isdir(source): | ||||
|             for f in files: | ||||
|                 tar.add(os.path.join(source, f), arcname=f) | ||||
|         else: | ||||
|             tar.add(source) | ||||
|     return tarpath, fcnt | ||||
|  | @ -1,30 +0,0 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # 2011-2012 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| import logging | ||||
| import cdist | ||||
| 
 | ||||
| log = logging.getLogger(__name__) | ||||
| 
 | ||||
| 
 | ||||
| def banner(args): | ||||
|     """Guess what :-)""" | ||||
|     print(cdist.BANNER) | ||||
|  | @ -1,44 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2014 Daniel Heule  (hda at sfs.biz) | ||||
| # 2014 Thomas Oettli (otho at sfs.biz) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| # FIXME: other system types (not linux ...) | ||||
| 
 | ||||
| os=$("$__explorer/os") | ||||
| case "$os" in | ||||
|     "macosx") | ||||
|         sysctl -n hw.physicalcpu | ||||
|     ;; | ||||
| 
 | ||||
|     "openbsd") | ||||
|         sysctl -n hw.ncpuonline | ||||
|     ;; | ||||
| 
 | ||||
|     *) | ||||
|         if [ -r /proc/cpuinfo ]; then | ||||
|             cores="$(grep "core id" /proc/cpuinfo | sort | uniq | wc -l)" | ||||
|             if [ "${cores}" -eq 0 ]; then | ||||
|                 cores="1" | ||||
|             fi | ||||
|             echo "$cores" | ||||
|         fi | ||||
|     ;; | ||||
| esac | ||||
|  | @ -1,40 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2014 Daniel Heule  (hda at sfs.biz) | ||||
| # 2014 Thomas Oettli (otho at sfs.biz) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| # FIXME: other system types (not linux ...) | ||||
| 
 | ||||
| os=$("$__explorer/os") | ||||
| case "$os" in | ||||
|     "macosx") | ||||
|         system_profiler SPHardwareDataType | grep "Number of Processors" | awk -F': ' '{print $2}' | ||||
|     ;; | ||||
| 
 | ||||
|     *) | ||||
|     if [ -r /proc/cpuinfo ]; then | ||||
|         sockets="$(grep "physical id" /proc/cpuinfo | sort -u | wc -l)" | ||||
|         if [ "${sockets}" -eq 0 ]; then | ||||
|             sockets="$(grep -c "processor" /proc/cpuinfo)" | ||||
|         fi | ||||
|         echo "${sockets}" | ||||
|     fi | ||||
|     ;; | ||||
| esac | ||||
|  | @ -1,27 +0,0 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| uname_s="$(uname -s)" | ||||
| 
 | ||||
| case "${uname_s}" in | ||||
|     FreeBSD) | ||||
|         sysctl -n kern.disks | ||||
|     ;; | ||||
|     OpenBSD|NetBSD) | ||||
|         sysctl -n hw.disknames | grep -Eo '[lsw]d[0-9]+' | xargs | ||||
|     ;; | ||||
|     Linux) | ||||
|         if command -v lsblk > /dev/null | ||||
|         then | ||||
|             # exclude ram disks, floppies and cdroms | ||||
|             # https://www.kernel.org/doc/Documentation/admin-guide/devices.txt | ||||
|             lsblk -e 1,2,11 -dno name | xargs | ||||
|         else | ||||
|             printf "Don't know how to list disks for %s operating system without lsblk, if you can please submit a patch\n" "${uname_s}" >&2 | ||||
|         fi | ||||
|     ;; | ||||
|     *) | ||||
|         printf "Don't know how to list disks for %s operating system, if you can please submit a patch\n" "${uname_s}" >&2 | ||||
|     ;; | ||||
| esac | ||||
| 
 | ||||
| exit 0 | ||||
|  | @ -1,39 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2016 Daniel Heule (hda at sfs.biz) | ||||
| # Copyright 2017, Philippe Gregoire <pg@pgregoire.xyz> | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Returns the process name of pid 1 ( normaly the init system ) | ||||
| # for example at linux this value is "init" or "systemd" in most cases | ||||
| # | ||||
| 
 | ||||
| uname_s="$(uname -s)" | ||||
| 
 | ||||
| case "$uname_s" in | ||||
|     Linux) | ||||
|         (pgrep -P0 -l | awk '/^1[ \t]/ {print $2;}') || true | ||||
|     ;; | ||||
|     FreeBSD|OpenBSD) | ||||
|         ps -o comm= -p 1 || true | ||||
|     ;; | ||||
|     *) | ||||
|         # return a empty string as unknown value | ||||
|         echo "" | ||||
|     ;; | ||||
| esac | ||||
|  | @ -1,28 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2019 Ander Punnar (ander-at-kvlt-dot-ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if command -v ip >/dev/null | ||||
| then | ||||
| 	ip -o link show | sed -n 's/^[0-9]\+: \(.\+\): <.*/\1/p' | ||||
| elif command -v ifconfig >/dev/null | ||||
| then | ||||
| 	ifconfig -a | sed -n -E 's/^(.*)(:[[:space:]]*flags=|Link encap).*/\1/p' | ||||
| fi \ | ||||
|  | sort -u | ||||
|  | @ -1,2 +0,0 @@ | |||
| #!/bin/sh | ||||
| sysctl -n security.jail.jailed 2>/dev/null | grep "1" || true | ||||
|  | @ -1,2 +0,0 @@ | |||
| #!/bin/sh | ||||
| uname -s | ||||
|  | @ -1,34 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| set +e | ||||
| case "$("$__explorer/os")" in | ||||
|    openwrt) | ||||
|       # shellcheck disable=SC1091 | ||||
|       (. /etc/openwrt_release && echo "$DISTRIB_CODENAME") | ||||
|    ;; | ||||
|    *) | ||||
|       lsb_release=$(command -v lsb_release) | ||||
|       if [ -x "$lsb_release" ]; then | ||||
|          $lsb_release --short --codename | ||||
|       fi | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,34 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| set +e | ||||
| case "$("$__explorer/os")" in | ||||
|    openwrt) | ||||
|       # shellcheck disable=SC1091 | ||||
|       (. /etc/openwrt_release && echo "$DISTRIB_DESCRIPTION") | ||||
|    ;; | ||||
|    *) | ||||
|       lsb_release=$(command -v lsb_release) | ||||
|       if [ -x "$lsb_release" ]; then | ||||
|          $lsb_release --short --description | ||||
|       fi | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,34 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| set +e | ||||
| case "$("$__explorer/os")" in | ||||
|    openwrt) | ||||
|       # shellcheck disable=SC1091 | ||||
|       (. /etc/openwrt_release && echo "$DISTRIB_ID") | ||||
|    ;; | ||||
|    *) | ||||
|       lsb_release=$(command -v lsb_release) | ||||
|       if [ -x "$lsb_release" ]; then | ||||
|          $lsb_release --short --id | ||||
|       fi | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,34 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| set +e | ||||
| case "$("$__explorer/os")" in | ||||
|    openwrt) | ||||
|       # shellcheck disable=SC1091 | ||||
|       (. /etc/openwrt_release && echo "$DISTRIB_RELEASE") | ||||
|    ;; | ||||
|    *) | ||||
|       lsb_release=$(command -v lsb_release) | ||||
|       if [ -x "$lsb_release" ]; then | ||||
|          $lsb_release --short --release | ||||
|       fi | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,80 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2014 Daniel Heule  (hda at sfs.biz) | ||||
| # 2014 Thomas Oettli (otho at sfs.biz) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| # FIXME: other system types (not linux ...) | ||||
| 
 | ||||
| if [ -d "/proc/vz" ] && [ ! -d "/proc/bc" ]; then | ||||
|     echo openvz | ||||
|     exit | ||||
| fi | ||||
| 
 | ||||
| if [ -e "/proc/1/environ" ] && | ||||
|     tr '\000' '\n' < "/proc/1/environ" | grep -Eiq '^container='; then | ||||
|     echo lxc | ||||
|     exit | ||||
| fi | ||||
| 
 | ||||
| if [ -r /proc/cpuinfo ]; then | ||||
|     # this should only exist on virtual guest machines, | ||||
|     # tested on vmware, xen, kvm | ||||
|     if grep -q "hypervisor" /proc/cpuinfo; then | ||||
|         # this file is aviable in xen guest systems | ||||
|         if [ -r /sys/hypervisor/type ]; then | ||||
|             if grep -q -i "xen" /sys/hypervisor/type; then | ||||
|                 echo virtual_by_xen | ||||
|                 exit  | ||||
|             fi | ||||
|         else | ||||
|             if [ -r /sys/class/dmi/id/product_name ]; then | ||||
|                 if grep -q -i 'vmware' /sys/class/dmi/id/product_name; then | ||||
|                     echo "virtual_by_vmware" | ||||
|                     exit | ||||
|                 elif grep -q -i 'bochs' /sys/class/dmi/id/product_name; then | ||||
|                     echo "virtual_by_kvm" | ||||
|                     exit  | ||||
|                 elif grep -q -i 'virtualbox' /sys/class/dmi/id/product_name; then | ||||
|                     echo "virtual_by_virtualbox" | ||||
|                     exit  | ||||
|                 fi | ||||
|             fi | ||||
| 
 | ||||
|             if [ -r /sys/class/dmi/id/sys_vendor ]; then | ||||
|                 if grep -q -i 'qemu' /sys/class/dmi/id/sys_vendor; then | ||||
|                     echo "virtual_by_kvm" | ||||
|                     exit | ||||
|                 fi | ||||
|             fi | ||||
| 
 | ||||
|             if [ -r /sys/class/dmi/id/chassis_vendor ]; then | ||||
|                 if grep -q -i 'qemu' /sys/class/dmi/id/chassis_vendor; then | ||||
|                     echo "virtual_by_kvm" | ||||
|                     exit | ||||
|                 fi | ||||
|             fi                         | ||||
|         fi | ||||
|         echo "virtual_by_unknown" | ||||
|     else | ||||
|         echo "physical" | ||||
|     fi | ||||
| else | ||||
|     echo "unknown" | ||||
| fi | ||||
|  | @ -1,41 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2014 Daniel Heule  (hda at sfs.biz) | ||||
| # 2014 Thomas Oettli (otho at sfs.biz) | ||||
| # Copyright 2017, Philippe Gregoire <pg@pgregoire.xyz> | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| # FIXME: other system types (not linux ...) | ||||
| 
 | ||||
| os=$("$__explorer/os") | ||||
| case "$os" in | ||||
|     "macosx") | ||||
|         echo "$(sysctl -n hw.memsize)/1024" | bc | ||||
|     ;; | ||||
| 
 | ||||
|     "openbsd") | ||||
|         echo "$(sysctl -n hw.physmem) / 1048576" | bc | ||||
|     ;; | ||||
| 
 | ||||
|     *) | ||||
|     if [ -r /proc/meminfo ]; then | ||||
|         grep "MemTotal:" /proc/meminfo | awk '{print $2}' | ||||
|     fi | ||||
|     ;; | ||||
| esac | ||||
|  | @ -1,153 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # Copyright 2017, Philippe Gregoire <pg@pgregoire.xyz> | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # All os variables are lower case.  Keep this file in alphabetical | ||||
| # order by os variable except in cases where order otherwise matters, | ||||
| # in which case keep the primary os and its derivatives together in | ||||
| # a block (see Debian and Redhat examples below). | ||||
| # | ||||
| 
 | ||||
| if grep -q ^Amazon /etc/system-release 2>/dev/null; then | ||||
|    echo amazon | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/arch-release ]; then | ||||
|    echo archlinux | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/cdist-preos ]; then | ||||
|    echo cdist-preos | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -d /gnu/store ]; then | ||||
|    echo guixsd | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| ### Debian and derivatives | ||||
| if grep -q ^DISTRIB_ID=Ubuntu /etc/lsb-release 2>/dev/null; then | ||||
|    echo ubuntu | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| # devuan ascii has both devuan_version and debian_version, so we need to check devuan_version first! | ||||
| if [ -f /etc/devuan_version ]; then | ||||
|    echo devuan | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/debian_version ]; then | ||||
|    echo debian | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| ### | ||||
| 
 | ||||
| if [ -f /etc/gentoo-release ]; then | ||||
|    echo gentoo | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/openwrt_version ]; then | ||||
|     echo openwrt | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/owl-release ]; then | ||||
|    echo owl | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| ### Redhat and derivatives | ||||
| if grep -q ^Scientific /etc/redhat-release 2>/dev/null; then | ||||
|     echo scientific | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| if grep -q ^CentOS /etc/redhat-release 2>/dev/null; then | ||||
|     echo centos | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| if grep -q ^Fedora /etc/redhat-release 2>/dev/null; then | ||||
|    echo fedora | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if grep -q ^Mitel /etc/redhat-release 2>/dev/null; then | ||||
|    echo mitel | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/redhat-release ]; then | ||||
|    echo redhat | ||||
|    exit 0 | ||||
| fi | ||||
| ### | ||||
| 
 | ||||
| if [ -f /etc/SuSE-release ]; then | ||||
|    echo suse | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [ -f /etc/slackware-version ]; then | ||||
|    echo slackware | ||||
|    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 | ||||
| 
 | ||||
| if [ -f /etc/os-release ]; then | ||||
|    # already lowercase, according to: | ||||
|    # https://www.freedesktop.org/software/systemd/man/os-release.html | ||||
|    awk -F= '/^ID=/ { if ($2 ~ /^'"'"'(.*)'"'"'$/ || $2 ~ /^"(.*)"$/) { print substr($2, 2, length($2) - 2) } else { print $2 } }' /etc/os-release | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| echo "Unknown OS" >&2 | ||||
| exit 1 | ||||
|  | @ -1,73 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # All os variables are lower case | ||||
| # | ||||
| # | ||||
| 
 | ||||
| case "$("$__explorer/os")" in | ||||
|    amazon) | ||||
|       cat /etc/system-release | ||||
|    ;; | ||||
|    archlinux) | ||||
|       # empty, but well... | ||||
|       cat /etc/arch-release | ||||
|    ;; | ||||
|    debian) | ||||
|       cat /etc/debian_version | ||||
|    ;; | ||||
|    devuan) | ||||
|       cat /etc/devuan_version | ||||
|    ;; | ||||
|    fedora) | ||||
|       cat /etc/fedora-release | ||||
|    ;; | ||||
|    gentoo) | ||||
|       cat /etc/gentoo-release | ||||
|    ;; | ||||
|    macosx) | ||||
|       sw_vers -productVersion | ||||
|    ;; | ||||
|    *bsd|solaris) | ||||
|       uname -r | ||||
|    ;; | ||||
|    openwrt) | ||||
|       cat /etc/openwrt_version | ||||
|    ;; | ||||
|    owl) | ||||
|       cat /etc/owl-release | ||||
|    ;; | ||||
|    redhat|centos|mitel|scientific) | ||||
|       cat /etc/redhat-release | ||||
|    ;; | ||||
|    slackware) | ||||
|       cat /etc/slackware-version | ||||
|    ;; | ||||
|    suse) | ||||
|       if [ -f /etc/os-release ]; then | ||||
|         cat /etc/os-release | ||||
|       else | ||||
|         cat /etc/SuSE-release | ||||
|       fi | ||||
|    ;; | ||||
|    ubuntu) | ||||
|       lsb_release -sr | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,62 +0,0 @@ | |||
| ## # | ||||
| ## # Sample manifest from cdist distribution | ||||
| ## # | ||||
| ##  | ||||
| ## # Every machine becomes a marker, so sysadmins know that automatic | ||||
| ## # configurations are happening | ||||
| ## __file /etc/cdist-configured | ||||
| ## __cdistmarker | ||||
| ##  | ||||
| ## case "$__target_host" in | ||||
| ##    # Everybody has this | ||||
| ##    localhost) | ||||
| ##       require="__file/etc/cdist-configured" __link /tmp/cdist-testfile \ | ||||
| ##          --source /etc/cdist-configured  --type symbolic | ||||
| ##       require="__directory/tmp/cdist-test-dir" __file /tmp/cdist-test-dir/test-file \ | ||||
| ##          --mode 0750 --owner nobody --group root | ||||
| ##       __directory /tmp/cdist-test-dir --mode 4777 | ||||
| ##  | ||||
| ##       require="__file/etc/cdist-configured __link/tmp/cdist-testfile" \ | ||||
| ##          __file /tmp/cdist-another-testfile | ||||
| ##  | ||||
| ##    ;; | ||||
| ##  | ||||
| ##    # | ||||
| ##    # Use an alias in /etc/hosts for localhost to use these hosts: | ||||
| ##    #  | ||||
| ##    # 127.0.0.1    localhost.localdomain   localhost cdist-archlinux | ||||
| ##    # | ||||
| ##    cdist-archlinux) | ||||
| ##       # This is the specific package type for pacman | ||||
| ##       __package_pacman zsh --state installed | ||||
| ##        | ||||
| ##       # The __package type autoselect the right type based on the os | ||||
| ##       __package vim --state installed | ||||
| ##  | ||||
| ##       # If the type is a singleton, it does not take an object id | ||||
| ##       __issue | ||||
| ##    ;; | ||||
| ##    # This is how it would look like on gentoo | ||||
| ##    cdist-gentoo) | ||||
| ##       # Same stuff for gentoo | ||||
| ##       __package tree --state installed | ||||
| ##    ;; | ||||
| ##  | ||||
| ##    cdist-debian) | ||||
| ##       __package_apt atop --state installed | ||||
| ##       __package apache2 --state removed | ||||
| ##    ;; | ||||
| ##  | ||||
| ##    cdist-redhat) | ||||
| ##       __issue | ||||
| ##       __motd | ||||
| ##    ;; | ||||
| ##  | ||||
| ##    # Real machines may be used with their hostname or fqdn, | ||||
| ##    # depending on how you call cdist | ||||
| ##    # ... | ||||
| ##    # ;; | ||||
| ##    # machine.example.org) | ||||
| ##    # ... | ||||
| ##    # ;; | ||||
| ## esac | ||||
|  | @ -1,31 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2018 Ander Punnar (ander-at-kvlt-dot-ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| [ ! -e "/$__object_id" ] && exit 0 | ||||
| 
 | ||||
| if ! command -v getfacl > /dev/null | ||||
| then | ||||
|     echo 'getfacl not available' >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| getfacl "/$__object_id" 2>/dev/null \ | ||||
|     | grep -Eo '^(default:)?(user|group|(mask|other):):[^:][[:graph:]]+' \ | ||||
|     || true | ||||
|  | @ -1,39 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2019 Ander Punnar (ander-at-kvlt-dot-ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| # TODO check if filesystem has ACL turned on etc | ||||
| 
 | ||||
| if [ -f "$__object/parameter/acl" ] | ||||
| then | ||||
|     grep -E '^(default:)?(user|group):' "$__object/parameter/acl" \ | ||||
|     | while read -r acl | ||||
|     do | ||||
|         param="$( echo "$acl" | awk -F: '{print $(NF-2)}' )" | ||||
|         check="$( echo "$acl" | awk -F: '{print $(NF-1)}' )" | ||||
| 
 | ||||
|         [ "$param" = 'user' ] && db=passwd || db="$param" | ||||
| 
 | ||||
|         if ! getent "$db" "$check" > /dev/null | ||||
|         then | ||||
|             echo "missing $param '$check'" >&2 | ||||
|             exit 1 | ||||
|         fi | ||||
|     done | ||||
| fi | ||||
|  | @ -1,31 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2018 Ander Punnar (ander-at-kvlt-dot-ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if [ -e "/$__object_id" ] | ||||
| then | ||||
|     if [ -d "/$__object_id" ] | ||||
|     then echo directory | ||||
|     elif [ -f "/$__object_id" ] | ||||
|     then echo regular | ||||
|     else echo other | ||||
|     fi | ||||
| else | ||||
|     echo missing | ||||
| fi | ||||
|  | @ -1,129 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2018 Ander Punnar (ander-at-kvlt-dot-ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| file_is="$( cat "$__object/explorer/file_is" )" | ||||
| 
 | ||||
| [ "$file_is" = 'missing' ] && [ -z "$__cdist_dry_run" ] && exit 0 | ||||
| 
 | ||||
| os="$( cat "$__global/explorer/os" )" | ||||
| 
 | ||||
| acl_path="/$__object_id" | ||||
| 
 | ||||
| acl_is="$( cat "$__object/explorer/acl_is" )" | ||||
| 
 | ||||
| if [ -f "$__object/parameter/entry" ] | ||||
| then | ||||
|     acl_should="$( cat "$__object/parameter/entry" )" | ||||
| elif [ -f "$__object/parameter/acl" ] | ||||
| then | ||||
|     acl_should="$( cat "$__object/parameter/acl" )" | ||||
| elif | ||||
|     [ -f "$__object/parameter/user" ] \ | ||||
|         || [ -f "$__object/parameter/group" ] \ | ||||
|         || [ -f "$__object/parameter/mask" ] \ | ||||
|         || [ -f "$__object/parameter/other" ] | ||||
| then | ||||
|     acl_should="$( for param in user group mask other | ||||
|     do | ||||
|         [ ! -f "$__object/parameter/$param" ] && continue | ||||
| 
 | ||||
|         echo "$param" | grep -Eq 'mask|other' && sep=:: || sep=: | ||||
| 
 | ||||
|         echo "$param$sep$( cat "$__object/parameter/$param" )" | ||||
|     done )" | ||||
| else | ||||
|     echo 'no parameters set' >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [ -f "$__object/parameter/default" ] | ||||
| then | ||||
|     acl_should="$( echo "$acl_should" \ | ||||
|         | sed 's/^default://' \ | ||||
|         | sort -u \ | ||||
|         | sed 's/\(.*\)/default:\1\n\1/' )" | ||||
| fi | ||||
| 
 | ||||
| if [ "$file_is" = 'regular' ] \ | ||||
|     && echo "$acl_should" | grep -Eq '^default:' | ||||
| then | ||||
|     # only directories can have default ACLs, | ||||
|     # but instead of error, | ||||
|     # let's just remove default entries | ||||
|     acl_should="$( echo "$acl_should" | grep -Ev '^default:' )" | ||||
| fi | ||||
| 
 | ||||
| if echo "$acl_should" | awk -F: '{ print $NF }' | grep -Fq 'X' | ||||
| then | ||||
|     [ "$file_is" = 'directory' ] && rep=x || rep=- | ||||
| 
 | ||||
|     acl_should="$( echo "$acl_should" | sed "s/\\(.*\\)X/\\1$rep/" )" | ||||
| fi | ||||
| 
 | ||||
| setfacl_exec='setfacl' | ||||
| 
 | ||||
| if [ -f "$__object/parameter/recursive" ] | ||||
| then | ||||
|     if echo "$os" | grep -Fq 'freebsd' | ||||
|     then | ||||
|         echo "$os setfacl do not support recursive operations" >&2 | ||||
|     else | ||||
|         setfacl_exec="$setfacl_exec -R" | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| if [ -f "$__object/parameter/remove" ] | ||||
| then | ||||
|     echo "$acl_is" | while read -r acl | ||||
|     do | ||||
|         # skip wanted ACL entries which already exist | ||||
|         # and skip mask and other entries, because we | ||||
|         # can't actually remove them, but only change. | ||||
|         if echo "$acl_should" | grep -Eq "^$acl" \ | ||||
|             || echo "$acl" | grep -Eq '^(default:)?(mask|other)' | ||||
|         then continue | ||||
|         fi | ||||
| 
 | ||||
|         if echo "$os" | grep -Fq 'freebsd' | ||||
|         then | ||||
|             remove="$acl" | ||||
|         else | ||||
|             remove="$( echo "$acl" | sed 's/:...$//' )" | ||||
|         fi | ||||
| 
 | ||||
|         echo "$setfacl_exec -x \"$remove\" \"$acl_path\"" | ||||
|         echo "removed '$remove'" >> "$__messages_out" | ||||
|     done | ||||
| fi | ||||
| 
 | ||||
| for acl in $acl_should | ||||
| do | ||||
|     if ! echo "$acl_is" | grep -Eq "^$acl" | ||||
|     then | ||||
|         if echo "$os" | grep -Fq 'freebsd' \ | ||||
|             && echo "$acl" | grep -Eq '^default:' | ||||
|         then | ||||
|             echo "setting default ACL in $os is currently not supported" >&2 | ||||
|         else | ||||
|             echo "$setfacl_exec -m \"$acl\" \"$acl_path\"" | ||||
|             echo "added '$acl'" >> "$__messages_out" | ||||
|         fi | ||||
|     fi | ||||
| done | ||||
|  | @ -1,85 +0,0 @@ | |||
| cdist-type__acl(7) | ||||
| ================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__acl - Set ACL entries | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Fully supported and tested on Linux (ext4 filesystem), partial support for FreeBSD. | ||||
| 
 | ||||
| See ``setfacl`` and ``acl`` manpages for more details. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED MULTIPLE PARAMETERS | ||||
| ---------------------------- | ||||
| entry | ||||
|    Set ACL entry following ``getfacl`` output syntax. | ||||
| 
 | ||||
| 
 | ||||
| BOOLEAN PARAMETERS | ||||
| ------------------ | ||||
| default | ||||
|    Set all ACL entries as default too. | ||||
|    Only directories can have default ACLs. | ||||
|    Setting default ACL in FreeBSD is currently not supported. | ||||
| 
 | ||||
| recursive | ||||
|    Make ``setfacl`` recursive (Linux only), but not ``getfacl`` in explorer. | ||||
| 
 | ||||
| remove | ||||
|    Remove undefined ACL entries. | ||||
|    ``mask`` and ``other`` entries can't be removed, but only changed. | ||||
| 
 | ||||
| 
 | ||||
| DEPRECATED PARAMETERS | ||||
| --------------------- | ||||
| Parameters ``acl``, ``user``, ``group``, ``mask`` and ``other`` are deprecated and they | ||||
| will be removed in future versions. Please use ``entry`` parameter instead. | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __acl /srv/project \ | ||||
|         --default \ | ||||
|         --recursive \ | ||||
|         --remove \ | ||||
|         --entry user:alice:rwx \ | ||||
|         --entry user:bob:r-x \ | ||||
|         --entry group:project-group:rwx \ | ||||
|         --entry group:some-other-group:r-x \ | ||||
|         --entry mask::r-x \ | ||||
|         --entry other::r-x | ||||
| 
 | ||||
|     # give Alice read-only access to subdir, | ||||
|     # but don't allow her to see parent content. | ||||
| 
 | ||||
|     __acl /srv/project2 \ | ||||
|         --remove \ | ||||
|         --entry default:group:secret-project:rwx \ | ||||
|         --entry group:secret-project:rwx \ | ||||
|         --entry user:alice:--x | ||||
| 
 | ||||
|     __acl /srv/project2/subdir \ | ||||
|         --default \ | ||||
|         --remove \ | ||||
|         --entry group:secret-project:rwx \ | ||||
|         --entry user:alice:r-x | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Ander Punnar <ander-at-kvlt-dot-ee> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2018 Ander Punnar. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,3 +0,0 @@ | |||
| recursive | ||||
| default | ||||
| remove | ||||
|  | @ -1 +0,0 @@ | |||
| see manual for details | ||||
|  | @ -1 +0,0 @@ | |||
| see manual for details | ||||
|  | @ -1 +0,0 @@ | |||
| see manual for details | ||||
|  | @ -1 +0,0 @@ | |||
| see manual for details | ||||
|  | @ -1 +0,0 @@ | |||
| see manual for details | ||||
|  | @ -1,2 +0,0 @@ | |||
| mask | ||||
| other | ||||
|  | @ -1,4 +0,0 @@ | |||
| entry | ||||
| acl | ||||
| user | ||||
| group | ||||
|  | @ -1,46 +0,0 @@ | |||
| cdist-type__apt_default_release(7) | ||||
| ================================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_default_release - Configure the default release for apt | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Configure the default release for apt, using the APT::Default-Release | ||||
| configuration value. | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| release | ||||
|    The value to set APT::Default-Release to. | ||||
| 
 | ||||
|    This can contain release name, codename or release version. Examples: | ||||
|    'stable', 'testing', 'unstable', 'stretch', 'buster', '4.0', '5.0*'. | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __apt_default_release --release stretch | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Matthijs Kooijman <matthijs--@--stdin.nl> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2017 Matthijs Kooijman. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,41 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # 2017 Matthijs Kooijman (matthijs at stdin.nl) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| 
 | ||||
| os=$(cat "$__global/explorer/os") | ||||
| release="$(cat "$__object/parameter/release")" | ||||
| 
 | ||||
| case "$os" in | ||||
|    ubuntu|debian|devuan) | ||||
|       __file /etc/apt/apt.conf.d/99-default-release \ | ||||
|          --owner root --group root --mode 644 \ | ||||
|          --source - << DONE | ||||
| APT::Default-Release "$release"; | ||||
| DONE | ||||
|    ;; | ||||
|    *) | ||||
|       cat >&2 << DONE | ||||
| The developer of this type (${__type##*/}) did not think your operating system | ||||
| ($os) would have any use for it. If you think otherwise please submit a patch. | ||||
| DONE | ||||
|       exit 1 | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1 +0,0 @@ | |||
| release | ||||
|  | @ -1,44 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2011-2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| # Get the current state of the apt key. | ||||
| # | ||||
| 
 | ||||
| if [ -f "$__object/parameter/keyid" ]; then | ||||
|    keyid="$(cat "$__object/parameter/keyid")" | ||||
| else | ||||
|    keyid="$__object_id" | ||||
| fi | ||||
| 
 | ||||
| keydir="$(cat "$__object/parameter/keydir")" | ||||
| keyfile="$keydir/$__object_id.gpg" | ||||
| 
 | ||||
| if [ -d "$keydir" ] | ||||
| then | ||||
|    if [ -f "$keyfile" ] | ||||
|    then echo present | ||||
|    else echo absent | ||||
|    fi | ||||
| else | ||||
|    # fallback to deprecated apt-key | ||||
|    apt-key export "$keyid" | head -n 1 | grep -Fqe "BEGIN PGP PUBLIC KEY BLOCK" \ | ||||
|       && echo present \ | ||||
|       || echo absent | ||||
| fi | ||||
|  | @ -1,112 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2011-2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if [ -f "$__object/parameter/keyid" ]; then | ||||
|    keyid="$(cat "$__object/parameter/keyid")" | ||||
| else | ||||
|    keyid="$__object_id" | ||||
| fi | ||||
| state_should="$(cat "$__object/parameter/state")" | ||||
| state_is="$(cat "$__object/explorer/state")" | ||||
| 
 | ||||
| if [ "$state_should" = "$state_is" ]; then | ||||
|    # nothing to do | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| keydir="$(cat "$__object/parameter/keydir")" | ||||
| keyfile="$keydir/$__object_id.gpg" | ||||
| 
 | ||||
| case "$state_should" in | ||||
|    present) | ||||
|       keyserver="$(cat "$__object/parameter/keyserver")" | ||||
| 
 | ||||
|       if [ -f "$__object/parameter/uri" ]; then | ||||
|          uri="$(cat "$__object/parameter/uri")" | ||||
| 
 | ||||
|          if [ -d "$keydir" ]; then | ||||
|             cat << EOF | ||||
| 
 | ||||
| curl -s -L \\ | ||||
|     -o "$keyfile" \\ | ||||
|     "$uri" | ||||
| 
 | ||||
| key="\$( cat "$keyfile" )" | ||||
| 
 | ||||
| if echo "\$key" | grep -Fq 'BEGIN PGP PUBLIC KEY BLOCK' | ||||
| then | ||||
|     echo "\$key" | gpg --dearmor > "$keyfile" | ||||
| fi | ||||
| 
 | ||||
| EOF | ||||
|          else | ||||
|             # fallback to deprecated apt-key | ||||
|             echo "curl -s -L '$uri' | apt-key add -" | ||||
|          fi | ||||
|       elif [ -d "$keydir" ]; then | ||||
|          # we need to kill gpg after 30 seconds, because gpg | ||||
|          # can get stuck if keyserver is not responding. | ||||
|          # exporting env var and not exit 1, | ||||
|          # because we need to clean up and kill dirmngr. | ||||
|          cat << EOF | ||||
| 
 | ||||
| gpgtmphome="\$( mktemp -d )" | ||||
| 
 | ||||
| if timeout 30s \\ | ||||
|     gpg --homedir "\$gpgtmphome" \\ | ||||
|         --keyserver "$keyserver" \\ | ||||
|         --recv-keys "$keyid" | ||||
| then | ||||
|     gpg --homedir "\$gpgtmphome" \\ | ||||
|         --export "$keyid" \\ | ||||
|         > "$keyfile" | ||||
| else | ||||
|     export GPG_GOT_STUCK=1 | ||||
| fi | ||||
| 
 | ||||
| GNUPGHOME="\$gpgtmphome" gpgconf --kill dirmngr | ||||
| 
 | ||||
| rm -rf "\$gpgtmphome" | ||||
| 
 | ||||
| if [ -n "\$GPG_GOT_STUCK" ] | ||||
| then | ||||
|     echo "GPG GOT STUCK - no response from keyserver after 30 seconds" >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| EOF | ||||
|       else | ||||
|          # fallback to deprecated apt-key | ||||
|          echo "apt-key adv --keyserver \"$keyserver\" --recv-keys \"$keyid\"" | ||||
|       fi | ||||
| 
 | ||||
|       echo "added '$keyid'" >> "$__messages_out" | ||||
|    ;; | ||||
|    absent) | ||||
|       if [ -f "$keyfile" ]; then | ||||
|          echo "rm '$keyfile'" | ||||
|       else | ||||
|          # fallback to deprecated apt-key | ||||
|          echo "apt-key del \"$keyid\"" | ||||
|       fi | ||||
| 
 | ||||
|       echo "removed '$keyid'" >> "$__messages_out" | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,72 +0,0 @@ | |||
| cdist-type__apt_key(7) | ||||
| ====================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_key - Manage the list of keys used by apt | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Manages the list of keys used by apt to authenticate packages. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| state | ||||
|    'present' or 'absent'. Defaults to 'present' | ||||
| 
 | ||||
| keyid | ||||
|    the id of the key to add. Defaults to __object_id | ||||
| 
 | ||||
| keyserver | ||||
|    the keyserver from which to fetch the key. If omitted the default set | ||||
|    in ./parameter/default/keyserver is used. | ||||
| 
 | ||||
| keydir | ||||
|    key save location, defaults to ``/etc/apt/trusted.pgp.d`` | ||||
| 
 | ||||
| uri | ||||
|    the URI from which to download the key | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     # Add Ubuntu Archive Automatic Signing Key | ||||
|     __apt_key 437D05B5 | ||||
|     # Same thing | ||||
|     __apt_key 437D05B5 --state present | ||||
|     # Get rid of it | ||||
|     __apt_key 437D05B5 --state absent | ||||
| 
 | ||||
|     # same thing with human readable name and explicit keyid | ||||
|     __apt_key UbuntuArchiveKey --keyid 437D05B5 | ||||
| 
 | ||||
|     # same thing with other keyserver | ||||
|     __apt_key UbuntuArchiveKey --keyid 437D05B5 --keyserver keyserver.ubuntu.com | ||||
| 
 | ||||
|     # download key from the internet | ||||
|     __apt_key rabbitmq \ | ||||
|        --uri http://www.rabbitmq.com/rabbitmq-signing-key-public.asc | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| Ander Punnar <ander-at-kvlt-dot-ee> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2011-2019 Steven Armstrong and Ander Punnar. You can | ||||
| redistribute it and/or modify it under the terms of the GNU General Public | ||||
| License as published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,8 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| 
 | ||||
| __package gnupg | ||||
| 
 | ||||
| if [ -f "$__object/parameter/uri" ] | ||||
| then __package curl | ||||
| else __package dirmngr | ||||
| fi | ||||
|  | @ -1 +0,0 @@ | |||
| /etc/apt/trusted.gpg.d | ||||
|  | @ -1 +0,0 @@ | |||
| pool.sks-keyservers.net | ||||
|  | @ -1 +0,0 @@ | |||
| present | ||||
|  | @ -1,5 +0,0 @@ | |||
| state | ||||
| keyid | ||||
| keyserver | ||||
| keydir | ||||
| uri | ||||
|  | @ -1,45 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2011-2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if [ -f "$__object/parameter/name" ]; then | ||||
|    name="$(cat "$__object/parameter/name")" | ||||
| else | ||||
|    name="$__object_id" | ||||
| fi | ||||
| state_should="$(cat "$__object/parameter/state")" | ||||
| state_is="$(cat "$__object/explorer/state")" | ||||
| 
 | ||||
| if [ "$state_should" = "$state_is" ]; then | ||||
|    # nothing to do | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| case "$state_should" in | ||||
|    present) | ||||
|       uri="$(cat "$__object/parameter/uri")" | ||||
|       printf 'curl -s -L "%s" | apt-key add -\n' "$uri" | ||||
|    ;; | ||||
|    absent) | ||||
|       cat << DONE | ||||
| keyid=\$(apt-key list | grep -B1 "$name" | awk '/pub/ { print \$2 }' | cut -d'/' -f 2) | ||||
| apt-key del \$keyid | ||||
| DONE | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,51 +0,0 @@ | |||
| cdist-type__apt_key_uri(7) | ||||
| ========================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_key_uri - Add apt key from uri | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Download a key from an uri and add it to the apt keyring. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| uri | ||||
|    the uri from which to download the key | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| state | ||||
|    'present' or 'absent', defaults to 'present' | ||||
| 
 | ||||
| name | ||||
|    a name for this key, used when testing if it is already installed. | ||||
|    Defaults to __object_id | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __apt_key_uri rabbitmq \ | ||||
|        --name 'RabbitMQ Release Signing Key <info@rabbitmq.com>' \ | ||||
|        --uri http://www.rabbitmq.com/rabbitmq-signing-key-public.asc \ | ||||
|        --state present | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2011-2014 Steven Armstrong. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,21 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2013-2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| __package curl | ||||
|  | @ -1 +0,0 @@ | |||
| present | ||||
|  | @ -1,2 +0,0 @@ | |||
| state | ||||
| name | ||||
|  | @ -1 +0,0 @@ | |||
| uri | ||||
|  | @ -1,31 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2016 Ander Punnar (cdist at kvlt.ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| apt_version_is=$(dpkg-query --show --showformat '${Version}' apt) | ||||
| 
 | ||||
| # from APT changelog: | ||||
| #   apt (0.8.14.2) UNRELEASED; urgency=low | ||||
| #   provide a 'dpkg --set-selections' wrapper to set/release holds | ||||
| 
 | ||||
| apt_version_should=0.8.14.2 | ||||
| 
 | ||||
| dpkg --compare-versions "$apt_version_should" le "$apt_version_is" \ | ||||
|     && echo 0 \ | ||||
|     || echo 1 | ||||
|  | @ -1,30 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2016 Ander Punnar (cdist at kvlt.ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if [ -f "$__object/parameter/name" ]; then | ||||
|     name="$(cat "$__object/parameter/name")" | ||||
| else | ||||
|     name="$__object_id" | ||||
| fi | ||||
| 
 | ||||
| dpkg-query --show --showformat '${Status}' "$name" 2>/dev/null \ | ||||
|     | grep -Fq 'ok installed' \ | ||||
|     && echo 0 \ | ||||
|     || echo 1 | ||||
|  | @ -1,27 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2016 Ander Punnar (cdist at kvlt.ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if [ -f "$__object/parameter/name" ]; then | ||||
|     name="$(cat "$__object/parameter/name")" | ||||
| else | ||||
|     name="$__object_id" | ||||
| fi | ||||
| 
 | ||||
| apt-mark showhold | grep -Fq "$name" && echo hold || echo unhold | ||||
|  | @ -1,56 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2016 Ander Punnar (cdist at kvlt.ee) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| if [ -f "$__object/parameter/name" ]; then | ||||
|     name="$(cat "$__object/parameter/name")" | ||||
| else | ||||
|     name="$__object_id" | ||||
| fi | ||||
| 
 | ||||
| apt_version="$(cat "$__object/explorer/apt_version")" | ||||
| 
 | ||||
| if [ "$apt_version" != '0' ]; then | ||||
|     echo 'APT version not supported' >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| package_installed="$(cat "$__object/explorer/package_installed")" | ||||
| 
 | ||||
| if [ "$package_installed" != '0' ]; then | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| state_should="$(cat "$__object/parameter/state")" | ||||
| 
 | ||||
| state_is="$(cat "$__object/explorer/state")" | ||||
| 
 | ||||
| if [ "$state_should" = "$state_is" ]; then | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| case "$state_should" in | ||||
|     hold|unhold) | ||||
|         echo "apt-mark $state_should $name > /dev/null" | ||||
|     ;; | ||||
|     *) | ||||
|         echo "Unknown state: $state_should" >&2 | ||||
|         exit 1 | ||||
|     ;; | ||||
| esac | ||||
|  | @ -1,47 +0,0 @@ | |||
| cdist-type__apt_mark(7) | ||||
| ======================= | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_mark - set package state as 'hold' or 'unhold' | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| See apt-mark(8) for details. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| state | ||||
|    Either "hold" or "unhold". | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| name | ||||
|    If supplied, use the name and not the object id as the package name. | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     # hold package | ||||
|     __apt_mark quagga --state hold | ||||
|     # unhold package | ||||
|     __apt_mark quagga --state unhold | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Ander Punnar <cdist--@--kvlt.ee> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2016 Ander Punnar. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,42 +0,0 @@ | |||
| cdist-type__apt_norecommends(7) | ||||
| =============================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_norecommends - Configure apt to not install recommended packages | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Configure apt to not install any recommended or suggested packages. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __apt_norecommends | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2014 Steven Armstrong. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,44 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| 
 | ||||
| os=$(cat "$__global/explorer/os") | ||||
| 
 | ||||
| case "$os" in | ||||
|    ubuntu|debian|devuan) | ||||
|       # No stinking recommends thank you very much. | ||||
|       # If I want something installed I will do so myself. | ||||
|       __file /etc/apt/apt.conf.d/99-no-recommends \ | ||||
|          --owner root --group root --mode 644 \ | ||||
|          --source - << DONE | ||||
| APT::Install-Recommends "0"; | ||||
| APT::Install-Suggests "0"; | ||||
| APT::AutoRemove::RecommendsImportant "0"; | ||||
| APT::AutoRemove::SuggestsImportant "0"; | ||||
| DONE | ||||
|    ;; | ||||
|    *) | ||||
|       cat >&2 << DONE | ||||
| The developer of this type (${__type##*/}) did not think your operating system | ||||
| ($os) would have any use for it. If you think otherwise please submit a patch. | ||||
| DONE | ||||
|       exit 1 | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,50 +0,0 @@ | |||
| cdist-type__apt_ppa(7) | ||||
| ====================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_ppa - Manage ppa repositories | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| This cdist type allows manage ubuntu ppa repositories. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| state | ||||
|    The state the ppa should be in, either 'present' or 'absent'. | ||||
|    Defaults to 'present' | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     # Enable a ppa repository | ||||
|     __apt_ppa ppa:sans-intern/missing-bits | ||||
|     # same as | ||||
|     __apt_ppa ppa:sans-intern/missing-bits --state present | ||||
| 
 | ||||
|     # Disable a ppa repository | ||||
|     __apt_ppa ppa:sans-intern/missing-bits --state absent | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2011-2014 Steven Armstrong. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1 +0,0 @@ | |||
| present | ||||
|  | @ -1,15 +0,0 @@ | |||
| #!/bin/sh | ||||
| set -u | ||||
| 
 | ||||
| entry="$uri $distribution $component" | ||||
| cat << DONE | ||||
| # Created by cdist ${__type##*/} | ||||
| # Do not change. Changes will be overwritten. | ||||
| # | ||||
| 
 | ||||
| # $name | ||||
| deb ${forcedarch} $entry | ||||
| DONE | ||||
| if [ -f "$__object/parameter/include-src" ]; then | ||||
|    echo "deb-src $entry" | ||||
| fi | ||||
|  | @ -1,28 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2018 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # | ||||
| 
 | ||||
| name="$__object_id" | ||||
| destination="/etc/apt/sources.list.d/${name}.list" | ||||
| 
 | ||||
| if grep -q "^__file${destination}" "$__messages_in"; then | ||||
|    printf 'apt-get update || apt-get update\n' | ||||
| fi | ||||
| 
 | ||||
|  | @ -1,70 +0,0 @@ | |||
| cdist-type__apt_source(7) | ||||
| ========================= | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_source - Manage apt sources | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| This cdist type allows you to manage apt sources. It invokes index update | ||||
| internally when needed so call of index updating type is not needed. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| uri | ||||
|    the uri to the apt repository | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| arch | ||||
|    set this if you need to force and specific arch (ubuntu specific) | ||||
| 
 | ||||
| state | ||||
|    'present' or 'absent', defaults to 'present' | ||||
| 
 | ||||
| distribution | ||||
|    the distribution codename to use. Defaults to DISTRIB_CODENAME from | ||||
|    the targets /etc/lsb-release | ||||
| 
 | ||||
| component | ||||
|    space delimited list of components to enable. Defaults to an empty string. | ||||
| 
 | ||||
| 
 | ||||
| BOOLEAN PARAMETERS | ||||
| ------------------ | ||||
| include-src | ||||
|    include deb-src entries | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __apt_source rabbitmq \ | ||||
|        --uri http://www.rabbitmq.com/debian/ \ | ||||
|        --distribution testing \ | ||||
|        --component main \ | ||||
|        --include-src \ | ||||
|        --state present | ||||
| 
 | ||||
|     __apt_source canonical_partner \ | ||||
|        --uri http://archive.canonical.com/ \ | ||||
|        --component partner --state present | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2011-2018 Steven Armstrong. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,52 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2011-2018 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| name="$__object_id" | ||||
| state="$(cat "$__object/parameter/state")" | ||||
| uri="$(cat "$__object/parameter/uri")" | ||||
| 
 | ||||
| if [ -f "$__object/parameter/distribution" ]; then | ||||
|    distribution="$(cat "$__object/parameter/distribution")" | ||||
| else | ||||
|    distribution="$(cat "$__global/explorer/lsb_codename")" | ||||
| fi | ||||
| 
 | ||||
| component="$(cat "$__object/parameter/component")" | ||||
| 
 | ||||
| if [ -f "$__object/parameter/arch" ]; then | ||||
|    forcedarch="[arch=$(cat "$__object/parameter/arch")]" | ||||
| else | ||||
|    forcedarch="" | ||||
| fi | ||||
| 
 | ||||
| # export variables for use in template | ||||
| export name | ||||
| export uri | ||||
| export distribution | ||||
| export component | ||||
| export forcedarch | ||||
| 
 | ||||
| # generate file from template | ||||
| mkdir "$__object/files" | ||||
| "$__type/files/source.list.template" > "$__object/files/source.list" | ||||
| __file "/etc/apt/sources.list.d/${name}.list" \ | ||||
|    --source "$__object/files/source.list" \ | ||||
|    --owner root --group root --mode 0644 \ | ||||
|    --state "$state" | ||||
|  | @ -1 +0,0 @@ | |||
| include-src | ||||
|  | @ -1 +0,0 @@ | |||
| present | ||||
|  | @ -1,4 +0,0 @@ | |||
| state | ||||
| distribution | ||||
| component | ||||
| arch | ||||
|  | @ -1 +0,0 @@ | |||
| uri | ||||
|  | @ -1,26 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2011 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| # run 'apt-get update' if anything in /etc/apt is newer then /var/lib/apt/lists | ||||
| cat << DONE | ||||
| if find /etc/apt -mindepth 1 -cnewer /var/lib/apt/lists | grep . > /dev/null; then | ||||
|    apt-get update || apt-get update | ||||
| fi | ||||
| DONE | ||||
|  | @ -1,41 +0,0 @@ | |||
| cdist-type__apt_update_index(7) | ||||
| =============================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__apt_update_index - Update apt's package index | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| This cdist type runs apt-get update whenever any apt sources have changed. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| None. | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __apt_update_index | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2011 Steven Armstrong. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,40 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2013 Steven Armstrong (steven-cdist armstrong.cc) | ||||
| # 2014 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| 
 | ||||
| file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")" | ||||
| 
 | ||||
| # file does not exist, nothing we could do | ||||
| [ -f "$file" ] || exit 0 | ||||
| 
 | ||||
| prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id") | ||||
| suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id") | ||||
| awk -v prefix="^$prefix\$" -v suffix="^$suffix\$" '{ | ||||
|    if (match($0,prefix)) { | ||||
|       triggered=1 | ||||
|    } | ||||
|    if (triggered) { | ||||
|       if (match($0,suffix)) { | ||||
|             triggered=0 | ||||
|       } | ||||
|       print | ||||
|    } | ||||
| }' "$file" | ||||
|  | @ -1,89 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2013 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| # quote function from http://www.etalabs.net/sh_tricks.html | ||||
| quote() { | ||||
|    printf '%s\n' "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/" | ||||
| } | ||||
| 
 | ||||
| file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")" | ||||
| state_should=$(cat "$__object/parameter/state") | ||||
| prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id") | ||||
| suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id") | ||||
| 
 | ||||
| block="$__object/files/block" | ||||
| if [ ! -s "$__object/explorer/block" ]; then | ||||
|    state_is='absent' | ||||
| else | ||||
|    state_is=$(diff -q "$block" "$__object/explorer/block" >/dev/null \ | ||||
|       && echo present \ | ||||
|       || echo changed | ||||
|    ) | ||||
| fi | ||||
| 
 | ||||
| state_should="$(cat "$__object/parameter/state")" | ||||
| if [ "$state_should" = "$state_is" ]; then | ||||
|    # Nothing to do, move along | ||||
|    exit 0 | ||||
| fi | ||||
| 
 | ||||
| remove_block() { | ||||
|    cat << DONE | ||||
| tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX) | ||||
| # preserve ownership and permissions of existing file | ||||
| if [ -f "$file" ]; then | ||||
|    cp -p "$file" "\$tmpfile" | ||||
| fi | ||||
| awk -v prefix=^$(quote "$prefix")\$ -v suffix=^$(quote "$suffix")\$ ' | ||||
| { | ||||
|    if (match(\$0,prefix)) { | ||||
|       triggered=1 | ||||
|    } | ||||
|    if (triggered) { | ||||
|       if (match(\$0,suffix)) { | ||||
|          triggered=0 | ||||
|       } | ||||
|    } else { | ||||
|       print | ||||
|    } | ||||
| }' "$file" > "\$tmpfile" | ||||
| mv -f "\$tmpfile" "$file" | ||||
| DONE | ||||
| } | ||||
| 
 | ||||
| case "$state_should" in | ||||
|    present) | ||||
|       if [ "$state_is" = "changed" ]; then | ||||
|          echo update >> "$__messages_out" | ||||
|          remove_block | ||||
|       else | ||||
|          echo add >> "$__messages_out" | ||||
|       fi | ||||
|       cat << DONE | ||||
| cat >> "$file" << ${__type##*/}_DONE | ||||
| $(cat "$block") | ||||
| ${__type##*/}_DONE | ||||
| DONE | ||||
|    ;; | ||||
|    absent) | ||||
|       echo remove >> "$__messages_out" | ||||
|       remove_block | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,82 +0,0 @@ | |||
| cdist-type__block(7) | ||||
| ==================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__block - Manage blocks of text in files | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Manage a block of text in an existing file. | ||||
| The block is identified using the prefix and suffix parameters. | ||||
| Everything between prefix and suffix is considered to be a managed block | ||||
| of text. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| text | ||||
|    the text to manage. | ||||
|    If text is '-' (dash), take what was written to stdin as the text. | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| file | ||||
|    the file in which to manage the text block. | ||||
|    Defaults to object_id. | ||||
| 
 | ||||
| prefix | ||||
|    the prefix to add before the text. | ||||
|    Defaults to #cdist:__block/$__object_id | ||||
| 
 | ||||
| suffix | ||||
|    the suffix to add after the text. | ||||
|    Defaults to #/cdist:__block/$__object_id | ||||
| 
 | ||||
| state | ||||
|    'present' or 'absent', defaults to 'present' | ||||
| 
 | ||||
| 
 | ||||
| MESSAGES | ||||
| -------- | ||||
| add | ||||
|    block was added | ||||
| update | ||||
|    block was updated/changed | ||||
| remove | ||||
|    block was removed | ||||
| 
 | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     # text from argument | ||||
|     __block /path/to/file \ | ||||
|        --prefix '#start' \ | ||||
|        --suffix '#end' \ | ||||
|        --text 'some\nblock of\ntext' | ||||
| 
 | ||||
|     # text from stdin | ||||
|     __block some-id \ | ||||
|        --file /path/to/file \ | ||||
|        --text - << DONE | ||||
|     here some block | ||||
|     of text | ||||
|     DONE | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Steven Armstrong <steven-cdist--@--armstrong.cc> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2013 Steven Armstrong. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
|  | @ -1,34 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2013-2014 Steven Armstrong (steven-cdist at armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id") | ||||
| suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id") | ||||
| text=$(cat "$__object/parameter/text") | ||||
| 
 | ||||
| mkdir "$__object/files" | ||||
| # Generate text block for inclusion in file | ||||
| block="$__object/files/block" | ||||
| echo "$prefix" > "$block" | ||||
| if [ "$text" = "-" ]; then | ||||
|    cat "$__object/stdin" >> "$block" | ||||
| else | ||||
|    echo "$text" >> "$block" | ||||
| fi | ||||
| echo "$suffix" >> "$block" | ||||
|  | @ -1 +0,0 @@ | |||
| present | ||||
|  | @ -1,4 +0,0 @@ | |||
| file | ||||
| prefix | ||||
| state | ||||
| suffix | ||||
|  | @ -1 +0,0 @@ | |||
| text | ||||
|  | @ -1,56 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2013 Steven Armstrong (steven-cdist armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| destination="/$__object_id" | ||||
| 
 | ||||
| # nothing to work with, nothing we could do | ||||
| [ -e "$destination" ] || exit 0 | ||||
| 
 | ||||
| os=$("$__explorer/os") | ||||
| case "$os" in | ||||
|    "freebsd"|"netbsd"|"openbsd") | ||||
|       # FIXME: should be something like this based on man page, but can not test | ||||
|       stat -f "type: %ST | ||||
| owner: %Du %Su | ||||
| group: %Dg %Sg | ||||
| mode: %Op %Sp | ||||
| size: %Dz | ||||
| links: %Dl | ||||
| " "$destination" | ||||
|    ;; | ||||
|     "macosx") | ||||
|        stat -f "type: %HT | ||||
|  owner: %Du %Su | ||||
|  group: %Dg %Sg | ||||
|  mode: %Lp %Sp | ||||
|  size: %Dz | ||||
|  links: %Dl | ||||
|  " "$destination" | ||||
|     ;; | ||||
|    *) | ||||
|       stat --printf="type: %F | ||||
| owner: %u %U | ||||
| group: %g %G | ||||
| mode: %a %A | ||||
| size: %s | ||||
| links: %h | ||||
| " "$destination" | ||||
|    ;; | ||||
| esac | ||||
|  | @ -1,33 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # 2013 Steven Armstrong (steven-cdist armstrong.cc) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| destination="/$__object_id" | ||||
| 
 | ||||
| if [ ! -e "$destination" ]; then | ||||
|    echo none | ||||
| elif [ -h "$destination" ]; then | ||||
|    echo symlink | ||||
| elif [ -f "$destination" ]; then | ||||
|    echo file | ||||
| elif [ -d "$destination" ]; then | ||||
|    echo directory | ||||
| else | ||||
|    echo unknown | ||||
| fi | ||||
|  | @ -1,92 +0,0 @@ | |||
| #!/bin/sh -e | ||||
| # | ||||
| # 2014 Nico Schottelius (nico-cdist at schottelius.org) | ||||
| # | ||||
| # This file is part of cdist. | ||||
| # | ||||
| # cdist is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # cdist is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| 
 | ||||
| destination="/$__object_id" | ||||
| state_should="$(cat "$__object/parameter/state")" | ||||
| type="$(cat "$__object/explorer/type")" | ||||
| stat_file="$__object/explorer/stat" | ||||
| 
 | ||||
| 
 | ||||
| get_current_value() { | ||||
|     if [ -s "$stat_file" ]; then | ||||
|         _name="$1" | ||||
|         _value="$2" | ||||
|         case "$_value" in | ||||
|             [0-9]*) | ||||
|                 _index=2 | ||||
|             ;; | ||||
|             *) | ||||
|                 _index=3 | ||||
|             ;; | ||||
|         esac | ||||
|         awk '/'"$_name"':/ { print $'$_index' }' "$stat_file" | ||||
|         unset _name _value _index | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| set_group() { | ||||
|     echo "chgrp '$1' '$destination'" | ||||
|     echo "chgrp '$1'" >> "$__messages_out" | ||||
| } | ||||
| 
 | ||||
| set_owner() { | ||||
|     echo "chown '$1' '$destination'" | ||||
|     echo "chown '$1'" >> "$__messages_out" | ||||
| } | ||||
| 
 | ||||
| set_mode() { | ||||
|    echo "chmod '$1' '$destination'" | ||||
|    echo "chmod '$1'" >> "$__messages_out" | ||||
| } | ||||
| 
 | ||||
| case "$state_should" in | ||||
|     present|exists) | ||||
|     # Note: Mode - needs to happen last as a chown/chgrp can alter mode by | ||||
|     #  clearing S_ISUID and S_ISGID bits (see chown(2)) | ||||
|     for attribute in group owner mode; do | ||||
|         if [ -f "$__object/parameter/$attribute" ]; then | ||||
|             value_should="$(cat "$__object/parameter/$attribute")" | ||||
| 
 | ||||
|             # change 0xxx format to xxx format => same as stat returns | ||||
|             if [ "$attribute" = mode ]; then | ||||
|                 value_should="$(echo "$value_should" | sed 's/^0\(...\)/\1/')" | ||||
|             fi | ||||
|              | ||||
|             value_is="$(get_current_value "$attribute" "$value_should")" | ||||
|             if [ -f "$__object/files/set-attributes" ] || [ "$value_should" != "$value_is" ]; then | ||||
|                 "set_$attribute" "$value_should" | ||||
|             fi | ||||
|         fi | ||||
|     done | ||||
| 
 | ||||
|     ;; | ||||
| 
 | ||||
|     absent) | ||||
|         if [ "$type" = "file" ]; then | ||||
|             echo "rm -f '$destination'" | ||||
|             echo remove >> "$__messages_out" | ||||
|         fi | ||||
|     ;; | ||||
| 
 | ||||
|     *) | ||||
|         echo "Unknown state: $state_should" >&2 | ||||
|         exit 1 | ||||
|     ;; | ||||
| esac | ||||
|  | @ -1,78 +0,0 @@ | |||
| cdist-type__ccollect_source(7) | ||||
| ============================== | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type__ccollect_source - Manage ccollect sources | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| This cdist type allows you to create or delete ccollect sources. | ||||
| 
 | ||||
| 
 | ||||
| REQUIRED PARAMETERS | ||||
| ------------------- | ||||
| source | ||||
|     The source from which to backup | ||||
| destination | ||||
|     The destination directory | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL PARAMETERS | ||||
| ------------------- | ||||
| state | ||||
|     'present' or 'absent', defaults to 'present' | ||||
| ccollectconf | ||||
|     The CCOLLECT_CONF directory. Defaults to /etc/ccollect. | ||||
| 
 | ||||
| 
 | ||||
| OPTIONAL MULTIPLE PARAMETERS | ||||
| ---------------------------- | ||||
| exclude | ||||
|     Paths to exclude of backup | ||||
| 
 | ||||
| 
 | ||||
| BOOLEAN PARAMETERS | ||||
| ------------------ | ||||
| verbose | ||||
|     Whether to report backup verbosely | ||||
| 
 | ||||
| create-destination | ||||
|     Create the directory specified in the destination parameter on the remote host | ||||
| 
 | ||||
| EXAMPLES | ||||
| -------- | ||||
| 
 | ||||
| .. code-block:: sh | ||||
| 
 | ||||
|     __ccollect_source doc.ungleich.ch \ | ||||
|         --source doc.ungleich.ch:/ \ | ||||
|         --destination /backup/doc.ungleich.ch \ | ||||
|         --exclude '/proc/*' --exclude '/sys/*' \ | ||||
|         --verbose | ||||
| 
 | ||||
|     __ccollect_source doc.ungleich.ch \ | ||||
|         --source doc.ungleich.ch:/ \ | ||||
|         --destination /backup/doc.ungleich.ch \ | ||||
|         --exclude '/proc/*' --exclude '/sys/*' \ | ||||
|         --verbose \  | ||||
|         --create-destination | ||||
| 
 | ||||
| 
 | ||||
| SEE ALSO | ||||
| -------- | ||||
| :strong:`ccollect`\ (1) | ||||
| 
 | ||||
| 
 | ||||
| AUTHORS | ||||
| ------- | ||||
| Nico Schottelius <nico-cdist--@--schottelius.org> | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2014 Nico Schottelius. You can redistribute it | ||||
| and/or modify it under the terms of the GNU General Public License as | ||||
| published by the Free Software Foundation, either version 3 of the | ||||
| License, or (at your option) any later version. | ||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue