Implement the CSV output

pull/354/head
Nicolargo 2014-05-17 21:18:29 +02:00
parent b897168a9b
commit 59f82b788c
4 changed files with 112 additions and 33 deletions

View File

@ -74,10 +74,10 @@ class GlancesMain(object):
password = "" password = ""
# Output type (default is no output) # Output type (default is no output)
# output_list = ['html', 'csv'] # output_list = ['html', 'csv']
html_tag = False # html_tag = False
csv_tag = False # csv_tag = False
output_file = None # output_file = None
output_folder = None # output_folder = None
def __init__(self): def __init__(self):
"""Manage the command line arguments.""" """Manage the command line arguments."""
@ -96,6 +96,7 @@ class GlancesMain(object):
help=_('connect to a Glances server by IPv4/IPv6 address or hostname')) help=_('connect to a Glances server by IPv4/IPv6 address or hostname'))
parser.add_argument('-C', '--config', dest='conf_file', parser.add_argument('-C', '--config', dest='conf_file',
help=_('path to the configuration file')) help=_('path to the configuration file'))
# Enable or disable option on startup
parser.add_argument('--disable-bold', action='store_false', default=True, parser.add_argument('--disable-bold', action='store_false', default=True,
dest='disable_bold', help=_('disable bold mode in the terminal')) dest='disable_bold', help=_('disable bold mode in the terminal'))
parser.add_argument('--disable-diskio', action='store_true', default=False, parser.add_argument('--disable-diskio', action='store_true', default=False,
@ -110,10 +111,10 @@ class GlancesMain(object):
dest='disable_process', help=_('disable process module')) dest='disable_process', help=_('disable process module'))
parser.add_argument('--disable-log', action='store_true', default=False, parser.add_argument('--disable-log', action='store_true', default=False,
dest='disable_log', help=_('disable log module')) dest='disable_log', help=_('disable log module'))
parser.add_argument('-f', '--file', dest='file', # CSV output feature
help=_('set the HTML output folder or CSV file')) parser.add_argument('--output-csv', default=None,
parser.add_argument('-o', '--output', choices=['HTML', 'CSV'], dest='output', dest='output_csv', help=_('export stats to a csv file'))
help=_("Define additional HTML or CSV output")) # Server option
parser.add_argument('-p', '--port', default=self.server_port, type=int, dest='port', parser.add_argument('-p', '--port', default=self.server_port, type=int, dest='port',
help=_('define the client/server TCP port [default: %d]') % self.server_port) help=_('define the client/server TCP port [default: %d]') % self.server_port)
parser.add_argument('-P', '--password', dest='password_arg', parser.add_argument('-P', '--password', dest='password_arg',
@ -133,9 +134,10 @@ class GlancesMain(object):
parser.add_argument('--snmp-auth', default='password', dest='snmp_auth', parser.add_argument('--snmp-auth', default='password', dest='snmp_auth',
help=_('SNMP authentication key (only for SNMPv3)')) help=_('SNMP authentication key (only for SNMPv3)'))
parser.add_argument('-t', '--time', default=self.refresh_time, type=int, parser.add_argument('-t', '--time', default=self.refresh_time, type=int,
dest='seconds', help=_('set refresh time in seconds [default: %s sec]') % self.refresh_time) dest='time', help=_('set refresh time in seconds [default: %s sec]') % self.refresh_time)
parser.add_argument('-w', '--webserver', action='store_true', default=False, parser.add_argument('-w', '--webserver', action='store_true', default=False,
dest='webserver', help=_('run Glances in web server mode')) dest='webserver', help=_('run Glances in web server mode'))
# Other options
parser.add_argument('-1', '--percpu', action='store_true', default=False, parser.add_argument('-1', '--percpu', action='store_true', default=False,
dest='percpu', help=_('start Glances in per CPU mode')) dest='percpu', help=_('start Glances in per CPU mode'))
@ -182,11 +184,11 @@ class GlancesMain(object):
self.client_tag = True self.client_tag = True
self.server_ip = args.client self.server_ip = args.client
if args.output is not None: # if args.output is not None:
setattr(self, args.output.lower() + '_tag', True) # setattr(self, args.output.lower() + '_tag', True)
if args.file is not None: # if args.file is not None:
output_file = args.file # output_file = args.file
output_folder = args.file # output_folder = args.file
# /!!! # /!!!
# Interactive cmds like CLI args? # Interactive cmds like CLI args?

View File

@ -35,17 +35,14 @@ class GlancesStandalone():
# Initial system informations update # Initial system informations update
self.stats.update() self.stats.update()
# Init HTML output
# !!! TODO
# if html_tag:
# htmloutput = glancesHtml(html_path=output_folder,
# refresh_time=refresh_time)
# Init CSV output # Init CSV output
# !!! TODO if args.output_csv is not None:
# if csv_tag: from glances.outputs.glances_csv import glancesCsv
# csvoutput = glancesCsv(cvsfile=output_file,
# refresh_time=refresh_time) self.csvoutput = glancesCsv(args=args)
self.csv_tag = True
else:
self.csv_tag = False
# Init screen # Init screen
self.screen = glancesCurses(args=args) self.screen = glancesCurses(args=args)
@ -61,18 +58,16 @@ class GlancesStandalone():
# Update the screen # Update the screen
self.screen.update(self.stats) self.screen.update(self.stats)
# Update the HTML output
# !!! TODO
# if html_tag:
# htmloutput.update(stats)
# Update the CSV output # Update the CSV output
# !!! TODO if self.csv_tag:
# if csv_tag: self.csvoutput.update(self.stats)
# csvoutput.update(stats)
def end(self): def end(self):
""" """
End of the CLI End of the CLI
""" """
self.screen.end() self.screen.end()
# Close the CSV file
if self.csv_tag:
self.csvoutput.exit()

View File

@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
#
# This file is part of Glances.
#
# Copyright (C) 2014 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/>.
# Import sys libs
import os
import sys
try:
import csv
except ImportError:
print('CSV module not found. Glances cannot extract to .csv file.')
sys.exit(1)
# Import Glances libs
from glances.core.glances_globals import is_py3
# List of stats enable in the CSV output
csv_stats_list = [ 'cpu', 'load', 'mem', 'memswap' ]
class glancesCsv:
"""
This class manages the CSV output
"""
def __init__(self, args=None):
# Init refresh time
self.__refresh_time = args.time
# CSV file name
self.__csvfile_name = args.output_csv
# Set the CSV output file
try:
if is_py3:
self.__csvfile_fd = open(self.__csvfile_name, 'w', newline='')
else:
self.__csvfile_fd = open(self.__csvfile_name, 'wb')
self.__csvfile = csv.writer(self.__csvfile_fd, quoting=csv.QUOTE_NONE)
except IOError as error:
print(_("Cannot create the CSV output file: %s") % error)
sys.exit(2)
print("{0}: {1}".format(_("Stats dumped in the CSV file"), self.__csvfile_name))
def exit(self):
self.__csvfile_fd.close()
def update(self, stats):
"""
Update stats in the CSV output file
"""
all_stats = stats.getAll()
# Loop over available plugin
i = 0
for p in stats.getAllPlugins():
if p in csv_stats_list:
# First line for comment: csv_comment
csv_comment = [ '# ' + str(p) + ': ' + '|'.join(all_stats[i].keys()) ]
self.__csvfile.writerow(csv_comment)
# Second line for stats (CSV): csv_stats
self.__csvfile.writerow(all_stats[i].values())
i += 1
self.__csvfile_fd.flush()

View File

@ -149,7 +149,7 @@ class glancesCurses:
self.term_window = self.screen.subwin(0, 0) self.term_window = self.screen.subwin(0, 0)
# Init refresh time # Init refresh time
self.__refresh_time = args.seconds self.__refresh_time = args.time
# Init process sort method # Init process sort method
self.args.process_sorted_by = 'auto' self.args.process_sorted_by = 'auto'