Compare commits

..

4 commits

Author SHA1 Message Date
Darko Poljak
eac9aa3e1a Refactor cdist-info script
Use -g for GLOB option instead of -b.
Define and use functions.
2019-12-22 17:58:27 +01:00
Darko Poljak
3a71a7fb28 Mv cdist-new-type to libexec; create cdist-info 2019-12-21 16:57:04 +01:00
Darko Poljak
a812167dc6 Exit with libexec command return code 2019-12-20 23:40:46 +01:00
Darko Poljak
7dddcb794b Add libexec support and migrate cdist-dump 2019-12-20 23:10:47 +01:00
45 changed files with 586 additions and 826 deletions

View file

@ -370,7 +370,7 @@ eof
cat << eof cat << eof
Manual steps post release: Manual steps post release:
- cdist-web - cdist-web
- send generated mailinglist.tmp mail - send mail body generated in mailinglist.tmp and inform Dmitry for deb
- twitter - twitter
eof eof
;; ;;
@ -463,7 +463,7 @@ eof
shellcheck-scripts) shellcheck-scripts)
# shellcheck disable=SC2086 # shellcheck disable=SC2086
${SHELLCHECKCMD} scripts/cdist-dump scripts/cdist-new-type > "${SHELLCHECKTMP}" ${SHELLCHECKCMD} cdist/conf/libexec/cdist-dump cdist/conf/libexec/cdist-new-type > "${SHELLCHECKTMP}"
test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; } test ! -s "${SHELLCHECKTMP}" || { cat "${SHELLCHECKTMP}"; exit 1; }
;; ;;

View file

@ -6,7 +6,7 @@ import collections
import functools import functools
import cdist.configuration import cdist.configuration
import cdist.preos import cdist.preos
import cdist.info import cdist.libexec as libexec
# set of beta sub-commands # set of beta sub-commands
@ -437,36 +437,8 @@ def get_parsers():
' should be POSIX compatible shell.')) ' should be POSIX compatible shell.'))
parser['shell'].set_defaults(func=cdist.shell.Shell.commandline) parser['shell'].set_defaults(func=cdist.shell.Shell.commandline)
# Info # Libexec
parser['info'] = parser['sub'].add_parser('info') libexec.create_parsers(parser, parser['sub'])
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: for p in parser:
parser[p].epilog = EPILOG parser[p].epilog = EPILOG

399
cdist/conf/libexec/cdist-info Executable file
View file

