qubes-core-agent.postinst 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. #!/bin/bash
  2. # postinst script for core-agent-linux
  3. #
  4. # see: dh_installdeb(1)
  5. set -e
  6. # The postint script may be called in the following ways:
  7. # * <postinst> 'configure' <most-recently-configured-version>
  8. # * <old-postinst> 'abort-upgrade' <new version>
  9. # * <conflictor's-postinst> 'abort-remove' 'in-favour' <package>
  10. # <new-version>
  11. # * <postinst> 'abort-remove'
  12. # * <deconfigured's-postinst> 'abort-deconfigure' 'in-favour'
  13. # <failed-install-package> <version> 'removing'
  14. # <conflicting-package> <version>
  15. #
  16. # For details, see http://www.debian.org/doc/debian-policy/ or
  17. # https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html or
  18. # the debian-policy package
  19. # Directory that modified desktop entry config files are stored in
  20. XDG_CONFIG_QUBES="/usr/share/qubes/xdg"
  21. # Install overriden services only when original exists
  22. installOverridenServices() {
  23. override_dir="${1}"
  24. service="${2}"
  25. retval=1
  26. for unit in ${service}; do
  27. unit="${unit%%.*}"
  28. unit_name="$(basename ${unit})"
  29. if [ -f ${unit}.service ]; then
  30. echo "Installing override for ${unit}.service..."
  31. cp ${override_dir}/${unit_name}.service /etc/systemd/system/
  32. retval=0
  33. fi
  34. if [ -f ${unit}.socket -a -f ${override_dir}/${unit}.socket ]; then
  35. echo "Installing override for ${unit}.socket..."
  36. cp ${override_dir}/${unit_name}.socket /etc/systemd/system/
  37. retval=0
  38. fi
  39. if [ -f ${unit}.path -a -f ${override_dir}/${unit}.path ]; then
  40. echo "Installing override for ${unit}.path..."
  41. cp ${override_dir}/${unit_name}.path /etc/systemd/system/
  42. retval=0
  43. fi
  44. done
  45. return ${retval}
  46. }
  47. reenableNetworkManager() {
  48. # Disable original service to enable overriden one
  49. echo "Disabling original service to enable overriden one..."
  50. disableSystemdUnits ModemManager.service
  51. disableSystemdUnits NetworkManager.service
  52. # Disable D-BUS activation of NetworkManager - in AppVm it causes problems (eg PackageKit timeouts)
  53. echo "Disable D-BUS activation of NetworkManager - in AppVm it causes problems (eg PackageKit timeouts)"
  54. systemctl mask dbus-org.freedesktop.NetworkManager.service 2> /dev/null || echo "Could not disable D-BUS activation of NetworkManager"
  55. echo "Re-enabling original service to enable overriden one..."
  56. enableSystemdUnits ModemManager.service
  57. enableSystemdUnits NetworkManager.service
  58. # Fix for https://bugzilla.redhat.com/show_bug.cgi?id=974811
  59. echo "Fix for https://bugzilla.redhat.com/show_bug.cgi?id=974811"
  60. enableSystemdUnits NetworkManager-dispatcher.service
  61. }
  62. remove_ShowIn() {
  63. if [ -e "${1}" ]; then
  64. sed -i '/^\(Not\|Only\)ShowIn/d' "${1}"
  65. fi
  66. }
  67. showIn() {
  68. desktop_entry="${1}"
  69. shown_in="${2}"
  70. message="${shown_in:-"Shown in All;"}"
  71. desktop_entry_qubes="${XDG_CONFIG_QUBES}/autostart/${desktop_entry##*/}"
  72. # Make sure Qubes autostart directory exists
  73. mkdir -p "${XDG_CONFIG_QUBES}/autostart"
  74. # Desktop entry exists, so move to Qubes directory and modify it
  75. if [ -e "${desktop_entry}" ]; then
  76. echo "Desktop Entry Modification - ${message} ${desktop_entry##*/}..."
  77. cp -pf "${desktop_entry}" "${desktop_entry_qubes}"
  78. remove_ShowIn "${desktop_entry_qubes}"
  79. sed -i '/^X-GNOME-Autostart-enabled.*[fF0]/d' "${desktop_entry_qubes}"
  80. # Will only be '' if shown in all
  81. if [ ! "${shown_in}x" == "x" ]; then
  82. echo "${shown_in}" >> "${desktop_entry_qubes}" || true
  83. fi
  84. # Desktop entry must have been removed, so also remove from Qubes directory
  85. else
  86. echo "Desktop Entry Modification - Remove: ${desktop_entry##*/}..."
  87. rm -f "${desktop_entry_qubes}"
  88. fi
  89. }
  90. changeSystemdStatus() {
  91. unit=${1}
  92. disable=${2-0}
  93. # Check if unit file is currently active (running)
  94. systemctl is-active ${unit} > /dev/null 2>&1 && active=true || unset active
  95. case ${disable} in
  96. 0)
  97. systemctl --quiet enable ${unit} > /dev/null 2>&1 || true
  98. ;;
  99. 1)
  100. if [ $active ]; then
  101. systemctl --quiet stop ${unit} > /dev/null 2>&1 || true
  102. fi
  103. if [ -f /lib/systemd/system/${unit} ]; then
  104. if fgrep -q '[Install]' /lib/systemd/system/${unit}; then
  105. systemctl --quiet disable ${unit} > /dev/null 2>&1 || true
  106. else
  107. # Forcibly disable
  108. ln -sf /dev/null /etc/systemd/system/${unit}
  109. fi
  110. else
  111. systemctl --quiet disable ${unit} > /dev/null 2>&1 || true
  112. fi
  113. ;;
  114. esac
  115. }
  116. # Enable systemd units
  117. enableSystemdUnits() {
  118. for unit in $*; do
  119. changeSystemdStatus ${unit} 0 || true
  120. done
  121. }
  122. # Disable systemd units
  123. disableSystemdUnits() {
  124. for unit in $*; do
  125. changeSystemdStatus ${unit} 1 || true
  126. done
  127. }
  128. # Manually trigger all triggers to automaticatly configure
  129. triggerTriggers() {
  130. path="$(readlink -m ${0})"
  131. triggers="${path/postinst/triggers}"
  132. awk '{sub(/[ \t]*#.*/,"")} NF' ${triggers} | while read line
  133. do
  134. /bin/bash -c "${0} triggered ${line##* }" || true
  135. done
  136. }
  137. case "${1}" in
  138. configure)
  139. # disable some Upstart services
  140. for init in plymouth-shutdown \
  141. prefdm \
  142. splash-manager \
  143. start-ttys \
  144. tty ; do
  145. dpkg-divert --divert /etc/init/${init}.conf.qubes-disabled --package qubes-core-agent --rename --add /etc/init/${init}.conf
  146. done
  147. # Disable sysv init network-manager
  148. disableSystemdUnits network-manager
  149. # Create NetworkManager configuration if we do not have it
  150. if ! [ -e /etc/NetworkManager/NetworkManager.conf ]; then
  151. echo '[main]' > /etc/NetworkManager/NetworkManager.conf
  152. echo 'plugins = keyfile' >> /etc/NetworkManager/NetworkManager.conf
  153. echo '[keyfile]' >> /etc/NetworkManager/NetworkManager.conf
  154. fi
  155. /usr/lib/qubes/qubes-fix-nm-conf.sh
  156. # make sure locale is really generated
  157. current_locale=`grep 'LANG\|LC_ALL' /etc/default/locale|head -n 1|cut -f 2 -d =`
  158. if [ -n "$current_locale" ] && ! locale -a | grep -q "$current_locale"; then
  159. base=`echo "$current_locale" | cut -f 1 -d .`
  160. charmap=`echo "$current_locale.UTF-8" | cut -f 2 -d .`
  161. [ -n "$charmap" ] && charmap="-f $charmap"
  162. localedef -i $base $charmap $current_locale
  163. fi
  164. # Remove old firmware updates link
  165. if [ -L /lib/firmware/updates ]; then
  166. rm -f /lib/firmware/updates
  167. fi
  168. # Location of files which contains list of protected files
  169. PROTECTED_FILE_LIST='/etc/qubes/protected-files.d'
  170. # ensure that hostname resolves to 127.0.1.1 resp. ::1 and that /etc/hosts is
  171. # in the form expected by qubes-sysinit.sh
  172. if ! grep -rq "^/etc/hostname$" "${PROTECTED_FILE_LIST}" 2>/dev/null; then
  173. for ip in '127\.0\.1\.1' '::1'; do
  174. if grep -q "^${ip}\(\s\|$\)" /etc/hosts; then
  175. sed -i "/^${ip}\s/,+0s/\(\s`hostname`\)\+\(\s\|$\)/\2/g" /etc/hosts || true
  176. sed -i "s/^${ip}\(\s\|$\).*$/\0 `hostname`/" /etc/hosts || true
  177. else
  178. echo "${ip//\\/} `hostname`" >> /etc/hosts || true
  179. fi
  180. done
  181. fi
  182. # remove hostname from 127.0.0.1 line (in debian the hostname is by default
  183. # resolved to 127.0.1.1)
  184. if ! grep -rq "^/etc/hosts$" "${PROTECTED_FILE_LIST}" 2>/dev/null; then
  185. sed -i "/^127\.0\.0\.1\s/,+0s/\(\s`hostname`\)\+\(\s\|$\)/\2/g" /etc/hosts || true
  186. fi
  187. chown user:user /home_volatile/user
  188. dpkg-divert --divert /etc/init/serial.conf.qubes-orig --package qubes-core-agent --rename --add /etc/init/serial.conf
  189. # Enable Qubes systemd units
  190. enableSystemdUnits \
  191. qubes-sysinit.service \
  192. qubes-misc-post.service \
  193. qubes-netwatcher.service \
  194. qubes-network.service \
  195. qubes-firewall.service \
  196. qubes-updates-proxy.service \
  197. qubes-update-check.timer \
  198. qubes-qrexec-agent.service
  199. # Set default "runlevel"
  200. rm -f /etc/systemd/system/default.target
  201. ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
  202. # Process all triggers which will set defaults to wanted values
  203. triggerTriggers
  204. disableSystemdUnits \
  205. alsa-store.service \
  206. alsa-restore.service \
  207. auditd.service \
  208. avahi.service \
  209. avahi-daemon.service \
  210. backuppc.service \
  211. cpuspeed.service \
  212. crond.service \
  213. fedora-autorelabel.service \
  214. fedora-autorelabel-mark.service \
  215. ipmi.service \
  216. hwclock-load.service \
  217. hwclock-save.service \
  218. mdmonitor.service \
  219. multipathd.service \
  220. openct.service \
  221. rpcbind.service \
  222. mcelog.service \
  223. fedora-storage-init.service \
  224. fedora-storage-init-late.service \
  225. plymouth-start.service \
  226. plymouth-read-write.service \
  227. plymouth-quit.service \
  228. plymouth-quit-wait.service \
  229. sshd.service \
  230. tcsd.service \
  231. sm-client.service \
  232. sendmail.service \
  233. mdmonitor-takeover.service \
  234. rngd smartd.service \
  235. upower.service \
  236. irqbalance.service \
  237. colord.service
  238. rm -f /etc/systemd/system/getty.target.wants/getty@tty*.service
  239. # Enable other systemd units
  240. enableSystemdUnits \
  241. rsyslog.service \
  242. netfilter-persistent.service
  243. # XXX: TODO: Needs to be implemented still
  244. # These do not exist on debian; maybe a different package name
  245. # ntpd.service \
  246. ;;
  247. abort-upgrade|abort-remove|abort-deconfigure)
  248. exit 0
  249. ;;
  250. triggered)
  251. for trigger in ${2}; do
  252. case "${trigger}" in
  253. # Update Qubes App Menus
  254. /usr/share/applications)
  255. echo "Updating Qubes App Menus..."
  256. /usr/lib/qubes/qubes-trigger-sync-appmenus.sh || true
  257. ;;
  258. # Install overriden services only when original exists
  259. /lib/systemd/system/NetworkManager.service | \
  260. /lib/systemd/system/NetworkManager-wait-online.service | \
  261. /lib/systemd/system/ModemManager.service)
  262. UNITDIR=/lib/systemd/system
  263. OVERRIDEDIR=/usr/lib/qubes/init
  264. installOverridenServices "${OVERRIDEDIR}" "${trigger}"
  265. if [ $? -eq 0 ]; then
  266. reenableNetworkManager
  267. fi
  268. ;;
  269. # Enable cups only when it is real Systemd service
  270. /lib/systemd/system/cups.service)
  271. [ -e /lib/systemd/system/cups.service ] && enableSystemdUnits cups.service
  272. ;;
  273. # "Enable haveged service"
  274. /lib/systemd/system/haveged.service)
  275. [ -e /lib/systemd/system/haveged.service ] && enableSystemdUnits haveged.service
  276. ;;
  277. # Install overridden serial.conf init script
  278. /etc/init/serial.conf)
  279. echo "Installing over-ridden serial.conf init script..."
  280. if [ -e /etc/init/serial.conf ]; then
  281. cp /usr/share/qubes/serial.conf /etc/init/serial.conf
  282. fi
  283. ;;
  284. # Disable SELinux"
  285. /etc/selinux/config)
  286. echo "Disabling SELinux..."
  287. if [ -e /etc/selinux/config ]; then
  288. sed -e s/^SELINUX=.*$/SELINUX=disabled/ </etc/selinux/config >/etc/selinux/config.processed
  289. mv /etc/selinux/config.processed /etc/selinux/config
  290. setenforce 0 2>/dev/null
  291. fi
  292. ;;
  293. # Desktop Entry Modification - Remove existing rules
  294. /etc/xdg/autostart/gpk-update-icon.desktop | \
  295. /etc/xdg/autostart/nm-applet.desktop | \
  296. /etc/xdg/autostart/abrt-applet.desktop | \
  297. /etc/xdg/autostart/notify-osd.desktop)
  298. showIn "${trigger}"
  299. ;;
  300. # Desktop Entry Modification - Not shown in Qubes
  301. /etc/xdg/autostart/pulseaudio.desktop | \
  302. /etc/xdg/autostart/deja-dup-monitor.desktop | \
  303. /etc/xdg/autostart/imsettings-start.desktop | \
  304. /etc/xdg/autostart/krb5-auth-dialog.desktop | \
  305. /etc/xdg/autostart/pulseaudio.desktop | \
  306. /etc/xdg/autostart/restorecond.desktop | \
  307. /etc/xdg/autostart/sealertauto.desktop | \
  308. /etc/xdg/autostart/gnome-power-manager.desktop | \
  309. /etc/xdg/autostart/gnome-sound-applet.desktop | \
  310. /etc/xdg/autostart/gnome-screensaver.desktop | \
  311. /etc/xdg/autostart/orca-autostart.desktop)
  312. showIn "${trigger}" 'NotShowIn=QUBES;'
  313. ;;
  314. # Desktop Entry Modification - Not shown in in DisposableVM
  315. /etc/xdg/autostart/gcm-apply.desktop)
  316. showIn "${trigger}" 'NotShowIn=DisposableVM;'
  317. ;;
  318. # Desktop Entry Modification - Only shown in AppVM
  319. /etc/xdg/autostart/gnome-keyring-gpg.desktop | \
  320. /etc/xdg/autostart/gnome-keyring-pkcs11.desktop | \
  321. /etc/xdg/autostart/gnome-keyring-secrets.desktop | \
  322. /etc/xdg/autostart/gnome-keyring-ssh.desktop | \
  323. /etc/xdg/autostart/gnome-settings-daemon.desktop | \
  324. /etc/xdg/autostart/user-dirs-update-gtk.desktop | \
  325. /etc/xdg/autostart/gsettings-data-convert.desktop)
  326. showIn "${trigger}" 'OnlyShowIn=GNOME;AppVM;'
  327. ;;
  328. # Desktop Entry Modification - Only shown in Gnome & UpdateableVM
  329. /etc/xdg/autostart/gpk-update-icon.desktop)
  330. showIn "${trigger}" 'OnlyShowIn=GNOME;UpdateableVM;'
  331. ;;
  332. # Desktop Entry Modification - Only shown in Gnome & Qubes
  333. /etc/xdg/autostart/nm-applet.desktop)
  334. showIn "${trigger}" 'OnlyShowIn=GNOME;QUBES;'
  335. ;;
  336. *)
  337. echo "postinst called with unknown trigger \`${2}'" >&2
  338. exit 1
  339. ;;
  340. esac
  341. done
  342. ;;
  343. *)
  344. echo "postinst called with unknown argument \`${1}'" >&2
  345. exit 1
  346. ;;
  347. esac
  348. # dh_installdeb will replace this with shell code automatically
  349. # generated by other debhelper scripts.
  350. #DEBHELPER#
  351. exit 0
  352. # vim: set ts=4 sw=4 sts=4 et :