Merge remote-tracking branch 'ni/master'

This commit is contained in:
lassulus 2023-01-31 00:34:07 +01:00
commit 62bd490d1e
19 changed files with 226 additions and 204 deletions

View File

@ -1,5 +1,6 @@
with import ../../lib; with import ../../lib;
{ config, ... }: let { config, ... }:
let
hostDefaults = hostName: host: flip recursiveUpdate host ({ hostDefaults = hostName: host: flip recursiveUpdate host ({
ci = false; ci = false;
@ -13,62 +14,15 @@ with import ../../lib;
(krebs.genipv6 "wiregrill" "external" { inherit hostName; }).address; (krebs.genipv6 "wiregrill" "external" { inherit hostName; }).address;
}); });
in { in
{
hosts = mapAttrs hostDefaults { hosts = mapAttrs hostDefaults {
pepe = {
owner = config.krebs.users.palo;
nets = {
retiolum = {
ip4.addr = "10.243.23.1";
tinc.port = 720;
aliases = [ "pepe.r" ];
tinc.pubkey = builtins.readFile ./retiolum.pub;
};
};
};
schasch = {
owner = config.krebs.users.palo;
nets = {
retiolum = {
ip4.addr = "10.243.23.2";
tinc.port = 720;
aliases = [ "schasch.r" ];
tinc.pubkey = builtins.readFile ./retiolum.pub;
};
};
syncthing.id = "FLY7DHI-TJLEQBJ-JZNC4YV-NBX53Z2-ZBRWADL-BKSFXYZ-L4FMDVH-MOSEVAQ";
};
sterni = { sterni = {
owner = config.krebs.users.palo; owner = config.krebs.users.palo;
nets = { nets = {
retiolum = { retiolum = {
ip4.addr = "10.243.23.3";
tinc.port = 720; tinc.port = 720;
aliases = [ aliases = [ "sterni.r" ];
"sterni.r"
];
tinc.pubkey = builtins.readFile ./retiolum.pub;
};
};
};
workhorse = {
owner = config.krebs.users.palo;
nets = {
retiolum = {
ip4.addr = "10.243.23.5";
tinc.port = 720;
aliases = [ "workhorse.r" ];
tinc.pubkey = builtins.readFile ./retiolum.pub;
};
};
};
workout = {
owner = config.krebs.users.palo;
nets = {
retiolum = {
ip4.addr = "10.243.23.4";
tinc.port = 720;
aliases = [ "workout.r" ];
tinc.pubkey = builtins.readFile ./retiolum.pub; tinc.pubkey = builtins.readFile ./retiolum.pub;
}; };
}; };

View File

@ -0,0 +1 @@
+3GdhwFYmBr46bBwyqrY3UH9fU1b8c2Vqmx9JTY4syU=

View File

@ -26,10 +26,7 @@ with import <stockholm/lib>;
Port = ${toString tinc.config.host.nets.${netname}.tinc.port} Port = ${toString tinc.config.host.nets.${netname}.tinc.port}
${tinc.config.extraConfig} ${tinc.config.extraConfig}
''; '';
"tinc-up" = pkgs.writeDash "${netname}-tinc-up" '' "tinc-up" = pkgs.writeDash "${netname}-tinc-up" tinc.config.tincUp;
${tinc.config.iproutePackage}/sbin/ip link set ${netname} up
${tinc.config.tincUp}
'';
}); });
}; };
@ -60,7 +57,8 @@ with import <stockholm/lib>;
default = let default = let
net = tinc.config.host.nets.${netname}; net = tinc.config.host.nets.${netname};
iproute = tinc.config.iproutePackage; iproute = tinc.config.iproutePackage;
in '' in /* sh */ ''
${tinc.config.iproutePackage}/sbin/ip link set ${netname} up
${optionalString (net.ip4 != null) /* sh */ '' ${optionalString (net.ip4 != null) /* sh */ ''
${iproute}/sbin/ip -4 addr add ${net.ip4.addr} dev ${netname} ${iproute}/sbin/ip -4 addr add ${net.ip4.addr} dev ${netname}
${iproute}/sbin/ip -4 route add ${net.ip4.prefix} dev ${netname} ${iproute}/sbin/ip -4 route add ${net.ip4.prefix} dev ${netname}
@ -69,14 +67,13 @@ with import <stockholm/lib>;
${iproute}/sbin/ip -6 addr add ${net.ip6.addr} dev ${netname} ${iproute}/sbin/ip -6 addr add ${net.ip6.addr} dev ${netname}
${iproute}/sbin/ip -6 route add ${net.ip6.prefix} dev ${netname} ${iproute}/sbin/ip -6 route add ${net.ip6.prefix} dev ${netname}
''} ''}
${tinc.config.tincUpExtra}
''; '';
defaultText = '' defaultText = /* sh */ ''
ip -4 addr add net.ip4.addr dev ${netname} ip link set netname up
ip -4 route add net.ip4.prefix dev ${netname} ip -4 addr add net.ip4.addr dev netname
ip -6 addr add net.ip6.addr dev ${netname} ip -4 route add net.ip4.prefix dev netname
ip -6 route add net.ip6.prefix dev ${netname} ip -6 addr add net.ip6.addr dev netname
${tinc.config.tincUpExtra} ip -6 route add net.ip6.prefix dev netname
''; '';
description = '' description = ''
tinc-up script to be used. Defaults to setting the tinc-up script to be used. Defaults to setting the
@ -85,11 +82,6 @@ with import <stockholm/lib>;
''; '';
}; };
tincUpExtra = mkOption {
type = types.str;
default = "";
};
tincPackage = mkOption { tincPackage = mkOption {
type = types.package; type = types.package;
default = pkgs.tinc_pre; default = pkgs.tinc_pre;
@ -128,9 +120,9 @@ with import <stockholm/lib>;
default = default =
pkgs.write "${tinc.config.netname}-tinc-hosts" pkgs.write "${tinc.config.netname}-tinc-hosts"
(mapAttrs' (mapAttrs'
(_: host: (nameValuePair "/${host.name}" { (_: host: nameValuePair "/${host.name}" {
text = host.nets.${tinc.config.netname}.tinc.config; text = host.nets.${tinc.config.netname}.tinc.config;
})) })
tinc.config.hosts); tinc.config.hosts);
defaultText = "netname-tinc-hosts"; defaultText = "netname-tinc-hosts";
description = '' description = ''

View File

@ -9,20 +9,6 @@ self: super: {
}; };
}); });
flameshot = super.flameshot.overrideAttrs (old: rec {
name = "flameshot-${version}";
version = "0.10.2";
src = self.fetchFromGitHub {
owner = "flameshot-org";
repo = "flameshot";
rev = "v${version}";
sha256 = "sha256-rZUiaS32C77tFJmEkw/9MGbVTVscb6LOCyWaWO5FyR4=";
};
patches = old.patches or [] ++ [
./flameshot/flameshot_imgur_0.10.2.patch
];
});
# https://github.com/proot-me/PRoot/issues/106 # https://github.com/proot-me/PRoot/issues/106
proot = self.writeDashBin "proot" '' proot = self.writeDashBin "proot" ''
export PROOT_NO_SECCOMP=1 export PROOT_NO_SECCOMP=1

