Compare commits

..

25 commits

Author SHA1 Message Date
ef2f4b9a00 __postgres_*: fix forgotten edge cases in delimited identifier escape 2020-01-17 11:24:24 +01:00
Darko Poljak
3258fc98e1 Fix typo 2020-01-12 12:19:49 +01:00
Darko Poljak
3f133dbc17 Info command: support tilde expansion 2020-01-11 15:26:46 +01:00
Darko Poljak
11f569959d Fix missing configuration file usage, support -g
PreOS code did not use configuration support. This fix adds support
for using cdist configuration, which takes into account cdist
configuration file, environment variables and command line options,
especially conf_dir.

It also adds support for -g, --config-file option, for specifying
custom configuration file.
2020-01-11 14:16:33 +01:00
Darko Poljak
51ba4a49d8 ++changelog 2020-01-04 18:21:23 +01:00
b1e24881ce Merge branch '__acl_rename_param' into 'master'
__acl: rename --acl to --entry for the sake of consistency, add compatibility

See merge request ungleich-public/cdist!829
2020-01-04 18:20:56 +01:00
d4bd49bbb5 __acl: rename --acl to --entry for the sake of consistency, add compatibility 2020-01-04 17:43:57 +02:00
Darko Poljak
d1a64596fe Update build-helper 2020-01-04 14:56:05 +01:00
Darko Poljak
7c9dd3b03e Release 6.4.0 2020-01-04 14:36:14 +01:00
Darko Poljak
bc1990c7c8 ++changelog 2020-01-04 13:44:04 +01:00
1fc845480e Merge branch '__mysql' into 'master'
rewrite __mysql_database, add types __mysql_user and __mysql_privileges

See merge request ungleich-public/cdist!827
2020-01-04 13:45:15 +01:00
Darko Poljak
e201536792 ++changelog 2020-01-04 13:18:13 +01:00
Darko Poljak
7b1192257d Fix incomplete cdist info synopsis 2020-01-04 13:17:54 +01:00
9b2e273bd1 Merge branch 'feature/info-command' into 'master'
Add cdist info command

See merge request ungleich-public/cdist!825
2020-01-04 13:16:49 +01:00
Darko Poljak
e4596593c0 Add cdist info command 2020-01-04 12:50:12 +01:00
Darko Poljak
72935e0a79 ++changelog 2020-01-04 11:08:48 +01:00
Darko Poljak
6369bc1ae5 ++changelog 2020-01-04 10:07:53 +01:00
c51571b47f Merge branch 'master' into 'master'
__postgres_*: use delimited identifiers (double quoted) in generated SQL

See merge request ungleich-public/cdist!826
2020-01-04 10:09:07 +01:00
4329cced82 __mysql_privileges: add manual 2020-01-03 18:55:55 +02:00
5e8dc7122d __mysql_user: add manual 2020-01-03 18:48:11 +02:00
fcc774cb7b __mysql_database: add manual 2020-01-03 18:33:23 +02:00
24862e0208 __mysql_database: carry over state 2020-01-03 18:26:11 +02:00
9a693537f4 __mysql_*: add license headers 2020-01-01 12:38:12 +02:00
c32e4040b1 __mysql_*: initial rewrite 2019-12-31 19:16:49 +02:00
beb930c0dc __postgres_*: use delimited identifiers (double quoted) in generated SQL 2019-12-31 11:34:51 +01:00
34 changed files with 670 additions and 139 deletions

View file

@ -370,7 +370,7 @@ eof
cat << eof
Manual steps post release:
- cdist-web
- send mail body generated in mailinglist.tmp and inform Dmitry for deb
- send generated mailinglist.tmp mail
- twitter
eof
;;

View file

@ -440,8 +440,8 @@ def get_parsers():
# Info
parser['info'] = parser['sub'].add_parser('info')
parser['info'].add_argument(
'-a', '--all', help='Display all info.', action='store_true',
default=False)
'-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).',
@ -451,9 +451,16 @@ def get_parsers():
help='Display info for global explorers.', action='store_true',
default=False)
parser['info'].add_argument(
'-H', '--suppress-headers',
help='Suppress displaying header lines.', action='store_true',
'-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)

View file

@ -28,7 +28,10 @@ acl_path="/$__object_id"
acl_is="$( cat "$__object/explorer/acl_is" )"
if [ -f "$__object/parameter/acl" ]
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

View file

@ -15,7 +15,7 @@ See ``setfacl`` and ``acl`` manpages for more details.
REQUIRED MULTIPLE PARAMETERS
----------------------------
acl
entry
Set ACL entry following ``getfacl`` output syntax.
@ -36,8 +36,8 @@ remove
DEPRECATED PARAMETERS
---------------------
Parameters ``user``, ``group``, ``mask`` and ``other`` are deprecated and they
will be removed in future versions. Please use ``acl`` parameter instead.
Parameters ``acl``, ``user``, ``group``, ``mask`` and ``other`` are deprecated and they
will be removed in future versions. Please use ``entry`` parameter instead.
EXAMPLES
@ -49,27 +49,27 @@ EXAMPLES
--default \
--recursive \
--remove \
--acl user:alice:rwx \
--acl user:bob:r-x \
--acl group:project-group:rwx \
--acl group:some-other-group:r-x \
--acl mask::r-x \
--acl other::r-x
--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 \
--acl default:group:secret-project:rwx \
--acl group:secret-project:rwx \
--acl user:alice:--x
--entry default:group:secret-project:rwx \
--entry group:secret-project:rwx \
--entry user:alice:--x
__acl /srv/project2/subdir \
--default \
--remove \
--acl group:secret-project:rwx \
--acl user:alice:r-x
--entry group:secret-project:rwx \
--entry user:alice:r-x
AUTHORS

View file

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

View file

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

View file

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

View file

@ -8,24 +8,24 @@ cdist-type__mysql_database - Manage a MySQL database
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
-------------------
name
The name of the database to install
defaults to the object id
Name of database. Defaults to object id.
user
A user that should have access to the database
Create user and give all privileges to database.
password
The password for the user who manages the database
Password for user.
state
Defaults to present.
If absent and user is also set, both will be removed (with privileges).
EXAMPLES
@ -33,17 +33,23 @@ EXAMPLES
.. code-block:: sh
__mysql_database "cdist" --name "cdist" --user "myuser" --password "mypwd"
# just create database
__mysql_database foo
# create database with respective user with all privileges to database
__mysql_database bar \
--user name \
--password secret
AUTHORS
-------
Benedikt Koeppel <code@benediktkoeppel.ch>
Ander Punnar <ander-at-kvlt-dot-ee>
COPYING
-------
Copyright \(C) 2012 Benedikt Koeppel. 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.
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

@ -0,0 +1,52 @@
#!/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

@ -0,0 +1 @@
present

View file

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

View file

@ -0,0 +1,40 @@
#!/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

@ -0,0 +1,49 @@
#!/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

@ -0,0 +1,57 @@
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

@ -0,0 +1 @@
localhost

View file

@ -0,0 +1 @@
all privileges

View file

@ -0,0 +1 @@
present

View file

@ -0,0 +1 @@
*

View file

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

View file

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

View file

@ -0,0 +1,54 @@
#!/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

@ -0,0 +1,68 @@
#!/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

@ -0,0 +1,48 @@
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

@ -0,0 +1 @@
localhost

View file

@ -0,0 +1 @@
present

View file

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

View file

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

View file

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

View file

@ -24,6 +24,7 @@ import os
from tempfile import TemporaryFile
import cdist
import cdist.configuration
# IMPORTANT:
@ -192,10 +193,17 @@ def resolve_conf_dirs(configuration, add_conf_dirs):
conf_dirs.append(home_dir)
if 'conf_dir' in configuration:
conf_dirs = configuration['conf_dir']
if conf_dirs:
conf_dirs.extend(conf_dirs)
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

@ -38,72 +38,144 @@ class Info(object):
self.display_types = args.types
if not self.display_global_explorers and not self.display_types:
self.all = True
if args.pattern is None:
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 = args.pattern
self.display_headers = not args.suppress_headers
self.glob_pattern = '*' + pattern + '*'
@classmethod
def commandline(cls, args):
cfg = cdist.configuration.Configuration(args)
configuration = cfg.get_config(section='GLOBAL')
conf_dirs = util.resolve_conf_dirs(configuration,
args.conf_dir)
conf_dirs = util.resolve_conf_dirs_from_config_and_args(args)
c = cls(conf_dirs, args)
c.run()
def _print_line(self):
print('-' * 78)
def _print_double_line(self):
print('=' * 78)
def _display_global_explorers_info(self, conf_path):
if self.display_headers:
print("{} config directory global explorers:".format(conf_path))
self._print_double_line()
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):
print(explorer)
if self.display_headers:
self._print_line()
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 _display_types_info(self, conf_path):
if self.display_headers:
print("{} config directory types:".format(conf_path))
self._print_double_line()
def _get_types(self, conf_path):
rv = []
types_path = os.path.join(conf_path, "type")
if not os.path.exists(types_path):
if self.display_headers:
self._print_line()
return
return rv
with os.scandir(types_path) as it:
for entry in it:
if self._should_display_type(entry):
print(entry.path)
if self.display_headers:
self._print_line()
rv.append(entry.path)
return rv
def _display_conf_dirs(self):
print("Config directories:")
self._print_double_line()
print("{}".format('\n'.join(self.conf_dirs)))
self._print_line()
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):
if self.display_headers:
self._display_conf_dirs()
for conf_path in self.conf_dirs:
rv = []
for cp in self.conf_dirs:
conf_path = os.path.expanduser(cp)
if self.all or self.display_global_explorers:
self._display_global_explorers_info(conf_path)
rv.extend((x, 'E', ) for x in self._get_global_explorers(
conf_path))
if self.all or self.display_types:
self._display_types_info(conf_path)
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)

