Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:tulip
salt
fix-for-some-cves-bsc1181550.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File fix-for-some-cves-bsc1181550.patch of Package salt
From a74b74a640da563618783f309fe1eef391a98f41 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" <dwozniak@vmware.com> Date: Fri, 29 Jan 2021 14:30:27 -0700 Subject: [PATCH] Fix for some cves bsc1181550 CVE-2020-28243 CVE-2020-28972 CVE-2020-35662 CVE-2021-3148 CVE-2021-3144 CVE-2021-25281 CVE-2021-25282 CVE-2021-25283 CVE-2021-25284 CVE-2021-3197 --- salt/auth/__init__.py | 1 + salt/client/mixins.py | 71 ++-- salt/client/ssh/client.py | 46 +++ salt/cloud/clouds/qingcloud.py | 57 +-- salt/cloud/clouds/vmware.py | 158 ++++---- salt/config/schemas/vcenter.py | 8 +- salt/master.py | 2 +- salt/modules/bigip.py | 25 +- salt/modules/cmdmod.py | 29 +- salt/modules/glassfish.py | 32 +- salt/modules/keystone.py | 148 ++++---- salt/modules/restartcheck.py | 4 +- salt/modules/vsphere.py | 660 ++++++++++++++++++++++++++++----- salt/modules/zenoss.py | 26 +- salt/pillar/vmware_pillar.py | 26 +- salt/proxy/cimc.py | 31 +- salt/proxy/panos.py | 28 +- salt/proxy/vcenter.py | 6 +- salt/returners/splunk.py | 34 +- salt/runners/asam.py | 19 +- salt/states/esxi.py | 228 ++++++------ salt/utils/http.py | 20 + salt/utils/thin.py | 4 +- salt/utils/vmware.py | 128 ++++--- salt/wheel/__init__.py | 12 +- salt/wheel/pillar_roots.py | 21 +- 26 files changed, 1201 insertions(+), 623 deletions(-) diff --git a/salt/auth/__init__.py b/salt/auth/__init__.py index 22c54e8048..56f8bd57c8 100644 --- a/salt/auth/__init__.py +++ b/salt/auth/__init__.py @@ -270,6 +270,7 @@ class LoadAuth: if rm_tok: self.rm_token(tok) + return {} return tdata diff --git a/salt/client/mixins.py b/salt/client/mixins.py index b33ee54f27..6f408adbba 100644 --- a/salt/client/mixins.py +++ b/salt/client/mixins.py @@ -1,10 +1,7 @@ -# coding: utf-8 """ A collection of mixins useful for the various *Client interfaces """ -# Import Python libs -from __future__ import absolute_import, print_function, unicode_literals, with_statement import copy as pycopy import fnmatch @@ -14,10 +11,7 @@ import traceback import weakref from collections.abc import Mapping, MutableMapping -# Import Salt libs import salt.exceptions - -# Import 3rd-party libs import salt.ext.tornado.stack_context import salt.log.setup import salt.minion @@ -122,7 +116,7 @@ class ClientFuncsDict(MutableMapping): return iter(self.client.functions) -class SyncClientMixin(object): +class SyncClientMixin: """ A mixin for *Client interfaces to abstract common function execution """ @@ -182,7 +176,7 @@ class SyncClientMixin(object): ) if ret is None: raise salt.exceptions.SaltClientTimeout( - "RunnerClient job '{0}' timed out".format(job["jid"]), + "RunnerClient job '{}' timed out".format(job["jid"]), jid=job["jid"], ) @@ -281,7 +275,7 @@ class SyncClientMixin(object): return True try: - return self.opts["{0}_returns".format(class_name)] + return self.opts["{}_returns".format(class_name)] except KeyError: # No such option, assume this isn't one we care about gating and # just return True. @@ -308,7 +302,7 @@ class SyncClientMixin(object): tag = low.get("__tag__", salt.utils.event.tagify(jid, prefix=self.tag_prefix)) data = { - "fun": "{0}.{1}".format(self.client, fun), + "fun": "{}.{}".format(self.client, fun), "jid": jid, "user": low.get("__user__", "UNKNOWN"), } @@ -353,14 +347,14 @@ class SyncClientMixin(object): # namespace only once per module-- not per func completed_funcs = [] - for mod_name in six.iterkeys(self_functions): + for mod_name in self_functions.keys(): if "." not in mod_name: continue mod, _ = mod_name.split(".", 1) if mod in completed_funcs: continue completed_funcs.append(mod) - for global_key, value in six.iteritems(func_globals): + for global_key, value in func_globals.items(): self.functions[mod_name].__globals__[global_key] = value # There are some discrepancies of what a "low" structure is in the @@ -398,7 +392,7 @@ class SyncClientMixin(object): except TypeError as exc: data[ "return" - ] = "\nPassed invalid arguments: {0}\n\nUsage:\n{1}".format( + ] = "\nPassed invalid arguments: {}\n\nUsage:\n{}".format( exc, func.__doc__ ) try: @@ -413,9 +407,9 @@ class SyncClientMixin(object): ) except (Exception, SystemExit) as ex: # pylint: disable=broad-except if isinstance(ex, salt.exceptions.NotImplemented): - data["return"] = six.text_type(ex) + data["return"] = str(ex) else: - data["return"] = "Exception occurred in {0} {1}: {2}".format( + data["return"] = "Exception occurred in {} {}: {}".format( self.client, fun, traceback.format_exc(), ) data["success"] = False @@ -477,7 +471,7 @@ class SyncClientMixin(object): return salt.utils.doc.strip_rst(docs) -class AsyncClientMixin(object): +class AsyncClientMixin: """ A mixin for *Client interfaces to enable easy asynchronous function execution """ @@ -485,10 +479,34 @@ class AsyncClientMixin(object): client = None tag_prefix = None + def _proc_function_remote(self, fun, low, user, tag, jid, daemonize=True): + """ + Run this method in a multiprocess target to execute the function on the + master and fire the return data on the event bus + """ + if daemonize and not salt.utils.platform.is_windows(): + # Shutdown the multiprocessing before daemonizing + salt.log.setup.shutdown_multiprocessing_logging() + + salt.utils.process.daemonize() + + # Reconfigure multiprocessing logging after daemonizing + salt.log.setup.setup_multiprocessing_logging() + + # pack a few things into low + low["__jid__"] = jid + low["__user__"] = user + low["__tag__"] = tag + + try: + return self.cmd_sync(low) + except salt.exceptions.EauthAuthenticationError as exc: + log.error(exc) + def _proc_function(self, fun, low, user, tag, jid, daemonize=True): """ - Run this method in a multiprocess target to execute the function in a - multiprocess and fire the return data on the event bus + Run this method in a multiprocess target to execute the function + locally and fire the return data on the event bus """ if daemonize and not salt.utils.platform.is_windows(): # Shutdown the multiprocessing before daemonizing @@ -504,7 +522,7 @@ class AsyncClientMixin(object): low["__user__"] = user low["__tag__"] = tag - return self.low(fun, low, full_return=False) + return self.low(fun, low) def cmd_async(self, low): """ @@ -532,14 +550,18 @@ class AsyncClientMixin(object): tag = salt.utils.event.tagify(jid, prefix=self.tag_prefix) return {"tag": tag, "jid": jid} - def asynchronous(self, fun, low, user="UNKNOWN", pub=None): + def asynchronous(self, fun, low, user="UNKNOWN", pub=None, local=True): """ Execute the function in a multiprocess and return the event tag to use to watch for the return """ + if local: + proc_func = self._proc_function + else: + proc_func = self._proc_function_remote async_pub = pub if pub is not None else self._gen_async_pub() proc = salt.utils.process.SignalHandlingProcess( - target=self._proc_function, + target=proc_func, name="ProcessFunc", args=(fun, low, user, async_pub["tag"], async_pub["jid"]), ) @@ -577,9 +599,10 @@ class AsyncClientMixin(object): if suffix == "ret": # Check if outputter was passed in the return data. If this is the case, # then the return data will be a dict two keys: 'data' and 'outputter' - if isinstance(event.get("return"), dict) and set(event["return"]) == set( - ("data", "outputter") - ): + if isinstance(event.get("return"), dict) and set(event["return"]) == { + "data", + "outputter", + }: event_data = event["return"]["data"] outputter = event["return"]["outputter"] else: diff --git a/salt/client/ssh/client.py b/salt/client/ssh/client.py index d2dbdeb00e..2cf42f53e7 100644 --- a/salt/client/ssh/client.py +++ b/salt/client/ssh/client.py @@ -43,12 +43,58 @@ class SSHClient: # Salt API should never offer a custom roster! self.opts["__disable_custom_roster"] = disable_custom_roster + def sanitize_kwargs(self, kwargs): + roster_vals = [ + ("host", str), + ("ssh_user", str), + ("ssh_passwd", str), + ("ssh_port", int), + ("ssh_sudo", bool), + ("ssh_sudo_user", str), + ("ssh_priv", str), + ("ssh_priv_passwd", str), + ("ssh_identities_only", bool), + ("ssh_remote_port_forwards", str), + ("ssh_options", list), + ("roster_file", str), + ("rosters", list), + ("ignore_host_keys", bool), + ("raw_shell", bool), + ] + sane_kwargs = {} + for name, kind in roster_vals: + if name not in kwargs: + continue + try: + val = kind(kwargs[name]) + except ValueError: + log.warn("Unable to cast kwarg %s", name) + continue + if kind is bool or kind is int: + sane_kwargs[name] = val + elif kind is str: + if val.find("ProxyCommand") != -1: + log.warn("Filter unsafe value for kwarg %s", name) + continue + sane_kwargs[name] = val + elif kind is list: + sane_val = [] + for item in val: + # This assumes the values are strings + if item.find("ProxyCommand") != -1: + log.warn("Filter unsafe value for kwarg %s", name) + continue + sane_val.append(item) + sane_kwargs[name] = sane_val + return sane_kwargs + def _prep_ssh( self, tgt, fun, arg=(), timeout=None, tgt_type="glob", kwarg=None, **kwargs ): """ Prepare the arguments """ + kwargs = self.sanitize_kwargs(kwargs) opts = copy.deepcopy(self.opts) opts.update(kwargs) if timeout: diff --git a/salt/cloud/clouds/qingcloud.py b/salt/cloud/clouds/qingcloud.py index b388840dd5..f4632e167c 100644 --- a/salt/cloud/clouds/qingcloud.py +++ b/salt/cloud/clouds/qingcloud.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ QingCloud Cloud Module ====================== @@ -26,8 +25,6 @@ Set up the cloud configuration at ``/etc/salt/cloud.providers`` or :depends: requests """ -# Import python libs -from __future__ import absolute_import, print_function, unicode_literals import base64 import hmac @@ -46,13 +43,9 @@ from salt.exceptions import ( SaltCloudNotFound, SaltCloudSystemExit, ) - -# Import Salt Libs -from salt.ext import six from salt.ext.six.moves import range from salt.ext.six.moves.urllib.parse import quote as _quote -# Import Third Party Libs try: import requests @@ -110,12 +103,12 @@ def _compute_signature(parameters, access_key_secret, method, path): """ parameters["signature_method"] = "HmacSHA256" - string_to_sign = "{0}\n{1}\n".format(method.upper(), path) + string_to_sign = "{}\n{}\n".format(method.upper(), path) keys = sorted(parameters.keys()) pairs = [] for key in keys: - val = six.text_type(parameters[key]).encode("utf-8") + val = str(parameters[key]).encode("utf-8") pairs.append(_quote(key, safe="") + "=" + _quote(val, safe="-_~")) qs = "&".join(pairs) string_to_sign += qs @@ -141,6 +134,14 @@ def query(params=None): "secret_access_key", get_configured_provider(), __opts__, search_global=False ) + verify_ssl = config.get_cloud_config_value( + "verify_ssl", + get_configured_provider(), + __opts__, + default=True, + search_global=False, + ) + # public interface parameters real_parameters = { "access_key_id": access_key_id, @@ -158,9 +159,9 @@ def query(params=None): for sk, sv in value[i - 1].items(): if isinstance(sv, dict) or isinstance(sv, list): sv = salt.utils.json.dumps(sv, separators=(",", ":")) - real_parameters["{0}.{1}.{2}".format(key, i, sk)] = sv + real_parameters["{}.{}.{}".format(key, i, sk)] = sv else: - real_parameters["{0}.{1}".format(key, i)] = value[i - 1] + real_parameters["{}.{}".format(key, i)] = value[i - 1] else: real_parameters[key] = value @@ -171,15 +172,15 @@ def query(params=None): # print('parameters:') # pprint.pprint(real_parameters) - request = requests.get(path, params=real_parameters, verify=False) + request = requests.get(path, params=real_parameters, verify=verify_ssl) # print('url:') # print(request.url) if request.status_code != 200: raise SaltCloudSystemExit( - "An error occurred while querying QingCloud. HTTP Code: {0} " - "Error: '{1}'".format(request.status_code, request.text) + "An error occurred while querying QingCloud. HTTP Code: {} " + "Error: '{}'".format(request.status_code, request.text) ) log.debug(request.url) @@ -222,7 +223,7 @@ def avail_locations(call=None): for region in items["zone_set"]: result[region["zone_id"]] = {} for key in region: - result[region["zone_id"]][key] = six.text_type(region[key]) + result[region["zone_id"]][key] = str(region[key]) return result @@ -233,7 +234,7 @@ def _get_location(vm_=None): """ locations = avail_locations() - vm_location = six.text_type( + vm_location = str( config.get_cloud_config_value("zone", vm_, __opts__, search_global=False) ) @@ -244,7 +245,7 @@ def _get_location(vm_=None): return vm_location raise SaltCloudNotFound( - "The specified location, '{0}', could not be found.".format(vm_location) + "The specified location, '{}', could not be found.".format(vm_location) ) @@ -302,7 +303,7 @@ def _get_image(vm_): Return the VM's image. Used by create(). """ images = avail_images() - vm_image = six.text_type( + vm_image = str( config.get_cloud_config_value("image", vm_, __opts__, search_global=False) ) @@ -313,7 +314,7 @@ def _get_image(vm_): return vm_image raise SaltCloudNotFound( - "The specified image, '{0}', could not be found.".format(vm_image) + "The specified image, '{}', could not be found.".format(vm_image) ) @@ -424,7 +425,7 @@ def _get_size(vm_): """ sizes = avail_sizes() - vm_size = six.text_type( + vm_size = str( config.get_cloud_config_value("size", vm_, __opts__, search_global=False) ) @@ -435,7 +436,7 @@ def _get_size(vm_): return vm_size raise SaltCloudNotFound( - "The specified size, '{0}', could not be found.".format(vm_size) + "The specified size, '{}', could not be found.".format(vm_size) ) @@ -616,7 +617,7 @@ def show_instance(instance_id, call=None, kwargs=None): if items["total_count"] == 0: raise SaltCloudNotFound( - "The specified instance, '{0}', could not be found.".format(instance_id) + "The specified instance, '{}', could not be found.".format(instance_id) ) full_node = items["instance_set"][0] @@ -668,7 +669,7 @@ def create(vm_): __utils__["cloud.fire_event"]( "event", "starting create", - "salt/cloud/{0}/creating".format(vm_["name"]), + "salt/cloud/{}/creating".format(vm_["name"]), args=__utils__["cloud.filter_event"]( "creating", vm_, ["name", "profile", "provider", "driver"] ), @@ -693,7 +694,7 @@ def create(vm_): __utils__["cloud.fire_event"]( "event", "requesting instance", - "salt/cloud/{0}/requesting".format(vm_["name"]), + "salt/cloud/{}/requesting".format(vm_["name"]), args={ "kwargs": __utils__["cloud.filter_event"]( "requesting", params, list(params) @@ -724,7 +725,7 @@ def create(vm_): except SaltCloudSystemExit: pass finally: - raise SaltCloudSystemExit(six.text_type(exc)) + raise SaltCloudSystemExit(str(exc)) private_ip = data["private_ips"][0] @@ -742,7 +743,7 @@ def create(vm_): __utils__["cloud.fire_event"]( "event", "created instance", - "salt/cloud/{0}/created".format(vm_["name"]), + "salt/cloud/{}/created".format(vm_["name"]), args=__utils__["cloud.filter_event"]( "created", vm_, ["name", "profile", "provider", "driver"] ), @@ -868,7 +869,7 @@ def destroy(instance_id, call=None): __utils__["cloud.fire_event"]( "event", "destroying instance", - "salt/cloud/{0}/destroying".format(name), + "salt/cloud/{}/destroying".format(name), args={"name": name}, sock_dir=__opts__["sock_dir"], transport=__opts__["transport"], @@ -884,7 +885,7 @@ def destroy(instance_id, call=None): __utils__["cloud.fire_event"]( "event", "destroyed instance", - "salt/cloud/{0}/destroyed".format(name), + "salt/cloud/{}/destroyed".format(name), args={"name": name}, sock_dir=__opts__["sock_dir"], transport=__opts__["transport"], diff --git a/salt/cloud/clouds/vmware.py b/salt/cloud/clouds/vmware.py index edaca9618b..851579bf74 100644 --- a/salt/cloud/clouds/vmware.py +++ b/salt/cloud/clouds/vmware.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # pylint: disable=C0302 """ VMware Cloud Module @@ -114,8 +113,6 @@ To test the connection for ``my-vmware-config`` specified in the cloud configuration, run :py:func:`test_vcenter_connection` """ -# Import python libs -from __future__ import absolute_import, print_function, unicode_literals import logging import os.path @@ -125,10 +122,7 @@ import subprocess import time from random import randint -# Import salt cloud libs import salt.config as config - -# Import salt libs import salt.utils.cloud import salt.utils.network import salt.utils.stringutils @@ -136,9 +130,6 @@ import salt.utils.vmware import salt.utils.xmlutil from salt.exceptions import SaltCloudSystemExit -# Import 3rd-party libs -from salt.ext import six - try: # Attempt to import pyVmomi libs from pyVmomi import vim # pylint: disable=no-name-in-module @@ -230,7 +221,7 @@ def _str_to_bool(var): if isinstance(var, bool): return var - if isinstance(var, six.string_types): + if isinstance(var, str): return True if var.lower() == "true" else False return None @@ -260,9 +251,15 @@ def _get_si(): port = config.get_cloud_config_value( "port", get_configured_provider(), __opts__, search_global=False, default=443 ) - + verify_ssl = config.get_cloud_config_value( + "verify_ssl", + get_configured_provider(), + __opts__, + search_global=False, + default=True, + ) return salt.utils.vmware.get_service_instance( - url, username, password, protocol=protocol, port=port + url, username, password, protocol=protocol, port=port, verify_ssl=verify_ssl ) @@ -299,7 +296,7 @@ def _add_new_hard_disk_helper( disk_spec.device.key = random_key disk_spec.device.deviceInfo = vim.Description() disk_spec.device.deviceInfo.label = disk_label - disk_spec.device.deviceInfo.summary = "{0} GB".format(size_gb) + disk_spec.device.deviceInfo.summary = "{} GB".format(size_gb) disk_spec.device.backing = vim.vm.device.VirtualDisk.FlatVer2BackingInfo() disk_spec.device.backing.thinProvisioned = thin_provision @@ -320,7 +317,7 @@ def _add_new_hard_disk_helper( if not datastore_cluster_ref: # datastore/datastore cluster specified does not exist raise SaltCloudSystemExit( - "Specified datastore/datastore cluster ({0}) for disk ({1}) does not exist".format( + "Specified datastore/datastore cluster ({}) for disk ({}) does not exist".format( datastore, disk_label ) ) @@ -351,12 +348,12 @@ def _add_new_hard_disk_helper( if not datastore_ref: # datastore cluster specified does not have any accessible datastores raise SaltCloudSystemExit( - "Specified datastore cluster ({0}) for disk ({1}) does not have any accessible datastores available".format( + "Specified datastore cluster ({}) for disk ({}) does not have any accessible datastores available".format( datastore, disk_label ) ) - datastore_path = "[" + six.text_type(datastore_ref.name) + "] " + vm_name + datastore_path = "[" + str(datastore_ref.name) + "] " + vm_name disk_spec.device.backing.fileName = datastore_path + "/" + disk_label + ".vmdk" disk_spec.device.backing.datastore = datastore_ref log.trace( @@ -429,11 +426,11 @@ def _edit_existing_network_adapter( else: # If switch type not specified or does not match, show error and return if not switch_type: - err_msg = "The switch type to be used by '{0}' has not been specified".format( + err_msg = "The switch type to be used by '{}' has not been specified".format( network_adapter.deviceInfo.label ) else: - err_msg = "Cannot create '{0}'. Invalid/unsupported switch type '{1}'".format( + err_msg = "Cannot create '{}'. Invalid/unsupported switch type '{}'".format( network_adapter.deviceInfo.label, switch_type ) raise SaltCloudSystemExit(err_msg) @@ -516,11 +513,11 @@ def _add_new_network_adapter_helper( else: # If switch type not specified or does not match, show error and return if not switch_type: - err_msg = "The switch type to be used by '{0}' has not been specified".format( + err_msg = "The switch type to be used by '{}' has not been specified".format( network_adapter_label ) else: - err_msg = "Cannot create '{0}'. Invalid/unsupported switch type '{1}'".format( + err_msg = "Cannot create '{}'. Invalid/unsupported switch type '{}'".format( network_adapter_label, switch_type ) raise SaltCloudSystemExit(err_msg) @@ -572,11 +569,11 @@ def _add_new_scsi_controller_helper(scsi_controller_label, properties, bus_numbe else: # If type not specified or does not match, show error and return if not adapter_type: - err_msg = "The type of '{0}' has not been specified".format( + err_msg = "The type of '{}' has not been specified".format( scsi_controller_label ) else: - err_msg = "Cannot create '{0}'. Invalid/unsupported type '{1}'".format( + err_msg = "Cannot create '{}'. Invalid/unsupported type '{}'".format( scsi_controller_label, adapter_type ) raise SaltCloudSystemExit(err_msg) @@ -653,7 +650,7 @@ def _set_cd_or_dvd_backing_type(drive, device_type, mode, iso_path): if datastore_ref: drive.backing.datastore = datastore_ref - drive.deviceInfo.summary = "ISO {0}".format(iso_path) + drive.deviceInfo.summary = "ISO {}".format(iso_path) elif device_type == "client_device": if mode == "passthrough": @@ -735,8 +732,8 @@ def _set_network_adapter_mapping(adapter_specs): gateway = adapter_specs["gateway"] adapter_mapping.adapter.gateway = gateway if "ip" in list(adapter_specs.keys()): - ip = six.text_type(adapter_specs["ip"]) - subnet_mask = six.text_type(adapter_specs["subnet_mask"]) + ip = str(adapter_specs["ip"]) + subnet_mask = str(adapter_specs["subnet_mask"]) adapter_mapping.adapter.ip = vim.vm.customization.FixedIp(ipAddress=ip) adapter_mapping.adapter.subnetMask = subnet_mask else: @@ -823,8 +820,8 @@ def _manage_devices(devices, vm=None, container_ref=None, new_vm_name=None): if device.capacityInKB > size_kb: raise SaltCloudSystemExit( - "The specified disk size '{0}GB' for '{1}' is " - "smaller than the disk image size '{2}GB'. It must " + "The specified disk size '{}GB' for '{}' is " + "smaller than the disk image size '{}GB'. It must " "be equal to or greater than the disk image".format( float( devices["disk"][device.deviceInfo.label]["size"] @@ -908,7 +905,7 @@ def _manage_devices(devices, vm=None, container_ref=None, new_vm_name=None): else None ) if bus_sharing and bus_sharing in ["virtual", "physical", "no"]: - bus_sharing = "{0}Sharing".format(bus_sharing) + bus_sharing = "{}Sharing".format(bus_sharing) if bus_sharing != device.sharedBus: # Only edit the SCSI controller if bus_sharing is different scsi_spec = _edit_existing_scsi_controller( @@ -1112,7 +1109,7 @@ def _manage_devices(devices, vm=None, container_ref=None, new_vm_name=None): ide_controllers[controller_key] = 0 break else: - for ide_controller_key, num_devices in six.iteritems(ide_controllers): + for ide_controller_key, num_devices in ide_controllers.items(): if num_devices < 2: controller_key = ide_controller_key break @@ -1145,10 +1142,7 @@ def _wait_for_vmware_tools(vm_ref, max_wait): vm_ref.name, time_counter, ) - if ( - six.text_type(vm_ref.summary.guest.toolsRunningStatus) - == "guestToolsRunning" - ): + if str(vm_ref.summary.guest.toolsRunningStatus) == "guestToolsRunning": log.info( "[ %s ] Successfully got VMware tools running on the guest in " "%s seconds", @@ -1314,23 +1308,21 @@ def _format_instance_info_select(vm, selection): vm_select_info["id"] = vm["name"] if "image" in selection: - vm_select_info["image"] = "{0} (Detected)".format( + vm_select_info["image"] = "{} (Detected)".format( defaultto(vm, "config.guestFullName") ) if "size" in selection: cpu = defaultto(vm, "config.hardware.numCPU") - ram = "{0} MB".format(defaultto(vm, "config.hardware.memoryMB")) - vm_select_info["size"] = "cpu: {0}\nram: {1}".format(cpu, ram) + ram = "{} MB".format(defaultto(vm, "config.hardware.memoryMB")) + vm_select_info["size"] = "cpu: {}\nram: {}".format(cpu, ram) vm_select_info["size_dict"] = { "cpu": cpu, "memory": ram, } if "state" in selection: - vm_select_info["state"] = six.text_type( - defaultto(vm, "summary.runtime.powerState") - ) + vm_select_info["state"] = str(defaultto(vm, "summary.runtime.powerState")) if "guest_id" in selection: vm_select_info["guest_id"] = defaultto(vm, "config.guestId") @@ -1342,9 +1334,7 @@ def _format_instance_info_select(vm, selection): vm_select_info["path"] = defaultto(vm, "config.files.vmPathName") if "tools_status" in selection: - vm_select_info["tools_status"] = six.text_type( - defaultto(vm, "guest.toolsStatus") - ) + vm_select_info["tools_status"] = str(defaultto(vm, "guest.toolsStatus")) if "private_ips" in selection or "networks" in selection: network_full_info = {} @@ -1585,18 +1575,18 @@ def _format_instance_info(vm): cpu = vm["config.hardware.numCPU"] if "config.hardware.numCPU" in vm else "N/A" ram = ( - "{0} MB".format(vm["config.hardware.memoryMB"]) + "{} MB".format(vm["config.hardware.memoryMB"]) if "config.hardware.memoryMB" in vm else "N/A" ) vm_full_info = { - "id": six.text_type(vm["name"]), - "image": "{0} (Detected)".format(vm["config.guestFullName"]) + "id": str(vm["name"]), + "image": "{} (Detected)".format(vm["config.guestFullName"]) if "config.guestFullName" in vm else "N/A", - "size": "cpu: {0}\nram: {1}".format(cpu, ram), + "size": "cpu: {}\nram: {}".format(cpu, ram), "size_dict": {"cpu": cpu, "memory": ram}, - "state": six.text_type(vm["summary.runtime.powerState"]) + "state": str(vm["summary.runtime.powerState"]) if "summary.runtime.powerState" in vm else "N/A", "private_ips": ip_addresses, @@ -1604,16 +1594,14 @@ def _format_instance_info(vm): "devices": device_full_info, "storage": storage_full_info, "files": file_full_info, - "guest_id": six.text_type(vm["config.guestId"]) - if "config.guestId" in vm - else "N/A", - "hostname": six.text_type(vm["object"].guest.hostName), + "guest_id": str(vm["config.guestId"]) if "config.guestId" in vm else "N/A", + "hostname": str(vm["object"].guest.hostName), "mac_addresses": device_mac_addresses, "networks": network_full_info, - "path": six.text_type(vm["config.files.vmPathName"]) + "path": str(vm["config.files.vmPathName"]) if "config.files.vmPathName" in vm else "N/A", - "tools_status": six.text_type(vm["guest.toolsStatus"]) + "tools_status": str(vm["guest.toolsStatus"]) if "guest.toolsStatus" in vm else "N/A", } @@ -1624,11 +1612,11 @@ def _format_instance_info(vm): def _get_snapshots(snapshot_list, current_snapshot=None, parent_snapshot_path=""): snapshots = {} for snapshot in snapshot_list: - snapshot_path = "{0}/{1}".format(parent_snapshot_path, snapshot.name) + snapshot_path = "{}/{}".format(parent_snapshot_path, snapshot.name) snapshots[snapshot_path] = { "name": snapshot.name, "description": snapshot.description, - "created": six.text_type(snapshot.createTime).split(".")[0], + "created": str(snapshot.createTime).split(".")[0], "state": snapshot.state, "path": snapshot_path, } @@ -1760,7 +1748,7 @@ def test_vcenter_connection(kwargs=None, call=None): # Get the service instance object _get_si() except Exception as exc: # pylint: disable=broad-except - return "failed to connect: {0}".format(exc) + return "failed to connect: {}".format(exc) return "connection successful" @@ -2000,18 +1988,18 @@ def list_nodes(kwargs=None, call=None): for vm in vm_list: cpu = vm["config.hardware.numCPU"] if "config.hardware.numCPU" in vm else "N/A" ram = ( - "{0} MB".format(vm["config.hardware.memoryMB"]) + "{} MB".format(vm["config.hardware.memoryMB"]) if "config.hardware.memoryMB" in vm else "N/A" ) vm_info = { "id": vm["name"], - "image": "{0} (Detected)".format(vm["config.guestFullName"]) + "image": "{} (Detected)".format(vm["config.guestFullName"]) if "config.guestFullName" in vm else "N/A", - "size": "cpu: {0}\nram: {1}".format(cpu, ram), + "size": "cpu: {}\nram: {}".format(cpu, ram), "size_dict": {"cpu": cpu, "memory": ram}, - "state": six.text_type(vm["summary.runtime.powerState"]) + "state": str(vm["summary.runtime.powerState"]) if "summary.runtime.powerState" in vm else "N/A", "private_ips": [vm["guest.ipAddress"]] if "guest.ipAddress" in vm else [], @@ -2660,7 +2648,7 @@ def destroy(name, call=None): __utils__["cloud.fire_event"]( "event", "destroying instance", - "salt/cloud/{0}/destroying".format(name), + "salt/cloud/{}/destroying".format(name), args={"name": name}, sock_dir=__opts__["sock_dir"], transport=__opts__["transport"], @@ -2706,7 +2694,7 @@ def destroy(name, call=None): __utils__["cloud.fire_event"]( "event", "destroyed instance", - "salt/cloud/{0}/destroyed".format(name), + "salt/cloud/{}/destroyed".format(name), args={"name": name}, sock_dir=__opts__["sock_dir"], transport=__opts__["transport"], @@ -2748,7 +2736,7 @@ def create(vm_): __utils__["cloud.fire_event"]( "event", "starting create", - "salt/cloud/{0}/creating".format(vm_["name"]), + "salt/cloud/{}/creating".format(vm_["name"]), args=__utils__["cloud.filter_event"]( "creating", vm_, ["name", "profile", "provider", "driver"] ), @@ -2825,10 +2813,10 @@ def create(vm_): "win_run_once", vm_, __opts__, search_global=False, default=None ) cpu_hot_add = config.get_cloud_config_value( - 'cpu_hot_add', vm_, __opts__, search_global=False, default=None + "cpu_hot_add", vm_, __opts__, search_global=False, default=None ) mem_hot_add = config.get_cloud_config_value( - 'mem_hot_add', vm_, __opts__, search_global=False, default=None + "mem_hot_add", vm_, __opts__, search_global=False, default=None ) # Get service instance object @@ -2988,7 +2976,7 @@ def create(vm_): ) if not datastore_ref: raise SaltCloudSystemExit( - "Specified datastore: '{0}' does not exist".format(datastore) + "Specified datastore: '{}' does not exist".format(datastore) ) if host: @@ -3004,7 +2992,7 @@ def create(vm_): # If the hardware version is specified and if it is different from the current # hardware version, then schedule a hardware version upgrade if hardware_version and object_ref is not None: - hardware_version = "vmx-{0:02}".format(hardware_version) + hardware_version = "vmx-{:02}".format(hardware_version) if hardware_version != object_ref.config.version: log.debug( "Scheduling hardware version upgrade from %s to %s", @@ -3034,7 +3022,7 @@ def create(vm_): elif memory_unit.lower() == "gb": memory_mb = int(float(memory_num) * 1024.0) else: - err_msg = "Invalid memory type specified: '{0}'".format(memory_unit) + err_msg = "Invalid memory type specified: '{}'".format(memory_unit) log.error(err_msg) return {"Error": err_msg} except (TypeError, ValueError): @@ -3048,19 +3036,19 @@ def create(vm_): ) config_spec.deviceChange = specs["device_specs"] - if cpu_hot_add and hasattr(config_spec, 'cpuHotAddEnabled'): + if cpu_hot_add and hasattr(config_spec, "cpuHotAddEnabled"): config_spec.cpuHotAddEnabled = bool(cpu_hot_add) - if mem_hot_add and hasattr(config_spec, 'memoryHotAddEnabled'): + if mem_hot_add and hasattr(config_spec, "memoryHotAddEnabled"): config_spec.memoryHotAddEnabled = bool(mem_hot_add) if extra_config: - for key, value in six.iteritems(extra_config): + for key, value in extra_config.items(): option = vim.option.OptionValue(key=key, value=value) config_spec.extraConfig.append(option) if annotation: - config_spec.annotation = six.text_type(annotation) + config_spec.annotation = str(annotation) if "clonefrom" in vm_: clone_spec = handle_snapshot(config_spec, object_ref, reloc_spec, template, vm_) @@ -3137,7 +3125,7 @@ def create(vm_): __utils__["cloud.fire_event"]( "event", "requesting instance", - "salt/cloud/{0}/requesting".format(vm_["name"]), + "salt/cloud/{}/requesting".format(vm_["name"]), args=__utils__["cloud.filter_event"]( "requesting", event_kwargs, list(event_kwargs) ), @@ -3190,7 +3178,7 @@ def create(vm_): task = folder_ref.CreateVM_Task(config_spec, resourcepool_ref) salt.utils.vmware.wait_for_task(task, vm_name, "create", 15, "info") except Exception as exc: # pylint: disable=broad-except - err_msg = "Error creating {0}: {1}".format(vm_["name"], exc) + err_msg = "Error creating {}: {}".format(vm_["name"], exc) log.error( err_msg, # Show the traceback if the debug logging level is enabled @@ -3235,7 +3223,7 @@ def create(vm_): __utils__["cloud.fire_event"]( "event", "created instance", - "salt/cloud/{0}/created".format(vm_["name"]), + "salt/cloud/{}/created".format(vm_["name"]), args=__utils__["cloud.filter_event"]( "created", vm_, ["name", "profile", "provider", "driver"] ), @@ -3267,7 +3255,7 @@ def handle_snapshot(config_spec, object_ref, reloc_spec, template, vm_): raise SaltCloudSystemExit( "Invalid disk move type specified" " supported types are" - " {0}".format(" ".join(allowed_types)) + " {}".format(" ".join(allowed_types)) ) return clone_spec @@ -3470,7 +3458,7 @@ def rescan_hba(kwargs=None, call=None): if hba: log.info("Rescanning HBA %s on host %s", hba, host_name) host_ref.configManager.storageSystem.RescanHba(hba) - ret = "rescanned HBA {0}".format(hba) + ret = "rescanned HBA {}".format(hba) else: log.info("Rescanning all HBAs on host %s", host_name) host_ref.configManager.storageSystem.RescanAllHba() @@ -3749,7 +3737,7 @@ def list_hbas(kwargs=None, call=None): if hba_type and hba_type not in ["parallel", "block", "iscsi", "fibre"]: raise SaltCloudSystemExit( - "Specified hba type {0} currently not supported.".format(hba_type) + "Specified hba type {} currently not supported.".format(hba_type) ) host_list = salt.utils.vmware.get_mors_with_properties( @@ -4124,10 +4112,10 @@ def revert_to_snapshot(name, kwargs=None, call=None): task = vm_ref.RevertToCurrentSnapshot(suppressPowerOn=suppress_power_on) else: log.debug("Reverting VM %s to snapshot %s", name, snapshot_name) - msg = "reverted to snapshot {0}".format(snapshot_name) + msg = "reverted to snapshot {}".format(snapshot_name) snapshot_ref = _get_snapshot_ref_by_name(vm_ref, snapshot_name) if snapshot_ref is None: - return "specified snapshot '{0}' does not exist".format(snapshot_name) + return "specified snapshot '{}' does not exist".format(snapshot_name) task = snapshot_ref.snapshot.Revert(suppressPowerOn=suppress_power_on) salt.utils.vmware.wait_for_task(task, name, "revert to snapshot", 5, "info") @@ -4265,7 +4253,7 @@ def convert_to_template(name, kwargs=None, call=None): vm_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.VirtualMachine, name) if vm_ref.config.template: - raise SaltCloudSystemExit("{0} already a template".format(name)) + raise SaltCloudSystemExit("{} already a template".format(name)) try: vm_ref.MarkAsTemplate() @@ -4279,7 +4267,7 @@ def convert_to_template(name, kwargs=None, call=None): ) return "failed to convert to teamplate" - return "{0} converted to template".format(name) + return "{} converted to template".format(name) def add_host(kwargs=None, call=None): @@ -4399,7 +4387,7 @@ def add_host(kwargs=None, call=None): ("echo", "-n"), stdout=subprocess.PIPE, stderr=subprocess.PIPE ) p2 = subprocess.Popen( - ("openssl", "s_client", "-connect", "{0}:443".format(host_name)), + ("openssl", "s_client", "-connect", "{}:443".format(host_name)), stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -4429,12 +4417,12 @@ def add_host(kwargs=None, call=None): try: if cluster_name: task = cluster_ref.AddHost(spec=spec, asConnected=True) - ret = "added host system to cluster {0}".format(cluster_name) + ret = "added host system to cluster {}".format(cluster_name) if datacenter_name: task = datacenter_ref.hostFolder.AddStandaloneHost( spec=spec, addConnected=True ) - ret = "added host system to datacenter {0}".format(datacenter_name) + ret = "added host system to datacenter {}".format(datacenter_name) salt.utils.vmware.wait_for_task(task, host_name, "add host system", 5, "info") except Exception as exc: # pylint: disable=broad-except if isinstance(exc, vim.fault.SSLVerifyFault): diff --git a/salt/config/schemas/vcenter.py b/salt/config/schemas/vcenter.py index 7db8b67c41..bd82bd1761 100644 --- a/salt/config/schemas/vcenter.py +++ b/salt/config/schemas/vcenter.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ :codeauthor: :email:`Rod McKenzie (roderick.mckenzie@morganstanley.com)` :codeauthor: :email:`Alexandru Bleotu (alexandru.bleotu@morganstanley.com)` @@ -9,11 +8,8 @@ VCenter configuration schemas """ -# Import Python libs -from __future__ import absolute_import, print_function, unicode_literals -# Import Salt libs -from salt.utils.schema import ArrayItem, IntegerItem, Schema, StringItem +from salt.utils.schema import ArrayItem, BooleanItem, IntegerItem, Schema, StringItem class VCenterEntitySchema(Schema): @@ -48,6 +44,8 @@ class VCenterProxySchema(Schema): mechanism = StringItem(required=True, enum=["userpass", "sspi"]) username = StringItem() passwords = ArrayItem(min_items=1, items=StringItem(), unique_items=True) + verify_ssl = BooleanItem() + ca_bundle = StringItem() domain = StringItem() principal = StringItem(default="host") diff --git a/salt/master.py b/salt/master.py index 59bb19ce75..fc103ac489 100644 --- a/salt/master.py +++ b/salt/master.py @@ -2126,7 +2126,7 @@ class ClearFuncs(TransportMethods): fun = clear_load.pop("fun") runner_client = salt.runner.RunnerClient(self.opts) return runner_client.asynchronous( - fun, clear_load.get("kwarg", {}), username + fun, clear_load.get("kwarg", {}), username, local=True ) except Exception as exc: # pylint: disable=broad-except log.error("Exception occurred while introspecting %s: %s", fun, exc) diff --git a/salt/modules/bigip.py b/salt/modules/bigip.py index 2b54e4d27c..36168d66b4 100644 --- a/salt/modules/bigip.py +++ b/salt/modules/bigip.py @@ -1,21 +1,14 @@ -# -*- coding: utf-8 -*- """ An execution module which can manipulate an f5 bigip via iControl REST :maturity: develop :platform: f5_bigip_11.6 """ -# Import python libs -from __future__ import absolute_import, print_function, unicode_literals -# Import salt libs import salt.exceptions import salt.utils.json - -# Import 3rd-party libs from salt.ext import six -# Import third party libs try: import requests import requests.exceptions @@ -52,7 +45,7 @@ def _build_session(username, password, trans_label=None): bigip = requests.session() bigip.auth = (username, password) - bigip.verify = False + bigip.verify = True bigip.headers.update({"Content-Type": "application/json"}) if trans_label: @@ -109,7 +102,7 @@ def _loop_payload(params): payload = {} # set the payload - for param, value in six.iteritems(params): + for param, value in params.items(): if value is not None: payload[param] = value @@ -153,7 +146,7 @@ def _determine_toggles(payload, toggles): Figure out what it likes to hear without confusing the user. """ - for toggle, definition in six.iteritems(toggles): + for toggle, definition in toggles.items(): # did the user specify anything? if definition["value"] is not None: # test for yes_no toggle @@ -1046,7 +1039,7 @@ def replace_pool_members(hostname, username, password, name, members): # specify members if provided if members is not None: - if isinstance(members, six.string_types): + if isinstance(members, str): members = members.split(",") pool_members = [] @@ -1583,7 +1576,7 @@ def create_virtual( payload["vlans"] = "none" elif vlans == "default": payload["vlans"] = "default" - elif isinstance(vlans, six.string_types) and ( + elif isinstance(vlans, str) and ( vlans.startswith("enabled") or vlans.startswith("disabled") ): try: @@ -2016,7 +2009,7 @@ def create_monitor(hostname, username, password, monitor_type, name, **kwargs): # there's a ton of different monitors and a ton of options for each type of monitor. # this logic relies that the end user knows which options are meant for which monitor types - for key, value in six.iteritems(kwargs): + for key, value in kwargs.items(): if not key.startswith("__"): if key not in ["hostname", "username", "password", "type"]: key = key.replace("_", "-") @@ -2067,7 +2060,7 @@ def modify_monitor(hostname, username, password, monitor_type, name, **kwargs): # there's a ton of different monitors and a ton of options for each type of monitor. # this logic relies that the end user knows which options are meant for which monitor types - for key, value in six.iteritems(kwargs): + for key, value in kwargs.items(): if not key.startswith("__"): if key not in ["hostname", "username", "password", "type", "name"]: key = key.replace("_", "-") @@ -2231,7 +2224,7 @@ def create_profile(hostname, username, password, profile_type, name, **kwargs): # there's a ton of different profiles and a ton of options for each type of profile. # this logic relies that the end user knows which options are meant for which profile types - for key, value in six.iteritems(kwargs): + for key, value in kwargs.items(): if not key.startswith("__"): if key not in ["hostname", "username", "password", "profile_type"]: key = key.replace("_", "-") @@ -2322,7 +2315,7 @@ def modify_profile(hostname, username, password, profile_type, name, **kwargs): # there's a ton of different profiles and a ton of options for each type of profile. # this logic relies that the end user knows which options are meant for which profile types - for key, value in six.iteritems(kwargs): + for key, value in kwargs.items(): if not key.startswith("__"): if key not in ["hostname", "username", "password", "profile_type"]: key = key.replace("_", "-") diff --git a/salt/modules/cmdmod.py b/salt/modules/cmdmod.py index c8eb4d2305..bbc303c3f8 100644 --- a/salt/modules/cmdmod.py +++ b/salt/modules/cmdmod.py @@ -77,6 +77,12 @@ def __virtual__(): return __virtualname__ +def _log_cmd(cmd): + if not isinstance(cmd, list): + return cmd.split()[0].strip() + return cmd[0].strip() + + def _check_cb(cb_): """ If the callback is None or is not callable, return a lambda that returns @@ -386,22 +392,13 @@ def _run( ) env[bad_env_key] = "" - def _get_stripped(cmd): - # Return stripped command string copies to improve logging. - if isinstance(cmd, list): - return [x.strip() if isinstance(x, str) else x for x in cmd] - elif isinstance(cmd, str): - return cmd.strip() - else: - return cmd - if output_loglevel is not None: # Always log the shell commands at INFO unless quiet logging is # requested. The command output is what will be controlled by the # 'loglevel' parameter. msg = "Executing command {}{}{} {}{}in directory '{}'{}".format( "'" if not isinstance(cmd, list) else "", - _get_stripped(cmd), + _log_cmd(cmd), "'" if not isinstance(cmd, list) else "", "as user '{}' ".format(runas) if runas else "", "in group '{}' ".format(group) if group else "", @@ -723,7 +720,7 @@ def _run( log.error( "Failed to decode stdout from command %s, non-decodable " "characters have been replaced", - cmd, + _log_cmd(cmd), ) try: @@ -741,7 +738,7 @@ def _run( log.error( "Failed to decode stderr from command %s, non-decodable " "characters have been replaced", - cmd, + _log_cmd(cmd), ) if rstrip: @@ -841,7 +838,9 @@ def _run( if not ignore_retcode and ret["retcode"] != 0: if output_loglevel < LOG_LEVELS["error"]: output_loglevel = LOG_LEVELS["error"] - msg = "Command '{}' failed with return code: {}".format(cmd, ret["retcode"]) + msg = "Command '{}' failed with return code: {}".format( + _log_cmd(cmd), ret["retcode"] + ) log.error(log_callback(msg)) if ret["stdout"]: log.log(output_loglevel, "stdout: %s", log_callback(ret["stdout"])) @@ -1211,7 +1210,9 @@ def run( if not ignore_retcode and ret["retcode"] != 0: if lvl < LOG_LEVELS["error"]: lvl = LOG_LEVELS["error"] - msg = "Command '{}' failed with return code: {}".format(cmd, ret["retcode"]) + msg = "Command '{}' failed with return code: {}".format( + _log_cmd(cmd), ret["retcode"] + ) log.error(log_callback(msg)) if raise_err: raise CommandExecutionError( diff --git a/salt/modules/glassfish.py b/salt/modules/glassfish.py index 44df1d3cbb..59a171d2e6 100644 --- a/salt/modules/glassfish.py +++ b/salt/modules/glassfish.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- """ Module for working with the Glassfish/Payara 4.x management API .. versionadded:: Carbon :depends: requests """ -from __future__ import absolute_import, print_function, unicode_literals import salt.defaults.exitcodes import salt.utils.json @@ -42,7 +40,7 @@ def __virtual__(): else: return ( False, - 'The "{0}" module could not be loaded: ' + 'The "{}" module could not be loaded: ' '"requests" is not installed.'.format(__virtualname__), ) @@ -73,9 +71,9 @@ def _get_url(ssl, url, port, path): Returns the URL of the endpoint """ if ssl: - return "https://{0}:{1}/management/domain/{2}".format(url, port, path) + return "https://{}:{}/management/domain/{}".format(url, port, path) else: - return "http://{0}:{1}/management/domain/{2}".format(url, port, path) + return "http://{}:{}/management/domain/{}".format(url, port, path) def _get_server(server): @@ -128,7 +126,7 @@ def _api_get(path, server=None): url=_get_url(server["ssl"], server["url"], server["port"], path), auth=_get_auth(server["user"], server["password"]), headers=_get_headers(), - verify=False, + verify=True, ) return _api_response(response) @@ -143,7 +141,7 @@ def _api_post(path, data, server=None): auth=_get_auth(server["user"], server["password"]), headers=_get_headers(), data=salt.utils.json.dumps(data), - verify=False, + verify=True, ) return _api_response(response) @@ -158,7 +156,7 @@ def _api_delete(path, data, server=None): auth=_get_auth(server["user"], server["password"]), headers=_get_headers(), params=data, - verify=False, + verify=True, ) return _api_response(response) @@ -183,7 +181,7 @@ def _get_element_properties(name, element_type, server=None): Get an element's properties """ properties = {} - data = _api_get("{0}/{1}/property".format(element_type, name), server) + data = _api_get("{}/{}/property".format(element_type, name), server) # Get properties into a dict if any(data["extraProperties"]["properties"]): @@ -199,7 +197,7 @@ def _get_element(name, element_type, server=None, with_properties=True): """ element = {} name = quote(name, safe="") - data = _api_get("{0}/{1}".format(element_type, name), server) + data = _api_get("{}/{}".format(element_type, name), server) # Format data, get properties if asked, and return the whole thing if any(data["extraProperties"]["entity"]): @@ -220,9 +218,9 @@ def _create_element(name, element_type, data, server=None): data["property"] = "" for key, value in data["properties"].items(): if not data["property"]: - data["property"] += "{0}={1}".format(key, value.replace(":", "\\:")) + data["property"] += "{}={}".format(key, value.replace(":", "\\:")) else: - data["property"] += ":{0}={1}".format(key, value.replace(":", "\\:")) + data["property"] += ":{}={}".format(key, value.replace(":", "\\:")) del data["properties"] # Send request @@ -242,7 +240,7 @@ def _update_element(name, element_type, data, server=None): properties = [] for key, value in data["properties"].items(): properties.append({"name": key, "value": value}) - _api_post("{0}/{1}/property".format(element_type, name), properties, server) + _api_post("{}/{}/property".format(element_type, name), properties, server) del data["properties"] # If the element only contained properties @@ -255,10 +253,10 @@ def _update_element(name, element_type, data, server=None): update_data.update(data) else: __context__["retcode"] = salt.defaults.exitcodes.SALT_BUILD_FAIL - raise CommandExecutionError("Cannot update {0}".format(name)) + raise CommandExecutionError("Cannot update {}".format(name)) # Finally, update the element - _api_post("{0}/{1}".format(element_type, name), _clean_data(update_data), server) + _api_post("{}/{}".format(element_type, name), _clean_data(update_data), server) return unquote(name) @@ -266,7 +264,7 @@ def _delete_element(name, element_type, data, server=None): """ Delete an element """ - _api_delete("{0}/{1}".format(element_type, quote(name, safe="")), data, server) + _api_delete("{}/{}".format(element_type, quote(name, safe="")), data, server) return name @@ -692,4 +690,4 @@ def delete_system_properties(name, server=None): """ Delete a system property """ - _api_delete("system-properties/{0}".format(name), None, server) + _api_delete("system-properties/{}".format(name), None, server) diff --git a/salt/modules/keystone.py b/salt/modules/keystone.py index 52cb461339..e8dd2fd99d 100644 --- a/salt/modules/keystone.py +++ b/salt/modules/keystone.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Module for handling openstack keystone calls. @@ -13,6 +12,7 @@ Module for handling openstack keystone calls. keystone.tenant: admin keystone.tenant_id: f80919baedab48ec8931f200c65a50df keystone.auth_url: 'http://127.0.0.1:5000/v2.0/' + keystone.verify_ssl: True OR (for token based authentication) @@ -32,6 +32,7 @@ Module for handling openstack keystone calls. keystone.tenant: admin keystone.tenant_id: f80919baedab48ec8931f200c65a50df keystone.auth_url: 'http://127.0.0.1:5000/v2.0/' + keystone.verify_ssl: True openstack2: keystone.user: admin @@ -39,6 +40,7 @@ Module for handling openstack keystone calls. keystone.tenant: admin keystone.tenant_id: f80919baedab48ec8931f200c65a50df keystone.auth_url: 'http://127.0.0.2:5000/v2.0/' + keystone.verify_ssl: True With this configuration in place, any of the keystone functions can make use of a configuration profile by declaring it explicitly. @@ -49,17 +51,11 @@ Module for handling openstack keystone calls. salt '*' keystone.tenant_list profile=openstack1 """ -# Import Python libs -from __future__ import absolute_import, print_function, unicode_literals import logging -# Import Salt Libs import salt.utils.http -# Import 3rd-party libs -from salt.ext import six - HAS_KEYSTONE = False try: # pylint: disable=import-error @@ -125,6 +121,7 @@ def _get_kwargs(profile=None, **connection_args): endpoint = get("endpoint", "http://127.0.0.1:35357/v2.0") user_domain_name = get("user_domain_name", "Default") project_domain_name = get("project_domain_name", "Default") + verify_ssl = get("verify_ssl", True) if token: kwargs = {"token": token, "endpoint": endpoint} else: @@ -141,6 +138,7 @@ def _get_kwargs(profile=None, **connection_args): # this ensures it's only passed in when defined if insecure: kwargs["insecure"] = True + kwargs["verify_ssl"] = verify_ssl return kwargs @@ -158,7 +156,7 @@ def api_version(profile=None, **connection_args): auth_url = kwargs.get("auth_url", kwargs.get("endpoint", None)) try: return salt.utils.http.query( - auth_url, decode=True, decode_type="json", verify_ssl=False + auth_url, decode=True, decode_type="json", verify_ssl=kwargs["verify_ssl"] )["dict"]["version"]["id"] except KeyError: return None @@ -269,7 +267,7 @@ def ec2_credentials_delete( if not user_id: return {"Error": "Could not resolve User ID"} kstone.ec2.delete(user_id, access_key) - return 'ec2 key "{0}" deleted under user id "{1}"'.format(access_key, user_id) + return 'ec2 key "{}" deleted under user id "{}"'.format(access_key, user_id) def ec2_credentials_get( @@ -373,7 +371,7 @@ def endpoint_get(service, region=None, profile=None, interface=None, **connectio ] if len(e) > 1: return { - "Error": "Multiple endpoints found ({0}) for the {1} service. Please specify region.".format( + "Error": "Multiple endpoints found ({}) for the {} service. Please specify region.".format( e, service ) } @@ -396,12 +394,12 @@ def endpoint_list(profile=None, **connection_args): ret = {} for endpoint in kstone.endpoints.list(): - ret[endpoint.id] = dict( - (value, getattr(endpoint, value)) + ret[endpoint.id] = { + value: getattr(endpoint, value) for value in dir(endpoint) if not value.startswith("_") - and isinstance(getattr(endpoint, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(endpoint, value), (str, dict, bool)) + } return ret @@ -487,7 +485,7 @@ def role_create(name, profile=None, **connection_args): kstone = auth(profile, **connection_args) if "Error" not in role_get(name=name, profile=profile, **connection_args): - return {"Error": 'Role "{0}" already exists'.format(name)} + return {"Error": 'Role "{}" already exists'.format(name)} kstone.roles.create(name) return role_get(name=name, profile=profile, **connection_args) @@ -518,9 +516,9 @@ def role_delete(role_id=None, name=None, profile=None, **connection_args): role = kstone.roles.get(role_id) kstone.roles.delete(role) - ret = "Role ID {0} deleted".format(role_id) + ret = "Role ID {} deleted".format(role_id) if name: - ret += " ({0})".format(name) + ret += " ({})".format(name) return ret @@ -564,12 +562,12 @@ def role_list(profile=None, **connection_args): kstone = auth(profile, **connection_args) ret = {} for role in kstone.roles.list(): - ret[role.name] = dict( - (value, getattr(role, value)) + ret[role.name] = { + value: getattr(role, value) for value in dir(role) if not value.startswith("_") - and isinstance(getattr(role, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(role, value), (str, dict, bool)) + } return ret @@ -608,7 +606,7 @@ def service_delete(service_id=None, name=None, profile=None, **connection_args): "id" ] kstone.services.delete(service_id) - return 'Keystone service ID "{0}" deleted'.format(service_id) + return 'Keystone service ID "{}" deleted'.format(service_id) def service_get(service_id=None, name=None, profile=None, **connection_args): @@ -633,12 +631,12 @@ def service_get(service_id=None, name=None, profile=None, **connection_args): if not service_id: return {"Error": "Unable to resolve service id"} service = kstone.services.get(service_id) - ret[service.name] = dict( - (value, getattr(service, value)) + ret[service.name] = { + value: getattr(service, value) for value in dir(service) if not value.startswith("_") - and isinstance(getattr(service, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(service, value), (str, dict, bool)) + } return ret @@ -655,12 +653,12 @@ def service_list(profile=None, **connection_args): kstone = auth(profile, **connection_args) ret = {} for service in kstone.services.list(): - ret[service.name] = dict( - (value, getattr(service, value)) + ret[service.name] = { + value: getattr(service, value) for value in dir(service) if not value.startswith("_") - and isinstance(getattr(service, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(service, value), (str, dict, bool)) + } return ret @@ -741,10 +739,10 @@ def tenant_delete(tenant_id=None, name=None, profile=None, **connection_args): if not tenant_id: return {"Error": "Unable to resolve tenant id"} getattr(kstone, _TENANTS, None).delete(tenant_id) - ret = "Tenant ID {0} deleted".format(tenant_id) + ret = "Tenant ID {} deleted".format(tenant_id) if name: - ret += " ({0})".format(name) + ret += " ({})".format(name) return ret @@ -805,12 +803,12 @@ def tenant_get(tenant_id=None, name=None, profile=None, **connection_args): if not tenant_id: return {"Error": "Unable to resolve tenant id"} tenant = getattr(kstone, _TENANTS, None).get(tenant_id) - ret[tenant.name] = dict( - (value, getattr(tenant, value)) + ret[tenant.name] = { + value: getattr(tenant, value) for value in dir(tenant) if not value.startswith("_") - and isinstance(getattr(tenant, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(tenant, value), (str, dict, bool)) + } return ret @@ -863,12 +861,12 @@ def tenant_list(profile=None, **connection_args): ret = {} for tenant in getattr(kstone, _TENANTS, None).list(): - ret[tenant.name] = dict( - (value, getattr(tenant, value)) + ret[tenant.name] = { + value: getattr(tenant, value) for value in dir(tenant) if not value.startswith("_") - and isinstance(getattr(tenant, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(tenant, value), (str, dict, bool)) + } return ret @@ -938,12 +936,12 @@ def tenant_update( tenant_id, name=name, description=description, enabled=enabled ) - return dict( - (value, getattr(updated, value)) + return { + value: getattr(updated, value) for value in dir(updated) if not value.startswith("_") - and isinstance(getattr(updated, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(updated, value), (str, dict, bool)) + } def project_update( @@ -1034,12 +1032,12 @@ def user_list(profile=None, **connection_args): kstone = auth(profile, **connection_args) ret = {} for user in kstone.users.list(): - ret[user.name] = dict( - (value, getattr(user, value, None)) + ret[user.name] = { + value: getattr(user, value, None) for value in dir(user) if not value.startswith("_") - and isinstance(getattr(user, value, None), (six.string_types, dict, bool)) - ) + and isinstance(getattr(user, value, None), (str, dict, bool)) + } tenant_id = getattr(user, "tenantId", None) if tenant_id: ret[user.name]["tenant_id"] = tenant_id @@ -1070,16 +1068,16 @@ def user_get(user_id=None, name=None, profile=None, **connection_args): try: user = kstone.users.get(user_id) except keystoneclient.exceptions.NotFound: - msg = "Could not find user '{0}'".format(user_id) + msg = "Could not find user '{}'".format(user_id) log.error(msg) return {"Error": msg} - ret[user.name] = dict( - (value, getattr(user, value, None)) + ret[user.name] = { + value: getattr(user, value, None) for value in dir(user) if not value.startswith("_") - and isinstance(getattr(user, value, None), (six.string_types, dict, bool)) - ) + and isinstance(getattr(user, value, None), (str, dict, bool)) + } tenant_id = getattr(user, "tenantId", None) if tenant_id: @@ -1153,10 +1151,10 @@ def user_delete(user_id=None, name=None, profile=None, **connection_args): if not user_id: return {"Error": "Unable to resolve user id"} kstone.users.delete(user_id) - ret = "User ID {0} deleted".format(user_id) + ret = "User ID {} deleted".format(user_id) if name: - ret += " ({0})".format(name) + ret += " ({})".format(name) return ret @@ -1204,7 +1202,7 @@ def user_update( if description is None: description = getattr(user, "description", None) else: - description = six.text_type(description) + description = str(description) project_id = None if project: @@ -1235,7 +1233,7 @@ def user_update( if tenant_id: kstone.users.update_tenant(user_id, tenant_id) - ret = "Info updated for user ID {0}".format(user_id) + ret = "Info updated for user ID {}".format(user_id) return ret @@ -1313,9 +1311,9 @@ def user_password_update( kstone.users.update(user=user_id, password=password) else: kstone.users.update_password(user=user_id, password=password) - ret = "Password updated for user ID {0}".format(user_id) + ret = "Password updated for user ID {}".format(user_id) if name: - ret += " ({0})".format(name) + ret += " ({})".format(name) return ret @@ -1356,9 +1354,9 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4 "id" ) else: - user = next( - six.iterkeys(user_get(user_id, profile=profile, **connection_args)) - )["name"] + user = next(iter(user_get(user_id, profile=profile, **connection_args).keys()))[ + "name" + ] if not user_id: return {"Error": "Unable to resolve user id"} @@ -1368,7 +1366,7 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4 ].get("id") else: tenant = next( - six.iterkeys(tenant_get(tenant_id, profile=profile, **connection_args)) + iter(tenant_get(tenant_id, profile=profile, **connection_args).keys()) )["name"] if not tenant_id: return {"Error": "Unable to resolve tenant/project id"} @@ -1376,9 +1374,9 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4 if role: role_id = role_get(name=role, profile=profile, **connection_args)[role]["id"] else: - role = next( - six.iterkeys(role_get(role_id, profile=profile, **connection_args)) - )["name"] + role = next(iter(role_get(role_id, profile=profile, **connection_args).keys()))[ + "name" + ] if not role_id: return {"Error": "Unable to resolve role id"} @@ -1427,9 +1425,9 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4 "id" ) else: - user = next( - six.iterkeys(user_get(user_id, profile=profile, **connection_args)) - )["name"] + user = next(iter(user_get(user_id, profile=profile, **connection_args).keys()))[ + "name" + ] if not user_id: return {"Error": "Unable to resolve user id"} @@ -1439,7 +1437,7 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4 ].get("id") else: tenant = next( - six.iterkeys(tenant_get(tenant_id, profile=profile, **connection_args)) + iter(tenant_get(tenant_id, profile=profile, **connection_args).keys()) )["name"] if not tenant_id: return {"Error": "Unable to resolve tenant/project id"} @@ -1447,7 +1445,7 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4 if role: role_id = role_get(name=role, profile=profile, **connection_args)[role]["id"] else: - role = next(six.iterkeys(role_get(role_id)))["name"] + role = next(iter(role_get(role_id).keys()))["name"] if not role_id: return {"Error": "Unable to resolve role id"} @@ -1504,12 +1502,12 @@ tenant_id=7167a092ece84bae8cead4bf9d15bb3b if _OS_IDENTITY_API_VERSION > 2: for role in kstone.roles.list(user=user_id, project=tenant_id): - ret[role.name] = dict( - (value, getattr(role, value)) + ret[role.name] = { + value: getattr(role, value) for value in dir(role) if not value.startswith("_") - and isinstance(getattr(role, value), (six.string_types, dict, bool)) - ) + and isinstance(getattr(role, value), (str, dict, bool)) + } else: for role in kstone.roles.roles_for_user(user=user_id, tenant=tenant_id): ret[role.name] = { diff --git a/salt/modules/restartcheck.py b/salt/modules/restartcheck.py index 4d541da357..c996e39dc7 100644 --- a/salt/modules/restartcheck.py +++ b/salt/modules/restartcheck.py @@ -11,6 +11,7 @@ https://packages.debian.org/debian-goodies) and psdel by Sam Morris. """ import os import re +import shlex import subprocess import sys import time @@ -612,7 +613,8 @@ def restartcheck(ignorelist=None, blacklist=None, excludepid=None, **kwargs): for package in packages: _check_timeout(start_time, timeout) cmd = cmd_pkg_query + package - paths = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + cmd = shlex.split(cmd) + paths = subprocess.Popen(cmd, stdout=subprocess.PIPE) while True: _check_timeout(start_time, timeout) diff --git a/salt/modules/vsphere.py b/salt/modules/vsphere.py index b3de8afb64..8fc2c410f2 100644 --- a/salt/modules/vsphere.py +++ b/salt/modules/vsphere.py @@ -336,7 +336,7 @@ def _get_proxy_connection_details(): details = __salt__["esxvm.get_details"]() else: raise CommandExecutionError("'{}' proxy is not supported" "".format(proxytype)) - return ( + proxy_details = [ details.get("vcenter") if "vcenter" in details else details.get("host"), details.get("username"), details.get("password"), @@ -345,7 +345,10 @@ def _get_proxy_connection_details(): details.get("mechanism"), details.get("principal"), details.get("domain"), - ) + ] + if "verify_ssl" in details: + proxy_details.append(details.get("verify_ssl")) + return tuple(proxy_details) def supports_proxies(*proxy_types): @@ -429,7 +432,7 @@ def gets_service_instance_via_proxy(fn): # case 1: The call was made with enough positional # parameters to include 'service_instance' if not args[idx]: - local_service_instance = salt.utils.vmware.get_service_instance( + local_service_instance = salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter *connection_details ) # Tuples are immutable, so if we want to change what @@ -440,7 +443,7 @@ def gets_service_instance_via_proxy(fn): # case 2: Not enough positional parameters so # 'service_instance' must be a named parameter if not kwargs.get("service_instance"): - local_service_instance = salt.utils.vmware.get_service_instance( + local_service_instance = salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter *connection_details ) kwargs["service_instance"] = local_service_instance @@ -448,7 +451,7 @@ def gets_service_instance_via_proxy(fn): # 'service_instance' is not a paremter in the function definition # but it will be caught by the **kwargs parameter if not kwargs.get("service_instance"): - local_service_instance = salt.utils.vmware.get_service_instance( + local_service_instance = salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter *connection_details ) kwargs["service_instance"] = local_service_instance @@ -485,7 +488,9 @@ def get_service_instance_via_proxy(service_instance=None): See note above """ connection_details = _get_proxy_connection_details() - return salt.utils.vmware.get_service_instance(*connection_details) + return salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter + *connection_details + ) @depends(HAS_PYVMOMI) @@ -1587,7 +1592,7 @@ def upload_ssh_key( ssh_key_file=None, protocol=None, port=None, - certificate_verify=False, + certificate_verify=None, ): """ Upload an ssh key for root to an ESXi host via http PUT. @@ -1604,7 +1609,7 @@ def upload_ssh_key( :param protocol: defaults to https, can be http if ssl is disabled on ESXi :param port: defaults to 443 for https :param certificate_verify: If true require that the SSL connection present - a valid certificate + a valid certificate. Default: True :return: Dictionary with a 'status' key, True if upload is successful. If upload is unsuccessful, 'status' key will be False and an 'Error' key will have an informative message. @@ -1620,6 +1625,8 @@ def upload_ssh_key( protocol = "https" if port is None: port = 443 + if certificate_verify is None: + certificate_verify = True url = "{}://{}:{}/host/ssh_root_authorized_keys".format(protocol, host, port) ret = {} @@ -1662,7 +1669,7 @@ def upload_ssh_key( @ignores_kwargs("credstore") def get_ssh_key( - host, username, password, protocol=None, port=None, certificate_verify=False + host, username, password, protocol=None, port=None, certificate_verify=None ): """ Retrieve the authorized_keys entry for root. @@ -1674,7 +1681,7 @@ def get_ssh_key( :param protocol: defaults to https, can be http if ssl is disabled on ESXi :param port: defaults to 443 for https :param certificate_verify: If true require that the SSL connection present - a valid certificate + a valid certificate. Default: True :return: True if upload is successful CLI Example: @@ -1688,6 +1695,8 @@ def get_ssh_key( protocol = "https" if port is None: port = 443 + if certificate_verify is None: + certificate_verify = True url = "{}://{}:{}/host/ssh_root_authorized_keys".format(protocol, host, port) ret = {} @@ -1717,7 +1726,7 @@ def get_ssh_key( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def get_host_datetime( - host, username, password, protocol=None, port=None, host_names=None + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True ): """ Get the date/time information for a given host or list of host_names. @@ -1748,6 +1757,9 @@ def get_host_datetime( ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -1760,7 +1772,12 @@ def get_host_datetime( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -1775,7 +1792,9 @@ def get_host_datetime( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def get_ntp_config(host, username, password, protocol=None, port=None, host_names=None): +def get_ntp_config( + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True +): """ Get the NTP configuration information for a given host or list of host_names. @@ -1805,6 +1824,9 @@ def get_ntp_config(host, username, password, protocol=None, port=None, host_name ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -1817,7 +1839,12 @@ def get_ntp_config(host, username, password, protocol=None, port=None, host_name host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -1832,7 +1859,14 @@ def get_ntp_config(host, username, password, protocol=None, port=None, host_name @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def get_service_policy( - host, username, password, service_name, protocol=None, port=None, host_names=None + host, + username, + password, + service_name, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Get the service name's policy for a given host or list of hosts. @@ -1879,6 +1913,9 @@ def get_service_policy( for the ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -1891,7 +1928,12 @@ def get_service_policy( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) valid_services = [ "DCUI", @@ -1959,7 +2001,14 @@ def get_service_policy( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def get_service_running( - host, username, password, service_name, protocol=None, port=None, host_names=None + host, + username, + password, + service_name, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Get the service name's running state for a given host or list of hosts. @@ -2006,6 +2055,9 @@ def get_service_running( for the ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2018,7 +2070,12 @@ def get_service_running( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) valid_services = [ "DCUI", @@ -2086,7 +2143,13 @@ def get_service_running( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def get_vmotion_enabled( - host, username, password, protocol=None, port=None, host_names=None + host, + username, + password, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Get the VMotion enabled status for a given host or a list of host_names. Returns ``True`` @@ -2118,6 +2181,9 @@ def get_vmotion_enabled( ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2130,7 +2196,12 @@ def get_vmotion_enabled( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -2148,7 +2219,13 @@ def get_vmotion_enabled( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def get_vsan_enabled( - host, username, password, protocol=None, port=None, host_names=None + host, + username, + password, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Get the VSAN enabled status for a given host or a list of host_names. Returns ``True`` @@ -2181,6 +2258,9 @@ def get_vsan_enabled( ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2193,7 +2273,12 @@ def get_vsan_enabled( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -2215,7 +2300,13 @@ def get_vsan_enabled( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def get_vsan_eligible_disks( - host, username, password, protocol=None, port=None, host_names=None + host, + username, + password, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Returns a list of VSAN-eligible disks for a given host or list of host_names. @@ -2246,6 +2337,9 @@ def get_vsan_eligible_disks( for the ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2258,7 +2352,12 @@ def get_vsan_eligible_disks( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) response = _get_vsan_eligible_disks(service_instance, host, host_names) @@ -2310,7 +2409,9 @@ def test_vcenter_connection(service_instance=None): @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def system_info(host, username, password, protocol=None, port=None): +def system_info( + host, username, password, protocol=None, port=None, verify_ssl=True, +): """ Return system information about a VMware environment. @@ -2331,6 +2432,9 @@ def system_info(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2338,7 +2442,12 @@ def system_info(host, username, password, protocol=None, port=None): salt '*' vsphere.system_info 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) ret = salt.utils.vmware.get_inventory(service_instance).about.__dict__ if "apiType" in ret: @@ -2351,7 +2460,9 @@ def system_info(host, username, password, protocol=None, port=None): @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_datacenters(host, username, password, protocol=None, port=None): +def list_datacenters( + host, username, password, protocol=None, port=None, verify_ssl=True +): """ Returns a list of datacenters for the specified host. @@ -2372,6 +2483,9 @@ def list_datacenters(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2380,14 +2494,19 @@ def list_datacenters(host, username, password, protocol=None, port=None): """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_datacenters(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_clusters(host, username, password, protocol=None, port=None): +def list_clusters(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of clusters for the specified host. @@ -2408,6 +2527,9 @@ def list_clusters(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2416,14 +2538,21 @@ def list_clusters(host, username, password, protocol=None, port=None): """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_clusters(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_datastore_clusters(host, username, password, protocol=None, port=None): +def list_datastore_clusters( + host, username, password, protocol=None, port=None, verify_ssl=True +): """ Returns a list of datastore clusters for the specified host. @@ -2444,6 +2573,9 @@ def list_datastore_clusters(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2451,14 +2583,21 @@ def list_datastore_clusters(host, username, password, protocol=None, port=None): salt '*' vsphere.list_datastore_clusters 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_datastore_clusters(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_datastores(host, username, password, protocol=None, port=None): +def list_datastores( + host, username, password, protocol=None, port=None, verify_ssl=True +): """ Returns a list of datastores for the specified host. @@ -2479,6 +2618,9 @@ def list_datastores(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2486,14 +2628,19 @@ def list_datastores(host, username, password, protocol=None, port=None): salt '*' vsphere.list_datastores 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_datastores(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_hosts(host, username, password, protocol=None, port=None): +def list_hosts(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of hosts for the specified VMware environment. @@ -2514,6 +2661,9 @@ def list_hosts(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2521,14 +2671,21 @@ def list_hosts(host, username, password, protocol=None, port=None): salt '*' vsphere.list_hosts 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_hosts(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_resourcepools(host, username, password, protocol=None, port=None): +def list_resourcepools( + host, username, password, protocol=None, port=None, verify_ssl=True +): """ Returns a list of resource pools for the specified host. @@ -2549,6 +2706,9 @@ def list_resourcepools(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2556,14 +2716,19 @@ def list_resourcepools(host, username, password, protocol=None, port=None): salt '*' vsphere.list_resourcepools 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_resourcepools(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_networks(host, username, password, protocol=None, port=None): +def list_networks(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of networks for the specified host. @@ -2584,6 +2749,9 @@ def list_networks(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2591,14 +2759,19 @@ def list_networks(host, username, password, protocol=None, port=None): salt '*' vsphere.list_networks 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_networks(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_vms(host, username, password, protocol=None, port=None): +def list_vms(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of VMs for the specified host. @@ -2619,6 +2792,9 @@ def list_vms(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2626,14 +2802,19 @@ def list_vms(host, username, password, protocol=None, port=None): salt '*' vsphere.list_vms 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_vms(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_folders(host, username, password, protocol=None, port=None): +def list_folders(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of folders for the specified host. @@ -2654,6 +2835,9 @@ def list_folders(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2661,14 +2845,19 @@ def list_folders(host, username, password, protocol=None, port=None): salt '*' vsphere.list_folders 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_folders(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_dvs(host, username, password, protocol=None, port=None): +def list_dvs(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of distributed virtual switches for the specified host. @@ -2689,6 +2878,9 @@ def list_dvs(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2696,14 +2888,19 @@ def list_dvs(host, username, password, protocol=None, port=None): salt '*' vsphere.list_dvs 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_dvs(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_vapps(host, username, password, protocol=None, port=None): +def list_vapps(host, username, password, protocol=None, port=None, verify_ssl=True): """ Returns a list of vApps for the specified host. @@ -2724,6 +2921,9 @@ def list_vapps(host, username, password, protocol=None, port=None): Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2732,14 +2932,21 @@ def list_vapps(host, username, password, protocol=None, port=None): salt '*' vsphere.list_vapps 1.2.3.4 root bad-password """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) return salt.utils.vmware.list_vapps(service_instance) @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_ssds(host, username, password, protocol=None, port=None, host_names=None): +def list_ssds( + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True +): """ Returns a list of SSDs for the given host or list of host_names. @@ -2769,6 +2976,9 @@ def list_ssds(host, username, password, protocol=None, port=None, host_names=Non ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2781,7 +2991,12 @@ def list_ssds(host, username, password, protocol=None, port=None, host_names=Non host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -2798,7 +3013,9 @@ def list_ssds(host, username, password, protocol=None, port=None, host_names=Non @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def list_non_ssds(host, username, password, protocol=None, port=None, host_names=None): +def list_non_ssds( + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True +): """ Returns a list of Non-SSD disks for the given host or list of host_names. @@ -2835,6 +3052,9 @@ def list_non_ssds(host, username, password, protocol=None, port=None, host_names ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2847,7 +3067,12 @@ def list_non_ssds(host, username, password, protocol=None, port=None, host_names host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -2865,7 +3090,14 @@ def list_non_ssds(host, username, password, protocol=None, port=None, host_names @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def set_ntp_config( - host, username, password, ntp_servers, protocol=None, port=None, host_names=None + host, + username, + password, + ntp_servers, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Set NTP configuration for a given host of list of host_names. @@ -2900,6 +3132,9 @@ def set_ntp_config( ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -2912,7 +3147,12 @@ def set_ntp_config( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) if not isinstance(ntp_servers, list): raise CommandExecutionError("'ntp_servers' must be a list.") @@ -2947,7 +3187,14 @@ def set_ntp_config( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def service_start( - host, username, password, service_name, protocol=None, port=None, host_names=None + host, + username, + password, + service_name, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Start the named service for the given host or list of hosts. @@ -2994,6 +3241,9 @@ def service_start( location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3006,7 +3256,12 @@ def service_start( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) valid_services = [ @@ -3074,7 +3329,14 @@ def service_start( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def service_stop( - host, username, password, service_name, protocol=None, port=None, host_names=None + host, + username, + password, + service_name, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Stop the named service for the given host or list of hosts. @@ -3121,6 +3383,9 @@ def service_stop( location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3133,7 +3398,12 @@ def service_stop( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) valid_services = [ @@ -3199,7 +3469,14 @@ def service_stop( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def service_restart( - host, username, password, service_name, protocol=None, port=None, host_names=None + host, + username, + password, + service_name, + protocol=None, + port=None, + host_names=None, + verify_ssl=True, ): """ Restart the named service for the given host or list of hosts. @@ -3246,6 +3523,9 @@ def service_restart( location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3258,7 +3538,12 @@ def service_restart( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) valid_services = [ @@ -3334,6 +3619,7 @@ def set_service_policy( protocol=None, port=None, host_names=None, + verify_ssl=True, ): """ Set the service name's policy for a given host or list of hosts. @@ -3383,6 +3669,9 @@ def set_service_policy( for the ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3395,7 +3684,12 @@ def set_service_policy( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) valid_services = [ @@ -3481,7 +3775,7 @@ def set_service_policy( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def update_host_datetime( - host, username, password, protocol=None, port=None, host_names=None + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True ): """ Update the date/time on the given host or list of host_names. This function should be @@ -3513,6 +3807,9 @@ def update_host_datetime( location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3525,7 +3822,12 @@ def update_host_datetime( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -3550,7 +3852,7 @@ def update_host_datetime( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def update_host_password( - host, username, password, new_password, protocol=None, port=None + host, username, password, new_password, protocol=None, port=None, verify_ssl=True ): """ Update the password for a given host. @@ -3577,6 +3879,9 @@ def update_host_password( Optionally set to alternate port if the host is not using the default port. Default port is ``443``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3585,7 +3890,12 @@ def update_host_password( """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) # Get LocalAccountManager object account_manager = salt.utils.vmware.get_inventory(service_instance).accountManager @@ -3615,7 +3925,7 @@ def update_host_password( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def vmotion_disable( - host, username, password, protocol=None, port=None, host_names=None + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True ): """ Disable vMotion for a given host or list of host_names. @@ -3646,6 +3956,9 @@ def vmotion_disable( location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3658,7 +3971,12 @@ def vmotion_disable( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -3683,7 +4001,14 @@ def vmotion_disable( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") def vmotion_enable( - host, username, password, protocol=None, port=None, host_names=None, device="vmk0" + host, + username, + password, + protocol=None, + port=None, + host_names=None, + device="vmk0", + verify_ssl=True, ): """ Enable vMotion for a given host or list of host_names. @@ -3718,6 +4043,9 @@ def vmotion_enable( The device that uniquely identifies the VirtualNic that will be used for VMotion for each host. Defaults to ``vmk0``. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3730,7 +4058,12 @@ def vmotion_enable( host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) ret = {} @@ -3754,7 +4087,9 @@ def vmotion_enable( @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def vsan_add_disks(host, username, password, protocol=None, port=None, host_names=None): +def vsan_add_disks( + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True +): """ Add any VSAN-eligible disks to the VSAN System for the given host or list of host_names. @@ -3785,6 +4120,9 @@ def vsan_add_disks(host, username, password, protocol=None, port=None, host_name VSAN system for the ``host`` location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3797,7 +4135,12 @@ def vsan_add_disks(host, username, password, protocol=None, port=None, host_name host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) host_names = _check_hosts(service_instance, host, host_names) response = _get_vsan_eligible_disks(service_instance, host, host_names) @@ -3872,7 +4215,9 @@ def vsan_add_disks(host, username, password, protocol=None, port=None, host_name @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def vsan_disable(host, username, password, protocol=None, port=None, host_names=None): +def vsan_disable( + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True +): """ Disable VSAN for a given host or list of host_names. @@ -3902,6 +4247,9 @@ def vsan_disable(host, username, password, protocol=None, port=None, host_names= location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -3914,7 +4262,12 @@ def vsan_disable(host, username, password, protocol=None, port=None, host_names= host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) # Create a VSAN Configuration Object and set the enabled attribute to True vsan_config = vim.vsan.host.ConfigInfo() @@ -3961,7 +4314,9 @@ def vsan_disable(host, username, password, protocol=None, port=None, host_names= @depends(HAS_PYVMOMI) @ignores_kwargs("credstore") -def vsan_enable(host, username, password, protocol=None, port=None, host_names=None): +def vsan_enable( + host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True +): """ Enable VSAN for a given host or list of host_names. @@ -3991,6 +4346,9 @@ def vsan_enable(host, username, password, protocol=None, port=None, host_names=N location instead. This is useful for when service instance connection information is used for a single ESXi host. + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -4003,7 +4361,12 @@ def vsan_enable(host, username, password, protocol=None, port=None, host_names=N host_names='[esxi-1.host.com, esxi-2.host.com]' """ service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) # Create a VSAN Configuration Object and set the enabled attribute to True vsan_config = vim.vsan.host.ConfigInfo() @@ -7489,6 +7852,7 @@ def add_host_to_dvs( protocol=None, port=None, host_names=None, + verify_ssl=True, ): """ Adds an ESXi host to a vSphere Distributed Virtual Switch and migrates @@ -7531,6 +7895,9 @@ def add_host_to_dvs( host_names: An array of VMware host names to migrate + verify_ssl + Verify the SSL certificate. Default: True + CLI Example: .. code-block:: bash @@ -7658,7 +8025,12 @@ def add_host_to_dvs( ret["success"] = True ret["message"] = [] service_instance = salt.utils.vmware.get_service_instance( - host=host, username=username, password=password, protocol=protocol, port=port + host=host, + username=username, + password=password, + protocol=protocol, + port=port, + verify_ssl=verify_ssl, ) dvs = salt.utils.vmware._get_dvs(service_instance, dvs_name) if not dvs: @@ -9926,7 +10298,7 @@ def _delete_device(device): return device_spec -def _get_client(server, username, password): +def _get_client(server, username, password, verify_ssl=None, ca_bundle=None): """ Establish client through proxy or with user provided credentials. @@ -9936,12 +10308,17 @@ def _get_client(server, username, password): Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :returns: vSphere Client instance. :rtype: vSphere.Client """ # Get salted vSphere Client + details = None if not (server and username and password): # User didn't provide CLI args so use proxy information details = __salt__["vcenter.get_details"]() @@ -9949,9 +10326,32 @@ def _get_client(server, username, password): username = details["username"] password = details["password"] + if verify_ssl is None: + if details is None: + details = __salt__["vcenter.get_details"]() + verify_ssl = details.get("verify_ssl", True) + if verify_ssl is None: + verify_ssl = True + + if ca_bundle is None: + if details is None: + details = __salt__["vcenter.get_details"]() + ca_bundle = details.get("ca_bundle", None) + + if verify_ssl is False and ca_bundle is not None: + log.error("Cannot set verify_ssl to False and ca_bundle together") + return False + + if ca_bundle: + ca_bundle = salt.utils.http.get_ca_bundle({"ca_bundle": ca_bundle}) + # Establish connection with client client = salt.utils.vmware.get_vsphere_client( - server=server, username=username, password=password + server=server, + username=username, + password=password, + verify_ssl=verify_ssl, + ca_bundle=ca_bundle, ) # Will return None if utility function causes Unauthenticated error return client @@ -9961,7 +10361,12 @@ def _get_client(server, username, password): @supports_proxies("vcenter") @gets_service_instance_via_proxy def list_tag_categories( - server=None, username=None, password=None, service_instance=None + server=None, + username=None, + password=None, + service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ List existing categories a user has access to. @@ -9978,13 +10383,19 @@ def list_tag_categories( Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :returns: Value(s) of category_id. :rtype: list of str """ categories = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: categories = client.tagging.Category.list() @@ -9994,7 +10405,14 @@ def list_tag_categories( @depends(HAS_PYVMOMI, HAS_VSPHERE_SDK) @supports_proxies("vcenter") @gets_service_instance_via_proxy -def list_tags(server=None, username=None, password=None, service_instance=None): +def list_tags( + server=None, + username=None, + password=None, + service_instance=None, + verify_ssl=None, + ca_bundle=None, +): """ List existing tags a user has access to. @@ -10010,13 +10428,19 @@ def list_tags(server=None, username=None, password=None, service_instance=None): Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :return: Value(s) of tag_id. :rtype: list of str """ tags = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: tags = client.tagging.Tag.list() @@ -10034,6 +10458,8 @@ def attach_tag( username=None, password=None, service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ Attach an existing tag to an input object. @@ -10066,6 +10492,10 @@ def attach_tag( Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :return: The list of all tag identifiers that correspond to the tags attached to the given object. @@ -10077,7 +10507,9 @@ def attach_tag( if the user can not be authenticated. """ tag_attached = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: # Create dynamic id object associated with a type and an id. @@ -10110,6 +10542,8 @@ def list_attached_tags( username=None, password=None, service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ List existing tags a user has access to. @@ -10132,6 +10566,10 @@ def list_attached_tags( Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :return: The list of all tag identifiers that correspond to the tags attached to the given object. @@ -10143,7 +10581,9 @@ def list_attached_tags( if the user can not be authenticated. """ attached_tags = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: # Create dynamic id object associated with a type and an id. @@ -10175,6 +10615,8 @@ def create_tag_category( username=None, password=None, service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ Create a category with given cardinality. @@ -10197,6 +10639,10 @@ def create_tag_category( Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :return: Identifier of the created category. :rtype: @@ -10210,7 +10656,9 @@ def create_tag_category( if you do not have the privilege to create a category. """ category_created = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: if cardinality == "SINGLE": @@ -10241,7 +10689,13 @@ def create_tag_category( @supports_proxies("vcenter") @gets_service_instance_via_proxy def delete_tag_category( - category_id, server=None, username=None, password=None, service_instance=None + category_id, + server=None, + username=None, + password=None, + service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ Delete a category. @@ -10262,6 +10716,10 @@ def delete_tag_category( Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :raise: NotFound if the tag for the given tag_id does not exist in the system. :raise: Unauthorized @@ -10270,7 +10728,9 @@ def delete_tag_category( if the user can not be authenticated. """ category_deleted = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: try: @@ -10294,6 +10754,8 @@ def create_tag( username=None, password=None, service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ Create a tag under a category with given description. @@ -10316,6 +10778,10 @@ def create_tag( Given description of tag category. :param str category_id: Value of category_id representative of the category created previously. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :return: The identifier of the created tag. :rtype: @@ -10332,7 +10798,9 @@ def create_tag( if you do not have the privilege to create tag. """ tag_created = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: create_spec = client.tagging.Tag.CreateSpec() @@ -10353,7 +10821,13 @@ def create_tag( @supports_proxies("vcenter") @gets_service_instance_via_proxy def delete_tag( - tag_id, server=None, username=None, password=None, service_instance=None + tag_id, + server=None, + username=None, + password=None, + service_instance=None, + verify_ssl=None, + ca_bundle=None, ): """ Delete a tag. @@ -10374,6 +10848,10 @@ def delete_tag( Username associated with the vCenter center. :param basestring password: Password associated with the vCenter center. + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :raise: AlreadyExists if the name provided in the create_spec is the name of an already existing category. @@ -10383,7 +10861,9 @@ def delete_tag( if you do not have the privilege to create a category. """ tag_deleted = None - client = _get_client(server, username, password) + client = _get_client( + server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle + ) if client: try: diff --git a/salt/modules/zenoss.py b/salt/modules/zenoss.py index 9c6b7de7b5..5cb64bed18 100644 --- a/salt/modules/zenoss.py +++ b/salt/modules/zenoss.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Module for working with the Zenoss API @@ -16,18 +15,19 @@ Module for working with the Zenoss API hostname: https://zenoss.example.com username: admin password: admin123 + verify_ssl: True + ca_bundle: /etc/ssl/certs/ca-certificates.crt """ -from __future__ import absolute_import, print_function, unicode_literals - import logging import re +import salt.utils.http import salt.utils.json try: - import requests + import requests # pylint: disable=unused-import HAS_LIBS = True except ImportError: @@ -53,7 +53,7 @@ def __virtual__(): else: return ( False, - "The '{0}' module could not be loaded: " + "The '{}' module could not be loaded: " "'requests' is not installed.".format(__virtualname__), ) @@ -79,11 +79,13 @@ def _session(): """ config = __salt__["config.option"]("zenoss") - session = requests.session() - session.auth = (config.get("username"), config.get("password")) - session.verify = False - session.headers.update({"Content-type": "application/json; charset=utf-8"}) - return session + return salt.utils.http.session( + user=config.get("username"), + password=config.get("password"), + verify_ssl=config.get("verify_ssl", True), + ca_bundle=config.get("ca_bundle"), + headers={"Content-type": "application/json; charset=utf-8"}, + ) def _router_request(router, method, data=None): @@ -99,7 +101,7 @@ def _router_request(router, method, data=None): config = __salt__["config.option"]("zenoss") log.debug("Making request to router %s with method %s", router, method) - url = "{0}/zport/dmd/{1}_router".format(config.get("hostname"), ROUTERS[router]) + url = "{}/zport/dmd/{}_router".format(config.get("hostname"), ROUTERS[router]) response = _session().post(url, data=req_data) # The API returns a 200 response code even whe auth is bad. @@ -212,7 +214,7 @@ def set_prod_state(prod_state, device=None): device_object = find_device(device) if not device_object: - return "Unable to find a device in Zenoss for {0}".format(device) + return "Unable to find a device in Zenoss for {}".format(device) log.info("Setting prodState to %d on %s device", prod_state, device) data = dict( diff --git a/salt/pillar/vmware_pillar.py b/salt/pillar/vmware_pillar.py index a33b394500..08bdb18e56 100644 --- a/salt/pillar/vmware_pillar.py +++ b/salt/pillar/vmware_pillar.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Pillar data from vCenter or an ESXi host @@ -142,18 +141,12 @@ Optionally, the following keyword arguments can be passed to the ext_pillar for part of the pillar regardless of this setting. """ -from __future__ import absolute_import, print_function, unicode_literals -# Import python libs import logging -# Import salt libs import salt.utils.dictupdate as dictupdate import salt.utils.vmware -# Import 3rd-party libs -from salt.ext import six - try: # pylint: disable=no-name-in-module from pyVmomi import vim @@ -370,7 +363,12 @@ def ext_pillar(minion_id, pillar, **kwargs): # pylint: disable=W0613 vmware_pillar[pillar_key] = {} try: _conn = salt.utils.vmware.get_service_instance( - host, username, password, protocol, port + host, + username, + password, + protocol, + port, + verify_ssl=kwargs.get("verify_ssl", True), ) if _conn: data = None @@ -410,12 +408,10 @@ def ext_pillar(minion_id, pillar, **kwargs): # pylint: disable=W0613 ) except RuntimeError: log.error( - ( - "A runtime error occurred in the vmware_pillar, " - "this is likely caused by an infinite recursion in " - "a requested attribute. Verify your requested attributes " - "and reconfigure the pillar." - ) + "A runtime error occurred in the vmware_pillar, " + "this is likely caused by an infinite recursion in " + "a requested attribute. Verify your requested attributes " + "and reconfigure the pillar." ) return vmware_pillar @@ -435,7 +431,7 @@ def _recurse_config_to_dict(t_data): return t_list elif isinstance(t_data, dict): t_dict = {} - for k, v in six.iteritems(t_data): + for k, v in t_data.items(): t_dict[k] = _recurse_config_to_dict(v) return t_dict else: diff --git a/salt/proxy/cimc.py b/salt/proxy/cimc.py index f302eaa6cc..a6002440ef 100644 --- a/salt/proxy/cimc.py +++ b/salt/proxy/cimc.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Proxy Minion interface module for managing Cisco Integrated Management Controller devices ========================================================================================= @@ -40,6 +39,7 @@ the ID. host: <ip or dns name of cimc host> username: <cimc username> password: <cimc password> + verify_ssl: True proxytype ^^^^^^^^^ @@ -66,13 +66,10 @@ password The password used to login to the cimc host. Required. """ -from __future__ import absolute_import, print_function, unicode_literals -# Import Python Libs import logging import re -# Import Salt Libs import salt.exceptions from salt._compat import ElementTree as ET @@ -102,9 +99,7 @@ def _validate_response_code(response_code_to_check, cookie_to_logout=None): if formatted_response_code not in ["200", "201", "202", "204"]: if cookie_to_logout: logout(cookie_to_logout) - log.error( - "Received error HTTP status code: {0}".format(formatted_response_code) - ) + log.error("Received error HTTP status code: {}".format(formatted_response_code)) raise salt.exceptions.CommandExecutionError( "Did not receive a valid response from host." ) @@ -125,7 +120,7 @@ def init(opts): log.critical("No 'passwords' key found in pillar for this proxy.") return False - DETAILS["url"] = "https://{0}/nuova".format(opts["proxy"]["host"]) + DETAILS["url"] = "https://{}/nuova".format(opts["proxy"]["host"]) DETAILS["headers"] = { "Content-Type": "application/x-www-form-urlencoded", "Content-Length": 62, @@ -136,6 +131,10 @@ def init(opts): DETAILS["host"] = opts["proxy"]["host"] DETAILS["username"] = opts["proxy"].get("username") DETAILS["password"] = opts["proxy"].get("password") + verify_ssl = opts["proxy"].get("verify_ssl") + if verify_ssl is None: + verify_ssl = True + DETAILS["verify_ssl"] = verify_ssl # Ensure connectivity to the device log.debug("Attempting to connect to cimc proxy host.") @@ -158,8 +157,8 @@ def set_config_modify(dn=None, inconfig=None, hierarchical=False): h = "true" payload = ( - '<configConfMo cookie="{0}" inHierarchical="{1}" dn="{2}">' - "<inConfig>{3}</inConfig></configConfMo>".format(cookie, h, dn, inconfig) + '<configConfMo cookie="{}" inHierarchical="{}" dn="{}">' + "<inConfig>{}</inConfig></configConfMo>".format(cookie, h, dn, inconfig) ) r = __utils__["http.query"]( DETAILS["url"], @@ -167,7 +166,7 @@ def set_config_modify(dn=None, inconfig=None, hierarchical=False): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], raise_error=True, status=True, headers=DETAILS["headers"], @@ -195,7 +194,7 @@ def get_config_resolver_class(cid=None, hierarchical=False): if hierarchical is True: h = "true" - payload = '<configResolveClass cookie="{0}" inHierarchical="{1}" classId="{2}"/>'.format( + payload = '<configResolveClass cookie="{}" inHierarchical="{}" classId="{}"/>'.format( cookie, h, cid ) r = __utils__["http.query"]( @@ -204,7 +203,7 @@ def get_config_resolver_class(cid=None, hierarchical=False): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], raise_error=True, status=True, headers=DETAILS["headers"], @@ -226,7 +225,7 @@ def logon(): Logs into the cimc device and returns the session cookie. """ content = {} - payload = "<aaaLogin inName='{0}' inPassword='{1}'></aaaLogin>".format( + payload = "<aaaLogin inName='{}' inPassword='{}'></aaaLogin>".format( DETAILS["username"], DETAILS["password"] ) r = __utils__["http.query"]( @@ -235,7 +234,7 @@ def logon(): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], raise_error=False, status=True, headers=DETAILS["headers"], @@ -265,7 +264,7 @@ def logout(cookie=None): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], raise_error=True, headers=DETAILS["headers"], ) diff --git a/salt/proxy/panos.py b/salt/proxy/panos.py index 5c298b4f7d..50a4639911 100644 --- a/salt/proxy/panos.py +++ b/salt/proxy/panos.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Proxy Minion interface module for managing Palo Alto firewall devices ===================================================================== @@ -53,6 +52,7 @@ the device with username and password. host: <ip or dns name of panos host> username: <panos username> password: <panos password> + verify_ssl: True proxytype ^^^^^^^^^ @@ -203,17 +203,12 @@ apikey The generated XML API key for the Panorama server. Required. """ -from __future__ import absolute_import, print_function, unicode_literals -# Import Python Libs import logging import salt.exceptions import salt.utils.xmlutil as xml - -# Import Salt Libs from salt._compat import ElementTree as ET -from salt.ext import six # This must be present or the Salt loader won't load this module. __proxyenabled__ = ["panos"] @@ -270,10 +265,11 @@ def init(opts): log.critical("No 'passwords' key found in pillar for this proxy.") return False - DETAILS["url"] = "https://{0}/api/".format(opts["proxy"]["host"]) + DETAILS["url"] = "https://{}/api/".format(opts["proxy"]["host"]) # Set configuration details DETAILS["host"] = opts["proxy"]["host"] + DETAILS["verify_ssl"] = opts["proxy"].get("verify_ssl", True) if "serial" in opts["proxy"]: DETAILS["serial"] = opts["proxy"].get("serial") if "apikey" in opts["proxy"]: @@ -321,7 +317,7 @@ def call(payload=None): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], status=True, raise_error=True, ) @@ -335,7 +331,7 @@ def call(payload=None): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], status=True, raise_error=True, ) @@ -352,7 +348,7 @@ def call(payload=None): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], status=True, raise_error=True, ) @@ -368,7 +364,7 @@ def call(payload=None): method="POST", decode_type="plain", decode=True, - verify_ssl=False, + verify_ssl=DETAILS["verify_ssl"], status=True, raise_error=True, ) @@ -382,21 +378,21 @@ def call(payload=None): "Did not receive a valid response from host." ) - if six.text_type(r["status"]) not in ["200", "201", "204"]: - if six.text_type(r["status"]) == "400": + if str(r["status"]) not in ["200", "201", "204"]: + if str(r["status"]) == "400": raise salt.exceptions.CommandExecutionError( "The server cannot process the request due to a client error." ) - elif six.text_type(r["status"]) == "401": + elif str(r["status"]) == "401": raise salt.exceptions.CommandExecutionError( "The server cannot process the request because it lacks valid authentication " "credentials for the target resource." ) - elif six.text_type(r["status"]) == "403": + elif str(r["status"]) == "403": raise salt.exceptions.CommandExecutionError( "The server refused to authorize the request." ) - elif six.text_type(r["status"]) == "404": + elif str(r["status"]) == "404": raise salt.exceptions.CommandExecutionError( "The requested resource could not be found." ) diff --git a/salt/proxy/vcenter.py b/salt/proxy/vcenter.py index fa1d090bd2..4bbdb0ee66 100644 --- a/salt/proxy/vcenter.py +++ b/salt/proxy/vcenter.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Proxy Minion interface module for managing VMWare vCenters. @@ -182,13 +181,10 @@ and that host would reach out over the network and communicate with the ESXi host. """ -# Import Python Libs -from __future__ import absolute_import, print_function, unicode_literals import logging import os -# Import Salt Libs import salt.exceptions from salt.config.schemas.vcenter import VCenterProxySchema from salt.utils.dictupdate import merge @@ -277,6 +273,8 @@ def init(opts): # Save optional DETAILS["protocol"] = proxy_conf.get("protocol") DETAILS["port"] = proxy_conf.get("port") + DETAILS["verify_ssl"] = proxy_conf.get("verify_ssl") + DETAILS["ca_bundle"] = proxy_conf.get("ca_bundle") # Test connection if DETAILS["mechanism"] == "userpass": diff --git a/salt/returners/splunk.py b/salt/returners/splunk.py index 509eab3cf7..fe4194485e 100644 --- a/salt/returners/splunk.py +++ b/salt/returners/splunk.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Send json response data to Splunk via the HTTP Event Collector @@ -11,29 +10,23 @@ Requires the following config values to be specified in config or pillar: indexer: <hostname/IP of Splunk indexer> sourcetype: <Destination sourcetype for data> index: <Destination index for data> + verify_ssl: true Run a test by using ``salt-call test.ping --return splunk`` Written by Scott Pack (github.com/scottjpack) """ -# Import Python libs -from __future__ import absolute_import, print_function, unicode_literals import logging import socket import time import requests - -# Import salt libs import salt.utils.json - -# Import 3rd-party libs from salt.ext import six _max_content_bytes = 100000 -http_event_collector_SSL_verify = False http_event_collector_debug = False log = logging.getLogger(__name__) @@ -62,6 +55,9 @@ def _get_options(): indexer = __salt__["config.get"]("splunk_http_forwarder:indexer") sourcetype = __salt__["config.get"]("splunk_http_forwarder:sourcetype") index = __salt__["config.get"]("splunk_http_forwarder:index") + verify_ssl = __salt__["config.get"]( + "splunk_http_forwarder:verify_ssl", default=True + ) except Exception: # pylint: disable=broad-except log.error("Splunk HTTP Forwarder parameters not present in config.") return None @@ -70,6 +66,7 @@ def _get_options(): "indexer": indexer, "sourcetype": sourcetype, "index": index, + "verify_ssl": verify_ssl, } return splunk_opts @@ -84,14 +81,17 @@ def _send_splunk(event, index_override=None, sourcetype_override=None): # Get Splunk Options opts = _get_options() log.info( - str("Options: %s"), # future lint: disable=blacklisted-function + "Options: %s", # future lint: disable=blacklisted-function salt.utils.json.dumps(opts), ) http_event_collector_key = opts["token"] http_event_collector_host = opts["indexer"] + http_event_collector_verify_ssl = opts["verify_ssl"] # Set up the collector splunk_event = http_event_collector( - http_event_collector_key, http_event_collector_host + http_event_collector_key, + http_event_collector_host, + verify_ssl=http_event_collector_verify_ssl, ) # init the payload payload = {} @@ -109,7 +109,7 @@ def _send_splunk(event, index_override=None, sourcetype_override=None): # Add the event payload.update({"event": event}) log.info( - str("Payload: %s"), # future lint: disable=blacklisted-function + "Payload: %s", # future lint: disable=blacklisted-function salt.utils.json.dumps(payload), ) # Fire it off @@ -120,7 +120,7 @@ def _send_splunk(event, index_override=None, sourcetype_override=None): # Thanks to George Starcher for the http_event_collector class (https://github.com/georgestarcher/) -class http_event_collector(object): +class http_event_collector: def __init__( self, token, @@ -129,11 +129,13 @@ class http_event_collector(object): http_event_port="8088", http_event_server_ssl=True, max_bytes=_max_content_bytes, + verify_ssl=True, ): self.token = token self.batchEvents = [] self.maxByteLength = max_bytes self.currentByteLength = 0 + self.verify_ssl = verify_ssl # Set host to specified value or default to localhostname if no value provided if host: @@ -164,7 +166,7 @@ class http_event_collector(object): # If eventtime in epoch not passed as optional argument use current system time in epoch if not eventtime: - eventtime = six.text_type(int(time.time())) + eventtime = str(int(time.time())) # Fill in local hostname if not manually populated if "host" not in payload: @@ -179,7 +181,7 @@ class http_event_collector(object): self.server_uri, data=salt.utils.json.dumps(data), headers=headers, - verify=http_event_collector_SSL_verify, + verify=self.verify_ssl, ) # Print debug info if flag set @@ -207,7 +209,7 @@ class http_event_collector(object): # If eventtime in epoch not passed as optional argument use current system time in epoch if not eventtime: - eventtime = six.text_type(int(time.time())) + eventtime = str(int(time.time())) # Update time value on payload if need to use system time data = {"time": eventtime} @@ -224,7 +226,7 @@ class http_event_collector(object): self.server_uri, data=" ".join(self.batchEvents), headers=headers, - verify=http_event_collector_SSL_verify, + verify=self.verify_ssl, ) self.batchEvents = [] self.currentByteLength = 0 diff --git a/salt/runners/asam.py b/salt/runners/asam.py index f53dfba69d..4c999d3ba2 100644 --- a/salt/runners/asam.py +++ b/salt/runners/asam.py @@ -17,9 +17,11 @@ master configuration at ``/etc/salt/master`` or ``/etc/salt/master.d/asam.conf`` prov1.domain.com username: "testuser" password: "verybadpass" + verify_ssl: true prov2.domain.com username: "testuser" password: "verybadpass" + verify_ssl: true .. note:: @@ -84,6 +86,10 @@ def _get_asam_configuration(driver_url=""): password = service_config.get("password", None) protocol = service_config.get("protocol", "https") port = service_config.get("port", 3451) + verify_ssl = service_config.get("verify_ssl") + + if verify_ssl is None: + verify_ssl = True if not username or not password: log.error( @@ -108,6 +114,7 @@ def _get_asam_configuration(driver_url=""): ), "username": username, "password": password, + "verify_ssl": verify_ssl, } if (not driver_url) or (driver_url == asam_server): @@ -206,7 +213,7 @@ def remove_platform(name, server_url): auth = (config["username"], config["password"]) try: - html_content = _make_post_request(url, data, auth, verify=False) + html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"]) except Exception as exc: # pylint: disable=broad-except err_msg = "Failed to look up existing platforms on {}".format(server_url) log.error("%s:\n%s", err_msg, exc) @@ -222,7 +229,9 @@ def remove_platform(name, server_url): data["postType"] = "platformRemove" data["Submit"] = "Yes" try: - html_content = _make_post_request(url, data, auth, verify=False) + html_content = _make_post_request( + url, data, auth, verify=config["verify_ssl"] + ) except Exception as exc: # pylint: disable=broad-except err_msg = "Failed to delete platform from {}".format(server_url) log.error("%s:\n%s", err_msg, exc) @@ -261,7 +270,7 @@ def list_platforms(server_url): auth = (config["username"], config["password"]) try: - html_content = _make_post_request(url, data, auth, verify=False) + html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"]) except Exception as exc: # pylint: disable=broad-except err_msg = "Failed to look up existing platforms" log.error("%s:\n%s", err_msg, exc) @@ -299,7 +308,7 @@ def list_platform_sets(server_url): auth = (config["username"], config["password"]) try: - html_content = _make_post_request(url, data, auth, verify=False) + html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"]) except Exception as exc: # pylint: disable=broad-except err_msg = "Failed to look up existing platform sets" log.error("%s:\n%s", err_msg, exc) @@ -351,7 +360,7 @@ def add_platform(name, platform_set, server_url): auth = (config["username"], config["password"]) try: - html_content = _make_post_request(url, data, auth, verify=False) + html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"]) except Exception as exc: # pylint: disable=broad-except err_msg = "Failed to add platform on {}".format(server_url) log.error("%s:\n%s", err_msg, exc) diff --git a/salt/states/esxi.py b/salt/states/esxi.py index 6f4d44306b..12a592dc29 100644 --- a/salt/states/esxi.py +++ b/salt/states/esxi.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Manage VMware ESXi Hosts. @@ -91,8 +90,6 @@ configuration examples, dependency installation instructions, how to run remote execution functions against ESXi hosts via a Salt Proxy Minion, and a larger state example. """ -# Import Python Libs -from __future__ import absolute_import, print_function, unicode_literals import logging import re @@ -108,8 +105,6 @@ from salt.exceptions import ( VMwareObjectRetrievalError, VMwareSaltError, ) - -# Import Salt Libs from salt.ext import six from salt.utils.decorators import depends @@ -201,7 +196,7 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500 current_config = __salt__[esxi_cmd]("get_coredump_network_config").get(host) error = current_config.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret current_config = current_config.get("Coredump Config") @@ -217,7 +212,7 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500 ).get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret # Allow users to disable core dump, but then return since @@ -252,9 +247,9 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500 changes = True current_port = current_config.get("port") - if current_port != six.text_type(dump_port): + if current_port != str(dump_port): ret["changes"].update( - {"dump_port": {"old": current_port, "new": six.text_type(dump_port)}} + {"dump_port": {"old": current_port, "new": str(dump_port)}} ) changes = True @@ -270,7 +265,7 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500 msg = response.get("stderr") if not msg: msg = response.get("stdout") - ret["comment"] = "Error: {0}".format(msg) + ret["comment"] = "Error: {}".format(msg) return ret ret["result"] = True @@ -328,7 +323,7 @@ def password_present(name, password): __salt__[esxi_cmd]("update_host_password", new_password=password) except CommandExecutionError as err: ret["result"] = False - ret["comment"] = "Error: {0}".format(err) + ret["comment"] = "Error: {}".format(err) return ret return ret @@ -400,7 +395,7 @@ def ntp_configured( ntp_running = __salt__[esxi_cmd]("get_service_running", service_name=ntpd).get(host) error = ntp_running.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ntp_running = ntp_running.get(ntpd) @@ -413,7 +408,7 @@ def ntp_configured( ).get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret # Set changes dictionary for ntp_servers ret["changes"].update({"ntp_servers": {"old": ntp_config, "new": ntp_servers}}) @@ -429,7 +424,7 @@ def ntp_configured( ) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret # Stop ntpd if service_running=False else: @@ -438,7 +433,7 @@ def ntp_configured( ) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( {"service_running": {"old": ntp_running, "new": service_running}} @@ -451,7 +446,7 @@ def ntp_configured( ).get(host) error = current_service_policy.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret current_service_policy = current_service_policy.get(ntpd) @@ -465,7 +460,7 @@ def ntp_configured( ).get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( { @@ -483,7 +478,7 @@ def ntp_configured( response = __salt__[esxi_cmd]("update_host_datetime").get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( {"update_datetime": {"old": "", "new": "Host datetime was updated."}} @@ -498,7 +493,7 @@ def ntp_configured( ) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( {"service_restart": {"old": "", "new": "NTP Daemon Restarted."}} @@ -559,14 +554,14 @@ def vmotion_configured(name, enabled, device="vmk0"): response = __salt__[esxi_cmd]("vmotion_enable", device=device).get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret # Disable VMotion if enabled=False else: response = __salt__[esxi_cmd]("vmotion_disable").get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( {"enabled": {"old": current_vmotion_enabled, "new": enabled}} @@ -618,7 +613,7 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False): current_vsan_enabled = __salt__[esxi_cmd]("get_vsan_enabled").get(host) error = current_vsan_enabled.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret current_vsan_enabled = current_vsan_enabled.get("VSAN Enabled") @@ -631,14 +626,14 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False): response = __salt__[esxi_cmd]("vsan_enable").get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret # Disable VSAN if enabled=False else: response = __salt__[esxi_cmd]("vsan_disable").get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( {"enabled": {"old": current_vsan_enabled, "new": enabled}} @@ -649,7 +644,7 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False): current_eligible_disks = __salt__[esxi_cmd]("get_vsan_eligible_disks").get(host) error = current_eligible_disks.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret disks = current_eligible_disks.get("Eligible") @@ -659,7 +654,7 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False): response = __salt__[esxi_cmd]("vsan_add_disks").get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update({"add_disks_to_vsan": {"old": "", "new": disks}}) @@ -683,7 +678,7 @@ def ssh_configured( ssh_key_file=None, service_policy=None, service_restart=False, - certificate_verify=False, + certificate_verify=None, ): """ Manage the SSH configuration for a host including whether or not SSH is running or @@ -724,7 +719,7 @@ def ssh_configured( certificate_verify If set to ``True``, the SSL connection must present a valid certificate. - Default is ``False``. + Default is ``True``. Example: @@ -739,6 +734,8 @@ def ssh_configured( - certificate_verify: True """ + if certificate_verify is None: + certificate_verify = True ret = {"name": name, "result": False, "changes": {}, "comment": ""} esxi_cmd = "esxi.cmd" host = __pillar__["proxy"]["host"] @@ -747,7 +744,7 @@ def ssh_configured( ssh_running = __salt__[esxi_cmd]("get_service_running", service_name=ssh).get(host) error = ssh_running.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ssh_running = ssh_running.get(ssh) @@ -760,14 +757,14 @@ def ssh_configured( enable = __salt__[esxi_cmd]("service_start", service_name=ssh).get(host) error = enable.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret # Disable SSH if service_running=False else: disable = __salt__[esxi_cmd]("service_stop", service_name=ssh).get(host) error = disable.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( @@ -783,7 +780,7 @@ def ssh_configured( ) error = current_ssh_key.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret current_ssh_key = current_ssh_key.get("key") if current_ssh_key: @@ -822,7 +819,7 @@ def ssh_configured( ) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( { @@ -840,7 +837,7 @@ def ssh_configured( ).get(host) error = current_service_policy.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret current_service_policy = current_service_policy.get(ssh) @@ -854,7 +851,7 @@ def ssh_configured( ).get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( { @@ -872,7 +869,7 @@ def ssh_configured( response = __salt__[esxi_cmd]("service_restart", service_name=ssh).get(host) error = response.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret ret["changes"].update( {"service_restart": {"old": "", "new": "SSH service restarted."}} @@ -965,17 +962,17 @@ def syslog_configured( reset = __salt__[esxi_cmd]( "reset_syslog_config", syslog_config=reset_configs ).get(host) - for key, val in six.iteritems(reset): + for key, val in reset.items(): if isinstance(val, bool): continue if not val.get("success"): msg = val.get("message") if not msg: msg = ( - "There was an error resetting a syslog config '{0}'." + "There was an error resetting a syslog config '{}'." "Please check debug logs.".format(val) ) - ret["comment"] = "Error: {0}".format(msg) + ret["comment"] = "Error: {}".format(msg) return ret ret["changes"].update( @@ -985,7 +982,7 @@ def syslog_configured( current_firewall = __salt__[esxi_cmd]("get_firewall_status").get(host) error = current_firewall.get("Error") if error: - ret["comment"] = "Error: {0}".format(error) + ret["comment"] = "Error: {}".format(error) return ret current_firewall = current_firewall.get("rulesets").get("syslog") @@ -1000,23 +997,23 @@ def syslog_configured( if enabled.get("retcode") != 0: err = enabled.get("stderr") out = enabled.get("stdout") - ret["comment"] = "Error: {0}".format(err if err else out) + ret["comment"] = "Error: {}".format(err if err else out) return ret ret["changes"].update({"firewall": {"old": current_firewall, "new": firewall}}) current_syslog_config = __salt__[esxi_cmd]("get_syslog_config").get(host) - for key, val in six.iteritems(syslog_configs): + for key, val in syslog_configs.items(): # The output of get_syslog_config has different keys than the keys # Used to set syslog_config values. We need to look them up first. try: lookup_key = _lookup_syslog_config(key) except KeyError: - ret["comment"] = "'{0}' is not a valid config variable.".format(key) + ret["comment"] = "'{}' is not a valid config variable.".format(key) return ret current_val = current_syslog_config[lookup_key] - if six.text_type(current_val) != six.text_type(val): + if str(current_val) != str(val): # Only run the command if not using test=True if not __opts__["test"]: response = __salt__[esxi_cmd]( @@ -1031,7 +1028,7 @@ def syslog_configured( msg = response.get(key).get("message") if not msg: msg = ( - "There was an error setting syslog config '{0}'. " + "There was an error setting syslog config '{}'. " "Please check debug logs.".format(key) ) ret["comment"] = msg @@ -1101,7 +1098,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): if not proxy_details.get("vcenter") else proxy_details["esxi_host"] ) - log.info("Running state {0} for host '{1}'".format(name, hostname)) + log.info("Running state {} for host '{}'".format(name, hostname)) # Variable used to return the result of the invocation ret = {"name": name, "result": None, "changes": {}, "comments": None} # Signals if errors have been encountered @@ -1124,23 +1121,20 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): host_disks = __salt__["vsphere.list_disks"](service_instance=si) if not host_disks: raise VMwareObjectRetrievalError( - "No disks retrieved from host '{0}'".format(hostname) + "No disks retrieved from host '{}'".format(hostname) ) scsi_addr_to_disk_map = {d["scsi_address"]: d for d in host_disks} - log.trace("scsi_addr_to_disk_map = {0}".format(scsi_addr_to_disk_map)) + log.trace("scsi_addr_to_disk_map = {}".format(scsi_addr_to_disk_map)) existing_diskgroups = __salt__["vsphere.list_diskgroups"](service_instance=si) cache_disk_to_existing_diskgroup_map = { dg["cache_disk"]: dg for dg in existing_diskgroups } except CommandExecutionError as err: - log.error("Error: {0}".format(err)) + log.error("Error: {}".format(err)) if si: __salt__["vsphere.disconnect"](si) ret.update( - { - "result": False if not __opts__["test"] else None, - "comment": six.text_type(err), - } + {"result": False if not __opts__["test"] else None, "comment": str(err),} ) return ret @@ -1149,7 +1143,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): # Check for cache disk if not dg["cache_scsi_addr"] in scsi_addr_to_disk_map: comments.append( - "No cache disk with scsi address '{0}' was " + "No cache disk with scsi address '{}' was " "found.".format(dg["cache_scsi_addr"]) ) log.error(comments[-1]) @@ -1158,7 +1152,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): # Check for capacity disks cache_disk_id = scsi_addr_to_disk_map[dg["cache_scsi_addr"]]["id"] - cache_disk_display = "{0} (id:{1})".format(dg["cache_scsi_addr"], cache_disk_id) + cache_disk_display = "{} (id:{})".format(dg["cache_scsi_addr"], cache_disk_id) bad_scsi_addrs = [] capacity_disk_ids = [] capacity_disk_displays = [] @@ -1168,13 +1162,13 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): continue capacity_disk_ids.append(scsi_addr_to_disk_map[scsi_addr]["id"]) capacity_disk_displays.append( - "{0} (id:{1})".format(scsi_addr, capacity_disk_ids[-1]) + "{} (id:{})".format(scsi_addr, capacity_disk_ids[-1]) ) if bad_scsi_addrs: comments.append( - "Error in diskgroup #{0}: capacity disks with " - "scsi addresses {1} were not found." - "".format(idx, ", ".join(["'{0}'".format(a) for a in bad_scsi_addrs])) + "Error in diskgroup #{}: capacity disks with " + "scsi addresses {} were not found." + "".format(idx, ", ".join(["'{}'".format(a) for a in bad_scsi_addrs])) ) log.error(comments[-1]) errors = True @@ -1182,14 +1176,14 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): if not cache_disk_to_existing_diskgroup_map.get(cache_disk_id): # A new diskgroup needs to be created - log.trace("erase_disks = {0}".format(erase_disks)) + log.trace("erase_disks = {}".format(erase_disks)) if erase_disks: if __opts__["test"]: comments.append( - "State {0} will " - "erase all disks of disk group #{1}; " - "cache disk: '{2}', " - "capacity disk(s): {3}." + "State {} will " + "erase all disks of disk group #{}; " + "cache disk: '{}', " + "capacity disk(s): {}." "".format( name, idx, @@ -1206,13 +1200,13 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): disk_id=disk_id, service_instance=si ) comments.append( - "Erased disks of diskgroup #{0}; " - "cache disk: '{1}', capacity disk(s): " - "{2}".format( + "Erased disks of diskgroup #{}; " + "cache disk: '{}', capacity disk(s): " + "{}".format( idx, cache_disk_display, ", ".join( - ["'{0}'".format(a) for a in capacity_disk_displays] + ["'{}'".format(a) for a in capacity_disk_displays] ), ) ) @@ -1220,13 +1214,13 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): if __opts__["test"]: comments.append( - "State {0} will create " - "the disk group #{1}; cache disk: '{2}', " - "capacity disk(s): {3}.".format( + "State {} will create " + "the disk group #{}; cache disk: '{}', " + "capacity disk(s): {}.".format( name, idx, cache_disk_display, - ", ".join(["'{0}'".format(a) for a in capacity_disk_displays]), + ", ".join(["'{}'".format(a) for a in capacity_disk_displays]), ) ) log.info(comments[-1]) @@ -1241,15 +1235,15 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): ) except VMwareSaltError as err: comments.append( - "Error creating disk group #{0}: " "{1}.".format(idx, err) + "Error creating disk group #{}: " "{}.".format(idx, err) ) log.error(comments[-1]) errors = True continue - comments.append("Created disk group #'{0}'.".format(idx)) + comments.append("Created disk group #'{}'.".format(idx)) log.info(comments[-1]) - diskgroup_changes[six.text_type(idx)] = { + diskgroup_changes[str(idx)] = { "new": {"cache": cache_disk_display, "capacity": capacity_disk_displays} } changes = True @@ -1257,12 +1251,12 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): # The diskgroup exists; checking the capacity disks log.debug( - "Disk group #{0} exists. Checking capacity disks: " - "{1}.".format(idx, capacity_disk_displays) + "Disk group #{} exists. Checking capacity disks: " + "{}.".format(idx, capacity_disk_displays) ) existing_diskgroup = cache_disk_to_existing_diskgroup_map.get(cache_disk_id) existing_capacity_disk_displays = [ - "{0} (id:{1})".format( + "{} (id:{})".format( [d["scsi_address"] for d in host_disks if d["id"] == disk_id][0], disk_id, ) @@ -1280,7 +1274,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): ][0] added_capacity_disk_ids.append(disk_id) added_capacity_disk_displays.append( - "{0} (id:{1})".format(disk_scsi_addr, disk_id) + "{} (id:{})".format(disk_scsi_addr, disk_id) ) for disk_id in existing_diskgroup["capacity_disks"]: if disk_id not in capacity_disk_ids: @@ -1289,12 +1283,12 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): ][0] removed_capacity_disk_ids.append(disk_id) removed_capacity_disk_displays.append( - "{0} (id:{1})".format(disk_scsi_addr, disk_id) + "{} (id:{})".format(disk_scsi_addr, disk_id) ) log.debug( - "Disk group #{0}: existing capacity disk ids: {1}; added " - "capacity disk ids: {2}; removed capacity disk ids: {3}" + "Disk group #{}: existing capacity disk ids: {}; added " + "capacity disk ids: {}; removed capacity disk ids: {}" "".format( idx, existing_capacity_disk_displays, @@ -1306,11 +1300,11 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): # TODO revisit this when removing capacity disks is supported if removed_capacity_disk_ids: comments.append( - "Error removing capacity disk(s) {0} from disk group #{1}; " + "Error removing capacity disk(s) {} from disk group #{}; " "operation is not supported." "".format( ", ".join( - ["'{0}'".format(id) for id in removed_capacity_disk_displays] + ["'{}'".format(id) for id in removed_capacity_disk_displays] ), idx, ) @@ -1324,11 +1318,11 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): # Building a string representation of the capacity disks # that need to be added - s = ", ".join(["'{0}'".format(id) for id in added_capacity_disk_displays]) + s = ", ".join(["'{}'".format(id) for id in added_capacity_disk_displays]) if __opts__["test"]: comments.append( - "State {0} will add " - "capacity disk(s) {1} to disk group #{2}." + "State {} will add " + "capacity disk(s) {} to disk group #{}." "".format(name, s, idx) ) log.info(comments[-1]) @@ -1343,17 +1337,17 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): ) except VMwareSaltError as err: comments.append( - "Error adding capacity disk(s) {0} to " - "disk group #{1}: {2}.".format(s, idx, err) + "Error adding capacity disk(s) {} to " + "disk group #{}: {}.".format(s, idx, err) ) log.error(comments[-1]) errors = True continue - com = "Added capacity disk(s) {0} to disk group #{1}" "".format(s, idx) + com = "Added capacity disk(s) {} to disk group #{}" "".format(s, idx) log.info(com) comments.append(com) - diskgroup_changes[six.text_type(idx)] = { + diskgroup_changes[str(idx)] = { "new": { "cache": cache_disk_display, "capacity": capacity_disk_displays, @@ -1367,9 +1361,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False): continue # No capacity needs to be added - s = "Disk group #{0} is correctly configured. Nothing to be done." "".format( - idx - ) + s = "Disk group #{} is correctly configured. Nothing to be done." "".format(idx) log.info(s) comments.append(s) __salt__["vsphere.disconnect"](si) @@ -1532,11 +1524,11 @@ def host_cache_configured( ) if not existing_disks: raise VMwareObjectRetrievalError( - "Disk with scsi address '{0}' was not found in host '{1}'" + "Disk with scsi address '{}' was not found in host '{}'" "".format(datastore["backing_disk_scsi_addr"], hostname) ) backing_disk = existing_disks[0] - backing_disk_display = "{0} (id:{1})".format( + backing_disk_display = "{} (id:{})".format( backing_disk["scsi_address"], backing_disk["id"] ) log.trace("backing_disk = %s", backing_disk_display) @@ -1547,8 +1539,8 @@ def host_cache_configured( if erase_backing_disk: if __opts__["test"]: comments.append( - "State {0} will erase " - "the backing disk '{1}' on host '{2}'." + "State {} will erase " + "the backing disk '{}' on host '{}'." "".format(name, backing_disk_display, hostname) ) log.info(comments[-1]) @@ -1558,16 +1550,16 @@ def host_cache_configured( disk_id=backing_disk["id"], service_instance=si ) comments.append( - "Erased backing disk '{0}' on host " - "'{1}'.".format(backing_disk_display, hostname) + "Erased backing disk '{}' on host " + "'{}'.".format(backing_disk_display, hostname) ) log.info(comments[-1]) # Create the datastore if __opts__["test"]: comments.append( - "State {0} will create " - "the datastore '{1}', with backing disk " - "'{2}', on host '{3}'." + "State {} will create " + "the datastore '{}', with backing disk " + "'{}', on host '{}'." "".format(name, datastore["name"], backing_disk_display, hostname) ) log.info(comments[-1]) @@ -1582,7 +1574,7 @@ def host_cache_configured( non_mbr_partitions = [p for p in partitions if p["format"] != "mbr"] if len(non_mbr_partitions) > 0: raise VMwareApiError( - "Backing disk '{0}' has unexpected partitions" + "Backing disk '{}' has unexpected partitions" "".format(backing_disk_display) ) __salt__["vsphere.create_vmfs_datastore"]( @@ -1592,8 +1584,8 @@ def host_cache_configured( service_instance=si, ) comments.append( - "Created vmfs datastore '{0}', backed by " - "disk '{1}', on host '{2}'." + "Created vmfs datastore '{}', backed by " + "disk '{}', on host '{}'." "".format(datastore["name"], backing_disk_display, hostname) ) log.info(comments[-1]) @@ -1615,21 +1607,21 @@ def host_cache_configured( # Check datastore is backed by the correct disk if not existing_datastores[0].get("backing_disk_ids"): raise VMwareSaltError( - "Datastore '{0}' doesn't have a " + "Datastore '{}' doesn't have a " "backing disk" "".format(datastore["name"]) ) if backing_disk["id"] not in existing_datastores[0]["backing_disk_ids"]: raise VMwareSaltError( - "Datastore '{0}' is not backed by the correct disk: " - "expected '{1}'; got {2}" + "Datastore '{}' is not backed by the correct disk: " + "expected '{}'; got {}" "".format( datastore["name"], backing_disk["id"], ", ".join( [ - "'{0}'".format(disk) + "'{}'".format(disk) for disk in existing_datastores[0]["backing_disk_ids"] ] ), @@ -1637,8 +1629,8 @@ def host_cache_configured( ) comments.append( - "Datastore '{0}' already exists on host '{1}' " - "and is backed by disk '{2}'. Nothing to be " + "Datastore '{}' already exists on host '{}' " + "and is backed by disk '{}'. Nothing to be " "done.".format(datastore["name"], hostname, backing_disk_display) ) existing_datastore = existing_datastores[0] @@ -1686,8 +1678,8 @@ def host_cache_configured( if needs_setting: if __opts__["test"]: comments.append( - "State {0} will configure " - "the host cache on host '{1}' to: {2}." + "State {} will configure " + "the host cache on host '{}' to: {}." "".format( name, hostname, @@ -1702,8 +1694,8 @@ def host_cache_configured( if (existing_datastore["capacity"] / 1024.0 ** 2) < swap_size_MiB: raise ArgumentValueError( - "Capacity of host cache datastore '{0}' ({1} MiB) is " - "smaller than the required swap size ({2} MiB)" + "Capacity of host cache datastore '{}' ({} MiB) is " + "smaller than the required swap size ({} MiB)" "".format( existing_datastore["name"], existing_datastore["capacity"] / 1024.0 ** 2, @@ -1717,11 +1709,11 @@ def host_cache_configured( service_instance=si, ) comments.append( - "Host cache configured on host " "'{0}'.".format(hostname) + "Host cache configured on host " "'{}'.".format(hostname) ) else: comments.append( - "Host cache on host '{0}' is already correctly " + "Host cache on host '{}' is already correctly " "configured. Nothing to be done.".format(hostname) ) result = True diff --git a/salt/utils/http.py b/salt/utils/http.py index 9522bd6ee4..c532da63d5 100644 --- a/salt/utils/http.py +++ b/salt/utils/http.py @@ -1062,3 +1062,23 @@ def _sanitize_url_components(comp_list, field): ret = "{}&".format(comp_list[0]) comp_list.remove(comp_list[0]) return ret + _sanitize_url_components(comp_list, field) + + +def session(user=None, password=None, verify_ssl=True, ca_bundle=None, headers=None): + """ + create a requests session + """ + session = requests.session() + if user and password: + session.auth = (user, password) + if ca_bundle and not verify_ssl: + log.error("You cannot use both ca_bundle and verify_ssl False together") + return False + if ca_bundle: + opts = {"ca_bundle": ca_bundle} + session.verify = get_ca_bundle(opts) + if not verify_ssl: + session.verify = False + if headers: + session.headers.update(headers) + return session diff --git a/salt/utils/thin.py b/salt/utils/thin.py index ce48957374..60ddd0e67c 100644 --- a/salt/utils/thin.py +++ b/salt/utils/thin.py @@ -217,8 +217,8 @@ def get_tops_python(py_ver, exclude=None, ext_py_ver=None): "{} does not exist. Could not auto detect dependencies".format(py_ver) ) return {} - py_shell_cmd = "{0} -c 'import {1}; print({1}.__file__)'".format(py_ver, mod) - cmd = subprocess.Popen(py_shell_cmd, stdout=subprocess.PIPE, shell=True) + py_shell_cmd = [py_ver, "-c", "import {0}; print({0}.__file__)".format(mod)] + cmd = subprocess.Popen(py_shell_cmd, stdout=subprocess.PIPE) stdout, _ = cmd.communicate() mod_file = os.path.abspath(salt.utils.data.decode(stdout).rstrip("\n")) diff --git a/salt/utils/vmware.py b/salt/utils/vmware.py index 57aa2aaa69..f801ba2aab 100644 --- a/salt/utils/vmware.py +++ b/salt/utils/vmware.py @@ -80,7 +80,6 @@ import ssl import time from http.client import BadStatusLine -import requests import salt.exceptions import salt.modules.cmdmod import salt.utils.path @@ -182,7 +181,9 @@ def esxcli( return ret -def get_vsphere_client(server, username, password, session=None): +def get_vsphere_client( + server, username, password, session=None, verify_ssl=True, ca_bundle=None +): """ Internal helper method to create an instance of the vSphere API client. Please provide username and password to authenticate. @@ -196,6 +197,10 @@ def get_vsphere_client(server, username, password, session=None): :param Session session: Request HTTP session instance. If not specified, one is automatically created and used + :param boolean verify_ssl: + Verify the SSL certificate. Default: True + :param basestring ca_bundle: + Path to the ca bundle to use when verifying SSL certificates. :returns: Vsphere Client instance @@ -204,9 +209,7 @@ def get_vsphere_client(server, username, password, session=None): """ if not session: # Create an https session to be used for a vSphere client - session = requests.session() - # If client uses own SSL cert, session should not verify - session.verify = False + session = salt.utils.http.session(verify_ssl=verify_ssl, ca_bundle=ca_bundle) client = None try: client = create_vsphere_client( @@ -218,7 +221,15 @@ def get_vsphere_client(server, username, password, session=None): def _get_service_instance( - host, username, password, protocol, port, mechanism, principal, domain + host, + username, + password, + protocol, + port, + mechanism, + principal, + domain, + verify_ssl=True, ): """ Internal method to authenticate with a vCenter server or ESX/ESXi host @@ -253,21 +264,26 @@ def _get_service_instance( raise salt.exceptions.CommandExecutionError( "Unsupported mechanism: '{}'".format(mechanism) ) + + log.trace( + "Connecting using the '%s' mechanism, with username '%s'", mechanism, username, + ) + default_msg = ( + "Could not connect to host '{}'. " + "Please check the debug log for more information.".format(host) + ) + try: - log.trace( - "Connecting using the '%s' mechanism, with username '%s'", - mechanism, - username, - ) - service_instance = SmartConnect( - host=host, - user=username, - pwd=password, - protocol=protocol, - port=port, - b64token=token, - mechanism=mechanism, - ) + if verify_ssl: + service_instance = SmartConnect( + host=host, + user=username, + pwd=password, + protocol=protocol, + port=port, + b64token=token, + mechanism=mechanism, + ) except TypeError as exc: if "unexpected keyword argument" in exc.message: log.error( @@ -280,30 +296,33 @@ def _get_service_instance( raise except Exception as exc: # pylint: disable=broad-except # pyVmomi's SmartConnect() actually raises Exception in some cases. - default_msg = ( - "Could not connect to host '{}'. " - "Please check the debug log for more information.".format(host) - ) + if ( + isinstance(exc, vim.fault.HostConnectFault) + and "[SSL: CERTIFICATE_VERIFY_FAILED]" in exc.msg + ) or "[SSL: CERTIFICATE_VERIFY_FAILED]" in str(exc): + err_msg = ( + "Could not verify the SSL certificate. You can use " + "verify_ssl: False if you do not want to verify the " + "SSL certificate. This is not recommended as it is " + "considered insecure." + ) + else: + log.exception(exc) + err_msg = exc.msg if hasattr(exc, "msg") else default_msg + raise salt.exceptions.VMwareConnectionError(err_msg) + if not verify_ssl: try: - if ( - isinstance(exc, vim.fault.HostConnectFault) - and "[SSL: CERTIFICATE_VERIFY_FAILED]" in exc.msg - ) or "[SSL: CERTIFICATE_VERIFY_FAILED]" in str(exc): - service_instance = SmartConnect( - host=host, - user=username, - pwd=password, - protocol=protocol, - port=port, - sslContext=ssl._create_unverified_context(), - b64token=token, - mechanism=mechanism, - ) - else: - log.exception(exc) - err_msg = exc.msg if hasattr(exc, "msg") else default_msg - raise salt.exceptions.VMwareConnectionError(err_msg) + service_instance = SmartConnect( + host=host, + user=username, + pwd=password, + protocol=protocol, + port=port, + sslContext=ssl._create_unverified_context(), + b64token=token, + mechanism=mechanism, + ) except Exception as exc: # pylint: disable=broad-except # pyVmomi's SmartConnect() actually raises Exception in some cases. if "certificate verify failed" in str(exc): @@ -330,6 +349,7 @@ def _get_service_instance( err_msg = exc.msg if hasattr(exc, "msg") else default_msg log.trace(exc) raise salt.exceptions.VMwareConnectionError(err_msg) + atexit.register(Disconnect, service_instance) return service_instance @@ -384,6 +404,7 @@ def get_service_instance( mechanism="userpass", principal=None, domain=None, + verify_ssl=True, ): """ Authenticate with a vCenter server or ESX/ESXi host and return the service instance object. @@ -416,6 +437,9 @@ def get_service_instance( domain Kerberos user domain. Required if mechanism is ``sspi`` + + verify_ssl + Verify the SSL certificate. Default: True """ if protocol is None: @@ -438,7 +462,15 @@ def get_service_instance( if not service_instance: service_instance = _get_service_instance( - host, username, password, protocol, port, mechanism, principal, domain + host, + username, + password, + protocol, + port, + mechanism, + principal, + domain, + verify_ssl=verify_ssl, ) # Test if data can actually be retrieved or connection has gone stale @@ -449,7 +481,15 @@ def get_service_instance( log.trace("Session no longer authenticating. Reconnecting") Disconnect(service_instance) service_instance = _get_service_instance( - host, username, password, protocol, port, mechanism, principal, domain + host, + username, + password, + protocol, + port, + mechanism, + principal, + domain, + verify_ssl=verify_ssl, ) except vim.fault.NoPermission as exc: log.exception(exc) diff --git a/salt/wheel/__init__.py b/salt/wheel/__init__.py index 38792a10f6..53c3d8527f 100644 --- a/salt/wheel/__init__.py +++ b/salt/wheel/__init__.py @@ -1,8 +1,6 @@ -# -*- coding: utf-8 -*- """ Modules used to control the master itself """ -from __future__ import absolute_import, print_function, unicode_literals from collections.abc import Mapping @@ -15,7 +13,7 @@ import salt.utils.zeromq class WheelClient( - salt.client.mixins.SyncClientMixin, salt.client.mixins.AsyncClientMixin, object + salt.client.mixins.SyncClientMixin, salt.client.mixins.AsyncClientMixin ): """ An interface to Salt's wheel modules @@ -123,8 +121,8 @@ class WheelClient( }) {'jid': '20131219224744416681', 'tag': 'salt/wheel/20131219224744416681'} """ - fun = low.pop("fun") - return self.asynchronous(fun, low) + fun = low.get("fun") + return self.asynchronous(fun, low, local=False) def cmd( self, @@ -143,9 +141,7 @@ class WheelClient( >>> wheel.cmd('key.finger', ['jerry']) {'minions': {'jerry': '5d:f6:79:43:5e:d4:42:3f:57:b8:45:a8:7e:a4:6e:ca'}} """ - return super(WheelClient, self).cmd( - fun, arg, pub_data, kwarg, print_event, full_return - ) + return super().cmd(fun, arg, pub_data, kwarg, print_event, full_return) Wheel = WheelClient # for backward-compat diff --git a/salt/wheel/pillar_roots.py b/salt/wheel/pillar_roots.py index 2c242ef3a7..7504d28777 100644 --- a/salt/wheel/pillar_roots.py +++ b/salt/wheel/pillar_roots.py @@ -1,19 +1,14 @@ -# -*- coding: utf-8 -*- """ The `pillar_roots` wheel module is used to manage files under the pillar roots directories on the master server. """ -# Import python libs -from __future__ import absolute_import, print_function, unicode_literals import os -# Import salt libs import salt.utils.files import salt.utils.path - -# Import 3rd-party libs +import salt.utils.verify from salt.ext import six @@ -86,7 +81,7 @@ def read(path, saltenv="base"): ret = [] files = find(path, saltenv) for fn_ in files: - full = next(six.iterkeys(fn_)) + full = next(iter(fn_.keys())) form = fn_[full] if form == "txt": with salt.utils.files.fopen(full, "rb") as fp_: @@ -100,19 +95,23 @@ def write(data, path, saltenv="base", index=0): index of the file can be specified to write to a lower priority file root """ if saltenv not in __opts__["pillar_roots"]: - return "Named environment {0} is not present".format(saltenv) + return "Named environment {} is not present".format(saltenv) if len(__opts__["pillar_roots"][saltenv]) <= index: - return "Specified index {0} in environment {1} is not present".format( + return "Specified index {} in environment {} is not present".format( index, saltenv ) if os.path.isabs(path): return ( - "The path passed in {0} is not relative to the environment " "{1}" + "The path passed in {} is not relative to the environment " "{}" ).format(path, saltenv) + roots_dir = __opts__["pillar_roots"][saltenv][index] + dest = os.path.join(roots_dir, path) + if not salt.utils.verify.clean_path(roots_dir, dest): + return "Invalid path" dest = os.path.join(__opts__["pillar_roots"][saltenv][index], path) dest_dir = os.path.dirname(dest) if not os.path.isdir(dest_dir): os.makedirs(dest_dir) with salt.utils.files.fopen(dest, "w+") as fp_: fp_.write(salt.utils.stringutils.to_str(data)) - return "Wrote data to file {0}".format(dest) + return "Wrote data to file {}".format(dest) -- 2.30.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor