Onionr/onionr/onionrcommands/onionrstatistics.py

104 lines
4.9 KiB
Python
Raw Normal View History

2019-03-08 01:08:06 +00:00
'''
Onionr - Private P2P Communication
2019-03-08 01:08:06 +00:00
This module defines commands to show stats/details about the local node
'''
'''
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
'''
import os, uuid, time
import logger
from onionrblocks import onionrblockapi
from onionrblocks import onionrblacklist
from onionrutils import checkcommunicator, mnemonickeys
2019-08-05 23:09:04 +00:00
from utils import sizeutils, gethostname, getconsolewidth, identifyhome
2019-07-19 04:59:44 +00:00
from coredb import blockmetadb, daemonqueue, keydb
2019-07-31 05:10:28 +00:00
import onionrcrypto, config
2019-08-05 23:09:04 +00:00
from etc import onionrvalues
def show_stats():
2019-03-08 01:08:06 +00:00
try:
# define stats messages here
totalBlocks = len(blockmetadb.get_block_list())
2019-08-05 23:09:04 +00:00
home = identifyhome.identify_home()
signedBlocks = len(onionrblockapi.Block.getBlocks(signed = True))
totalBanned = len(onionrblacklist.OnionrBlackList().getList())
2019-03-08 01:08:06 +00:00
messages = {
# info about local client
2019-07-19 04:59:44 +00:00
'Onionr Daemon Status' : ((logger.colors.fg.green + 'Online') if checkcommunicator.is_communicator_running(timeout = 9) else logger.colors.fg.red + 'Offline'),
2019-03-08 01:08:06 +00:00
# file and folder size stats
'div1' : True, # this creates a solid line across the screen, a div
2019-08-05 23:09:04 +00:00
'Total Block Size' : sizeutils.human_size(sizeutils.size(home + 'blocks/')),
'Total Plugin Size' : sizeutils.human_size(sizeutils.size(home + 'plugins/')),
'Log File Size' : sizeutils.human_size(sizeutils.size(home + 'output.log')),
2019-03-08 01:08:06 +00:00
# count stats
'div2' : True,
'Known Peers (nodes)' : str(max(len(keydb.listkeys.list_adders()) - 1, 0)),
2019-08-05 23:09:04 +00:00
'Enabled Plugins' : str(len(config.get('plugins.enabled', list()))) + ' / ' + str(len(os.listdir(home + 'plugins/'))),
2019-03-08 01:08:06 +00:00
'Stored Blocks' : str(totalBlocks),
'Deleted Blocks' : str(totalBanned),
2019-03-08 01:08:06 +00:00
'Percent Blocks Signed' : str(round(100 * signedBlocks / max(totalBlocks, 1), 2)) + '%'
}
# color configuration
colors = {
'title' : logger.colors.bold,
'key' : logger.colors.fg.lightgreen,
'val' : logger.colors.fg.green,
'border' : logger.colors.fg.lightblue,
'reset' : logger.colors.reset
}
# pre-processing
maxlength = 0
2019-07-30 05:19:22 +00:00
width = getconsolewidth.get_console_width()
2019-03-08 01:08:06 +00:00
for key, val in messages.items():
if not (type(val) is bool and val is True):
maxlength = max(len(key), maxlength)
prewidth = maxlength + len(' | ')
groupsize = width - prewidth - len('[+] ')
# generate stats table
2019-08-05 23:09:04 +00:00
logger.info(colors['title'] + 'Onionr v%s Statistics' % onionrvalues.ONIONR_VERSION + colors['reset'], terminal=True)
logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True)
2019-03-08 01:08:06 +00:00
for key, val in messages.items():
if not (type(val) is bool and val is True):
val = [str(val)[i:i + groupsize] for i in range(0, len(str(val)), groupsize)]
logger.info(colors['key'] + str(key).rjust(maxlength) + colors['reset'] + colors['border'] + ' | ' + colors['reset'] + colors['val'] + str(val.pop(0)) + colors['reset'], terminal=True)
2019-03-08 01:08:06 +00:00
for value in val:
logger.info(' ' * maxlength + colors['border'] + ' | ' + colors['reset'] + colors['val'] + str(value) + colors['reset'], terminal=True)
2019-03-08 01:08:06 +00:00
else:
logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True)
logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True)
2019-03-08 01:08:06 +00:00
except Exception as e:
logger.error('Failed to generate statistics table. ' + str(e), error = e, timestamp = False, terminal=True)
2019-03-08 01:08:06 +00:00
2019-07-31 05:10:28 +00:00
def show_details():
2019-03-08 01:08:06 +00:00
details = {
2019-07-30 05:19:22 +00:00
'Node Address' : gethostname.get_hostname(),
2019-09-27 23:04:49 +00:00
'Public Key' : onionrcrypto.pub_key.replace('=', ''),
2019-07-19 04:59:44 +00:00
'Human-readable Public Key' : mnemonickeys.get_human_readable_ID()
2019-03-08 01:08:06 +00:00
}
for detail in details:
logger.info('%s%s: \n%s%s\n' % (logger.colors.fg.lightgreen, detail, logger.colors.fg.green, details[detail]), terminal = True)
2019-09-06 20:09:39 +00:00
show_details.onionr_help = "Shows relevant information for your Onionr install: node address, and active public key."
2019-09-06 20:09:39 +00:00
show_stats.onionr_help = "Shows statistics for your Onionr node. Slow if Onionr is not running"