003 File Manager
Current Path:
/usr/local/lib/python3.8/site-packages/salt/utils
usr
/
local
/
lib
/
python3.8
/
site-packages
/
salt
/
utils
/
📁
..
📄
__init__.py
(237 B)
📁
__pycache__
📄
aggregation.py
(5.17 KB)
📄
args.py
(19.86 KB)
📄
asynchronous.py
(4.07 KB)
📄
atomicfile.py
(5.33 KB)
📄
aws.py
(19.38 KB)
📄
azurearm.py
(11.38 KB)
📄
beacons.py
(517 B)
📄
boto3_elasticsearch.py
(3.73 KB)
📄
boto3mod.py
(8.36 KB)
📄
boto_elb_tag.py
(3.02 KB)
📄
botomod.py
(7.98 KB)
📄
cache.py
(9.81 KB)
📄
cloud.py
(117.04 KB)
📄
color.py
(2.72 KB)
📄
compat.py
(1.81 KB)
📄
configcomparer.py
(3.88 KB)
📄
configparser.py
(10.82 KB)
📄
context.py
(6.8 KB)
📄
crypt.py
(4.71 KB)
📄
ctx.py
(1.42 KB)
📄
data.py
(49.28 KB)
📄
dateutils.py
(2.31 KB)
📄
debug.py
(4.19 KB)
📁
decorators
📄
dictdiffer.py
(14.16 KB)
📄
dicttrim.py
(3.9 KB)
📄
dictupdate.py
(11.33 KB)
📄
dns.py
(35.17 KB)
📄
doc.py
(2.25 KB)
📁
dockermod
📄
entrypoints.py
(2.28 KB)
📄
environment.py
(2.2 KB)
📄
error.py
(1.18 KB)
📄
etcd_util.py
(14.22 KB)
📄
event.py
(52.3 KB)
📄
extend.py
(8.87 KB)
📄
extmods.py
(5.67 KB)
📄
filebuffer.py
(3.15 KB)
📄
files.py
(27.6 KB)
📄
find.py
(22.09 KB)
📄
fsutils.py
(3.29 KB)
📄
functools.py
(5.02 KB)
📄
gitfs.py
(124.49 KB)
📄
github.py
(1.52 KB)
📄
gzip_util.py
(2.86 KB)
📄
hashutils.py
(5.91 KB)
📄
http.py
(34.36 KB)
📄
iam.py
(1.22 KB)
📄
icinga2.py
(754 B)
📄
idem.py
(1.22 KB)
📄
immutabletypes.py
(2.46 KB)
📄
itertools.py
(2.36 KB)
📄
jid.py
(3 KB)
📄
jinja.py
(31.33 KB)
📄
job.py
(6.01 KB)
📄
json.py
(3.78 KB)
📄
kickstart.py
(41.04 KB)
📄
kinds.py
(493 B)
📄
lazy.py
(3.06 KB)
📄
listdiffer.py
(10.9 KB)
📄
locales.py
(2.06 KB)
📄
mac_utils.py
(14.01 KB)
📄
mako.py
(3.63 KB)
📄
master.py
(29.57 KB)
📄
mattermost.py
(1.77 KB)
📄
memcached.py
(3.56 KB)
📄
migrations.py
(1.46 KB)
📄
mine.py
(3.68 KB)
📄
minion.py
(4.13 KB)
📄
minions.py
(43.11 KB)
📄
mount.py
(1.15 KB)
📄
msazure.py
(5.36 KB)
📄
msgpack.py
(4.69 KB)
📄
nacl.py
(13.58 KB)
📄
namecheap.py
(4.32 KB)
📄
napalm.py
(23.79 KB)
📄
nb_popen.py
(7.24 KB)
📄
network.py
(71.06 KB)
📄
nxos.py
(12.94 KB)
📄
nxos_api.py
(4 KB)
📄
odict.py
(13.16 KB)
📁
openstack
📄
oset.py
(6.41 KB)
📄
pagerduty.py
(3.03 KB)
📄
parsers.py
(125.31 KB)
📄
path.py
(10.78 KB)
📄
pbm.py
(9.81 KB)
📁
pkg
📄
platform.py
(5.16 KB)
📄
powershell.py
(4.15 KB)
📄
preseed.py
(2.64 KB)
📄
process.py
(43.34 KB)
📄
profile.py
(3.21 KB)
📄
proxy.py
(331 B)
📄
psutil_compat.py
(3.65 KB)
📄
pushover.py
(4.51 KB)
📄
pycrypto.py
(5.39 KB)
📄
pydsl.py
(13.74 KB)
📄
pyobjects.py
(10.75 KB)
📄
reactor.py
(19.09 KB)
📄
reclass.py
(752 B)
📄
roster_matcher.py
(3.55 KB)
📄
rsax931.py
(8.07 KB)
📄
s3.py
(8.78 KB)
📄
saltclass.py
(14.27 KB)
📄
sanitizers.py
(2.51 KB)
📄
schedule.py
(70.67 KB)
📄
schema.py
(54.26 KB)
📄
sdb.py
(4.04 KB)
📄
slack.py
(3.57 KB)
📄
smb.py
(11.16 KB)
📄
smtp.py
(3.27 KB)
📄
ssdp.py
(14.75 KB)
📄
ssh.py
(769 B)
📄
state.py
(8.43 KB)
📄
stringio.py
(355 B)
📄
stringutils.py
(16.63 KB)
📄
systemd.py
(5.51 KB)
📄
templates.py
(23.92 KB)
📄
textformat.py
(5.03 KB)
📄
thin.py
(31.64 KB)
📄
timed_subprocess.py
(4.06 KB)
📄
timeout.py
(1.53 KB)
📄
timeutil.py
(2.4 KB)
📄
url.py
(4.96 KB)
📄
user.py
(10.92 KB)
📁
validate
📄
value.py
(247 B)
📄
vault.py
(19.23 KB)
📄
verify.py
(26.97 KB)
📄
versions.py
(16.32 KB)
📄
virt.py
(3.24 KB)
📄
virtualbox.py
(22.43 KB)
📄
vmware.py
(129.74 KB)
📄
vsan.py
(17.18 KB)
📄
vt.py
(30.25 KB)
📄
vt_helper.py
(4.4 KB)
📄
win_chcp.py
(3.7 KB)
📄
win_dacl.py
(94.69 KB)
📄
win_dotnet.py
(4.75 KB)
📄
win_functions.py
(12.69 KB)
📄
win_lgpo_auditpol.py
(8.48 KB)
📄
win_lgpo_netsh.py
(17.87 KB)
📄
win_network.py
(12.41 KB)
📄
win_osinfo.py
(2.83 KB)
📄
win_pdh.py
(13.85 KB)
📄
win_reg.py
(30.05 KB)
📄
win_runas.py
(10.55 KB)
📄
win_service.py
(5.2 KB)
📄
win_system.py
(14.47 KB)
📄
win_update.py
(40.36 KB)
📄
winapi.py
(818 B)
📄
xdg.py
(316 B)
📄
xmlutil.py
(13.91 KB)
📄
yaml.py
(348 B)
📄
yamldumper.py
(3.38 KB)
📄
yamlencoding.py
(1.55 KB)
📄
yamlloader.py
(6.21 KB)
📄
yamlloader_old.py
(8.33 KB)
📄
yast.py
(619 B)
📄
zeromq.py
(1.65 KB)
📄
zfs.py
(19.2 KB)
Editing: etcd_util.py
""" Utilities for working with etcd .. versionadded:: 2014.7.0 :depends: - python-etcd This library sets up a client object for etcd, using the configuration passed into the client() function. Normally, this is __opts__. Optionally, a profile may be passed in. The following configurations are both valid: .. code-block:: yaml # No profile name etcd.host: 127.0.0.1 etcd.port: 2379 etcd.username: larry # Optional; requires etcd.password to be set etcd.password: 123pass # Optional; requires etcd.username to be set etcd.ca: /path/to/your/ca_cert/ca.pem # Optional etcd.client_key: /path/to/your/client_key/client-key.pem # Optional; requires etcd.ca and etcd.client_cert to be set etcd.client_cert: /path/to/your/client_cert/client.pem # Optional; requires etcd.ca and etcd.client_key to be set # One or more profiles defined my_etcd_config: etcd.host: 127.0.0.1 etcd.port: 2379 etcd.username: larry # Optional; requires etcd.password to be set etcd.password: 123pass # Optional; requires etcd.username to be set etcd.ca: /path/to/your/ca_cert/ca.pem # Optional etcd.client_key: /path/to/your/client_key/client-key.pem # Optional; requires etcd.ca and etcd.client_cert to be set etcd.client_cert: /path/to/your/client_cert/client.pem # Optional; requires etcd.ca and etcd.client_key to be set Once configured, the client() function is passed a set of opts, and optionally, the name of a profile to be used. .. code-block:: python import salt.utils.etcd_utils client = salt.utils.etcd_utils.client(__opts__, profile='my_etcd_config') You may also use the newer syntax and bypass the generator function. .. code-block:: python import salt.utils.etcd_utils client = salt.utils.etcd_utils.EtcdClient(__opts__, profile='my_etcd_config') It should be noted that some usages of etcd require a profile to be specified, rather than top-level configurations. This being the case, it is better to always use a named configuration profile, as shown above. """ import logging from salt.exceptions import CommandExecutionError try: import etcd from urllib3.exceptions import ReadTimeoutError, MaxRetryError HAS_LIBS = True except ImportError: HAS_LIBS = False # Set up logging log = logging.getLogger(__name__) class EtcdUtilWatchTimeout(Exception): """ A watch timed out without returning a result """ class EtcdClient: def __init__( self, opts, profile=None, host=None, port=None, username=None, password=None, ca=None, client_key=None, client_cert=None, **kwargs ): opts_pillar = opts.get("pillar", {}) opts_master = opts_pillar.get("master", {}) opts_merged = {} opts_merged.update(opts_master) opts_merged.update(opts_pillar) opts_merged.update(opts) if profile: self.conf = opts_merged.get(profile, {}) else: self.conf = opts_merged host = host or self.conf.get("etcd.host", "127.0.0.1") port = port or self.conf.get("etcd.port", 2379) username = username or self.conf.get("etcd.username") password = password or self.conf.get("etcd.password") ca_cert = ca or self.conf.get("etcd.ca") cli_key = client_key or self.conf.get("etcd.client_key") cli_cert = client_cert or self.conf.get("etcd.client_cert") auth = {} if username and password: auth = { "username": str(username), "password": str(password), } certs = {} if ca_cert and not (cli_cert or cli_key): certs = {"ca_cert": str(ca_cert), "protocol": "https"} if ca_cert and cli_cert and cli_key: cert = (cli_cert, cli_key) certs = { "ca_cert": str(ca_cert), "cert": cert, "protocol": "https", } xargs = auth.copy() xargs.update(certs) if HAS_LIBS: self.client = etcd.Client(host, port, **xargs) else: raise CommandExecutionError( "(unable to import etcd, module most likely not installed)" ) def watch(self, key, recurse=False, timeout=0, index=None): ret = {"key": key, "value": None, "changed": False, "mIndex": 0, "dir": False} try: result = self.read( key, recursive=recurse, wait=True, timeout=timeout, waitIndex=index ) except EtcdUtilWatchTimeout: try: result = self.read(key) except etcd.EtcdKeyNotFound: log.debug("etcd: key was not created while watching") return ret except ValueError: return {} if result and getattr(result, "dir"): ret["dir"] = True ret["value"] = getattr(result, "value") ret["mIndex"] = getattr(result, "modifiedIndex") return ret except (etcd.EtcdConnectionFailed, MaxRetryError): # This gets raised when we can't contact etcd at all log.error( "etcd: failed to perform 'watch' operation on key %s due to connection" " error", key, ) return {} except ValueError: return {} if result is None: return {} if recurse: ret["key"] = getattr(result, "key", None) ret["value"] = getattr(result, "value", None) ret["dir"] = getattr(result, "dir", None) ret["changed"] = True ret["mIndex"] = getattr(result, "modifiedIndex") return ret def get(self, key, recurse=False): try: result = self.read(key, recursive=recurse) except etcd.EtcdKeyNotFound: # etcd already logged that the key wasn't found, no need to do # anything here but return return None except etcd.EtcdConnectionFailed: log.error( "etcd: failed to perform 'get' operation on key %s due to connection" " error", key, ) return None except ValueError: return None return getattr(result, "value", None) def read(self, key, recursive=False, wait=False, timeout=None, waitIndex=None): try: if waitIndex: result = self.client.read( key, recursive=recursive, wait=wait, timeout=timeout, waitIndex=waitIndex, ) else: result = self.client.read( key, recursive=recursive, wait=wait, timeout=timeout ) except (etcd.EtcdConnectionFailed, etcd.EtcdKeyNotFound) as err: log.error("etcd: %s", err) raise except ReadTimeoutError: # For some reason, we have to catch this directly. It falls through # from python-etcd because it's trying to catch # urllib3.exceptions.ReadTimeoutError and strangely, doesn't catch. # This can occur from a watch timeout that expires, so it may be 'expected' # behavior. See issue #28553 if wait: # Wait timeouts will throw ReadTimeoutError, which isn't bad log.debug("etcd: Timed out while executing a wait") raise EtcdUtilWatchTimeout("Watch on {} timed out".format(key)) log.error("etcd: Timed out") raise etcd.EtcdConnectionFailed("Connection failed") except MaxRetryError as err: # Same issue as ReadTimeoutError. When it 'works', python-etcd # throws EtcdConnectionFailed, so we'll do that for it. log.error("etcd: Could not connect") raise etcd.EtcdConnectionFailed("Could not connect to etcd server") except etcd.EtcdException as err: # EtcdValueError inherits from ValueError, so we don't want to accidentally # catch this below on ValueError and give a bogus error message log.error("etcd: %s", err) raise except ValueError: # python-etcd doesn't fully support python 2.6 and ends up throwing this for *any* exception because # it uses the newer {} format syntax log.error( "etcd: error. python-etcd does not fully support python 2.6, no error" " information available" ) raise except Exception as err: # pylint: disable=broad-except log.error("etcd: uncaught exception %s", err) raise return result def _flatten(self, data, path=""): if not data: return {path: {}} path = path.strip("/") flat = {} for k, v in data.items(): k = k.strip("/") if path: p = "/{}/{}".format(path, k) else: p = "/{}".format(k) if isinstance(v, dict): ret = self._flatten(v, p) flat.update(ret) else: flat[p] = v return flat def update(self, fields, path=""): if not isinstance(fields, dict): log.error("etcd.update: fields is not type dict") return None fields = self._flatten(fields, path) keys = {} for k, v in fields.items(): is_dir = False if isinstance(v, dict): is_dir = True keys[k] = self.write(k, v, directory=is_dir) return keys def set(self, key, value, ttl=None, directory=False): return self.write(key, value, ttl=ttl, directory=directory) def write(self, key, value, ttl=None, directory=False): if directory: return self.write_directory(key, value, ttl) return self.write_file(key, value, ttl) def write_file(self, key, value, ttl=None): try: result = self.client.write(key, value, ttl=ttl, dir=False) except (etcd.EtcdNotFile, etcd.EtcdRootReadOnly, ValueError) as err: # If EtcdNotFile is raised, then this key is a directory and # really this is a name collision. log.error("etcd: %s", err) return None except MaxRetryError as err: log.error("etcd: Could not connect to etcd server: %s", err) return None except Exception as err: # pylint: disable=broad-except log.error("etcd: uncaught exception %s", err) raise return getattr(result, "value") def write_directory(self, key, value, ttl=None): if value is not None: log.info("etcd: non-empty value passed for directory: %s", value) try: # directories can't have values, but have to have it passed result = self.client.write(key, None, ttl=ttl, dir=True) except etcd.EtcdNotFile: # When a directory already exists, python-etcd raises an EtcdNotFile # exception. In this case, we just catch and return True for success. log.info("etcd: directory already exists: %s", key) return True except (etcd.EtcdNotDir, etcd.EtcdRootReadOnly, ValueError) as err: # If EtcdNotDir is raised, then the specified path is a file and # thus this is an error. log.error("etcd: %s", err) return None except MaxRetryError as err: log.error("etcd: Could not connect to etcd server: %s", err) return None except Exception as err: # pylint: disable=broad-except log.error("etcd: uncaught exception %s", err) raise return getattr(result, "dir") def ls(self, path): ret = {} try: items = self.read(path) except (etcd.EtcdKeyNotFound, ValueError): return {} except etcd.EtcdConnectionFailed: log.error( "etcd: failed to perform 'ls' operation on path %s due to connection" " error", path, ) return None for item in items.children: if item.dir is True: if item.key == path: continue dir_name = "{}/".format(item.key) ret[dir_name] = {} else: ret[item.key] = item.value return {path: ret} def rm(self, key, recurse=False): return self.delete(key, recurse) def delete(self, key, recursive=False): try: if self.client.delete(key, recursive=recursive): return True else: return False except ( etcd.EtcdNotFile, etcd.EtcdRootReadOnly, etcd.EtcdDirNotEmpty, etcd.EtcdKeyNotFound, ValueError, ) as err: log.error("etcd: %s", err) return None except MaxRetryError as err: log.error("etcd: Could not connect to etcd server: %s", err) return None except Exception as err: # pylint: disable=broad-except log.error("etcd: uncaught exception %s", err) raise def tree(self, path): """ .. versionadded:: 2014.7.0 Recurse through etcd and return all values """ ret = {} try: items = self.read(path) except (etcd.EtcdKeyNotFound, ValueError): return None except etcd.EtcdConnectionFailed: log.error( "etcd: failed to perform 'tree' operation on path %s due to connection" " error", path, ) return None for item in items.children: comps = str(item.key).split("/") if item.dir is True: if item.key == path: continue ret[comps[-1]] = self.tree(item.key) else: ret[comps[-1]] = item.value return ret def get_conn(opts, profile=None, **kwargs): client = EtcdClient(opts, profile, **kwargs) return client def tree(client, path): return client.tree(path)
Upload File
Create Folder