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 | # -vim | ||||||
| # Swap | .*.swp | ||||||
| [._]*.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~ |  | ||||||
| 
 | 
 | ||||||
| # Ignore generated manpages | # Ignore generated manpages | ||||||
| docs/src/.marker | doc/man/.marker | ||||||
| docs/src/man1/*.1 | doc/man/man1/*.1 | ||||||
| docs/src/man7/*.7 | doc/man/man7/*.7 | ||||||
| docs/src/man7/cdist-type__*.rst | doc/man/man*/*.html | ||||||
| docs/src/cdist-reference.rst | doc/man/man*/*.xml | ||||||
| docs/src/cdist-types.rst | doc/man/man7/cdist-type__*.text | ||||||
| docs/src/cdist.cfg.skeleton | doc/man/man7/cdist-reference.text | ||||||
|  | doc/man/man*/docbook-xsl.css | ||||||
| 
 | 
 | ||||||
| # Ignore cdist cache for version control | # Ignore cache for version control | ||||||
| /cache/ | 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 |  | ||||||
|  |  | ||||||
|  | @ -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