View File

@ -8,7 +8,7 @@ writeDashBin "q-power_supply" ''
s/^\([A-Z_]\+=[0-9A-Za-z_-]*\)$/export \1/p s/^\([A-Z_]\+=[0-9A-Za-z_-]*\)$/export \1/p
' $uevent)" ' $uevent)"
case $POWER_SUPPLY_NAME in case $POWER_SUPPLY_NAME in
AC) AC|Mains)
exit # not battery exit # not battery
;; ;;
esac esac
@ -24,24 +24,41 @@ writeDashBin "q-power_supply" ''
return sprintf("%dh%dm", h, m) return sprintf("%dh%dm", h, m)
} }
function print_bar(n, r, t1, t2, t_col) { function print_bar(r) {
t1 = int(r * n) return \
t2 = n - t1 (r >= .1 ? bar_gradient[0] : bar_background) "" \
if (r >= .42) t_col = "1;32" (r >= .2 ? bar_gradient[1] : bar_background) "" \
else if (r >= 23) t_col = "1;33" (r >= .3 ? bar_gradient[2] : bar_background) "" \
else if (r >= 11) t_col = "1;31" (r >= .4 ? bar_gradient[3] : bar_background) "" \
else t_col = "5;1;31" (r >= .5 ? bar_gradient[4] : bar_background) "" \
return sgr(t_col) strdup("", t1) sgr(";30") strdup("", t2) sgr() (r >= .6 ? bar_gradient[5] : bar_background) "" \
(r >= .7 ? bar_gradient[6] : bar_background) "" \
(r >= .8 ? bar_gradient[7] : bar_background) "" \
(r >= .9 ? bar_gradient[8] : bar_background) "" \
(r >= 1 ? bar_gradient[9] : bar_background) "" \
sgr()
}
function rgb(r, g, b) {
return sgr("38;2;" r ";" g ";" b)
} }
function sgr(p) { function sgr(p) {
return "\x1b[" p "m" return "\x1b[" p "m"
} }
function strdup(s,n,t) { BEGIN {
t = sprintf("%"n"s","") bar_gradient[0] = rgb(216, 100, 83)
gsub(/ /,s,t) bar_gradient[1] = rgb(210, 113, 72)
return t bar_gradient[2] = rgb(201, 125, 65)
bar_gradient[3] = rgb(190, 137, 63)
bar_gradient[4] = rgb(178, 148, 67)
bar_gradient[5] = rgb(166, 158, 75)
bar_gradient[6] = rgb(153, 167, 88)
bar_gradient[7] = rgb(140, 174, 104)
bar_gradient[8] = rgb(127, 181, 122)
bar_gradient[9] = rgb(116, 187, 141)
bar_background = rgb( 64, 64, 64)
} }
END { END {
@ -101,7 +118,7 @@ writeDashBin "q-power_supply" ''
charge_ratio = charge_now / charge_full charge_ratio = charge_now / charge_full
out = out name out = out name
out = out sprintf(" %s", print_bar(10, charge_ratio)) out = out sprintf(" %s", print_bar(charge_ratio))
out = out sprintf(" %d%", charge_ratio * 100) out = out sprintf(" %d%", charge_ratio * 100)
out = out sprintf(" %.2f%s", charge_now, charge_unit) out = out sprintf(" %.2f%s", charge_now, charge_unit)
if (current_now != 0) { if (current_now != 0) {

View File

@ -1,7 +1,21 @@
{ pkgs, ... }: { { pkgs, ... }: {
imports = [
../smartd.nix
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usbhid" ]; boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usbhid" ];
boot.initrd.kernelModules = [ "amdgpu" ]; boot.initrd.kernelModules = [ "amdgpu" ];
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [
"amd-pstate"
"kvm-amd"
];
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.kernelParams = [
"amd_pstate=passive"
];
hardware.bluetooth.enable = true;
hardware.cpu.amd.updateMicrocode = true; hardware.cpu.amd.updateMicrocode = true;
hardware.enableRedistributableFirmware = true; hardware.enableRedistributableFirmware = true;
@ -25,6 +39,10 @@
services.illum.enable = true; services.illum.enable = true;
services.logind.extraConfig = /* ini */ ''
HandlePowerKey=ignore
'';
tv.lidControl.enable = true; tv.lidControl.enable = true;
tv.hw.screens.primary.width = 2560; tv.hw.screens.primary.width = 2560;

View File

@ -1,19 +1,8 @@
with import ./lib;
{ {
imports = [ imports =
./charybdis map
./dnsmasq.nix (name: ./. + "/${name}")
./ejabberd (attrNames
./focus.nix (filterAttrs isNixDirEntry (readDir ./.)));
./hosts.nix
./hw.nix
./im.nix
./iptables.nix
./lidControl.nix
./org.freedesktop.machine1.host-shell.nix
./systemd.nix
./slock.nix
./x0vncserver.nix
./Xresources.nix
./wwan.nix
];
} }

View File

@ -166,6 +166,7 @@ with import ./lib;
interface=$(get-interface) interface=$(get-interface)
ip addr flush "$interface"
ip link set dev "$interface" down ip link set dev "$interface" down
uqmi --stop-network 0xFFFFFFFF --autoconnect uqmi --stop-network 0xFFFFFFFF --autoconnect
uqmi --sync uqmi --sync

View File

@ -0,0 +1,15 @@
self: super:
super.flameshot.overrideAttrs (old: rec {
name = "flameshot-${version}";
version = "0.10.2";
src = self.fetchFromGitHub {
owner = "flameshot-org";
repo = "flameshot";
rev = "v${version}";
sha256 = "sha256-rZUiaS32C77tFJmEkw/9MGbVTVscb6LOCyWaWO5FyR4=";
};
patches = old.patches or [] ++ [
./flameshot/flameshot_imgur_0.10.2.patch
];
})

View File

@ -0,0 +1,20 @@
self: super:
let
srcpkg = super.iosevka-tv-1;
binpkg = self.fetchzip {
inherit (srcpkg) pname version;
stripRoot = false;
hash = "sha256-QIuTS70vUQSvDDXjY4uI6SCcu1XT4HjvzpthvrNX4h0=";
urls = [
"https://c.krebsco.de/${srcpkg.name}.tar.gz"
"https://ni.krebsco.de/~tv/mirrors/iosevka/${srcpkg.name}.tar.gz"
];
};
in
if srcpkg.version == binpkg.version then
binpkg
else
srcpkg

View File

@ -0,0 +1,20 @@
self: super:
let
srcpkg = super.iosevka-tv-2;
binpkg = self.fetchzip {
inherit (srcpkg) pname version;
stripRoot = false;
hash = "sha256-PuIrW1ftYD5PW4du6gq1XpUM3v0potwmj+vAxJImF/A=";
urls = [
"https://c.krebsco.de/${srcpkg.name}.tar.gz"
"https://ni.krebsco.de/~tv/mirrors/iosevka/${srcpkg.name}.tar.gz"
];
};
in
if srcpkg.version == binpkg.version then
binpkg
else
srcpkg

View File

@ -53,10 +53,10 @@ let
window.dimensions.lines = 9; window.dimensions.lines = 9;
}; };
variants.hidpi = { variants.hidpi = {
font.normal.family = "iosevka-tv-1"; font.normal.family = "iosevka tv 2 Light";
font.bold.family = "iosevka-tv-1"; font.italic.family = "iosevka tv 2 Light";
font.italic.family = "iosevka-tv-1"; font.bold.family = "iosevka tv 2 Medium";
font.bold_italic.family = "iosevka-tv-1"; font.bold_italic.family = "iosevka tv 2 Medium";
font.size = 5; font.size = 5;
key_bindings = [ key_bindings = [
{ key = "Up"; mods = "Control"; action = "IncreaseFontSize"; } { key = "Up"; mods = "Control"; action = "IncreaseFontSize"; }
@ -104,7 +104,7 @@ let
ref=$(! test -e "$HOME"/ref || ${pkgs.coreutils}/bin/cat "$HOME"/ref) ref=$(! test -e "$HOME"/ref || ${pkgs.coreutils}/bin/cat "$HOME"/ref)
if test "$ref" != ${config-file}; then if test "$ref" != ${config-file}; then
echo ${config-file} > "$HOME"/ref echo ${config-file} > "$HOME"/ref
${pkgs.coreutils}/bin/cp ${config-file} "$HOME"/.alacritty.yml ${pkgs.coreutils}/bin/install -m 644 ${config-file} "$HOME"/.alacritty.yml
fi fi
''; '';
in in

View File

@ -1,5 +1,8 @@
{ pkgs }: { pkgs }:
pkgs.writeDashBin "ff" '' pkgs.writeDashBin "ff" ''
case $TOUCHSCREEN in 1)
export MOZ_USE_XINPUT2=1
esac
exec ${pkgs.firefox}/bin/firefox "$@" exec ${pkgs.firefox}/bin/firefox "$@"
'' ''

View File

@ -6,7 +6,7 @@ pkgs.writeDashBin "font-size-alacritty" ''
set -efu set -efu
min_size=8 min_size=5
op=''${1%%[0-9]*} op=''${1%%[0-9]*}
op=''${op:-=} op=''${op:-=}

View File

@ -3,7 +3,7 @@
pkgs.iosevka.override { pkgs.iosevka.override {
# https://typeof.net/Iosevka/customizer # https://typeof.net/Iosevka/customizer
privateBuildPlan = { privateBuildPlan = {
family = "iosevka-tv-1"; family = "iosevka tv 1";
spacing = "term"; spacing = "term";
serifs = "sans"; serifs = "sans";
export-glyph-names = true; export-glyph-names = true;
@ -14,5 +14,5 @@ pkgs.iosevka.override {
widths.normal.menu = 5; widths.normal.menu = 5;
widths.normal.css = "normal"; widths.normal.css = "normal";
}; };
set = "iosevka-tv-1"; set = "tv-1";
} }

View File

@ -0,0 +1,20 @@
{ pkgs }:
pkgs.iosevka.override {
# https://typeof.net/Iosevka/customizer
privateBuildPlan = {
family = "iosevka tv 2";
spacing = "term";
serifs = "sans";
export-glyph-names = true;
no-ligation = true;
no-cv-ss = false;
variants.inherits = "ss10";
widths.normal.shape = 600;
widths.normal.menu = 5;
widths.normal.css = "normal";
};
set = "tv-2";
}

View File

@ -0,0 +1,11 @@
{ pkgs }:
pkgs.libinput.overrideAttrs (old: {
patches = old.patches or [] ++ [
(pkgs.fetchurl {
name = "libinput-winmax2.patch";
url = "https://github.com/4z3/libinput/commit/2d0ff41.patch";
sha256 = "0ipsxzjf98g9w2m163gp49zl14wbxs84s0psdnvk7wfiivgcnm1f";
})
];
})

View File

@ -10,71 +10,44 @@ let
hspace = 2; hspace = 2;
# Return number of columns required to print n calenders side by side. # Return number of columns required to print n calenders side by side.
need_width = n: need_width = n: assert n >= 1; n * calwidth + (n - 1) * hspace;
assert n >= 1;
n * calwidth + (n - 1) * hspace;
pad = /* sh */ ''{
${pkgs.gnused}/bin/sed '
# rtrim
s/ *$//
# delete last empty line
''${/^$/d}
' \
| ${pkgs.gawk}/bin/awk '{printf "%-${toString calwidth}s\n", $0}' \
| ${pkgs.gnused}/bin/sed '
# colorize header
1,2s/.*/&/
# colorize week number
s/^[ 1-9][0-9]/&/
'
}'';
in /* sh */ '' in /* sh */ ''
cols=$(${pkgs.ncurses}/bin/tput cols) cols=$(${pkgs.ncurses}/bin/tput cols)
${pkgs.coreutils}/bin/paste \ if test $cols -ge ${toString (need_width 3)}; then
<(if test $cols -ge ${toString (need_width 3)}; then ${pkgs.utillinux}/bin/cal --color=always -mw3
${pkgs.utillinux}/bin/cal -mw \ elif test $cols -ge ${toString (need_width 2)}; then
$(${pkgs.coreutils}/bin/date +'%m %Y' -d 'last month') \ ${pkgs.utillinux}/bin/cal --color=always -mw -n 2
| ${pad} elif test $cols -ge ${toString (need_width 1)}; then
fi) \ ${pkgs.utillinux}/bin/cal --color=always -mw1
<(if test $cols -ge ${toString (need_width 1)}; then else
${pkgs.utillinux}/bin/cal -mw \ :
| ${pkgs.gnused}/bin/sed ' fi |
# colorize day of month ${pkgs.gnused}/bin/sed -r '
s/\(^\| \)'"$(${pkgs.coreutils}/bin/date +%e)"'\>/&/ # dim week numbers
' \ s/((^ *| )[ 1-5][0-9]( *)?)(([ 1-3][0-9])*)/\1\4/g
| ${pad} # dim month and day names
fi) \ s/^ *[A-Z].*/&/
<(if test $cols -ge ${toString (need_width 2)}; then # highlight current date
${pkgs.utillinux}/bin/cal -mw \ s/\[7m//
$(${pkgs.coreutils}/bin/date +'%m %Y' -d 'next month') \ s/\[27m//
| ${pad} '
fi) \
| ${pkgs.gnused}/bin/sed '
s/^\t//
s/\t$//
s/\t/${lpad hspace " " ""}/g
'
''; '';
q-isodate = /* sh */ '' q-isodate = TZ: color: /* sh */ ''
TZ=${shell.escape TZ} \
${pkgs.coreutils}/bin/date \ ${pkgs.coreutils}/bin/date \
'+%Y-%m-%dT%H:%M:%S%:z' '+%Y-%m-%dT[;'${shell.escape color}'m%H:%M:%S%:z'
''; '';
q-deudate = q-isodate "Europe/Berlin" "38;5;085";
# Singapore's red is #ED2E38 # Singapore's red is #ED2E38
q-sgtdate = /* sh */ '' q-sgtdate = q-isodate "Asia/Singapore" "38;2;237;46;56";
TZ=Asia/Singapore \
${pkgs.coreutils}/bin/date \
'+%Y-%m-%dT%H:%M:%S%:z'
'';
q-utcdate = /* sh */ '' q-thadate = q-isodate "Asia/Bangkok" "38;5;226";
${pkgs.coreutils}/bin/date -u \
'+%Y-%m-%dT%H:%M:%S%:z' q-utcdate = q-isodate "UTC" "38;5;065";
'';
q-gitdir = /* sh */ '' q-gitdir = /* sh */ ''
if test -d .git; then if test -d .git; then
@ -106,31 +79,34 @@ let
echo "VT: $(${pkgs.systemd}/bin/systemd-detect-virt)" echo "VT: $(${pkgs.systemd}/bin/systemd-detect-virt)"
''; '';
q-wireless = /* sh */ '' q-net = /* sh */ ''
for dev in $( for dev in $(
${pkgs.iw}/bin/iw dev \ ${pkgs.iproute}/bin/ip a |
| ${pkgs.gnused}/bin/sed -n 's/^\s*Interface\s\+\([0-9a-z]\+\)$/\1/p' ${pkgs.gnused}/bin/sed -rn 's/^[0-9]+: ([^:]+):.*/\1/p' |
${pkgs.gnugrep}/bin/grep -Ev '^(lo|retiolum|wiregrill)$'
# TODO wiregrill ping ni.w, retiolum ping ni.r
); do ); do
inet=$(${pkgs.iproute}/bin/ip addr show $dev \ {
| ${pkgs.gnused}/bin/sed -n ' inet=$(${pkgs.iproute}/bin/ip addr show $dev \
s/.*inet \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p | ${pkgs.gnused}/bin/sed -n '
') \ s/.*inet \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p
|| unset inet ')
ssid=$(${pkgs.iw}/bin/iw dev $dev link \ ssid=$(${pkgs.iw}/bin/iw dev $dev link \
| ${pkgs.gnused}/bin/sed -n ' | ${pkgs.gnused}/bin/sed -n '
s/.*\tSSID: \(.*\)/\1/p s/.*\tSSID: \(.*\)/\1/p
') \ ')
|| unset ssid latency=$(
echo "$dev''${inet+ $inet}''${ssid+ $ssid}" /run/wrappers/bin/ping -W .25 -c 1 -I "$dev" ni.i 2>&1 |
${pkgs.gnused}/bin/sed -rn '
s/.*time=([0-9.]+).*/online ni=\1/p
s/.*Network is unreachable.*/offline/p
s/.*100% packet loss.*/offline/p
'
)
echo "$dev''${inet:+ $inet}''${ssid:+ $ssid} $latency"
} &
done done
''; wait
q-online = /* sh */ ''
if ${pkgs.curl}/bin/curl -s google.com >/dev/null; then
echo 'online'
else
echo offline
fi
''; '';
q-thermal_zone = /* sh */ '' q-thermal_zone = /* sh */ ''
@ -173,14 +149,13 @@ pkgs.writeBashBin "q" ''
export PATH=/var/empty export PATH=/var/empty
${q-cal} ${q-cal}
${q-utcdate} ${q-utcdate}
${q-isodate} ${q-deudate}
${q-sgtdate} ${q-sgtdate}
(${q-gitdir}) & (${q-gitdir}) &
(${q-intel_backlight}) & (${q-intel_backlight}) &
${pkgs.q-power_supply}/bin/q-power_supply & ${pkgs.q-power_supply}/bin/q-power_supply &
(${q-virtualization}) & (${q-virtualization}) &
(${q-wireless}) & (${q-net}) &
(${q-online}) &
(${q-thermal_zone}) & (${q-thermal_zone}) &
wait wait
if test "$PWD" != "$HOME" && test -e "$HOME/TODO"; then if test "$PWD" != "$HOME" && test -e "$HOME/TODO"; then