forked from ungleich-public/cdist
		
	add python link
Signed-off-by: Nico Schottelius <nico@kr.ethz.ch>
This commit is contained in:
		
					parent
					
						
							
								5429022d61
							
						
					
				
			
			
				commit
				
					
						c5d88435f1
					
				
			
		
					 18 changed files with 1 additions and 874 deletions
				
			
		|  | @ -1,50 +0,0 @@ | ||||||
| #!/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/>. |  | ||||||
| # |  | ||||||
| # |  | ||||||
| # This binary is executed on the remote side to execute code |  | ||||||
| #  |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<object> <type>" |  | ||||||
| set -ue |  | ||||||
| 
 |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| __cdist_code_type="$1"; shift |  | ||||||
| 
 |  | ||||||
| if [ ! -d "$(__cdist_object_dir "$__cdist_object_self")" ]; then |  | ||||||
|    __cdist_exit_err "Object undefined" |  | ||||||
| fi   |  | ||||||
| 
 |  | ||||||
| __cdist_code="$(__cdist_object_code "$__cdist_object_self" "${__cdist_code_type}")" |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Checking code-${__cdist_code_type}" |  | ||||||
| 
 |  | ||||||
| if [ -e "$__cdist_code" ]; then |  | ||||||
|    if [ -f "$__cdist_code" ]; then |  | ||||||
|       if [ -x "$__cdist_code" ]; then |  | ||||||
|          __cdist_echo info "Executing code-${__cdist_code_type}" |  | ||||||
|          __cdist_exec_fail_on_error "$__cdist_code" |  | ||||||
|       else |  | ||||||
|          __cdist_exit_err "$__cdist_code exists, but is not executable." |  | ||||||
|       fi |  | ||||||
|    else |  | ||||||
|       __cdist_exit_err "$__cdist_code exists, but is not a file." |  | ||||||
|    fi |  | ||||||
| fi |  | ||||||
|  | @ -1,49 +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/>. |  | ||||||
| # |  | ||||||
| # |  | ||||||
| # 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 |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host " |  | ||||||
| 
 |  | ||||||
| ################################################################################ |  | ||||||
| # See cdist-stages(7) |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| cdist-object-all              "$__cdist_target_host" cdist-object-run |  | ||||||
| cdist-cache                   "$__cdist_target_host" |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "cdist $__cdist_version: Successfully finished run" |  | ||||||
|  | @ -1,33 +0,0 @@ | ||||||
| #!/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 |  | ||||||
|  | @ -1,43 +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/>. |  | ||||||
| # |  | ||||||
| # |  | ||||||
| # Copy & run the global explorers, i.e. not bound to types |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 1 ] || __cdist_usage "<target_host>" |  | ||||||
| set -ue |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Running global explorers " |  | ||||||
| 
 |  | ||||||
| # copy the explorers |  | ||||||
| cdist-dir push "$__cdist_target_host" \ |  | ||||||
|    "${__cdist_explorer_dir}" "${__cdist_remote_explorer_dir}" |  | ||||||
| 
 |  | ||||||
| # run the initial explorers remotely |  | ||||||
| cdist-run-remote "${__cdist_target_host}" cdist-remote-explorer-run  \ |  | ||||||
|    "$__cdist_name_var_explorer" "$__cdist_remote_explorer_dir"       \ |  | ||||||
|    "$__cdist_remote_out_explorer_dir" |  | ||||||
| 
 |  | ||||||
| # retrieve the results |  | ||||||
| cdist-dir pull "$__cdist_target_host" \ |  | ||||||
|    "${__cdist_remote_out_explorer_dir}" "${__cdist_out_explorer_dir}" |  | ||||||
|  | @ -1,56 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2010 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/>. |  | ||||||
| # |  | ||||||
| #  |  | ||||||
| # Let's build a cconfig tree from a configuration |  | ||||||
| # And save it into the cache tree |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <manifest>" |  | ||||||
| set -u |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_manifest="$1"; shift |  | ||||||
| 
 |  | ||||||
| ################################################################################ |  | ||||||
| # Export information for cdist-type-emulator or manifest |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| # Config dir should not get reset - FIXME: why did I do this? |  | ||||||
| export __cdist_conf_dir |  | ||||||
| 
 |  | ||||||
| # Used to record the source in the object |  | ||||||
| export __cdist_manifest |  | ||||||
| 
 |  | ||||||
