Hello community, here is the log from the commit of package salt for openSUSE:Factory checked in at 2014-10-23 14:20:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/salt (Old) and /work/SRC/openSUSE:Factory/.salt.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "salt" Changes: -------- --- /work/SRC/openSUSE:Factory/salt/salt.changes 2014-10-01 11:23:47.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.salt.new/salt.changes 2014-10-23 14:21:19.000000000 +0200 @@ -1,0 +2,15 @@ +Thu Oct 16 19:26:57 UTC 2014 - [email protected] + +- Updated to 2014.1.13 a bugfix release on 2014.1.12 + + fix module run exit code (issue 16420) + + salt cloud Check the exit status code of scp before assuming it has failed. (issue 16599) + + +------------------------------------------------------------------- +Fri Oct 10 18:47:07 UTC 2014 - [email protected] +ff +- Updated to 2014.1.12 a bugfix release on 2014.1.11 + + Fix scp_file always failing (which broke salt-cloud) (issue 16437) + + Fix regression in pillar in masterless (issue 16210, issue 16416, issue 16428) + +------------------------------------------------------------------- @@ -471 +486 @@ -- Updated 0.17.0 Feauture Release +- Updated 0.17.0 Feature Release @@ -602 +617 @@ -- New Feautures in 0.16.0: +- New Features in 0.16.0: Old: ---- salt-2014.1.11.tar.gz New: ---- salt-2014.1.13.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ salt.spec ++++++ --- /var/tmp/diff_new_pack.WFclNl/_old 2014-10-23 14:21:20.000000000 +0200 +++ /var/tmp/diff_new_pack.WFclNl/_new 2014-10-23 14:21:20.000000000 +0200 @@ -15,9 +15,8 @@ # Please submit bugfixes or comments via http://bugs.opensuse.org/ # - Name: salt -Version: 2014.1.11 +Version: 2014.1.13 Release: 0 Summary: A parallel remote execution system License: Apache-2.0 ++++++ salt-2014.1.11.tar.gz -> salt-2014.1.13.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/PKG-INFO new/salt-2014.1.13/PKG-INFO --- old/salt-2014.1.11/PKG-INFO 2014-09-09 22:43:03.000000000 +0200 +++ new/salt-2014.1.13/PKG-INFO 2014-10-15 17:26:12.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: salt -Version: 2014.1.11 +Version: 2014.1.13 Summary: Portable, distributed, remote execution and configuration management system Home-page: http://saltstack.org Author: Thomas S Hatch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/doc/topics/installation/fedora.rst new/salt-2014.1.13/doc/topics/installation/fedora.rst --- old/salt-2014.1.11/doc/topics/installation/fedora.rst 2014-09-09 22:42:16.000000000 +0200 +++ new/salt-2014.1.13/doc/topics/installation/fedora.rst 2014-10-15 17:21:54.000000000 +0200 @@ -7,6 +7,12 @@ up to date versions of Salt than other members of the Red Hat family, which makes it a great place to help improve Salt! +**WARNING**: Fedora 19 comes with systemd 204. Systemd has known bugs fixed in +later revisions that prevent the salt-master from starting reliably or opening +the network connections that it needs to. It's not likely that a salt-master +will start or run reliably on any distribution that uses systemd version 204 or +earlier. Running salt-minions should be OK. + Installation ============ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/doc/topics/releases/2014.1.11.rst new/salt-2014.1.13/doc/topics/releases/2014.1.11.rst --- old/salt-2014.1.11/doc/topics/releases/2014.1.11.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/salt-2014.1.13/doc/topics/releases/2014.1.11.rst 2014-10-03 22:21:36.000000000 +0200 @@ -0,0 +1,16 @@ +============================ +Salt 2014.1.11 Release Notes +============================ + +:release: 2014-08-29 + +Version 2014.1.11 is another bugfix release for :doc:`2014.1.0 +</topics/releases/2014.1.0>`. Changes include: + +- Fix for minion_id with byte-order mark (BOM) (:issue:`12296`) +- Fix ``runas`` deprecation in ``at`` module +- Fix trailing slash befhavior for ``file.makedirs_`` (:issue:`14019`) +- Fix chocolatey path (:issue:`13870`) +- Fix git_pillar infinite loop issues (:issue:`14671`) +- Fix json outputter ``null`` case +- Fix for minion error if one of multiple masters are down (:issue:`14099`) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/doc/topics/releases/2014.1.12.rst new/salt-2014.1.13/doc/topics/releases/2014.1.12.rst --- old/salt-2014.1.11/doc/topics/releases/2014.1.12.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/salt-2014.1.13/doc/topics/releases/2014.1.12.rst 2014-10-15 17:21:54.000000000 +0200 @@ -0,0 +1,12 @@ +============================ +Salt 2014.1.12 Release Notes +============================ + +:release: 2014-10-08 + +Version 2014.1.12 is another bugfix release for :doc:`2014.1.0 +</topics/releases/2014.1.0>`. Changes include: + +- Fix ``scp_file`` always failing (which broke salt-cloud) (:issue:`16437`) +- Fix regression in pillar in masterless (:issue:`16210`, :issue:`16416`, + :issue:`16428`) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/doc/topics/releases/2014.1.13.rst new/salt-2014.1.13/doc/topics/releases/2014.1.13.rst --- old/salt-2014.1.11/doc/topics/releases/2014.1.13.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/salt-2014.1.13/doc/topics/releases/2014.1.13.rst 2014-10-15 17:21:54.000000000 +0200 @@ -0,0 +1,10 @@ +============================ +Salt 2014.1.13 Release Notes +============================ + +:release: 2014-10-14 + +Version 2014.1.13 is another bugfix release for :doc:`2014.1.0 +</topics/releases/2014.1.0>`. Changes include: + +- Fix ``sftp_file`` by checking the exit status code of scp (which broke salt-cloud) (:issue:`16599`) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/doc/topics/tutorials/quickstart.rst new/salt-2014.1.13/doc/topics/tutorials/quickstart.rst --- old/salt-2014.1.11/doc/topics/tutorials/quickstart.rst 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/doc/topics/tutorials/quickstart.rst 2014-10-15 17:21:54.000000000 +0200 @@ -17,6 +17,12 @@ salt-call --local state.highstate +.. note:: + + When running Salt in masterless mode, do not run the salt-minion daemon. + Otherwise, it will attempt to connect to a master and fail. The salt-call + command stands on its own and does not need the salt-minion daemon. + Bootstrap Salt Minion ===================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/doc/topics/tutorials/standalone_minion.rst new/salt-2014.1.13/doc/topics/tutorials/standalone_minion.rst --- old/salt-2014.1.11/doc/topics/tutorials/standalone_minion.rst 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/doc/topics/tutorials/standalone_minion.rst 2014-10-15 17:21:54.000000000 +0200 @@ -10,6 +10,12 @@ - Use salt-call commands on a system without connectivity to a master - Masterless States, run states entirely from files local to the minion +.. note:: + + When running Salt in masterless mode, do not run the salt-minion daemon. + Otherwise, it will attempt to connect to a master and fail. The salt-call + command stands on its own and does not need the salt-minion daemon. + Telling Salt Call to Run Masterless =================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/arch/salt-master.service new/salt-2014.1.13/pkg/arch/salt-master.service --- old/salt-2014.1.11/pkg/arch/salt-master.service 2014-08-20 22:35:55.000000000 +0200 +++ new/salt-2014.1.13/pkg/arch/salt-master.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Master Server -After=syslog.target network.target - -[Service] -Type=notify -ExecStart=/usr/bin/salt-master - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-master.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/arch/salt-minion.service new/salt-2014.1.13/pkg/arch/salt-minion.service --- old/salt-2014.1.11/pkg/arch/salt-minion.service 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/arch/salt-minion.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Minion -After=syslog.target network.target - -[Service] -Type=simple -ExecStart=/usr/bin/salt-minion - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-minion.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/arch/salt-syndic.service new/salt-2014.1.13/pkg/arch/salt-syndic.service --- old/salt-2014.1.11/pkg/arch/salt-syndic.service 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/arch/salt-syndic.service 2014-10-23 14:21:20.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Master Server -After=syslog.target network.target - -[Service] -Type=simple -ExecStart=/usr/bin/salt-syndic - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-syndic.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/rpm/salt-master.service new/salt-2014.1.13/pkg/rpm/salt-master.service --- old/salt-2014.1.11/pkg/rpm/salt-master.service 2014-08-20 22:35:55.000000000 +0200 +++ new/salt-2014.1.13/pkg/rpm/salt-master.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Master Server -After=syslog.target network.target - -[Service] -Type=notify -ExecStart=/usr/bin/salt-master - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-master.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/rpm/salt-minion.service new/salt-2014.1.13/pkg/rpm/salt-minion.service --- old/salt-2014.1.11/pkg/rpm/salt-minion.service 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/rpm/salt-minion.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Minion -After=syslog.target network.target - -[Service] -Type=simple -ExecStart=/usr/bin/salt-minion - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-minion.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/rpm/salt-syndic.service new/salt-2014.1.13/pkg/rpm/salt-syndic.service --- old/salt-2014.1.11/pkg/rpm/salt-syndic.service 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/rpm/salt-syndic.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Master Server -After=syslog.target network.target - -[Service] -Type=simple -ExecStart=/usr/bin/salt-syndic - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-syndic.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/smartos/esky/build-tarball.sh new/salt-2014.1.13/pkg/smartos/esky/build-tarball.sh --- old/salt-2014.1.11/pkg/smartos/esky/build-tarball.sh 2014-06-17 21:18:30.000000000 +0200 +++ new/salt-2014.1.13/pkg/smartos/esky/build-tarball.sh 2014-10-03 22:21:36.000000000 +0200 @@ -4,6 +4,7 @@ rm -rf dist/ $BUILD_DIR &&\ cp $PKG_DIR/_syspaths.py salt/ &&\ +python2.7 setup.py sdist &&\ python2.7 setup.py bdist &&\ python2.7 setup.py bdist_esky &&\ rm salt/_syspaths.py &&\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/smartos/esky/salt-minion.xml new/salt-2014.1.13/pkg/smartos/esky/salt-minion.xml --- old/salt-2014.1.11/pkg/smartos/esky/salt-minion.xml 2014-08-20 22:35:55.000000000 +0200 +++ new/salt-2014.1.13/pkg/smartos/esky/salt-minion.xml 2014-10-03 22:21:36.000000000 +0200 @@ -28,7 +28,7 @@ <exec_method type="method" name="start" - exec="auditconfig -setaudit 0 lo 0,0,localhost 5417 SALT_PREFIX/bin/salt-minion" + exec="/usr/sbin/auditconfig -setaudit 0 lo 0,0,localhost 5417 SALT_PREFIX/bin/salt-minion" timeout_seconds="60"> <method_context> <method_environment> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/suse/salt-master.service new/salt-2014.1.13/pkg/suse/salt-master.service --- old/salt-2014.1.11/pkg/suse/salt-master.service 2014-08-20 22:35:55.000000000 +0200 +++ new/salt-2014.1.13/pkg/suse/salt-master.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Master Server -After=syslog.target network.target - -[Service] -Type=notify -ExecStart=/usr/bin/salt-master - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-master.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/suse/salt-minion.service new/salt-2014.1.13/pkg/suse/salt-minion.service --- old/salt-2014.1.11/pkg/suse/salt-minion.service 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/suse/salt-minion.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Minion -After=syslog.target network.target - -[Service] -Type=simple -ExecStart=/usr/bin/salt-minion - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-minion.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/suse/salt-syndic.service new/salt-2014.1.13/pkg/suse/salt-syndic.service --- old/salt-2014.1.11/pkg/suse/salt-syndic.service 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/suse/salt-syndic.service 2014-10-23 14:21:21.000000000 +0200 @@ -1,10 +1 @@ -[Unit] -Description=The Salt Master Server -After=syslog.target network.target - -[Service] -Type=simple -ExecStart=/usr/bin/salt-syndic - -[Install] -WantedBy=multi-user.target +symbolic link to ../salt-syndic.service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/pkg/suse/salt.logrotate new/salt-2014.1.13/pkg/suse/salt.logrotate --- old/salt-2014.1.11/pkg/suse/salt.logrotate 2014-03-11 20:18:21.000000000 +0100 +++ new/salt-2014.1.13/pkg/suse/salt.logrotate 2014-10-23 14:21:21.000000000 +0200 @@ -1,23 +1 @@ -/var/log/salt/master { - weekly - missingok - rotate 7 - compress - notifempty -} - -/var/log/salt/minion { - weekly - missingok - rotate 7 - compress - notifempty -} - -/var/log/salt/key { - weekly - missingok - rotate 7 - compress - notifempty -} +symbolic link to ../salt-common.logrotate diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/_version.py new/salt-2014.1.13/salt/_version.py --- old/salt-2014.1.11/salt/_version.py 2014-09-09 22:43:03.000000000 +0200 +++ new/salt-2014.1.13/salt/_version.py 2014-10-15 17:26:12.000000000 +0200 @@ -1,5 +1,5 @@ -# This file was auto-generated by salt's setup on Tuesday, 09 September 2014 @ 20:09:03 UTC. +# This file was auto-generated by salt's setup on Wednesday, 15 October 2014 @ 15:10:12 UTC. from salt.version import SaltStackVersion -__saltstack_version__ = SaltStackVersion(2014, 1, 11, 0, 0, 0, None) +__saltstack_version__ = SaltStackVersion(2014, 1, 13, 0, 0, 0, None) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/cloud/clouds/ec2.py new/salt-2014.1.13/salt/cloud/clouds/ec2.py --- old/salt-2014.1.11/salt/cloud/clouds/ec2.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/cloud/clouds/ec2.py 2014-10-15 17:21:54.000000000 +0200 @@ -1541,7 +1541,7 @@ ) if 'instance_id' not in kwargs: - kwargs['instance_id'] = _get_node(name)['instanceId'] + kwargs['instance_id'] = _get_node(name)[name]['instanceId'] if type(kwargs['volumes']) is str: volumes = yaml.safe_load(kwargs['volumes']) @@ -1616,7 +1616,7 @@ log.info('Stopping node {0}'.format(name)) - instance_id = _get_node(name)['instanceId'] + instance_id = _get_node(name)[name]['instanceId'] params = {'Action': 'StopInstances', 'InstanceId.1': instance_id} @@ -1636,7 +1636,7 @@ log.info('Starting node {0}'.format(name)) - instance_id = _get_node(name)['instanceId'] + instance_id = _get_node(name)[name]['instanceId'] params = {'Action': 'StartInstances', 'InstanceId.1': instance_id} @@ -1659,7 +1659,7 @@ ) if instance_id is None: - instance_id = _get_node(name, location)['instanceId'] + instance_id = _get_node(name, location)[name]['instanceId'] params = {'Action': 'CreateTags', 'ResourceId.1': instance_id} @@ -1748,7 +1748,7 @@ 'A tag or tags must be specified using tags=list,of,tags' ) - instance_id = _get_node(name)['instanceId'] + instance_id = _get_node(name)[name]['instanceId'] params = {'Action': 'DeleteTags', 'ResourceId.1': instance_id} @@ -1869,7 +1869,7 @@ salt-cloud -a reboot mymachine ''' - instance_id = _get_node(name)['instanceId'] + instance_id = _get_node(name)[name]['instanceId'] params = {'Action': 'RebootInstances', 'InstanceId.1': instance_id} result = query(params) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/cloud/deploy/bootstrap-salt.sh new/salt-2014.1.13/salt/cloud/deploy/bootstrap-salt.sh --- old/salt-2014.1.11/salt/cloud/deploy/bootstrap-salt.sh 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/cloud/deploy/bootstrap-salt.sh 2014-10-15 17:21:54.000000000 +0200 @@ -17,7 +17,7 @@ # CREATED: 10/15/2012 09:49:37 PM WEST #====================================================================================================================== set -o nounset # Treat unset variables as an error -__ScriptVersion="2014.08.23" +__ScriptVersion="2014.09.24" __ScriptName="bootstrap-salt.sh" #====================================================================================================================== @@ -31,7 +31,7 @@ # * BS_FORCE_OVERWRITE: Force overriding copied files(config, init.d, etc) # * BS_UPGRADE_SYS: If 1 and an option, upgrade system. Default 0. # * BS_GENTOO_USE_BINHOST: If 1 add `--getbinpkg` to gentoo's emerge -# * BS__SALT_MASTER_ADDRESS: The IP or DNS name of the salt-master the minion should connect to +# * BS_SALT_MASTER_ADDRESS: The IP or DNS name of the salt-master the minion should connect to # * BS_SALT_GIT_CHECKOUT_DIR: The directory where to clone Salt on git installations #====================================================================================================================== @@ -702,6 +702,9 @@ DISTRO_NAME="Oracle Linux" elif [ "${DISTRO_NAME}" = "AmazonAMI" ]; then DISTRO_NAME="Amazon Linux AMI" + elif [ "${DISTRO_NAME}" = "Arch" ]; then + DISTRO_NAME="Arch Linux" + return fi rv=$(lsb_release -sr) [ "${rv}" != "" ] && DISTRO_VERSION=$(__parse_version_string "$rv") @@ -728,10 +731,11 @@ [ ! -f "/etc/${rsource}" ] && continue # Does not exist n=$(echo "${rsource}" | sed -e 's/[_-]release$//' -e 's/[_-]version$//') + shortname=$(echo "${n}" | tr '[:upper:]' '[:lower:]') rv=$( (grep VERSION "/etc/${rsource}"; cat "/etc/${rsource}") | grep '[0-9]' | sed -e 'q' ) - [ "${rv}" = "" ] && continue # There's no version information. Continue to next rsource + [ "${rv}" = "" ] && [ "$shortname" != "arch" ] && continue # There's no version information. Continue to next rsource v=$(__parse_version_string "$rv") - case $(echo "${n}" | tr '[:upper:]' '[:lower:]') in + case $shortname in redhat ) if [ "$(egrep 'CentOS' /etc/${rsource})" != "" ]; then n="CentOS" @@ -770,6 +774,10 @@ rv="$(__unquote_string "$(grep '^VERSION_ID=' /etc/os-release | sed -e 's/^VERSION_ID=\(.*\)$/\1/g')")" [ "${rv}" != "" ] && v=$(__parse_version_string "$rv") || v="" case $(echo "${nn}" | tr '[:upper:]' '[:lower:]') in + amzn ) + # Amazon AMI's after 2014.9 match here + n="Amazon Linux AMI" + ;; arch ) n="Arch Linux" v="" # Arch Linux does not provide a version. @@ -1153,7 +1161,7 @@ fi else __SHALLOW_CLONE="${BS_FALSE}" - if [ "$(echo "$GIT_REV" | sed 's/^.*\(v[[:digit:]]\{1,4\}\.[[:digit:]]\{1,2\}\.[[:digit:]]\{1,2\}\).*$/MATCH/')" = "MATCH" ]; then + if [ "$(echo "$GIT_REV" | sed 's/^.*\(v[[:digit:]]\{1,4\}\.[[:digit:]]\{1,2\}\.[[:digit:]]\{1,2\}\)\?.*$/MATCH/')" = "MATCH" ]; then echoinfo "Git revision matches a Salt version tag" # Let's try shallow cloning to speed up. # Test for "--single-branch" option introduced in git 1.7.10, the minimal version of git where the shallow @@ -1690,7 +1698,7 @@ __PIP_PACKAGES="" else check_pip_allowed "You need to allow pip based installations (-P) in order to install the python package 'requests'" - __apt_get_install_noinput python-pip + __apt_get_install_noinput python-setuptools python-pip __PIP_PACKAGES="requests" pip install requests fi @@ -1824,6 +1832,10 @@ echodebug "Copying ${__SALT_GIT_CHECKOUT_DIR}/debian/salt-${fname}.init to /etc/init.d/salt-$fname" copyfile "${__SALT_GIT_CHECKOUT_DIR}/debian/salt-${fname}.init" "/etc/init.d/salt-$fname" chmod +x /etc/init.d/salt-$fname + + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + update-rc.d salt-$fname defaults else echoerror "Neither upstart not init.d was setup for salt-$fname" @@ -1837,11 +1849,13 @@ # Ensure upstart configs are loaded [ -f /sbin/initctl ] && /sbin/initctl reload-configuration for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /sbin/initctl ]; then @@ -1871,10 +1885,13 @@ install_ubuntu_check_services() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then __check_services_upstart salt-$fname || return 1 @@ -2292,6 +2309,10 @@ continue fi chmod +x "/etc/init.d/salt-$fname" + + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + update-rc.d "salt-$fname" defaults done } @@ -2300,11 +2321,13 @@ [ "$_START_DAEMONS" -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ ! -f "/etc/init.d/salt-$fname" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ ! -f "/etc/init.d/salt-$fname" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue /etc/init.d/salt-$fname stop > /dev/null 2>&1 @@ -2314,10 +2337,13 @@ install_debian_check_services() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ ! -f "/etc/init.d/salt-$fname" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ ! -f "/etc/init.d/salt-$fname" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue __check_services_debian salt-$fname || return 1 done @@ -2376,6 +2402,9 @@ [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) sleep 0.1 systemctl daemon-reload @@ -2418,6 +2447,9 @@ copyfile "${__SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service" + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) sleep 0.1 systemctl daemon-reload @@ -2428,10 +2460,13 @@ [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue systemctl stop salt-$fname > /dev/null 2>&1 @@ -2441,10 +2476,13 @@ install_fedora_check_services() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue __check_services_systemd salt-$fname || return 1 done @@ -2483,7 +2521,7 @@ elif [ "$DISTRO_MAJOR_VERSION" -eq 6 ]; then rpm -Uvh --force "http://download.fedoraproject.org/pub/epel/6/${EPEL_ARCH}/epel-release-6-8.noarch.rpm" || return 1 elif [ "$DISTRO_MAJOR_VERSION" -eq 7 ]; then - rpm -Uvh --force "http://download.fedoraproject.org/pub/epel/beta/7/${EPEL_ARCH}/epel-release-7-0.2.noarch.rpm" || return 1 + rpm -Uvh --force "http://download.fedoraproject.org/pub/epel/7/${EPEL_ARCH}/e/epel-release-7-2.noarch.rpm" || return 1 else echoerror "Failed add EPEL repository support." return 1 @@ -2577,9 +2615,12 @@ install_centos_stable_post() { for fname in minion master syndic api; do # Skip if not meant to be installed + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /etc/init.d/salt-$fname ]; then @@ -2632,17 +2673,22 @@ } install_centos_git_post() { - for fname in master minion syndic; do + for fname in minion master minion api; do # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue + [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue # While the RPM's use init.d, so will we. if [ ! -f /etc/init.d/salt-$fname ] || ([ -f /etc/init.d/salt-$fname ] && [ $_FORCE_OVERWRITE -eq $BS_TRUE ]); then copyfile "${__SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}" /etc/init.d/ chmod +x /etc/init.d/salt-${fname} + + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + /sbin/chkconfig salt-${fname} on fi @@ -2667,9 +2713,12 @@ for fname in minion master syndic api; do # Skip if not meant to be installed + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then @@ -2718,10 +2767,13 @@ install_centos_check_services() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then __check_services_upstart salt-$fname || return 1 @@ -2765,7 +2817,7 @@ yum --config "${__YUM_CONF_FILE}" install -y ${package} --enablerepo=${_EPEL_REPO} >/dev/null 2>&1 fi if [ $? -ne 0 ]; then - echoerror "Failed to find an installable '${package}' package. The optional repository or it's subscription might be missing." + echoerror "Failed to find an installable '${package}' package. The optional repository or its subscription might be missing." rm -rf "${__YUM_CONF_DIR}" return 1 fi @@ -3339,6 +3391,9 @@ copyfile "$_SALT_ETC_DIR/$fname.pacorig" "$_SALT_ETC_DIR/$fname" $BS_TRUE fi + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + if [ -f /usr/bin/systemctl ]; then # Using systemd /usr/bin/systemctl is-enabled salt-$fname.service > /dev/null 2>&1 || ( @@ -3366,6 +3421,9 @@ if [ -f /usr/bin/systemctl ]; then copyfile "${__SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service" + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + /usr/bin/systemctl is-enabled salt-${fname}.service > /dev/null 2>&1 || ( /usr/bin/systemctl preset salt-${fname}.service > /dev/null 2>&1 && /usr/bin/systemctl enable salt-${fname}.service > /dev/null 2>&1 @@ -3385,11 +3443,13 @@ [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /usr/bin/systemctl ]; then @@ -3409,10 +3469,13 @@ fi for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue __check_services_systemd salt-$fname || return 1 done @@ -3617,6 +3680,9 @@ install_freebsd_9_stable_post() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue @@ -3650,11 +3716,13 @@ [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue service salt_$fname stop > /dev/null 2>&1 @@ -3788,11 +3856,13 @@ [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue # Stop if running && Start service @@ -3822,7 +3892,7 @@ zypper --gpg-auto-import-keys --non-interactive refresh if [ $? -ne 0 ] && [ $? -ne 4 ]; then - # If the exit code is not 0, and it's not 4(failed to update a + # If the exit code is not 0, and it's not 4 (failed to update a # repository) return a failure. Otherwise continue. return 1 fi @@ -3895,11 +3965,13 @@ install_opensuse_stable_post() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /bin/systemctl ]; then @@ -3941,11 +4013,13 @@ [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -f /bin/systemctl ]; then @@ -3967,10 +4041,13 @@ fi for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue __check_services_systemd salt-$fname > /dev/null 2>&1 || __check_services_systemd salt-$fname.service > /dev/null 2>&1 || return 1 done @@ -4152,10 +4229,13 @@ fi for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue __check_services_systemd salt-$fname || return 1 done @@ -4249,11 +4329,13 @@ install_gentoo_post() { for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -d "/run/systemd/system" ]; then @@ -4270,11 +4352,13 @@ [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ -d "/run/systemd/system" ]; then @@ -4294,10 +4378,13 @@ fi for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue __check_services_systemd salt-$fname || return 1 done @@ -4435,11 +4522,13 @@ FAILED_DAEMONS=0 for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue # shellcheck disable=SC2009 @@ -4731,10 +4820,13 @@ echoerror "Failed to run ${DAEMONS_RUNNING_FUNC}()!!!" for fname in minion master syndic api; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + # Skip if not meant to be installed [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue + #[ $fname = "api" ] && ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || [ "$(which salt-${fname} 2>/dev/null)" = "" ]) && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue if [ "$_ECHO_DEBUG" -eq $BS_FALSE ]; then diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/fileserver/s3fs.py new/salt-2014.1.13/salt/fileserver/s3fs.py --- old/salt-2014.1.11/salt/fileserver/s3fs.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/fileserver/s3fs.py 2014-10-15 17:21:40.000000000 +0200 @@ -61,6 +61,7 @@ ''' # Import python libs +import datetime import os import hashlib import time @@ -506,22 +507,63 @@ Checks the local cache for the file, if it's old or missing go grab the file from S3 and update the cache ''' + key, keyid, service_url = _get_s3_key() # check the local cache... if os.path.isfile(cached_file_path): file_meta = _find_file_meta(metadata, bucket_name, saltenv, path) - file_md5 = filter(str.isalnum, file_meta['ETag']) if file_meta else None + if file_meta: + file_etag = file_meta['ETag'] - cached_file_hash = hashlib.md5() - with salt.utils.fopen(cached_file_path, 'rb') as fp_: - cached_file_hash.update(fp_.read()) - - # hashes match we have a cache hit - if cached_file_hash.hexdigest() == file_md5: - return + if file_etag.find('-') == -1: + file_md5 = file_etag + cached_file_hash = hashlib.md5() + with salt.utils.fopen(cached_file_path, 'rb') as fp_: + cached_file_hash.update(fp_.read()) + + # hashes match we have a cache hit + if cached_file_hash.hexdigest() == file_md5: + return + else: + cached_file_stat = os.stat(cached_file_path) + cached_file_size = cached_file_stat.st_size + cached_file_mtime = datetime.datetime.fromtimestamp( + cached_file_stat.st_mtime) + + cached_file_lastmod = datetime.datetime.strptime( + file_meta['LastModified'], '%Y-%m-%dT%H:%M:%S.%fZ') + if (cached_file_size == int(file_meta['Size']) and + cached_file_mtime > cached_file_lastmod): + log.debug('cached file size equal to metadata size and ' + 'cached file mtime later than metadata last ' + 'modification time.') + ret = s3.query( + key=key, + keyid=keyid, + method='HEAD', + bucket=bucket_name, + service_url=service_url, + path=urllib.quote(path), + local_file=cached_file_path + ) + for header in ret['headers']: + name, value = header.split(':', 1) + name = name.strip() + value = value.strip() + if name == 'Last-Modified': + s3_file_mtime = datetime.datetime.strptime( + value, '%a, %d %b %Y %H:%M:%S %Z') + elif name == 'Content-Length': + s3_file_size = int(value) + if (cached_file_size == s3_file_size and + cached_file_mtime > s3_file_mtime): + log.info( + '{0} - {1} : {2} skipped download since cached file size ' + 'equal to and mtime after s3 values'.format( + bucket_name, saltenv, path)) + return # ... or get the file from S3 - key, keyid, service_url = _get_s3_key() s3.query( key=key, keyid=keyid, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/grains/core.py new/salt-2014.1.13/salt/grains/core.py --- old/salt-2014.1.11/salt/grains/core.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/grains/core.py 2014-10-15 17:21:40.000000000 +0200 @@ -151,6 +151,7 @@ # dominant gpu vendors to search for (MUST be lowercase for matching below) known_vendors = ['nvidia', 'amd', 'ati', 'intel'] + gpu_classes = ('vga compatible controller', '3d controller') devs = [] try: @@ -165,9 +166,8 @@ for line in lspci_list: # check for record-separating empty lines if line == '': - if cur_dev.get('Class', '') == 'VGA compatible controller': + if cur_dev.get('Class', '').lower() in gpu_classes: devs.append(cur_dev) - # XXX; may also need to search for "3D controller" cur_dev = {} continue if re.match(r'^\w+:\s+.*', line): @@ -983,7 +983,7 @@ # Load additional OS family grains if grains['os_family'] == "RedHat": - grains['osmajorrelease'] = grains['osrelease'].split('.', 1) + grains['osmajorrelease'] = grains['osrelease'].split('.', 1)[0] grains['osfinger'] = '{os}-{ver}'.format( os=grains['osfullname'], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/modules/cmdmod.py new/salt-2014.1.13/salt/modules/cmdmod.py --- old/salt-2014.1.11/salt/modules/cmdmod.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/modules/cmdmod.py 2014-10-15 17:21:40.000000000 +0200 @@ -331,6 +331,12 @@ env_runas = json.loads(env_json).get('data', {}) env_runas.update(env) env = env_runas + # Encode unicode kwargs to filesystem encoding to avoid a + # UnicodeEncodeError when the subprocess is invoked. + fse = sys.getfilesystemencoding() + for key, val in env.iteritems(): + if isinstance(val, unicode): + env[key] = val.encode(fse) except ValueError: raise CommandExecutionError( 'Environment could not be retrieved for User {0!r}'.format( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/modules/file.py new/salt-2014.1.13/salt/modules/file.py --- old/salt-2014.1.11/salt/modules/file.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/modules/file.py 2014-10-15 17:21:40.000000000 +0200 @@ -1019,7 +1019,7 @@ result = re.sub(cpattern, repl, line, count) # Identity check each potential change until one change is made - if has_changes is False and result is not line: + if has_changes is False and result != line: has_changes = True if show_changes: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/modules/mount.py new/salt-2014.1.13/salt/modules/mount.py --- old/salt-2014.1.11/salt/modules/mount.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/modules/mount.py 2014-10-15 17:21:54.000000000 +0200 @@ -238,7 +238,7 @@ # Invalid entry lines.append(line) continue - if comps[0] == device: + if comps[1] == name or comps[0] == device: # check to see if there are changes # and fix them if there are any present = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/modules/zfs.py new/salt-2014.1.13/salt/modules/zfs.py --- old/salt-2014.1.11/salt/modules/zfs.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/modules/zfs.py 2014-10-15 17:21:54.000000000 +0200 @@ -42,7 +42,7 @@ ret = {} # Note that we append '|| :' as a unix hack to force return code to be 0. res = salt_cmd.run_stderr( - '{0} help || :'.format(zfs_path), output_loglevel='debug' + '{0} help || :'.format(zfs_path), output_loglevel='trace' ) # This bit is dependent on specific output from `zfs help` - any major changes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/output/highstate.py new/salt-2014.1.13/salt/output/highstate.py --- old/salt-2014.1.11/salt/output/highstate.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/output/highstate.py 2014-10-15 17:21:54.000000000 +0200 @@ -137,8 +137,9 @@ } hstrs.extend([sline.format(**svars) for sline in state_lines]) changes = ' Changes: ' + ctext - hstrs.append(('{0}{1}{2[ENDC]}' - .format(tcolor, changes, colors))) + hstrs.append( + u'{0}{1}{2[ENDC]}'.format(tcolor, changes, colors) + ) # Append result counts to end of output colorfmt = '{0}{1}{2[ENDC]}' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/output/nested.py new/salt-2014.1.13/salt/output/nested.py --- old/salt-2014.1.11/salt/output/nested.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/output/nested.py 2014-10-15 17:21:54.000000000 +0200 @@ -3,10 +3,12 @@ Recursively display nested data, this is the default outputter. ''' # Import python libs +import re from numbers import Number # Import salt libs import salt.utils +from salt._compat import string_types class NestDisplay(object): @@ -16,59 +18,73 @@ def __init__(self): self.colors = salt.utils.get_colors(__opts__.get('color')) + def ustring(self, + indent, + color, + msg, + prefix='', + suffix='', + endc=None, + encoding='utf-8'): + if endc is None: + endc = self.colors['ENDC'] + try: + return u'{0}{1}{2}{3}{4}{5}\n'.format( + indent, color, prefix, msg, endc, suffix) + except UnicodeDecodeError: + return u'{0}{1}{2}{3}{4}{5}\n'.format( + indent, color, prefix, msg.decode(encoding), endc, suffix) + def display(self, ret, indent, prefix, out): ''' Recursively iterate down through data structures to determine output ''' if ret is None or ret is True or ret is False: - out += '{0}{1}{2}{3}{4}\n'.format( - ' ' * indent, - self.colors['YELLOW'], - prefix, - ret, - self.colors['ENDC']) - # Number includes all python numbers types (float, int, long, complex, ...) + out += self.ustring( + ' ' * indent, + self.colors['YELLOW'], + ret, + prefix=prefix) + # Number includes all python numbers types + # (float, int, long, complex, ...) elif isinstance(ret, Number): - out += '{0}{1}{2}{3}{4}\n'.format( - ' ' * indent, - self.colors['YELLOW'], - prefix, - ret, - self.colors['ENDC']) - elif isinstance(ret, basestring): - lines = ret.split('\n') + out += self.ustring( + ' ' * indent, + self.colors['YELLOW'], + ret, + prefix=prefix) + elif isinstance(ret, string_types): + lines = re.split(r'\r?\n', ret) for line in lines: - out += '{0}{1}{2}{3}{4}\n'.format( - ' ' * indent, - self.colors['GREEN'], - prefix, - line, - self.colors['ENDC']) + out += self.ustring( + ' ' * indent, + self.colors['GREEN'], + line, + prefix=prefix) elif isinstance(ret, list) or isinstance(ret, tuple): for ind in ret: - if isinstance(ind, (list, tuple)): - out += '{0}{1}|_{2}\n'.format( - ' ' * indent, - self.colors['GREEN'], - self.colors['ENDC']) - out = self.display(ind, indent + 2, '- ', out) + if isinstance(ind, (list, tuple, dict)): + out += self.ustring(' ' * indent, + self.colors['GREEN'], + '|_') + prefix = '' if isinstance(ind, dict) else '- ' + out = self.display(ind, indent + 2, prefix, out) else: out = self.display(ind, indent, '- ', out) elif isinstance(ret, dict): if indent: - out += '{0}{1}{2}{3}\n'.format( - ' ' * indent, - self.colors['CYAN'], - '-' * 10, - self.colors['ENDC']) + out += self.ustring( + ' ' * indent, + self.colors['CYAN'], + '-' * 10) for key in sorted(ret): val = ret[key] - out += '{0}{1}{2}{3}{4}:\n'.format( - ' ' * indent, - self.colors['CYAN'], - prefix, - key, - self.colors['ENDC']) + out += self.ustring( + ' ' * indent, + self.colors['CYAN'], + key, + suffix=":", + prefix=prefix) out = self.display(val, indent + 4, '', out) return out diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/pillar/__init__.py new/salt-2014.1.13/salt/pillar/__init__.py --- old/salt-2014.1.11/salt/pillar/__init__.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/pillar/__init__.py 2014-10-15 17:21:54.000000000 +0200 @@ -480,18 +480,18 @@ def ext_pillar(self, pillar, pillar_dirs): ''' - Render the external pillar data + Render the external pillar data, and merge with pillar data ''' if 'ext_pillar' not in self.opts: - return {} + return pillar if not isinstance(self.opts['ext_pillar'], list): log.critical('The "ext_pillar" option is malformed') - return {} + return pillar ext = None for run in self.opts['ext_pillar']: if not isinstance(run, dict): log.critical('The "ext_pillar" option is malformed') - return {} + return pillar for key, val in run.items(): if key not in self.ext_pillars: err = ('Specified ext_pillar interface {0} is ' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/state.py new/salt-2014.1.13/salt/state.py --- old/salt-2014.1.11/salt/state.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/state.py 2014-10-15 17:21:54.000000000 +0200 @@ -752,12 +752,15 @@ errors.append('High data is not a dictionary and is invalid') reqs = {} for name, body in high.items(): - if name.startswith('__'): - continue + try: + if name.startswith('__'): + continue + except AttributeError: + pass if not isinstance(name, string_types): err = ('The name {0} in sls {1} is not formed as a ' - 'string but is a {2}').format( - name, body['__sls__'], type(name)) + 'string but is a {2}. It may need to be quoted.' + .format(name, body['__sls__'], type(name))) errors.append(err) if not isinstance(body, dict): err = ('The type {0} in {1} is not formated as a dictionary' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/states/module.py new/salt-2014.1.13/salt/states/module.py --- old/salt-2014.1.11/salt/states/module.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/states/module.py 2014-10-15 17:21:54.000000000 +0200 @@ -11,7 +11,7 @@ mine.send: module.run: - - func: network.interfaces + - name: network.interfaces Note that this example is probably unnecessary to use in practice, since the ``mine_functions`` and ``mine_interval`` config parameters can be used to @@ -25,7 +25,7 @@ mine.send: module.wait: - - func: network.interfaces + - name: network.interfaces - watch: - file: /etc/network/interfaces @@ -200,7 +200,7 @@ returners[kwargs['returner']](ret_ret) ret['comment'] = 'Module function {0} executed'.format(name) ret['result'] = True - if ret['changes'].get('retcode', 0) != 0: + if ret['changes'].get('ret', {}).get('retcode', 0) != 0: ret['result'] = False return ret diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/templates/rh_ip/rh7_eth.jinja new/salt-2014.1.13/salt/templates/rh_ip/rh7_eth.jinja --- old/salt-2014.1.11/salt/templates/rh_ip/rh7_eth.jinja 1970-01-01 01:00:00.000000000 +0100 +++ new/salt-2014.1.13/salt/templates/rh_ip/rh7_eth.jinja 2014-10-03 22:21:37.000000000 +0200 @@ -0,0 +1,30 @@ +DEVICE="{{name}}" +{% if addr %}HWADDR="{{addr}}" +{%endif%}{% if userctl %}USERCTL="{{userctl}}" +{%endif%}{% if master %}MASTER="{{master}}" +{%endif%}{% if slave %}SLAVE="{{slave}}" +{%endif%}{% if vlan %}VLAN="{{vlan}}" +{%endif%}{% if devtype %}TYPE="{{devtype}}" +{%endif%}{% if proto %}BOOTPROTO="{{proto}}" +{%endif%}{% if onboot %}ONBOOT="{{onboot}}" +{%endif%}{% if onparent %}ONPARENT={{onparent}} +{%endif%}{% if ipaddr %}IPADDR="{{ipaddr}}" +{%endif%}{% if netmask %}NETMASK="{{netmask}}" +{%endif%}{% if gateway %}GATEWAY="{{gateway}}" +{%endif%}{% if enable_ipv6 %}IPV6INIT="yes" +{% if ipv6_autoconf %}IPV6_AUTOCONF="{{ipv6_autoconf}}" +{%endif%}{% if ipv6addr %}IPV6ADDR="{{ipv6addr}}" +{%endif%}{% if ipv6gateway %}IPV6_DEFAULTGW="{{ipv6gateway}}" +{%endif%}{%endif%}{% if srcaddr %}SRCADDR="{{srcaddr}}" +{%endif%}{% if peerdns %}PEERDNS="{{peerdns}}" +{%endif%}{% if defroute %}DEFROUTE="{{defroute}}" +{%endif%}{% if bridge %}BRIDGE="{{bridge}}" +{%endif%}{% if delay %}DELAY="{{delay}}" +{%endif%}{% if my_inner_ipaddr %}MY_INNER_IPADDR={{my_inner_ipaddr}} +{%endif%}{% if my_outer_ipaddr %}MY_OUTER_IPADDR={{my_outer_ipaddr}} +{%endif%}{%if bonding %}BONDING_OPTS="{%for item in bonding %}{{item}}={{bonding[item]}} {%endfor%}" +{%endif%}{% if ethtool %}ETHTOOL_OPTS="{%for item in ethtool %}{{item}} {{ethtool[item]}} {%endfor%}" +{%endif%}{% if domain %}DOMAIN="{{ domain|join(' ') }}" +{% endif %}{% for server in dns -%} +DNS{{loop.index}}="{{server}}" +{% endfor -%} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/salt/utils/cloud.py new/salt-2014.1.13/salt/utils/cloud.py --- old/salt-2014.1.11/salt/utils/cloud.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/salt/utils/cloud.py 2014-10-15 17:21:54.000000000 +0200 @@ -391,7 +391,7 @@ log.debug('Using {0} as the key_filename'.format(key_filename)) elif password: kwargs['password'] = password - log.debug('Using password authentication'.format(password)) + log.debug('Using password authentication') trycount += 1 log.debug( @@ -629,12 +629,12 @@ # Minion configuration if minion_pem: - scp_file('{0}/minion.pem'.format(tmp_dir), minion_pem, kwargs) + sftp_file('{0}/minion.pem'.format(tmp_dir), minion_pem, kwargs) root_cmd('chmod 600 {0}/minion.pem'.format(tmp_dir), tty, sudo, **kwargs) if minion_pub: - scp_file('{0}/minion.pub'.format(tmp_dir), minion_pub, kwargs) + sftp_file('{0}/minion.pub'.format(tmp_dir), minion_pub, kwargs) if minion_conf: if not isinstance(minion_conf, dict): @@ -647,12 +647,12 @@ ) minion_grains = minion_conf.pop('grains', {}) if minion_grains: - scp_file( + sftp_file( '{0}/grains'.format(tmp_dir), salt_config_to_yaml(minion_grains), kwargs ) - scp_file( + sftp_file( '{0}/minion'.format(tmp_dir), salt_config_to_yaml(minion_conf), kwargs @@ -660,12 +660,12 @@ # Master configuration if master_pem: - scp_file('{0}/master.pem'.format(tmp_dir), master_pem, kwargs) + sftp_file('{0}/master.pem'.format(tmp_dir), master_pem, kwargs) root_cmd('chmod 600 {0}/master.pem'.format(tmp_dir), tty, sudo, **kwargs) if master_pub: - scp_file('{0}/master.pub'.format(tmp_dir), master_pub, kwargs) + sftp_file('{0}/master.pub'.format(tmp_dir), master_pub, kwargs) if master_conf: if not isinstance(master_conf, dict): @@ -677,7 +677,7 @@ 'Loading from YAML ...' ) - scp_file( + sftp_file( '{0}/master'.format(tmp_dir), salt_config_to_yaml(master_conf), kwargs @@ -709,7 +709,7 @@ rpath = os.path.join( preseed_minion_keys_tempdir, minion_id ) - scp_file(rpath, minion_key, kwargs) + sftp_file(rpath, minion_key, kwargs) if kwargs['username'] != 'root': root_cmd( @@ -721,7 +721,7 @@ # The actual deploy script if script: - scp_file('{0}/deploy.sh'.format(tmp_dir), script, kwargs) + sftp_file('{0}/deploy.sh'.format(tmp_dir), script, kwargs) root_cmd('chmod +x {0}/deploy.sh'.format(tmp_dir), tty, sudo, **kwargs) @@ -778,7 +778,7 @@ environ_script_contents.append(deploy_command) # Upload our environ setter wrapper - scp_file( + sftp_file( '{0}/environ-deploy-wrapper.sh'.format(tmp_dir), '\n'.join(environ_script_contents), kwargs @@ -975,7 +975,7 @@ log.debug('Uploading file(PID {0}): {1!r}'.format(proc.pid, dest_path)) sent_password = 0 - while proc.isalive(): + while True: stdout, stderr = proc.recv() if stdout and SSH_PASSWORD_PROMP_RE.match(stdout): if sent_password > 2: @@ -983,15 +983,100 @@ log.warning( 'Asking for password again. Wrong one provided???' ) - proc.terminate() return 1 proc.sendline(kwargs['password']) sent_password += 1 - + if not proc.isalive(): + break time.sleep(0.025) + if (proc.exitstatus != 0) and (allow_failure is False): + raise SaltCloudSystemExit( + 'Failed to upload {0} to {1}. Exit code: {2}'.format( + tmppath, dest_path, proc.exitstatus + ) + ) + return proc.exitstatus + except vt.TerminalException as err: + log.error( + 'Failed to upload file {0!r}: {1}\n'.format( + dest_path, err + ), + exc_info=True + ) + finally: proc.close(force=True) - if allow_failure is False: + + # Signal an error + return 1 + + +def sftp_file(dest_path, contents, kwargs, allow_failure=False): + ''' + Use sftp to upload a file to a server + ''' + tmpfh, tmppath = tempfile.mkstemp() + with salt.utils.fopen(tmppath, 'w') as tmpfile: + tmpfile.write(contents) + + log.debug('Uploading {0} to {1} (scp)'.format(dest_path, kwargs['hostname'])) + + ssh_args = [ + # Don't add new hosts to the host key database + '-oStrictHostKeyChecking=no', + # Set hosts key database path to /dev/null, ie, non-existing + '-oUserKnownHostsFile=/dev/null', + # Don't re-use the SSH connection. Less failures. + '-oControlPath=none' + ] + if 'key_filename' in kwargs: + # There should never be both a password and an ssh key passed in, so + ssh_args.extend([ + # tell SSH to skip password authentication + '-oPasswordAuthentication=no', + '-oChallengeResponseAuthentication=no', + # Make sure public key authentication is enabled + '-oPubkeyAuthentication=yes', + # No Keyboard interaction! + '-oKbdInteractiveAuthentication=no', + # Also, specify the location of the key file + '-i {0}'.format(kwargs['key_filename']) + ]) + + cmd = 'echo "put {0} {1}" | sftp {2} {3[username]}@{3[hostname]}'.format( + tmppath, dest_path, ' '.join(ssh_args), kwargs + ) + + log.debug('Upload file command command: {0!r}'.format(cmd)) + + try: + proc = vt.Terminal( + cmd, + shell=True, + log_stdout=True, + log_stderr=True, + stream_stdout=kwargs.get('display_ssh_output', True), + stream_stderr=kwargs.get('display_ssh_output', True) + ) + log.debug('Uploading file(PID {0}): {1!r}'.format(proc.pid, dest_path)) + + sent_password = 0 + while True: + stdout, stderr = proc.recv() + if stdout and SSH_PASSWORD_PROMP_RE.match(stdout): + if sent_password > 2: + # 3rd time??? Wrong password? + log.warning( + 'Asking for password again. Wrong one provided???' + ) + return 1 + + proc.sendline(kwargs['password']) + sent_password += 1 + if not proc.isalive(): + break + time.sleep(0.025) + if allow_failure is False and proc.exitstatus != 0: raise SaltCloudSystemExit( 'Failed to upload {0} to {1}. Exit code: {2}'.format( tmppath, dest_path, proc.exitstatus @@ -1005,6 +1090,8 @@ ), exc_info=True ) + finally: + proc.close(force=True) # Signal an error return 1 @@ -1127,7 +1214,7 @@ ) sent_password = False - while proc.isalive(): + while True: stdout, stderr = proc.recv() if stdout and SSH_PASSWORD_PROMP_RE.match(stdout): if sent_password: @@ -1135,15 +1222,14 @@ log.warning( 'Asking for password again. Wrong one provided???' ) - proc.terminate() return 1 proc.sendline(kwargs['password']) sent_password = True + if not proc.isalive(): + break time.sleep(0.025) - - proc.close(force=True) return proc.exitstatus except vt.TerminalException as err: log.error( @@ -1152,6 +1238,8 @@ ), exc_info=True ) + finally: + proc.close(force=True) # Signal an error return 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/tests/integration/files/file/base/dest_sym new/salt-2014.1.13/tests/integration/files/file/base/dest_sym --- old/salt-2014.1.11/tests/integration/files/file/base/dest_sym 2014-06-17 21:18:30.000000000 +0200 +++ new/salt-2014.1.13/tests/integration/files/file/base/dest_sym 2014-10-23 14:21:20.000000000 +0200 @@ -0,0 +1 @@ +symbolic link to source_sym diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/salt-2014.1.11/tests/integration/states/pkg.py new/salt-2014.1.13/tests/integration/states/pkg.py --- old/salt-2014.1.11/tests/integration/states/pkg.py 2014-09-09 22:42:17.000000000 +0200 +++ new/salt-2014.1.13/tests/integration/states/pkg.py 2014-10-15 17:21:54.000000000 +0200 @@ -229,6 +229,11 @@ os_name = grains.get('os', '') target = _PKG_TARGETS_32.get(os_name, '') + if os_name == 'CentOS' and grains['osrelease'].startswith('6'): + self.skipTest( + 'This test is running unreliably on CentOS 6. Skipping.' + ) + # _PKG_TARGETS_32 is only populated for platforms for which Salt has to # munge package names for 32-bit-on-x86_64 (Currently only Ubuntu and # RHEL-based). Don't actually perform this test on other platforms. ++++++ use-forking-daemon.patch ++++++ --- /var/tmp/diff_new_pack.WFclNl/_old 2014-10-23 14:21:21.000000000 +0200 +++ /var/tmp/diff_new_pack.WFclNl/_new 2014-10-23 14:21:21.000000000 +0200 @@ -1,7 +1,7 @@ Index: salt-2014.1.8/pkg/salt-master.service =================================================================== ---- salt-2014.1.11.orig/pkg/salt-master.service -+++ salt-2014.1.11/pkg/salt-master.service +--- salt-2014.1.13.orig/pkg/salt-master.service ++++ salt-2014.1.13/pkg/salt-master.service @@ -3,8 +3,10 @@ Description=The Salt Master Server After=syslog.target network.target -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
