private void PopulateStaticStatTable()
        {
            CommandResultTuple usageCmdResult = null;

            MiscTools.SpawnBackgroundWorker(() => usageCmdResult = ManagerHandler.SshHandler.RunCommand("mpstat -o JSON"), () =>
            {
                if (usageCmdResult.ExitCode == 0)
                {
                    var result = JsonConvert.DeserializeObject <MPStatResult>(usageCmdResult.StdOut);
                    // hostname --I | sed 's/ /\\n/' | head -n 1
                    var localip = ManagerHandler.SshHandler.RunCommandSafe("hostname --ip-address | head -n 1").StdOut;
                    var extip   = ManagerHandler.SshHandler.RunCommandSafe("curl ipinfo.io/ip").StdOut;

                    var host = result.SysStat.Hosts[0];

                    this.Invoke((MethodInvoker)(() =>
                    {
                        hostName_Label.Text = host.NodeName;
                        os_Label.Text = host.SysName;
                        osVersion_Label.Text = host.Release;
                        architecture_Label.Text = host.Machine;
                        localIP_Label.Text = localip;
                        externalIP_Label.Text = extip;
                    }));
                }
            });
        }
        private void PopulateCpuUsageTable()
        {
            CommandResultTuple cmdresult = null;

            MiscTools.SpawnBackgroundWorker(() => cmdresult = ManagerHandler.SshHandler.RunCommand("mpstat -o JSON"), () =>
            {
                if (cmdresult.ExitCode == 0)
                {
                    var result     = JsonConvert.DeserializeObject <MPStatResult>(cmdresult.StdOut);
                    var numthreads = result.SysStat.Hosts[0].NumberOfCpus;

                    _CpuUsageTableControls = new Control[3, numthreads];

                    _CpuUsageTableControls       = new Control[3, numthreads + 1];
                    _CpuUsageTableControls[0, 0] = averageCpuUsage_Label;
                    _CpuUsageTableControls[1, 0] = averageCpuUsage_ProgressBar;
                    _CpuUsageTableControls[2, 0] = averageCpuFreq_Label;


                    for (int i = 0; i < numthreads; i++)
                    {
                        var rowstyle = new RowStyle(SizeType.Absolute, 20);
                        this.Invoke((MethodInvoker)(() =>
                        {
                            cpuLoad_TableLayoutPanel.RowCount += 1;
                            cpuLoad_TableLayoutPanel.RowStyles.Add(rowstyle);

                            var threadNumLbl = new Label {
                                Text = "" + i, AutoSize = true
                            };
                            var usageProgBar = new ProgressBar {
                                Dock = DockStyle.Fill
                            };
                            var freqLbl = new Label {
                                Text = "? MHz", AutoSize = true
                            };

                            _CpuUsageTableControls[0, i + 1] = threadNumLbl;
                            _CpuUsageTableControls[1, i + 1] = usageProgBar;
                            _CpuUsageTableControls[2, i + 1] = freqLbl;

                            cpuLoad_TableLayoutPanel.Controls.Add(threadNumLbl);
                            cpuLoad_TableLayoutPanel.Controls.Add(usageProgBar);
                            cpuLoad_TableLayoutPanel.Controls.Add(freqLbl);
                        }));
                    }
                    this.Invoke((MethodInvoker)(() =>
                    {
                        cpuLoad_TableLayoutPanel.RowCount += 1;
                        cpuLoad_TableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent));
                    }));
                }
            });
        }