$OpenBSD: patch-salt_modules_status_py,v 1.2 2017/12/18 21:06:02 jasper Exp $

Add OpenBSD support to:

- status.cpuinfo
- status.cpustats
- status.meminfo
- status.netstats
- status.version
- status.w

Index: salt/modules/status.py
--- salt/modules/status.py.orig
+++ salt/modules/status.py
@@ -298,6 +298,9 @@ def cpustats():
     .. versionchanged:: 2016.11.4
         Added support for AIX
 
+    .. versionchanged:: 2017.7.3
+        Added support for OpenBSD 
+
     CLI Example:
 
     .. code-block:: bash
@@ -357,6 +360,23 @@ def cpustats():
             cpuctr += 1
         return ret
 
+    def openbsd_cpustats():
+        '''
+        openbsd specific implementation of cpustats
+        '''
+        systat = __salt__['cmd.run']('systat -s 2 -B cpu').splitlines()
+        fields = systat[3].split()
+        ret = {}
+        for cpu in systat[4:]:
+            cpu_line = cpu.split()
+            cpu_idx = cpu_line[0]
+            ret[cpu_idx] = {}
+
+            for idx, field in enumerate(fields[1:]):
+                ret[cpu_idx][field] = cpu_line[idx+1]
+
+        return ret
+
     def sunos_cpustats():
         '''
         sunos specific implementation of cpustats
@@ -410,6 +430,7 @@ def cpustats():
     get_version = {
         'Linux': linux_cpustats,
         'FreeBSD': freebsd_cpustats,
+        'OpenBSD': openbsd_cpustats,
         'SunOS': sunos_cpustats,
         'AIX': aix_cpustats,
     }
@@ -425,6 +446,9 @@ def meminfo():
     .. versionchanged:: 2016.11.4
         Added support for AIX
 
+    .. versionchanged:: 2017.7.3
+        Added support for OpenBSD
+
     CLI Example:
 
     .. code-block:: bash
@@ -552,10 +576,25 @@ def meminfo():
 
         return ret
 
+    def openbsd_meminfo():
+        '''
+        openbsd specific implementation of meminfo
+        '''
+        vmstat = __salt__['cmd.run']('vmstat').splitlines()
+        # We're only interested in memory and page values which are printed
+        # as subsequent fields.
+        fields = ['active virtual pages', 'free list size', 'page faults',
+                  'pages reclaimed', 'pages paged in', 'pages paged out',
+                  'pages freed', 'pages scanned']
+        data = vmstat[2].split()[2:10]
+        ret = dict(zip(fields, data))
+        return ret
+
     # dict that return a function that does the right thing per platform
     get_version = {
         'Linux': linux_meminfo,
         'FreeBSD': freebsd_meminfo,
+        'OpenBSD': openbsd_meminfo,
         'AIX': aix_meminfo,
     }
 
@@ -571,6 +610,9 @@ def cpuinfo():
     .. versionchanged:: 2016.11.4
         Added support for AIX
 
+    .. versionchanged:: 2017.7.3
+         Added support for OpenBSD
+
     CLI Example:
 
     .. code-block:: bash
@@ -601,14 +643,19 @@ def cpuinfo():
 
     def bsd_cpuinfo():
         '''
