Pearu Vaalma
4 years ago
14 changed files with 904 additions and 15 deletions
@ -0,0 +1,113 @@ |
|||||||
|
#!/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/>. |
||||||
|
|
||||||
|
# Get custom IN and OUT labels if provided by command line arguments |
||||||
|
while [[ $# -gt 1 ]]; do |
||||||
|
key="$1" |
||||||
|
case "$key" in |
||||||
|
-i|--inlabel) |
||||||
|
INLABEL="$2" |
||||||
|
shift;; |
||||||
|
-o|--outlabel) |
||||||
|
OUTLABEL="$2" |
||||||
|
shift;; |
||||||
|
esac |
||||||
|
shift |
||||||
|
done |
||||||
|
|
||||||
|
[[ -z "$INLABEL" ]] && INLABEL="IN " |
||||||
|
[[ -z "$OUTLABEL" ]] && OUTLABEL="OUT " |
||||||
|
|
||||||
|
# Use the provided interface, otherwise the device used for the default route. |
||||||
|
if [[ -z $INTERFACE ]] && [[ -n $BLOCK_INSTANCE ]]; then |
||||||
|
INTERFACE=$BLOCK_INSTANCE |
||||||
|
elif [[ -z $INTERFACE ]]; then |
||||||
|
INTERFACE=$(ip route | awk '/^default/ { print $5 ; exit }') |
||||||
|
fi |
||||||
|
|
||||||
|
# Exit if there is no default route |
||||||
|
[[ -z "$INTERFACE" ]] && exit |
||||||
|
|
||||||
|
# Issue #36 compliant. |
||||||
|
if ! [ -e "/sys/class/net/${INTERFACE}/operstate" ] || \ |
||||||
|
(! [ "$TREAT_UNKNOWN_AS_UP" = "1" ] && |
||||||
|
! [ "`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 "$INLABEL" |
||||||
|
rx_kib=$(( $rx_rate >> 10 )) |
||||||
|
if hash bc 2>/dev/null && [[ "$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 "$OUTLABEL" |
||||||
|
tx_kib=$(( $tx_rate >> 10 )) |
||||||
|
if hash bc 2>/dev/null && [[ "$tx_rate" -gt 1048576 ]]; then |
||||||
|
printf '%sM\n' "`echo "scale=1; $tx_kib / 1024" | bc`" |
||||||
|
else |
||||||
|
echo "${tx_kib}K" |
||||||
|
fi |
@ -0,0 +1,94 @@ |
|||||||
|
#!/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 $ac_adapt; |
||||||
|
my $full_text; |
||||||
|
my $short_text; |
||||||
|
my $bat_number = $ENV{BAT_NUMBER} || 0; |
||||||
|
my $label = $ENV{LABEL} || ""; |
||||||
|
|
||||||
|
# read the first line of the "acpi" command output |
||||||
|
open (ACPI, "acpi -b 2>/dev/null | grep -v ' 0%' |") or die; |
||||||
|
$acpi = <ACPI>; |
||||||
|
close(ACPI); |
||||||
|
|
||||||
|
# fail on unexpected output |
||||||
|
if (not defined($acpi)) { |
||||||
|
# don't print anything to stderr if there is no battery |
||||||
|
exit(0); |
||||||
|
} |
||||||
|
elsif ($acpi !~ /: ([\w\s]+), (\d+)%/) { |
||||||
|
die "$acpi\n"; |
||||||
|
} |
||||||
|
|
||||||
|
$status = $1; |
||||||
|
$percent = $2; |
||||||
|
$full_text = "$label$percent%"; |
||||||
|
|
||||||
|
if ($status eq 'Discharging') { |
||||||
|
$full_text .= ' DIS'; |
||||||
|
} elsif ($status eq 'Charging') { |
||||||
|
$full_text .= ' CHR'; |
||||||
|
} elsif ($status eq 'Unknown') { |
||||||
|
open (AC_ADAPTER, "acpi -a |") or die; |
||||||
|
$ac_adapt = <AC_ADAPTER>; |
||||||
|
close(AC_ADAPTER); |
||||||
|
|
||||||
|
if ($ac_adapt =~ /: ([\w-]+)/) { |
||||||
|
$ac_adapt = $1; |
||||||
|
|
||||||
|
if ($ac_adapt eq 'on-line') { |
||||||
|
$full_text .= ' ONL'; |
||||||
|
} elsif ($ac_adapt eq 'off-line') { |
||||||
|
$full_text .= ' DIS'; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$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); |
@ -0,0 +1,62 @@ |
|||||||
|
#!/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 = $ENV{T_WARN} // 50; |
||||||
|
my $t_crit = $ENV{T_CRIT} // 80; |
||||||
|
my $cpu_usage = -1; |
||||||
|
my $decimals = $ENV{DECIMALS} // 2; |
||||||
|
my $label = $ENV{LABEL} // ""; |
||||||
|
|
||||||
|
sub help { |
||||||
|
print "Usage: cpu_usage [-w <warning>] [-c <critical>] [-d <decimals>]\n"; |
||||||
|
print "-w <percent>: warning threshold to become yellow\n"; |
||||||
|
print "-c <percent>: critical threshold to become red\n"; |
||||||
|
print "-d <decimals>: Use <decimals> decimals for percentage (default is $decimals) \n"; |
||||||
|
exit 0; |
||||||
|
} |
||||||
|
|
||||||
|
GetOptions("help|h" => \&help, |
||||||
|
"w=i" => \$t_warn, |
||||||
|
"c=i" => \$t_crit, |
||||||
|
"d=i" => \$decimals, |
||||||
|
); |
||||||
|
|
||||||
|
# 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\x00]?$/) { |
||||||
|
$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 |
||||||
|
print "${label}"; |
||||||
|
printf "%.${decimals}f%%\n", $cpu_usage; |
||||||
|
print "${label}"; |
||||||
|
printf "%.${decimals}f%%\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; |
@ -0,0 +1,48 @@ |
|||||||
|
#!/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="${DIR:-$BLOCK_INSTANCE}" |
||||||
|
DIR="${DIR:-$HOME}" |
||||||
|
ALERT_LOW="${ALERT_LOW:-$1}" |
||||||
|
ALERT_LOW="${ALERT_LOW:-10}" # color will turn red under this value (default: 10%) |
||||||
|
|
||||||
|
LOCAL_FLAG="-l" |
||||||
|
if [ "$1" = "-n" ] || [ "$2" = "-n" ]; then |
||||||
|
LOCAL_FLAG="" |
||||||
|
fi |
||||||
|
|
||||||
|
df -h -P $LOCAL_FLAG "$DIR" | awk -v label="$LABEL" -v alert_low=$ALERT_LOW ' |
||||||
|
/\/.*/ { |
||||||
|
# full text |
||||||
|
print label $4 |
||||||
|
|
||||||
|
# short text |
||||||
|
print label $4 |
||||||
|
|
||||||
|
use=$5 |
||||||
|
|
||||||
|
# no need to continue parsing |
||||||
|
exit 0 |
||||||
|
} |
||||||
|
|
||||||
|
END { |
||||||
|
gsub(/%$/,"",use) |
||||||
|
if (100 - use < alert_low) { |
||||||
|
# color |
||||||
|
print "#FF0000" |
||||||
|
} |
||||||
|
} |
||||||
|
' |
@ -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/>. |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
# Use the provided interface, otherwise the device used for the default route. |
||||||
|
IF="${IFACE:-$BLOCK_INSTANCE}" |
||||||
|
IF="${IF:-$(ip route | awk '/^default/ { print $5 ; exit }')}" |
||||||
|
|
||||||
|
# Exit if there is no default route |
||||||
|
[[ -z "$IF" ]] && exit |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
# 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 |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
AF=${ADDRESS_FAMILY:-inet6?} |
||||||
|
LABEL="${LABEL:-}" |
||||||
|
|
||||||
|
for flag in "$1" "$2"; do |
||||||
|
case "$flag" in |
||||||
|
-4) |
||||||
|
AF=inet ;; |
||||||
|
-6) |
||||||
|
AF=inet6 ;; |
||||||
|
-L) |
||||||
|
if [[ "$IF" = "" ]]; then |
||||||
|
LABEL="iface " |
||||||
|
else |
||||||
|
LABEL="$IF: " |
||||||
|
fi ;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
if [[ "$IF" = "" ]] || [[ "$(cat /sys/class/net/$IF/operstate)" = 'down' ]]; then |
||||||
|
echo "${LABEL}down" # full text |
||||||
|
echo "${LABEL}down" # short text |
||||||
|
echo \#FF0000 # color |
||||||
|
exit |
||||||
|
fi |
||||||
|
|
||||||
|
# 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 "$LABEL$IPADDR" # full text |
||||||
|
echo "$LABEL$IPADDR" # short text |
@ -0,0 +1,92 @@ |
|||||||
|
#!/usr/bin/env 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} || $ENV{KEY} || "CAPS"; |
||||||
|
my $text_on = $ENV{TEXT_ON} || $indicator; |
||||||
|
my $text_off = $ENV{TEXT_OFF} || $indicator; |
||||||
|
my $color_on = $ENV{COLOR_ON} || "#00FF00"; |
||||||
|
my $color_off = $ENV{COLOR_OFF} || "#222222"; |
||||||
|
my $bg_color_on = $ENV{BG_COLOR_ON}; |
||||||
|
my $bg_color_off = $ENV{BG_COLOR_OFF}; |
||||||
|
my $hide = $ENV{HIDE_WHEN_OFF} || 0; |
||||||
|
|
||||||
|
sub help { |
||||||
|
my $program = basename($0); |
||||||
|
printf "Usage: %s [-c <color on>] [-C <color off>] [-b <bg color on>] [-B <bg color off>] [--hide]\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 " -b <background color on>: hex color to use when indicator is on\n"; |
||||||
|
printf " -B <background color off>: hex color to use when indicator is off\n"; |
||||||
|
printf " --hide: don't output anything 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, |
||||||
|
"b=s" => \$bg_color_on, |
||||||
|
"B=s" => \$bg_color_off, |
||||||
|
"hide" => \$hide) 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-9a-f]+)/) { |
||||||
|
$mask = hex $1; |
||||||
|
last; |
||||||
|
} |
||||||
|
} |
||||||
|
close(XSET); |
||||||
|
|
||||||
|
# Determine if indicator is on or off |
||||||
|
my $indicator_status = ($indicators{$indicator} || 0) & $mask; |
||||||
|
|
||||||
|
# Exit if --hide and indicator is off |
||||||
|
if ($hide and !$indicator_status) { |
||||||
|
exit 0 |
||||||
|
} |
||||||
|
|
||||||
|
# Output |
||||||
|
$indicator = $indicator_status ? $text_on : $text_off; |
||||||
|
my $fg_color = $indicator_status ? $color_on : $color_off; |
||||||
|
my $bg_color = $indicator_status ? $bg_color_on : $bg_color_off; |
||||||
|
|
||||||
|
if (defined $bg_color) { |
||||||
|
printf "<span color='%s' bgcolor='%s'>%s</span>\n", $fg_color, $bg_color, $indicator; |
||||||
|
} else { |
||||||
|
printf "<span color='%s'>%s</span>\n", $fg_color, $indicator; |
||||||
|
} |
||||||
|
|
||||||
|
exit 0 |
@ -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; |
||||||
|
} |
||||||
|
} |
||||||
|
' |
@ -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"); |
@ -0,0 +1,69 @@ |
|||||||
|
#!/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 { |
||||||
|
if (type == "swap") { |
||||||
|
free=swap_free/1024/1024 |
||||||
|
used=(swap_total-swap_free)/1024/1024 |
||||||
|
total=swap_total/1024/1024 |
||||||
|
} else { |
||||||
|
free=mem_free/1024/1024 |
||||||
|
used=(mem_total-mem_free)/1024/1024 |
||||||
|
total=mem_total/1024/1024 |
||||||
|
} |
||||||
|
|
||||||
|
pct=0 |
||||||
|
if (total > 0) { |
||||||
|
pct=used/total*100 |
||||||
|
} |
||||||
|
|
||||||
|
# full text |
||||||
|
printf("%.1fG/%.1fG (%.f%%)\n", used, total, pct) |
||||||
|
|
||||||
|
# short text |
||||||
|
printf("%.f%%\n", pct) |
||||||
|
|
||||||
|
# color |
||||||
|
if (pct > 90) { |
||||||
|
print("#FF0000") |
||||||
|
} else if (pct > 80) { |
||||||
|
print("#FFAE00") |
||||||
|
} else if (pct > 70) { |
||||||
|
print("#FFF600") |
||||||
|
} |
||||||
|
} |
||||||
|
' /proc/meminfo |
@ -0,0 +1,91 @@ |
|||||||
|
#!/usr/bin/env 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, eventually 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 |
||||||
|
if [[ -z "$MIXER" ]] ; then |
||||||
|
MIXER="default" |
||||||
|
if command -v pulseaudio >/dev/null 2>&1 && pulseaudio --check ; then |
||||||
|
# pulseaudio is running, but not all installations use "pulse" |
||||||
|
if amixer -D pulse info >/dev/null 2>&1 ; then |
||||||
|
MIXER="pulse" |
||||||
|
fi |
||||||
|
fi |
||||||
|
[ -n "$(lsmod | grep jack)" ] && MIXER="jackplug" |
||||||
|
MIXER="${2:-$MIXER}" |
||||||
|
fi |
||||||
|
|
||||||
|
# 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` |
||||||
|
if [[ -z "$SCONTROL" ]] ; then |
||||||
|
SCONTROL="${BLOCK_INSTANCE:-$(amixer -D $MIXER scontrols | |
||||||
|
sed -n "s/Simple mixer control '\([^']*\)',0/\1/p" | |
||||||
|
head -n1 |
||||||
|
)}" |
||||||
|
fi |
||||||
|
|
||||||
|
# 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) |
||||||
|
if [[ -z "$STEP" ]] ; then |
||||||
|
STEP="${1:-5%}" |
||||||
|
fi |
||||||
|
|
||||||
|
# AMIXER(1): |
||||||
|
# "Use the mapped volume for evaluating the percentage representation like alsamixer, to be |
||||||
|
# more natural for human ear." |
||||||
|
NATURAL_MAPPING=${NATURAL_MAPPING:-0} |
||||||
|
if [[ "$NATURAL_MAPPING" != "0" ]] ; then |
||||||
|
AMIXER_PARAMS="-M" |
||||||
|
fi |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
capability() { # Return "Capture" if the device is a capture device |
||||||
|
amixer $AMIXER_PARAMS -D $MIXER get $SCONTROL | |
||||||
|
sed -n "s/ Capabilities:.*cvolume.*/Capture/p" |
||||||
|
} |
||||||
|
|
||||||
|
volume() { |
||||||
|
amixer $AMIXER_PARAMS -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}' |
||||||
|
output=$(perl -ne "$perl_filter") |
||||||
|
echo "$LABEL$output" |
||||||
|
} |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
case $BLOCK_BUTTON in |
||||||
|
3) amixer $AMIXER_PARAMS -q -D $MIXER sset $SCONTROL $(capability) toggle ;; # right click, mute/unmute |
||||||
|
4) amixer $AMIXER_PARAMS -q -D $MIXER sset $SCONTROL $(capability) ${STEP}+ unmute ;; # scroll up, increase |
||||||
|
5) amixer $AMIXER_PARAMS -q -D $MIXER sset $SCONTROL $(capability) ${STEP}- unmute ;; # scroll down, decrease |
||||||
|
esac |
||||||
|
|
||||||
|
volume | format |
@ -0,0 +1,53 @@ |
|||||||
|
#!/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/>. |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
if [[ -z "$INTERFACE" ]] ; then |
||||||
|
INTERFACE="${BLOCK_INSTANCE:-wlp3s0}" |
||||||
|
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/${INTERFACE}/wireless ]] && exit |
||||||
|
|
||||||
|
# If the wifi interface exists but no connection is active, "down" shall be displayed. |
||||||
|
if [[ "$(cat /sys/class/net/$INTERFACE/operstate)" = 'down' ]]; then |
||||||
|
echo "down" |
||||||
|
echo "down" |
||||||
|
echo "#FF0000" |
||||||
|
exit |
||||||
|
fi |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
QUALITY=$(grep $INTERFACE /proc/net/wireless | awk '{ print int($3 * 100 / 70) }') |
||||||
|
|
||||||
|
#------------------------------------------------------------------------ |
||||||
|
|
||||||
|
echo `nmcli -t -f NAME connection show --active | head -n 1` $QUALITY% # full text |
||||||
|
echo $QUALITY% # short text |
||||||
|
|
||||||
|
# color |
||||||
|
if [[ $QUALITY -ge 80 ]]; then |
||||||
|
echo "#00FF00" |
||||||
|
elif [[ $QUALITY -ge 60 ]]; then |
||||||
|
echo "#FFF600" |
||||||
|
elif [[ $QUALITY -ge 40 ]]; then |
||||||
|
echo "#FFAE00" |
||||||
|
else |
||||||
|
echo "#FF0000" |
||||||
|
fi |
Loading…
Reference in new issue