60 lines
2.2 KiB
Bash
60 lines
2.2 KiB
Bash
|
#!/bin/bash
|
||
|
# Steps:
|
||
|
# 1) Make sure bash is available
|
||
|
# 2) Create udev rule
|
||
|
# - path to new udev rule: /etc/udev/rules.d/50-x-resize.rules
|
||
|
# - udev rule content:
|
||
|
# ACTION=="change",KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/usr/local/bin/x-resize"
|
||
|
# 3) Create /var/log/autores directory
|
||
|
# 4) Create script /usr/local/bin/x-resize (this file) and make executable
|
||
|
# 5) Reload udev rules with `sudo udevadm control --reload-rules`
|
||
|
# 6) Make sure auto-resize is enabled in virt-viewer/spicy
|
||
|
# 7) Make sure qemu-guest-agent spice-vdagent xserver-xspice xserver-xorg-video-qxl are installed
|
||
|
# 8) Make sure spice-vdagentd is loaded and running fine
|
||
|
# Debugging:
|
||
|
# - Watch udev events on resize with `udevadm monitor`
|
||
|
# - Watch dmesg (may not be super useful) with `dmesg -w`
|
||
|
# - Watch autores logs with `tail -f /var/log/autores/autores.log`
|
||
|
# Credits:
|
||
|
# - Credit for Finding Sessions as Root: https://unix.stackexchange.com/questions/117083/how-to-get-the-list-of-all-active-x-sessions-and-owners-of-them
|
||
|
# - Credit for Resizing via udev: https://superuser.com/questions/1183834/no-auto-resize-with-spice-and-virt-manager
|
||
|
|
||
|
## Ensure Log Directory Exists
|
||
|
LOG_DIR=/var/log/autores;
|
||
|
if [ ! -d $LOG_DIR ]; then
|
||
|
mkdir $LOG_DIR;
|
||
|
fi
|
||
|
LOG_FILE=${LOG_DIR}/autores.log
|
||
|
|
||
|
## Function to find User Sessions & Resize their display
|
||
|
function x_resize() {
|
||
|
declare -A disps usrs
|
||
|
usrs=()
|
||
|
disps=()
|
||
|
|
||
|
for i in $(users);do
|
||
|
[[ $i = root ]] && continue # skip root
|
||
|
usrs[$i]=1
|
||
|
done
|
||
|
|
||
|
for u in "${!usrs[@]}"; do
|
||
|
for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
|
||
|
disps[$i]=$u
|
||
|
done
|
||
|
done
|
||
|
|
||
|
for d in "${!disps[@]}";do
|
||
|
session_user="${disps[$d]}"
|
||
|
session_display="$d"
|
||
|
session_output=$(sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr | awk '/ connected/{print $1; exit; }')
|
||
|
echo "Session User: $session_user" | tee -a $LOG_FILE;
|
||
|
echo "Session Display: $session_display" | tee -a $LOG_FILE;
|
||
|
echo "Session Output: $session_output" | tee -a $LOG_FILE;
|
||
|
sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr --output "$session_output" --auto | tee -a $LOG_FILE;
|
||
|
done
|
||
|
}
|
||
|
|
||
|
echo "Resize Event: $(date)" | tee -a $LOG_FILE
|
||
|
x_resize
|
||
|
|