full_text = $full_text; $this->separator = $separator; if (null === $color) { $color = self::NORMAL; } $this->color = $color; } public function setFullText($full_text) { $this->full_text = $full_text; return $this; } public function getFullText() { return $this->full_text; } public function setColor($color) { $this->color = $color; return $this; } public function getColor() { return $this->color; } public function setSeparator($separator) { $this->separator = $separator; return $this; } public function getSeparator() { return $this->separator; } } class Element { public $attributes = null; public function __construct() { $this->attributes = array(); } public function setAttributes(array $attributes) { $this->attributes = $attributes; return $this; } public function getAttributes() { return $this->attributes; } public function addAttribute(Attribute $a) { $this->attributes[] = $a; } } class i3Bar { protected $elements = null; public function __construct() { $this->protected = array(); } public function setElements(array $elements) { $this->elements = $elements; return $this; } public function getElements() { return $this->elements; } public function addElement($e) { if (!empty($e)) { $this->elements[] = $e; } return $this; } public function addElementIfNotEmtpy($e) { if (empty($e)) { return $this; } return $this->addElement($e); } public function __toString() { $render = ',['; foreach ($this->getElements() as $element) { $attributes = $element->getAttributes(); if (!is_array($attributes)) { $attributes = array($attributes); } if (empty($attributes)) { continue; } $attrs = array(); foreach ($attributes as $attr) { $attr_render = '{'; if (!$attr->getSeparator()) { $attr_render .= sprintf('"full_text": "%s",', $attr->getFullText()); $attr_render .= '"separator": false,'; $attr_render .= '"separator_block_width": 0,'; } else { $attr_render .= sprintf('"full_text": " %s ",', $attr->getFullText()); $attr_render .= '"separator": true,'; $attr_render .= '"separator_block_width": 15,'; } $attr_render .= sprintf('"color": "%s"', $attr->getColor()); $attr_render .= '}'; $attrs[] = $attr_render; } $render .= count($element) > 1 ? '[' : ''; $render .= implode(',', $attrs).','; $render .= count($element) > 1 ? ']' : ''; } $render .= ']'; $render = str_replace(',]', ']', $render)."\n"; return $render; } } /** * IPS. */ function get_the_ips($ifaces = array()) { $element = new Element(); foreach ($ifaces as $iface) { preg_match('`inet ([^\s]+)`', shell_exec('ip addr show '.escapeshellcmd($iface)), $inet); if ($inet) { $element->addAttribute(new Attribute('['.$iface.'] '.$inet[1], Attribute::INFO)); } } return $element; } /** * BANDWITH. */ function get_the_bandwith($ifaces = array()) { $element = new Element(); foreach ($ifaces as $iface) { preg_match('`inet ([^\s]+)`', shell_exec('ip addr show '.escapeshellcmd($iface)), $inet); if ($inet) { $bwidth = explode(' ', preg_replace('/ +/', ' ', trim(shell_exec('ifstat -i '.escapeshellcmd($iface).' 1 1 | tail -n 1')))); //$dstats = trim(shell_exec('/sbin/ifconfig '.escapeshellcmd($iface).' | grep bytes | sed \'s/[()]//g\' | awk \'{print $3"Mo↓ "$7"Mo↑"}\'')); //$ips[] = '['.$iface.'] '.$bwidth[0].'Ko/s↓ '.$bwidth[1].'Ko/s↑ ('.$dstats.')'; $element->addAttribute(new Attribute('['.$iface.'] '.$bwidth[0].'Ko/s↓ '.$bwidth[1].'Ko/s↑', Attribute::INFO)); } } return $element; } /** * SENSORS. */ function get_sensors() { $sensors = array(); preg_match_all('/^([^:]+): +\+([0-9.]+)°C +\(high = \+([0-9.]+)°C, crit = \+([0-9.]+)°C\)/iU', shell_exec('sensors | grep "°C"'), $datas, PREG_SET_ORDER); var_dump($datas); foreach ($datas as $data) { } return $sensors; } function get_sensor($item) { get_sensors(); } /** * MOUNT. */ function get_the_mount_space_used($mount_point, $limits = array(70, 90)) { $element = new Element(); $mount_point = ' '.$mount_point.'$'; $mount = shell_exec('df -h | egrep '.escapeshellcmd($mount_point).' | head -n 1'); if ($mount) { list($dev, $size, $used, $free, $usedP, $point) = explode(' ', preg_replace('/\s+/', ' ', $mount)); $pourcent = intval($usedP); if ($pourcent < $limits[0]) { $color = Attribute::NORMAL; } elseif ($pourcent < $limits[1]) { $color = Attribute::WARNING; } else { $color = Attribute::CRITICAL; } $element->addAttribute(new Attribute('['.$point.'] '.$usedP, $color)); } return $element; } /** * DATE. */ function get_the_date() { $element = new Element(); $element->addAttribute(new Attribute(date('H:i:s'), Attribute::DATE)); $element->addAttribute(new Attribute(date('d/m/Y'), Attribute::DATE)); return $element; } /** * ACPI. */ function get_the_acpi() { $element = new Element(); $acpi = shell_exec('acpi'); if (!preg_match('`Discharging`', $acpi)) { preg_match('`([0-9]+%)`', $acpi, $values); if (!empty($values)) { $charging = $values[1]; if ($charging < 20) { $color = Attribute::CRITICAL; } elseif ($charging < 50) { $color = Attribute::WARNING; } else { $color = Attribute::NORMAL; } $charging .= '↑'; $element->addAttribute(new Attribute($charging, $color)); } return $element; } preg_match('`([0-9]+%), ([0-9]+:[0-9]+)`', $acpi, $values); if ($values[1] < 20) { $color = Attribute::CRITICAL; } elseif ($values[1] < 50) { $color = Attribute::WARNING; } else { $color = Attribute::INFO; } $charging = $values[1].'↓'; $times = str_replace(':', 'h', $values[2]); $element->addAttribute(new Attribute(implode(' ', array($charging, $times)), $color)); return $element; } /** * MUSIC. */ function get_the_master_volume() { $element = new Element(); $volume = shell_exec('amixer get Master | grep Mono:'); if ($volume) { preg_match('/\[([0-9%]+)\]/', $volume, $mach); if (isset($mach[1])) { $element->addAttribute(new Attribute($mach[1].' ♪', Attribute::MUSIC)); } } return $element; } function get_the_public_ip($ipv6 = false) { $element = new Element(); $memcache = new Memcached(); $key = $ipv6 ? 'ipv6' : 'ipv4'; $cache = 60 * 5; $memcache->addServer('localhost', 11211); $ip = $memcache->get($key); if (empty($ip)) { $ip = trim(shell_exec('wget -O - -q '.($ipv6 ? '-6' : '').' ip.deblan.org | head -n 1 | cut -c1-50')); if ($ip === '192.168.0.254') { $ip = trim(shell_exec('wget -O - -q '.($ipv6 ? '-6' : '').' "https://api.ipify.org/?format=text" | head -n 1 | cut -c1-50')); } elseif (empty($ip)) { $ip = '?'; } $memcache->set($key, '[wan] '.$ip, $cache); } $memcache->quit(); $element->addAttribute(new Attribute($ip, Attribute::INFO)); return $element; } function get_the_public_ipv4() { return get_the_public_ip(); } function get_the_public_ipv6() { return get_the_public_ip(true); } function get_spotify_metadata() { $status = trim(shell_exec('playerctl -p spotify status')); //if (!in_array($status, ['Playing', 'Paused'])) { if (!in_array($status, ['Playing'])) { return null; } // $status = str_replace( // ['Playing', 'Paused'], // ['▮▮', '▶'], // $status // ); $cleanup = function($d) { $string = trim(str_replace(['"', "'"], ' ', $d)); if (mb_strlen($string) > 15) { $string = substr($string, 0, 15).'…'; } return $string; }; $title = $cleanup(shell_exec('playerctl -p spotify metadata xesam:title')); $artist = $cleanup(shell_exec('playerctl -p spotify metadata xesam:artist')); $label = sprintf('%s – %s', $title, $artist); $element = new Element(); $element->addAttribute(new Attribute($label, Attribute::MUSIC)); return $element; } $bar = new i3Bar(); $bar ->addElement(get_the_bandwith(array('eth0', 'eth1', 'wlan0', 'easytether0'))) ->addElement(get_the_ips(array('eth0', 'eth1', 'wlan0', 'easytether0'))) ->addElement(get_the_public_ipv4()) ->addElement(get_the_mount_space_used('/')) ->addElement(get_the_mount_space_used('/home', array(80, 90))) ->addElement(get_the_mount_space_used('/share')) ->addElement(get_the_mount_space_used('/secured')) ->addElementIfNotEmtpy(get_spotify_metadata()) ->addElement(get_the_master_volume()) ->addElement(get_the_date()) ->addElement(get_the_acpi()) ; echo $bar;