Validation initiale
This commit is contained in:
commit
870ecaac23
|
@ -0,0 +1,13 @@
|
|||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
|
@ -0,0 +1,11 @@
|
|||
# Qu'est-ce que c'est ?
|
||||
|
||||
Il s'agit d'un moniteur instantanné.
|
||||
|
||||
# Puis-je l'utiliser ?
|
||||
|
||||
Tout à fait, la [licence](LICENSE) permet tout à fait une utilisation en toute occasion.
|
||||
|
||||
# Comment l'utiliser ?
|
||||
|
||||
Il faut installer les bibliothèques curses et psutil pour Python3, ainsi que le démon hddtemp qui doit écouter sur le port 7634.
|
|
@ -0,0 +1,42 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import wrapper as start, init_pair as set_pair, color_pair as get_pair, COLOR_BLACK as black, COLOR_RED as red, COLOR_GREEN as green, COLOR_WHITE as white, COLOR_BLUE as blue, COLOR_YELLOW as yellow
|
||||
|
||||
# C'est pour importer des modules du repertoire courant
|
||||
from os.path import dirname
|
||||
from sys import path as pythonpath
|
||||
pythonpath.insert (0, dirname (__file__))
|
||||
|
||||
from utils import groupbythree, seconds_to_time, sleep_to_next_second
|
||||
from modules import title, uptime, loadavg, ram, network, sensors, hddtemp, df, dnsmasq_bounds, user
|
||||
modules = (title, uptime, loadavg, ram, network, sensors, hddtemp, df, dnsmasq_bounds, user)
|
||||
|
||||
def Main (screen):
|
||||
old_line = 0
|
||||
screen.clear ()
|
||||
set_pair (1, white, black)
|
||||
set_pair (2, blue, black)
|
||||
set_pair (3, green, black)
|
||||
set_pair (4, red, black)
|
||||
set_pair (5, yellow, black)
|
||||
while True:
|
||||
line = 0
|
||||
height, width = screen.getmaxyx ()
|
||||
for i in range (0, old_line + 1):
|
||||
for j in range (0, width - 1):
|
||||
screen.addstr (i, j, ' ', get_pair (1))
|
||||
for i in modules:
|
||||
line = i.main (line, screen)
|
||||
line += 1
|
||||
|
||||
screen.refresh ()
|
||||
old_line = line
|
||||
try:
|
||||
sleep_to_next_second ()
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
|
||||
|
||||
start (Main)
|
||||
print ('Quit')
|
|
@ -0,0 +1,83 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
mountpoints = (
|
||||
'/',
|
||||
)
|
||||
|
||||
# C'est pour importer des modules du repertoire parent
|
||||
from os.path import dirname
|
||||
from sys import path as pythonpath
|
||||
pythonpath.insert (0, dirname (dirname (__file__)))
|
||||
from utils import bytes_human
|
||||
|
||||
def diskfree (path):
|
||||
from os import statvfs
|
||||
fs = statvfs (path)
|
||||
def total ():
|
||||
return (int (fs.f_blocks*fs.f_bsize))
|
||||
def percent ():
|
||||
return (int ((fs.f_blocks - fs.f_bfree)/(fs.f_blocks*0.01)))
|
||||
def used ():
|
||||
return (int ((fs.f_blocks - fs.f_bfree)*fs.f_bsize))
|
||||
def free ():
|
||||
return (int (fs.f_bavail * fs.f_frsize))
|
||||
return [path, total (), used (), free (), percent ()]
|
||||
|
||||
def main (line, screen):
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Espace disque :', get_pair (1))
|
||||
line += 1
|
||||
|
||||
data = []
|
||||
for i in mountpoints:
|
||||
data.append (diskfree (i))
|
||||
table=[]
|
||||
for i in data:
|
||||
table.append ((i[0], bytes_human (i [1]), bytes_human (i[2]), bytes_human (i[3]), i [4]))
|
||||
max_lengths = [0, 0, 0, 0, 0]
|
||||
for i in table:
|
||||
length = len (i [0])
|
||||
if length > max_lengths [0]:
|
||||
max_lengths [0] = length
|
||||
length = len (i [1])
|
||||
if length > max_lengths [1]:
|
||||
max_lengths [1] = length
|
||||
length = len (i [2])
|
||||
if length > max_lengths [2]:
|
||||
max_lengths [2] = length
|
||||
length = len (i [3])
|
||||
if length > max_lengths [3]:
|
||||
max_lengths [3] = length
|
||||
length = len (str (i [4]) + '%')
|
||||
if length > max_lengths [4]:
|
||||
max_lengths [4] = length
|
||||
for i in table:
|
||||
x = 0
|
||||
f = '%-' + str (max_lengths [0]) + 's:'
|
||||
screen.addstr (line, x, f%(i [0]), get_pair (2))
|
||||
x += max_lengths [0] + 2
|
||||
|
||||
f = '%' + str (max_lengths [1]) + 's'
|
||||
screen.addstr (line, x, f%((i[1])), get_pair (3))
|
||||
x += max_lengths [1] + 3
|
||||
|
||||
f = '%' + str (max_lengths [2]) + 's'
|
||||
screen.addstr (line, x, f%((i[2])), get_pair (3))
|
||||
x += max_lengths [2] + 3
|
||||
|
||||
f = '%' + str (max_lengths [3]) + 's'
|
||||
screen.addstr (line, x, f%((i[3])), get_pair (3))
|
||||
x += max_lengths [3] + 3
|
||||
|
||||
f = '%' + str (max_lengths [4]) + 's'
|
||||
if i[4] < 90:
|
||||
screen.addstr (line, x, f%((i[4])), get_pair (3))
|
||||
else:
|
||||
screen.addstr (line, x, f%((i[4])), get_pair (4))
|
||||
screen.addstr (line, x + max_lengths [4] + 1, '%', get_pair (1))
|
||||
x += max_lengths [4] + 5
|
||||
|
||||
line += 1
|
||||
return (line)
|
|
@ -0,0 +1,74 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
border = '|'
|
||||
critical_bounds = 60
|
||||
bound_file = '/var/lib/misc/dnsmasq.leases'
|
||||
|
||||
# C'est pour importer des modules du repertoire parent
|
||||
from os.path import dirname
|
||||
from sys import path as pythonpath
|
||||
pythonpath.insert (0, dirname (dirname (__file__)))
|
||||
from utils import seconds_to_time
|
||||
|
||||
def dnsmasq_dhcpbounds ():
|
||||
'''
|
||||
Return a tuple of the active leases and the remaining time in second
|
||||
tuple format for each bound :
|
||||
(remaining_time, mac, ip, hostname)
|
||||
'''
|
||||
from csv import reader
|
||||
from socket import inet_aton
|
||||
from time import time
|
||||
bounds1 = []
|
||||
for i in reader (open (bound_file), delimiter = ' '):
|
||||
if i [0] != 'duid':
|
||||
bounds1.append (i)
|
||||
bounds2 = []
|
||||
for i in sorted (bounds1, key=lambda item: inet_aton(item[2])):
|
||||
remain = int (i [0]) - int (time ())
|
||||
bounds2.append ((remain, i[1], i[2], i[3]))
|
||||
return bounds2
|
||||
|
||||
def main (line, screen):
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Baux DHCP', get_pair (1))
|
||||
line += 1
|
||||
bounds = dnsmasq_dhcpbounds ()
|
||||
max_lengths = [0, 0, 0, 0]
|
||||
border_length = len (border)
|
||||
for i in bounds:
|
||||
length = len (seconds_to_time (i [0]))
|
||||
if length > max_lengths [0]:
|
||||
max_lengths [0] = length
|
||||
length = len (i [1])
|
||||
if length > max_lengths [1]:
|
||||
max_lengths [1] = length
|
||||
length = len (i [2])
|
||||
if length > max_lengths [2]:
|
||||
max_lengths [2] = length
|
||||
length = len (i [3])
|
||||
if length > max_lengths [3]:
|
||||
max_lengths [3] = length
|
||||
for i in bounds:
|
||||
x=0
|
||||
if i [0] < critical_bounds:
|
||||
screen.addstr (line, x, seconds_to_time (i [0]), get_pair (4))
|
||||
else:
|
||||
screen.addstr (line, x, seconds_to_time (i [0]), get_pair (3))
|
||||
x += max_lengths [0] + 1
|
||||
screen.addstr (line, x, '|', get_pair (1))
|
||||
x += border_length + 1
|
||||
screen.addstr (line, x, i [1], get_pair (2))
|
||||
x += max_lengths [1] + 1
|
||||
screen.addstr (line, x, '|', get_pair (1))
|
||||
x += border_length + 1
|
||||
screen.addstr (line, x, i [2], get_pair (2))
|
||||
x += max_lengths [2] + 1
|
||||
screen.addstr (line, x, '|', get_pair (1))
|
||||
x += border_length + 1
|
||||
screen.addstr (line, x, i [3], get_pair (2))
|
||||
x += max_lengths [3] + 1
|
||||
line += 1
|
||||
return (line)
|
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
hddtemp_addressport = ('localhost',7634)
|
||||
|
||||
def hddtemp ():
|
||||
'''
|
||||
Return an tuple of disks formated like (name, temp) where name is a string and temp a integer
|
||||
'''
|
||||
from socket import socket, AF_INET, SOCK_STREAM
|
||||
from re import sub
|
||||
data = []
|
||||
tries = 0
|
||||
while True:
|
||||
tries += 1
|
||||
s = socket(AF_INET, SOCK_STREAM)
|
||||
s.connect(hddtemp_addressport)
|
||||
d = s.recv(4096)
|
||||
s.close()
|
||||
data = d.decode ('utf-8').split('|')
|
||||
if d != b'|':
|
||||
break
|
||||
temps = []
|
||||
index = 0
|
||||
while True:
|
||||
try:
|
||||
index += 1
|
||||
name = sub ('/dev/', '', data [index])
|
||||
index += 2
|
||||
temp = int (data [index])
|
||||
index +=2
|
||||
temps.append ((name, temp))
|
||||
except IndexError:
|
||||
break
|
||||
return (temps)
|
||||
|
||||
def main (line, screen):
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Températures stockage :', get_pair (1))
|
||||
line += 1
|
||||
|
||||
data = hddtemp ()
|
||||
x = 0
|
||||
for i in data:
|
||||
screen.addstr (line, x, i [0] + ':', get_pair (2))
|
||||
x += len (i [0]) + 2
|
||||
if i [1] < 45:
|
||||
screen.addstr (line, x, str (i [1]), get_pair (3))
|
||||
else:
|
||||
screen.addstr (line, x, str (i [1]), get_pair (4))
|
||||
x += 2
|
||||
screen.addstr (line, x, '°C', get_pair (1))
|
||||
x += 4
|
||||
line += 1
|
||||
|
||||
return (line)
|
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
|
||||
def loadavg (sep=', '):
|
||||
'''
|
||||
Returns average load formated separated by sep
|
||||
'''
|
||||
from os import getloadavg as loadavg
|
||||
load = loadavg ()
|
||||
return ('%.2f'%load [0] + sep + '%.2f'%load [1] + sep + '%.2f'%load [2])
|
||||
|
||||
|
||||
def main (line, screen):
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Charges moyennes (1, 5, 15 minutes) :', get_pair (1))
|
||||
screen.addstr (line, 41, loadavg (), get_pair (2))
|
||||
line += 1
|
||||
return (line)
|
|
@ -0,0 +1,90 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
network_interfaces = ('eth0',)
|
||||
|
||||
# C'est pour importer des modules du repertoire parent
|
||||
from os.path import dirname
|
||||
from sys import path as pythonpath
|
||||
pythonpath.insert (0, dirname (dirname (__file__)))
|
||||
from utils import groupbythree
|
||||
|
||||
def netdevs(iface):
|
||||
'''
|
||||
RX and TX statistics for the iface network interface
|
||||
'''
|
||||
from collections import namedtuple
|
||||
with open('/proc/net/dev') as f:
|
||||
net_dump = f.readlines()
|
||||
device_data={}
|
||||
data = namedtuple('data',['rx','tx'])
|
||||
for line in net_dump[2:]:
|
||||
line = line.split(':')
|
||||
device_data[line[0].strip()] = data(int (line[1].split()[0]), int (line[1].split()[8]))
|
||||
return (device_data [iface].rx, device_data [iface].tx)
|
||||
|
||||
def main (line, screen):
|
||||
for i in ifaces:
|
||||
i [2] = i [1]
|
||||
i [1] = netdevs (i [0])
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Réseau :', get_pair (1))
|
||||
line += 1
|
||||
|
||||
table = []
|
||||
for i in ifaces:
|
||||
table.append ((i [0], groupbythree (i[1][0]), groupbythree (i[1][1]), groupbythree (i[1][0] - i[2][0]), groupbythree (i[1][1] - i[2][1])))
|
||||
max_lengths = [0, 0, 0, 0, 0]
|
||||
for i in table:
|
||||
length = len (i [0])
|
||||
if length > max_lengths [0]:
|
||||
max_lengths [0] = length
|
||||
length = len (i [1])
|
||||
if length > max_lengths [1]:
|
||||
max_lengths [1] = length
|
||||
length = len (i [2])
|
||||
if length > max_lengths [2]:
|
||||
max_lengths [2] = length
|
||||
length = len (i [3])
|
||||
if length > max_lengths [3]:
|
||||
max_lengths [3] = length
|
||||
length = len (i [4])
|
||||
if length > max_lengths [4]:
|
||||
max_lengths [4] = length
|
||||
for i in table:
|
||||
x = 0
|
||||
f = '%-' + str (max_lengths [0]) + 's:'
|
||||
screen.addstr (line, x, f%(i [0]), get_pair (2))
|
||||
x += max_lengths [0] + 2
|
||||
|
||||
screen.addstr (line, x, '↓', get_pair (1))
|
||||
f = '%' + str (max_lengths [1]) + 's'
|
||||
screen.addstr (line, x + 2, f%((i[1])), get_pair (3))
|
||||
screen.addstr (line, x + 3 + max_lengths [1], 'o', get_pair (1))
|
||||
x += max_lengths [1] + 5
|
||||
|
||||
screen.addstr (line, x,'↑', get_pair (1))
|
||||
f = '%' + str (max_lengths [2]) + 's'
|
||||
screen.addstr (line, x + 2, f%((i[2])), get_pair (3))
|
||||
screen.addstr (line, x + 3 + max_lengths [2], 'o', get_pair (1))
|
||||
x += max_lengths [2] + 5
|
||||
|
||||
screen.addstr (line, x, '↓', get_pair (1))
|
||||
f = '%' + str (max_lengths [3]) + 's'
|
||||
screen.addstr (line, x + 2, f%((i[3])), get_pair (3))
|
||||
screen.addstr (line, x + 3 + max_lengths [3], 'o/s', get_pair (1))
|
||||
x += max_lengths [3] + 7
|
||||
|
||||
screen.addstr (line, x, '↑', get_pair (1))
|
||||
f = '%' + str (max_lengths [4]) + 's'
|
||||
screen.addstr (line, x + 2, f%((i[4])), get_pair (3))
|
||||
screen.addstr (line, x + 3 + max_lengths [4], 'o/s', get_pair (1))
|
||||
x += max_lengths [4] + 7
|
||||
|
||||
line += 1
|
||||
return (line)
|
||||
|
||||
ifaces = []
|
||||
for i in network_interfaces:
|
||||
ifaces.append ([i, (0,0), (0,0)])
|
|
@ -0,0 +1,58 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
|
||||
def sensors_value (sensor):
|
||||
'''
|
||||
Returns the float value given by the sensor
|
||||
To get the sensor's name, start the sensors executable
|
||||
Warning, this function matches the first sensor named like that, hope that the good one
|
||||
'''
|
||||
from os import popen
|
||||
from re import findall
|
||||
sensors = popen ('sensors')
|
||||
data = ''
|
||||
for i in sensors:
|
||||
data += i
|
||||
sensors_line = findall (sensor + '.*', data) [0]
|
||||
value = findall ('[0-9][0-9\.]+', sensors_line) [0]
|
||||
#value = findall ('[0-9]*', findall (':[ +]*[0-9]*', sensors_line) [0]) [0]
|
||||
return (float (value))
|
||||
|
||||
def main (line, screen):
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Températures carte mère :', get_pair (1))
|
||||
line += 1
|
||||
|
||||
cpu = sensors_value ('CPU Temperature')
|
||||
cpu_fan = sensors_value ('CPU FAN Speed')
|
||||
mb = sensors_value ('MB Temperature')
|
||||
power = sensors_value ('POWER FAN Speed')
|
||||
|
||||
screen.addstr (line, 0, 'CPU:', get_pair (2))
|
||||
if cpu < 60:
|
||||
screen.addstr (line, 5, '%2.0f'%cpu, get_pair (3))
|
||||
else:
|
||||
screen.addstr (line, 5, '%2.0f'%cpu, get_pair (4))
|
||||
screen.addstr (line, 8, '°C', get_pair (1))
|
||||
screen.addstr (line, 12, 'MB:', get_pair (2))
|
||||
if mb < 45:
|
||||
screen.addstr (line, 16, '%2.0f'%mb, get_pair (3))
|
||||
else:
|
||||
screen.addstr (line, 16, '%2.0f'%mb, get_pair (4))
|
||||
screen.addstr (line, 19, '°C', get_pair (1))
|
||||
screen.addstr (line, 23, 'CPU fan:', get_pair (2))
|
||||
if cpu_fan < 7200 and cpu_fan > 800:
|
||||
screen.addstr (line, 32, '%4.0f'%cpu_fan, get_pair (3))
|
||||
else:
|
||||
screen.addstr (line, 32, '%4.0f'%cpu_fan, get_pair (4))
|
||||
screen.addstr (line, 37, 'RPM', get_pair (1))
|
||||
screen.addstr (line, 41, 'POWER fan:', get_pair (2))
|
||||
if power < 7200 and power > 1800:
|
||||
screen.addstr (line, 52, '%4.0f'%power, get_pair (3))
|
||||
else:
|
||||
screen.addstr (line, 52, '%4.0f'%power, get_pair (4))
|
||||
screen.addstr (line, 57, 'RPM', get_pair (1))
|
||||
line += 1
|
||||
return (line)
|
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
|
||||
def main (line, screen):
|
||||
from socket import gethostname as hostname
|
||||
from time import strftime
|
||||
from locale import setlocale, LC_ALL
|
||||
setlocale (LC_ALL, 'fr_FR.UTF-8')
|
||||
screen.addstr (line, 0, hostname () + ': ' + strftime ('%A %d %B %Y %T'), get_pair (1))
|
||||
line += 1
|
||||
return (line)
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
|
||||
# C'est pour importer des modules du repertoire parent
|
||||
from os.path import dirname
|
||||
from sys import path as pythonpath
|
||||
pythonpath.insert (0, dirname (dirname (__file__)))
|
||||
from utils import seconds_to_time
|
||||
|
||||
def uptime ():
|
||||
'''
|
||||
Returns formated uptime
|
||||
'''
|
||||
return seconds_to_time (round (float (open ('/proc/uptime').readline ().split ()[0])))
|
||||
|
||||
def main (line, screen):
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Durée de fonctionnement :', get_pair (1))
|
||||
screen.addstr (line, 29, uptime (), get_pair (2))
|
||||
line += 1
|
||||
return (line)
|
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from curses import color_pair as get_pair
|
||||
|
||||
def main (line, screen):
|
||||
from os import popen
|
||||
screen.addstr (line, 0, '-->', get_pair (5))
|
||||
screen.addstr (line, 3, 'Utilisateurs', get_pair (1))
|
||||
line += 1
|
||||
|
||||
w = popen ('w')
|
||||
users = []
|
||||
for i in w:
|
||||
users.append (i)
|
||||
for i in range (1, len (users)):
|
||||
screen.addstr (line, 0, users [i], get_pair (1))
|
||||
line += 1
|
||||
|
||||
return (line)
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
def groupbythree (integer, sep = ' '):
|
||||
'''
|
||||
Group integer by three figures
|
||||
Optionnal sep parameter is to define the char to put between groups and is space by default
|
||||
'''
|
||||
from re import sub
|
||||
return (sub (',', sep, '{:,}'.format (integer)))
|
||||
|
||||
def seconds_to_time (time):
|
||||
'''
|
||||
Converts a number of second time to formated time
|
||||
'''
|
||||
def leading_zero (value):
|
||||
return "%02d" % (value,)
|
||||
days = int (time/86400)
|
||||
hours = int ((time/3600) - (24*days))
|
||||
minutes = int ((time/60) - (1440*days) - (60*hours))
|
||||
seconds = int (time - (86400*days) - (3600*hours) - (60*minutes))
|
||||
if days == 0:
|
||||
if hours == 0:
|
||||
if minutes == 0:
|
||||
return (str (leading_zero (seconds)) + 's')
|
||||
else:
|
||||
return (str (leading_zero (minutes)) + 'm ' + str (leading_zero (seconds)) + 's')
|
||||
else:
|
||||
return (str (leading_zero (hours)) + 'h ' + str (leading_zero (minutes)) + 'm ' + str (leading_zero (seconds)) + 's')
|
||||
else:
|
||||
return (str (days) + "j " + str (leading_zero (hours)) + 'h ' + str (leading_zero (minutes)) + 'm ' + str (leading_zero (seconds)) + 's')
|
||||
|
||||
def sleep_to_next_second ():
|
||||
from time import sleep, time
|
||||
sleep (1-(time ()-int (time())))
|
||||
|
||||
def bytes_human (num):
|
||||
for x in ['B','KiB','MiB','GiB','TiB']:
|
||||
if num < 1024.0:
|
||||
return "%3.1f %s" % (num, x)
|
||||
num /= 1024.0
|
Loading…
Reference in New Issue