1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
# -*- coding: utf-8 -*-
#
# This file is part of Glances.
#
# Copyright (C) 2019 Nicolargo <nicolas@nicolargo.com>
#
# Glances is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Glances is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""StdoutCsv interface class."""
import time
from glances.logger import logger
from glances.compat import printandflush
class GlancesStdoutCsv(object):
"""
This class manages the StdoutCsv display.
"""
separator = ','
na = 'N/A'
def __init__(self, config=None, args=None):
# Init
self.config = config
self.args = args
# Display the header only on the first line
self.header = True
# Build the list of plugin and/or plugin.attribute to display
self.plugins_list = self.build_list()
def build_list(self):
"""Return a list of tuples taken from self.args.stdout
[(plugin, attribute), ... ]"""
ret = []
for p in self.args.stdout_csv.split(','):
if '.' in p:
p, a = p.split('.')
else:
a = None
ret.append((p, a))
return ret
def end(self):
pass
def build_header(self, plugin, attribute, stat):
"""Build and return the header line"""
line = ''
if attribute is not None:
line += '{}.{}{}'.format(plugin, attribute, self.separator)
else:
if isinstance(stat, dict):
for k in stat.keys():
line += '{}.{}{}'.format(plugin,
str(k),
self.separator)
elif isinstance(stat, list):
for i in stat:
if isinstance(i, dict) and 'key' in i:
for k in i.keys():
line += '{}.{}.{}{}'.format(plugin,
str(i['key']),
str(k),
self.separator)
else:
line += '{}{}'.format(plugin, self.separator)
return line
def build_data(self, plugin, attribute, stat):
"""Build and return the data line"""
line = ''
if attribute is not None:
line += '{}{}'.format(str(stat.get(attribute, self.na)),
self.separator)
else:
if isinstance(stat, dict):
for v in stat.values():
line += '{}{}'.format(str(v), self.separator)
elif isinstance(stat, list):
for i in stat:
if isinstance(i, dict) and 'key' in i:
for v in i.values():
line += '{}{}'.format(str(v), self.separator)
else:
line += '{}{}'.format(str(stat), self.separator)
return line
def update(self,
stats,
duration=3):
"""Display stats to stdout.
Refresh every duration second.
"""
# Build the stats list
line = ''
for plugin, attribute in self.plugins_list:
# Check if the plugin exist and is enable
if plugin in stats.getPluginsList() and \
stats.get_plugin(plugin).is_enable():
stat = stats.get_plugin(plugin).get_export()
else:
continue
# Build the line to display (header or data)
if self.header:
line += self.build_header(plugin, attribute, stat)
else:
line += self.build_data(plugin, attribute, stat)
# Display the line (without the last 'separator')
printandflush(line[:-1])
# Display header one time
self.header = False
# Wait until next refresh
if duration > 0:
time.sleep(duration)
|