Improve WhatsApp setup

- Implement graceful VM shutdown
- Add systemd timer
This commit is contained in:
Jakob Lechner 2024-10-16 21:06:56 +02:00
parent 8225188ccf
commit 05a1b91fc4
4 changed files with 89 additions and 13 deletions

View file

@ -234,7 +234,5 @@ with lib; {
priority = 1;
};
jalr.libvirt.enable = true;
};
}

View file

@ -16,5 +16,6 @@
./remarkable.nix
./sturzbach.nix
./unifi-controller.nix
./whatsapp.nix
];
}

View file

@ -28,17 +28,6 @@ in
host = "turn.jalr.de";
sharedSecretFile = config.sops.secrets.synapse-turn-shared-secret.path;
};
mautrix-whatsapp = {
enable = true;
port = ports.mautrix-whatsapp.tcp;
settings.bridge.permissions = {
# Only one user since using the name from the address book does not
# work with multiple users
#"@jalr:jalr.de" = 100;
"@jalr:jalr.de" = "admin";
"jalr.de" = "user";
};
};
mautrix-signal = {
enable = true;
port = ports.mautrix-signal.tcp;

View file

@ -0,0 +1,88 @@
args@{ config, pkgs, custom-utils, ... }:
let
ports = import ../ports.nix args;
shutdownAndroidVm = pkgs.writeShellScript "shutdown-android-vm" ''
set -e
export PATH=${pkgs.lib.makeBinPath [pkgs.libvirt pkgs.gnused pkgs.android-tools]}
if [ "$(virsh domstate "$1")" = "running" ]; then
host="$(virsh -q domifaddr --domain "$1" | sed -n -r 's#.*ipv4\s*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/[0-9]+$#\1#p')"
port=5555
adb connect "$host:$port"
adb -s "$host:$port" shell -- reboot -p
fi
'';
vmName = "Bliss-v16";
in
{
jalr.matrix.mautrix-whatsapp = {
enable = true;
port = ports.mautrix-whatsapp.tcp;
settings.bridge.permissions = {
# Only one user since using the name from the address book does not
# work with multiple users
#"@jalr:jalr.de" = 100;
"@jalr:jalr.de" = "admin";
"jalr.de" = "user";
};
};
jalr.libvirt.enable = true;
systemd.services.libvirt-guests.serviceConfig.ExecStop = [
""
"${shutdownAndroidVm} ${vmName}"
"${pkgs.libvirt}/libexec/libvirt-guests.sh stop"
];
systemd.services."whatsapp@" = {
description = "Start Android VM, wait for WhatsApp and shut down VM.";
serviceConfig = {
Type = "oneshot";
};
environment.VM = "%i";
script = ''
export PATH=${pkgs.lib.makeBinPath [pkgs.libvirt pkgs.gnused pkgs.android-tools pkgs.coreutils]}
domstate="$(virsh domstate "$VM")"
if [ "$domstate" != "running" ]; then
virsh start "$VM"
fi
echo "Wait until IP of Android VM is known"
while :; do
host="$(virsh -q domifaddr --domain "$VM" | sed -n -r 's#.*ipv4\s*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/[0-9]+$#\1#p')"
if [ "$host" ]; then
break
fi
sleep 1
done
port=5555
adb connect "$host:$port"
echo "Waiting for WhatsApp"
while ! adb -s "$host:$port" shell -- pgrep com.whatsapp > /dev/null; do
sleep 1
done
echo "Sleeping..."
sleep 5m
echo "Shutting down Android"
adb -s "$host:$port" shell -- reboot -p
'';
};
systemd.timers."whatsapp-${vmName}" = {
description = "Start Android VM to run WhatsApp";
after = [ "network.target" ];
wantedBy = [ "timers.target" ];
timerConfig = {
Persistent = true;
OnCalendar = "*-*-* 2:00:00";
Unit = "whatsapp@${vmName}.service";
};
};
}