-        freebsd specific cpuinfo implementation
+        bsd specific cpuinfo implementation
         '''
-        freebsd_cmd = 'sysctl hw.model hw.ncpu'
+        bsd_cmd = 'sysctl hw.model hw.ncpu'
         ret = {}
-        for line in __salt__['cmd.run'](freebsd_cmd).splitlines():
+        if __grains__['kernel'].lower() in ['netbsd', 'openbsd']:
+            sep = '='
+        else:
+            sep = ':'
+
+        for line in __salt__['cmd.run'](bsd_cmd).splitlines():
             if not line:
                 continue
-            comps = line.split(':')
+            comps = line.split(sep)
             comps[0] = comps[0].strip()
             ret[comps[0]] = comps[1].strip()
         return ret
@@ -753,6 +800,7 @@ def cpuinfo():
     get_version = {
         'Linux': linux_cpuinfo,
         'FreeBSD': bsd_cpuinfo,
+        'NetBSD': bsd_cpuinfo,
         'OpenBSD': bsd_cpuinfo,
         'SunOS': sunos_cpuinfo,
         'AIX': aix_cpuinfo,
@@ -1053,6 +1101,9 @@ def netstats():
     .. versionchanged:: 2016.11.4
         Added support for AIX
 
+    .. versionchanged:: 2017.7.3
+         Added support for OpenBSD
+
     CLI Example:
 
     .. code-block:: bash
@@ -1098,7 +1149,7 @@ def netstats():
             if line.startswith('\t\t'):
                 continue  # Skip, too detailed
             if not line.startswith('\t'):
-                key = line.split()[0]
+                key = line.split()[0].replace(':', '')
                 ret[key] = {}
             else:
                 comps = line.split()
@@ -1158,7 +1209,7 @@ def netstats():
     # dict that returns a function that does the right thing per platform
     get_version = {
         'Linux': linux_netstats,
-        'FreeBSD': freebsd_netstats,
+        'OpenBSD': freebsd_netstats,
         'SunOS': sunos_netstats,
         'AIX': aix_netstats,
     }
@@ -1357,23 +1408,56 @@ def w():  # pylint: disable=C0103
 
         salt '*' status.w
     '''
-    user_list = []
-    users = __salt__['cmd.run']('w -h').splitlines()
-    for row in users:
-        if not row:
-            continue
-        comps = row.split()
-        rec = {'idle': comps[3],
-               'jcpu': comps[4],
-               'login': comps[2],
-               'pcpu': comps[5],
-               'tty': comps[1],
-               'user': comps[0],
-               'what': ' '.join(comps[6:])}
-        user_list.append(rec)
-    return user_list
+    def linux_w():
+        '''
+        Linux specific implementation for w
+        '''
+        user_list = []
+        users = __salt__['cmd.run']('w -fh').splitlines()
+        for row in users:
+            if not row:
+                continue
+            comps = row.split()
+            rec = {'idle': comps[3],
+                   'jcpu': comps[4],
+                   'login': comps[2],
+                   'pcpu': comps[5],
+                   'tty': comps[1],
+                   'user': comps[0],
+                   'what': ' '.join(comps[6:])}
+            user_list.append(rec)
+        return user_list
 
+    def bsd_w():
+        '''
+        Generic BSD implementation for w
+        '''
+        user_list = []
+        users = __salt__['cmd.run']('w -h').splitlines()
+        for row in users:
+            if not row:
+                continue
+            comps = row.split()
+            rec = {'from': comps[2],
+                   'idle': comps[4],
+                   'login': comps[3],
+                   'tty': comps[1],
+                   'user': comps[0],
+                   'what': ' '.join(comps[5:])}
+            user_list.append(rec)
+        return user_list
 
+    # dict that returns a function that does the right thing per platform
+    get_version = {
+        'Darwin': bsd_w,
+        'FreeBSD': bsd_w,
+        'Linux': linux_w,
+        'OpenBSD': bsd_w,
+    }
+
+    errmsg = 'This method is unsupported on the current operating system!'
+    return get_version.get(__grains__['kernel'], lambda: errmsg)()
+
 def all_status():
     '''
     Return a composite of all status data and info for this minion.
@@ -1437,6 +1521,9 @@ def version():
     .. versionchanged:: 2016.11.4
         Added support for AIX
 
+    .. versionchanged:: 2017.7.3
+         Added support for OpenBSD
+
     CLI Example:
 
     .. code-block:: bash
@@ -1453,10 +1540,17 @@ def version():
         except IOError:
             return {}
 
+    def bsd_version():
+        '''
+        bsd specific implementation of version
+        '''
+        return __salt__['cmd.run']('sysctl -n kern.version')
+
     # dict that returns a function that does the right thing per platform
     get_version = {
         'Linux': linux_version,
-        'FreeBSD': lambda: __salt__['cmd.run']('sysctl -n kern.version'),
+        'FreeBSD': bsd_version,
+        'OpenBSD': bsd_version,
         'AIX': lambda: __salt__['cmd.run']('oslevel -s'),
     }
 
