Source code for i3pystatus.ping

import subprocess

from i3pystatus import IntervalModule


[docs]class Ping(IntervalModule): """ This module display the ping value between your computer and a host. ``switch_state`` callback can disable the Ping when desired. ``host`` propertie can be changed for set a specific host. .. rubric:: Available formatters * {ping} the ping value in milliseconds. """ interval = 5 settings = ( "color", "format", ("color_disabled", "color when disabled"), ("color", "color when latency is below threshold"), ("color_bad", "color when latency is above threshold"), ("color_down", "color when ping fail"), ("format_disabled", "format string when disabled"), ("format_down", "format string when ping fail"), ("latency_threshold", "latency threshold in ms"), ("host", "host to ping") ) color = "#FFFFFF" color_bad = "#FFFF00" color_down = "#FF0000" color_disabled = None disabled = False format = "{ping} ms" format_down = "down" format_disabled = None latency_threshold = 120 host = "8.8.8.8" on_leftclick = "switch_state" def init(self): if not self.color_bad: self.color_bad = self.color if not self.color_down: self.color_down = self.color if not self.format_disabled: self.format_disabled = self.format_down if not self.color_disabled: self.color_disabled = self.color_down def switch_state(self): self.disabled = not self.disabled def ping_host(self): p = subprocess.Popen(["ping", "-c1", "-w%d" % self.interval, self.host], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) out, _ = p.communicate() if p.returncode == 0: return float(out.decode().split("\n")[1] .split("time=")[1].split()[0]) else: return None def run(self): if self.disabled: self.output = { "full_text": self.format_disabled, "color": self.color_disabled } return ping = self.ping_host() if not ping: self.output = { "full_text": self.format_down, "color": self.color_down } return color = self.color if ping > self.latency_threshold: color = self.color_bad self.output = { "full_text": self.format.format(ping=ping), "color": color }