summaryrefslogtreecommitdiffstats
path: root/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone
blob: 954fe4d750be86a403697b05a7dacc21aae864d1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/bin/bash

# Achtung: Dieses Skript ist veraltet und sollte nur noch zur Anschauung bzw. zu Debugzwecken
# genutzt werden. Stattdessen sollte das Skriptpaket openslx genutzt werden.
# Es liest die Datei openslx.ini aus, in der die Auflösung des Grundsystems bereitgestellt 
# wird. Die (Pseudo-)Floppy fd1 wird vom  openslx-Grundsystem geliefert. Es loggt nach SYSLOG (
# syslog oder messages).
# 
# Zu erledigen: Jede Menge, zB anständiges Trapping, Fehler abfangen usw...
# set -x

MOUNTDIR=/tmp/diskmount
RESFILE="${MOUNTDIR}"/openslx.ini
DISPLAY=:0.0

function ausgang() {
	umount "${MOUNTDIR}"
	rmdir "${MOUNTDIR}"
}

check_resolution() {
	# Now, let's wait even more seconds to see if another process re-changes res.:
	ACTRES=$(xrandr|grep '*'|tr -s " "|cut -f 2 -d " ")
	if [ "$ACTRES" != "$RESOLUTION" ]; then
		logger "openslx resolution utility: resolution changed; re-changing."
		xrandr --output ${AUSGABE} --mode ${RESOLUTION}
	else
		logger "openslx resolution utility: resolution unchanged."
	fi
}

trap ausgang EXIT SIGHUP SIGINT SIGTERM

logger "openslx resolution utility started."

# Mountpunkt erzeugen:
if [ ! -d "$MOUNTDIR" ]; then
	mkdir "$MOUNTDIR"
	logger "openslx resolution utility: mkdir'ed diskmount dir $MOUNTDIR."
fi

# Virtuelles Floppylaufwerk mounten
mount /dev/fd1 "$MOUNTDIR" 2>/dev/null
ERR=$?
if [ $ERR -ne 0 ]; then
	logger "openslx resolution utility: error code $ERR trying to mount /dev/fd1 to ${MOUNTDIR}. Remounting..."
	mount -o remount /dev/fd1 "$MOUNTDIR" 2>/dev/null
	ERR=$?
	if [ $ERR -ne 0 ]; then
		logger "openslx resolution utility: error code $ERR trying to remount /dev/fd1 to ${MOUNTDIR}. Giving up."
		exit 1
	else
		logger "openslx resolution utility: remount of /dev/fd1 mounted to diskmount dir ${MOUNTDIR} succeeded."
	fi
else
	logger "openslx resolution utility: /dev/fd1 mounted to diskmount dir ${MOUNTDIR}."
fi

# Das Mounten mit shortname=WIN95 erwies sich als nicht zuverlässig. Daher hier Kontrolle:
RESFILE=$(find "${MOUNTDIR}" -iwholename "${RESFILE}")

if [ -f "$RESFILE" ]; then
	RESOLUTION=$(grep 'resolution=' "$RESFILE" | cut -d '=' -f 2)
	if [ -z $RESOLUTION ]; then
		logger "openslx resolution utility: resolution file $RESFILE seems to be empty!"
		exit 1
	fi
	logger "openslx resolution utility: resolution file $RESFILE yields ${RESOLUTION}."
else
	logger "openslx resolution utility: resolution file $RESFILE not found!"
	exit 1
fi

umount /dev/fd1
ERR=$?
if [ "$ERR" -ne 0 ]; then
	logger "openslx resolution utility: error code $ERR trying to to unmount /dev/fd1. Please unmount by hand."
fi

# Das ist mitunter ein Problem, da die richtige zu finden - Distroabhängig!
# Hier ein Beispiel für openSuse 13.2, sollte auch für Debian, Ubuntu, Redhat usw. laufen:.
XAUTHDATEI=$(ps aux | grep -o "X.* \-auth *[^ ]*" | awk '{print $NF}')
if [ -n "$XAUTHDATEI" ]; then
	logger "openslx resolution utility: XAUTHFILE found."
	XAUTHORITY="${XAUTHDATEI}"
else
	logger "openslx resolution utility: XAUTHFILE not found. Exiting."
	exit 1
fi

# Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das
# erste 'connected' in der Ausgabe xrandrs:
AUSGABE=$(xrandr -q|grep -m 1 " connected "|awk '{print $1}')
if [ -z "$AUSGABE" ]; then
	logger "openslx resolution utility: Could not detect output device."
	exit 1
fi

# Pruefen, ob xrand eine passende modeline ausgibt:
if [ "$(xrandr | grep -c ${RESOLUTION}[[:space:]])" -eq 0 ]; then
	logger "openslx resolution utility: xrandr yields no fitting modeline; adding one."
	MODELINE=$(cvt ${RESOLUTION//x/ } | grep -v "^#" | sed "s/Modeline //g" | sed 's/"//g')
	xrandr --newmode $(echo ${MODELINE})
	xrandr --addmode ${AUSGABE} $(echo ${MODELINE} | cut -d " " -f 1)
	# Dann einzusteuernde Auflösung natürlich auf die neue ändern:
	RESOLUTION=$(echo ${MODELINE} | cut -d " " -f 1)
	logger "openslx resolution utility: (xrandr) modeline ${MODELINE} added (${RESOLUTION})."
fi

# Auflösung per xrandr setzen:
xrandr --output ${AUSGABE} --mode ${RESOLUTION}
ERR=$?
if [ $ERR -ne 0 ]; then
	logger "openslx resolution utility: xrandr error code ${ERR}."
else
	logger "openslx resolution utility: xrandr ok. Mode $RESOLUTION set."
fi

# Das hier ist ein wenig problematisch, da nach X-Start die gewünschte Desktopumgebung
# diese gern zuvor gespeicherte Auflösungen wieder einspielt. Daher warten wir einfach,
# und prüfen in gewissen Zeitabständen, ob sich die Auflösung geändert hat, und spielen
# im Änderungsfalle die Grundsystemauflösung wieder ein. Schön ist das nicht.

# Now, let's wait some seconds to see if another process re-changes res.:
sleep 5
check_resolution

# Now, let's wait some more seconds to see if another process re-changes res.:
sleep 15
check_resolution

# Now, let's wait even more seconds to see if another process re-changes res.:
sleep 20
check_resolution

# Now, let's wait even more seconds to see if another process re-changes res.:
sleep 40
check_resolution

exit 0