From fa15f163c340e73b53cd703bb199d15808f7bec8 Mon Sep 17 00:00:00 2001
From: Sam Kunz <samkunz@google.com>
Date: Tue, 28 Sep 2021 18:33:01 +0000
Subject: [PATCH] [plugins] Add crictl plugin.

---
 sos/report/plugins/crictl.py | 84 ++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 sos/report/plugins/crictl.py

diff --git a/sos/report/plugins/crictl.py b/sos/report/plugins/crictl.py
new file mode 100644
index 00000000..48367a73
--- /dev/null
+++ b/sos/report/plugins/crictl.py
@@ -0,0 +1,84 @@
+# This file is part of the sos project: https://github.com/sosreport/sos
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions of
+# version 2 of the GNU General Public License.
+#
+# See the LICENSE file in the source distribution for further information.
+
+from sos.report.plugins import Plugin, PluginOpt, CosPlugin, SoSPredicate
+
+
+class Crictl(Plugin, CosPlugin):
+
+    short_desc = 'crictl containers'
+    plugin_name = 'crictl'
+    profiles = ('container',)
+    packages = ('cri-tools')
+
+    option_list = [
+        PluginOpt(name="all", desc="enable capture for all containers, even containers "
+            "that have terminated", default=False),
+        PluginOpt(name="logs", desc="capture logs for running containers",
+            default=False),
+    ]
+
+    def setup(self):
+        self.add_copy_spec([
+            "/etc/crictl.yaml",
+        ])
+
+        self.add_journal(units='containerd')
+
+        # cri-tools supplies the crictl utility
+        self.set_cmd_predicate(SoSPredicate(self, packages=['cri-tools']))
+
+        subcmds = [
+            'info',
+            'images',
+            'pods',
+            'pods -v',
+            'ps',
+            'ps -a',
+            'ps -v',
+            'stats',
+            'version',
+        ]
+
+        self.add_cmd_output(["crictl %s" % s for s in subcmds])
+
+        ps_cmd = 'crictl ps --quiet'
+        if self.get_option('all'):
+            ps_cmd = "%s -a" % ps_cmd
+
+        img_cmd = 'crictl images --quiet'
+        pod_cmd = 'crictl pods --quiet'
+
+        containers = self._get_crictl_list(ps_cmd)
+        images = self._get_crictl_list(img_cmd)
+        pods = self._get_crictl_list(pod_cmd)
+
+        for container in containers:
+            self.add_cmd_output("crictl inspect %s" % container)
+            if self.get_option('logs'):
+                self.add_cmd_output("crictl logs -t %s" % container,
+                                    subdir="containers")
+
+        for image in images:
+            self.add_cmd_output("crictl inspecti %s" % image, subdir="images")
+
+        for pod in pods:
+            self.add_cmd_output("crictl inspectp %s" % pod, subdir="pods")
+
+    def _get_crictl_list(self, cmd):
+        ret = []
+        result = self.exec_cmd(cmd)
+        if result['status'] == 0:
+            for ent in result['output'].splitlines():
+                ret.append(ent)
+            # Prevent the socket deprecation warning from being iterated over
+            if ret and 'deprecated' in ret[0]:
+                ret.pop(0)
+        return ret
+
+# vim: set et ts=4 sw=4 :
-- 
2.31.0

