diff options
-rwxr-xr-x | bin/dmount | 73 | ||||
-rwxr-xr-x | bin/estimate-running-emerge | 4 | ||||
-rwxr-xr-x | bin/gamma | 10 | ||||
-rwxr-xr-x | bin/git-landed | 22 | ||||
-rwxr-xr-x | bin/make-efi-keys | 47 | ||||
-rwxr-xr-x | bin/qr-code | 58 | ||||
-rwxr-xr-x | bin/rst2html | 2 | ||||
-rwxr-xr-x | bin/set-screen | 8 | ||||
-rwxr-xr-x | bin/signal | 2 | ||||
-rwxr-xr-x | bin/zoom | 45 |
10 files changed, 262 insertions, 9 deletions
diff --git a/bin/dmount b/bin/dmount new file mode 100755 index 0000000..45448e3 --- /dev/null +++ b/bin/dmount @@ -0,0 +1,73 @@ +#!/usr/bin/env perl +use v5.24; +use strict; +use warnings; +use File::Basename; +use Try::Tiny; +use List::Util 'uniq'; +use Net::DBus; + +# you probably want /etc/udev/rules.d/88-udisks2.rules with: +# +# SUBSYSTEM=="block", ENV{UDISKS_FILESYSTEM_SHARED}="1" +# +# so everything is mounted under /media instead of /run/media/$USER/ + +my $bus = Net::DBus->system(); +my $srv = $bus->get_service('org.freedesktop.UDisks2'); +my $ud = $srv->get_object('/org/freedesktop/UDisks2/Manager'); + +sub filter_dev { + my ($device_path) = @_; + + my $dev = $srv->get_object($device_path); + return unless $dev->_net_dbus_introspector->has_interface('org.freedesktop.UDisks2.Filesystem'); + my $ignore = try { $dev->HintIgnore } catch { 1 }; + return if $ignore; + my $mounted = try { $dev->MountPoints->@* } catch { 1 }; + return if $mounted; + return $dev; +} + +sub list { + return map { $_->IdLabel || $_->IdUUID } + map { filter_dev($_) } + @{$ud->GetBlockDevices({})}; +} + +sub mount { + my ($name) = @_; + + my @devs = map { filter_dev($_) } uniq( + @{$ud->ResolveDevice({label=>$name},{})}, + @{$ud->ResolveDevice({uuid=>$name},{})}, + ); + die "No device matching '$name'\n" unless @devs; + + $_->Mount({}) for @devs; +} + +my $cmd = basename($0); +if (!@ARGV) { + warn <<"EOF"; +$cmd <name> # mount +$cmd --list # list names +$cmd --bashcomp # print completion code +EOF + exit 1; +} +elsif ($ARGV[0] eq '--list') { + say for list(); +} +elsif ($ARGV[0] eq '--bashcomp') { + print <<"EOF"; +_dmount_list() { + COMPREPLY=( $( compgen -W '\$($cmd --list)' -- "\$2" ) ) +} + +complete -F _dmount_list $cmd +EOF +} +else { + mount($ARGV[0]); +} diff --git a/bin/estimate-running-emerge b/bin/estimate-running-emerge index 84e4d50..08cabb9 100755 --- a/bin/estimate-running-emerge +++ b/bin/estimate-running-emerge @@ -6,6 +6,6 @@ mergelist=$( ) if [[ -n "$mergelist" ]]; then - <<<"$mergelist" genlop -p + <<<"$mergelist" /usr/bin/perl /usr/bin/genlop -p fi -genlop -c +/usr/bin/perl /usr/bin/genlop -c @@ -2,15 +2,17 @@ if [[ ${#@} == 1 ]]; then red=$1 - blue=$1 green=$1 + blue=$1 + brightness=1 else red=$1 - blue=$2 - green=$3 + green=$2 + blue=$3 + brightness=${4:-1} fi declare -a outputs=( $(xrandr --query --current | perl -nle 'm{^(\S+) connected} and print $1' ) ) for o in "${outputs[@]}"; do - xrandr --output "$o" --gamma "${red}:${green}:${blue}" + xrandr --output "$o" --gamma "${red}:${green}:${blue}" --brightness "$brightness" done diff --git a/bin/git-landed b/bin/git-landed new file mode 100755 index 0000000..420d6ac --- /dev/null +++ b/bin/git-landed @@ -0,0 +1,22 @@ +#!/bin/bash + +# shows the commit that "landed" a branch on HEAD +# +# git landed $commit-on-branch [ $head-to-land-on ] [ git-log options ] + +declare -a revs +declare -a flags + +for p in "$@"; do + if [[ $p =~ ^- ]]; then + flags+=( "$p" ) + else + revs+=( "$p" ) + fi +done + +there="${revs[0]:?need a commitish}" +here="${revs[1]:-HEAD}" + +git log "$here" ^"$there" --ancestry-path --merges --reverse -z "${flags[@]}" \ + | head -z -n 1 diff --git a/bin/make-efi-keys b/bin/make-efi-keys new file mode 100755 index 0000000..f6b424e --- /dev/null +++ b/bin/make-efi-keys @@ -0,0 +1,47 @@ +#!/bin/bash +# Copyright (c) 2015 by Roderick W. Smith +# see http://www.rodsbooks.com/efi-bootloaders/controlling-sb.html +# modified by Dakkar 2019 +# Licensed under the terms of the GPL v3 + +NAME="${1:-dakkar}" + +mkdir -p "keys-for-$NAME" +cd "keys-for-$NAME" + +openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME PK/" -keyout PK.key \ + -out PK.crt -days 3650 -nodes -sha256 +openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME KEK/" -keyout KEK.key \ + -out KEK.crt -days 3650 -nodes -sha256 +openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME DB/" -keyout DB.key \ + -out DB.crt -days 3650 -nodes -sha256 +openssl x509 -in PK.crt -out PK.cer -outform DER +openssl x509 -in KEK.crt -out KEK.cer -outform DER +openssl x509 -in DB.crt -out DB.cer -outform DER + +GUID="$(uuidgen)" +echo $GUID > myGUID.txt + +cert-to-efi-sig-list -g $GUID PK.crt PK.esl +cert-to-efi-sig-list -g $GUID KEK.crt KEK.esl +cert-to-efi-sig-list -g $GUID DB.crt DB.esl +rm -f noPK.esl +touch noPK.esl + +sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \ + -k PK.key -c PK.crt PK PK.esl PK.auth +sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \ + -k PK.key -c PK.crt PK noPK.esl noPK.auth +sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \ + -k PK.key -c PK.crt KEK KEK.esl KEK.auth +sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \ + -k KEK.key -c KEK.crt db DB.esl DB.auth + +chmod 0600 *.key + +echo "" +echo "" +echo "For use with KeyTool, copy the *.auth and *.esl files to a FAT USB" +echo "flash drive or to your EFI System Partition (ESP)." +echo "For use with most UEFIs' built-in key managers, copy the *.cer files." +echo "" diff --git a/bin/qr-code b/bin/qr-code new file mode 100755 index 0000000..b614a6a --- /dev/null +++ b/bin/qr-code @@ -0,0 +1,58 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Getopt::Long; + +my $data=''; +my $level='L'; +my $format='png'; +my $light='255:255:255'; +my $dark='0:0:0'; +my $size=10; + +my $res=GetOptions('data|d=s' => \$data, + 'level|l=s' => \$level, + 'format|f=s' => \$format, + 'size|s=i' => \$size, + 'light=s' => \$light, + 'dark=s' => \$dark, +); + +{ +$level=uc($level); +if ($level !~ /\A[MLQH]\z/) { + $level='L'; +} +} + +$data = join(' ',@ARGV) unless $data; + +if ($format eq 'txt') { + require Text::QRCode; + + my $qr=Text::QRCode->new( + level=>$level, + mode=>'8-bit', + ); + + my $arr=$qr->plot($data); + + print join "\n", map { join '', @$_ } @$arr; +} else { + require Imager::QRCode; + my $qr=Imager::QRCode->new( + size=>$size, + margin=>3, + level=>$level, + mode=>'8-bit', + lightcolor => Imager::Color->new(split ':',$light), + darkcolor => Imager::Color->new(split ':',$dark), + ); + + my $img=$qr->plot($data); + my $pid = open my $display, '|-', 'display' + or die "Can't start `display`: $!"; + $img->write(type=>$format, fh=>$display); + close $display; + waitpid $pid,0; +} diff --git a/bin/rst2html b/bin/rst2html index 252570e..24b45c0 100755 --- a/bin/rst2html +++ b/bin/rst2html @@ -4,4 +4,4 @@ thisdir="$(realpath "$(dirname "$0")")" #exec rst2html.py --stylesheet-path=html4css1.css,"$thisdir/pygments-default.css" --embed-stylesheet "$@" -exec rst2html5.py --stylesheet-path=plain.css,math.css,"$thisdir/pygments-default.css" --embed-stylesheet "$@" +exec rst2html5.py --stylesheet-path=minimal.css,plain.css,math.css,"$thisdir/pygments-default.css" --embed-stylesheet "$@" diff --git a/bin/set-screen b/bin/set-screen index 57bdd59..f2ffbfd 100755 --- a/bin/set-screen +++ b/bin/set-screen @@ -37,7 +37,11 @@ function make_display_state_dir() { function run_display_state_commands() { local dir - dir="$(display_state_dir)" + if [[ -n "$1" ]]; then + dir="${CONFIG_DIR}/$1" + else + dir="$(display_state_dir)" + fi if [[ -x "${dir}/command" ]]; then if [[ -x "${CONFIG_DIR}/pre-command" ]]; then @@ -68,7 +72,7 @@ EOF case "$1" in 'make') make_display_state_dir "$2" ;; 'which') display_state_dir ;; - '' | 'set') run_display_state_commands ;; + '' | 'set') run_display_state_commands "$2";; 'help' | '--help' ) print_usage ; exit 0 ;; *) >&2 print_usage; exit 1 ;; esac diff --git a/bin/signal b/bin/signal new file mode 100755 index 0000000..d910269 --- /dev/null +++ b/bin/signal @@ -0,0 +1,2 @@ +#!/bin/bash +exec signal-desktop --use-tray-icon >/dev/null 2>&1 diff --git a/bin/zoom b/bin/zoom new file mode 100755 index 0000000..f1d92c3 --- /dev/null +++ b/bin/zoom @@ -0,0 +1,45 @@ +#!/bin/bash + +# convert https://us02web.zoom.us/j/1111111?pwd=xxxxxxxx (the URI you +# usually get) +# +# into zoommtg://zoom.us/join?confno=1111111&pwd=xxxxxxxx (the URI +# that the zoom client actually wants) + +munge-zoom-uri() { + local uri="$1" + if [[ $uri =~ ^zoommtg://[^/]+/join ]]; then + echo "$uri" + return + fi + + if [[ $uri =~ ^https?://([^/.]+\.)?zoom\.us/j/([0-9]+)$ ]]; then + echo "zoommtg://zoom.us/join?confno=${BASH_REMATCH[2]}" + return + fi + + if [[ $uri =~ ^https?://([^/.]+\.)?zoom\.us/j/([0-9]+)\?pwd=(.+)$ ]]; then + echo "zoommtg://zoom.us/join?confno=${BASH_REMATCH[2]}&pwd=${BASH_REMATCH[3]}" + return + fi + + if [[ $uri =~ ^https?://([^/.]+\.)?zoom\.us/w/([0-9]+)\?pwd=(.+)$ ]]; then + echo "zoommtg://zoom.us/join?confno=${BASH_REMATCH[2]}&pwd=${BASH_REMATCH[3]}" + return + fi + + if [[ $uri =~ ^https?://([^/.]+\.)?zoom\.us/my/([a-zA-Z0-9]+)\?pwd=(.+)$ ]]; then + echo "zoommtg://zoom.us/join?confno=${BASH_REMATCH[2]}&pwd=${BASH_REMATCH[3]}" + return + fi + + >&2 echo "can't parse <$uri>, ignoring"; + return +} + +declare -a args +if [[ -n "$1" ]]; then + args+=("$(munge-zoom-uri "$1")") +fi + +exec /opt/zoom/ZoomLauncher "${args[@]}" |