diff options
author | Guillermo Ramos | 2025-09-16 23:25:18 +0200 |
---|---|---|
committer | Guillermo Ramos | 2025-09-16 23:32:22 +0200 |
commit | 7f3db6f949d632bb9f21436bf6e52a949f4e21aa (patch) | |
tree | 52adaa6133ed548a882b4914ddec6db372c61577 /capibarra | |
parent | 1e9d94d4c16d5f35f8bf6515c8dd6d9493a02f55 (diff) | |
download | cli-7f3db6f949d632bb9f21436bf6e52a949f4e21aa.tar.gz |
capibarra: OpenBSD
Diffstat (limited to 'capibarra')
-rwxr-xr-x | capibarra | 173 |
1 files changed, 140 insertions, 33 deletions
@@ -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; |