@ -0,0 +1,399 @@
#!/bin/sh
VERSION="0.0.1"
RELEASE=""
set -u
# set -x
verbose=0
myname=${0##*/}
mydir=${0%/$myname}
dist_conf=${mydir%/libexec}
print_version()
{
printf "%s %s %s\n" "${myname}" "${VERSION}" "${RELEASE}"
}
usage()
{
cat << eof
${myname}: [options]
eof
print_version
cat << eof
Display information for cdist types and explorers.
Options
-C display only config types
-c CONF_DIR add configuration directory (can be repeated)
-D display only nondeprecated types
-d display only deprecated types
-E display only types without explorers
-e display only types with explorers
-G display global explorers (turns displaying types off,
unless -t is explicitly specified)
-g GLOB use GLOB as name pattern
-h display this help screen and exit
-i display only install types
-l display only types with gencode-local
-M display only types with man page
-m display only types with manifest
-P display only nonparallel types
-p display only parallel types
-R display type parameters
-r display only types with gencode-remote
-S display only nonsingleton types
-s display only singleton types
-t display types (by default, unless -G is specified)
-V display version and exit
-v increase verbosity (verbose output goes to stderr)
if verbosity is greater than 2 then 'set -x' is used
-x display type explorers
Notes:
By default, distribution and home dot cdist directories are used for
configuration directories list.
This helper tool does not parse cdist configuration files. Configuration
directories should be specifed by command line options and/or CDIST_PATH
environment variable.
eof
}
exit_err()
{
printf "%s\n" "$1"
exit 1
}
print_verbose()
{
if [ "${verbose}" -ge "$1" ]
then
printf "%s\n" "$2" >&2
fi
}
print_parameters()
{
param_title=$1
param_fname=$2
if test -f "${param_fname}"
then
printf " %s\n" "${param_title}"
sed "s/^\(.*\)$/ \1/" < "${param_fname}"
fi
}
type_name_matches()
{
if test "$2" == "*"
then
return 0
else
case "$(basename "$1")" in
$2)
return 0
;;
*)
return 1
;;
esac
fi
}
# $1 - do check flag.
# $2 - file path.
# Return false only if check flag is 1 and file does not exist.
type_file_exists()
{
if test "$1" -eq "1"
then
test -f "$2"
else
return 0
fi
}
# $1 - do check flag.
# $2 - file path.
# Return false only if check flag is 1 and file does exist.
type_file_not_exists()
{
if test "$1" -eq "1"
then
test ! -f "$2"
else
return 0
fi
}
type_dir_empty()
{
if test "$1" -eq "1"
then
if test ! -d "$2"
then
return 1
elif ! [ "$(ls -1 "${fname}/explorer")" ]
then
return 1
else
return 0
fi
else
return 0
fi
}
type_dir_not_empty()
{
if test "$1" -eq "1"
then
if test -d "$2"
then
if [ "$(ls -1 "${fname}/explorer")" ]
then
return 1
fi
else
return 0
fi
else
return 0
fi
}
print_type_params()
{
if test "$1" -eq "1"
then
print_parameters "required parameters:" "$2/parameter/required"
print_parameters "required multiple parameters:" "$2/parameter/required_multiple"
print_parameters "optional parameters:" "$2/parameter/optional"
print_parameters "optional multiple parameters:" "$2/parameter/optional_multiple"
print_parameters "boolean parameters:" "$2/parameter/boolean"
param_deprecated="$2/parameter/deprecated"
if test -d "${param_deprecated}"
then
printf " deprecated parameters:\n"
# shellcheck disable=SC2012
ls -1 "${param_deprecated}" | sed "s/^\(.*\)$/ \1/"
fi
fi
}
print_type_explorers()
{
if test "$1" -eq "1"
then
find "$2" -path "*/explorer/*" -type f
fi
}
print_type()
{
if test "$1" -eq "1"
then
printf "%s\n" "$2"
print_type_params "${display_type_params}" "$2"
print_type_explorers "${display_type_explorers}" "$2"
fi
}
print_global_explorers()
{
find "$1" '(' -path "*/explorer/*" -a ! -path "*/type/*/explorer/*" -a ! -path "*/cache/*/explorer/*" ')' -type f -name "$2"
}
conf_dirs="${dist_conf}:${HOME}/.cdist"
glob="*"
manifest_only=0
gencode_local_only=0
gencode_remote_only=0
install_only=0
config_only=0
parallel_only=0
nonparallel_only=0
singleton_only=0
nonsingleton_only=0
man_only=0
explorers_only=0
nonexplorers_only=0
deprecated_only=0
nondeprecated_only=0
display_global_explorers=0
display_types=1
display_type_params=0
display_type_explorers=0
# parse options
while [ "$#" -ge 1 ]
do
case "$1" in
-C)
config_only=1
;;
-c)
if [ "$#" -ge 2 ]
then
case "$2" in
-*)
exit_err "Missing configuration directory argument"
;;
*)
conf_dirs="${conf_dirs}:$2"
shift
;;
esac
else
exit_err "Missing configuration directory argument"
fi
;;
-D)
nondeprecated_only=1
;;
-d)
deprecated_only=1
;;
-E)
nonexplorers_only=1
;;
-e)
explorers_only=1
;;
-G)
display_types=0
display_global_explorers=1
;;
-g)
if [ "$#" -ge 2 ]
then
case "$2" in
-*)
exit_err "Missing glob argument"
;;
*)
glob="$2"
shift
;;
esac
else
exit_err "Missing glob argument"
fi
;;
-h)
usage
exit 0
;;
-i)
install_only=1
;;
-l)
gencode_local_only=1
;;
-M)
man_only=1
;;
-m)
manifest_only=1
;;
-P)
nonparallel_only=1
;;
-p)
parallel_only=1
;;
-R)
display_type_params=1
;;
-r)
gencode_remote_only=1
;;
-S)
nonsingleton_only=1
;;
-s)
singleton_only=1
;;
-t)
display_types=1
;;
-V)
print_version
exit 0
;;
-v)
verbose=$((verbose + 1))
;;
-x)
display_type_explorers=1
;;
*)
exit_err "Unknown argument $1"
;;
esac
shift
done
if test "${verbose}" -gt "2"
then
set -x
fi
if test "${CDIST_PATH:-}"
then
conf_dirs="${conf_dirs}:${CDIST_PATH}"
fi
print_verbose 2 "conf_dirs=${conf_dirs}"
OLD_IFS="${IFS}"
IFS=':'
for x in ${conf_dirs}
do
print_verbose 1 "Processing conf dir '${x}'"
if test "${display_global_explorers}" -eq "1"
then
print_verbose 1 "Printing global explorers"
print_global_explorers "${x}" "${glob}"
fi
if test "${display_types}" -eq "1"
then
print_verbose 1 "Printing types"
find "${x}" -path "*/type/*" -type d -prune | \
while read -r fname
do
print_verbose 2 "Printing type '${fname}'"
display_type=1
type_name_matches "${fname}" "${glob}" || display_type=0
type_file_exists "${manifest_only}" "${fname}/manifest" || display_type=0
type_file_exists "${gencode_local_only}" "${fname}/gencode-local" || display_type=0
type_file_exists "${gencode_remote_only}" "${fname}/gencode-remote" || display_type=0
type_file_not_exists "${config_only}" "${fname}/install" || display_type=0
type_file_exists "${install_only}" "${fname}/install" || display_type=0
type_file_not_exists "${parallel_only}" "${fname}/nonparallel" || display_type=0
type_file_exists "${nonparallel_only}" "${fname}/nonparallel" || display_type=0
type_file_exists "${singleton_only}" "${fname}/singleton" || display_type=0
type_file_not_exists "${nonsingleton_only}" "${fname}/singleton" || display_type=0
type_file_exists "${man_only}" "${fname}/man.rst" || display_type=0
type_file_exists "${deprecated_only}" "${fname}/deprecated" || display_type=0
type_file_not_exists "${nondeprecated_only}" "${fname}/deprecated" || display_type=0
type_dir_empty "${explorers_only}" "${fname}/explorer" || display_type=0
type_dir_not_empty "${nonexplorers_only}" "${fname}/explorer" || display_type=0
print_type "${display_type}" "${fname}"
done
fi
done
IFS="${OLD_IFS}"

View file

@ -28,10 +28,7 @@ acl_path="/$__object_id"
acl_is="$( cat "$__object/explorer/acl_is" )" acl_is="$( cat "$__object/explorer/acl_is" )"
if [ -f "$__object/parameter/entry" ] if [ -f "$__object/parameter/acl" ]
then
acl_should="$( cat "$__object/parameter/entry" )"
elif [ -f "$__object/parameter/acl" ]
then then
acl_should="$( cat "$__object/parameter/acl" )" acl_should="$( cat "$__object/parameter/acl" )"
elif elif

View file

