aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/i3blocks
diff options
context:
space:
mode:
authorJesús <heckyel@hyperbola.info>2019-04-22 17:53:57 -0500
committerJesús <heckyel@hyperbola.info>2019-04-22 17:53:57 -0500
commit579c6dc5db24c8386c866f7af331e26c6863d521 (patch)
treecee31526d01fa1185a619a6a677c90e4c7ab4698 /scripts/i3blocks
parentcaf905c6491a6e9a0f4a5d9bac22da9e60c420b8 (diff)
downloadi3-config-579c6dc5db24c8386c866f7af331e26c6863d521.tar.lz
i3-config-579c6dc5db24c8386c866f7af331e26c6863d521.tar.xz
i3-config-579c6dc5db24c8386c866f7af331e26c6863d521.zip
add i3blocks custom and fix mediaplayer
Diffstat (limited to 'scripts/i3blocks')
-rwxr-xr-xscripts/i3blocks/bandwidth90
-rwxr-xr-xscripts/i3blocks/battery74
-rwxr-xr-xscripts/i3blocks/cpu_usage55
-rwxr-xr-xscripts/i3blocks/disk41
-rwxr-xr-xscripts/i3blocks/iface61
-rwxr-xr-xscripts/i3blocks/keyindicator70
-rwxr-xr-xscripts/i3blocks/load_average34
-rwxr-xr-xscripts/i3blocks/mediaplayer156
-rwxr-xr-xscripts/i3blocks/memory49
-rwxr-xr-xscripts/i3blocks/openvpn149
-rwxr-xr-xscripts/i3blocks/temperature69
-rwxr-xr-xscripts/i3blocks/volume70
-rwxr-xr-xscripts/i3blocks/wifi46
13 files changed, 964 insertions, 0 deletions
diff --git a/scripts/i3blocks/bandwidth b/scripts/i3blocks/bandwidth
new file mode 100755
index 0000000..d9d3ab2
--- /dev/null
+++ b/scripts/i3blocks/bandwidth
@@ -0,0 +1,90 @@
+#!/bin/bash
+# Copyright (C) 2012 Stefan Breunig <stefan+measure-net-speed@mathphys.fsk.uni-heidelberg.de>
+# Copyright (C) 2014 kaueraal
+# Copyright (C) 2015 Thiago Perrotta <perrotta dot thiago at poli dot ufrj dot br>
+
+# 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/>.
+
+# Use the provided interface, otherwise the device used for the default route.
+if [[ -n $BLOCK_INSTANCE ]]; then
+ INTERFACE=$BLOCK_INSTANCE
+else
+ INTERFACE=$(ip route | awk '/^default/ { print $5 ; exit }')
+fi
+
+# Issue #36 compliant.
+if ! [ -e "/sys/class/net/${INTERFACE}/operstate" ] || ! [ "`cat /sys/class/net/${INTERFACE}/operstate`" = "up" ]
+then
+ echo "$INTERFACE down"
+ echo "$INTERFACE down"
+ echo "#FF0000"
+ exit 0
+fi
+
+# path to store the old results in
+path="/dev/shm/$(basename $0)-${INTERFACE}"
+
+# grabbing data for each adapter.
+read rx < "/sys/class/net/${INTERFACE}/statistics/rx_bytes"
+read tx < "/sys/class/net/${INTERFACE}/statistics/tx_bytes"
+
+# get time
+time=$(date +%s)
+
+# write current data if file does not exist. Do not exit, this will cause
+# problems if this file is sourced instead of executed as another process.
+if ! [[ -f "${path}" ]]; then
+ echo "${time} ${rx} ${tx}" > "${path}"
+ chmod 0666 "${path}"
+fi
+
+# read previous state and update data storage
+read old < "${path}"
+echo "${time} ${rx} ${tx}" > "${path}"
+
+# parse old data and calc time passed
+old=(${old//;/ })
+time_diff=$(( $time - ${old[0]} ))
+
+# sanity check: has a positive amount of time passed
+[[ "${time_diff}" -gt 0 ]] || exit
+
+# calc bytes transferred, and their rate in byte/s
+rx_diff=$(( $rx - ${old[1]} ))
+tx_diff=$(( $tx - ${old[2]} ))
+rx_rate=$(( $rx_diff / $time_diff ))
+tx_rate=$(( $tx_diff / $time_diff ))
+
+# shift by 10 bytes to get KiB/s. If the value is larger than
+# 1024^2 = 1048576, then display MiB/s instead
+
+# incoming
+echo -n "IN "
+rx_kib=$(( $rx_rate >> 10 ))
+if [[ "$rx_rate" -gt 1048576 ]]; then
+ printf '%sM' "`echo "scale=1; $rx_kib / 1024" | bc`"
+else
+ echo -n "${rx_kib}K"
+fi
+
+echo -n " "
+
+# outgoing
+echo -n "OUT "
+tx_kib=$(( $tx_rate >> 10 ))
+if [[ "$tx_rate" -gt 1048576 ]]; then
+ printf '%sM' "`echo "scale=1; $tx_kib / 1024" | bc`"
+else
+ echo -n "${tx_kib}K"
+fi
diff --git a/scripts/i3blocks/battery b/scripts/i3blocks/battery
new file mode 100755
index 0000000..5ba6498
--- /dev/null
+++ b/scripts/i3blocks/battery
@@ -0,0 +1,74 @@
+#!/usr/bin/perl
+#
+# Copyright 2014 Pierre Mavro <deimos@deimos.fr>
+# Copyright 2014 Vivien Didelot <vivien@didelot.org>
+#
+# Licensed under the terms of the GNU GPL v3, or any later version.
+#
+# This script is meant to use with i3blocks. It parses the output of the "acpi"
+# command (often provided by a package of the same name) to read the status of
+# the battery, and eventually its remaining time (to full charge or discharge).
+#
+# The color will gradually change for a percentage below 85%, and the urgency
+# (exit code 33) is set if there is less that 5% remaining.
+
+use strict;
+use warnings;
+use utf8;
+
+my $acpi;
+my $status;
+my $percent;
+my $full_text;
+my $short_text;
+my $bat_number = $ENV{BLOCK_INSTANCE} || 0;
+
+# read the first line of the "acpi" command output
+open (ACPI, "acpi -b | grep 'Battery $bat_number' |") or die;
+$acpi = <ACPI>;
+close(ACPI);
+
+# fail on unexpected output
+if ($acpi !~ /: (\w+), (\d+)%/) {
+ die "$acpi\n";
+}
+
+$status = $1;
+$percent = $2;
+$full_text = "$percent%";
+
+if ($status eq 'Discharging') {
+ $full_text .= ' DIS';
+} elsif ($status eq 'Charging') {
+ $full_text .= ' CHR';
+}
+
+$short_text = $full_text;
+
+if ($acpi =~ /(\d\d:\d\d):/) {
+ $full_text .= " ($1)";
+}
+
+# print text
+print "$full_text\n";
+print "$short_text\n";
+
+# consider color and urgent flag only on discharge
+if ($status eq 'Discharging') {
+
+ if ($percent < 20) {
+ print "#FF0000\n";
+ } elsif ($percent < 40) {
+ print "#FFAE00\n";
+ } elsif ($percent < 60) {
+ print "#FFF600\n";
+ } elsif ($percent < 85) {
+ print "#A8FF00\n";
+ }
+
+ if ($percent < 5) {
+ exit(33);
+ }
+}
+
+exit(0);
diff --git a/scripts/i3blocks/cpu_usage b/scripts/i3blocks/cpu_usage
new file mode 100755
index 0000000..8c3c1f5
--- /dev/null
+++ b/scripts/i3blocks/cpu_usage
@@ -0,0 +1,55 @@
+#!/usr/bin/perl
+#
+# Copyright 2014 Pierre Mavro <deimos@deimos.fr>
+# Copyright 2014 Vivien Didelot <vivien@didelot.org>
+# Copyright 2014 Andreas Guldstrand <andreas.guldstrand@gmail.com>
+#
+# Licensed under the terms of the GNU GPL v3, or any later version.
+
+use strict;
+use warnings;
+use utf8;
+use Getopt::Long;
+
+# default values
+my $t_warn = 50;
+my $t_crit = 80;
+my $cpu_usage = -1;
+
+sub help {
+ print "Usage: cpu_usage [-w <warning>] [-c <critical>]\n";
+ print "-w <percent>: warning threshold to become yellow\n";
+ print "-c <percent>: critical threshold to become red\n";
+ exit 0;
+}
+
+GetOptions("help|h" => \&help,
+ "w=i" => \$t_warn,
+ "c=i" => \$t_crit);
+
+# Get CPU usage
+$ENV{LC_ALL}="en_US"; # if mpstat is not run under en_US locale, things may break, so make sure it is
+open (MPSTAT, 'mpstat 1 1 |') or die;
+while (<MPSTAT>) {
+ if (/^.*\s+(\d+\.\d+)\s+$/) {
+ $cpu_usage = 100 - $1; # 100% - %idle
+ last;
+ }
+}
+close(MPSTAT);
+
+$cpu_usage eq -1 and die 'Can\'t find CPU information';
+
+# Print short_text, full_text
+printf "%.2f%%\n", $cpu_usage;
+printf "%.2f%%\n", $cpu_usage;
+
+# Print color, if needed
+if ($cpu_usage >= $t_crit) {
+ print "#FF0000\n";
+ exit 33;
+} elsif ($cpu_usage >= $t_warn) {
+ print "#FFFC00\n";
+}
+
+exit 0;
diff --git a/scripts/i3blocks/disk b/scripts/i3blocks/disk
new file mode 100755
index 0000000..5511eac
--- /dev/null
+++ b/scripts/i3blocks/disk
@@ -0,0 +1,41 @@
+#!/bin/sh
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+
+# 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/>.
+
+DIR="${BLOCK_INSTANCE:-$HOME}"
+ALERT_LOW="${1:-10}" # color will turn red under this value (default: 10%)
+
+df -h -P -l "$DIR" | awk -v alert_low=$ALERT_LOW '
+/\/.*/ {
+ # full text
+ print $4
+
+ # short text
+ print $4
+
+ use=$5
+
+ # no need to continue parsing
+ exit 0
+}
+
+END {
+ gsub(/%$/,"",use)
+ if (100 - use < alert_low) {
+ # color
+ print "#FF0000"
+ }
+}
+'
diff --git a/scripts/i3blocks/iface b/scripts/i3blocks/iface
new file mode 100755
index 0000000..7014979
--- /dev/null
+++ b/scripts/i3blocks/iface
@@ -0,0 +1,61 @@
+#!/bin/bash
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+# Copyright (C) 2014 Alexander Keller <github@nycroth.com>
+
+# 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/>.
+
+#------------------------------------------------------------------------
+
+# Use the provided interface, otherwise the device used for the default route.
+if [[ -n $BLOCK_INSTANCE ]]; then
+ IF=$BLOCK_INSTANCE
+else
+ IF=$(ip route | awk '/^default/ { print $5 ; exit }')
+fi
+
+#------------------------------------------------------------------------
+
+# As per #36 -- It is transparent: e.g. if the machine has no battery or wireless
+# connection (think desktop), the corresponding block should not be displayed.
+[[ ! -d /sys/class/net/${IF} ]] && exit
+
+#------------------------------------------------------------------------
+
+if [[ "$(cat /sys/class/net/$IF/operstate)" = 'down' ]]; then
+ echo down # full text
+ echo down # short text
+ echo \#FF0000 # color
+ exit
+fi
+
+case $1 in
+ -4)
+ AF=inet ;;
+ -6)
+ AF=inet6 ;;
+ *)
+ AF=inet6? ;;
+esac
+
+# if no interface is found, use the first device with a global scope
+IPADDR=$(ip addr show $IF | perl -n -e "/$AF ([^\/]+).* scope global/ && print \$1 and exit")
+
+case $BLOCK_BUTTON in
+ 3) echo -n "$IPADDR" | xclip -q -se c ;;
+esac
+
+#------------------------------------------------------------------------
+
+echo "$IPADDR" # full text
+echo "$IPADDR" # short text
diff --git a/scripts/i3blocks/keyindicator b/scripts/i3blocks/keyindicator
new file mode 100755
index 0000000..9c21505
--- /dev/null
+++ b/scripts/i3blocks/keyindicator
@@ -0,0 +1,70 @@
+#!/usr/bin/perl
+#
+# Copyright 2014 Marcelo Cerri <mhcerri at gmail dot com>
+#
+# 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/>.
+
+use strict;
+use warnings;
+use utf8;
+use Getopt::Long;
+use File::Basename;
+
+# Default values
+my $indicator = $ENV{BLOCK_INSTANCE} || "CAPS";
+my $color_on = "#00FF00";
+my $color_off = "#222222";
+
+sub help {
+ my $program = basename($0);
+ printf "Usage: %s [-c <color on>] [-C <color off>]\n", $program;
+ printf " -c <color on>: hex color to use when indicator is on\n";
+ printf " -C <color off>: hex color to use when indicator is off\n";
+ printf "\n";
+ printf "Note: environment variable \$BLOCK_INSTANCE should be one of:\n";
+ printf " CAPS, NUM (default is CAPS).\n";
+ exit 0;
+}
+
+Getopt::Long::config qw(no_ignore_case);
+GetOptions("help|h" => \&help,
+ "c=s" => \$color_on,
+ "C=s" => \$color_off) or exit 1;
+
+# Key mapping
+my %indicators = (
+ CAPS => 0x00000001,
+ NUM => 0x00000002,
+);
+
+# Retrieve key flags
+my $mask = 0;
+open(XSET, "xset -q |") or die;
+while (<XSET>) {
+ if (/LED mask:\s*([0-9]+)/) {
+ $mask = $1;
+ last;
+ }
+}
+close(XSET);
+
+# Output
+printf "%s\n", $indicator;
+printf "%s\n", $indicator;
+if (($indicators{$indicator} || 0) & $mask) {
+ printf "%s\n", $color_on;
+} else {
+ printf "%s\n", $color_off;
+}
+exit 0
diff --git a/scripts/i3blocks/load_average b/scripts/i3blocks/load_average
new file mode 100755
index 0000000..37a5c71
--- /dev/null
+++ b/scripts/i3blocks/load_average
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+
+# 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/>.
+
+load="$(cut -d ' ' -f1 /proc/loadavg)"
+cpus="$(nproc)"
+
+# full text
+echo "$load"
+
+# short text
+echo "$load"
+
+# color if load is too high
+awk -v cpus=$cpus -v cpuload=$load '
+ BEGIN {
+ if (cpus <= cpuload) {
+ print "#FF0000";
+ exit 33;
+ }
+ }
+'
diff --git a/scripts/i3blocks/mediaplayer b/scripts/i3blocks/mediaplayer
new file mode 100755
index 0000000..f78bd78
--- /dev/null
+++ b/scripts/i3blocks/mediaplayer
@@ -0,0 +1,156 @@
+#!/usr/bin/env perl
+# Copyright (C) 2014 Tony Crisci <tony@dubstepdish.com>
+# Copyright (C) 2015 Thiago Perrotta <perrotta dot thiago at poli dot ufrj dot br>
+
+# 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/>.
+
+# Requires playerctl binary to be in your path (except cmus)
+# See: https://github.com/acrisci/playerctl
+
+# Set instance=NAME in the i3blocks configuration to specify a music player
+# (playerctl will attempt to connect to org.mpris.MediaPlayer2.[NAME] on your
+# DBus session).
+
+use Time::HiRes qw(usleep);
+use Env qw(BLOCK_INSTANCE);
+
+use constant DELAY => 50; # Delay in ms to let network-based players (spotify) reflect new data.
+use constant SPOTIFY_STR => 'spotify';
+
+my @metadata = ();
+my $player_arg = "";
+
+if ($BLOCK_INSTANCE) {
+ $player_arg = "--player='$BLOCK_INSTANCE'";
+}
+
+sub buttons {
+ my $method = shift;
+
+ if($method eq 'mpd') {
+ if ($ENV{'BLOCK_BUTTON'} == 1) {
+ system("mpc prev");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+ system("mpc toggle");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+ system("mpc next");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 4) {
+ system("mpc volume +10");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 5) {
+ system("mpc volume -10");
+ }
+ } elsif ($method eq 'cmus') {
+ if ($ENV{'BLOCK_BUTTON'} == 1) {
+ system("cmus-remote --prev");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+ system("cmus-remote --pause");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+ system("cmus-remote --next");
+ }
+ } elsif ($method eq 'playerctl') {
+ if ($ENV{'BLOCK_BUTTON'} == 1) {
+ system("playerctl $player_arg previous");
+ usleep(DELAY * 1000) if $BLOCK_INSTANCE eq SPOTIFY_STR;
+ } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+ system("playerctl $player_arg play-pause");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+ system("playerctl $player_arg next");
+ usleep(DELAY * 1000) if $BLOCK_INSTANCE eq SPOTIFY_STR;
+ } elsif ($ENV{'BLOCK_BUTTON'} == 4) {
+ system("playerctl $player_arg volume 0.01+");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 5) {
+ system("playerctl $player_arg volume 0.01-");
+ }
+ } elsif ($method eq 'rhythmbox') {
+ if ($ENV{'BLOCK_BUTTON'} == 1) {
+ system("rhythmbox-client --previous");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+ system("rhythmbox-client --play-pause");
+ } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+ system("rhythmbox-client --next");
+ }
+ }
+}
+
+sub cmus {
+ my @cmus = split /^/, qx(cmus-remote -Q);
+ if ($? == 0) {
+ foreach my $line (@cmus) {
+ my @data = split /\s/, $line;
+ if (shift @data eq 'tag') {
+ my $key = shift @data;
+ my $value = join ' ', @data;
+
+ @metadata[0] = $value if $key eq 'artist';
+ @metadata[1] = $value if $key eq 'title';
+ }
+ }
+
+ if (@metadata) {
+ buttons('cmus');
+
+ # metadata found so we are done
+ print(join ' - ', @metadata);
+ exit 0;
+ }
+ }
+}
+
+sub mpd {
+ my $data = qx(mpc current);
+ if (not $data eq '') {
+ buttons("mpd");
+ print($data);
+ exit 0;
+ }
+}
+
+sub playerctl {
+ buttons('playerctl');
+
+ my $artist = qx(playerctl $player_arg metadata artist);
+ chomp $artist;
+ # exit status will be nonzero when playerctl cannot find your player
+ exit(0) if $? || $artist eq '(null)';
+
+ push(@metadata, $artist) if $artist;
+
+ my $title = qx(playerctl $player_arg metadata title);
+ exit(0) if $? || $title eq '(null)';
+
+ push(@metadata, $title) if $title;
+
+ print(join(" - ", @metadata)) if @metadata;
+}
+
+sub rhythmbox {
+ buttons('rhythmbox');
+
+ my $data = qx(rhythmbox-client --print-playing --no-start);
+ print($data);
+}
+
+if ($player_arg eq '' or $player_arg =~ /mpd/) {
+ mpd;
+}
+elsif ($player_arg =~ /cmus/) {
+ cmus;
+}
+elsif ($player_arg =~ /rhythmbox/) {
+ rhythmbox;
+}
+else {
+ playerctl;
+}
+print("\n");
diff --git a/scripts/i3blocks/memory b/scripts/i3blocks/memory
new file mode 100755
index 0000000..e28af4e
--- /dev/null
+++ b/scripts/i3blocks/memory
@@ -0,0 +1,49 @@
+#!/bin/sh
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+
+# 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/>.
+
+TYPE="${BLOCK_INSTANCE:-mem}"
+
+awk -v type=$TYPE '
+/^MemTotal:/ {
+ mem_total=$2
+}
+/^MemFree:/ {
+ mem_free=$2
+}
+/^Buffers:/ {
+ mem_free+=$2
+}
+/^Cached:/ {
+ mem_free+=$2
+}
+/^SwapTotal:/ {
+ swap_total=$2
+}
+/^SwapFree:/ {
+ swap_free=$2
+}
+END {
+ # full text
+ if (type == "swap")
+ printf("%.1fG\n", (swap_total-swap_free)/1024/1024)
+ else
+ printf("%.1fG\n", mem_free/1024/1024)
+
+ # TODO: short text
+
+ # TODO: color (if less than X%)
+}
+' /proc/meminfo
diff --git a/scripts/i3blocks/openvpn b/scripts/i3blocks/openvpn
new file mode 100755
index 0000000..02aaba4
--- /dev/null
+++ b/scripts/i3blocks/openvpn
@@ -0,0 +1,149 @@
+#!/usr/bin/perl
+# Made by Pierre Mavro/Deimosfr <deimos@deimos.fr>
+# Licensed under the terms of the GNU GPL v3, or any later version.
+# Version: 0.2
+
+# Usage:
+# 1. The configuration name of OpenVPN should be familiar for you (home,work...)
+# 2. The device name in your configuration file should be fully named (tun0,tap1...not only tun or tap)
+# 3. When you launch one or multiple OpenVPN connexion, be sure the PID file is written in the correct folder (ex: --writepid /run/openvpn/home.pid)
+
+use strict;
+use warnings;
+use utf8;
+use Getopt::Long;
+
+my $openvpn_enabled='/dev/shm/openvpn_i3blocks_enabled';
+my $openvpn_disabled='/dev/shm/openvpn_i3blocks_disabled';
+
+# Print output
+sub print_output {
+ my $ref_pid_files = shift;
+ my @pid_files = @$ref_pid_files;
+ my $change=0;
+
+ # Total pid files
+ my $total_pid = @pid_files;
+ if ($total_pid == 0) {
+ print "VPN: down\n"x2;
+ # Delete OpenVPN i3blocks temp files
+ if (-f $openvpn_enabled) {
+ unlink $openvpn_enabled or die "Can't delete $openvpn_enabled\n";
+ # Colorize if VPN has just went down
+ print '#FF0000\n';
+ }
+ unless (-f $openvpn_disabled) {
+ open(my $shm, '>', $openvpn_disabled) or die "Can't write $openvpn_disabled\n";
+ }
+ exit(0);
+ }
+
+ # Check if interface device is present
+ my $vpn_found=0;
+ my $pid;
+ my $cmd_line;
+ my @config_name;
+ my @config_path;
+ my $interface;
+ my $current_config_path;
+ my $current_config_name;
+ foreach (@pid_files) {
+ # Get current PID
+ $pid=0;
+ open(PID, '<', $_);
+ while(<PID>) {
+ chomp $_;
+ $pid = $_;
+ }
+ close(PID);
+ # Check if PID has been found
+ if ($pid ==0) {
+ print "Can't get PID $_: $!\n";
+ }
+
+ # Check if PID is still alive
+ $cmd_line='/proc/'.$pid.'/cmdline';
+ if (-f $cmd_line) {
+ # Get config name
+ open(CMD_LINE, '<', $cmd_line);
+ while(<CMD_LINE>) {
+ chomp $_;
+ if ($_ =~ /--config\s*(.*\.conf)/) {
+ # Get interface from config file
+ $current_config_path = $1;
+ # Remove unwanted escape chars
+ $current_config_path =~ s/\x{00}//g;
+ $interface = 'null';
+ # Get configuration name
+ if ($current_config_path =~ /(\w+).conf/) {
+ $current_config_name=$1;
+ } else {
+ $current_config_name='unknow';
+ }
+ # Get OpenVPN interface device name
+ open(CONFIG, '<', $current_config_path) or die "Can't read config file '$current_config_path': $!\n";
+ while(<CONFIG>) {
+ chomp $_;
+ if ($_ =~ /dev\s+(\w+)/) {
+ $interface=$1;
+ last;
+ }
+ }
+ close(CONFIG);
+ # check if interface exist
+ unless ($interface eq 'null') {
+ if (-d "/sys/class/net/$interface") {
+ push @config_name, $current_config_name;
+ $vpn_found=1;
+ # Write enabled file
+ unless (-f $openvpn_enabled) {
+ open(my $shm, '>', $openvpn_enabled) or die "Can't write $openvpn_enabled\n";
+ $change=1;
+ }
+ }
+ }
+ }
+ }
+ close(CMD_LINE);
+ }
+ }
+
+ # Check if PID found
+ my $names;
+ my $short_status;
+ if ($vpn_found == 1) {
+ $names = join('/', @config_name);
+ $short_status='up';
+ } else {
+ $short_status='down';
+ $names = $short_status;
+ }
+
+ print "VPN: $names\n";
+ print "VPN: $short_status\n";
+
+ # Print color if there were changes
+ print "#00FF00\n" if ($change == 1);
+
+ exit(0);
+}
+
+sub check_opts {
+ # Vars
+ my @pid_file=glob '/run/openvpn/*.pid';
+
+ # Set options
+ GetOptions( "help|h" => \&help,
+ "p=s" => \@pid_file);
+
+ print_output(\@pid_file);
+}
+
+sub help {
+ print "Usage: openvpn [-d pid folder files]\n";
+ print "-d : pid folder files (default /run/openvpn/*.pid)\n";
+ print "Note: devices in configuration file should be named with their number (ex: tun0, tap1)\n";
+ exit(1);
+}
+
+&check_opts;
diff --git a/scripts/i3blocks/temperature b/scripts/i3blocks/temperature
new file mode 100755
index 0000000..ad745c3
--- /dev/null
+++ b/scripts/i3blocks/temperature
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+# Copyright 2014 Pierre Mavro <deimos@deimos.fr>
+# Copyright 2014 Vivien Didelot <vivien@didelot.org>
+# Copyright 2014 Andreas Guldstrand <andreas.guldstrand@gmail.com>
+# Copyright 2014 Benjamin Chretien <chretien at lirmm dot fr>
+
+# 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/>.
+
+use strict;
+use warnings;
+use utf8;
+use Getopt::Long;
+
+binmode(STDOUT, ":utf8");
+
+# default values
+my $t_warn = 70;
+my $t_crit = 90;
+my $chip = "";
+my $temperature = -9999;
+
+sub help {
+ print "Usage: temperature [-w <warning>] [-c <critical>] [--chip <chip>]\n";
+ print "-w <percent>: warning threshold to become yellow\n";
+ print "-c <percent>: critical threshold to become red\n";
+ print "--chip <chip>: sensor chip\n";
+ exit 0;
+}
+
+GetOptions("help|h" => \&help,
+ "w=i" => \$t_warn,
+ "c=i" => \$t_crit,
+ "chip=s" => \$chip);
+
+# Get chip temperature
+open (SENSORS, "sensors -u $chip |") or die;
+while (<SENSORS>) {
+ if (/^\s+temp1_input:\s+[\+]*([\-]*\d+\.\d)/) {
+ $temperature = $1;
+ last;
+ }
+}
+close(SENSORS);
+
+$temperature eq -9999 and die 'Cannot find temperature';
+
+# Print short_text, full_text
+print "$temperature°C\n" x2;
+
+# Print color, if needed
+if ($temperature >= $t_crit) {
+ print "#FF0000\n";
+ exit 33;
+} elsif ($temperature >= $t_warn) {
+ print "#FFFC00\n";
+}
+
+exit 0;
diff --git a/scripts/i3blocks/volume b/scripts/i3blocks/volume
new file mode 100755
index 0000000..a55db88
--- /dev/null
+++ b/scripts/i3blocks/volume
@@ -0,0 +1,70 @@
+#!/bin/bash
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+# Copyright (C) 2014 Alexander Keller <github@nycroth.com>
+
+# 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/>.
+
+#------------------------------------------------------------------------
+
+# The second parameter overrides the mixer selection
+# For PulseAudio users, use "pulse"
+# For Jack/Jack2 users, use "jackplug"
+# For ALSA users, you may use "default" for your primary card
+# or you may use hw:# where # is the number of the card desired
+MIXER="default"
+[ -n "$(lsmod | grep pulse)" ] && MIXER="pulse"
+[ -n "$(lsmod | grep jack)" ] && MIXER="jackplug"
+MIXER="${2:-$MIXER}"
+
+# The instance option sets the control to report and configure
+# This defaults to the first control of your selected mixer
+# For a list of the available, use `amixer -D $Your_Mixer scontrols`
+SCONTROL="${BLOCK_INSTANCE:-$(amixer -D $MIXER scontrols |
+ sed -n "s/Simple mixer control '\([A-Za-z ]*\)',0/\1/p" |
+ head -n1
+ )}"
+
+# The first parameter sets the step to change the volume by (and units to display)
+# This may be in in % or dB (eg. 5% or 3dB)
+STEP="${1:-5%}"
+
+#------------------------------------------------------------------------
+
+capability() { # Return "Capture" if the device is a capture device
+ amixer -D $MIXER get $SCONTROL |
+ sed -n "s/ Capabilities:.*cvolume.*/Capture/p"
+}
+
+volume() {
+ amixer -D $MIXER get $SCONTROL $(capability)
+}
+
+format() {
+ perl_filter='if (/.*\[(\d+%)\] (\[(-?\d+.\d+dB)\] )?\[(on|off)\]/)'
+ perl_filter+='{CORE::say $4 eq "off" ? "MUTE" : "'
+ # If dB was selected, print that instead
+ perl_filter+=$([[ $STEP = *dB ]] && echo '$3' || echo '$1')
+ perl_filter+='"; exit}'
+ perl -ne "$perl_filter"
+}
+
+#------------------------------------------------------------------------
+
+case $BLOCK_BUTTON in
+ 3) amixer -q -D $MIXER sset $SCONTROL $(capability) toggle ;; # right click, mute/unmute
+ 4) amixer -q -D $MIXER sset $SCONTROL $(capability) ${STEP}+ unmute ;; # scroll up, increase
+ 5) amixer -q -D $MIXER sset $SCONTROL $(capability) ${STEP}- unmute ;; # scroll down, decrease
+esac
+
+volume | format
diff --git a/scripts/i3blocks/wifi b/scripts/i3blocks/wifi
new file mode 100755
index 0000000..ffaccab
--- /dev/null
+++ b/scripts/i3blocks/wifi
@@ -0,0 +1,46 @@
+#!/bin/bash
+# Copyright (C) 2014 Alexander Keller <github@nycroth.com>
+
+# 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/>.
+
+#------------------------------------------------------------------------
+
+INTERFACE="${BLOCK_INSTANCE:-wlan0}"
+
+#------------------------------------------------------------------------
+
+# As per #36 -- It is transparent: e.g. if the machine has no battery or wireless
+# connection (think desktop), the corresponding block should not be displayed.
+[[ ! -d /sys/class/net/${INTERFACE}/wireless ]] ||
+ [[ "$(cat /sys/class/net/$INTERFACE/operstate)" = 'down' ]] && exit
+
+#------------------------------------------------------------------------
+
+QUALITY=$(grep $INTERFACE /proc/net/wireless | awk '{ print int($3 * 100 / 70) }')
+
+#------------------------------------------------------------------------
+
+echo $QUALITY% # full text
+echo $QUALITY% # short text
+
+# color
+if [[ $QUALITY -ge 80 ]]; then
+ echo "#00FF00"
+elif [[ $QUALITY -lt 80 ]]; then
+ echo "#FFF600"
+elif [[ $QUALITY -lt 60 ]]; then
+ echo "#FFAE00"
+elif [[ $QUALITY -lt 40 ]]; then
+ echo "#FF0000"
+fi