| # Export information for manifests - __cdist_out_dir comes from cdist-config |  | ||||||
| export __global="$__cdist_out_dir" |  | ||||||
| 
 |  | ||||||
| ################################################################################ |  | ||||||
| # The actual run |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| # Ensure binaries exist and are up-to-date |  | ||||||
| cdist-type-build-emulation "${__cdist_out_type_bin_dir}" \ |  | ||||||
|    || __cdist_exit_err "Failed to build type emulation binaries" |  | ||||||
| 
 |  | ||||||
| # prepend our path, so all cdist tools come before other tools |  | ||||||
| export PATH="${__cdist_out_type_bin_dir}:$PATH" |  | ||||||
| 
 |  | ||||||
| __cdist_exec_fail_on_error "${__cdist_manifest}" |  | ||||||
|  | @ -1,34 +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/>. |  | ||||||
| # |  | ||||||
| #  |  | ||||||
| # Let's build a cconfig tree from a configuration |  | ||||||
| # And save it into the cache tree |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 1 ] || __cdist_usage "<target host>" |  | ||||||
| set -e |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| 
 |  | ||||||
| eval export $__cdist_name_var_manifest=\"\$__cdist_manifest_dir\" |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Running initial manifest for $__cdist_target_host " |  | ||||||
| cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest_init" |  | ||||||
|  | @ -1,75 +0,0 @@ | ||||||
| #!/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 |  | ||||||
|  | @ -1,56 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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 the given command for each created object. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <command>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_command="$1"; shift |  | ||||||
| 
 |  | ||||||
| __cdist_objects="$__cdist_tmp_dir/objects" |  | ||||||
| 
 |  | ||||||
| # Ensure object dir exists, so marker can be created |  | ||||||
| mkdir -p "${__cdist_out_object_dir}" |  | ||||||
| 
 |  | ||||||
| # Loop until we do not create new objects anymore |  | ||||||
| # which is equal to all objects have been run |  | ||||||
| touch "$__cdist_objects_created" |  | ||||||
| while [ -f "$__cdist_objects_created" ]; do |  | ||||||
|    # Assume we're done after this run |  | ||||||
|    rm "$__cdist_objects_created" |  | ||||||
| 
 |  | ||||||
|    # Get listing of objects |  | ||||||
|    __cdist_object_list "$__cdist_out_object_dir" > "$__cdist_objects" |  | ||||||
| 
 |  | ||||||
|    # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP |  | ||||||
|    while read __cdist_object; do |  | ||||||
|       set -- "$@" "$__cdist_object" |  | ||||||
|    done < "$__cdist_objects" |  | ||||||
| 
 |  | ||||||
|    while [ $# -gt 0 ]; do |  | ||||||
|       __cdist_object="$1"; shift |  | ||||||
|       $__cdist_command "$__cdist_target_host" "$__cdist_object" |  | ||||||
|    done |  | ||||||
| done |  | ||||||
|  | @ -1,38 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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/>. |  | ||||||
| # |  | ||||||
| # |  | ||||||
| # Exec the code for the given object locally and remote |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -e |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object="$1"; shift |  | ||||||
| 
 |  | ||||||
| # Code local |  | ||||||
| export __cdist_out_object_dir="$__cdist_out_object_dir" |  | ||||||
| cdist-code-run "$__cdist_object" "${__cdist_name_gencode_local}" |  | ||||||
| 
 |  | ||||||
| # Code remote |  | ||||||
| cdist-run-remote "$__cdist_target_host" \ |  | ||||||
|    "cdist-code-run" "$__cdist_object" "${__cdist_name_gencode_remote}" |  | ||||||
|  | @ -1,67 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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 the explorers for the given object on the target host. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| 
 |  | ||||||
| __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" |  | ||||||
| __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" |  | ||||||
| 
 |  | ||||||
| # Check if type of object has >= 1 explorer |  | ||||||
| __cdist_has_explorer="$(__cdist_type_has_explorer "$__cdist_type")" |  | ||||||
| # Run the type explorers for the current object if any |  | ||||||
| if [ "$__cdist_has_explorer" ]; then |  | ||||||
|    if ! __cdist_type_explorer_pushed "$__cdist_type"; then |  | ||||||
|       src_dir="$(__cdist_type_explorer_dir "$__cdist_type")" |  | ||||||
|       dst_dir="$(__cdist_remote_type_explorer_dir "$__cdist_type")" |  | ||||||
|       __cdist_echo info "Transfering explorers for $__cdist_type " |  | ||||||
|       cdist-dir push "$__cdist_target_host" "$src_dir" "$dst_dir" |  | ||||||
|       __cdist_type_explorer_pushed_add "$__cdist_type" |  | ||||||
|    fi |  | ||||||
| 
 |  | ||||||
|    __cdist_echo info "Running explorers" |  | ||||||
|    # Copy object parameters |  | ||||||
|    cdist-dir push "$__cdist_target_host"                          \ |  | ||||||
|       "$(__cdist_object_parameter_dir "$__cdist_object_self")"         \ |  | ||||||
|       "$(__cdist_remote_object_parameter_dir "$__cdist_object_self")" |  | ||||||
| 
 |  | ||||||
|    # Execute explorers |  | ||||||
|    cdist-run-remote "$__cdist_target_host"                     \ |  | ||||||
|       "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\"" \ |  | ||||||
|       "$__cdist_name_var_object_id=\"$__cdist_object_id\""     \ |  | ||||||
|       "$__cdist_name_var_self=\"$__cdist_object_self\""        \ |  | ||||||
|       cdist-remote-explorer-run                                \ |  | ||||||
|       "$__cdist_name_var_type_explorer"                        \ |  | ||||||
|       "$(__cdist_remote_type_explorer_dir "$__cdist_type")"    \ |  | ||||||
|       "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")" |  | ||||||
| 
 |  | ||||||
