# -*- coding: utf-8 -*-
|
|
#
|
|
# This file is part of Glances.
|
|
#
|
|
# Copyright (C) 2018 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/>.
|
|
|
|
# flake8: noqa
|
|
# pylint: skip-file
|
|
"""Python 2/3 compatibility shims."""
|
|
|
|
import operator
|
|
import sys
|
|
import unicodedata
|
|
import types
|
|
import subprocess
|
|
|
|
from glances.logger import logger
|
|
|
|
PY3 = sys.version_info[0] == 3
|
|
|
|
if PY3:
|
|
import queue
|
|
from configparser import ConfigParser, NoOptionError, NoSectionError
|
|
from statistics import mean
|
|
from xmlrpc.client import Fault, ProtocolError, ServerProxy, Transport, Server
|
|
from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
|
|
from urllib.request import urlopen
|
|
from urllib.error import HTTPError, URLError
|
|
from urllib.parse import urlparse
|
|
|
|
input = input
|
|
range = range
|
|
map = map
|
|
|
|
text_type = str
|
|
binary_type = bytes
|
|
bool_type = bool
|
|
long = int
|
|
|
|
viewkeys = operator.methodcaller('keys')
|
|
viewvalues = operator.methodcaller('values')
|
|
viewitems = operator.methodcaller('items')
|
|
|
|
def to_ascii(s):
|
|
"""Convert the bytes string to a ASCII string
|
|
Usefull to remove accent (diacritics)"""
|
|
if isinstance(s, binary_type):
|
|
return s.decode()
|
|
return s.encode('ascii', 'ignore').decode()
|
|
|
|
def listitems(d):
|
|
return list(d.items())
|
|
|
|
def listkeys(d):
|
|
return list(d.keys())
|
|
|
|
def listvalues(d):
|
|
return list(d.values())
|
|
|
|
def iteritems(d):
|
|
return iter(d.items())
|
|
|
|
def iterkeys(d):
|
|
return iter(d.keys())
|
|
|
|
def itervalues(d):
|
|
return iter(d.values())
|
|
|
|
def u(s):
|
|
if isinstance(s, text_type):
|
|
return s
|
|
return s.decode('utf-8', 'replace')
|
|
|
|
def b(s):
|
|
if isinstance(s, binary_type):
|
|
return s
|
|
return s.encode('utf-8')
|
|
|
|
def nativestr(s):
|
|
if isinstance(s, text_type):
|
|
return s
|
|
return s.decode('utf-8', 'replace')
|
|
|
|
def system_exec(command):
|
|
"""Execute a system command and return the resul as a str"""
|
|
try:
|
|
res = subprocess.run(command.split(' '),
|
|
stdout=subprocess.PIPE).stdout.decode('utf-8')
|
|
except Exception as e:
|
|
logger.debug('Can not evaluate command {} ({})'.format(command, e))
|
|
res = ''
|
|
return res.rstrip()
|
|
|
|
else:
|
|
import Queue as queue
|
|
from itertools import imap as map
|
|
from ConfigParser import SafeConfigParser as ConfigParser, NoOptionError, NoSectionError
|
|
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
|
|
from xmlrpclib import Fault, ProtocolError, ServerProxy, Transport, Server
|
|
from urllib2 import urlopen, HTTPError, URLError
|
|
from urlparse import urlparse
|
|
|
|
input = raw_input
|
|
range = xrange
|
|
ConfigParser.read_file = ConfigParser.readfp
|
|
|
|
text_type = unicode
|
|
binary_type = str
|
|
bool_type = types.BooleanType
|
|
long = long
|
|
|
|
viewkeys = operator.methodcaller('viewkeys')
|
|
viewvalues = operator.methodcaller('viewvalues')
|
|
viewitems = operator.methodcaller('viewitems')
|
|
|
|
def mean(numbers):
|
|
return float(sum(numbers)) / max(len(numbers), 1)
|
|
|
|
def to_ascii(s):
|
|
"""Convert the unicode 's' to a ASCII string
|
|
Usefull to remove accent (diacritics)"""
|
|
if isinstance(s, binary_type):
|
|
return s
|
|
return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
|
|
|
|
def listitems(d):
|
|
return d.items()
|
|
|
|
def listkeys(d):
|
|
return d.keys()
|
|
|
|
def listvalues(d):
|
|
return d.values()
|
|
|
|
def iteritems(d):
|
|
return d.iteritems()
|
|
|
|
def iterkeys(d):
|
|
return d.iterkeys()
|
|
|
|
def itervalues(d):
|
|
return d.itervalues()
|
|
|
|
def u(s):
|
|
if isinstance(s, text_type):
|
|
return s
|
|
return s.decode('utf-8')
|
|
|
|
def b(s):
|
|
if isinstance(s, binary_type):
|
|
return s
|
|
return s.encode('utf-8', 'replace')
|
|
|
|
def nativestr(s):
|
|
if isinstance(s, binary_type):
|
|
return s
|
|
return s.encode('utf-8', 'replace')
|
|
|
|
def system_exec(command):
|
|
"""Execute a system command and return the resul as a str"""
|
|
try:
|
|
res = subprocess.check_output(command.split(' '))
|
|
except Exception as e:
|
|
logger.debug('Can not execute command {} ({})'.format(command, e))
|
|
res = ''
|
|
return res.rstrip()
|
|
|
|
|
|
# Globals functions for both Python 2 and 3
|
|
|
|
|
|
def subsample(data, sampling):
|
|
"""Compute a simple mean subsampling.
|
|
|
|
Data should be a list of numerical itervalues
|
|
|
|
Return a subsampled list of sampling lenght
|
|
"""
|
|
if len(data) <= sampling:
|
|
return data
|
|
sampling_length = int(round(len(data) / float(sampling)))
|
|
return [mean(data[s * sampling_length:(s + 1) * sampling_length]) for s in range(0, sampling)]
|
|
|
|
|
|
def time_serie_subsample(data, sampling):
|
|
"""Compute a simple mean subsampling.
|
|
|
|
Data should be a list of set (time, value)
|
|
|
|
Return a subsampled list of sampling lenght
|
|
"""
|
|
if len(data) <= sampling:
|
|
return data
|
|
t = [t[0] for t in data]
|
|
v = [t[1] for t in data]
|
|
sampling_length = int(round(len(data) / float(sampling)))
|
|
t_subsampled = [t[s * sampling_length:(s + 1) * sampling_length][0] for s in range(0, sampling)]
|
|
v_subsampled = [mean(v[s * sampling_length:(s + 1) * sampling_length]) for s in range(0, sampling)]
|
|
return list(zip(t_subsampled, v_subsampled))
|