nixos-configuration/hosts/iron/services/whatsapp.nix
2025-04-16 22:54:28 +02:00

90 lines
2.4 KiB
Nix

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"
];
"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";
};
};
}