View file

@ -5,8 +5,9 @@ import inspect
import argparse
import cdist
import logging
import re
import cdist.argparse
import cdist.configuration
import cdist.exec.util as util
_PREOS_CALL = "commandline"
@ -24,16 +25,6 @@ def extend_plugins_path(dirs):
_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):
"""It is preos if _PREOS_MARKER is True and has _PREOS_CALL."""
if hasattr(obj, _PREOS_MARKER):
@ -102,6 +93,9 @@ class PreOS(object):
help=('Add configuration directory (one that '
'contains "preos" subdirectory)'),
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',
help='List available PreOS-es',
action='store_true', default=False)
@ -110,8 +104,9 @@ class PreOS(object):
cdist.argparse.handle_loglevel(args)
log.debug("preos args : {}".format(args))
if args.conf_dir:
extend_plugins_path(args.conf_dir)
conf_dirs = util.resolve_conf_dirs_from_config_and_args(args)
extend_plugins_path(conf_dirs)
sys.path.extend(_PLUGINS_PATH)
cls.preoses = find_preoses()

View file

@ -2,8 +2,17 @@ Changelog
---------
next:
* Type __consul_agent: don't deploy init script on Alpine anymore,
it ships with one itself (Nico Schottelius)
* 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
* Type __package_update_index: Fix Alpine part (Dominique Roux)

View file

@ -59,7 +59,9 @@ SYNOPSIS
[-I INVENTORY_DIR] [-a] [-f HOSTFILE] [-H] [-t]
[host [host ...]]
cdist preos [-h] [-l LOGLEVEL] [-q] [-v] [-c CONF_DIR] [-L] [preos] ...
cdist preos [-h] [-l LOGLEVEL] [-q] [-v] [-c CONF_DIR] [-g CONFIG_FILE]
[-L]
[preos] ...
cdist preos [preos-options] debian [-h] [-l LOGLEVEL] [-q] [-v] [-b] [-a ARCH] [-B]
[-C] [-c CDIST_PARAMS] [-D DRIVE] [-e REMOTE_EXEC]
@ -84,7 +86,7 @@ SYNOPSIS
cdist shell [-h] [-l LOGLEVEL] [-q] [-v] [-s SHELL]
cdist info [-h] [-a] [-c CONF_DIR] [-e] [-H] [-t] [pattern]
cdist info [-h] [-a] [-c CONF_DIR] [-e] [-F] [-f] [-g CONFIG_FILE] [-t] [pattern]
DESCRIPTION
@ -464,6 +466,9 @@ Create PreOS.
**-c CONF_DIR, --conf-dir CONF_DIR**
Add configuration directory (one that contains "preos" subdirectory).
**-g CONFIG_FILE, --config-file CONFIG_FILE**
Use specified custom configuration file.
**-L, --list-preoses**
List available PreOS-es.
@ -611,13 +616,14 @@ INFO
Display information for cdist (global explorers, types).
**pattern**
Glob 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.
Display all info. This is the default.
**-c CONF_DIR, --conf-dir CONF_DIR**
Add configuration directory (can be repeated).
@ -625,8 +631,14 @@ Display information for cdist (global explorers, types).
**-e, --global-explorers**
Display info for global explorers.
**-H, --suppress-headers**
Suppress displaying header lines.
**-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.