@ -15,7 +15,7 @@ See ``setfacl`` and ``acl`` manpages for more details.
REQUIRED MULTIPLE PARAMETERS REQUIRED MULTIPLE PARAMETERS
---------------------------- ----------------------------
entry acl
Set ACL entry following ``getfacl`` output syntax. Set ACL entry following ``getfacl`` output syntax.
@ -36,8 +36,8 @@ remove
DEPRECATED PARAMETERS DEPRECATED PARAMETERS
--------------------- ---------------------
Parameters ``acl``, ``user``, ``group``, ``mask`` and ``other`` are deprecated and they Parameters ``user``, ``group``, ``mask`` and ``other`` are deprecated and they
will be removed in future versions. Please use ``entry`` parameter instead. will be removed in future versions. Please use ``acl`` parameter instead.
EXAMPLES EXAMPLES
@ -49,27 +49,27 @@ EXAMPLES
--default \ --default \
--recursive \ --recursive \
--remove \ --remove \
--entry user:alice:rwx \ --acl user:alice:rwx \
--entry user:bob:r-x \ --acl user:bob:r-x \
--entry group:project-group:rwx \ --acl group:project-group:rwx \
--entry group:some-other-group:r-x \ --acl group:some-other-group:r-x \
--entry mask::r-x \ --acl mask::r-x \
--entry other::r-x --acl other::r-x
# give Alice read-only access to subdir, # give Alice read-only access to subdir,
# but don't allow her to see parent content. # but don't allow her to see parent content.
__acl /srv/project2 \ __acl /srv/project2 \
--remove \ --remove \
--entry default:group:secret-project:rwx \ --acl default:group:secret-project:rwx \
--entry group:secret-project:rwx \ --acl group:secret-project:rwx \
--entry user:alice:--x --acl user:alice:--x
__acl /srv/project2/subdir \ __acl /srv/project2/subdir \
--default \ --default \
--remove \ --remove \
--entry group:secret-project:rwx \ --acl group:secret-project:rwx \
--entry user:alice:r-x --acl user:alice:r-x
AUTHORS AUTHORS

View file

@ -1 +0,0 @@
see manual for details

View file

@ -1,4 +1,3 @@
entry
acl acl
user user
group group

View file

@ -181,7 +181,7 @@ init_upstart()
# Install init script to start on boot # Install init script to start on boot
case "$os" in case "$os" in
devuan) alpine|devuan)
init_sysvinit debian init_sysvinit debian
;; ;;
centos|redhat) centos|redhat)

View file

@ -1 +0,0 @@
../__chroot_umount/manifest

View file

@ -1,33 +0,0 @@
#!/bin/sh -e
#
# 2020 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 [ -f "$__object/parameter/name" ]
then
name="$( cat "$__object/parameter/name" )"
else
name="$__object_id"
fi
if [ -n "$( mysql -B -N -e "show databases like '$name'" )" ]
then
echo 'present'
else
echo 'absent'
fi

View file

@ -1,6 +1,6 @@
#!/bin/sh -e #!/bin/sh -e
# #
# 2020 Ander Punnar (ander-at-kvlt-dot-ee) # 2012 Benedikt Koeppel (code@benediktkoeppel.ch)
# #
# This file is part of cdist. # This file is part of cdist.
# #
@ -17,30 +17,38 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>. # along with cdist. If not, see <http://www.gnu.org/licenses/>.
# #
#
state_is="$( cat "$__object/explorer/state" )" # if --database was specified
if [ -f "$__object/parameter/name" ]; then
state_should="$( cat "$__object/parameter/state" )" database="$(cat "$__object/parameter/name")"
else # otherwise use the object id as database name
if [ "$state_is" = "$state_should" ] database="$__object_id"
then
exit 0
fi fi
if [ -f "$__object/parameter/name" ] cat <<-EOFF
then mysql -u root <<-EOF
name="$( cat "$__object/parameter/name" )" CREATE DATABASE IF NOT EXISTS $database
else EOF
name="$__object_id" EOFF
fi
case "$state_should" in # if --user was specified
present) if [ -f "$__object/parameter/user" ]; then
echo "mysql -e 'create database \`$name\`'" user="$(cat "$__object/parameter/user")"
echo "create database $name" >> "$__messages_out"
;; # if --password was specified
absent) if [ -f "$__object/parameter/password" ]; then
echo "mysql -e 'drop database \`$name\`'" password="$(cat "$__object/parameter/password")"
echo "drop database $name" >> "$__messages_out" cat <<-EOFF
;; mysql -u root <<-EOF
esac GRANT ALL PRIVILEGES ON $database.* to '$user'@'localhost' IDENTIFIED BY '$password';
EOF
EOFF
else
cat <<-EOFF
mysql -u root <<-EOF
GRANT ALL PRIVILEGES ON $database.* to '$user'@'localhost';
EOF
EOFF
fi
fi

View file

@ -8,24 +8,24 @@ cdist-type__mysql_database - Manage a MySQL database
DESCRIPTION DESCRIPTION
----------- -----------
This cdist type allows you to install a MySQL database.
Create MySQL database and optionally user with all privileges.
REQUIRED PARAMETERS
-------------------
None.
OPTIONAL PARAMETERS OPTIONAL PARAMETERS
------------------- -------------------
name name
Name of database. Defaults to object id. The name of the database to install
defaults to the object id
user user
Create user and give all privileges to database. A user that should have access to the database
password password
Password for user. The password for the user who manages the database
state
Defaults to present.
If absent and user is also set, both will be removed (with privileges).
EXAMPLES EXAMPLES
@ -33,23 +33,17 @@ EXAMPLES
.. code-block:: sh .. code-block:: sh
# just create database __mysql_database "cdist" --name "cdist" --user "myuser" --password "mypwd"
__mysql_database foo
# create database with respective user with all privileges to database
__mysql_database bar \
--user name \
--password secret
AUTHORS AUTHORS
------- -------
Ander Punnar <ander-at-kvlt-dot-ee> Benedikt Koeppel <code@benediktkoeppel.ch>
COPYING COPYING
------- -------
Copyright \(C) 2020 Ander Punnar. You can redistribute it and/or modify it Copyright \(C) 2012 Benedikt Koeppel. You can redistribute it
under the terms of the GNU General Public License as published by the Free and/or modify it under the terms of the GNU General Public License as
Software Foundation, either version 3 of the License, or (at your option) any published by the Free Software Foundation, either version 3 of the
later version. License, or (at your option) any later version.