|    # Copy back results |  | ||||||
|    cdist-dir pull "$__cdist_target_host"                             \ |  | ||||||
|       "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")" \ |  | ||||||
|       "$(__cdist_object_type_explorer_dir "$__cdist_object_self")" |  | ||||||
| fi |  | ||||||
|  | @ -1,62 +0,0 @@ | ||||||
| #!/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/>. |  | ||||||
| # |  | ||||||
| # |  | ||||||
| # Generate code from one object (object must be relative path!) |  | ||||||
| # WARNING: OUTPUT ON STDOUT, ERRORS NEED TO BE ON STDERR! |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 3 ] || __cdist_usage "<target host>" "<object>" "<type>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| __cdist_gencode_type="$1"; shift |  | ||||||
| 
 |  | ||||||
| __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" |  | ||||||
| __cdist_type_gencode="$(__cdist_type_gencode "$__cdist_type" "$__cdist_gencode_type")" |  | ||||||
| __cdist_code_output="$(__cdist_object_code "$__cdist_object_self" "$__cdist_gencode_type")" |  | ||||||
| 
 |  | ||||||
| # export variables for the gencode script |  | ||||||
| export __object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" |  | ||||||
| export __object="$(__cdist_object_dir "$__cdist_object_self")" |  | ||||||
| export __global="$__cdist_out_dir" |  | ||||||
| 
 |  | ||||||
| if [ -x "$__cdist_type_gencode" ]; then |  | ||||||
|    __cdist_exec_fail_on_error "$__cdist_type_gencode" > "$__cdist_tmp_file" |  | ||||||
| else |  | ||||||
|    if [ -e "$__cdist_type_gencode" ]; then |  | ||||||
|       __cdist_exit_err "$__cdist_type_gencode exists, but is not executable" |  | ||||||
|    fi |  | ||||||
| 
 |  | ||||||
|    # Ensure it's empty, if there is no gencode |  | ||||||
|    : > "$__cdist_tmp_file" |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Only create code, if gencode created output |  | ||||||
| if [ "$(wc -l < "$__cdist_tmp_file")" -gt 0 ]; then |  | ||||||
|    cat - "$__cdist_tmp_file" << eof > "$__cdist_code_output" |  | ||||||
| # |  | ||||||
| # The following code was generated by $__cdist_type_gencode |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| eof |  | ||||||
|    chmod u+x "${__cdist_code_output}" |  | ||||||
| fi |  | ||||||
|  | @ -1,38 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2010 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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/>. |  | ||||||
| # |  | ||||||
| #  |  | ||||||
| # For the given object create the code to be executed on the target. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Generating local code " |  | ||||||
| cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \ |  | ||||||
|    "${__cdist_name_gencode_local}" |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Generating remote code " |  | ||||||
| cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \ |  | ||||||
|    "${__cdist_name_gencode_remote}" |  | ||||||
|  | @ -1,58 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2010 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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 the manifest for the given object. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| 
 |  | ||||||
