aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcapibarra173
1 files changed, 140 insertions, 33 deletions
diff --git a/capibarra b/capibarra
index ff771e6..88d2a18 100755
--- a/capibarra
+++ b/capibarra
@@ -25,15 +25,30 @@ sub pango_onoff($txt, $on) {
return $on ? $txt : "<span strikethrough='true'>$txt</span>";
}
-sub render_iface($is_wireless, $name, $status, $addr) {
- my $extra = '';
- $extra .= " $addr" if $addr;
+sub txt_onoff($txt, $on) {
+ return $on ? $txt : "${txt}X";
+}
+
+sub render_iface_linux($is_wireless, $name, $status, $addr) {
+ my $extra = $addr ? " $addr" : '';
if ($is_wireless and $status eq 'UP') {
my ($ssid) = `iw dev $name link` =~ /SSID: ([^\n]*).*/;
my ($dbm) = `iw dev $name link` =~ /signal: ([0-9-]+ dBm)/;
$extra .= ' (' . $ssid . ', ' . $dbm . ')';
}
- return pango_onoff($is_wireless eq 1 ? '๐Ÿ›œ' : '๐ŸŒ', $status eq 'UP') . $extra;
+ return pango_onoff($is_wireless ? '๐Ÿ›œ' : '๐ŸŒ', $status eq 'UP') . $extra;
+}
+
+
+sub render_iface_openbsd($ifaces, $ifname) {
+ my $iface = $ifaces->{$ifname};
+ my $extra = $iface->{'ip'} ? " $iface->{'ip'}" : '';
+ my $is_wireless = exists $iface->{'wifi'};
+ my $is_up = $iface->{'up'};
+ if ($is_wireless and $is_up) {
+ $extra .= ' (' . $iface->{'wifi_ssid'} . ', ' . $iface->{'wifi_signal'} . ')';
+ }
+ return txt_onoff($is_wireless ? '๐Ÿ“ถ' : '๐ŸŒ', $is_up) . $extra;
}
@@ -51,65 +66,157 @@ sub show_time_delta($section, $time0, $computed) {
################################################################################
# Modules
-open(my $loadf, '<', '/proc/loadavg');
-my %mod_cpu = (
+# open(my $loadf, '<', '/proc/loadavg');
+# my %mod_cpu_linux = (
+# name => 'CPU',
+# period => 5,
+# compute => sub {
+# read($loadf, my $loads, 14);
+# seek($loadf, 0, 0);
+# return sprintf ("CPU %s/%s/%s", split ' ', $loads);
+# }
+# );
+
+my %mod_cpu_openbsd = (
name => 'CPU',
period => 5,
compute => sub {
- read($loadf, my $loads, 14);
- seek($loadf, 0, 0);
+ my $loads = `sysctl -n vm.loadavg`;
+ chomp $loads;
return sprintf ("CPU %s/%s/%s", split ' ', $loads);
}
);
-my %mod_mem = (
+# my %mod_mem_linux = (
+# name => 'MEMORY',
+# period => 5,
+# compute => sub {
+# my $mused = `free | awk '/^Mem:/ {printf("%d", 100 * (\$3/\$2))}'`;
+# return pango_warning(sprintf("MEM %s%%", $mused), $mused > 90);
+# }
+# );
+
+my %mod_mem_openbsd = (
name => 'MEMORY',
period => 5,
compute => sub {
- my $mused = `free | awk '/^Mem:/ {printf("%d", 100 * (\$3/\$2))}'`;
- return pango_warning(sprintf("MEM %s%%", $mused), $mused > 90);
+ my $uvmexp = `vmstat -s`;
+ my ($mtotal) = $uvmexp =~ /([0-9]+) pages managed/;
+ my ($mused) = $uvmexp =~ /([0-9]+) pages active/;
+ $mused = 100 * $mused / $mtotal;
+ return pango_warning(sprintf("MEM %d%%", $mused), $mused > 90);
}
);
-my %mod_net = (
+# my %mod_net_linux = (
+# name => 'NETWORK',
+# period => 4,
+# compute => sub {
+# my @wired = ();
+# my @wireless = ();
+# for (split("\n", `ip --br a`)) {
+# next if substr($_, 0, 2) eq 'lo'; # prevent regex
+# my ($if, $status, $addr) = $_ =~ /^(\S+)\s+(\S+)(?:\s+(\S+))?/;
+# push @wired, [0, $if, $status, $addr] if (substr($if, 0, 2) eq 'en');
+# push @wireless, [1, $if, $status, $addr] if (substr($if, 0, 2) eq 'wl');
+# }
+# return join ' | ', map { render_iface_linux(@$_) } @wired, @wireless;
+# }
+# );
+
+my %mod_net_openbsd = (
name => 'NETWORK',
period => 4,
compute => sub {
my @wired = ();
my @wireless = ();
- for (split("\n", `ip --br a`)) {
- next if substr($_, 0, 2) eq 'lo'; # prevent regex
- my ($if, $status, $addr) = $_ =~ /^(\S+)\s+(\S+)(?:\s+(\S+))?/;
- push @wired, [0, $if, $status, $addr] if (substr($if, 0, 2) eq 'en');
- push @wireless, [1, $if, $status, $addr] if (substr($if, 0, 2) eq 'wl');
+ my %ifaces;
+ my $ifname;
+ for (`ifconfig`) {
+ if (/^([a-z]+[0-9]+):/) {
+ $ifname = $1;
+ $ifaces{$ifname} = {};
+ $ifaces{$ifname}{'up'} = /UP/;
+ } elsif (/media: (.*)/) {
+ $ifaces{$ifname}{'media'} = $1;
+ } elsif (/ieee80211:.* join "([^"]*)".* ([0-9]+%)/) {
+ $ifaces{$ifname}{'wifi'} = 1;
+ $ifaces{$ifname}{'wifi_ssid'} = $1;
+ $ifaces{$ifname}{'wifi_signal'} = $2;
+ } elsif (/inet ([0-9.]+)/) {
+ $ifaces{$ifname}{'ip'} = $1;
+ }
+ }
+ foreach my $ifname (keys %ifaces) {
+ next if $ifname =~ /^lo[0-9]+/;
+ my $iface = $ifaces{$ifname};
+ next unless $iface->{'ip'} || $iface->{'media'};
+ if ($iface->{'wifi'}) {
+ push @wireless, $ifname;
+ } else {
+ push @wired, $ifname;
+ }
}
- return join ' | ', map { render_iface(@$_) } @wired, @wireless;
+ # use Data::Dumper;
+ # print Dumper(\%ifaces);
+ # print Dumper(\@wired);
+ # print Dumper(\@wireless);
+ return join ' ยท ', map { render_iface_openbsd(\%ifaces, $_) } sort(@wired), @wireless;
}
);
-my $BATDIR = glob '/sys/class/power_supply/BAT?';
-open(my $bcapf, '<', "$BATDIR/capacity");
-open(my $bstatf, '<', "$BATDIR/status");
-my %mod_bat = (
+# my $BATDIR = glob '/sys/class/power_supply/BAT?';
+# open(my $bcapf, '<', "$BATDIR/capacity");
+# open(my $bstatf, '<', "$BATDIR/status");
+# my %mod_bat_linux = (
+# name => 'BATTERY',
+# period => 3,
+# compute => sub {
+# my $batlevel = <$bcapf>;
+# chomp $batlevel;
+# seek($bcapf, 0, 0);
+# my $batcharging = <$bstatf> eq "Charging\n" ? 'โšก' : '';
+# seek($bstatf, 0, 0);
+# return pango_warning(sprintf("๐Ÿ”‹%s%s", $batlevel, $batcharging), $batlevel < 10);
+# }
+# );
+
+sub obsd_get_sysctl($mib) {
+ my @parts = split(' ', `sysctl -n $mib`);
+ return $parts[0];
+}
+my %mod_bat_openbsd = (
name => 'BATTERY',
period => 3,
compute => sub {
- my $batcharging = <$bstatf> eq "Charging\n" ? 'โšก' : '';
- seek($bstatf, 0, 0);
- my $batlevel = <$bcapf>;
- chomp $batlevel;
- seek($bcapf, 0, 0);
- return pango_warning(sprintf("๐Ÿ”‹%s%s", $batlevel, $batcharging), $batlevel < 10);
+ my $batcharging = obsd_get_sysctl('hw.sensors.acpibat0.raw0') eq "0" ? 'โšก' : '';
+ my $batmax = obsd_get_sysctl('hw.sensors.acpibat0.watthour0');
+ my $batcur = obsd_get_sysctl('hw.sensors.acpibat0.watthour3');
+ my $batlevel = 100 * $batcur / $batmax;
+ return pango_warning(sprintf("๐Ÿ”‹%d%%%s", $batlevel, $batcharging), $batlevel < 10);
}
);
-my %mod_audio = (
+# my %mod_audio_linux = (
+# name => 'AUDIO',
+# period => 2,
+# compute => sub {
+# return sprintf "%s%s",
+# pango_onoff('๐Ÿ”Š', do {`volctl vol-on`; $? == 0}),
+# pango_onoff('๐ŸŽค', do {`volctl mic-on`; $? == 0});
+# }
+# );
+
+my %mod_audio_openbsd = (
name => 'AUDIO',
period => 2,
compute => sub {
- return sprintf "%s%s",
- pango_onoff('๐Ÿ”Š', do {`volctl vol-on`; $? == 0}),
- pango_onoff('๐ŸŽค', do {`volctl mic-on`; $? == 0});
+ my $audioinfo = `sndioctl`;
+ my ($muted) = $audioinfo =~ /output\.mute=([01])/;
+ my ($micmuted) = $audioinfo =~ /input\.mute=([01])/;
+ return sprintf "%s %s",
+ txt_onoff('๐Ÿ”Š', $muted == 0),
+ txt_onoff('๐ŸŽค', $micmuted == 0);
}
);
@@ -126,7 +233,7 @@ my %mod_date = (
################################################################################
# Main
-my @mods = (\%mod_cpu, \%mod_mem, \%mod_net, \%mod_bat, \%mod_audio, \%mod_date);
+my @mods = (\%mod_cpu_openbsd, \%mod_mem_openbsd, \%mod_net_openbsd, \%mod_bat_openbsd, \%mod_audio_openbsd, \%mod_date);
my %cache;
my $profile = 0;