View file

@ -1,52 +0,0 @@
#!/bin/sh -e
#
# 2020 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 [ -f "$__object/parameter/user" ]
then
user="$( cat "$__object/parameter/user" )"
fi
if [ -f "$__object/parameter/password" ]
then
password="$( cat "$__object/parameter/password" )"
fi
if [ -n "$user" ] && [ -n "$password" ]
then
if [ -f "$__object/parameter/name" ]
then
database="$( cat "$__object/parameter/name" )"
else
database="$__object_id"
fi
state_should="$( cat "$__object/parameter/state" )"
__mysql_user "$user" \
--password "$password" \
--state "$state_should"
# removing user should remove all user's privileges
require="__mysql_user/$user" \
__mysql_privileges "$database/$user" \
--database "$database" \
--user "$user" \
--state "$state_should"
fi

View file

@ -1,4 +1,3 @@
name name
user user
password password
state

View file

@ -1,40 +0,0 @@
#!/bin/sh -e
#
# 2020 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/>.
#
privileges="$( cat "$__object/parameter/privileges" )"
database="$( cat "$__object/parameter/database" )"
table="$( cat "$__object/parameter/table" )"
user="$( cat "$__object/parameter/user" )"
host="$( cat "$__object/parameter/host" )"
check_privileges="$(
mysql -B -N -e "show grants for '$user'@'$host'" \
| grep -Ei "^grant $privileges on .$database.\..$table. to " || true )"
if [ -n "$check_privileges" ]
then
echo 'present'
else
echo 'absent'
fi

View file

@ -1,49 +0,0 @@
#!/bin/sh -e
#
# 2020 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/>.
#
state_is="$( cat "$__object/explorer/state" )"
state_should="$( cat "$__object/parameter/state" )"
if [ "$state_is" = "$state_should" ]
then
exit 0
fi
privileges="$( cat "$__object/parameter/privileges" )"
database="$( cat "$__object/parameter/database" )"
table="$( cat "$__object/parameter/table" )"
user="$( cat "$__object/parameter/user" )"
host="$( cat "$__object/parameter/host" )"
case "$state_should" in
present)
echo "mysql -e 'grant $privileges on \`$database\`.\`$table\` to \`$user\`@\`$host\`'"
echo "grant $privileges on $database.$table to $user@$host" >> "$__messages_out"
;;
absent)
echo "mysql -e 'revoke $privileges on \`$database\`.\`$table\` from \`$user\`@\`$host\`'"
echo "revoke $privileges on $database.$table from $user@$host" >> "$__messages_out"
;;
esac

View file

@ -1,57 +0,0 @@
cdist-type__mysql_privileges(7)
===============================
NAME
----
cdist-type__mysql_privileges - Manage MySQL privileges
DESCRIPTION
-----------
Grant and revoke privileges of MySQL user.
REQUIRED PARAMETERS
-------------------
database
Name of database.
User
Name of user.
OPTIONAL PARAMETERS
-------------------
privileges
Defaults to "all".
table
Defaults to "*".
host
Defaults to localhost.
state
"present" grants and "absent" revokes. Defaults to present.
EXAMPLES
--------
.. code-block:: sh
__mysql_privileges user-to-db --database db --user user
AUTHORS
-------
Ander Punnar <ander-at-kvlt-dot-ee>
COPYING
-------
Copyright \(C) 2020 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.

View file

@ -1 +0,0 @@
localhost

View file

@ -1 +0,0 @@
all privileges

View file

@ -1,4 +0,0 @@
privileges
table
host
state

View file

@ -1,2 +0,0 @@
database
user

View file

@ -1,54 +0,0 @@
#!/bin/sh -e
#
# 2020 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 [ -f "$__object/parameter/name" ]
then
name="$( cat "$__object/parameter/name" )"
else
name="$__object_id"
fi
if [ -f "$__object/parameter/password" ]
then
password="$( cat "$__object/parameter/password" )"
else
password=''
fi
host="$( cat "$__object/parameter/host" )"
check_user="$( mysql -B -N -e "select user from mysql.user where user = '$name' and host = '$host'" )"
if [ -n "$check_user" ]
then
if [ -n "$password" ]
then
check_password="$( mysql -B -N -e "select user from mysql.user where user = '$name' and host = '$host' and password = password( '$password' )" )"
fi
if [ -n "$password" ] && [ -z "$check_password" ]
then
echo 'change-password'
else
echo 'present'
fi
else
echo 'absent'
fi

View file

@ -1,68 +0,0 @@
#!/bin/sh -e
#
# 2020 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/>.
#
state_is="$( cat "$__object/explorer/state" )"
state_should="$( cat "$__object/parameter/state" )"
if [ "$state_is" = "$state_should" ]
then
exit 0
fi
if [ -f "$__object/parameter/name" ]
then
name="$( cat "$__object/parameter/name" )"
else
name="$__object_id"
fi
host="$( cat "$__object/parameter/host" )"
if [ -f "$__object/parameter/password" ]
then
password="$( cat "$__object/parameter/password" )"
else
if [ "$state_should" = 'present' ]
then
echo '--password needed' >&2
exit 1
else
password=''
fi
fi
if [ "$state_is" = 'absent' ] && [ "$state_should" = 'present' ]
then
echo "mysql -e 'create user \`$name\`@\`$host\` identified by \"$password\"'"
echo "create user $name@$host" >> "$__messages_out"
elif [ "$state_is" != 'absent' ] && [ "$state_should" = 'absent' ]
then
echo "mysql -e 'drop user \`$name\`@\`$host\`'"
echo "drop user $name@$host" >> "$__messages_out"
elif [ "$state_is" = 'change-password' ]
then
# this only works with MySQL 5.7.6 and later or MariaDB 10.1.20 and later
echo "mysql -e 'alter user \`$name\`@\`$host\` identified by \"$password\"'"
echo "mysql -e 'flush privileges'"
echo "change password $name@$host" >> "$__messages_out"
fi

View file

@ -1,48 +0,0 @@
cdist-type__mysql_user(7)
=========================
NAME
----
cdist-type__mysql_user - Manage a MySQL user
DESCRIPTION
-----------
Create MySQL user or change password for the user.
OPTIONAL PARAMETERS
-------------------
name
Name of user. Defaults to object id.
host
Host of user. Defaults to localhost.
password
Password of user.
state
Defaults to present.
EXAMPLES
--------
.. code-block:: sh
__mysql_user user --password secret
AUTHORS
-------
Ander Punnar <ander-at-kvlt-dot-ee>
COPYING
-------
Copyright \(C) 2020 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.

View file

@ -1 +0,0 @@
localhost

View file

@ -1 +0,0 @@
present

View file

@ -1,4 +0,0 @@
name
host
password
state

View file

@ -41,16 +41,12 @@ if [ "$state_should" != "$state_is" ]; then
present) present)
owner="" owner=""
if [ -f "$__object/parameter/owner" ]; then if [ -f "$__object/parameter/owner" ]; then
owner="-O \"$(cat "$__object/parameter/owner")\"" owner="-O '$(cat "$__object/parameter/owner")'"
fi fi
cat << EOF echo "su - '$postgres_user' -c \"createdb $owner '$name'\""
su - '$postgres_user' -c "createdb $owner \"$name\""
EOF
;; ;;
absent) absent)
cat << EOF echo "su - '$postgres_user' -c \"dropdb '$name'\""
su - '$postgres_user' -c "dropdb \"$name\""
EOF
;; ;;
esac esac
fi fi

View file

@ -53,13 +53,11 @@ case "$state_should" in
done done
[ -n "$password" ] && password="PASSWORD '$password'" [ -n "$password" ] && password="PASSWORD '$password'"
cat << EOF
su - '$postgres_user' -c "psql postgres -wc 'CREATE ROLE \"$name\" WITH $password $booleans;'" cmd="CREATE ROLE $name WITH $password $booleans"
EOF echo "su - '$postgres_user' -c \"psql postgres -wc \\\"$cmd\\\"\""
;; ;;
absent) absent)
cat << EOF echo "su - '$postgres_user' -c \"dropuser \\\"$name\\\"\""
su - '$postgres_user' -c "dropuser \"$name\""
EOF
;; ;;
esac esac

View file

@ -69,6 +69,7 @@ class Local(object):
self.exec_path = exec_path self.exec_path = exec_path
self.custom_initial_manifest = initial_manifest self.custom_initial_manifest = initial_manifest
self._add_conf_dirs = add_conf_dirs
self.cache_path_pattern = cache_path_pattern self.cache_path_pattern = cache_path_pattern
self.quiet_mode = quiet_mode self.quiet_mode = quiet_mode
if configuration: if configuration:
@ -83,7 +84,16 @@ class Local(object):
self._init_cache_dir(None) self._init_cache_dir(None)
self._init_paths() self._init_paths()
self._init_object_marker() self._init_object_marker()
self._init_conf_dirs(add_conf_dirs) self._init_conf_dirs()
@property
def dist_conf_dir(self):
return os.path.abspath(os.path.join(os.path.dirname(cdist.__file__),
"conf"))
@property
def home_dir(self):
return cdist.home_dir()
def _init_log(self): def _init_log(self):
self.log = logging.getLogger(self.target_host[0]) self.log = logging.getLogger(self.target_host[0])
@ -130,9 +140,28 @@ class Local(object):
# Does not need to be secure - just randomly different from .cdist # Does not need to be secure - just randomly different from .cdist
self.object_marker_name = tempfile.mktemp(prefix='.cdist-', dir='') self.object_marker_name = tempfile.mktemp(prefix='.cdist-', dir='')
def _init_conf_dirs(self, add_conf_dirs): def _init_conf_dirs(self):
self.conf_dirs = util.resolve_conf_dirs( self.conf_dirs = []
self.configuration, add_conf_dirs=add_conf_dirs)
self.conf_dirs.append(self.dist_conf_dir)
# Is the default place for user created explorer, type and manifest
if self.home_dir:
self.conf_dirs.append(self.home_dir)
# Add directories defined in the CDIST_PATH environment variable
# if 'CDIST_PATH' in os.environ:
# cdist_path_dirs = re.split(r'(?<!\\):', os.environ['CDIST_PATH'])
# cdist_path_dirs.reverse()
# self.conf_dirs.extend(cdist_path_dirs)
if 'conf_dir' in self.configuration:
conf_dirs = self.configuration['conf_dir']
if conf_dirs:
self.conf_dirs.extend(conf_dirs)
# Add command line supplied directories
if self._add_conf_dirs:
self.conf_dirs.extend(self._add_conf_dirs)
def _init_directories(self): def _init_directories(self):
self.mkdir(self.conf_path) self.mkdir(self.conf_path)
@ -158,11 +187,10 @@ class Local(object):
self.object_marker_name, self.object_marker_file)) self.object_marker_name, self.object_marker_file))
def _init_cache_dir(self, cache_dir): def _init_cache_dir(self, cache_dir):
home_dir = cdist.home_dir()
if cache_dir: if cache_dir:
self.cache_path = cache_dir self.cache_path = cache_dir
elif home_dir: elif self.home_dir:
self.cache_path = os.path.join(home_dir, "cache") self.cache_path = os.path.join(self.home_dir, "cache")
else: else:
raise cdist.Error( raise cdist.Error(
"No homedir setup and no cache dir location given") "No homedir setup and no cache dir location given")

View file

@ -24,7 +24,6 @@ import os
from tempfile import TemporaryFile from tempfile import TemporaryFile
import cdist import cdist
import cdist.configuration
# IMPORTANT: # IMPORTANT:
@ -176,34 +175,3 @@ def log_std_fd(log, command, stdfd, prefix):
stdfd.seek(0, 0) stdfd.seek(0, 0)
log.trace("Command: {}; {}: {}".format( log.trace("Command: {}; {}: {}".format(
command, prefix, stdfd.read().decode())) command, prefix, stdfd.read().decode()))
def dist_conf_dir():
return os.path.abspath(os.path.join(os.path.dirname(cdist.__file__),
"conf"))
def resolve_conf_dirs(configuration, add_conf_dirs):
conf_dirs = []
conf_dirs.append(dist_conf_dir())
home_dir = cdist.home_dir()
if home_dir:
conf_dirs.append(home_dir)
if 'conf_dir' in configuration:
x = configuration['conf_dir']
if x:
conf_dirs.extend(x)
if add_conf_dirs:
conf_dirs.extend(add_conf_dirs)
conf_dirs = set(conf_dirs)
return conf_dirs
def resolve_conf_dirs_from_config_and_args(args):
cfg = cdist.configuration.Configuration(args)
configuration = cfg.get_config(section='GLOBAL')
return resolve_conf_dirs(configuration, args.conf_dir)

View file

@ -1,181 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# 2019-2020 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 cdist.configuration
import cdist.core
import cdist.exec.util as util
import os
import glob
import fnmatch
class Info(object):
def __init__(self, conf_dirs, args):
self.conf_dirs = conf_dirs
self.all = args.all
self.display_global_explorers = args.global_explorers
self.display_types = args.types
if not self.display_global_explorers and not self.display_types:
self.all = True
self.fixed_string = args.fixed_string
self._setup_glob_pattern(args.pattern)
self.full = args.full
def _setup_glob_pattern(self, pattern):
if pattern is None:
self.glob_pattern = '*'
elif ('?' in pattern or '*' in pattern or '[' in pattern or
self.fixed_string):
self.glob_pattern = pattern
else:
self.glob_pattern = '*' + pattern + '*'
@classmethod
def commandline(cls, args):
conf_dirs = util.resolve_conf_dirs_from_config_and_args(args)
c = cls(conf_dirs, args)
c.run()
def _get_global_explorers(self, conf_path):
rv = []
global_explorer_path = os.path.join(conf_path, "explorer",
self.glob_pattern)
if self.fixed_string:
if os.path.exists(global_explorer_path):
rv.append(global_explorer_path)
else:
for explorer in glob.glob(global_explorer_path):
rv.append(explorer)
return rv
def _should_display_type(self, dir_entry):
if not dir_entry.is_dir():
return False
if self.glob_pattern is None:
return True
if self.fixed_string:
return dir_entry.name == self.glob_pattern
else:
return fnmatch.fnmatch(dir_entry.name, self.glob_pattern)
def _get_types(self, conf_path):
rv = []
types_path = os.path.join(conf_path, "type")
if not os.path.exists(types_path):
return rv
with os.scandir(types_path) as it:
for entry in it:
if self._should_display_type(entry):
rv.append(entry.path)
return rv
def _display_details(self, title, details, default_values=None,
deprecated=None):
if not details:
return
if isinstance(details, bool):
print("\t{}: {}".format(title, 'yes' if details else 'no'))
elif isinstance(details, str):
print("\t{}: {}".format(title, details))
elif isinstance(details, list):
dv = dict(default_values) if default_values else {}
dp = dict(deprecated) if deprecated else {}
print("\t{}:".format(title))
for x in sorted(details):
print("\t\t{}".format(x), end='')
has_default = x in dv
is_deprecated = x in dp
need_comma = False
if has_default or is_deprecated:
print(" (", end='')
if has_default:
print("default: {}".format(dv[x]), end='')
need_comma = True
if is_deprecated:
print("{}deprecated".format(', ' if need_comma else ''),
end='')
if has_default or is_deprecated:
print(")", end='')
print()
def _display_type_parameters(self, cdist_type):
self._display_details("required parameters",
cdist_type.required_parameters,
default_values=cdist_type.parameter_defaults,
deprecated=cdist_type.deprecated_parameters)
self._display_details("required multiple parameters",
cdist_type.required_multiple_parameters,
default_values=cdist_type.parameter_defaults,
deprecated=cdist_type.deprecated_parameters)
self._display_details("optional parameters",
cdist_type.optional_parameters,
default_values=cdist_type.parameter_defaults,
deprecated=cdist_type.deprecated_parameters)
self._display_details("optional multiple parameters",
cdist_type.optional_multiple_parameters,
default_values=cdist_type.parameter_defaults,
deprecated=cdist_type.deprecated_parameters)
self._display_details("boolean parameters",
cdist_type.boolean_parameters,
default_values=cdist_type.parameter_defaults,
deprecated=cdist_type.deprecated_parameters)
def _display_type_characteristics(self, cdist_type):
characteristics = []
if cdist_type.is_install:
characteristics.append('install')
else:
characteristics.append('config')
if cdist_type.is_singleton:
characteristics.append('singleton')
if cdist_type.is_nonparallel:
characteristics.append('nonparallel')
else:
characteristics.append('parallel')
if cdist_type.deprecated is not None:
characteristics.append('deprecated')
print("\t{}".format(', '.join(characteristics)))
def _display_type_details(self, type_path):
dirname, basename = os.path.split(type_path)
cdist_type = cdist.core.CdistType(dirname, basename)
self._display_type_characteristics(cdist_type)
self._display_type_parameters(cdist_type)
def run(self):
rv = []
for cp in self.conf_dirs:
conf_path = os.path.expanduser(cp)
if self.all or self.display_global_explorers:
rv.extend((x, 'E', ) for x in self._get_global_explorers(
conf_path))
if self.all or self.display_types:
rv.extend((x, 'T', ) for x in self._get_types(conf_path))
rv = sorted(rv, key=lambda x: x[0])
for x, t in rv:
print(x)
if self.full and t == 'T':
self._display_type_details(x)

45
cdist/libexec.py Normal file
View file

@ -0,0 +1,45 @@
import os
import os.path
import cdist.argparse
import subprocess
import sys
libexec_delimiter = '-'
libexec_prefix = 'cdist' + libexec_delimiter
libexec_path = os.path.abspath(
os.path.join(os.path.dirname(cdist.__file__), 'conf', 'libexec'))
def scan():
if os.path.isdir(libexec_path):
with os.scandir(libexec_path) as it:
for entry in it:
if (entry.name.startswith(libexec_prefix) and
entry.is_file() and
os.access(entry.path, os.X_OK)):
start = entry.name.find(libexec_delimiter) + 1
yield entry.name[start:]
def is_libexec_command(name):
for x in scan():
if name == x:
return True
return False
def create_parsers(parser, parent_parser):
for name in scan():
parser[name] = parent_parser.add_parser(name, add_help=False)
def run(name, argv):
lib_name = libexec_prefix + name
lib_path = os.path.join(libexec_path, lib_name)
args = [lib_path, ]
args.extend(argv)
try:
subprocess.check_call(args)
except subprocess.CalledProcessError as e:
sys.exit(e.returncode)

View file

@ -5,9 +5,8 @@ import inspect
import argparse import argparse
import cdist import cdist
import logging import logging
import re
import cdist.argparse import cdist.argparse
import cdist.configuration
import cdist.exec.util as util
_PREOS_CALL = "commandline" _PREOS_CALL = "commandline"
@ -25,6 +24,16 @@ def extend_plugins_path(dirs):
_PLUGINS_PATH.append(preos_dir) _PLUGINS_PATH.append(preos_dir)
cdist_home = cdist.home_dir()
if cdist_home:
extend_plugins_path((cdist_home, ))
x = 'CDIST_PATH'
if x in os.environ:
vals = re.split(r'(?<!\\):', os.environ[x])
vals = [x for x in vals if x]
extend_plugins_path(vals)
def preos_plugin(obj): def preos_plugin(obj):
"""It is preos if _PREOS_MARKER is True and has _PREOS_CALL.""" """It is preos if _PREOS_MARKER is True and has _PREOS_CALL."""
if hasattr(obj, _PREOS_MARKER): if hasattr(obj, _PREOS_MARKER):
@ -93,9 +102,6 @@ class PreOS(object):
help=('Add configuration directory (one that ' help=('Add configuration directory (one that '
'contains "preos" subdirectory)'), 'contains "preos" subdirectory)'),
action='append') action='append')
parser.add_argument('-g', '--config-file',
help='Use specified custom configuration file.',
dest="config_file", required=False)
parser.add_argument('-L', '--list-preoses', parser.add_argument('-L', '--list-preoses',
help='List available PreOS-es', help='List available PreOS-es',
action='store_true', default=False) action='store_true', default=False)
@ -104,9 +110,8 @@ class PreOS(object):
cdist.argparse.handle_loglevel(args) cdist.argparse.handle_loglevel(args)
log.debug("preos args : {}".format(args)) log.debug("preos args : {}".format(args))
conf_dirs = util.resolve_conf_dirs_from_config_and_args(args) if args.conf_dir:
extend_plugins_path(args.conf_dir)
extend_plugins_path(conf_dirs)
sys.path.extend(_PLUGINS_PATH) sys.path.extend(_PLUGINS_PATH)
cls.preoses = find_preoses() cls.preoses = find_preoses()

View file

@ -1,19 +1,6 @@
Changelog Changelog
--------- ---------
next:
* Type __acl: Add --entry parameter to replace --acl, deprecate --acl (Ander Punnar)
* Core: preos: Fix missing configuration file usage, support -g, --config-file option (Darko Poljak)
* Core info command: Support tilde expansion of conf directories (Darko Poljak)
6.4.0: 2020-01-04
* Type __consul_agent: Don't deploy init script on Alpine anymore, it ships with one itself (Nico Schottelius)
* Type __install_chroot_umount: Bugfix: type was not using __chroot_umount/manifest (Steven Armstrong)
* Types __postgres_*: Use double quoted identifiers in generated SQL (Timothée Floure)
* Core: Add cdist info command (Darko Poljak)
* New types: __mysql_user, __mysql_privileges (Ander Punnar)
* Type __mysql_database: Rewrite (Ander Punnar)
6.3.0: 2019-12-12 6.3.0: 2019-12-12
* Type __package_update_index: Fix Alpine part (Dominique Roux) * Type __package_update_index: Fix Alpine part (Dominique Roux)
* Documentation: Fix man pages for install types (Darko Poljak) * Documentation: Fix man pages for install types (Darko Poljak)

View file

@ -48,17 +48,17 @@ Using debug dump helper script
------------------------------ ------------------------------
Since cdist stores data to local cache that can be used for debugging there Since cdist stores data to local cache that can be used for debugging there
is a helper script that dumps data from local cache, is a helper script that dumps data from local cache,
`cdist-dump <man1/cdist-dump.html>`_. `cdist dump <man1/cdist-dump.html>`_.
For more info see: For more info see:
.. code-block:: sh .. code-block:: sh
cdist-dump -h cdist_dump -h
Or from cdist git cloned directory: Or from cdist git cloned directory:
.. code-block:: sh .. code-block:: sh
./scripts/cdist-dump -h ./bin/cdist dump -h

View file

@ -11,17 +11,17 @@ SYNOPSIS
:: ::
cdist-dump [options] [host...] cdist dump [options] [host...]
DESCRIPTION DESCRIPTION
----------- -----------
cdist-dump is a helper script that dumps data from local cdist cache for cdist dump is a helper script that dumps data from local cdist cache for
specified hosts. If host is not specified then all data from cache directory specified hosts. If host is not specified then all data from cache directory
is dumped. Default cache directory is '~/.cdist/cache'. is dumped. Default cache directory is '~/.cdist/cache'.
cdist-dump can be used for debugging existing types, host configuration and cdist dump can be used for debugging existing types, host configuration and
new types. new types.
@ -88,10 +88,10 @@ EXAMPLES
.. code-block:: sh .. code-block:: sh
# Dump all # Dump all
% cdist-dump -a % cdist dump -a
# Dump only code-* output # Dump only code-* output
% cdist-dump -c % cdist dump -c
SEE ALSO SEE ALSO

View file

@ -11,7 +11,7 @@ SYNOPSIS
:: ::
cdist [-h] [-V] {banner,config,install,inventory,preos,shell,info} ... cdist [-h] [-V] {banner,config,install,inventory,preos,shell} ...
cdist banner [-h] [-l LOGLEVEL] [-q] [-v] cdist banner [-h] [-l LOGLEVEL] [-q] [-v]
@ -59,9 +59,7 @@ SYNOPSIS
[-I INVENTORY_DIR] [-a] [-f HOSTFILE] [-H] [-t] [-I INVENTORY_DIR] [-a] [-f HOSTFILE] [-H] [-t]
[host [host ...]] [host [host ...]]
cdist preos [-h] [-l LOGLEVEL] [-q] [-v] [-c CONF_DIR] [-g CONFIG_FILE] cdist preos [-h] [-l LOGLEVEL] [-q] [-v] [-c CONF_DIR] [-L] [preos] ...
[-L]
[preos] ...
cdist preos [preos-options] debian [-h] [-l LOGLEVEL] [-q] [-v] [-b] [-a ARCH] [-B] cdist preos [preos-options] debian [-h] [-l LOGLEVEL] [-q] [-v] [-b] [-a ARCH] [-B]
[-C] [-c CDIST_PARAMS] [-D DRIVE] [-e REMOTE_EXEC] [-C] [-c CDIST_PARAMS] [-D DRIVE] [-e REMOTE_EXEC]
@ -86,8 +84,6 @@ SYNOPSIS
cdist shell [-h] [-l LOGLEVEL] [-q] [-v] [-s SHELL] cdist shell [-h] [-l LOGLEVEL] [-q] [-v] [-s SHELL]
cdist info [-h] [-a] [-c CONF_DIR] [-e] [-F] [-f] [-g CONFIG_FILE] [-t] [pattern]
DESCRIPTION DESCRIPTION
----------- -----------
@ -466,9 +462,6 @@ Create PreOS.
**-c CONF_DIR, --conf-dir CONF_DIR** **-c CONF_DIR, --conf-dir CONF_DIR**
Add configuration directory (one that contains "preos" subdirectory). Add configuration directory (one that contains "preos" subdirectory).
**-g CONFIG_FILE, --config-file CONFIG_FILE**
Use specified custom configuration file.
**-L, --list-preoses** **-L, --list-preoses**
List available PreOS-es. List available PreOS-es.
@ -611,39 +604,6 @@ usage. Its primary use is for debugging type parameters.
be POSIX compatible shell. be POSIX compatible shell.
INFO
----
Display information for cdist (global explorers, types).
**pattern**
Glob pattern. If it contains special characters('?', '*', '[') then it is
used as specified, otherwise it is translated to `*pattern*`.
**-h, --help**
Show help message and exit.
**-a, --all**
Display all info. This is the default.
**-c CONF_DIR, --conf-dir CONF_DIR**
Add configuration directory (can be repeated).
**-e, --global-explorers**
Display info for global explorers.
**-F, --fixed-string**
Interpret pattern as a fixed string.
**-f, --full**
Display full details.
**-g CONFIG_FILE, --config-file CONFIG_FILE**
Use specified custom configuration file.
**-t, --types**
Display info for types.
CONFIGURATION CONFIGURATION
------------- -------------
cdist obtains configuration data from the following sources in the following cdist obtains configuration data from the following sources in the following

View file

@ -30,14 +30,20 @@ import cdist.config
import cdist.install import cdist.install
import cdist.shell import cdist.shell
import cdist.inventory import cdist.inventory
import cdist.libexec as libexec
def commandline(): def commandline():
"""Parse command line""" """Parse command line"""
if len(sys.argv) > 1:
# preos subcommand hack # preos subcommand hack
if len(sys.argv) > 1 and sys.argv[1] == 'preos': if sys.argv[1] == 'preos':
return cdist.preos.PreOS.commandline(sys.argv[1:]) return cdist.preos.PreOS.commandline(sys.argv[1:])
# libexec subcommands hack
if libexec.is_libexec_command(sys.argv[1]):
return libexec.run(sys.argv[1], sys.argv[2:])
parser, cfg = cdist.argparse.parse_and_configure(sys.argv[1:]) parser, cfg = cdist.argparse.parse_and_configure(sys.argv[1:])
args = cfg.get_args() args = cfg.get_args()

View file

@ -56,7 +56,7 @@ setup(
name="cdist", name="cdist",
packages=["cdist", "cdist.core", "cdist.exec", "cdist.util", ], packages=["cdist", "cdist.core", "cdist.exec", "cdist.util", ],
package_data={'cdist': package_data}, package_data={'cdist': package_data},
scripts=["scripts/cdist", "scripts/cdist-dump", "scripts/cdist-new-type"], scripts=["scripts/cdist", ],
version=cdist.version.VERSION, version=cdist.version.VERSION,
description="A Usable Configuration Management System", description="A Usable Configuration Management System",
author="Nico Schottelius", author="Nico Schottelius",