[meta-virtualization] [PATCH] salt: add recipe for salt

Bruce Ashfield bruce.ashfield at gmail.com
Mon May 11 21:08:59 PDT 2015


The series looks good to me, I've queued it locally and will push it soon.
Is there a README or HOWTO for any runtime testing ?

Bruce

On Fri, May 8, 2015 at 11:28 AM, Alejandro del Castillo
<alejandro.delcastillo at ni.com> wrote:
> Signed-off-by: Alejandro del Castillo <alejandro.delcastillo at ni.com>
> ---
>  meta-openstack/recipes-support/salt/files/cloud    |  94 ++++
>  meta-openstack/recipes-support/salt/files/master   | 525 +++++++++++++++++++++
>  meta-openstack/recipes-support/salt/files/minion   | 494 +++++++++++++++++++
>  meta-openstack/recipes-support/salt/files/roster   |   8 +
>  meta-openstack/recipes-support/salt/files/salt-api | 110 +++++
>  .../salt/files/salt-common.bash_completion         | 332 +++++++++++++
>  .../salt/files/salt-common.logrotate               |  10 +
>  .../recipes-support/salt/files/salt-master         | 111 +++++
>  .../recipes-support/salt/files/salt-minion         | 111 +++++
>  .../recipes-support/salt/files/salt-syndic         | 111 +++++
>  .../salt/salt/set_python_location_hashbang.patch   | 107 +++++
>  .../recipes-support/salt/salt_2014.7.4.bb          | 145 ++++++
>  12 files changed, 2158 insertions(+)
>  create mode 100644 meta-openstack/recipes-support/salt/files/cloud
>  create mode 100644 meta-openstack/recipes-support/salt/files/master
>  create mode 100644 meta-openstack/recipes-support/salt/files/minion
>  create mode 100644 meta-openstack/recipes-support/salt/files/roster
>  create mode 100755 meta-openstack/recipes-support/salt/files/salt-api
>  create mode 100644 meta-openstack/recipes-support/salt/files/salt-common.bash_completion
>  create mode 100644 meta-openstack/recipes-support/salt/files/salt-common.logrotate
>  create mode 100755 meta-openstack/recipes-support/salt/files/salt-master
>  create mode 100755 meta-openstack/recipes-support/salt/files/salt-minion
>  create mode 100755 meta-openstack/recipes-support/salt/files/salt-syndic
>  create mode 100644 meta-openstack/recipes-support/salt/salt/set_python_location_hashbang.patch
>  create mode 100644 meta-openstack/recipes-support/salt/salt_2014.7.4.bb
>
> diff --git a/meta-openstack/recipes-support/salt/files/cloud b/meta-openstack/recipes-support/salt/files/cloud
> new file mode 100644
> index 0000000..2ea54f1
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/cloud
> @@ -0,0 +1,94 @@
> +# This file should normally be installed at: /etc/salt/cloud
> +
> +
> +##########################################
> +#####          VM Defaults           #####
> +##########################################
> +
> +# Set the size of minion keys to generate, defaults to 2048
> +#
> +#keysize: 2048
> +
> +
> +# Set the default os being deployed. This sets which deployment script to
> +# apply. This argument is optional.
> +#
> +#script: bootstrap-salt
> +
> +
> +##########################################
> +#####         Logging Settings       #####
> +##########################################
> +
> +# The location of the master log file
> +#
> +#log_file: /var/log/salt/cloud
> +
> +
> +# The level of messages to send to the console.
> +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
> +#
> +# Default: 'info'
> +#
> +#log_level: info
> +
> +
> +# The level of messages to send to the log file.
> +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
> +#
> +# Default: 'info'
> +#
> +#log_level_logfile: info
> +
> +
> +# The date and time format used in log messages. Allowed date/time formating
> +# can be seen here:
> +#
> +#      http://docs.python.org/library/time.html#time.strftime
> +#
> +#log_datefmt: '%Y-%m-%d %H:%M:%S'
> +
> +
> +# The format of the console logging messages. Allowed formatting options can
> +# be seen here:
> +#
> +#      http://docs.python.org/library/logging.html#logrecord-attributes
> +#
> +# Console log colors are specified by these additional formatters:
> +#
> +# %(colorlevel)s
> +# %(colorname)s
> +# %(colorprocess)s
> +# %(colormsg)s
> +#
> +# Since it is desirable to include the surrounding brackets, '[' and ']', in
> +# the coloring of the messages, these color formatters also include padding as
> +# well.  Color LogRecord attributes are only available for console logging.
> +#
> +#log_fmt_console: '[%(levelname)-8s] %(message)s'
> +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s'
> +
> +
> +# Logger levels can be used to tweak specific loggers logging levels.
> +# For example, if you want to have the salt library at the 'warning' level,
> +# but you still wish to have 'salt.modules' at the 'debug' level:
> +#
> +#   log_granular_levels:
> +#     'salt': 'warning',
> +#     'salt.modules': 'debug'
> +#     'saltcloud': 'info'
> +#
> +#log_granular_levels: {}
> +
> +
> +##########################################
> +#####         Misc Defaults          #####
> +##########################################
> +
> +# Whether or not to remove the accompanying SSH key from the known_hosts file
> +# when an instance is destroyed.
> +#
> +# Default: 'False'
> +#
> +#delete_sshkeys: False
> +
> diff --git a/meta-openstack/recipes-support/salt/files/master b/meta-openstack/recipes-support/salt/files/master
> new file mode 100644
> index 0000000..8129a4f
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/master
> @@ -0,0 +1,525 @@
> +##### Primary configuration settings #####
> +##########################################
> +# This configuration file is used to manage the behavior of the Salt Master
> +# Values that are commented out but have no space after the comment are
> +# defaults that need not be set in the config. If there is a space after the
> +# comment that the value is presented as an example and is not the default.
> +
> +# Per default, the master will automatically include all config files
> +# from master.d/*.conf (master.d is a directory in the same directory
> +# as the main master config file)
> +#default_include: master.d/*.conf
> +
> +# The address of the interface to bind to
> +#interface: 0.0.0.0
> +
> +# Whether the master should listen for IPv6 connections. If this is set to True,
> +# the interface option must be adjusted too (for example: "interface: '::'")
> +#ipv6: False
> +
> +# The tcp port used by the publisher
> +#publish_port: 4505
> +
> +# The user to run the salt-master as. Salt will update all permissions to
> +# allow the specified user to run the master. If the modified files cause
> +# conflicts set verify_env to False.
> +#user: root
> +
> +# Max open files
> +# Each minion connecting to the master uses AT LEAST one file descriptor, the
> +# master subscription connection. If enough minions connect you might start
> +# seeing on the console(and then salt-master crashes):
> +#   Too many open files (tcp_listener.cpp:335)
> +#   Aborted (core dumped)
> +#
> +# By default this value will be the one of `ulimit -Hn`, ie, the hard limit for
> +# max open files.
> +#
> +# If you wish to set a different value than the default one, uncomment and
> +# configure this setting. Remember that this value CANNOT be higher than the
> +# hard limit. Raising the hard limit depends on your OS and/or distribution,
> +# a good way to find the limit is to search the internet for(for example):
> +#   raise max open files hard limit debian
> +#
> +#max_open_files: 100000
> +
> +# The number of worker threads to start, these threads are used to manage
> +# return calls made from minions to the master, if the master seems to be
> +# running slowly, increase the number of threads
> +#worker_threads: 5
> +
> +# The port used by the communication interface. The ret (return) port is the
> +# interface used for the file server, authentication, job returnes, etc.
> +#ret_port: 4506
> +
> +# Specify the location of the daemon process ID file
> +#pidfile: /var/run/salt-master.pid
> +
> +# The root directory prepended to these options: pki_dir, cachedir,
> +# sock_dir, log_file, autosign_file, extension_modules, key_logfile, pidfile.
> +#root_dir: /
> +
> +# Directory used to store public key data
> +#pki_dir: /etc/salt/pki/master
> +
> +# Directory to store job and cache data
> +#cachedir: /var/cache/salt/master
> +
> +# Verify and set permissions on configuration directories at startup
> +#verify_env: True
> +
> +# Set the number of hours to keep old job information in the job cache
> +#keep_jobs: 24
> +
> +# Set the default timeout for the salt command and api, the default is 5
> +# seconds
> +#timeout: 5
> +
> +# The loop_interval option controls the seconds for the master's maintinance
> +# process check cycle. This process updates file server backends, cleans the
> +# job cache and executes the scheduler.
> +#loop_interval: 60
> +
> +# Set the default outputter used by the salt command. The default is "nested"
> +#output: nested
> +
> +# By default output is colored, to disable colored output set the color value
> +# to False
> +#color: True
> +
> +# Set the directory used to hold unix sockets
> +#sock_dir: /var/run/salt/master
> +
> +# The master can take a while to start up when lspci and/or dmidecode is used
> +# to populate the grains for the master. Enable if you want to see GPU hardware
> +# data for your master.
> +#
> +# enable_gpu_grains: False
> +
> +# The master maintains a job cache, while this is a great addition it can be
> +# a burden on the master for larger deployments (over 5000 minions).
> +# Disabling the job cache will make previously executed jobs unavailable to
> +# the jobs system and is not generally recommended.
> +#
> +#job_cache: True
> +
> +# Cache minion grains and pillar data in the cachedir.
> +#minion_data_cache: True
> +
> +# The master can include configuration from other files. To enable this,
> +# pass a list of paths to this option. The paths can be either relative or
> +# absolute; if relative, they are considered to be relative to the directory
> +# the main master configuration file lives in (this file). Paths can make use
> +# of shell-style globbing. If no files are matched by a path passed to this
> +# option then the master will log a warning message.
> +#
> +#
> +# Include a config file from some other path:
> +#include: /etc/salt/extra_config
> +#
> +# Include config from several files and directories:
> +#include:
> +#  - /etc/salt/extra_config
> +
> +
> +#####        Security settings       #####
> +##########################################
> +# Enable "open mode", this mode still maintains encryption, but turns off
> +# authentication, this is only intended for highly secure environments or for
> +# the situation where your keys end up in a bad state. If you run in open mode
> +# you do so at your own risk!
> +#open_mode: False
> +
> +# Enable auto_accept, this setting will automatically accept all incoming
> +# public keys from the minions. Note that this is insecure.
> +#auto_accept: False
> +
> +# If the autosign_file is specified only incoming keys specified in
> +# the autosign_file will be automatically accepted. This is insecure.
> +# Regular expressions as well as globing lines are supported.
> +#autosign_file: /etc/salt/autosign.conf
> +
> +# Enable permissive access to the salt keys.  This allows you to run the
> +# master or minion as root, but have a non-root group be given access to
> +# your pki_dir.  To make the access explicit, root must belong to the group
> +# you've given access to.  This is potentially quite insecure.
> +# If an autosign_file is specified, enabling permissive_pki_access will allow group access
> +# to that specific file.
> +#permissive_pki_access: False
> +
> +# Allow users on the master access to execute specific commands on minions.
> +# This setting should be treated with care since it opens up execution
> +# capabilities to non root users. By default this capability is completely
> +# disabled.
> +#
> +#client_acl:
> +#  larry:
> +#    - test.ping
> +#    - network.*
> +#
> +
> +# Blacklist any of the following users or modules
> +#
> +# This example would blacklist all non sudo users, including root from
> +# running any commands. It would also blacklist any use of the "cmd"
> +# module.
> +# This is completely disabled by default.
> +#
> +#client_acl_blacklist:
> +#  users:
> +#    - root
> +#    - '^(?!sudo_).*$'   #  all non sudo users
> +#  modules:
> +#    - cmd
> +
> +# The external auth system uses the Salt auth modules to authenticate and
> +# validate users to access areas of the Salt system.
> +#
> +#external_auth:
> +#  pam:
> +#    fred:
> +#      - test.*
> +#
> +
> +# Time (in seconds) for a newly generated token to live. Default: 12 hours
> +#token_expire: 43200
> +
> +# Allow minions to push files to the master. This is disabled by default, for
> +# security purposes.
> +#file_recv: False
> +
> +# Signature verification on messages published from the master.
> +# This causes the master to cryptographically sign all messages published to its event
> +# bus, and minions then verify that signature before acting on the message.
> +#
> +# This is False by default.
> +#
> +# Note that to facilitate interoperability with masters and minions that are different
> +# versions, if sign_pub_messages is True but a message is received by a minion with
> +# no signature, it will still be accepted, and a warning message will be logged.
> +# Conversely, if sign_pub_messages is False, but a minion receives a signed
> +# message it will be accepted, the signature will not be checked, and a warning message
> +# will be logged.  This behavior will go away in Salt 0.17.6 (or Hydrogen RC1, whichever
> +# comes first) and these two situations will cause minion to throw an exception and
> +# drop the message.
> +#
> +# sign_pub_messages: False
> +
> +#####    Master Module Management    #####
> +##########################################
> +# Manage how master side modules are loaded
> +
> +# Add any additional locations to look for master runners
> +#runner_dirs: []
> +
> +# Enable Cython for master side modules
> +#cython_enable: False
> +
> +
> +#####      State System settings     #####
> +##########################################
> +# The state system uses a "top" file to tell the minions what environment to
> +# use and what modules to use. The state_top file is defined relative to the
> +# root of the base environment as defined in "File Server settings" below.
> +#state_top: top.sls
> +
> +# The master_tops option replaces the external_nodes option by creating
> +# a plugable system for the generation of external top data. The external_nodes
> +# option is deprecated by the master_tops option.
> +# To gain the capabilities of the classic external_nodes system, use the
> +# following configuration:
> +# master_tops:
> +#   ext_nodes: <Shell command which returns yaml>
> +#
> +#master_tops: {}
> +
> +# The external_nodes option allows Salt to gather data that would normally be
> +# placed in a top file. The external_nodes option is the executable that will
> +# return the ENC data. Remember that Salt will look for external nodes AND top
> +# files and combine the results if both are enabled!
> +#external_nodes: None
> +
> +# The renderer to use on the minions to render the state data
> +#renderer: yaml_jinja
> +
> +# The failhard option tells the minions to stop immediately after the first
> +# failure detected in the state execution, defaults to False
> +#failhard: False
> +
> +# The state_verbose and state_output settings can be used to change the way
> +# state system data is printed to the display. By default all data is printed.
> +# The state_verbose setting can be set to True or False, when set to False
> +# all data that has a result of True and no changes will be suppressed.
> +#state_verbose: True
> +
> +# The state_output setting changes if the output is the full multi line
> +# output for each changed state if set to 'full', but if set to 'terse'
> +# the output will be shortened to a single line.  If set to 'mixed', the output
> +# will be terse unless a state failed, in which case that output will be full.
> +#state_output: full
> +
> +
> +#####      File Server settings      #####
> +##########################################
> +# Salt runs a lightweight file server written in zeromq to deliver files to
> +# minions. This file server is built into the master daemon and does not
> +# require a dedicated port.
> +
> +# The file server works on environments passed to the master, each environment
> +# can have multiple root directories, the subdirectories in the multiple file
> +# roots cannot match, otherwise the downloaded files will not be able to be
> +# reliably ensured. A base environment is required to house the top file.
> +# Example:
> +# file_roots:
> +#   base:
> +#     - /srv/salt/
> +#   dev:
> +#     - /srv/salt/dev/services
> +#     - /srv/salt/dev/states
> +#   prod:
> +#     - /srv/salt/prod/services
> +#     - /srv/salt/prod/states
> +
> +#file_roots:
> +#  base:
> +#    - /srv/salt
> +
> +# The hash_type is the hash to use when discovering the hash of a file on
> +# the master server. The default is md5, but sha1, sha224, sha256, sha384
> +# and sha512 are also supported.
> +#hash_type: md5
> +
> +# The buffer size in the file server can be adjusted here:
> +#file_buffer_size: 1048576
> +
> +# A regular expression (or a list of expressions) that will be matched
> +# against the file path before syncing the modules and states to the minions.
> +# This includes files affected by the file.recurse state.
> +# For example, if you manage your custom modules and states in subversion
> +# and don't want all the '.svn' folders and content synced to your minions,
> +# you could set this to '/\.svn($|/)'. By default nothing is ignored.
> +#
> +#file_ignore_regex:
> +#  - '/\.svn($|/)'
> +#  - '/\.git($|/)'
> +
> +# A file glob (or list of file globs) that will be matched against the file
> +# path before syncing the modules and states to the minions. This is similar
> +# to file_ignore_regex above, but works on globs instead of regex. By default
> +# nothing is ignored.
> +#
> +# file_ignore_glob:
> +#  - '*.pyc'
> +#  - '*/somefolder/*.bak'
> +#  - '*.swp'
> +
> +# File Server Backend
> +# Salt supports a modular fileserver backend system, this system allows
> +# the salt master to link directly to third party systems to gather and
> +# manage the files available to minions. Multiple backends can be
> +# configured and will be searched for the requested file in the order in which
> +# they are defined here. The default setting only enables the standard backend
> +# "roots" which uses the "file_roots" option.
> +#
> +#fileserver_backend:
> +#  - roots
> +#
> +# To use multiple backends list them in the order they are searched:
> +#
> +#fileserver_backend:
> +#  - git
> +#  - roots
> +#
> +# By default, the Salt fileserver recurses fully into all defined environments
> +# to attempt to find files. To limit this behavior so that the fileserver only
> +# traverses directories with SLS files and special Salt directories like _modules,
> +# enable the option below. This might be useful for installations where a file root
> +# has a very large number of files and performance is impacted. Default is False.
> +#
> +# fileserver_limit_traversal: False
> +#
> +# Git fileserver backend configuration
> +# When using the git fileserver backend at least one git remote needs to be
> +# defined. The user running the salt master will need read access to the repo.
> +#
> +#gitfs_remotes:
> +#  - git://github.com/saltstack/salt-states.git
> +#  - file:///var/git/saltmaster
> +#
> +# The repos will be searched in order to find the file requested by a client
> +# and the first repo to have the file will return it.
> +# When using the git backend branches and tags are translated into salt
> +# environments.
> +# Note:  file:// repos will be treated as a remote, so refs you want used must
> +# exist in that repo as *local* refs.
> +#
> +# The gitfs_root option gives the ability to serve files from a subdirectory
> +# within the repository. The path is defined relative to the root of the
> +# repository and defaults to the repository root.
> +#gitfs_root: somefolder/otherfolder
> +
> +
> +#####         Pillar settings        #####
> +##########################################
> +# Salt Pillars allow for the building of global data that can be made selectively
> +# available to different minions based on minion grain filtering. The Salt
> +# Pillar is laid out in the same fashion as the file server, with environments,
> +# a top file and sls files. However, pillar data does not need to be in the
> +# highstate format, and is generally just key/value pairs.
> +
> +#pillar_roots:
> +#  base:
> +#    - /srv/pillar
> +
> +#ext_pillar:
> +#  - hiera: /etc/hiera.yaml
> +#  - cmd_yaml: cat /etc/salt/yaml
> +
> +# The pillar_opts option adds the master configuration file data to a dict in
> +# the pillar called "master". This is used to set simple configurations in the
> +# master config file that can then be used on minions.
> +#pillar_opts: True
> +
> +
> +#####          Syndic settings       #####
> +##########################################
> +# The Salt syndic is used to pass commands through a master from a higher
> +# master. Using the syndic is simple, if this is a master that will have
> +# syndic servers(s) below it set the "order_masters" setting to True, if this
> +# is a master that will be running a syndic daemon for passthrough the
> +# "syndic_master" setting needs to be set to the location of the master server
> +# to receive commands from.
> +
> +# Set the order_masters setting to True if this master will command lower
> +# masters' syndic interfaces.
> +#order_masters: False
> +
> +# If this master will be running a salt syndic daemon, syndic_master tells
> +# this master where to receive commands from.
> +#syndic_master: masterofmaster
> +
> +# This is the 'ret_port' of the MasterOfMaster
> +#syndic_master_port: 4506
> +
> +# PID file of the syndic daemon
> +#syndic_pidfile: /var/run/salt-syndic.pid
> +
> +# LOG file of the syndic daemon
> +#syndic_log_file: syndic.log
> +
> +#####      Peer Publish settings     #####
> +##########################################
> +# Salt minions can send commands to other minions, but only if the minion is
> +# allowed to. By default "Peer Publication" is disabled, and when enabled it
> +# is enabled for specific minions and specific commands. This allows secure
> +# compartmentalization of commands based on individual minions.
> +
> +# The configuration uses regular expressions to match minions and then a list
> +# of regular expressions to match functions. The following will allow the
> +# minion authenticated as foo.example.com to execute functions from the test
> +# and pkg modules.
> +#
> +#peer:
> +#  foo.example.com:
> +#    - test.*
> +#    - pkg.*
> +#
> +# This will allow all minions to execute all commands:
> +#
> +#peer:
> +#  .*:
> +#    - .*
> +#
> +# This is not recommended, since it would allow anyone who gets root on any
> +# single minion to instantly have root on all of the minions!
> +
> +# Minions can also be allowed to execute runners from the salt master.
> +# Since executing a runner from the minion could be considered a security risk,
> +# it needs to be enabled. This setting functions just like the peer setting
> +# except that it opens up runners instead of module functions.
> +#
> +# All peer runner support is turned off by default and must be enabled before
> +# using. This will enable all peer runners for all minions:
> +#
> +#peer_run:
> +#  .*:
> +#    - .*
> +#
> +# To enable just the manage.up runner for the minion foo.example.com:
> +#
> +#peer_run:
> +#  foo.example.com:
> +#    - manage.up
> +
> +
> +#####         Logging settings       #####
> +##########################################
> +# The location of the master log file
> +# The master log can be sent to a regular file, local path name, or network
> +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.:
> +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI
> +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility>
> +#log_file: /var/log/salt/master
> +#log_file: file:///dev/log
> +#log_file: udp://loghost:10514
> +
> +#log_file: /var/log/salt/master
> +#key_logfile: /var/log/salt/key
> +
> +# The level of messages to send to the console.
> +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
> +#log_level: warning
> +
> +# The level of messages to send to the log file.
> +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
> +#log_level_logfile: warning
> +
> +# The date and time format used in log messages. Allowed date/time formating
> +# can be seen here: http://docs.python.org/library/time.html#time.strftime
> +#log_datefmt: '%H:%M:%S'
> +#log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'
> +
> +# The format of the console logging messages. Allowed formatting options can
> +# be seen here: http://docs.python.org/library/logging.html#logrecord-attributes
> +#log_fmt_console: '[%(levelname)-8s] %(message)s'
> +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s'
> +
> +# This can be used to control logging levels more specificically.  This
> +# example sets the main salt library at the 'warning' level, but sets
> +# 'salt.modules' to log at the 'debug' level:
> +#   log_granular_levels:
> +#     'salt': 'warning',
> +#     'salt.modules': 'debug'
> +#
> +#log_granular_levels: {}
> +
> +
> +#####         Node Groups           #####
> +##########################################
> +# Node groups allow for logical groupings of minion nodes.
> +# A group consists of a group name and a compound target.
> +#
> +#nodegroups:
> +#  group1: 'L at foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com'
> +#  group2: 'G at os:Debian and foo.domain.com'
> +
> +
> +#####     Range Cluster settings     #####
> +##########################################
> +# The range server (and optional port) that serves your cluster information
> +# https://github.com/grierj/range/wiki/Introduction-to-Range-with-YAML-files
> +#
> +#range_server: range:80
> +
> +
> +#####     Windows Software Repo settings #####
> +##############################################
> +# Location of the repo on the master
> +#win_repo: '/srv/salt/win/repo'
> +
> +# Location of the master's repo cache file
> +#win_repo_mastercachefile: '/srv/salt/win/repo/winrepo.p'
> +
> +# List of git repositories to include with the local repo
> +#win_gitrepos:
> +#  - 'https://github.com/saltstack/salt-winrepo.git'
> diff --git a/meta-openstack/recipes-support/salt/files/minion b/meta-openstack/recipes-support/salt/files/minion
> new file mode 100644
> index 0000000..8fdde14
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/minion
> @@ -0,0 +1,494 @@
> +##### Primary configuration settings #####
> +##########################################
> +
> +# Per default the minion will automatically include all config files
> +# from minion.d/*.conf (minion.d is a directory in the same directory
> +# as the main minion config file).
> +#default_include: minion.d/*.conf
> +
> +# Set the location of the salt master server, if the master server cannot be
> +# resolved, then the minion will fail to start.
> +#master: salt
> +
> +# Set whether the minion should connect to the master via IPv6
> +#ipv6: False
> +
> +# Set the number of seconds to wait before attempting to resolve
> +# the master hostname if name resolution fails. Defaults to 30 seconds.
> +# Set to zero if the minion should shutdown and not retry.
> +# retry_dns: 30
> +
> +# Set the port used by the master reply and authentication server
> +#master_port: 4506
> +
> +# The user to run salt
> +#user: root
> +
> +# Specify the location of the daemon process ID file
> +#pidfile: /var/run/salt-minion.pid
> +
> +# The root directory prepended to these options: pki_dir, cachedir, log_file,
> +# sock_dir, pidfile.
> +#root_dir: /
> +
> +# The directory to store the pki information in
> +#pki_dir: /etc/salt/pki/minion
> +
> +# Explicitly declare the id for this minion to use, if left commented the id
> +# will be the hostname as returned by the python call: socket.getfqdn()
> +# Since salt uses detached ids it is possible to run multiple minions on the
> +# same machine but with different ids, this can be useful for salt compute
> +# clusters.
> +#id:
> +
> +# Append a domain to a hostname in the event that it does not exist.  This is
> +# useful for systems where socket.getfqdn() does not actually result in a
> +# FQDN (for instance, Solaris).
> +#append_domain:
> +
> +# Custom static grains for this minion can be specified here and used in SLS
> +# files just like all other grains. This example sets 4 custom grains, with
> +# the 'roles' grain having two values that can be matched against:
> +#grains:
> +#  roles:
> +#    - webserver
> +#    - memcache
> +#  deployment: datacenter4
> +#  cabinet: 13
> +#  cab_u: 14-15
> +
> +# Where cache data goes
> +#cachedir: /var/cache/salt/minion
> +
> +# Verify and set permissions on configuration directories at startup
> +#verify_env: True
> +
> +# The minion can locally cache the return data from jobs sent to it, this
> +# can be a good way to keep track of jobs the minion has executed
> +# (on the minion side). By default this feature is disabled, to enable
> +# set cache_jobs to True
> +#cache_jobs: False
> +
> +# set the directory used to hold unix sockets
> +#sock_dir: /var/run/salt/minion
> +
> +# Set the default outputter used by the salt-call command. The default is
> +# "nested"
> +#output: nested
> +#
> +# By default output is colored, to disable colored output set the color value
> +# to False
> +#color: True
> +
> +# Backup files that are replaced by file.managed and file.recurse under
> +# 'cachedir'/file_backups relative to their original location and appended
> +# with a timestamp. The only valid setting is "minion". Disabled by default.
> +#
> +# Alternatively this can be specified for each file in state files:
> +#
> +# /etc/ssh/sshd_config:
> +#   file.managed:
> +#     - source: salt://ssh/sshd_config
> +#     - backup: minion
> +#
> +#backup_mode: minion
> +
> +# When waiting for a master to accept the minion's public key, salt will
> +# continuously attempt to reconnect until successful. This is the time, in
> +# seconds, between those reconnection attempts.
> +#acceptance_wait_time: 10
> +
> +# If this is nonzero, the time between reconnection attempts will increase by
> +# acceptance_wait_time seconds per iteration, up to this maximum. If this is
> +# set to zero, the time between reconnection attempts will stay constant.
> +#acceptance_wait_time_max: 0
> +
> +# When the master key changes, the minion will try to re-auth itself to receive
> +# the new master key. In larger environments this can cause a SYN flood on the
> +# master because all minions try to re-auth immediately. To prevent this and
> +# have a minion wait for a random amount of time, use this optional parameter.
> +# The wait-time will be a random number of seconds between
> +# 0 and the defined value.
> +#random_reauth_delay: 60
> +
> +
> +# If you don't have any problems with syn-floods, dont bother with the
> +# three recon_* settings described below, just leave the defaults!
> +#
> +# The ZeroMQ pull-socket that binds to the masters publishing interface tries
> +# to reconnect immediately, if the socket is disconnected (for example if
> +# the master processes are restarted). In large setups this will have all
> +# minions reconnect immediately which might flood the master (the ZeroMQ-default
> +# is usually a 100ms delay). To prevent this, these three recon_* settings
> +# can be used.
> +#
> +# recon_default: the interval in milliseconds that the socket should wait before
> +#                trying to reconnect to the master (100ms = 1 second)
> +#
> +# recon_max: the maximum time a socket should wait. each interval the time to wait
> +#            is calculated by doubling the previous time. if recon_max is reached,
> +#            it starts again at recon_default. Short example:
> +#
> +#            reconnect 1: the socket will wait 'recon_default' milliseconds
> +#            reconnect 2: 'recon_default' * 2
> +#            reconnect 3: ('recon_default' * 2) * 2
> +#            reconnect 4: value from previous interval * 2
> +#            reconnect 5: value from previous interval * 2
> +#            reconnect x: if value >= recon_max, it starts again with recon_default
> +#
> +# recon_randomize: generate a random wait time on minion start. The wait time will
> +#                  be a random value between recon_default and recon_default +
> +#                  recon_max. Having all minions reconnect with the same recon_default
> +#                  and recon_max value kind of defeats the purpose of being able to
> +#                  change these settings. If all minions have the same values and your
> +#                  setup is quite large (several thousand minions), they will still
> +#                  flood the master. The desired behaviour is to have timeframe within
> +#                  all minions try to reconnect.
> +
> +# Example on how to use these settings:
> +# The goal: have all minions reconnect within a 60 second timeframe on a disconnect
> +#
> +# The settings:
> +#recon_default: 1000
> +#recon_max: 59000
> +#recon_randomize: True
> +#
> +# Each minion will have a randomized reconnect value between 'recon_default'
> +# and 'recon_default + recon_max', which in this example means between 1000ms
> +# 60000ms (or between 1 and 60 seconds). The generated random-value will be
> +# doubled after each attempt to reconnect. Lets say the generated random
> +# value is 11 seconds (or 11000ms).
> +#
> +# reconnect 1: wait 11 seconds
> +# reconnect 2: wait 22 seconds
> +# reconnect 3: wait 33 seconds
> +# reconnect 4: wait 44 seconds
> +# reconnect 5: wait 55 seconds
> +# reconnect 6: wait time is bigger than 60 seconds (recon_default + recon_max)
> +# reconnect 7: wait 11 seconds
> +# reconnect 8: wait 22 seconds
> +# reconnect 9: wait 33 seconds
> +# reconnect x: etc.
> +#
> +# In a setup with ~6000 thousand hosts these settings would average the reconnects
> +# to about 100 per second and all hosts would be reconnected within 60 seconds.
> +#recon_default: 100
> +#recon_max: 5000
> +#recon_randomize: False
> +
> +# The loop_interval sets how long in seconds the minion will wait between
> +# evaluating the scheduler and running cleanup tasks. This defaults to a
> +# sane 60 seconds, but if the minion scheduler needs to be evaluated more
> +# often lower this value
> +#loop_interval: 60
> +
> +# When healing, a dns_check is run. This is to make sure that the originally
> +# resolved dns has not changed. If this is something that does not happen in
> +# your environment, set this value to False.
> +#dns_check: True
> +
> +# Windows platforms lack posix IPC and must rely on slower TCP based inter-
> +# process communications. Set ipc_mode to 'tcp' on such systems
> +#ipc_mode: ipc
> +#
> +# Overwrite the default tcp ports used by the minion when in tcp mode
> +#tcp_pub_port: 4510
> +#tcp_pull_port: 4511
> +
> +# The minion can include configuration from other files. To enable this,
> +# pass a list of paths to this option. The paths can be either relative or
> +# absolute; if relative, they are considered to be relative to the directory
> +# the main minion configuration file lives in (this file). Paths can make use
> +# of shell-style globbing. If no files are matched by a path passed to this
> +# option then the minion will log a warning message.
> +#
> +#
> +# Include a config file from some other path:
> +# include: /etc/salt/extra_config
> +#
> +# Include config from several files and directories:
> +#include:
> +#  - /etc/salt/extra_config
> +#  - /etc/roles/webserver
> +
> +#####   Minion module management     #####
> +##########################################
> +# Disable specific modules. This allows the admin to limit the level of
> +# access the master has to the minion
> +#disable_modules: [cmd,test]
> +#disable_returners: []
> +#
> +# Modules can be loaded from arbitrary paths. This enables the easy deployment
> +# of third party modules. Modules for returners and minions can be loaded.
> +# Specify a list of extra directories to search for minion modules and
> +# returners. These paths must be fully qualified!
> +#module_dirs: []
> +#returner_dirs: []
> +#states_dirs: []
> +#render_dirs: []
> +#
> +# A module provider can be statically overwritten or extended for the minion
> +# via the providers option, in this case the default module will be
> +# overwritten by the specified module. In this example the pkg module will
> +# be provided by the yumpkg5 module instead of the system default.
> +#
> +#providers:
> +#  pkg: yumpkg5
> +#
> +# Enable Cython modules searching and loading. (Default: False)
> +#cython_enable: False
> +#
> +
> +#####    State Management Settings    #####
> +###########################################
> +# The state management system executes all of the state templates on the minion
> +# to enable more granular control of system state management. The type of
> +# template and serialization used for state management needs to be configured
> +# on the minion, the default renderer is yaml_jinja. This is a yaml file
> +# rendered from a jinja template, the available options are:
> +# yaml_jinja
> +# yaml_mako
> +# yaml_wempy
> +# json_jinja
> +# json_mako
> +# json_wempy
> +#
> +#renderer: yaml_jinja
> +#
> +# The failhard option tells the minions to stop immediately after the first
> +# failure detected in the state execution, defaults to False
> +#failhard: False
> +#
> +# autoload_dynamic_modules Turns on automatic loading of modules found in the
> +# environments on the master. This is turned on by default, to turn of
> +# autoloading modules when states run set this value to False
> +#autoload_dynamic_modules: True
> +#
> +# clean_dynamic_modules keeps the dynamic modules on the minion in sync with
> +# the dynamic modules on the master, this means that if a dynamic module is
> +# not on the master it will be deleted from the minion. By default this is
> +# enabled and can be disabled by changing this value to False
> +#clean_dynamic_modules: True
> +#
> +# Normally the minion is not isolated to any single environment on the master
> +# when running states, but the environment can be isolated on the minion side
> +# by statically setting it. Remember that the recommended way to manage
> +# environments is to isolate via the top file.
> +#environment: None
> +#
> +# If using the local file directory, then the state top file name needs to be
> +# defined, by default this is top.sls.
> +#state_top: top.sls
> +#
> +# Run states when the minion daemon starts. To enable, set startup_states to:
> +# 'highstate' -- Execute state.highstate
> +# 'sls' -- Read in the sls_list option and execute the named sls files
> +# 'top' -- Read top_file option and execute based on that file on the Master
> +#startup_states: ''
> +#
> +# list of states to run when the minion starts up if startup_states is 'sls'
> +#sls_list:
> +#  - edit.vim
> +#  - hyper
> +#
> +# top file to execute if startup_states is 'top'
> +#top_file: ''
> +
> +#####     File Directory Settings    #####
> +##########################################
> +# The Salt Minion can redirect all file server operations to a local directory,
> +# this allows for the same state tree that is on the master to be used if
> +# copied completely onto the minion. This is a literal copy of the settings on
> +# the master but used to reference a local directory on the minion.
> +
> +# Set the file client. The client defaults to looking on the master server for
> +# files, but can be directed to look at the local file directory setting
> +# defined below by setting it to local.
> +#file_client: remote
> +
> +# The file directory works on environments passed to the minion, each environment
> +# can have multiple root directories, the subdirectories in the multiple file
> +# roots cannot match, otherwise the downloaded files will not be able to be
> +# reliably ensured. A base environment is required to house the top file.
> +# Example:
> +# file_roots:
> +#   base:
> +#     - /srv/salt/
> +#   dev:
> +#     - /srv/salt/dev/services
> +#     - /srv/salt/dev/states
> +#   prod:
> +#     - /srv/salt/prod/services
> +#     - /srv/salt/prod/states
> +#
> +#file_roots:
> +#  base:
> +#    - /srv/salt
> +
> +# By default, the Salt fileserver recurses fully into all defined environments
> +# to attempt to find files. To limit this behavior so that the fileserver only
> +# traverses directories with SLS files and special Salt directories like _modules,
> +# enable the option below. This might be useful for installations where a file root
> +# has a very large number of files and performance is negatively impacted.
> +#
> +# Default is False.
> +#
> +# fileserver_limit_traversal: False
> +
> +# The hash_type is the hash to use when discovering the hash of a file in
> +# the local fileserver. The default is md5, but sha1, sha224, sha256, sha384
> +# and sha512 are also supported.
> +#hash_type: md5
> +
> +# The Salt pillar is searched for locally if file_client is set to local. If
> +# this is the case, and pillar data is defined, then the pillar_roots need to
> +# also be configured on the minion:
> +#pillar_roots:
> +#  base:
> +#    - /srv/pillar
> +
> +######        Security settings       #####
> +###########################################
> +# Enable "open mode", this mode still maintains encryption, but turns off
> +# authentication, this is only intended for highly secure environments or for
> +# the situation where your keys end up in a bad state. If you run in open mode
> +# you do so at your own risk!
> +#open_mode: False
> +
> +# Enable permissive access to the salt keys.  This allows you to run the
> +# master or minion as root, but have a non-root group be given access to
> +# your pki_dir.  To make the access explicit, root must belong to the group
> +# you've given access to. This is potentially quite insecure.
> +#permissive_pki_access: False
> +
> +# The state_verbose and state_output settings can be used to change the way
> +# state system data is printed to the display. By default all data is printed.
> +# The state_verbose setting can be set to True or False, when set to False
> +# all data that has a result of True and no changes will be suppressed.
> +#state_verbose: True
> +#
> +# The state_output setting changes if the output is the full multi line
> +# output for each changed state if set to 'full', but if set to 'terse'
> +# the output will be shortened to a single line.
> +#state_output: full
> +#
> +# Fingerprint of the master public key to double verify the master is valid,
> +# the master fingerprint can be found by running "salt-key -F master" on the
> +# salt master.
> +#master_finger: ''
> +
> +######         Thread settings        #####
> +###########################################
> +# Disable multiprocessing support, by default when a minion receives a
> +# publication a new process is spawned and the command is executed therein.
> +#multiprocessing: True
> +
> +#####         Logging settings       #####
> +##########################################
> +# The location of the minion log file
> +# The minion log can be sent to a regular file, local path name, or network
> +# location. Remote logging works best when configured to use rsyslogd(8) (e.g.:
> +# ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI
> +# format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility>
> +#log_file: /var/log/salt/minion
> +#log_file: file:///dev/log
> +#log_file: udp://loghost:10514
> +#
> +#log_file: /var/log/salt/minion
> +#key_logfile: /var/log/salt/key
> +#
> +# The level of messages to send to the console.
> +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
> +# Default: 'warning'
> +#log_level: warning
> +#
> +# The level of messages to send to the log file.
> +# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
> +# Default: 'warning'
> +#log_level_logfile:
> +
> +# The date and time format used in log messages. Allowed date/time formating
> +# can be seen here: http://docs.python.org/library/time.html#time.strftime
> +#log_datefmt: '%H:%M:%S'
> +#log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'
> +#
> +# The format of the console logging messages. Allowed formatting options can
> +# be seen here: http://docs.python.org/library/logging.html#logrecord-attributes
> +#log_fmt_console: '[%(levelname)-8s] %(message)s'
> +#log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s'
> +#
> +# This can be used to control logging levels more specificically.  This
> +# example sets the main salt library at the 'warning' level, but sets
> +# 'salt.modules' to log at the 'debug' level:
> +#   log_granular_levels:
> +#     'salt': 'warning',
> +#     'salt.modules': 'debug'
> +#
> +#log_granular_levels: {}
> +
> +######      Module configuration      #####
> +###########################################
> +# Salt allows for modules to be passed arbitrary configuration data, any data
> +# passed here in valid yaml format will be passed on to the salt minion modules
> +# for use. It is STRONGLY recommended that a naming convention be used in which
> +# the module name is followed by a . and then the value. Also, all top level
> +# data must be applied via the yaml dict construct, some examples:
> +#
> +# You can specify that all modules should run in test mode:
> +#test: True
> +#
> +# A simple value for the test module:
> +#test.foo: foo
> +#
> +# A list for the test module:
> +#test.bar: [baz,quo]
> +#
> +# A dict for the test module:
> +#test.baz: {spam: sausage, cheese: bread}
> +
> +
> +######      Update settings          ######
> +###########################################
> +# Using the features in Esky, a salt minion can both run as a frozen app and
> +# be updated on the fly. These options control how the update process
> +# (saltutil.update()) behaves.
> +#
> +# The url for finding and downloading updates. Disabled by default.
> +#update_url: False
> +#
> +# The list of services to restart after a successful update. Empty by default.
> +#update_restart_services: []
> +
> +
> +######      Keepalive settings        ######
> +############################################
> +# ZeroMQ now includes support for configuring SO_KEEPALIVE if supported by
> +# the OS. If connections between the minion and the master pass through
> +# a state tracking device such as a firewall or VPN gateway, there is
> +# the risk that it could tear down the connection the master and minion
> +# without informing either party that their connection has been taken away.
> +# Enabling TCP Keepalives prevents this from happening.
> +#
> +# Overall state of TCP Keepalives, enable (1 or True), disable (0 or False)
> +# or leave to the OS defaults (-1), on Linux, typically disabled. Default True, enabled.
> +#tcp_keepalive: True
> +#
> +# How long before the first keepalive should be sent in seconds. Default 300
> +# to send the first keepalive after 5 minutes, OS default (-1) is typically 7200 seconds
> +# on Linux see /proc/sys/net/ipv4/tcp_keepalive_time.
> +#tcp_keepalive_idle: 300
> +#
> +# How many lost probes are needed to consider the connection lost. Default -1
> +# to use OS defaults, typically 9 on Linux, see /proc/sys/net/ipv4/tcp_keepalive_probes.
> +#tcp_keepalive_cnt: -1
> +#
> +# How often, in seconds, to send keepalives after the first one. Default -1 to
> +# use OS defaults, typically 75 seconds on Linux, see
> +# /proc/sys/net/ipv4/tcp_keepalive_intvl.
> +#tcp_keepalive_intvl: -1
> +
> +
> +######      Windows Software settings ######
> +############################################
> +# Location of the repository cache file on the master
> +#win_repo_cachefile: 'salt://win/repo/winrepo.p'
> diff --git a/meta-openstack/recipes-support/salt/files/roster b/meta-openstack/recipes-support/salt/files/roster
> new file mode 100644
> index 0000000..3eac2fa
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/roster
> @@ -0,0 +1,8 @@
> +# Sample salt-ssh config file
> +#web1:
> +#  host: 192.168.42.1 # The IP addr or DNS hostname
> +#  user: fred         # Remote executions will be executed as user fred
> +#  passwd: foobarbaz  # The password to use for login, if omitted, keys are used
> +#  sudo: True         # Whether to sudo to root, not enabled by default
> +#web2:
> +#  host: 192.168.42.2
> diff --git a/meta-openstack/recipes-support/salt/files/salt-api b/meta-openstack/recipes-support/salt/files/salt-api
> new file mode 100755
> index 0000000..4b45bd2
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/salt-api
> @@ -0,0 +1,110 @@
> +#!/bin/sh
> +### BEGIN INIT INFO
> +# Provides:          salt-api
> +# Required-Start:    $remote_fs $network
> +# Required-Stop:     $remote_fs $network
> +# Default-Start:     2 3 4 5
> +# Default-Stop:      0 1 6
> +# Short-Description: salt api control daemon
> +# Description:       This is a daemon that exposes an external API
> +### END INIT INFO
> +
> +# Author: Michael Prokop <mika at debian.org>
> +
> +PATH=/sbin:/usr/sbin:/bin:/usr/bin
> +DESC="salt api control daemon"
> +NAME=salt-api
> +DAEMON=/usr/bin/salt-api
> +DAEMON_ARGS="-d"
> +PIDFILE=/var/run/$NAME.pid
> +SCRIPTNAME=/etc/init.d/$NAME
> +
> +# Exit if the package is not installed
> +[ -x "$DAEMON" ] || exit 0
> +
> +# Read configuration variable file if it is present
> +[ -r /etc/default/$NAME ] && . /etc/default/$NAME
> +
> +# Source function library.
> +. /etc/init.d/functions
> +
> +do_start() {
> +    # Return
> +    #   0 if daemon has been started
> +    #   1 if daemon was already running
> +    #   2 if daemon could not be started
> +    pid=$(pidof -x $DAEMON)
> +    if [ -n "$pid" ] ; then
> +        return 1
> +    fi
> +
> +    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS \
> +            || return 2
> +}
> +
> +do_stop() {
> +    # Return
> +    #   0 if daemon has been stopped
> +    #   1 if daemon was already stopped
> +    #   2 if daemon could not be stopped
> +    #   other if a failure occ
> +    start-stop-daemon --stop --retry=TERM/30/KILL/5 --quiet --pidfile $PIDFILE --name $NAME
> +    RETVAL=$?
> +    [ "$RETVAL" = 2 ] && return 2
> +    rm -f $PIDFILE
> +    return "$RETVAL"
> +}
> +
> +case "$1" in
> +    start)
> +        [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME"
> +        do_start
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    stop)
> +        [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    status)
> +        pid=`pidof -x $DAEMON`
> +        if [ -n "$pid" ]; then
> +            echo "$NAME (pid $pid) is running ..."
> +        else
> +            echo "$NAME is stopped"
> +        fi
> +       ;;
> +    #reload)
> +        # not implemented
> +        #;;
> +    restart|force-reload)
> +        echo "Restarting $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +          0|1)
> +              do_start
> +              case "$?" in
> +                  0) echo OK ;;
> +                  1) echo FAILED ;; # Old process is still running
> +                  *) echo FAILED ;; # Failed to start
> +              esac
> +              ;;
> +          *)
> +              # Failed to stop
> +              echo FAILED
> +              ;;
> +        esac
> +        ;;
> +    *)
> +        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
> +        exit 3
> +        ;;
> +esac
> +
> +exit 0
> diff --git a/meta-openstack/recipes-support/salt/files/salt-common.bash_completion b/meta-openstack/recipes-support/salt/files/salt-common.bash_completion
> new file mode 100644
> index 0000000..a457f4d
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/salt-common.bash_completion
> @@ -0,0 +1,332 @@
> +# written by David Pravec
> +#   - feel free to /msg alekibango on IRC if you want to talk about this file
> +
> +# TODO: check if --config|-c was used and use configured config file for queries
> +# TODO: solve somehow completion for  salt -G pythonversion:[tab]
> +#       (not sure what to do with lists)
> +# TODO: --range[tab] --   how?
> +# TODO: -E --exsel[tab] -- how?
> +# TODO: --compound[tab] -- how?
> +# TODO: use history to extract some words, esp. if ${cur} is empty
> +# TODO: TEST EVERYTING a lot
> +# TODO: cache results of some functions?  where? how long?
> +# TODO: is it ok to use '--timeout 2' ?
> +
> +
> +_salt_get_grains(){
> +    if [ "$1" = 'local' ] ; then
> +        salt-call --out=txt -- grains.ls | sed  's/^.*\[//' | tr -d ",']" |sed 's:\([a-z0-9]\) :\1\: :g'
> +    else
> +      salt '*' --timeout 2 --out=txt -- grains.ls | sed  's/^.*\[//' | tr -d ",']" |sed 's:\([a-z0-9]\) :\1\: :g'
> +    fi
> +}
> +
> +_salt_get_grain_values(){
> +    if [ "$1" = 'local' ] ; then
> +        salt-call --out=txt -- grains.item $1 |sed 's/^\S*:\s//' |grep -v '^\s*$'
> +    else
> +        salt '*' --timeout 2 --out=txt -- grains.item $1 |sed 's/^\S*:\s//' |grep -v '^\s*$'
> +    fi
> +}
> +
> +
> +_salt(){
> +    local cur prev opts _salt_grains _salt_coms pprev ppprev
> +    COMPREPLY=()
> +    cur="${COMP_WORDS[COMP_CWORD]}"
> +    prev="${COMP_WORDS[COMP_CWORD-1]}"
> +    if [ ${COMP_CWORD} -gt 2 ]; then
> +       pprev="${COMP_WORDS[COMP_CWORD-2]}"
> +    fi
> +    if [ ${COMP_CWORD} -gt 3 ]; then
> +       ppprev="${COMP_WORDS[COMP_CWORD-3]}"
> +    fi
> +
> +    opts="-h --help -d --doc --documentation --version --versions-report -c \
> +          --config-dir= -v --verbose -t --timeout= -s --static -b --batch= \
> +          --batch-size= -E --pcre -L --list -G --grain --grain-pcre -N \
> +          --nodegroup -R --range -C --compound -X --exsel -I --pillar \
> +          --return= -a --auth= --eauth= --extended-auth= -T --make-token -S \
> +          --ipcidr --out=pprint --out=yaml --out=overstatestage --out=json \
> +          --out=raw --out=highstate --out=key --out=txt --no-color --out-indent= "
> +
> +    if [[ "${cur}" == -* ]] ; then
> +        COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
> +        return 0
> +    fi
> +
> +    # 2 special cases for filling up grain values
> +    case "${pprev}" in
> +    -G|--grain|--grain-pcre)
> +    if [ "${cur}" = ":" ]; then
> +        COMPREPLY=($(compgen -W "`_salt_get_grain_values ${prev}`"  ))
> +        return 0
> +    fi
> +    ;;
> +    esac
> +    case "${ppprev}" in
> +    -G|--grain|--grain-pcre)
> +        if [ "${prev}" = ":" ]; then
> +        COMPREPLY=( $(compgen -W "`_salt_get_grain_values ${pprev}`" -- ${cur}) )
> +        return 0
> +        fi
> +    ;;
> +    esac
> +
> +    if [ "${cur}" = "=" ] && [[ "${prev}" == --* ]]; then
> +       cur=""
> +    fi
> +    if [ "${prev}" = "=" ] && [[ "${pprev}" == --* ]]; then
> +       prev="${pprev}"
> +    fi
> +
> +   case "${prev}" in
> +
> +     -c|--config)
> +        COMPREPLY=($(compgen -f -- ${cur}))
> +        return 0
> +        ;;
> +     salt)
> +        COMPREPLY=($(compgen -W "\'*\' ${opts} `salt-key --no-color -l acc`" -- ${cur}))
> +        return 0
> +        ;;
> +     -E|--pcre)
> +        COMPREPLY=($(compgen -W "`salt-key --no-color -l acc`" -- ${cur}))
> +        return 0
> +        ;;
> +     -G|--grain|--grain-pcre)
> +        COMPREPLY=($(compgen -W "$(_salt_get_grains)" -- ${cur}))
> +        return 0
> +       ;;
> +     -C|--compound)
> +        COMPREPLY=() # TODO: finish this one? how?
> +        return 0
> +        ;;
> +     -t|--timeout)
> +        COMPREPLY=($( compgen -W "1 2 3 4 5 6 7 8 9 10 15 20 30 40 60 90 120 180" -- ${cur}))
> +        return 0
> +        ;;
> +     -b|--batch|--batch-size)
> +        COMPREPLY=($(compgen -W "1 2 3 4 5 6 7 8 9 10 15 20 30 40 50 60 70 80 90 100 120 150 200"))
> +        return 0
> +        ;;
> +     -X|--exsel) # TODO: finish this one? how?
> +        return 0
> +        ;;
> +     -N|--nodegroup)
> +           MASTER_CONFIG='/etc/salt/master'
> +        COMPREPLY=($(compgen -W "`awk -F ':'  'BEGIN {print_line = 0};  /^nodegroups/ {print_line = 1;getline } print_line && /^  */ {print $1} /^[^ ]/ {print_line = 0}' <${MASTER_CONFIG}`" -- ${cur}))
> +        return 0
> +     ;;
> +    esac
> +
> +    _salt_coms="$(salt '*' --timeout 2 --out=txt -- sys.list_functions | sed 's/^.*\[//' | tr -d ",']" )"
> +    all="${opts} ${_salt_coms}"
> +    COMPREPLY=( $(compgen -W "${all}" -- ${cur}) )
> +
> +  return 0
> +}
> +
> +complete -F _salt salt
> +
> +
> +_saltkey(){
> +    local cur prev opts prev pprev
> +    COMPREPLY=()
> +    cur="${COMP_WORDS[COMP_CWORD]}"
> +    prev="${COMP_WORDS[COMP_CWORD-1]}"
> +    opts="-c --config-dir= -h --help --version --versions-report -q --quiet \
> +          -y --yes --gen-keys= --gen-keys-dir= --keysize= --key-logfile= \
> +          -l --list= -L --list-all -a --accept= -A --accept-all \
> +          -r --reject= -R --reject-all -p --print= -P --print-all \
> +          -d --delete= -D --delete-all -f --finger= -F --finger-all \
> +          --out=pprint --out=yaml --out=overstatestage --out=json --out=raw \
> +          --out=highstate --out=key --out=txt --no-color --out-indent= "
> +    if [ ${COMP_CWORD} -gt 2 ]; then
> +        pprev="${COMP_WORDS[COMP_CWORD-2]}"
> +    fi
> +    if [ ${COMP_CWORD} -gt 3 ]; then
> +        ppprev="${COMP_WORDS[COMP_CWORD-3]}"
> +    fi
> +    if [[ "${cur}" == -* ]] ; then
> +        COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
> +        return 0
> +    fi
> +
> +    if [ "${cur}" = "=" ] && [[ "${prev}" == --* ]]; then
> +       cur=""
> +    fi
> +    if [ "${prev}" = "=" ] && [[ "${pprev}" == --* ]]; then
> +       prev="${pprev}"
> +    fi
> +
> +    case "${prev}" in
> +     -a|--accept)
> +        COMPREPLY=($(compgen -W "$(salt-key -l un --no-color; salt-key -l rej --no-color)" -- ${cur}))
> +        return 0
> +      ;;
> +     -r|--reject)
> +        COMPREPLY=($(compgen -W "$(salt-key -l acc --no-color)" -- ${cur}))
> +        return 0
> +        ;;
> +     -d|--delete)
> +        COMPREPLY=($(compgen -W "$(salt-key -l acc --no-color; salt-key -l un --no-color; salt-key -l rej --no-color)" -- ${cur}))
> +        return 0
> +        ;;
> +     -c|--config)
> +        COMPREPLY=($(compgen -f -- ${cur}))
> +        return 0
> +        ;;
> +     --keysize)
> +        COMPREPLY=($(compgen -W "2048 3072 4096 5120 6144" -- ${cur}))
> +        return 0
> +        ;;
> +     --gen-keys)
> +        return 0
> +        ;;
> +     --gen-keys-dir)
> +        COMPREPLY=($(compgen -d -- ${cur}))
> +        return 0
> +        ;;
> +     -p|--print)
> +        COMPREPLY=($(compgen -W "$(salt-key -l acc --no-color; salt-key -l un --no-color; salt-key -l rej --no-color)" -- ${cur}))
> +        return 0
> +     ;;
> +     -l|--list)
> +        COMPREPLY=($(compgen -W "pre un acc accepted unaccepted rej rejected all" -- ${cur}))
> +        return 0
> +     ;;
> +     --accept-all)
> +       return 0
> +     ;;
> +    esac
> +    COMPREPLY=($(compgen -W "${opts} " -- ${cur}))
> +    return 0
> +}
> +
> +complete -F _saltkey salt-key
> +
> +_saltcall(){
> +    local cur prev opts _salt_coms pprev ppprev
> +    COMPREPLY=()
> +    cur="${COMP_WORDS[COMP_CWORD]}"
> +    prev="${COMP_WORDS[COMP_CWORD-1]}"
> +    opts="-h --help -d --doc --documentation --version --versions-report \
> +          -m --module-dirs= -g --grains --return= --local -c --config-dir= -l --log-level= \
> +          --out=pprint --out=yaml --out=overstatestage --out=json --out=raw \
> +          --out=highstate --out=key --out=txt --no-color --out-indent= "
> +    if [ ${COMP_CWORD} -gt 2 ]; then
> +        pprev="${COMP_WORDS[COMP_CWORD-2]}"
> +    fi
> +    if [ ${COMP_CWORD} -gt 3 ]; then
> +        ppprev="${COMP_WORDS[COMP_CWORD-3]}"
> +    fi
> +    if [[ "${cur}" == -* ]] ; then
> +        COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
> +        return 0
> +    fi
> +
> +    if [ "${cur}" = "=" ] && [[ ${prev} == --* ]]; then
> +       cur=""
> +    fi
> +    if [ "${prev}" = "=" ] && [[ ${pprev} == --* ]]; then
> +       prev="${pprev}"
> +    fi
> +
> +    case ${prev} in
> +        -m|--module-dirs)
> +                COMPREPLY=( $(compgen -d ${cur} ))
> +               return 0
> +               ;;
> +       -l|--log-level)
> +               COMPREPLY=( $(compgen -W "info none garbage trace warning error debug" -- ${cur}))
> +               return 0
> +               ;;
> +       -g|grains)
> +                return 0
> +               ;;
> +       salt-call)
> +                COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
> +               return 0
> +               ;;
> +    esac
> +
> +    _salt_coms="$(salt-call --out=txt -- sys.list_functions|sed 's/^.*\[//' | tr -d ",']"  )"
> +    COMPREPLY=( $(compgen -W "${opts} ${_salt_coms}" -- ${cur} ))
> +    return 0
> +}
> +
> +complete -F _saltcall salt-call
> +
> +
> +_saltcp(){
> +    local cur prev opts target prefpart postpart helper filt pprev ppprev
> +    COMPREPLY=()
> +    cur="${COMP_WORDS[COMP_CWORD]}"
> +    prev="${COMP_WORDS[COMP_CWORD-1]}"
> +    opts="-t --timeout= -s --static -b --batch= --batch-size= \
> +          -h --help --version --versions-report -c --config-dir= \
> +          -E --pcre -L --list -G --grain --grain-pcre -N --nodegroup \
> +          -R --range -C --compound -X --exsel -I --pillar \
> +          --out=pprint --out=yaml --out=overstatestage --out=json --out=raw \
> +          --out=highstate --out=key --out=txt --no-color --out-indent= "
> +    if [[ "${cur}" == -* ]] ; then
> +        COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
> +        return 0
> +    fi
> +
> +    if [ "${cur}" = "=" ] && [[ "${prev}" == --* ]]; then
> +       cur=""
> +    fi
> +    if [ "${prev}" = "=" ] && [[ "${pprev}" == --* ]]; then
> +       prev=${pprev}
> +    fi
> +
> +    case ${prev} in
> +       salt-cp)
> +           COMPREPLY=($(compgen -W "${opts} `salt-key -l acc --no-color`" -- ${cur}))
> +           return 0
> +       ;;
> +        -t|--timeout)
> +           # those numbers are just a hint
> +            COMPREPLY=($(compgen -W "2 3 4 8 10 15 20 25 30 40 60 90 120 180 240 300" -- ${cur} ))
> +           return 0
> +        ;;
> +       -E|--pcre)
> +            COMPREPLY=($(compgen -W "`salt-key -l acc --no-color`" -- ${cur}))
> +            return 0
> +       ;;
> +       -L|--list)
> +           # IMPROVEMENTS ARE WELCOME
> +           prefpart="${cur%,*},"
> +           postpart=${cur##*,}
> +           filt="^\($(echo ${cur}| sed 's:,:\\|:g')\)$"
> +            helper=($(salt-key -l acc --no-color | grep -v "${filt}" | sed "s/^/${prefpart}/"))
> +           COMPREPLY=($(compgen -W "${helper[*]}" -- ${cur}))
> +
> +           return 0
> +       ;;
> +       -G|--grain|--grain-pcre)
> +            COMPREPLY=($(compgen -W "$(_salt_get_grains)" -- ${cur}))
> +            return 0
> +           ;;
> +           # FIXME
> +       -R|--range)
> +           # FIXME ??
> +           return 0
> +       ;;
> +       -C|--compound)
> +           # FIXME ??
> +           return 0
> +       ;;
> +       -c|--config)
> +           COMPREPLY=($(compgen -f -- ${cur}))
> +           return 0
> +       ;;
> +    esac
> +
> +   # default is using opts:
> +   COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
> +}
> +
> +complete -F _saltcp salt-cp
> diff --git a/meta-openstack/recipes-support/salt/files/salt-common.logrotate b/meta-openstack/recipes-support/salt/files/salt-common.logrotate
> new file mode 100644
> index 0000000..dcfd268
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/salt-common.logrotate
> @@ -0,0 +1,10 @@
> +/var/log/salt/master
> +/var/log/salt/minion
> +/var/log/salt/*.log
> +{
> +       weekly
> +       missingok
> +       rotate 7
> +       compress
> +       notifempty
> +}
> diff --git a/meta-openstack/recipes-support/salt/files/salt-master b/meta-openstack/recipes-support/salt/files/salt-master
> new file mode 100755
> index 0000000..b534b36
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/salt-master
> @@ -0,0 +1,111 @@
> +#!/bin/sh
> +### BEGIN INIT INFO
> +# Provides:          salt-master
> +# Required-Start:    $remote_fs $network
> +# Required-Stop:     $remote_fs $network
> +# Default-Start:     2 3 4 5
> +# Default-Stop:      0 1 6
> +# Short-Description: salt master control daemon
> +# Description:       This is a daemon that controls the salt minions
> +### END INIT INFO
> +
> +# Author: Michael Prokop <mika at debian.org>
> +
> +PATH=/sbin:/usr/sbin:/bin:/usr/bin
> +DESC="salt master control daemon"
> +NAME=salt-master
> +DAEMON=/usr/bin/salt-master
> +DAEMON_ARGS="-d"
> +PIDFILE=/var/run/$NAME.pid
> +SCRIPTNAME=/etc/init.d/$NAME
> +
> +# Exit if the package is not installed
> +[ -x "$DAEMON" ] || exit 0
> +
> +# Read configuration variable file if it is present
> +[ -r /etc/default/$NAME ] && . /etc/default/$NAME
> +
> +# Source function library.
> +. /etc/init.d/functions
> +
> +do_start() {
> +    # Return
> +    #   0 if daemon has been started
> +    #   1 if daemon was already running
> +    #   2 if daemon could not be started
> +    pid=$(pidof -x  $DAEMON)
> +    if [ -n "$pid" ] ; then
> +        return 1
> +    fi
> +
> +    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
> +            $DAEMON_ARGS \
> +            || return 2
> +}
> +
> +do_stop() {
> +    # Return
> +    #   0 if daemon has been stopped
> +    #   1 if daemon was already stopped
> +    #   2 if daemon could not be stopped
> +    #   other if a failure occurred
> +    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
> +    RETVAL="$?"
> +    [ "$RETVAL" = 2 ] && return 2
> +    rm -f $PIDFILE
> +    return "$RETVAL"
> +}
> +
> +case "$1" in
> +    start)
> +        [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME"
> +        do_start
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    stop)
> +        [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    status)
> +        pid=`pidof -x $DAEMON`
> +        if [ -n "$pid" ]; then
> +           echo "$NAME (pid $pid) is running ..."
> +       else
> +           echo "$NAME is stopped"
> +       fi
> +        ;;
> +    #reload)
> +        # not implemented
> +        #;;
> +    restart|force-reload)
> +        echo "Restarting $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +          0|1)
> +              do_start
> +              case "$?" in
> +                  0) echo OK ;;
> +                  1) echo FAILED ;; # Old process is still running
> +                  *) echo FAILED ;; # Failed to start
> +              esac
> +              ;;
> +          *)
> +              # Failed to stop
> +              echo FAILED
> +              ;;
> +        esac
> +        ;;
> +    *)
> +        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
> +        exit 3
> +        ;;
> +esac
> +
> +exit 0
> diff --git a/meta-openstack/recipes-support/salt/files/salt-minion b/meta-openstack/recipes-support/salt/files/salt-minion
> new file mode 100755
> index 0000000..e062017
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/salt-minion
> @@ -0,0 +1,111 @@
> +#!/bin/sh
> +### BEGIN INIT INFO
> +# Provides:          salt-minion
> +# Required-Start:    $remote_fs $network
> +# Required-Stop:     $remote_fs $network
> +# Default-Start:     2 3 4 5
> +# Default-Stop:      0 1 6
> +# Short-Description: salt minion control daemon
> +# Description:       This is a daemon that receives commands from a salt-master
> +### END INIT INFO
> +
> +# Author: Michael Prokop <mika at debian.org>
> +
> +PATH=/sbin:/usr/sbin:/bin:/usr/bin
> +DESC="salt minion control daemon"
> +NAME=salt-minion
> +DAEMON=/usr/bin/salt-minion
> +DAEMON_ARGS="-d"
> +PIDFILE=/var/run/$NAME.pid
> +SCRIPTNAME=/etc/init.d/$NAME
> +
> +# Exit if the package is not installed
> +[ -x "$DAEMON" ] || exit 0
> +
> +# Read configuration variable file if it is present
> +[ -r /etc/default/$NAME ] && . /etc/default/$NAME
> +
> +# Source function library.
> +. /etc/init.d/functions
> +
> +do_start() {
> +    # Return
> +    #   0 if daemon has been started
> +    #   1 if daemon was already running
> +    #   2 if daemon could not be started
> +    pid=$(pidof -x $DAEMON)
> +    if [ -n "$pid" ] ; then
> +        return 1
> +    fi
> +
> +    start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON -- \
> +            $DAEMON_ARGS \
> +            || return 2
> +}
> +
> +do_stop() {
> +    # Return
> +    #   0 if daemon has been stopped
> +    #   1 if daemon was already stopped
> +    #   2 if daemon could not be stopped
> +    #   other if a failure occurred
> +    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
> +    RETVAL="$?"
> +    [ "$RETVAL" = 2 ] && return 2
> +    rm -f $PIDFILE
> +    return "$RETVAL"
> +}
> +
> +case "$1" in
> +    start)
> +        [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME"
> +        do_start
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    stop)
> +        [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    status)
> +        pid=`pidof -x $DAEMON`
> +       if [ -n "$pid" ]; then
> +               echo "$NAME (pid $pid) is running ..."
> +       else
> +               echo "$NAME is stopped"
> +       fi
> +       ;;
> +    #reload)
> +        # not implemented
> +        #;;
> +    restart|force-reload)
> +        echo "Restarting $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +          0|1)
> +              do_start
> +              case "$?" in
> +                  0) echo OK ;;
> +                  1) echo FAILED ;; # Old process is still running
> +                  *) echo FAILED ;; # Failed to start
> +              esac
> +              ;;
> +          *)
> +              # Failed to stop
> +              echo FAILED
> +              ;;
> +        esac
> +        ;;
> +    *)
> +        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
> +        exit 3
> +        ;;
> +esac
> +
> +exit 0
> diff --git a/meta-openstack/recipes-support/salt/files/salt-syndic b/meta-openstack/recipes-support/salt/files/salt-syndic
> new file mode 100755
> index 0000000..6d5cdff
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/files/salt-syndic
> @@ -0,0 +1,111 @@
> +#!/bin/sh
> +### BEGIN INIT INFO
> +# Provides:          salt-syndic
> +# Required-Start:    $remote_fs $network
> +# Required-Stop:     $remote_fs $network
> +# Default-Start:     2 3 4 5
> +# Default-Stop:      0 1 6
> +# Short-Description: salt syndic control daemon
> +# Description:       This is a daemon for the master of masters
> +### END INIT INFO
> +
> +# Author: Michael Prokop <mika at debian.org>
> +
> +PATH=/sbin:/usr/sbin:/bin:/usr/bin
> +DESC="salt syndic control daemon"
> +NAME=salt-syndic
> +DAEMON=/usr/bin/salt-syndic
> +DAEMON_ARGS="-d"
> +PIDFILE=/var/run/$NAME.pid
> +SCRIPTNAME=/etc/init.d/$NAME
> +
> +# Exit if the package is not installed
> +[ -x "$DAEMON" ] || exit 0
> +
> +# Read configuration variable file if it is present
> +[ -r /etc/default/$NAME ] && . /etc/default/$NAME
> +
> +# Source function library.
> +. /etc/init.d/functions
> +
> +do_start() {
> +    # Return
> +    #   0 if daemon has been started
> +    #   1 if daemon was already running
> +    #   2 if daemon could not be started
> +    pid=$(pidof -x $DAEMON)
> +    if [ -n "$pid" ] ; then
> +        return 1
> +    fi
> +
> +    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
> +            $DAEMON_ARGS \
> +            || return 2
> +}
> +
> +do_stop() {
> +    # Return
> +    #   0 if daemon has been stopped
> +    #   1 if daemon was already stopped
> +    #   2 if daemon could not be stopped
> +    #   other if a failure occurred
> +    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
> +    RETVAL="$?"
> +    [ "$RETVAL" = 2 ] && return 2
> +    rm -f $PIDFILE
> +    return "$RETVAL"
> +}
> +
> +case "$1" in
> +    start)
> +        [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME"
> +        do_start
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    stop)
> +        [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +            0|1) [ "$VERBOSE" != no ] && echo OK ;;
> +              2) [ "$VERBOSE" != no ] && echo FAILED ;;
> +        esac
> +        ;;
> +    status)
> +        pid=`pidof -x $DAEMON`
> +        if [ -n "$pid" ]; then
> +           echo "$NAME (pid $pid) is running ..."
> +       else
> +           echo "$NAME is stopped"
> +        fi
> +       ;;
> +    #reload)
> +        # not implemented
> +        #;;
> +    restart|force-reload)
> +        echo "Restarting $DESC" "$NAME"
> +        do_stop
> +        case "$?" in
> +          0|1)
> +              do_start
> +              case "$?" in
> +                  0) echo OK ;;
> +                  1) echo FAILED ;; # Old process is still running
> +                  *) echo FAILED ;; # Failed to start
> +              esac
> +              ;;
> +          *)
> +              # Failed to stop
> +              echo FAILED
> +              ;;
> +        esac
> +        ;;
> +    *)
> +        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
> +        exit 3
> +        ;;
> +esac
> +
> +exit 0
> diff --git a/meta-openstack/recipes-support/salt/salt/set_python_location_hashbang.patch b/meta-openstack/recipes-support/salt/salt/set_python_location_hashbang.patch
> new file mode 100644
> index 0000000..2369d4c
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/salt/set_python_location_hashbang.patch
> @@ -0,0 +1,107 @@
> +Upstream-Status: Pending
> +
> +# The Salt SysV scripts require that the process name of the salt
> +# components have the form "salt-<component>".
> +# The current python shebangs on the salt components scripts spwans
> +# processes that are generically named python. Changed shebang so
> +# process names will be identifiable by the init scripts.
> +
> +diff -Naur a/scripts/salt-api b/scripts/salt-api
> +--- a/scripts/salt-api 2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-api 2015-04-08 16:49:03.336483297 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> +
> + # Import salt libs
> + from salt.scripts import salt_api
> +diff -Naur a/scripts/salt-call b/scripts/salt-call
> +--- a/scripts/salt-call        2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-call        2015-04-08 16:49:11.360507977 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Directly call a salt command in the modules, does not require a running salt
> + minion to run.
> +diff -Naur a/scripts/salt-cloud b/scripts/salt-cloud
> +--- a/scripts/salt-cloud       2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-cloud       2015-04-08 16:49:20.612536436 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Publish commands to the salt system from the command line on the master.
> + '''
> +diff -Naur a/scripts/salt-cp b/scripts/salt-cp
> +--- a/scripts/salt-cp  2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-cp  2015-04-08 16:49:30.132565723 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Publish commands to the salt system from the command line on the master.
> + '''
> +diff -Naur a/scripts/salt-key b/scripts/salt-key
> +--- a/scripts/salt-key 2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-key 2015-04-08 16:49:39.912595801 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Manage the authentication keys with salt-key
> + '''
> +diff -Naur a/scripts/salt-master b/scripts/salt-master
> +--- a/scripts/salt-master      2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-master      2015-04-08 16:49:50.224627508 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Start the salt-master
> + '''
> +diff -Naur a/scripts/salt-minion b/scripts/salt-minion
> +--- a/scripts/salt-minion      2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-minion      2015-04-08 16:49:57.808650832 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + This script is used to kick off a salt minion daemon
> + '''
> +diff -Naur a/scripts/salt-run b/scripts/salt-run
> +--- a/scripts/salt-run 2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-run 2015-04-08 16:50:06.588677825 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Execute a salt convenience routine
> + '''
> +diff -Naur a/scripts/salt-ssh b/scripts/salt-ssh
> +--- a/scripts/salt-ssh 2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-ssh 2015-04-08 16:50:13.680699631 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + Execute the salt ssh system
> + '''
> +diff -Naur a/scripts/salt-syndic b/scripts/salt-syndic
> +--- a/scripts/salt-syndic      2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-syndic      2015-04-08 16:50:20.892721803 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python
> ++#!/usr/bin/python
> + '''
> + This script is used to kick off a salt syndic daemon
> + '''
> +diff -Naur a/scripts/salt-unity b/scripts/salt-unity
> +--- a/scripts/salt-unity       2015-04-08 16:48:01.912294278 -0500
> ++++ b/scripts/salt-unity       2015-04-08 16:50:35.968768142 -0500
> +@@ -1,4 +1,4 @@
> +-#!/usr/bin/env python2
> ++#!/usr/bin/python2
> +
> + # Import python libs
> + import sys
> diff --git a/meta-openstack/recipes-support/salt/salt_2014.7.4.bb b/meta-openstack/recipes-support/salt/salt_2014.7.4.bb
> new file mode 100644
> index 0000000..5b618e0
> --- /dev/null
> +++ b/meta-openstack/recipes-support/salt/salt_2014.7.4.bb
> @@ -0,0 +1,145 @@
> +HOMEPAGE = "http://saltstack.com/"
> +SECTION = "admin"
> +LICENSE = "Apache-2.0"
> +LIC_FILES_CHKSUM = "file://LICENSE;md5=5357642471cfab4740d1d0a20c51af6a"
> +DEPENDS = "\
> +           python-msgpack \
> +           python-pyyaml \
> +           python-jinja2 \
> +           python-markupsafe \
> +           python-requests \
> +           python-pyzmq \
> +           python-pycrypto \
> +           python-m2crypto \
> +"
> +
> +SRCNAME = "salt"
> +SRC_URI = "http://pypi.python.org/packages/source/s/${SRCNAME}/${SRCNAME}-${PV}.tar.gz \
> +           file://set_python_location_hashbang.patch \
> +           file://minion \
> +           file://salt-minion \
> +           file://salt-common.bash_completion \
> +           file://salt-common.logrotate \
> +           file://salt-api \
> +           file://salt-master \
> +           file://master \
> +           file://salt-syndic \
> +           file://cloud \
> +           file://roster \
> +"
> +
> +SRC_URI[md5sum] = "622404c0a6c38224f82a4c7b2927db61"
> +SRC_URI[sha256sum] = "0adf4c138ebd26745b1d1157be0772d89da3582fe8a6622a8031cbe32a28e9f3"
> +
> +S = "${WORKDIR}/${SRCNAME}-${PV}"
> +
> +inherit setuptools update-rc.d
> +
> +PACKAGES += "\
> +           ${PN}-api \
> +           ${PN}-cloud \
> +           ${PN}-common \
> +           ${PN}-master \
> +           ${PN}-minion \
> +           ${PN}-ssh \
> +           ${PN}-syndic \
> +           ${PN}-bash-completion \
> +"
> +
> +do_install_append() {
> +        install -d ${D}${sysconfdir}/bash_completion.d/
> +        install -m 0644 ${WORKDIR}/salt-common.bash_completion ${D}${sysconfdir}/bash_completion.d/${PN}-common
> +        install -d ${D}${sysconfdir}/logrotate.d/
> +        install -m 0644 ${WORKDIR}/salt-common.logrotate ${D}${sysconfdir}/logrotate.d/${PN}-common
> +        install -d ${D}${sysconfdir}/init.d/
> +        install -m 0755 ${WORKDIR}/salt-minion ${D}${sysconfdir}/init.d/${PN}-minion
> +        install -m 0755 ${WORKDIR}/salt-api ${D}${sysconfdir}/init.d/${PN}-api
> +        install -m 0755 ${WORKDIR}/salt-master ${D}${sysconfdir}/init.d/${PN}-master
> +        install -m 0755 ${WORKDIR}/salt-syndic ${D}${sysconfdir}/init.d/${PN}-syndic
> +        install -d ${D}${sysconfdir}/${PN}/
> +        install -m 0644 ${WORKDIR}/minion ${D}${sysconfdir}/${PN}/minion
> +        install -m 0644 ${WORKDIR}/master ${D}${sysconfdir}/${PN}/master
> +        install -m 0644 ${WORKDIR}/cloud ${D}${sysconfdir}/${PN}/cloud
> +        install -m 0644 ${WORKDIR}/roster ${D}${sysconfdir}/${PN}/roster
> +        install -d ${D}${sysconfdir}/${PN}/cloud.conf.d ${D}${sysconfdir}/${PN}/cloud.profiles.d ${D}${sysconfdir}/${PN}/cloud.providers.d
> +}
> +
> +ALLOW_EMPTY_${PN} = "1"
> +FILES_${PN} = ""
> +
> +INITSCRIPT_PACKAGES = "${PN}-minion ${PN}-api ${PN}-master ${PN}-syndic"
> +
> +DESCRIPTION_COMMON = "salt is a powerful remote execution manager that can be used to administer servers in a\
> + fast and efficient way. It allows commands to be executed across large groups of servers. This means systems\
> + can be easily managed, but data can also be easily gathered. Quick introspection into running systems becomes\
> + a reality. Remote execution is usually used to set up a certain state on a remote system. Salt addresses this\
> + problem as well, the salt state system uses salt state files to define the state a server needs to be in. \
> +Between the remote execution system, and state management Salt addresses the backbone of cloud and data center\
> + management."
> +
> +SUMMARY_${PN}-minion = "client package for salt, the distributed remote execution system"
> +DESCRIPTION_${PN}-minion = "${DESCRIPTION_COMMON} This particular package provides the worker agent for salt."
> +RDEPENDS_${PN}-minion = "python ${PN}-common (= ${EXTENDPKGV}) python-m2crypto python-pycrypto python-msgpack python-pyzmq (>= 13.1.0)"
> +RRECOMMENDS_${PN}-minion_append_x64 = "dmidecode"
> +RSUGGESTS_${PN}-minion = "python-augeas"
> +CONFFILES_${PN}-minion = "${sysconfdir}/${PN}/minion ${sysconfdir}/init.d/${PN}-minion"
> +FILES_${PN}-minion = "${bindir}/${PN}-minion ${sysconfdir}/${PN}/minion.d/ ${CONFFILES_${PN}-minion}"
> +INITSCRIPT_NAME_${PN}-minion = "${PN}-minion"
> +INITSCRIPT_PARAMS_${PN}-minion = "defaults"
> +
> +SUMMARY_${PN}-common = "shared libraries that salt requires for all packages"
> +DESCRIPTION_${PN}-common ="${DESCRIPTION_COMMON} This particular package provides shared libraries that \
> +salt-master, salt-minion, and salt-syndic require to function."
> +RDEPENDS_${PN}-common = "python (>= 2.7) python (< 2.8) python-jinja2 python-pyyaml python-requests"
> +RRECOMMENDS_${PN}-common = "lsb"
> +RSUGGESTS_${PN}-common = "python-mako python-git"
> +RCONFLICTS_${PN}-common = "python-mako (< 0.7.0)"
> +CONFFILES_${PN}-common="${sysconfdir}/logrotate.d/${PN}-common"
> +FILES_${PN}-common = "${bindir}/${PN}-call ${libdir}/python2.7/ ${CONFFILES_${PN}-common}"
> +
> +SUMMARY_${PN}-ssh = "remote manager to administer servers via salt"
> +DESCRIPTION_${PN}-ssh = "${DESCRIPTION_COMMON} This particular package provides the salt ssh controller. It \
> +is able to run salt modules and states on remote hosts via ssh. No minion or other salt specific software needs\
> + to be installed on the remote host."
> +RDEPENDS_${PN}-ssh = "python ${PN}-common (= ${EXTENDPKGV}) python-msgpack"
> +CONFFILES_${PN}-ssh="${sysconfdir}/${PN}/roster"
> +FILES_${PN}-ssh = "${bindir}/${PN}-ssh ${CONFFILES_${PN}-ssh}"
> +
> +SUMMARY_${PN}-api = "generic, modular network access system"
> +DESCRIPTION_${PN}-api = "a modular interface on top of Salt that can provide a variety of entry points into a \
> +running Salt system. It can start and manage multiple interfaces allowing a REST API to coexist with XMLRPC or \
> +even a Websocket API. The Salt API system is used to expose the fundamental aspects of Salt control to external\
> + sources. salt-api acts as the bridge between Salt itself and REST, Websockets, etc. Documentation is available\
> + on Read the Docs: http://salt-api.readthedocs.org/"
> +RDEPENDS_${PN}-api = "python ${PN}-master"
> +RSUGGESTS_${PN}-api = "python-cherrypy"
> +CONFFILES_${PN}-api = "${sysconfdir}/init.d/${PN}-api"
> +FILES_${PN}-api = "${bindir}/${PN}-api ${CONFFILES_${PN}-api}"
> +INITSCRIPT_NAME_${PN}-api = "${PN}-api"
> +INITSCRIPT_PARAMS_${PN}-api = "defaults"
> +
> +SUMMARY_${PN}-master = "remote manager to administer servers via salt"
> +DESCRIPTION_${PN}-master ="${DESCRIPTION_COMMON} This particular package provides the salt controller."
> +RDEPENDS_${PN}-master = "python ${PN}-common (= ${EXTENDPKGV}) python-m2crypto python-pycrypto python-msgpack python-pyzmq (>= 13.1.0)"
> +CONFFILES_${PN}-master="${sysconfdir}/init.d/${PN}-master  ${sysconfdir}/${PN}/master"
> +FILES_${PN}-master = "${bindir}/${PN} ${bindir}/${PN}-cp ${bindir}/${PN}-key ${bindir}/${PN}-master ${bindir}/${PN}-run ${bindir}/${PN}-unity ${CONFFILES_${PN}-master}"
> +INITSCRIPT_NAME_${PN}-master = "${PN}-master"
> +INITSCRIPT_PARAMS_${PN}-master = "defaults"
> +
> +SUMMARY_${PN}-syndic = "master-of-masters for salt, the distributed remote execution system"
> +DESCRIPTION_${PN}-syndic = "${DESCRIPTION_COMMON} This particular package provides the master of masters for \
> +salt; it enables the management of multiple masters at a time."
> +RDEPENDS_${PN}-syndic = "python ${PN}-master (= ${EXTENDPKGV})"
> +CONFFILES_${PN}-syndic="${sysconfdir}/init.d/${PN}-syndic"
> +FILES_${PN}-syndic = "${bindir}/${PN}-syndic ${CONFFILES_${PN}-syndic}"
> +INITSCRIPT_NAME_${PN}-syndic = "${PN}-syndic"
> +INITSCRIPT_PARAMS_${PN}-syndic = "defaults"
> +
> +SUMMARY_${PN}-cloud = "public cloud VM management system"
> +DESCRIPTION_${PN}-cloud = "provision virtual machines on various public clouds via a cleanly controlled profile and mapping system."
> +RDEPENDS_${PN}-cloud = "python ${PN}-common (= ${EXTENDPKGV}) python-msgpack"
> +RSUGGESTS_${PN}-cloud = "python-netaddr python-botocore"
> +CONFFILES_${PN}-cloud = "${sysconfdir}/${PN}/cloud"
> +FILES_${PN}-cloud = "${bindir}/${PN}-cloud ${sysconfdir}/${PN}/cloud.conf.d/ ${sysconfdir}/${PN}/cloud.profiles.d/ ${sysconfdir}/${PN}/cloud.providers.d/ ${CONFFILES_${PN}-cloud}"
> +
> +FILES_${PN}-bash-completion = "${sysconfdir}/bash_completion.d/${PN}-common"
> --
> 1.9.1
>
> --
> _______________________________________________
> meta-virtualization mailing list
> meta-virtualization at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/meta-virtualization



-- 
"Thou shalt not follow the NULL pointer, for chaos and madness await
thee at its end"


More information about the meta-virtualization mailing list