| # FIXME: rename to __cdist_object_dir (everywhere!) |  | ||||||
| __cdist_cur_object_dir="$(__cdist_object_dir "$__cdist_object_self")" |  | ||||||
| __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")" |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Checking manifest " |  | ||||||
| 
 |  | ||||||
| __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")" |  | ||||||
| __cdist_manifest="$(__cdist_type_manifest "$__cdist_type")" |  | ||||||
| 
 |  | ||||||
| if [ -f "$__cdist_manifest" ]; then |  | ||||||
|    if [ -x "$__cdist_manifest" ]; then |  | ||||||
|       # Make __cdist_manifest available for cdist-type-emulator |  | ||||||
|       export __cdist_manifest |  | ||||||
| 
 |  | ||||||
|       __cdist_echo info "Executing manifest " |  | ||||||
|       export $__cdist_name_var_object="$__cdist_cur_object_dir" |  | ||||||
|       export $__cdist_name_var_object_id="$__cdist_object_id" |  | ||||||
|       export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")" |  | ||||||
| 
 |  | ||||||
|       cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest" |  | ||||||
| 
 |  | ||||||
|       # Tell cdist-object-run-all that there may be new objects |  | ||||||
|       touch "$__cdist_objects_created" |  | ||||||
|    else |  | ||||||
|       __cdist_exit_err "${__cdist_manifest} needs to be executable." |  | ||||||
|    fi |  | ||||||
| fi |  | ||||||
|  | @ -1,47 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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/>. |  | ||||||
| # |  | ||||||
| #  |  | ||||||
| # For the given object: |  | ||||||
| #  - run type explorers |  | ||||||
| #  - run type manifest |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| __cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")" |  | ||||||
| [ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined" |  | ||||||
| 
 |  | ||||||
| # Export to non-core for use in manifest and gencode scripts |  | ||||||
| export $__cdist_name_var_self=$__cdist_object_self |  | ||||||
| 
 |  | ||||||
| __cdist_object_prepared="$(__cdist_object_prepared "$__cdist_object_self")" |  | ||||||
| if [ ! -f "$__cdist_object_prepared" ]; then |  | ||||||
|    __cdist_echo info "Preparing object" |  | ||||||
|    cdist-object-explorer-run  "$__cdist_target_host" "$__cdist_object_self" |  | ||||||
|    cdist-object-manifest-run  "$__cdist_target_host" "$__cdist_object_self" |  | ||||||
| 
 |  | ||||||
|    # Mark this object as prepared |  | ||||||
|    touch "$__cdist_object_prepared" |  | ||||||
| fi |  | ||||||
|  | @ -1,35 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2010 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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/>. |  | ||||||
| # |  | ||||||
| #  |  | ||||||
| # Transfer the given object to the target host. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| 
 |  | ||||||
| __cdist_echo info "Transferring object" |  | ||||||
| cdist-dir push "$__cdist_target_host" \ |  | ||||||
|    "$(__cdist_object_dir "$__cdist_object_self")" \ |  | ||||||
|    "$(__cdist_remote_object_dir "$__cdist_object_self")" |  | ||||||
|  | @ -1,65 +0,0 @@ | ||||||
| #!/bin/sh |  | ||||||
| # |  | ||||||
| # 2011 Nico Schottelius (nico-cdist at schottelius.org) |  | ||||||
| # 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/>. |  | ||||||
| # |  | ||||||
| #  |  | ||||||
| # For the given object: |  | ||||||
| #  - run type explorers |  | ||||||
| #  - run type manifest |  | ||||||
| #  - generate code |  | ||||||
| #  - copy object to target |  | ||||||
| #  - execute code on target |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 2 ] || __cdist_usage "<target host> <object>" |  | ||||||
| set -eu |  | ||||||
| 
 |  | ||||||
| __cdist_target_host="$1"; shift |  | ||||||
| __cdist_object_self="$1"; shift |  | ||||||
| __cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")" |  | ||||||
| [ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined" |  | ||||||
| 
 |  | ||||||
| # Export to non-core for use in manifest and gencode scripts |  | ||||||
| export $__cdist_name_var_self=$__cdist_object_self |  | ||||||
| 
 |  | ||||||
| __cdist_object_finished="$(__cdist_object_finished "$__cdist_object_self")" |  | ||||||
| if [ ! -f "$__cdist_object_finished" ]; then |  | ||||||
|    # Resolve dependencies, if any |  | ||||||
|    __cdist_object_require="$(__cdist_object_require "$__cdist_object_self")" |  | ||||||
|    if [ -f "$__cdist_object_require" ]; then |  | ||||||
|       # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP |  | ||||||
|       while read __cdist_requirement; do |  | ||||||
|          set -- "$@" "$__cdist_requirement" |  | ||||||
|       done < "$__cdist_object_require" |  | ||||||
| 
 |  | ||||||
|       while [ $# -gt 0 ]; do |  | ||||||
|          __cdist_requirement="$1"; shift |  | ||||||
|          __cdist_echo info "Resolving requirement $__cdist_requirement" |  | ||||||
|          cdist-object-run "$__cdist_target_host" "$__cdist_requirement" |  | ||||||
|       done |  | ||||||
|    fi |  | ||||||
| 
 |  | ||||||
|    cdist-object-gencode-run   "$__cdist_target_host" "$__cdist_object_self" |  | ||||||
|    cdist-object-push          "$__cdist_target_host" "$__cdist_object_self" |  | ||||||
|    cdist-object-code-run      "$__cdist_target_host" "$__cdist_object_self" |  | ||||||
| 
 |  | ||||||
|    # Mark this object as done |  | ||||||
|    touch "$__cdist_object_finished" |  | ||||||
| fi |  | ||||||
|  | @ -1,68 +0,0 @@ | ||||||
| #!/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/>. |  | ||||||
| # |  | ||||||
| # |  | ||||||
| # This binary is executed on the remote side to execute explorers |  | ||||||
| #  |  | ||||||
| # It supports different variables names to be used, so __explorers |  | ||||||
| # and __type_explorers can be submitted :-) |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| . cdist-config |  | ||||||
| [ $# -eq 3 ] || __cdist_usage "<variable name> <explorer dir> <out dir>" |  | ||||||
| set -ue |  | ||||||
| 
 |  | ||||||
| # Variable that defines the home of the explorers |  | ||||||
| __cdist_variable_name="$1"; shift |  | ||||||
| 
 |  | ||||||
| # Find explorers here |  | ||||||
| __cdist_explorer_dir="$1"; shift |  | ||||||
| 
 |  | ||||||
| # Write output here |  | ||||||
| __cdist_my_out_dir="$1"; shift |  | ||||||
| 
 |  | ||||||
| # Setup environment |  | ||||||
| export $__cdist_variable_name="$__cdist_explorer_dir" |  | ||||||
| export __global="$__cdist_remote_out_dir" |  | ||||||
| 
 |  | ||||||
| mkdir -p "$__cdist_my_out_dir" |  | ||||||
| 
 |  | ||||||
| # Ensure there is at least one explorer |  | ||||||
| num="$(ls -1 "$__cdist_explorer_dir" | wc -l)" |  | ||||||
| if [ "$num" -lt 1 ]; then |  | ||||||
|    __cdist_exit_err "${__cdist_explorer_dir}: Contains no explorers" |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Execute all explorers |  | ||||||
| for explorer in "$__cdist_explorer_dir/"*; do |  | ||||||
|    explorer_name="${explorer##*/}" |  | ||||||
| 
 |  | ||||||
|    if [ -f "$explorer" ]; then |  | ||||||
|       if [ ! -x "$explorer" ]; then |  | ||||||
|          __cdist_exit_err "Explorer \"$explorer\" exists, but is not executable." |  | ||||||
|       fi |  | ||||||
| 
 |  | ||||||
|       # Execute explorers and save results in remote destination directory |  | ||||||
|       "$explorer" > "${__cdist_my_out_dir}/$explorer_name" |  | ||||||
|    else |  | ||||||
|       if [ -e "$explorer" ]; then |  | ||||||
|          __cdist_exit_err "Explorer \"$explorer\" exists, but is not a file." |  | ||||||
|       fi |  | ||||||
|    fi |  | ||||||
| done |  | ||||||
							
								
								
									
										1
									
								
								bin/cdist.py
									
										
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								bin/cdist.py
									
										
									
									
									
										Symbolic link
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | cdist | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue