summaryrefslogtreecommitdiff
path: root/sysutils/salt/patches
diff options
context:
space:
mode:
authorkhorben <khorben@pkgsrc.org>2016-02-16 01:52:34 +0000
committerkhorben <khorben@pkgsrc.org>2016-02-16 01:52:34 +0000
commit5769a46243a48a3bfeaa1e778c46bf5ead1df65c (patch)
tree5d5f776c97eb01e0c0856460158f7d39b1f5f3a1 /sysutils/salt/patches
parent09b080c0e8f900afdb28d63b2a60ac02e8aa88cb (diff)
downloadpkgsrc-5769a46243a48a3bfeaa1e778c46bf5ead1df65c.tar.gz
Avoid a crash on NetBSD when not every minion is present
From the pull request pending, #31320: On NetBSD, Salt currently defaults to using lsof(8) to determine which minions are connected. It is however not always available, and even then quite unreliable. I found that just like on FreeBSD, sockstat(1) is a much safer alternative. Unfortunately its output is not exactly the same on NetBSD, where the port delimiter is a dot character instead. As a consequence I have decided to duplicate the relevant function for NetBSD; let me know if I should try to re-use the code supporting FreeBSD instead. See also https://github.com/saltstack/salt/pull/31230.
Diffstat (limited to 'sysutils/salt/patches')
-rw-r--r--sysutils/salt/patches/patch-salt_modules_status.py6
-rw-r--r--sysutils/salt/patches/patch-salt_utils_____init____.py21
-rw-r--r--sysutils/salt/patches/patch-salt_utils_network.py90
3 files changed, 114 insertions, 3 deletions
diff --git a/sysutils/salt/patches/patch-salt_modules_status.py b/sysutils/salt/patches/patch-salt_modules_status.py
index 067a07b7bf7..c2a6615a942 100644
--- a/sysutils/salt/patches/patch-salt_modules_status.py
+++ b/sysutils/salt/patches/patch-salt_modules_status.py
@@ -1,10 +1,10 @@
-$NetBSD: patch-salt_modules_status.py,v 1.1 2016/02/04 22:05:36 khorben Exp $
+$NetBSD: patch-salt_modules_status.py,v 1.2 2016/02/16 01:52:34 khorben Exp $
Avoid a crash in "status.diskusage" when not on Linux or FreeBSD
---- salt/modules/status.py.orig 2016-02-04 21:56:06.000000000 +0000
+--- salt/modules/status.py.orig 2016-02-01 19:40:31.000000000 +0000
+++ salt/modules/status.py
-@@ -443,6 +443,8 @@ def diskusage(*args):
+@@ -457,6 +457,8 @@ def diskusage(*args):
ifile = salt.utils.fopen(procf, 'r').readlines()
elif __grains__['kernel'] == 'FreeBSD':
ifile = __salt__['cmd.run']('mount -p').splitlines()
diff --git a/sysutils/salt/patches/patch-salt_utils_____init____.py b/sysutils/salt/patches/patch-salt_utils_____init____.py
new file mode 100644
index 00000000000..b7bb7d2f8cb
--- /dev/null
+++ b/sysutils/salt/patches/patch-salt_utils_____init____.py
@@ -0,0 +1,21 @@
+$NetBSD: patch-salt_utils_____init____.py,v 1.1 2016/02/16 01:52:34 khorben Exp $
+
+Use sockstat(1) on NetBSD
+
+--- salt/utils/__init__.py.orig 2016-02-01 19:40:31.000000000 +0000
++++ salt/utils/__init__.py
+@@ -1664,6 +1664,14 @@ def is_freebsd():
+
+
+ @real_memoize
++def is_netbsd():
++ '''
++ Simple function to return if host is NetBSD or not
++ '''
++ return sys.platform.startswith('netbsd')
++
++
++@real_memoize
+ def is_openbsd():
+ '''
+ Simple function to return if host is OpenBSD or not
diff --git a/sysutils/salt/patches/patch-salt_utils_network.py b/sysutils/salt/patches/patch-salt_utils_network.py
new file mode 100644
index 00000000000..396f15911e4
--- /dev/null
+++ b/sysutils/salt/patches/patch-salt_utils_network.py
@@ -0,0 +1,90 @@
+$NetBSD: patch-salt_utils_network.py,v 1.1 2016/02/16 01:52:34 khorben Exp $
+
+Use sockstat(1) on NetBSD
+
+--- salt/utils/network.py.orig 2016-02-01 19:40:31.000000000 +0000
++++ salt/utils/network.py
+@@ -1180,6 +1180,65 @@ def _freebsd_remotes_on(port, which_end)
+ return remotes
+
+
++def _netbsd_remotes_on(port, which_end):
++ '''
++ Returns set of ipv4 host addresses of remote established connections
++ on local tcp port port.
++
++ Parses output of shell 'sockstat' (FreeBSD)
++ to get connections
++
++ $ sudo sockstat -4
++ USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
++ root python2.7 1456 29 tcp4 *.4505 *.*
++ root python2.7 1445 17 tcp4 *.4506 *.*
++ root python2.7 1294 14 tcp4 127.0.0.1.11813 127.0.0.1.4505
++ root python2.7 1294 41 tcp4 127.0.0.1.61115 127.0.0.1.4506
++
++ $ sudo sockstat -4 -c -p 4506
++ USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
++ root python2.7 1294 41 tcp4 127.0.0.1.61115 127.0.0.1.4506
++ '''
++
++ port = int(port)
++ remotes = set()
++
++ try:
++ cmd = shlex.split('sockstat -4 -c -p {0}'.format(port))
++ data = subprocess.check_output(cmd) # pylint: disable=minimum-python-version
++ except subprocess.CalledProcessError as ex:
++ log.error('Failed "sockstat" with returncode = {0}'.format(ex.returncode))
++ raise
++
++ lines = salt.utils.to_str(data).split('\n')
++
++ for line in lines:
++ chunks = line.split()
++ if not chunks:
++ continue
++ # ['root', 'python2.7', '1456', '37', 'tcp4',
++ # '127.0.0.1.4505-', '127.0.0.1.55703']
++ #print chunks
++ if 'COMMAND' in chunks[1]:
++ continue # ignore header
++ if len(chunks) < 2:
++ continue
++ local = chunks[5].split('.')
++ lport = local.pop()
++ lhost = '.'.join(local)
++ remote = chunks[6].split('.')
++ rport = remote.pop()
++ rhost = '.'.join(remote)
++ if which_end == 'local' and int(lport) != port: # ignore if local port not port
++ continue
++ if which_end == 'remote' and int(rport) != port: # ignore if remote port not port
++ continue
++
++ remotes.add(rhost)
++
++ return remotes
++
++
+ def _openbsd_remotes_on(port, which_end):
+ '''
+ OpenBSD specific helper function.
+@@ -1277,6 +1336,8 @@ def remotes_on_local_tcp_port(port):
+ return _sunos_remotes_on(port, 'local_port')
+ if salt.utils.is_freebsd():
+ return _freebsd_remotes_on(port, 'local_port')
++ if salt.utils.is_netbsd():
++ return _netbsd_remotes_on(port, 'local_port')
+ if salt.utils.is_openbsd():
+ return _openbsd_remotes_on(port, 'local_port')
+ if salt.utils.is_windows():
+@@ -1332,6 +1393,8 @@ def remotes_on_remote_tcp_port(port):
+ return _sunos_remotes_on(port, 'remote_port')
+ if salt.utils.is_freebsd():
+ return _freebsd_remotes_on(port, 'remote_port')
++ if salt.utils.is_netbsd():
++ return _netbsd_remotes_on(port, 'remote_port')
+ if salt.utils.is_openbsd():
+ return _openbsd_remotes_on(port, 'remote_port')
+ if salt.utils.is_windows():