diff options
Diffstat (limited to '.i3/py3status/backup/netdata.py')
-rw-r--r-- | .i3/py3status/backup/netdata.py | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/.i3/py3status/backup/netdata.py b/.i3/py3status/backup/netdata.py new file mode 100644 index 0000000..729983b --- /dev/null +++ b/.i3/py3status/backup/netdata.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- + +# netdata + +# Netdata is a module uses great Py3status (i3status wrapper) to +# display network information (Linux systems) in i3bar. +# For more information read: +# i3wm homepage: http://i3wm.org +# py3status homepage: https://github.com/ultrabug/py3status + +# Copyright (C) <2013> <Shahin Azad [ishahinism at Gmail]> + +# 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 <http://www.gnu.org/licenses/>. + +# ----------------------------------------------------------------- # +# Notes: +# 1. netdata will check 'eth0' interface by default. You can +# change it by changing 'self.net_interface' variable in 'GetData' +# class. +# 2. Colors are depended on strict specification in traffic/netspeed methods. +# You can change them by manipulating conditions. + +import subprocess +from time import time + +# Method 'netSpeed' will use this variables to calculate downloaded +# bytes in last second. Initializing this variables globally is +# necessary since we can't use __init__ method in Py3Status class. +old_transmitted, old_received = 0, 0 + + +class GetData: + """Get system status + + """ + def __init__(self): + # You can change it to another interface. + # It'll be used for grabbing net interface data. + self.net_interface = 'eth0' + + def execCMD(self, cmd, arg): + """Take a system command and its argument, then return the result. + + Arguments: + - `cmd`: system command. + - `arg`: argument. + """ + result = subprocess.check_output([cmd, arg]) + return result + + def netBytes(self): + """Execute 'cat /proc/net/dev', find the interface line (Default + 'eth0') and grab received/transmitted bytes. + + """ + net_data = self.execCMD('cat', '/proc/net/dev').decode('utf-8').split() + interface_index = net_data.index(self.net_interface + ':') + received_bytes = int(net_data[interface_index + 1]) + transmitted_bytes = int(net_data[interface_index + 9]) + + return received_bytes, transmitted_bytes + + +class Py3status: + """ + System status in i3bar + """ + def netSpeed(self, json, i3status_config): + """Calculate network speed ('eth0' interface) and return it. You can + change the interface using 'self.net_interface' variable in + 'GetData' class. + + """ + data = GetData() + response = {'full_text': '', 'name': 'net_speed'} + + global old_received + global old_transmitted + + received_bytes, transmitted_bytes = data.netBytes() + dl_speed = (received_bytes - old_received) / 1024. + up_speed = (transmitted_bytes - old_transmitted) / 1024. + + if dl_speed < 30: + response['color'] = i3status_config['color_bad'] + elif dl_speed < 60: + response['color'] = i3status_config['color_degraded'] + else: + response['color'] = i3status_config['color_good'] + + response['full_text'] = "LAN(Kb): {:5.1f}↓ {:5.1f}↑"\ + .format(dl_speed, up_speed) + response['cached_until'] = time() + + old_received, old_transmitted = received_bytes, transmitted_bytes + return (0, response) + + def traffic(self, json, i3status_config): + """Calculate networks used traffic. Same as 'netSpeed' method you can + change the interface. + + """ + data = GetData() + response = {'full_text': '', 'name': 'traffic'} + + received_bytes, transmitted_bytes = data.netBytes() + download = received_bytes / 1024 / 1024. + upload = transmitted_bytes / 1024 / 1024. + total = download + upload + + if total < 400: + response['color'] = i3status_config['color_good'] + elif total < 700: + response['color'] = i3status_config['color_degraded'] + else: + response['color'] = i3status_config['color_bad'] + + response['full_text'] = "T(Mb): {:3.0f}↓ {:3.0f}↑ {:3.0f}↕"\ + .format(download, upload, total) + + return (1, response) |