Compare commits

...

153 Commits

Author SHA1 Message Date
Rusty Bird 9debe185fc
Remove syncfs fallback for ancient glibc (Debian 7)
4 years ago
Frédéric Pierret (fepitre) 29a0c0e7f4
travis: switch to dom0 Fedora 31
4 years ago
Marek Marczykowski-Górecki 3a0a629a38
version 4.1.3
4 years ago
Marek Marczykowski-Górecki ef2ab997bf
Merge remote-tracking branch 'origin/pr/48'
4 years ago
Marek Marczykowski-Górecki 2ba9fd6c23
debian: fix dependencies of qubes-kernel-vm-support pkg
4 years ago
Marek Marczykowski-Górecki 241f812304
Merge remote-tracking branch 'origin/pr/47'
4 years ago
Patrick Schleizer 8821906186
qubes-kernel-vm-support.postinst run update-grub
4 years ago
Patrick Schleizer 34c8212467
qubes-kernel-vm-support.preinst create folder /boot/grub
4 years ago
Marek Marczykowski-Górecki 9f0dc7dc34
travis: update python versions
5 years ago
Frédéric Pierret (fepitre) c110f98fdf
travis: switch to bionic
5 years ago
xaki23 699e10c057
partition full volatile for non-COW setups too
5 years ago
Marek Marczykowski-Górecki 82a44bc850
version 4.1.2
5 years ago
Marek Marczykowski-Górecki bd55c1efe4
Disable BLS config style in grub
5 years ago
Marek Marczykowski-Górecki ba6be8d8be
rpm: update python2 deps
5 years ago
Marek Marczykowski-Górecki 61931747a8
Merge remote-tracking branch 'origin/pr/41'
5 years ago
xaki23 ecc0b70f67
align volatile swap partition to 1Mb instead of 512b
5 years ago
Marek Marczykowski-Górecki 81c64d56a2
version 4.1.1
5 years ago
Marek Marczykowski-Górecki 84188910cf
initrd: mount / rw for the overlayfs setup time
5 years ago
Marek Marczykowski-Górecki 66a6e33f41
version 4.1.0
5 years ago
Marek Marczykowski-Górecki d48e497aff
travis: update to R4.1
5 years ago
Marek Marczykowski-Górecki c046807641
Remove u2mfn module
5 years ago
Marek Marczykowski-Górecki 7486078769
Remove qrexec related files
5 years ago
Marek Marczykowski-Górecki 042b6717a8
version 4.0.24
5 years ago
Marek Marczykowski-Górecki 9c6c825691
initramfs: use overlayfs for /lib/modules, if available
5 years ago
Marek Marczykowski-Górecki 90641b0dce
Merge remote-tracking branch 'origin/pr/40'
5 years ago
Marek Marczykowski-Górecki e7c90c705f
Declare u2mfn module version, skip build for qubes kernels
5 years ago
Frédéric Pierret (fepitre) f365d7cce8
travis: remove older Fedora releases and add Fedora 30
5 years ago
Frédéric Pierret (fepitre) 2b8411346f
travis: switch to xenial
5 years ago
Frédéric Pierret (fepitre) e00a64a915
python3: use macro pkgversion
5 years ago
Marek Marczykowski-Górecki 24a25cce5f
version 4.0.23
5 years ago
Marek Marczykowski-Górecki de2150e3d3
Add xen_scrub_pages=0 kernel option only if initramfs was rebuilt
5 years ago
Marek Marczykowski-Górecki ad790a53d4
Really install xen-scrub-pages dracut module
5 years ago
Marek Marczykowski-Górecki 2c696013cd
Do not use /proc/xen for detecting dom0 anymore
5 years ago
Marek Marczykowski-Górecki 4fe08d31e4
Adjust permissions of /dev/xen/hypercall
5 years ago
Marek Marczykowski-Górecki da61cb7511
dracut: add a flag file indicating scrub-pages option support
5 years ago
Marek Marczykowski-Górecki 5eb526da4b
dracut: fix checking for "Root filesystem" label, improve udev sync
5 years ago
Marek Marczykowski-Górecki 456fe99fa6
Disable scrubbing memory pages during initial balloon down
5 years ago
Marek Marczykowski-Górecki 14be8aa5ae
version 4.0.22
6 years ago
Marek Marczykowski-Górecki 4543ab1ff0
tests: skip the other img converter test too
6 years ago
Marek Marczykowski-Górecki 4bfd10baaa
imgconverter: allow icons up to 2048x2048
6 years ago
Marek Marczykowski-Górecki 0255f4d843
tests: skip img converter test if qubes-img-converter is not installed
6 years ago
Marek Marczykowski-Górecki e2d7f08d42
version 4.0.21
6 years ago
Marek Marczykowski-Górecki 76fa9c9d9f
travis: update Fedora and Debian versions
6 years ago
Marek Marczykowski-Górecki 3ca9f130b7
rpm: adjust for fc29
6 years ago
Rusty Bird 6cd4a1b888
Order qubes-meminfo-writer-dom0 before systemd-user-sessions
6 years ago
Marek Marczykowski-Górecki ab7ca7be89
version 4.0.20
6 years ago
Marek Marczykowski-Górecki f7b8a79ce6
udev: create /dev/mapper/dmroot -> xvda3 symlink when its mounted directly
6 years ago
Marek Marczykowski-Górecki 915c8f0cf7
version 4.0.19
6 years ago
Marek Marczykowski-Górecki 645d23b712
travis: add centos7
6 years ago
Marek Marczykowski-Górecki 89776c7f18
rpm: use proper macros for systemd handling
6 years ago
Marek Marczykowski-Górecki 4157f919b6
version 4.0.18
6 years ago
Marek Marczykowski-Górecki cf6438807b
travis: update Fedora versions
6 years ago
Marek Marczykowski-Górecki 0df0d23ec6
Merge remote-tracking branch 'qubesos/pr/34'
6 years ago
Marek Marczykowski-Górecki 9eafc65cb4
udev: don't call udev-block-add-change for devices excluded by other rules
6 years ago
Frédéric Pierret f049d63571
spec.in: add changelog placeholder
6 years ago
Frédéric Pierret 2b3b684107
Fix debug symbols
6 years ago
Frédéric Pierret a716102a08
Remove _builddir
6 years ago
Frédéric Pierret 0630c17588
Makefile.builder: currently disable Mock
6 years ago
Marek Marczykowski-Górecki 84c9ae4bf1
rpm: preparation for src.rpm building
6 years ago
Marek Marczykowski-Górecki 610e7d8f3e
version 4.0.17
6 years ago
Marek Marczykowski-Górecki 258b7926ef
Merge remote-tracking branch 'qubesos/pr/33'
6 years ago
Frédéric Pierret d60964ee23
drop busybox dependance
6 years ago
Frédéric Pierret 2f511d4881
centos: fix python packages names
6 years ago
Frédéric Pierret e3179e066c
Remove busybox as it is not provided in RHEL7 anymore
6 years ago
Frédéric Pierret d1ce12f610
Fix python3 package names with respect to CentOS for consistency with python34 names
6 years ago
Marek Marczykowski-Górecki ff36d11c19
version 4.0.16
6 years ago
Marek Marczykowski-Górecki d623a3e7d3
debian: adjust required version after adding new function
6 years ago
Marek Marczykowski-Górecki 50412a8a8f
qrexec: provide common function for handling service call
6 years ago
Marek Marczykowski-Górecki ff2e2dbc22
version 4.0.15
6 years ago
Marek Marczykowski-Górecki e37f9da355
udev: update detecting usbip-connected devices
6 years ago
Marek Marczykowski-Górecki 6eab71f678
version 4.0.14
6 years ago
Marek Marczykowski-Górecki ab2fa766b9
Merge remote-tracking branch 'qubesos/pr/31'
6 years ago
Rusty Bird 6b3830ba31
udev-block-add-change: ignore unconnected Network Block Device
6 years ago
Reynir Björnsson f4ec550291
Remove duplicate #define
6 years ago
Marek Marczykowski-Górecki 929e03bcba
version 4.0.13
6 years ago
Marek Marczykowski-Górecki f42951578a
travis: run only unit tests
6 years ago
Marek Marczykowski-Górecki 2b1f8931a6
tests: integration tests for qvm-convert-img
6 years ago
Marek Marczykowski-Górecki 34e3c3acf3
imgconverter: fix handling explicit file type
6 years ago
Marek Marczykowski-Górecki c57f28d8f7
Merge remote-tracking branch 'qubesos/pr/29'
6 years ago
Marek Marczykowski-Górecki 1a77802b20
travis: enable deploy stage for master-staging -> master gate
6 years ago
Marek Marczykowski-Górecki 691f4e52f4
travis: run tests also on python3
6 years ago
Marek Marczykowski-Górecki 20be8e2417
Make tests python3 compatible
6 years ago
Marek Marczykowski-Górecki 3899ca1e5d
travis: run imgconverter unit tests
6 years ago
Marek Marczykowski-Górecki 2ac5c03bb3
Update tests
6 years ago
Marek Marczykowski-Górecki 3e41a2987c
imgconverter: fix make_padlock function
6 years ago
Gianluca Guida 5fbd19e1d6
Fix qrexec-lib headers
6 years ago
Marek Marczykowski-Górecki 72343fe0cd
version 4.0.12
7 years ago
Marek Marczykowski-Górecki ee66bb4c80
Merge remote-tracking branch 'qubesos/pr/27'
7 years ago
Marek Marczykowski-Górecki dc5d025247
debian: include drauct module in qubes-kernel-vm-support
7 years ago
Marek Marczykowski-Górecki 3d44d3a80b
debian: make it easier to spot missing files in debian/*.install
7 years ago
Patrick Schleizer 7360aee988
qubes-kernel-vm-support compatibility with dracut
7 years ago
Marek Marczykowski-Górecki e784f3caa3
version 4.0.11
7 years ago
Marek Marczykowski-Górecki 68d7be77db
Make udev-block-add-change executable again
7 years ago
Marek Marczykowski-Górecki 6cb980f5be
Add missing classmethod decorator
7 years ago
Marek Marczykowski-Górecki 0a7d2c0789
Merge remote-tracking branch 'qubesos/pr/25'
7 years ago
Marek Marczykowski-Górecki 92a86fad18
version 4.0.10
7 years ago
Marek Marczykowski-Górecki 141b9912e8
Initialize pad field in filecopy final response
7 years ago
Marek Marczykowski-Górecki 75fa0d3cb0
Merge remote-tracking branch 'qubesos/pr/26'
7 years ago
Your Name a96fe7203e This commit specifies the integer width explicitly to match `result_header_ext` etc.
7 years ago
qubesuser ee58088dec replace tinting algorithm with one that partially preserves saturation too
7 years ago
qubesuser 843ac6c477 reimplement tint algorithm with numpy for reasonable performance
7 years ago
qubesuser 86e9231ac9 use PIL image library instead of ImageMagick to load/save images when tinting
7 years ago
qubesuser 6c6070ab49 add Python pillow and numpy dependencies
7 years ago
qubesuser f893420871 remove unused cairo import
7 years ago
qubesuser 4d08ff40a9 Speed up udev-block-add-change by not using xenstore
7 years ago
Olivier MEDOC 19cb61a0ed archlinux: build imgconverter with both python2 and python3
7 years ago
Marek Marczykowski-Górecki f7cd2b2a76
version 4.0.9
7 years ago
Marek Marczykowski-Górecki 09e6d2ac95
initramfs: add support for variable partitions layout
7 years ago
Marek Marczykowski-Górecki e9615899ff
qubes-prepare-vm-kernel: Include kernel and initramfs inside modules.img
7 years ago
Marek Marczykowski-Górecki b227d01a8a
Fix initramfs scripts on Debian
7 years ago
Marek Marczykowski-Górecki 766f83de8e
version 4.0.8
7 years ago
Marek Marczykowski-Górecki b2207b44fc
travis: add fc26 build
7 years ago
Frédéric Pierret b3f24caaf2
Fix CentOS dependencies: python3
7 years ago
Marek Marczykowski-Górecki c62c8e4416
version 4.0.7
7 years ago
Marek Marczykowski-Górecki c7420318e2
udev: fix loop devices exclusion based on directory flagfile
7 years ago
Olivier MEDOC 0207537b50
Fix gcc Werror because of a typo in a switch/case explicit fallthrough comment
7 years ago
Marek Marczykowski-Górecki d703652070
version 4.0.6
7 years ago
Marek Marczykowski-Górecki 764b0f3f07
udev: major cleanup in block devices handling
7 years ago
Marek Marczykowski-Górecki dd71f295e5
Merge remote-tracking branch 'qubesos/pr/16'
7 years ago
Jean-Philippe Ouellet 349f79bc66
Fix off-by-one error in header length calculation
7 years ago
Marek Marczykowski-Górecki 22c94c37a9
version 4.0.5
7 years ago
Marek Marczykowski-Górecki 823d73a524
udev: filter-out QEMU devices
7 years ago
Marek Marczykowski-Górecki 43908b7eaa
version 4.0.4
7 years ago
Marek Marczykowski-Górecki b130b79b28
Merge remote-tracking branch 'qubesos/pr/15'
7 years ago
Marek Marczykowski-Górecki 4dd813c14b
version 4.0.3
7 years ago
Marek Marczykowski-Górecki 0d4c561064
udev: don't list in qvm-block any device marked to be ignored by udev
7 years ago
HW42 f14637a615 u2mfn: get mfn via pte
7 years ago
Marek Marczykowski-Górecki 1b437e57d5
Merge remote-tracking branch 'qubesos/pr/14'
7 years ago
Marek Marczykowski-Górecki eb1b20fd48
version 4.0.2
7 years ago
Rusty Bird 90a1e6abbd
Fall back to sync() if syncfs() is unavailable
7 years ago
Marek Marczykowski-Górecki da3f3cd426
initramfs: use symlink for rw root.img, instead of dm-linear
7 years ago
Paras Chetal e9b8e5a4d1
Fix include header syntax
7 years ago
Marek Marczykowski-Górecki 77c6d8be6a
version 4.0.1
7 years ago
Marek Marczykowski-Górecki 4d6579474d
rpm: add missing build requires
7 years ago
Marek Marczykowski-Górecki 02d9a1e68f
imgconverter: use core3 API in get_from_vm()
7 years ago
Marek Marczykowski-Górecki 95805f6333
imgconverter: make it really work on python3
7 years ago
Marek Marczykowski-Górecki 6c36cb8de9
rpm: packge qubesimgconverter for both python2 and python3
7 years ago
unman 1db0daea9c
Improve error message when file exists
7 years ago
Marek Marczykowski-Górecki 40fe0d9c8f
travis: drop fc23 vm packages building
7 years ago
Marek Marczykowski-Górecki ae56d597f3
rpm: add missing build requires
7 years ago
Marek Marczykowski-Górecki 488627e2e6
travis: switch to Qubes 4.0
7 years ago
Marek Marczykowski-Górecki 513a1cecf2
version 4.0.0
7 years ago
Marek Marczykowski-Górecki 13b9ea7f1c
debian: fix install location of python files
7 years ago
Marek Marczykowski-Górecki d0fe5e6f9a
initramfs: add support for root.img with partition table
7 years ago
Marek Marczykowski-Górecki 5c7c54adab
initramfs: move qubes_cow_setup hook to pre-trigger
7 years ago
Marek Marczykowski-Górecki 69a3f06f99
Install python modules to /usr
7 years ago
Marek Marczykowski-Górecki 9f6018bdb5
debian: adjust file list
7 years ago
Marek Marczykowski-Górecki b52f4e0f36
Add python-setuptools to build depends
7 years ago
Marek Marczykowski-Górecki fbbd21a54b
qmemman-meminfo-writer: send simplified meminfo value
7 years ago
Marek Marczykowski-Górecki 44edc8a9b2
dracut: add missing 'die' function to 'simple' module
7 years ago
Wojtek Porczyk 162e3734e5
Move imggen module from artwork.
7 years ago
Wojtek Porczyk 2a0bbe1c6f
Package imgconverter as separate Python module
7 years ago
Wojtek Porczyk b6ad625b85
debian/control: remove unneeded qubesdb dependency
7 years ago

@ -1,11 +1,39 @@
sudo: required
dist: trusty
language: generic
install: git clone https://github.com/QubesOS/qubes-builder ~/qubes-builder
script: ~/qubes-builder/scripts/travis-build
dist: bionic
language: python
python:
- '2.7'
install:
- test -z "$TESTS_ONLY" || pip install -r ci/requirements.txt
- test -n "$TESTS_ONLY" || git clone https://github.com/QubesOS/qubes-builder ~/qubes-builder
script:
- test -z "$TESTS_ONLY" || python -m unittest discover -v imgconverter -p test.py
- test -n "$TESTS_ONLY" || ~/qubes-builder/scripts/travis-build
env:
- DIST_DOM0=fc23 USE_QUBES_REPO_VERSION=3.2 USE_QUBES_REPO_TESTING=1
- DISTS_VM=fc23 USE_QUBES_REPO_VERSION=3.2 USE_QUBES_REPO_TESTING=1
- DISTS_VM=fc24 USE_QUBES_REPO_VERSION=3.2 USE_QUBES_REPO_TESTING=1
- DISTS_VM=jessie USE_QUBES_REPO_VERSION=3.2 USE_QUBES_REPO_TESTING=1
- DISTS_VM=stretch USE_QUBES_REPO_VERSION=3.2 USE_QUBES_REPO_TESTING=1
- DIST_DOM0=fc31 USE_QUBES_REPO_VERSION=4.1 USE_QUBES_REPO_TESTING=1
- DISTS_VM=fc29 USE_QUBES_REPO_VERSION=4.1 USE_QUBES_REPO_TESTING=1
- DISTS_VM=fc30 USE_QUBES_REPO_VERSION=4.1 USE_QUBES_REPO_TESTING=1
- DISTS_VM=stretch USE_QUBES_REPO_VERSION=4.1 USE_QUBES_REPO_TESTING=1
- DISTS_VM=buster USE_QUBES_REPO_VERSION=4.1 USE_QUBES_REPO_TESTING=1
- DISTS_VM=centos7 USE_QUBES_REPO_VERSION=4.1 USE_QUBES_REPO_TESTING=1
jobs:
include:
- env: TESTS_ONLY=1
python: 2.7
- env: TESTS_ONLY=1
python: 3.5
- env: TESTS_ONLY=1
python: 3.6
- env: TESTS_ONLY=1
python: 3.7
- stage: deploy
python: 3.6
env: DIST_DOM0=fc31 TESTS_ONLY=
script: ~/qubes-builder/scripts/travis-deploy
# don't build tags which are meant for code signing only
branches:
except:
- /.*_.*/

@ -19,26 +19,26 @@ rpms:
all:
$(MAKE) -C qrexec-lib all
$(MAKE) -C qmemman all
$(MAKE) -C core all
$(MAKE) -C imgconverter all
install:
$(MAKE) -C udev install
$(MAKE) -C qrexec-lib install
$(MAKE) -C qmemman install
$(MAKE) -C core install
$(MAKE) -C imgconverter install
install-fedora-kernel-support:
$(MAKE) -C dracut install
$(MAKE) -C kernel-modules install
$(MAKE) -C grub install-fedora
install-debian-kernel-support:
$(MAKE) -C initramfs-tools install
$(MAKE) -C dracut install
$(MAKE) -C kernel-modules install
# expand module version
rm -f debian/qubes-kernel-vm-support.dkms
echo debian/tmp/usr/src/u2mfn-*/dkms.conf > debian/qubes-kernel-vm-support.dkms
$(MAKE) -C grub install-debian
clean:
$(MAKE) -C qrexec-lib clean
$(MAKE) -C qmemman clean
$(MAKE) -C core clean
$(MAKE) -C imgconverter clean

@ -13,7 +13,7 @@ arch=("x86_64")
url="http://qubes-os.org/"
license=('GPL')
groups=()
makedepends=(gcc make pkgconfig 'qubes-libvchan')
makedepends=(gcc make pkgconfig 'python-setuptools' 'python2-setuptools')
checkdepends=()
optdepends=()
provides=()
@ -31,24 +31,33 @@ md5sums=(SKIP)
build() {
for source in qrexec-lib udev qmemman core kernel-modules Makefile dracut; do
for source in qrexec-lib udev qmemman core kernel-modules Makefile dracut imgconverter; do
(ln -s $srcdir/../$source $srcdir/$source)
done
make all
# Build all with python2
PYTHON=python2 make all
# Build imgconverter with python3
make -C imgconverter all
}
package_qubes-vm-utils() {
depends=(qubes-libvchan imagemagick python2-cairo)
depends=(imagemagick python2-cairo python2-pillow python2-numpy python-pillow python-numpy)
install=PKGBUILD-qubes-vm-utils.install
make install DESTDIR=$pkgdir LIBDIR=/usr/lib SYSLIBDIR=/usr/lib SBINDIR=/usr/bin
# Install all for python2
PYTHON=python2 make install DESTDIR=$pkgdir LIBDIR=/usr/lib SYSLIBDIR=/usr/lib SBINDIR=/usr/bin
# Install imgconverter as python3
make -C imgconverter install DESTDIR=$pkgdir LIBDIR=/usr/lib SYSLIBDIR=/usr/lib SBINDIR=/usr/bin
}
package_qubes-vm-kernel-support() {
depends=(qubes-libvchan mkinitcpio dkms grub)
depends=(mkinitcpio grub)
install=PKGBUILD-qubes-vm-kernel-support.install
mkdir -p ${pkgdir}/usr/lib/initcpio/install/
@ -59,8 +68,6 @@ mkdir -p ${pkgdir}/usr/bin/
install -m 611 ${srcdir}/PKGBUILD-initcpio-install.sh ${pkgdir}/usr/lib/initcpio/install/qubes
install -m 611 ${srcdir}/PKGBUILD-initcpio-hook.sh ${pkgdir}/usr/lib/initcpio/hooks/qubes
install -m 755 ${srcdir}/dracut/full-dmroot/qubes_cow_setup.sh ${pkgdir}/usr/lib/qubes/qubes_cow_setup.sh
make install-u2mfn DESTDIR=$pkgdir -C kernel-modules
}

@ -3,7 +3,6 @@
build() {
add_module "xen-blkfront"
add_module "u2mfn"
add_binary "/usr/bin/sfdisk"
add_binary "/usr/bin/mkswap"
add_binary "/usr/bin/dmsetup"

@ -0,0 +1,2 @@
Pillow
numpy

@ -1,20 +0,0 @@
PYTHON = /usr/bin/python2
PYTHON_SITEARCH = `python2 -c 'import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1)'`
all:
$(PYTHON) -m compileall .
$(PYTHON) -O -m compileall .
.PHONY: all
clean:
$(RM) *.py[co]
.PHONY: clean
install:
mkdir -p $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
ifeq (1,${DEBIANBUILD})
cp *.py $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
else
cp *.py* $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
endif
.PHONY: install

334
debian/changelog vendored

@ -1,3 +1,337 @@
qubes-utils (4.1.3) unstable; urgency=medium
[ xaki23 ]
* partition full volatile for non-COW setups too
[ Frédéric Pierret (fepitre) ]
* travis: switch to bionic
[ Marek Marczykowski-Górecki ]
* travis: update python versions
[ Patrick Schleizer ]
* qubes-kernel-vm-support.preinst create folder /boot/grub
* qubes-kernel-vm-support.postinst run update-grub
[ Marek Marczykowski-Górecki ]
* debian: fix dependencies of qubes-kernel-vm-support pkg
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 07 Dec 2019 05:50:26 +0100
qubes-utils (4.1.2) unstable; urgency=medium
[ xaki23 ]
* align volatile swap partition to 1Mb instead of 512b
[ Marek Marczykowski-Górecki ]
* rpm: update python2 deps
* Disable BLS config style in grub
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sun, 22 Sep 2019 05:10:19 +0200
qubes-utils (4.1.1) unstable; urgency=medium
* initrd: mount / rw for the overlayfs setup time
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Mon, 10 Jun 2019 00:48:40 +0200
qubes-utils (4.1.0) unstable; urgency=medium
* Remove qrexec related files
* Remove u2mfn module
* travis: update to R4.1
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 08 Jun 2019 03:20:55 +0200
qubes-utils (4.0.24) unstable; urgency=medium
[ Marek Marczykowski-Górecki ]
* Declare u2mfn module version, skip build for qubes kernels
[ Frédéric Pierret (fepitre) ]
* python3: use macro pkgversion
* travis: switch to xenial
* travis: remove older Fedora releases and add Fedora 30
[ Marek Marczykowski-Górecki ]
* initramfs: use overlayfs for /lib/modules, if available
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Thu, 06 Jun 2019 21:30:30 +0200
qubes-utils (4.0.23) unstable; urgency=medium
* Disable scrubbing memory pages during initial balloon down
* dracut: fix checking for "Root filesystem" label, improve udev sync
* dracut: add a flag file indicating scrub-pages option support
* Adjust permissions of /dev/xen/hypercall
* Do not use /proc/xen for detecting dom0 anymore
* Really install xen-scrub-pages dracut module
* Add xen_scrub_pages=0 kernel option only if initramfs was rebuilt
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Mon, 25 Feb 2019 21:46:52 +0100
qubes-utils (4.0.22) unstable; urgency=medium
* tests: skip img converter test if qubes-img-converter is not
installed
* imgconverter: allow icons up to 2048x2048
* tests: skip the other img converter test too
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Mon, 29 Oct 2018 01:03:59 +0100
qubes-utils (4.0.21) unstable; urgency=medium
[ Rusty Bird ]
* Order qubes-meminfo-writer-dom0 before systemd-user-sessions
[ Marek Marczykowski-Górecki ]
* rpm: adjust for fc29
* travis: update Fedora and Debian versions
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 09 Oct 2018 00:25:11 +0200
qubes-utils (4.0.20) unstable; urgency=medium
* udev: create /dev/mapper/dmroot -> xvda3 symlink when its mounted
directly
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 03 Jul 2018 21:11:00 +0200
qubes-utils (4.0.19) unstable; urgency=medium
* rpm: use proper macros for systemd handling
* travis: add centos7
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Wed, 02 May 2018 17:55:09 +0200
qubes-utils (4.0.18) unstable; urgency=medium
[ Marek Marczykowski-Górecki ]
* udev: don't call udev-block-add-change for devices excluded by other
rules
* rpm: preparation for src.rpm building
[ Frédéric Pierret ]
* Makefile.builder: currently disable Mock
* Remove _builddir
* Fix debug symbols
* spec.in: add changelog placeholder
[ Marek Marczykowski-Górecki ]
* travis: update Fedora versions
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 21 Apr 2018 14:36:39 +0200
qubes-utils (4.0.17) unstable; urgency=medium
[ Frédéric Pierret ]
* Fix python3 package names with respect to CentOS for consistency
with python34 names
* Remove busybox as it is not provided in RHEL7 anymore
* centos: fix python packages names
* drop busybox dependance
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 27 Feb 2018 15:17:12 +0100
qubes-utils (4.0.16) unstable; urgency=medium
* qrexec: provide common function for handling service call
* debian: adjust required version after adding new function
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 20 Feb 2018 00:05:31 +0100
qubes-utils (4.0.15) unstable; urgency=medium
* udev: update detecting usbip-connected devices
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Thu, 18 Jan 2018 19:07:40 +0100
qubes-utils (4.0.14) unstable; urgency=medium
[ Reynir Björnsson ]
* Remove duplicate #define
[ Rusty Bird ]
* udev-block-add-change: ignore unconnected Network Block Device
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Fri, 12 Jan 2018 06:16:05 +0100
qubes-utils (4.0.13) unstable; urgency=medium
[ Marek Marczykowski-Górecki ]
* imgconverter: fix make_padlock function
* Update tests
* travis: run imgconverter unit tests
* Make tests python3 compatible
* travis: run tests also on python3
* travis: enable deploy stage for master-staging -> master gate
[ Gianluca Guida ]
* Fix qrexec-lib headers
[ Marek Marczykowski-Górecki ]
* imgconverter: fix handling explicit file type
* tests: integration tests for qvm-convert-img
* travis: run only unit tests
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 23 Dec 2017 02:50:19 +0100
qubes-utils (4.0.12) unstable; urgency=medium
[ Marek Marczykowski-Górecki ]
* debian: make it easier to spot missing files in debian/*.install
* debian: include drauct module in qubes-kernel-vm-support
[ Patrick Schleizer ]
* qubes-kernel-vm-support compatibility with dracut
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 12 Dec 2017 01:41:52 +0100
qubes-utils (4.0.11) unstable; urgency=medium
[ qubesuser ]
* remove unused cairo import
* add Python pillow and numpy dependencies
* use PIL image library instead of ImageMagick to load/save images
when tinting
* reimplement tint algorithm with numpy for reasonable performance
* replace tinting algorithm with one that partially preserves
saturation too
[ Marek Marczykowski-Górecki ]
* Add missing classmethod decorator
* Make udev-block-add-change executable again
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 21 Nov 2017 05:34:50 +0100
qubes-utils (4.0.10) unstable; urgency=medium
[ Olivier MEDOC ]
* archlinux: build imgconverter with both python2 and python3
[ qubesuser ]
* Speed up udev-block-add-change by not using xenstore
[ Your Name ]
* This commit specifies the integer width explicitly to match
`result_header_ext` etc.
[ Marek Marczykowski-Górecki ]
* Initialize pad field in filecopy final response
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 21 Nov 2017 04:46:49 +0100
qubes-utils (4.0.9) unstable; urgency=medium
* Fix initramfs scripts on Debian
* qubes-prepare-vm-kernel: Include kernel and initramfs inside
modules.img
* initramfs: add support for variable partitions layout
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 17 Oct 2017 23:54:15 +0200
qubes-utils (4.0.8) unstable; urgency=medium
[ Frédéric Pierret ]
* Fix CentOS dependencies: python3
[ Marek Marczykowski-Górecki ]
* travis: add fc26 build
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 30 Sep 2017 01:59:38 +0200
qubes-utils (4.0.7) unstable; urgency=medium
[ Olivier MEDOC ]
* Fix gcc Werror because of a typo in a switch/case explicit
fallthrough comment
[ Marek Marczykowski-Górecki ]
* udev: fix loop devices exclusion based on directory flagfile
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Fri, 15 Sep 2017 13:43:18 +0200
qubes-utils (4.0.6) unstable; urgency=medium
[ Jean-Philippe Ouellet ]
* Fix off-by-one error in header length calculation
[ Marek Marczykowski-Górecki ]
* udev: major cleanup in block devices handling
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Tue, 12 Sep 2017 04:52:48 +0200
qubes-utils (4.0.5) unstable; urgency=medium
* udev: filter-out QEMU devices
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Fri, 11 Aug 2017 13:34:11 +0200
qubes-utils (4.0.4) unstable; urgency=medium
[ HW42 ]
* u2mfn: get mfn via pte
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 29 Jul 2017 05:19:34 +0200
qubes-utils (4.0.3) unstable; urgency=medium
[ Rusty Bird ]
* Fall back to sync() if syncfs() is unavailable
[ Marek Marczykowski-Górecki ]
* udev: don't list in qvm-block any device marked to be ignored by
udev
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Thu, 06 Jul 2017 19:41:04 +0200
qubes-utils (4.0.2) unstable; urgency=medium
[ Paras Chetal ]
* Fix include header syntax
[ Marek Marczykowski-Górecki ]
* initramfs: use symlink for rw root.img, instead of dm-linear
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 24 Jun 2017 14:55:03 +0200
qubes-utils (4.0.1) unstable; urgency=medium
[ Marek Marczykowski-Górecki ]
* travis: switch to Qubes 4.0
* rpm: add missing build requires
* travis: drop fc23 vm packages building
[ unman ]
* Improve error message when file exists
[ Marek Marczykowski-Górecki ]
* rpm: packge qubesimgconverter for both python2 and python3
* imgconverter: make it really work on python3
* imgconverter: use core3 API in get_from_vm()
* rpm: add missing build requires
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Thu, 18 May 2017 01:54:46 +0200
qubes-utils (4.0.0) unstable; urgency=medium
[ Wojtek Porczyk ]
* debian/control: remove unneeded qubesdb dependency
* Package imgconverter as separate Python module
* Move imggen module from artwork.
[ Marek Marczykowski-Górecki ]
* dracut: add missing 'die' function to 'simple' module
* qmemman-meminfo-writer: send simplified meminfo value
* Add python-setuptools to build depends
* debian: adjust file list
* Install python modules to /usr
* initramfs: move qubes_cow_setup hook to pre-trigger
* initramfs: add support for root.img with partition table
* debian: fix install location of python files
-- Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Sat, 08 Apr 2017 13:58:53 +0200
qubes-utils (3.2.4) unstable; urgency=medium
[ Johanna A ]

31
debian/control vendored

@ -3,12 +3,11 @@ Section: admin
Priority: extra
Maintainer: Davíð Steinn Geirsson <david@dsg.is>
Build-Depends:
libvchan-xen-dev,
libxen-dev,
pkg-config,
debhelper (>= 9.0.0),
dh-systemd,
dkms
python-setuptools,
Standards-Version: 3.9.3
Homepage: http://www.qubes-os.org
Vcs-Git: http://dsg.is/qubes/qubes-linux-utils.git
@ -16,7 +15,7 @@ Vcs-Git: http://dsg.is/qubes/qubes-linux-utils.git
Package: qubes-utils
Architecture: any
Depends: qubesdb-vm, libvchan-xen, lsb-base, ${shlibs:Depends}, ${misc:Depends}
Depends: lsb-base, python-pil, python-numpy, python3-pil, python3-numpy, ${shlibs:Depends}, ${misc:Depends}
Conflicts: qubes-linux-utils
Breaks: qubes-core-agent (<< 3.1.4)
Recommends: python2.7
@ -25,23 +24,16 @@ Description: Qubes Linux utilities
Package: qubes-kernel-vm-support
Architecture: any
Depends: dkms, initramfs-tools, ${misc:Depends}
Depends:
busybox,
initramfs-tools | dracut,
grub2-common,
${misc:Depends}
Description: Qubes VM kernel and initramfs modules
This package contains:
1. mkinitramfs module required to setup Qubes VM root filesystem. This package
is needed in VM only when the VM uses its own kernel (via pvgrub or so).
Otherwise initrd is provided by dom0.
.
2. u2mfn kernel module sources (dkms) required by GUI agent and R2 version of
libvchan library.
Package: libqrexec-utils2
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Breaks: qubes-utils (<< 3.1.4)
Replaces: qubes-utils (<< 3.1.4)
Description: Library of common functions of qrexec agent and daemon
This library contains common helper functions for qrexec agent and daemon.
Package: libqubes-rpc-filecopy2
Architecture: any
@ -52,15 +44,6 @@ Description: Qubes file copy protocol library
This library can be used for both sending files using qfile protocol and for
receiving them.
Package: libqrexec-utils-dev
Architecture: any
Section: libdevel
Depends: libqrexec-utils2 (= ${binary:Version}), ${misc:Depends}
Breaks: qubes-utils (<< 3.1.4)
Replaces: qubes-utils (<< 3.1.4)
Description: Development headers for libqrexec-utils
This package contains files required to compile qrexec-agent and qrexec-daemon.
Package: libqubes-rpc-filecopy-dev
Architecture: any
Section: libdevel

@ -1,3 +0,0 @@
usr/include/libqrexec-utils.h
usr/include/qrexec.h
usr/lib/libqrexec-utils.so

@ -1 +0,0 @@
usr/lib/libqrexec-utils.so.2*

@ -1 +0,0 @@
libqrexec-utils 2 libqrexec-utils2 (>= 3.1.3)

@ -1 +0,0 @@
debian/tmp/usr/src/u2mfn-3.1.2/dkms.conf

@ -1,3 +1,8 @@
usr/share/initramfs-tools/scripts/local-top/scrub_pages
usr/share/initramfs-tools/scripts/local-top/qubes_cow_setup
usr/share/initramfs-tools/hooks/qubes_vm
usr/src/u2mfn-*/*
usr/lib/dracut/modules.d/90qubes-vm/*
usr/lib/dracut/modules.d/90qubes-vm-modules/*
usr/lib/dracut/modules.d/90qubes-vm-simple/*
usr/lib/dracut/modules.d/80xen-scrub-pages/*
etc/default/grub.d/30-qubes-kernel-vm-support.cfg

@ -0,0 +1,64 @@
#!/bin/bash
# postinst script for qubes-kernel-vm-support
#
# see: dh_installdeb(1)
set -e
# The postinst script may be called in the following ways:
# * <postinst> 'configure' <most-recently-configured-version>
# * <old-postinst> 'abort-upgrade' <new version>
# * <conflictor's-postinst> 'abort-remove' 'in-favour' <package>
# <new-version>
# * <postinst> 'abort-remove'
# * <deconfigured's-postinst> 'abort-deconfigure' 'in-favour'
# <failed-install-package> <version> 'removing'
# <conflicting-package> <version>
#
# For details, see http://www.debian.org/doc/debian-policy/ or
# https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html or
# the debian-policy package
case "${1}" in
configure)
if [ -x /usr/sbin/update-initramfs ]; then
if update-initramfs -u; then
# "milestone" initramfs update version:
# 1 - addition of xen scrub_pages enabling code
echo 1 > /var/lib/qubes/initramfs-updated
fi
fi
;;
abort-upgrade|abort-remove|abort-deconfigure)
exit 0
;;
*)
echo "postinst called with unknown argument \`${1}'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
## https://phabricator.whonix.org/T377
## Debian has no update-grub trigger yet:
## https://bugs.debian.org/481542
if command -v update-grub >/dev/null 2>&1; then
update-grub || \
echo "$DPKG_MAINTSCRIPT_PACKAGE $DPKG_MAINTSCRIPT_NAME ERROR: Running \
'update-grub' failed with exit code $?. $DPKG_MAINTSCRIPT_PACKAGE is most \
likely only the trigger, not the cause. Unless you know this is not an issue, \
you should fix running 'update-grub', otherwise your system might no longer \
boot." >&2
fi
exit 0
# vim: set ts=4 sw=4 sts=4 et :

@ -0,0 +1,9 @@
#!/bin/bash
set -e
mkdir --parents /boot/grub || true
#DEBHELPER#
exit 0

@ -1,5 +1,5 @@
usr/sbin/meminfo-writer
lib/systemd/system/qubes-meminfo-writer.service
usr/lib/qubes/*
usr/lib/python2.7/dist-packages/qubes/*
usr/lib/python2.7/dist-packages/qubesimgconverter*/*
lib/udev/*

9
debian/rules vendored

@ -7,11 +7,16 @@ export DESTDIR=$(shell pwd)/debian/tmp
#export DH_VERBOSE=1
%:
dh $@ --with=systemd,dkms
dh $@ --with=systemd
override_dh_auto_build:
make all LIBDIR=/usr/lib DEBIANBUILD=1
override_dh_auto_install:
make install LIBDIR=/usr/lib DEBIANBUILD=1
make install LIBDIR=/usr/lib DEBIANBUILD=1 PYTHON_PREFIX_ARG=--install-layout=deb
make install-debian-kernel-support LIBDIR=/usr/lib DEBIANBUILD=1
# dom0-only file
rm -f $(DESTDIR)/usr/sbin/qubes-prepare-vm-kernel
override_dh_install:
dh_install --fail-missing

@ -2,3 +2,4 @@ install:
$(MAKE) -C simple
$(MAKE) -C full-dmroot
$(MAKE) -C full-modules
$(MAKE) -C xen-balloon-scrub-pages

@ -14,7 +14,7 @@ depends() {
}
install() {
inst_hook pre-udev 90 $moddir/qubes_cow_setup.sh
inst_hook pre-trigger 90 $moddir/qubes_cow_setup.sh
inst_multiple \
sfdisk \
mkswap

@ -1,6 +1,6 @@
#!/bin/sh
#
# This file should be placed in pre-mount directory in dracut's initramfs, or
# This file should be placed in pre-trigger directory in dracut's initramfs, or
# scripts/local-top in case of initramfs-tools
#
@ -53,23 +53,34 @@ fi
modprobe xenblk || modprobe xen-blkfront || warn "Qubes: Cannot load Xen Block Frontend..."
log_begin "Waiting for /dev/xvda* devices..."
while ! [ -e /dev/xvda ]; do sleep 0.1; done
udevadm settle --exit-if-exists=/dev/xvda
log_end
# prefer partition if exists
if [ -b /dev/xvda1 ]; then
if [ -e "/dev/disk/by-partlabel/Root\\x20filesystem" ]; then
ROOT_DEV=$(basename $(readlink "/dev/disk/by-partlabel/Root\\x20filesystem"))
else
ROOT_DEV=xvda3
fi
else
ROOT_DEV=xvda
fi
SWAP_SIZE=$(( 1024 * 1024 * 2 )) # sectors, 1GB
if [ `cat /sys/block/xvda/ro` = 1 ] ; then
if [ `cat /sys/class/block/$ROOT_DEV/ro` = 1 ] ; then
log_begin "Qubes: Doing COW setup for AppVM..."
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
VOLATILE_SIZE=$(cat /sys/block/xvdc/size) # sectors
ROOT_SIZE=$(cat /sys/block/xvda/size) # sectors
VOLATILE_SIZE=$(cat /sys/class/block/xvdc/size) # sectors
ROOT_SIZE=$(cat /sys/class/block/$ROOT_DEV/size) # sectors
if [ $VOLATILE_SIZE -lt $SWAP_SIZE ]; then
die "volatile.img smaller than 1GB, cannot continue"
fi
sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
1,$SWAP_SIZE,S
,,L
xvdc1: type=82,start=2048,size=$SWAP_SIZE
xvdc2: type=83
EOF
if [ $? -ne 0 ]; then
die "Qubes: failed to setup partitions on volatile device"
@ -78,22 +89,26 @@ EOF
mkswap /dev/xvdc1
while ! [ -e /dev/xvdc2 ]; do sleep 0.1; done
echo "0 `cat /sys/block/xvda/size` snapshot /dev/xvda /dev/xvdc2 N 16" | \
echo "0 `cat /sys/class/block/$ROOT_DEV/size` snapshot /dev/$ROOT_DEV /dev/xvdc2 N 16" | \
dmsetup --noudevsync create dmroot || die "Qubes: FATAL: cannot create dmroot!"
dmsetup mknodes dmroot
log_end
else
log_begin "Qubes: Doing R/W setup for TemplateVM..."
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
1,$SWAP_SIZE,S
xvdc1: type=82,start=2048,size=$SWAP_SIZE
xvdc3: type=83
EOF
if [ $? -ne 0 ]; then
die "Qubes: failed to setup partitions on volatile device"
fi
while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done
mkswap /dev/xvdc1
echo "0 `cat /sys/block/xvda/size` linear /dev/xvda 0" | \
dmsetup --noudevsync create dmroot || die "Qubes: FATAL: cannot create dmroot!"
mkdir -p /etc/udev/rules.d
printf 'KERNEL=="%s", SYMLINK+="mapper/dmroot"\n' "$ROOT_DEV" >> \
/etc/udev/rules.d/99-root.rules
udevadm control -R
udevadm trigger
log_end
fi
dmsetup mknodes dmroot

@ -2,3 +2,5 @@ install:
install -d $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm-simple
install module-setup.sh init.sh \
$(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm-simple/
# flag indicating the module will (re-)enable scrub-pages option
touch $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm-simple/xen-scrub-pages-supported

@ -6,63 +6,88 @@ mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
if [ -w /sys/devices/system/xen_memory/xen_memory0/scrub_pages ]; then
# re-enable xen-balloon pages scrubbing, after initial balloon down
echo 1 > /sys/devices/system/xen_memory/xen_memory0/scrub_pages
fi
if [ -e /dev/mapper/dmroot ] ; then
echo "Qubes: FATAL error: /dev/mapper/dmroot already exists?!"
fi
modprobe xenblk || modprobe xen-blkfront || echo "Qubes: Cannot load Xen Block Frontend..."
/sbin/modprobe xenblk || /sbin/modprobe xen-blkfront || echo "Qubes: Cannot load Xen Block Frontend..."
die() {
echo "$@" >&2
exit 1
}
echo "Waiting for /dev/xvda* devices..."
while ! [ -e /dev/xvda ]; do sleep 0.1; done
# prefer partition if exists
if [ -b /dev/xvda1 ]; then
if [ -d /dev/disk/by-partlabel ]; then
ROOT_DEV=$(basename $(readlink "/dev/disk/by-partlabel/Root\\x20filesystem"))
else
ROOT_DEV=$(grep -l "PARTNAME=Root filesystem" /sys/block/xvda/xvda*/uevent |\
grep -o "xvda[0-9]")
fi
if [ -z "$ROOT_DEV" ]; then
# fallback to third partition
ROOT_DEV=xvda3
fi
else
ROOT_DEV=xvda
fi
SWAP_SIZE=$(( 1024 * 1024 * 2 )) # sectors, 1GB
if [ `cat /sys/block/xvda/ro` = 1 ] ; then
if [ `cat /sys/class/block/$ROOT_DEV/ro` = 1 ] ; then
echo "Qubes: Doing COW setup for AppVM..."
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
VOLATILE_SIZE=$(cat /sys/block/xvdc/size) # sectors
ROOT_SIZE=$(cat /sys/block/xvda/size) # sectors
VOLATILE_SIZE=$(cat /sys/class/block/xvdc/size) # sectors
ROOT_SIZE=$(cat /sys/class/block/$ROOT_DEV/size) # sectors
if [ $VOLATILE_SIZE -lt $SWAP_SIZE ]; then
die "volatile.img smaller than 1GB, cannot continue"
fi
sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
1,$SWAP_SIZE,S
,,L
/sbin/sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
xvdc1: type=82,start=2048,size=$SWAP_SIZE
xvdc2: type=83
EOF
if [ $? -ne 0 ]; then
echo "Qubes: failed to setup partitions on volatile device"
exit 1
fi
while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done
mkswap /dev/xvdc1
/sbin/mkswap /dev/xvdc1
while ! [ -e /dev/xvdc2 ]; do sleep 0.1; done
echo "0 `cat /sys/block/xvda/size` snapshot /dev/xvda /dev/xvdc2 N 16" | \
dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; }
echo "0 `cat /sys/class/block/$ROOT_DEV/size` snapshot /dev/$ROOT_DEV /dev/xvdc2 N 16" | \
/sbin/dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; }
/sbin/dmsetup mknodes dmroot
echo Qubes: done.
else
echo "Qubes: Doing R/W setup for TemplateVM..."
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
1,$SWAP_SIZE,S
/sbin/sfdisk -q --unit S /dev/xvdc >/dev/null <<EOF
xvdc1: type=82,start=2048,size=$SWAP_SIZE
xvdc3: type=83
EOF
if [ $? -ne 0 ]; then
die "Qubes: failed to setup partitions on volatile device"
fi
while ! [ -e /dev/xvdc1 ]; do sleep 0.1; done
mkswap /dev/xvdc1
echo "0 `cat /sys/block/xvda/size` linear /dev/xvda 0" | \
dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; }
/sbin/mkswap /dev/xvdc1
ln -s ../$ROOT_DEV /dev/mapper/dmroot
echo Qubes: done.
fi
dmsetup mknodes dmroot
modprobe ext4
/sbin/modprobe ext4
mkdir -p /sysroot
mount /dev/mapper/dmroot /sysroot -o ro
mount /dev/mapper/dmroot /sysroot -o rw
NEWROOT=/sysroot
kver="`uname -r`"
@ -70,20 +95,27 @@ if ! [ -d "$NEWROOT/lib/modules/$kver/kernel" ]; then
echo "Waiting for /dev/xvdd device..."
while ! [ -e /dev/xvdd ]; do sleep 0.1; done
# Mount only `uname -r` subdirectory, to leave the rest of /lib/modules writable
mkdir -p /tmp/modules
mount -n -t ext3 /dev/xvdd /tmp/modules
if ! [ -d "$NEWROOT/lib/modules/$kver" ]; then
mount "$NEWROOT" -o remount,rw
mkdir -p "$NEWROOT/lib/modules/$kver"
mount "$NEWROOT" -o remount,ro
if /sbin/modprobe overlay; then
# if overlayfs is supported, use that to provide fully writable /lib/modules
if ! [ -d "$NEWROOT/lib/.modules_work" ]; then
mkdir -p "$NEWROOT/lib/.modules_work"
fi
mount -t overlay none $NEWROOT/lib/modules -o lowerdir=/tmp/modules,upperdir=$NEWROOT/lib/modules,workdir=$NEWROOT/lib/.modules_work
else
# otherwise mount only `uname -r` subdirectory, to leave the rest of
# /lib/modules writable
if ! [ -d "$NEWROOT/lib/modules/$kver" ]; then
mkdir -p "$NEWROOT/lib/modules/$kver"
fi
mount --bind "/tmp/modules/$kver" "$NEWROOT/lib/modules/$kver"
fi
mount --bind "/tmp/modules/$kver" "$NEWROOT/lib/modules/$kver"
umount /tmp/modules
rmdir /tmp/modules
fi
umount /dev /sys /proc
mount "$NEWROOT" -o remount,ro
exec switch_root $NEWROOT /sbin/init
exec /sbin/switch_root $NEWROOT /sbin/init

@ -5,13 +5,30 @@ check() {
}
depends() {
echo busybox dm
echo dm
return 0
}
installkernel() {
hostonly='' instmods overlay
}
install() {
inst $moddir/init.sh /init
inst_multiple \
basename \
readlink \
uname \
grep \
kmod \
modprobe \
ln \
switch_root \
mount \
umount \
mkdir \
rmdir \
sleep \
sfdisk \
mkswap
}

@ -0,0 +1,4 @@
install:
install -d $(DESTDIR)/usr/lib/dracut/modules.d/80xen-scrub-pages
install module-setup.sh scrub_pages.sh \
$(DESTDIR)/usr/lib/dracut/modules.d/80xen-scrub-pages/

@ -0,0 +1,17 @@
#!/bin/bash
check() {
if [ -r /usr/share/qubes/marker-vm ]; then
return 0
else
return 255
fi
}
depends() {
return 0
}
install() {
inst_hook pre-trigger 60 $moddir/scrub_pages.sh
}

@ -0,0 +1,20 @@
#!/bin/sh
#
# This file should be placed in pre-trigger directory in dracut's initramfs, or
# scripts/local-top in case of initramfs-tools
#
# initramfs-tools (Debian) API
PREREQS=""
case "$1" in
prereqs)
# This runs during initramfs creation
echo "$PREREQS"
exit 0
;;
esac
if [ -w /sys/devices/system/xen_memory/xen_memory0/scrub_pages ]; then
# re-enable xen-balloon pages scrubbing, after initial balloon down
echo 1 > /sys/devices/system/xen_memory/xen_memory0/scrub_pages
fi

@ -0,0 +1,7 @@
install-fedora:
install -D -m 0644 grub.qubes-kernel-vm-support \
$(DESTDIR)/etc/default/grub.qubes-kernel-vm-support
install-debian:
install -D -m 0644 grub.qubes-kernel-vm-support \
$(DESTDIR)/etc/default/grub.d/30-qubes-kernel-vm-support.cfg

@ -0,0 +1,8 @@
# add kernel options only in VM, and only if initramfs is updated already
# /var/lib/qubes/initramfs-updated contains "milestone" initramfs update version:
# 1 - addition of xen scrub_pages enabling code
if [ -r /usr/share/qubes/marker-vm ] &&
[ "$(cat /var/lib/qubes/initramfs-updated 2>/dev/null || echo 0)" -ge 1 ]; then
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX xen_scrub_pages=0"
fi
GRUB_ENABLE_BLSCFG=false

@ -0,0 +1,18 @@
PYTHON ?= python
all:
$(PYTHON) setup.py build
.PHONY: all
clean:
$(PYTHON) setup.py clean
.PHONY: clean
install:
$(PYTHON) setup.py install -O1 $(PYTHON_PREFIX_ARG) --root $(DESTDIR)
#ifeq (1,${DEBIANBUILD})
# cp *.py $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
#else
# cp *.py* $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
#endif
.PHONY: install

@ -23,16 +23,18 @@ Toolkit for secure transfer and conversion of images between Qubes VMs.'''
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import colorsys
import math
import os
import re
import cStringIO as StringIO
try:
from io import BytesIO
except ImportError:
from cStringIO import StringIO as BytesIO
import subprocess
import sys
import unittest
import cairo
import PIL.Image
import numpy
# those are for "zOMG UlTRa HD! WalLLpapPer 8K!!1!" to work seamlessly;
# 8192 * 5120 * 4 B = 160 MiB, so DoS by memory exhaustion is unlikely
@ -42,13 +44,13 @@ MAX_HEIGHT = 5120
# current max raster icon size in hicolor theme is 256 as of 2013/fedora-18
# beyond that one probably shall use scalable icons
# (SVG is currently unsupported)
ICON_MAXSIZE = 512
ICON_MAXSIZE = 2048
# header consists of two decimal numbers, SPC and LF
re_imghdr = re.compile(r'^\d+ \d+\n$')
imghdrlen = lambda w, h: int(math.ceil(math.log10(w)) \
+ math.ceil(math.log10(h)) \
+ 2)
re_imghdr = re.compile(br'^\d+ \d+\n$')
def imghdrlen(w, h):
# width & height are inclusive max vals, and +2 for ' ' and '\n'
return len(str(w)) + len(str(h)) + 2
class Image(object):
def __init__(self, rgba, size):
@ -70,6 +72,12 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()'''
if p.wait():
raise Exception('Conversion failed')
def save_pil(self, dst):
'''Save image to disk using PIL.'''
img = PIL.Image.frombytes('RGBA', self._size, self._rgba)
img.save(dst)
@property
def data(self):
return self._rgba
@ -85,18 +93,66 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()'''
def tint(self, colour):
'''Return new tinted image'''
r, g, b = hex_to_float(colour)
h, _, s = colorsys.rgb_to_hls(r, g, b)
result = StringIO.StringIO()
for i in xrange(0, self._size[0] * self._size[1] * 4, 4):
r, g, b, a = tuple(ord(c) / 255. for c in self._rgba[i:i+4])
_, l, _ = colorsys.rgb_to_hls(r, g, b)
r, g, b = colorsys.hls_to_rgb(h, l, s)
result.write(''.join(chr(int(i * 255)) for i in [r, g, b, a]))
tr, tg, tb = hex_to_int(colour)
tM = max(tr, tg, tb)
tm = min(tr, tg, tb)
return self.__class__(rgba=result.getvalue(), size=self._size)
# (trn/tdn, tgn/tdn, tbn/tdn) is the tint color with maximum saturation
if tm == tM:
trn = 1
tgn = 1
tbn = 1
tdn = 2
else:
trn = tr - tm
tgn = tg - tm
tbn = tb - tm
tdn = tM - tm
# use a 1D image representation since we only process a single pixel at a time
pixels = self._size[0] * self._size[1]
x = numpy.fromstring(self._rgba, 'B').reshape(pixels, 4)
r = x[:, 0]
g = x[:, 1]
b = x[:, 2]
a = x[:, 3]
M = numpy.maximum(numpy.maximum(r, g), b).astype('u4')
m = numpy.minimum(numpy.minimum(r, g), b).astype('u4')
# Tn/Td is how much chroma range is reserved for the tint color
# 0 -> greyscale image becomes greyscale image
# 1 -> image becomes solid tint color
Tn = 1
Td = 4
# set chroma to the original pixel chroma mapped to the Tn/Td .. 1 range
# float c2 = (Tn/Td) + (1.0 - Tn/Td) * c
# set lightness to the original pixel lightness mapped to the range for the new chroma value
# float m2 = m * (1.0 - c2) / (1.0 - c)
c = M - m
c2 = (Tn * 255) + (Td - Tn) * c
c2d = Td
m2 = ((255 * c2d) - c2) * m
# the maximum avoids division by 0 when c = 255 (m2 is 0 anyway, so m2d doesn't matter)
m2d = numpy.maximum((255 - c) * c2d, 1)
# precomputed values
c2d_tdn = tdn * c2d
m2_c2d_tdn = m2 * c2d_tdn
m2d_c2d_tdn = m2d * c2d_tdn
c2_m2d = c2 * m2d
# float vt = m2 + tvn * c2
rt = ((m2_c2d_tdn + trn * c2_m2d) // m2d_c2d_tdn).astype('B')
gt = ((m2_c2d_tdn + tgn * c2_m2d) // m2d_c2d_tdn).astype('B')
bt = ((m2_c2d_tdn + tbn * c2_m2d) // m2d_c2d_tdn).astype('B')
xt = numpy.column_stack((rt, gt, bt, a))
return self.__class__(rgba=xt.tobytes(), size=self._size)
@classmethod
def load_from_file(cls, filename):
@ -118,6 +174,13 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()'''
return cls(rgba=rgba, size=size)
@classmethod
def load_from_file_pil(cls, filename):
'''Loads image from local file using PIL.'''
img = PIL.Image.open(filename)
img = img.convert('RGBA')
return cls(rgba=img.tobytes(), size=img.size)
@classmethod
def get_from_stream(cls, stream, max_width=MAX_WIDTH, max_height=MAX_HEIGHT):
'''Carefully parse image data from stream.
@ -160,9 +223,8 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()'''
def get_from_vm(cls, vm, src, **kwargs):
'Get image from VM by QUBESRPC (qubes.GetImageRGBA).'
p = vm.run('QUBESRPC qubes.GetImageRGBA dom0', passio_popen=True,
gui=False)
p.stdin.write('{0}\n'.format(src))
p = vm.run_service('qubes.GetImageRGBA')
p.stdin.write('{0}\n'.format(src).encode())
p.stdin.close()
try:
@ -188,16 +250,15 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()'''
'''Master end of image filter: writes untrusted image to stdout and
expects header+RGBA on stdin. This method is invoked from qvm-imgconverter-client.'''
filetype = None
if ':' in filename:
filetype, filename = filename.split(':', 1)[0]
filetype, filename = filename.split(':', 1)
sys.stdout.write('{0}:-\n'.format(filetype))
else:
sys.stdout.write('-\n')
try:
sys.stdout.write(open(filename).read())
except Exception, e:
except Exception as e:
raise Exception('Something went wrong: {0!s}'.format(e))
finally:
sys.stdout.close()
@ -212,112 +273,23 @@ expects header+RGBA on stdin. This method is invoked from qvm-imgconverter-clien
def __ne__(self, other):
return not self.__eq__(other)
def hex_to_float(colour, channels=3, depth=8):
'''Convert hex colour definition to tuple of floats.'''
if depth % 4 != 0:
raise NotImplementedError('depths not divisible by 4 are unsupported')
def hex_to_int(colour, channels=3, depth=1):
'''Convert hex colour definition to tuple of ints.'''
length = channels * depth / 4
step = depth / 4
length = channels * depth * 2
step = depth * 2
# get rid of '#' or '0x' in front of hex values
colour = colour[-length:]
return tuple(int(colour[i:i+step], 0x10) / float(2**depth - 1) for i in range(0, length, step))
return tuple(int(colour[i:i+step], 0x10) for i in range(0, length, step))
def tint(src, dst, colour):
'''Tint image to reflect vm label.
src and dst may specify format, like png:aqq.gif'''
Image.load_from_file(src).tint(colour).save(dst)
def make_padlock(dst, colour, size=ICON_MAXSIZE):
cs = cairo.ImageSurface(cairo.FORMAT_ARGB32, size, size)
cr = cairo.Context(cs)
cr.set_source_rgb(*hex_to_float(colour))
cr.set_line_width(.125 * size)
cr.rectangle(.125 * size, .5 * size, .75 * size, .4375 * size)
cr.fill()
cr.move_to(.25 * size, .5 * size)
cr.line_to(.25 * size, .375 * size)
cr.arc(.5 * size, .375 * size, .25 * size, math.pi, 2 * math.pi)
cr.move_to(.75 * size, .375 * size) # this is unneccessary, but helps readability
cr.line_to(.75 * size, .5 * size)
cr.stroke()
cs.write_to_png(dst)
class TestCaseImage(unittest.TestCase):
def setUp(self):
self.rgba = \
'\x00\x00\x00\xff' '\xff\x00\x00\xff' \
'\x00\xff\x00\xff' '\x00\x00\x00\xff'
self.size = (2, 2)
self.image = Image(rgba=self.rgba, size=self.size)
def test_00_init(self):
self.assertEqual(self.image._rgba, self.rgba)
self.assertEqual(self.image._size, self.size)
def test_01_tint(self):
image = self.image.tint('#0000ff')
self.assertEqual(image._rgba,
'\x00\x00\x00\xff' '\x00\x00\xff\xff'
'\x00\x00\xff\xff' '\x00\x00\x00\xff')
def test_10_get_from_stream(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba))
image = Image.get_from_stream(io)
self.assertEqual(image._rgba, self.rgba)
self.assertEqual(image._size, self.size)
def test_11_get_from_stream_malformed(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba[-1])) # one byte too short
with self.assertRaises(Exception):
image = Image.get_from_stream(io)
def test_12_get_from_stream_too_big(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba)) # 2x2
with self.assertRaises(Exception):
image = Image.get_from_stream(io, max_width=1)
io.seek(0)
with self.assertRaises(Exception):
image = Image.get_from_stream(io, max_height=1)
class TestCaseFunctionsAndConstants(unittest.TestCase):
def test_00_imghdrlen(self):
self.assertEqual(imghdrlen(8, 15), len('8 15\n'))
def test_01_re_imghdr(self):
self.assertTrue(re_imghdr.match('8 15\n'))
self.assertIsNone(re_imghdr.match('8 15'))
self.assertIsNone(re_imghdr.match('815\n'))
self.assertIsNone(re_imghdr.match('x yx\n'))
def test_10_hex_to_float_result_00(self):
self.assertEqual(hex_to_float('#000000'), (0.0, 0.0, 0.0))
def test_11_hex_to_float_result_ff(self):
self.assertEqual(hex_to_float('0xffffff'), (1.0, 1.0, 1.0))
src and dst may NOT specify ImageMagick format'''
def test_12_hex_to_float_depth_3_not_implemented(self):
with self.assertRaises(NotImplementedError):
hex_to_float('123456', depth=3)
Image.load_from_file_pil(src).tint(colour).save_pil(dst)
if __name__ == '__main__':
unittest.main()
# vim: ft=python sw=4 ts=4 et

@ -0,0 +1,90 @@
#!/usr/bin/env python2
'''Qubes Image Generation
Toolkit for generating icons and images for Qubes OS.'''
# The Qubes OS Project, http://www.qubes-os.org
#
# Copyright (C) 2013-2015 Wojtek Porczyk <woju@invisiblethingslab.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from __future__ import absolute_import
__all__ = ['make_padlock']
import math
import cairo
import qubesimgconverter
def polar(r, a):
return r * math.cos(a), r * math.sin(a)
def make_padlock(dst, colour, size=qubesimgconverter.ICON_MAXSIZE, disp=False):
cs = cairo.ImageSurface(cairo.FORMAT_ARGB32, size, size)
cr = cairo.Context(cs)
cr.set_source_rgb(*[c / 256.0
for c in qubesimgconverter.hex_to_int(colour)])
cr.set_line_width(.125 * size)
cr.rectangle(.125 * size, .5 * size, .75 * size, .4375 * size)
cr.fill()
cr.move_to(.25 * size, .5 * size)
cr.line_to(.25 * size, .375 * size)
cr.arc(.5 * size, .375 * size, .25 * size, math.pi, 2 * math.pi)
cr.move_to(.75 * size, .375 * size) # this is unneccessary, but helps readability
cr.line_to(.75 * size, .5 * size)
cr.stroke()
if disp:
# Careful with those. I have run into severe
# floating point errors when adjusting.
arrows = 2
gap = 45 * math.pi / 180
offset = 0
radius = .1875 * size
width = 0.05 * size
cx = .5 * size
# cy = .6875 * size
cy = .625 * size
arrow = 2 * math.pi / arrows
for i in range(arrows):
cr.move_to(cx, cy)
cr.rel_move_to(*polar( radius - width, offset + i * arrow))
cr.arc(cx, cy, radius - width, offset + i * arrow, offset + (i + 1) * arrow - gap)
cr.rel_line_to(*polar( width, offset + (i + 1) * arrow - gap + math.pi))
cr.rel_line_to(*polar( width * math.sqrt(8), offset + (i + 1) * arrow - gap + math.pi / 4))
cr.rel_line_to(*polar( width * math.sqrt(8), offset + (i + 1) * arrow - gap - math.pi / 4))
cr.rel_line_to(*polar( width, offset + (i + 1) * arrow - gap + math.pi))
cr.arc_negative(cx, cy, radius + width, offset + (i + 1) * arrow - gap, offset + i * arrow)
cr.close_path()
cr.set_source_rgb(0xcc / 256.0, 0, 0) # tango's red
cr.set_line_width(.0500 * size)
cr.set_line_join(cairo.LINE_JOIN_ROUND)
cr.stroke_preserve()
cr.set_source_rgb(1.0, 1.0, 1.0)
cr.fill()
cs.write_to_png(dst)
# vim: ft=python sw=4 ts=4 et

@ -0,0 +1,81 @@
#!/usr/bin/env python2
from __future__ import absolute_import
try:
from io import BytesIO
except ImportError:
from cStringIO import StringIO as BytesIO
import unittest
import qubesimgconverter
class TestCaseImage(unittest.TestCase):
def setUp(self):
self.rgba = \
b'\x00\x00\x00\xff' b'\xff\x00\x00\xff' \
b'\x00\xff\x00\xff' b'\x00\x00\x00\xff'
self.size = (2, 2)
self.image = qubesimgconverter.Image(rgba=self.rgba, size=self.size)
def test_00_init(self):
self.assertEqual(self.image._rgba, self.rgba)
self.assertEqual(self.image._size, self.size)
def test_01_tint(self):
image = self.image.tint('#0000ff')
self.assertEqual(image._rgba,
b'\x00\x00\x3f\xff' b'\x00\x00\xff\xff'
b'\x00\x00\xff\xff' b'\x00\x00\x3f\xff')
def test_10_get_from_stream(self):
io = BytesIO('{0[0]} {0[1]}\n'.format(self.size).encode() + self.rgba)
image = qubesimgconverter.Image.get_from_stream(io)
self.assertEqual(image._rgba, self.rgba)
self.assertEqual(image._size, self.size)
def test_11_get_from_stream_malformed(self):
io = BytesIO('{0[0]} {0[1]}\n'.format(self.size).encode() +
self.rgba[:-1]) # one byte too short
with self.assertRaises(Exception):
image = qubesimgconverter.Image.get_from_stream(io)
def test_12_get_from_stream_too_big(self):
io = BytesIO('{0[0]} {0[1]}\n'.format(self.size).encode() + self.rgba) # 2x2
with self.assertRaises(Exception):
image = qubesimgconverter.Image.get_from_stream(io, max_width=1)
io.seek(0)
with self.assertRaises(Exception):
image = qubesimgconverter.Image.get_from_stream(io, max_height=1)
class TestCaseFunctionsAndConstants(unittest.TestCase):
def test_00_imghdrlen(self):
self.assertEqual(qubesimgconverter.imghdrlen(8, 15), len('8 15\n'))
self.assertEqual(qubesimgconverter.imghdrlen(100, 100), len('100 100\n'))
def test_01_re_imghdr(self):
self.assertTrue(qubesimgconverter.re_imghdr.match(b'8 15\n'))
self.assertIsNone(qubesimgconverter.re_imghdr.match(b'8 15'))
self.assertIsNone(qubesimgconverter.re_imghdr.match(b'815\n'))
self.assertIsNone(qubesimgconverter.re_imghdr.match(b'x yx\n'))
def test_10_hex_to_float_result_00(self):
self.assertEqual(qubesimgconverter.hex_to_int('#000000'), (0, 0, 0))
def test_11_hex_to_float_result_ff(self):
self.assertEqual(qubesimgconverter.hex_to_int('0xffffff'),
(0xff, 0xff, 0xff))
def test_12_hex_to_float_depth_3_not_implemented(self):
with self.assertRaises(ValueError):
qubesimgconverter.hex_to_int('123456', depth=3)
if __name__ == '__main__':
unittest.main()

@ -0,0 +1,99 @@
# vim: fileencoding=utf-8
#
# The Qubes OS Project, https://www.qubes-os.org/
#
# Copyright (C) 2017
# Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
import itertools
import qubes.tests.extra
# noinspection PyPep8Naming
class TC_00_ImgConverter(qubes.tests.extra.ExtraTestCase):
def setUp(self):
super(TC_00_ImgConverter, self).setUp()
# noinspection PyAttributeOutsideInit
self.vm = self.create_vms(["vm"])[0]
self.vm.start()
self.image_size = 16
# RGB data for the image
self.image_data = [
(0xff // self.image_size * x, 0x80, 0xff // self.image_size * y,
0xff)
for x in range(self.image_size)
for y in range(self.image_size)]
def create_img(self, filename):
'''Create image file with given sample content
:param filename: output filename
'''
p = self.vm.run(
'convert -size {}x{} -depth 8 rgba:- "{}" 2>&1'.format(
self.image_size, self.image_size, filename),
passio_popen=True)
bytes_data = bytes(bytearray(itertools.chain(*self.image_data)))
(stdout, _) = p.communicate(bytes_data)
if p.returncode != 0:
self.skipTest('failed to create test image: {}'.format(stdout))
def assertCorrectlyTransformed(self, orig_filename, trusted_filename):
self.assertEquals(
self.vm.run('test -r "{}"'.format(trusted_filename), wait=True), 0)
self.assertEquals(
self.vm.run('test -r "{}"'.format(orig_filename), wait=True), 0)
# retrieve original image too, to compensate for compression
p = self.vm.run('convert "{}" rgb:-'.format(orig_filename),
passio_popen=True)
orig_image_data, _ = p.communicate()
p = self.vm.run('convert "{}" rgb:-'.format(trusted_filename),
passio_popen=True)
trusted_image_data, _ = p.communicate()
self.assertEquals(orig_image_data, trusted_image_data)
def test_000_png(self):
self.create_img('test.png')
p = self.vm.run('qvm-convert-img test.png trusted.png 2>&1',
passio_popen=True)
(stdout, _) = p.communicate()
if p.returncode == 127:
self.skipTest('qubes-img-converter not installed')
self.assertEquals(p.returncode, 0, 'qvm-convert-img failed: {}'.format(
stdout))
self.assertCorrectlyTransformed('test.png', 'trusted.png')
def test_010_filename_with_spaces(self):
self.create_img('test with spaces.png')
p = self.vm.run('qvm-convert-img "test with spaces.png" '
'"trusted with spaces.png" 2>&1',
passio_popen=True)
(stdout, _) = p.communicate()
if p.returncode == 127:
self.skipTest('qubes-img-converter not installed')
self.assertEquals(p.returncode, 0, 'qvm-convert-img failed: {}'.format(
stdout))
self.assertCorrectlyTransformed(
'test with spaces.png', 'trusted with spaces.png')
def list_tests():
tests = [TC_00_ImgConverter]
return tests

@ -0,0 +1,19 @@
import setuptools
setuptools.setup(
name='qubesimgconverter',
version=open('../version').read().strip(),
author='Invisible Things Lab',
author_email='woju@invisiblethingslab.com',
description='Toolkit for secure transfer and conversion of images between Qubes VMs.',
license='GPL2+',
url='https://www.qubes-os.org/',
packages=['qubesimgconverter'],
entry_points={
'qubes.tests.extra.for_template':
'qubesimgconverter = qubesimgconverter.test_integ:list_tests',
}
)
# vim: ts=4 sts=4 sw=4 et

@ -1,6 +1,8 @@
install:
install -D local-top/qubes_cow_setup.sh \
$(DESTDIR)/usr/share/initramfs-tools/scripts/local-top/qubes_cow_setup
install -D local-top/scrub_pages.sh \
$(DESTDIR)/usr/share/initramfs-tools/scripts/local-top/scrub_pages
install -D qubes_vm \
$(DESTDIR)/usr/share/initramfs-tools/hooks/qubes_vm

@ -0,0 +1 @@
../../dracut/xen-balloon-scrub-pages/scrub_pages.sh

@ -1,6 +1,6 @@
#!/bin/sh
if grep -q control_d /proc/xen/capabilities; then
if grep -q '^[0-]*$' /sys/hypervisor/uuid; then
echo "Not intended for dom0"
exit 0
fi

@ -1,13 +1,5 @@
ver := $(shell cat ../version)
srcdir := /usr/src/u2mfn-$(ver)
install: install-u2mfn install-scripts
install: install-scripts
install-scripts:
install -d $(DESTDIR)/usr/sbin
install qubes-prepare-vm-kernel $(DESTDIR)/usr/sbin
install-u2mfn:
install -d $(DESTDIR)$(srcdir)
install -m 644 u2mfn/u2mfn.c u2mfn/Makefile $(DESTDIR)$(srcdir)
sed -e 's#@@VERSION@@#$(ver)#' u2mfn/dkms.conf.in > $(DESTDIR)$(srcdir)/dkms.conf

@ -25,23 +25,18 @@ set -e
basedir=/var/lib/qubes/vm-kernels
function recompile_u2mfn() {
kver=$1
u2mfn_ver=`dkms status u2mfn|tail -n 1|cut -f 2 -d ' '|tr -d ':,'`
if ! modinfo -k "$kver" -n u2mfn >/dev/null; then
dkms install u2mfn/$u2mfn_ver -k $kver --no-initrd
fi
}
function build_modules_img() {
kver=$1
output_file=$2
initramfs=$2
output_file=$3
mkdir /tmp/qubes-modules-$kver
truncate -s 400M /tmp/qubes-modules-$kver.img
mkfs -t ext3 -F /tmp/qubes-modules-$kver.img > /dev/null
mount /tmp/qubes-modules-$kver.img /tmp/qubes-modules-$kver -o loop
cp -a -t /tmp/qubes-modules-$kver /lib/modules/$kver
cp "/boot/vmlinuz-$kver" "/tmp/qubes-modules-$kver/vmlinuz"
cp "$initramfs" "/tmp/qubes-modules-$kver/initramfs"
umount /tmp/qubes-modules-$kver
rmdir /tmp/qubes-modules-$kver
mv /tmp/qubes-modules-$kver.img $output_file
@ -78,13 +73,12 @@ fi
echo "--> Building files for $kernel_version in $output_dir"
echo "---> Recompiling kernel module (u2mfn)"
recompile_u2mfn "$kernel_version"
mkdir -p "$output_dir"
cp "/boot/vmlinuz-$kernel_version" "$output_dir/vmlinuz"
echo "---> Generating modules.img"
build_modules_img "$kernel_version" "$output_dir/modules.img"
echo "---> Generating initramfs"
build_initramfs "$kernel_version" "$output_dir/initramfs"
echo "---> Generating modules.img"
build_modules_img "$kernel_version" "$output_dir/initramfs" \
"$output_dir/modules.img"
echo "--> Done."

@ -1,28 +0,0 @@
#
# The Qubes OS Project, http://www.qubes-os.org
#
# Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
#
obj-m += u2mfn.o
clean:
rm -f *.o *.ko *~
rm -f .u2mfn.* *.mod.c Module.symvers modules.order
rm -fr .tmp_versions
rm -f Makefile.xen

@ -1,8 +0,0 @@
PACKAGE_VERSION="@@VERSION@@"
# Items below here should not have to change with each driver version
PACKAGE_NAME="u2mfn"
BUILT_MODULE_NAME[0]="u2mfn"
DEST_MODULE_LOCATION[0]="/extra/"
AUTOINSTALL=yes

@ -1,179 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <linux/module.h>
#include <linux/version.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/sched.h>
#ifndef FOREIGN_FRAME_BIT
#include <xen/page.h>
#endif
#include <linux/highmem.h>
/* copy of /usr/include/u2mfn-kernel.h, to reduce requirements */
#include <linux/ioctl.h>
#define U2MFN_MAGIC 0xf5
#define U2MFN_GET_MFN_FOR_PAGE _IOW(U2MFN_MAGIC, 1, int)
#define U2MFN_GET_LAST_MFN _IO(U2MFN_MAGIC, 2)
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
static inline unsigned long virt_to_phys(volatile void *address)
{
return __pa((unsigned long) address);
}
#endif
#ifdef virt_to_mfn
#define VIRT_TO_MFN virt_to_mfn
#else
extern unsigned long *phys_to_machine_mapping;
static inline unsigned long VIRT_TO_MFN(void *addr)
{
return phys_to_machine_mapping[virt_to_phys(addr) >> PAGE_SHIFT] & ~FOREIGN_FRAME_BIT;
}
#endif
/// User virtual address to mfn translator
/**
\param cmd ignored
\param data the user-specified address
\return mfn corresponding to "data" argument, or -1 on error
*/
static long u2mfn_ioctl(struct file *f, unsigned int cmd,
unsigned long data)
{
struct page *user_page;
void *kaddr;
long ret;
if (_IOC_TYPE(cmd) != U2MFN_MAGIC) {
printk("Qubes u2mfn: wrong IOCTL magic");
return -ENOTTY;
}
switch (cmd) {
case U2MFN_GET_MFN_FOR_PAGE:
down_read(&current->mm->mmap_sem);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
ret = get_user_pages
(data, 1, (FOLL_WRITE | FOLL_FORCE), &user_page, 0);
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
ret = get_user_pages
(data, 1, 1, 0, &user_page, 0);
#else
ret = get_user_pages
(current, current->mm, data, 1, 1, 0, &user_page, 0);
#endif
up_read(&current->mm->mmap_sem);
if (ret != 1) {
printk("U2MFN_GET_MFN_FOR_PAGE: get_user_pages failed, ret=0x%lx\n", ret);
return -1;
}
kaddr = kmap(user_page);
ret = VIRT_TO_MFN(kaddr);
kunmap(user_page);
put_page(user_page);
break;
case U2MFN_GET_LAST_MFN:
if (f->private_data)
ret = VIRT_TO_MFN(f->private_data);
else
ret = 0;
break;
default:
printk("Qubes u2mfn: wrong ioctl passed!\n");
return -ENOTTY;
}
return ret;
}
static int u2mfn_mmap(struct file *f, struct vm_area_struct *vma)
{
int ret;
char *kbuf;
long length = vma->vm_end - vma->vm_start;
printk("u2mfn_mmap: entering, private=%p\n", f->private_data);
if (f->private_data)
return -EBUSY;
if (length != PAGE_SIZE)
return -EINVAL;
kbuf = (char *) __get_free_page(GFP_KERNEL);
if (!kbuf)
return -ENOMEM;
f->private_data = kbuf;
ret = remap_pfn_range(vma, vma->vm_start,
virt_to_phys(kbuf) >> PAGE_SHIFT,
length, vma->vm_page_prot);
printk("u2mfn_mmap: calling remap return %d\n", ret);
if (ret)
return ret;
return 0;
}
static int u2mfn_release(struct inode *i, struct file *f)
{
printk("u2mfn_release, priv=%p\n", f->private_data);
if (f->private_data)
__free_page(f->private_data);
f->private_data = NULL;
return 0;
}
static struct file_operations u2mfn_fops = {
.unlocked_ioctl = u2mfn_ioctl,
.mmap = u2mfn_mmap,
.release = u2mfn_release
};
/// u2mfn module registration
/**
tries to register "/proc/u2mfn" pseudofile
*/
static int u2mfn_init(void)
{
struct proc_dir_entry *u2mfn_node =
proc_create_data("u2mfn", 0666, NULL,
&u2mfn_fops, 0);
if (!u2mfn_node)
return -1;
return 0;
}
static void u2mfn_exit(void)
{
remove_proc_entry("u2mfn", 0);
}
module_init(u2mfn_init);
module_exit(u2mfn_exit);
MODULE_LICENSE("GPL");

@ -78,10 +78,7 @@ const char *parse(const char *meminfo_buf, const char* dom_current_buf)
|| (used_mem > prev_used_mem && used_mem / 10 > (MemTotal+12) / 13
&& used_mem_diff > used_mem_change_threshold/2)) {
prev_used_mem = used_mem;
sprintf(outbuf,
"MemTotal: %lld kB\nMemFree: %lld kB\nBuffers: %lld kB\nCached: %lld kB\n"
"SwapTotal: %lld kB\nSwapFree: %lld kB\n", MemTotal,
MemFree, Buffers, Cached, SwapTotal, SwapFree);
sprintf(outbuf, "%lld", used_mem);
return outbuf;
}
return NULL;

@ -1,5 +1,6 @@
[Unit]
Description=Qubes memory information reporter
Before=systemd-user-sessions.service
After=qubes-core.service qubes-qmemman.service
ConditionPathExists=/var/run/qubes/qmemman.sock

@ -1,19 +1,9 @@
CC=gcc
CFLAGS+=-I. -g -O2 -Wall -Wextra -Werror -pie -fPIC `pkg-config --cflags vchan-$(BACKEND_VMM)`
COMMONIOALL=ioall.o
CFLAGS+=-I. -g -O2 -Wall -Wextra -Werror -pie -fPIC
SO_VER=2
LDFLAGS+=-shared
VCHANLIBS = `pkg-config --libs vchan-$(BACKEND_VMM)`
_XENSTORE_H=$(shell ls /usr/include/xenstore.h)
ifneq "$(_XENSTORE_H)" ""
CFLAGS+= -DUSE_XENSTORE_H
endif
all: libqrexec-utils.so.$(SO_VER) libqubes-rpc-filecopy.so.$(SO_VER)
libqrexec-utils.so.$(SO_VER): unix-server.o ioall.o buffer.o exec.o txrx-vchan.o write-stdin.o
$(CC) $(LDFLAGS) -Wl,-soname,$@ -o $@ $^ $(VCHANLIBS)
all: libqubes-rpc-filecopy.so.$(SO_VER)
libqubes-rpc-filecopy.so.$(SO_VER): ioall.o copy-file.o crc32.o unpack.o pack.o
$(CC) $(LDFLAGS) -Wl,-soname,$@ -o $@ $^
@ -24,12 +14,7 @@ clean:
install:
mkdir -p $(DESTDIR)$(LIBDIR)
cp libqrexec-utils.so.$(SO_VER) $(DESTDIR)$(LIBDIR)
ln -s libqrexec-utils.so.$(SO_VER) $(DESTDIR)$(LIBDIR)/libqrexec-utils.so
cp libqubes-rpc-filecopy.so.$(SO_VER) $(DESTDIR)$(LIBDIR)
ln -s libqubes-rpc-filecopy.so.$(SO_VER) $(DESTDIR)$(LIBDIR)/libqubes-rpc-filecopy.so
mkdir -p $(DESTDIR)$(INCLUDEDIR)
cp libqrexec-utils.h $(DESTDIR)$(INCLUDEDIR)
cp libqubes-rpc-filecopy.h $(DESTDIR)$(INCLUDEDIR)
cp qrexec.h $(DESTDIR)$(INCLUDEDIR)

@ -1,115 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libqrexec-utils.h"
#define BUFFER_LIMIT 50000000
static int total_mem;
static char *limited_malloc(int len)
{
char *ret;
total_mem += len;
if (total_mem > BUFFER_LIMIT) {
fprintf(stderr, "attempt to allocate >BUFFER_LIMIT\n");
exit(1);
}
ret = malloc(len);
if (!ret) {
perror("malloc");
exit(1);
}
return ret;
}
static void limited_free(char *ptr, int len)
{
free(ptr);
total_mem -= len;
}
void buffer_init(struct buffer *b)
{
b->buflen = 0;
b->data = NULL;
}
void buffer_free(struct buffer *b)
{
if (b->buflen)
limited_free(b->data, b->buflen);
buffer_init(b);
}
/*
The following two functions can be made much more efficient.
Yet the profiling output show they are not significant CPU hogs, so
we keep them so simple to make them obviously correct.
*/
void buffer_append(struct buffer *b, const char *data, int len)
{
int newsize;
char *qdata;
if (len < 0 || len > BUFFER_LIMIT) {
fprintf(stderr, "buffer_append %d\n", len);
exit(1);
}
if (len == 0)
return;
newsize = len + b->buflen;
qdata = limited_malloc(len + b->buflen);
memcpy(qdata, b->data, b->buflen);
memcpy(qdata + b->buflen, data, len);
buffer_free(b);
b->buflen = newsize;
b->data = qdata;
}
void buffer_remove(struct buffer *b, int len)
{
int newsize;
char *qdata = NULL;
if (len < 0 || len > b->buflen) {
fprintf(stderr, "buffer_remove %d/%d\n", len, b->buflen);
exit(1);
}
newsize = b->buflen - len;
if (newsize > 0) {
qdata = limited_malloc(newsize);
memcpy(qdata, b->data + len, newsize);
}
buffer_free(b);
b->buflen = newsize;
b->data = qdata;
}
int buffer_len(struct buffer *b)
{
return b->buflen;
}
void *buffer_data(struct buffer *b)
{
return b->data;
}

@ -1,5 +1,5 @@
#include <unistd.h>
#include <ioall.h>
#include "ioall.h"
#include "libqubes-rpc-filecopy.h"
#include "crc32.h"

@ -1,83 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include "libqrexec-utils.h"
static do_exec_t *exec_func = NULL;
void register_exec_func(do_exec_t *func) {
exec_func = func;
}
void fix_fds(int fdin, int fdout, int fderr)
{
int i;
for (i = 0; i < 256; i++)
if (i != fdin && i != fdout && i != fderr)
close(i);
dup2(fdin, 0);
dup2(fdout, 1);
dup2(fderr, 2);
close(fdin);
close(fdout);
if (fderr != 2)
close(fderr);
}
void do_fork_exec(const char *cmdline, int *pid, int *stdin_fd, int *stdout_fd,
int *stderr_fd)
{
int inpipe[2], outpipe[2], errpipe[2];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, inpipe) ||
socketpair(AF_UNIX, SOCK_STREAM, 0, outpipe) ||
(stderr_fd && socketpair(AF_UNIX, SOCK_STREAM, 0, errpipe))) {
perror("socketpair");
exit(1);
}
switch (*pid = fork()) {
case -1:
perror("fork");
exit(-1);
case 0:
if (stderr_fd) {
fix_fds(inpipe[0], outpipe[1], errpipe[1]);
} else
fix_fds(inpipe[0], outpipe[1], 2);
if (exec_func != NULL)
exec_func(cmdline);
exit(-1);
default:;
}
close(inpipe[0]);
close(outpipe[1]);
*stdin_fd = inpipe[1];
*stdout_fd = outpipe[0];
if (stderr_fd) {
close(errpipe[1]);
*stderr_fd = errpipe[0];
}
}

@ -1,64 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
* Copyright (C) 2013 Marek Marczykowski <marmarek@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <sys/select.h>
#include <libvchan.h>
struct buffer {
char *data;
int buflen;
};
/* return codes for buffered writes */
#define WRITE_STDIN_OK 0 /* all written */
#define WRITE_STDIN_BUFFERED 1 /* something still in the buffer */
#define WRITE_STDIN_ERROR 2 /* write error, errno set */
typedef void (do_exec_t)(const char *);
void register_exec_func(do_exec_t *func);
void buffer_init(struct buffer *b);
void buffer_free(struct buffer *b);
void buffer_append(struct buffer *b, const char *data, int len);
void buffer_remove(struct buffer *b, int len);
int buffer_len(struct buffer *b);
void *buffer_data(struct buffer *b);
int flush_client_data(int fd, struct buffer *buffer);
int write_stdin(int fd, const char *data, int len, struct buffer *buffer);
int fork_and_flush_stdin(int fd, struct buffer *buffer);
void do_fork_exec(const char *cmdline, int *pid, int *stdin_fd, int *stdout_fd,
int *stderr_fd);
void wait_for_vchan_or_argfd(libvchan_t *vchan, int max, fd_set * rdset, fd_set * wrset);
int read_vchan_all(libvchan_t *vchan, void *data, size_t size);
int write_vchan_all(libvchan_t *vchan, const void *data, size_t size);
int read_all(int fd, void *buf, int size);
int write_all(int fd, const void *buf, int size);
void fix_fds(int fdin, int fdout, int fderr);
void set_nonblock(int fd);
void set_block(int fd);
int get_server_socket(const char *);
int do_accept(int s);
void set_nonblock(int fd);

@ -35,13 +35,13 @@
#include <sys/types.h>
struct file_header {
unsigned int namelen;
unsigned int mode;
unsigned long long filelen;
unsigned int atime;
unsigned int atime_nsec;
unsigned int mtime;
unsigned int mtime_nsec;
uint32_t namelen;
uint32_t mode;
uint64_t filelen;
uint32_t atime;
uint32_t atime_nsec;
uint32_t mtime;
uint32_t mtime_nsec;
};
struct result_header {

@ -89,7 +89,7 @@ void wait_for_result(void)
if (hdr.error_code != 0) {
switch (hdr.error_code) {
case EEXIST:
call_error_handler("File copy: not overwriting existing file. Clean QubesIncoming dir, and retry copy%s%s", last_filename_prefix, last_filename);
call_error_handler("A file named %s already exists in QubesIncoming dir", last_filename);
break;
case EINVAL:
call_error_handler("File copy: Corrupted data from packer%s%s", last_filename_prefix, last_filename);
@ -100,7 +100,7 @@ void wait_for_result(void)
* desynchronized in this case */
return;
}
/* fall though */
/* fallthrough */
default:
call_error_handler("File copy: %s%s%s",
strerror(hdr.error_code), last_filename_prefix, last_filename);

@ -1,122 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
/* See also http://wiki.qubes-os.org/trac/wiki/Qrexec */
#include <stdint.h>
#define QREXEC_PROTOCOL_VERSION 2
#define MAX_FDS 256
#define MAX_DATA_CHUNK 4096
#define RPC_REQUEST_COMMAND "QUBESRPC"
#define RPC_REQUEST_COMMAND_LEN (sizeof(RPC_REQUEST_COMMAND)-1)
#define NOGUI_CMD_PREFIX "nogui:"
#define NOGUI_CMD_PREFIX_LEN (sizeof(NOGUI_CMD_PREFIX)-1)
#define VCHAN_BASE_PORT 512
#define MAX_DATA_CHUNK 4096
/* Messages sent over control vchan between daemon(dom0) and agent(vm).
* The same are used between client(dom0) and daemon(dom0).
*/
enum {
/* daemon->agent messages */
/* start process in VM and pass its stdin/out/err to dom0
* struct exec_params passed as data */
MSG_EXEC_CMDLINE = 0x200,
/* start process in VM discarding its stdin/out/err (connect to /dev/null)
* struct exec_params passed as data */
MSG_JUST_EXEC,
/* connect to existing process in VM to receive its stdin/out/err
* struct service_params passed as cmdline field in exec_params */
MSG_SERVICE_CONNECT,
/* refuse to start a service (denied by policy, invalid parameters etc)
* struct service_params passed as data to identify which service call was
* refused */
MSG_SERVICE_REFUSED,
/* agent->daemon messages */
/* call Qubes RPC service
* struct trigger_service_params passed as data */
MSG_TRIGGER_SERVICE = 0x210,
/* connection was terminated, struct exec_params passed as data (with empty
* cmdline field) informs about released vchan port */
MSG_CONNECTION_TERMINATED,
/* common messages */
/* initialize connection, struct peer_info passed as data
* should be sent as the first message (server first, then client) */
MSG_HELLO = 0x300,
};
/* uniform for all peers, data type depends on message type */
struct msg_header {
uint32_t type; /* message type */
uint32_t len; /* data length */
};
/* variable size */
struct exec_params {
uint32_t connect_domain; /* target domain name */
uint32_t connect_port; /* target vchan port for i/o exchange */
char cmdline[0]; /* command line to execute, null terminated, size = msg_header.len - sizeof(struct exec_params) */
};
struct service_params {
char ident[32]; /* null terminated ASCII string */
};
struct trigger_service_params {
char service_name[64]; /* null terminated ASCII string */
char target_domain[32]; /* null terminated ASCII string */
struct service_params request_id; /* service request id */
};
struct peer_info {
uint32_t version; /* qrexec protocol version */
};
/* data vchan client<->agent, separate for each VM process */
enum {
/* stdin dom0->VM */
MSG_DATA_STDIN = 0x190,
/* stdout VM->dom0 */
MSG_DATA_STDOUT,
/* stderr VM->dom0 */
MSG_DATA_STDERR,
/* VM process exit code VM->dom0 (uint32_t) */
MSG_DATA_EXIT_CODE,
};
// linux-specific stuff below
#define QREXEC_AGENT_TRIGGER_PATH "/var/run/qubes/qrexec-agent"
#define QREXEC_AGENT_FDPASS_PATH "/var/run/qubes/qrexec-agent-fdpass"
#define MEMINFO_WRITER_PIDFILE "/var/run/meminfo-writer.pid"
#define QUBES_RPC_MULTIPLEXER_PATH "/usr/lib/qubes/qubes-rpc-multiplexer"
#define QREXEC_DAEMON_SOCKET_DIR "/var/run/qubes"

@ -1,104 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <libvchan.h>
int wait_for_vchan_or_argfd_once(libvchan_t *ctrl, int max, fd_set * rdset, fd_set * wrset)
{
int vfd, ret;
struct timespec tv = { 1, 100000000 };
sigset_t empty_set;
sigemptyset(&empty_set);
vfd = libvchan_fd_for_select(ctrl);
FD_SET(vfd, rdset);
if (vfd > max)
max = vfd;
max++;
ret = pselect(max, rdset, wrset, NULL, &tv, &empty_set);
if (ret < 0) {
if (errno != EINTR) {
perror("select");
exit(1);
} else {
FD_ZERO(rdset);
FD_ZERO(wrset);
fprintf(stderr, "eintr\n");
return 1;
}
}
if (!libvchan_is_open(ctrl)) {
fprintf(stderr, "libvchan_is_eof\n");
exit(0);
}
if (FD_ISSET(vfd, rdset))
// the following will never block; we need to do this to
// clear libvchan_fd pending state
libvchan_wait(ctrl);
if (libvchan_data_ready(ctrl))
return 1;
return ret;
}
void wait_for_vchan_or_argfd(libvchan_t *ctrl, int max, fd_set * rdset, fd_set * wrset)
{
fd_set r = *rdset, w = *wrset;
do {
*rdset = r;
*wrset = w;
}
while (wait_for_vchan_or_argfd_once(ctrl, max, rdset, wrset) == 0);
}
int write_vchan_all(libvchan_t *vchan, const void *data, size_t size) {
size_t pos;
int ret;
pos = 0;
while (pos < size) {
ret = libvchan_write(vchan, data+pos, size-pos);
if (ret < 0)
return 0;
pos += ret;
}
return 1;
}
int read_vchan_all(libvchan_t *vchan, void *data, size_t size) {
size_t pos;
int ret;
pos = 0;
while (pos < size) {
ret = libvchan_read(vchan, data+pos, size-pos);
if (ret < 0)
return 0;
pos += ret;
}
return 1;
}

@ -1,73 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
//#include "qrexec.h"
int get_server_socket(const char *socket_address)
{
struct sockaddr_un sockname;
int s;
unlink(socket_address);
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
printf("socket() failed\n");
exit(1);
}
memset(&sockname, 0, sizeof(sockname));
sockname.sun_family = AF_UNIX;
strncpy(sockname.sun_path, socket_address, sizeof sockname.sun_path);
sockname.sun_path[sizeof sockname.sun_path - 1] = 0;
if (bind(s, (struct sockaddr *) &sockname, sizeof(sockname)) == -1) {
printf("bind() failed\n");
close(s);
exit(1);
}
// chmod(sockname.sun_path, 0666);
if (listen(s, 5) == -1) {
perror("listen() failed\n");
close(s);
exit(1);
}
return s;
}
int do_accept(int s)
{
struct sockaddr_un peer;
unsigned int addrlen;
int fd;
addrlen = sizeof(peer);
fd = accept(s, (struct sockaddr *) &peer, &addrlen);
if (fd == -1) {
perror("unix accept");
exit(1);
}
return fd;
}

@ -1,6 +1,5 @@
#define _GNU_SOURCE /* For O_NOFOLLOW. */
#include <errno.h>
#include <ioall.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/stat.h>
@ -10,6 +9,7 @@
#include <stdio.h>
#include <limits.h>
#include "libqubes-rpc-filecopy.h"
#include "ioall.h"
#include "crc32.h"
char untrusted_namebuf[MAX_PATH_LENGTH];
@ -33,10 +33,6 @@ void send_status_and_crc(int code, const char *last_filename);
#define O_TMPFILE_MASK (__O_TMPFILE | O_DIRECTORY | O_CREAT)
#endif
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 14)
#define HAVE_SYNCFS
#endif
void do_exit(int code, const char *last_filename)
{
close(0);
@ -77,6 +73,7 @@ void send_status_and_crc(int code, const char *last_filename) {
saved_errno = errno;
hdr.error_code = code;
hdr._pad = 0;
hdr.crc32 = crc32_sum;
if (!write_all(1, &hdr, sizeof(hdr)))
perror("write status");
@ -212,10 +209,8 @@ void process_one_file(struct file_header *untrusted_hdr)
int do_unpack(void)
{
struct file_header untrusted_hdr;
#ifdef HAVE_SYNCFS
int cwd_fd;
int saved_errno;
#endif
total_bytes = total_files = 0;
/* initialize checksum */
@ -232,12 +227,10 @@ int do_unpack(void)
process_one_file(&untrusted_hdr);
}
#ifdef HAVE_SYNCFS
saved_errno = errno;
cwd_fd = open(".", O_RDONLY);
if (cwd_fd >= 0 && syncfs(cwd_fd) == 0 && close(cwd_fd) == 0)
errno = saved_errno;
#endif
send_status_and_crc(errno, untrusted_namebuf);
return errno;

@ -1,119 +0,0 @@
/*
* The Qubes OS Project, http://www.qubes-os.org
*
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <libvchan.h>
#include "qrexec.h"
#include "libqrexec-utils.h"
/*
There is buffered data in "buffer" for client and select()
reports that "fd" is writable. Write as much as possible to fd.
*/
int flush_client_data(int fd, struct buffer *buffer)
{
int ret;
int len;
for (;;) {
len = buffer_len(buffer);
if (!len) {
return WRITE_STDIN_OK;
}
if (len > MAX_DATA_CHUNK)
len = MAX_DATA_CHUNK;
ret = write(fd, buffer_data(buffer), len);
if (ret == -1) {
if (errno != EAGAIN) {
return WRITE_STDIN_ERROR;
} else
return WRITE_STDIN_BUFFERED;
}
// we previously called buffer_remove(buffer, len)
// it will be wrong if we change MAX_DATA_CHUNK to something large
// as pipes writes are atomic only to PIPE_MAX limit
buffer_remove(buffer, ret);
}
}
/*
* Write "len" bytes from "data" to "fd". If not all written, buffer the rest
* to "buffer".
*/
int write_stdin(int fd, const char *data, int len, struct buffer *buffer)
{
int ret;
int written = 0;
if (buffer_len(buffer)) {
buffer_append(buffer, data, len);
return WRITE_STDIN_BUFFERED;
}
while (written < len) {
ret = write(fd, data + written, len - written);
if (ret == 0) {
perror("write_stdin: write returns 0 ???");
exit(1);
}
if (ret == -1) {
if (errno != EAGAIN)
return WRITE_STDIN_ERROR;
buffer_append(buffer, data + written,
len - written);
return WRITE_STDIN_BUFFERED;
}
written += ret;
}
return WRITE_STDIN_OK;
}
/*
* Data feed process has exited, so we need to clear all control structures for
* the client. However, if we have buffered data for the client (which is rare btw),
* fire&forget a separate process to flush them.
*/
int fork_and_flush_stdin(int fd, struct buffer *buffer)
{
int i;
if (!buffer_len(buffer))
return 0;
switch (fork()) {
case -1:
perror("fork");
exit(1);
case 0:
break;
default:
return 1;
}
for (i = 0; i < MAX_FDS; i++)
if (i != fd && i != 2)
close(i);
set_block(fd);
write_all(fd, buffer_data(buffer), buffer_len(buffer));
_exit(0);
}

@ -19,16 +19,11 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
%{!?version: %define version %(cat version)}
# Package contains /usr/lib, but not binary files, which confuses find-debuginfo.sh script.
%global debug_package %{nil}
Name: qubes-kernel-vm-support
Version: %{version}
Version: @VERSION@
Release: 1%{?dist}
Summary: Qubes VM kernel and initramfs modules
Summary: Qubes VM initramfs modules
Source0: qubes-utils-%{version}.tar.gz
Group: Qubes
Vendor: Invisible Things Lab
@ -36,10 +31,6 @@ License: GPL v2 only
URL: http://www.qubes-os.org
Requires: dracut
Requires: dkms
Requires: busybox
%define _builddir %(pwd)
%description
This package contains:
@ -47,17 +38,8 @@ This package contains:
needed in VM only when the VM uses its own kernel (via pvgrub or so). Otherwise
initrd is provided by dom0.
2. u2mfn kernel module sources (dkms) required by GUI agent and R2 version of
libvchan library.
%prep
# we operate on the current directory, so no need to unpack anything
# symlink is to generate useful debuginfo packages
rm -f %{name}-%{version}
ln -sf . %{name}-%{version}
%setup -T -D
%build
%setup -q -n qubes-utils-%{version}
%install
make install-fedora-kernel-support DESTDIR=%{buildroot}
@ -66,14 +48,40 @@ make install-fedora-kernel-support DESTDIR=%{buildroot}
/usr/lib/dracut/modules.d/90qubes-vm
/usr/lib/dracut/modules.d/90qubes-vm-modules
/usr/lib/dracut/modules.d/90qubes-vm-simple
/usr/src/u2mfn-%{version}/
/usr/lib/dracut/modules.d/80xen-scrub-pages
/usr/sbin/qubes-prepare-vm-kernel
%config(noreplace) /etc/default/grub.qubes-kernel-vm-support
%post
dkms add -m u2mfn -v %{version} --rpm_safe_upgrade
%triggerin -- grub2-tools
if ! grep -q '/etc/default/grub.qubes-kernel-vm-support$' /etc/default/grub 2>/dev/null; then
# do not keep Qubes-related settings directly in user-controlled config,
# include another file
echo '. /etc/default/grub.qubes-kernel-vm-support' >> /etc/default/grub
fi
%preun
dkms remove -m u2mfn -v %{version} --all --rpm_safe_upgrade
if [ $1 -eq 0 ]; then
if grep -q '/etc/default/grub.qubes-kernel-vm-support$' /etc/default/grub 2>/dev/null; then
sed -i -e '/grub.qubes-kernel-vm-support$/d' /etc/default/grub
fi
fi
%posttrans
# Rebuild all initramfs images to include updated modules
if [ -r /usr/share/qubes/marker-vm ] && [ -x /usr/bin/dracut ]; then
ret=0
for img in /boot/initramfs-*.img; do
kver="${img#*initramfs-}"
kver="${kver%.img}"
dracut -f "$img" "$kver" || ret=$?
done
if [ "$ret" -eq 0 ]; then
# "milestone" initramfs update version:
# 1 - addition of xen scrub_pages enabling code
echo 1 > /var/lib/qubes/initramfs-updated
fi
fi
%changelog
@CHANGELOG@

@ -1,100 +0,0 @@
%define version %(cat version)
%if 0%{?qubes_builder}
%define _builddir %(pwd)
%endif
%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
Name: qubes-utils
Version: %{version}
Release: 1%{?dist}
Summary: Common Linux files for Qubes Dom0 and VM
Group: Qubes
License: GPL
URL: http://www.qubes-os.org
Requires: udev
Requires: %{name}-libs
Requires: ImageMagick
Requires: pycairo
BuildRequires: qubes-libvchan-devel
%description
Common Linux files for Qubes Dom0 and VM
%package devel
Summary: Development headers for qubes-utils
Release: 1%{?dist}
Requires: %{name}-libs
%description devel
Development header and files for qubes-utils
%package libs
Summary: Qubes utils libraries
Release: 1%{?dist}
%description libs
Libraries for qubes-utils
%prep
# we operate on the current directory, so no need to unpack anything
# symlink is to generate useful debuginfo packages
rm -f %{name}-%{version}
ln -sf . %{name}-%{version}
%setup -T -D
%build
make all
%install
make install DESTDIR=%{buildroot}
%post
# dom0
/bin/systemctl enable qubes-meminfo-writer-dom0.service > /dev/null 2>&1
# VM
/bin/systemctl enable qubes-meminfo-writer.service > /dev/null 2>&1
%postun
if [ $1 -eq 0 ]; then
/bin/systemctl disable qubes-meminfo-writer.service > /dev/null 2>&1
/bin/systemctl disable qubes-meminfo-writer.service > /dev/null 2>&1
fi
%post libs -p /sbin/ldconfig
%postun libs -p /sbin/ldconfig
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
/lib/udev/rules.d/99-qubes-*.rules
/usr/lib/qubes/udev-*
%{_sbindir}/meminfo-writer
%{_unitdir}/qubes-meminfo-writer.service
%{_unitdir}/qubes-meminfo-writer-dom0.service
%{python_sitearch}/qubes/__init__.py
%{python_sitearch}/qubes/__init__.pyc
%{python_sitearch}/qubes/__init__.pyo
%attr(0755,root,root) %{python_sitearch}/qubes/imgconverter.py
%{python_sitearch}/qubes/imgconverter.pyc
%{python_sitearch}/qubes/imgconverter.pyo
%files libs
%{_libdir}/libqrexec-utils.so.2
%{_libdir}/libqubes-rpc-filecopy.so.2
%files devel
%defattr(-,root,root,-)
/usr/include/libqrexec-utils.h
/usr/include/libqubes-rpc-filecopy.h
/usr/include/qrexec.h
%{_libdir}/libqrexec-utils.so
%{_libdir}/libqubes-rpc-filecopy.so
%changelog

@ -0,0 +1,132 @@
Name: qubes-utils
Version: @VERSION@
Release: 1%{?dist}
Summary: Common Linux files for Qubes Dom0 and VM
Source0: %{name}-%{version}.tar.gz
Group: Qubes
License: GPL
URL: http://www.qubes-os.org
Requires: udev
Requires: %{name}-libs
Requires: ImageMagick
Requires: python%{python3_pkgversion}-qubesimgconverter
%{?systemd_requires}
BuildRequires: systemd
BuildRequires: python2-setuptools
BuildRequires: python%{python3_pkgversion}-setuptools
BuildRequires: python2-rpm-macros
BuildRequires: python3-rpm-macros
# for meminfo-writer
BuildRequires: xen-devel
BuildRequires: gcc
%description
Common Linux files for Qubes Dom0 and VM
%package -n python2-qubesimgconverter
Summary: Python package qubesimgconverter
Requires: python2
Requires: pycairo
%if 0%{?rhel} >= 7
Requires: python-pillow
Requires: numpy
%else
Requires: python2-pillow
Requires: python2-numpy
%endif
%description -n python2-qubesimgconverter
Python package qubesimgconverter
%package -n python%{python3_pkgversion}-qubesimgconverter
Summary: Python package qubesimgconverter
Requires: python%{python3_pkgversion}
Requires: python%{python3_pkgversion}-cairo
Requires: python%{python3_pkgversion}-pillow
Requires: python%{python3_pkgversion}-numpy
%description -n python%{python3_pkgversion}-qubesimgconverter
Python package qubesimgconverter
%package devel
Summary: Development headers for qubes-utils
Release: 1%{?dist}
Requires: %{name}-libs
%description devel
Development header and files for qubes-utils
%package libs
Summary: Qubes utils libraries
Release: 1%{?dist}
%description libs
Libraries for qubes-utils
%prep
%setup -q
%build
export PYTHON=%{__python2}
make all BACKEND_VMM=@BACKEND_VMM@
%install
make install DESTDIR=%{buildroot} PYTHON=%{__python2}
rm -rf imgconverter/build
%make_install -C imgconverter PYTHON=%{__python3}
%post
# dom0
%systemd_post qubes-meminfo-writer-dom0.service
# VM
%systemd_post qubes-meminfo-writer.service
%preun
%systemd_preun qubes-meminfo-writer-dom0.service
%systemd_preun qubes-meminfo-writer.service
%postun
%systemd_postun_with_restart qubes-meminfo-writer-dom0.service
%systemd_postun_with_restart qubes-meminfo-writer.service
%post libs -p /sbin/ldconfig
%postun libs -p /sbin/ldconfig
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
/lib/udev/rules.d/*-qubes-*.rules
/usr/lib/qubes/udev-*
%{_sbindir}/meminfo-writer
%{_unitdir}/qubes-meminfo-writer.service
%{_unitdir}/qubes-meminfo-writer-dom0.service
%files -n python2-qubesimgconverter
%{python2_sitelib}/qubesimgconverter/__init__.py*
%{python2_sitelib}/qubesimgconverter/imggen.py*
%{python2_sitelib}/qubesimgconverter/test.py*
%{python2_sitelib}/qubesimgconverter/test_integ.py*
%{python2_sitelib}/qubesimgconverter-%{version}-py?.?.egg-info
%files -n python%{python3_pkgversion}-qubesimgconverter
%{python3_sitelib}/qubesimgconverter/__init__.py
%{python3_sitelib}/qubesimgconverter/imggen.py
%{python3_sitelib}/qubesimgconverter/test.py
%{python3_sitelib}/qubesimgconverter/test_integ.py
%{python3_sitelib}/qubesimgconverter-%{version}-py?.?.egg-info
%{python3_sitelib}/qubesimgconverter/__pycache__
%files libs
%{_libdir}/libqubes-rpc-filecopy.so.2
%files devel
%defattr(-,root,root,-)
/usr/include/libqubes-rpc-filecopy.h
%{_libdir}/libqubes-rpc-filecopy.so
%changelog
@CHANGELOG@

@ -5,10 +5,10 @@ install:
cp udev-qubes-block.rules $(DESTDIR)$(SYSLIBDIR)/udev/rules.d/99-qubes-block.rules
cp udev-qubes-usb.rules $(DESTDIR)$(SYSLIBDIR)/udev/rules.d/99-qubes-usb.rules
cp udev-qubes-misc.rules $(DESTDIR)$(SYSLIBDIR)/udev/rules.d/99-qubes-misc.rules
cp udev-qubes-dmroot.rules $(DESTDIR)$(SYSLIBDIR)/udev/rules.d/90-qubes-dmroot.rules
mkdir -p $(DESTDIR)$(SCRIPTSDIR)
cp udev-block-add-change $(DESTDIR)$(SCRIPTSDIR)
cp udev-block-remove $(DESTDIR)$(SCRIPTSDIR)
cp udev-block-cleanup $(DESTDIR)$(SCRIPTSDIR)
cp udev-usb-add-change $(DESTDIR)$(SCRIPTSDIR)
cp udev-usb-remove $(DESTDIR)$(SCRIPTSDIR)

@ -15,11 +15,10 @@ xs_remove() {
return 0
fi
if [ "$QUBES_EXPOSED" == "1" ]; then
if qubesdb-read -q "$QDB_KEY/desc" >/dev/null; then
qubesdb-rm "$QDB_KEY/"
qubesdb-write /qubes-block-devices ''
fi
echo QUBES_EXPOSED=0
}
is_used() {
@ -42,25 +41,34 @@ is_used() {
return 1
}
# communicate with xenstored through socket in dom0
# trying to access xenstore before xenstored is started, hang forever (in
# non-killable state), so better fail ('-s' in VM if /proc/xen isn't mounted
# yet) than hang dom0 boot
if [ ! -r /proc/xen/capabilities ] || grep -q control_d /proc/xen/capabilities; then
XENSTORE_LS="xenstore-ls -s"
else
XENSTORE_LS="xenstore-ls"
fi
refresh_another() {
# launch this script for other device
local devpath=$1
local launch_env=$(udevadm info -q all -x -p "$devpath" \
| grep ^E: | cut -d ' ' -f 2- | tr ' ' ':')
env -i PATH=$PATH $launch_env $0
}
is_attached() {
dev_hex=$(stat -c %t:%T /dev/$(basename $1))
$XENSTORE_LS backend/vbd | grep -q "physical-device = \"$dev_hex\""
if [ -z "$dev_hex" -o "$dev_hex" = "0:0" ]; then
return 1
fi
# looking at sysfs is much faster than looking at xenstore
# this code requires no subprocesses and doesn't hit argument length limitations
for i in /sys/bus/xen-backend/drivers/vbd/vbd-*/physical_device; do
read i_dev_hex < "$i"
if test "$i_dev_hex" == "$dev_hex"; then
return 0
fi
done
return 1
}
# update info about parent devices, if any:
if [ -f /sys$DEVPATH/partition ]; then
parent=$(dirname $(readlink -f /sys$DEVPATH))
udevadm trigger \
--property-match=DEVPATH=/$(realpath --relative-to=/sys $parent)
refresh_another /$(realpath --relative-to=/sys $parent)
# if parent device is already attached, skip its partitions
if is_attached $parent; then
xs_remove
@ -70,12 +78,23 @@ fi
# and underlying devices of device-mapper (if any)
for dev in /sys$DEVPATH/slaves/*; do
udevadm trigger \
--property-match=DEVPATH=/$(realpath --relative-to=/sys $dev)
refresh_another /$(realpath --relative-to=/sys $dev)
done
# cache slave devices for remove event
if [ -n "$DM_NAME" ]; then
ls -1 /sys$DEVPATH/slaves/ > /var/run/qubes/block-slave-cache-$NAME
fi
# then take care of this device:
# udev rules already excluded this device:
if [ "$DM_UDEV_DISABLE_DISK_RULES_FLAG" = "1" ]; then
xs_remove
exit 0
fi
# device itself is already used
if is_used /sys$DEVPATH; then
xs_remove
@ -100,14 +119,27 @@ if [ "$MAJOR" -eq 7 -a ! -d /sys/$DEVPATH/loop ]; then
exit 0
fi
# ... and temporary devices used during VM startup
if [[ "$NAME" = 'loop'* ]] && \
[[ "`cat /sys/block/${NAME%p*}/loop/backing_file`" = \
'/var/lib/qubes/'*'/volatile.img' ]]; then
# or unconnected Network Block Device
if [ "$MAJOR" -eq 43 -a ! -e /sys/$DEVPATH/pid ]; then
xs_remove
exit 0
fi
# ... and loop devices from excluded directories
if [[ "$NAME" = 'loop'* ]]; then
backing_file=$(cat /sys/block/${NAME}/loop/backing_file)
if [ -n "$backing_file" ]; then
dir_to_check=$(dirname "$backing_file")
while [ "$dir_to_check" != "/" -a "$dir_to_check" != "." ]; do
if [ -e "$dir_to_check/.qubes-exclude-block-devices" ]; then
xs_remove
exit 0
fi
dir_to_check=$(dirname "$dir_to_check")
done
fi
fi
# Check if device is read-only
if [ "`cat /sys/$DEVPATH/ro`" -eq 1 ]; then
MODE=r
@ -138,7 +170,6 @@ qubesdb-write \
"$QDB_KEY/size" "$SIZE" \
"$QDB_KEY/mode" "$MODE" \
/qubes-block-devices ''
echo QUBES_EXPOSED=1
# Make sure that block backend is loaded
/sbin/modprobe xen-blkback 2> /dev/null || /sbin/modprobe blkbk

@ -1,8 +0,0 @@
#!/bin/sh
DEVID=$[ $MAJOR * 256 + $MINOR ]
XS_PATH="device/vbd/$DEVID"
# Double check that DEVID is not empty
[ -n "$DEVID" ] && xenstore-rm $XS_PATH

@ -2,39 +2,15 @@
NAME=${DEVNAME#/dev/}
QDB_KEY="/qubes-block-devices/$NAME"
# Trailing slash is intentional - it will remove whole directory, instead of
# single base entry
# Trailing slash is intentional - it will remove the whole directory, instead of
# a single base entry
qubesdb-rm "$QDB_KEY/"
qubesdb-write /qubes-block-devices ''
# If device was connected to some VM - detach it
# Notice: this can be run also in VM, so we cannot use xl...
device_detach() {
xs_path=$1
xenstore-write $xs_path/online 0 $xs_path/state 5
# Wait for backend to finish dev shutdown
try=30
# -lt will break loop also when 'state' will be empty
while [ "`xenstore-read $xs_path/state 2> /dev/null`" -lt 6 ]; do
try=$[ $try - 1 ]
[ "$try" -le 0 ] && break
sleep 0.1
if [ -r /var/run/qubes/block-slave-cache-$NAME ]; then
# update info about underlying devices of device-mapper (if any);
for dev in $(cat /var/run/qubes/block-slave-cache-$NAME); do
udevadm trigger /sys/class/block/$dev
done
xenstore-rm $xs_path
}
# update info about underlying devices of device-mapper (if any)
# at this stage device-mapper is already removed, so can't check what devices
# were used there
udevadm trigger --subsystem-match=block
for XS_DEV_PATH in `xenstore-ls -f backend/vbd | grep 'backend/vbd/[0-9]*/[0-9]* ' | cut -f 1 -d ' '`; do
CUR_DEVICE=`xenstore-read "$XS_DEV_PATH/params"`
if [ "$CUR_DEVICE" == "$DEVNAME" ]; then
device_detach "$XS_DEV_PATH"
exit 0
fi
done
rm -f /var/run/qubes/block-slave-cache-$NAME
fi

@ -10,18 +10,16 @@ KERNEL=="xvda|xvdb|xvdc*|xvdd", ENV{UDISKS_IGNORE}="1"
# Skip xen-blkfront devices
ENV{MAJOR}=="202", GOTO="qubes_block_end"
# skip devices excluded elsewhere
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}=="1", GOTO="qubes_block_end"
# Skip device-mapper devices
KERNEL=="dm-*", ENV{DM_NAME}=="snapshot-*", GOTO="qubes_block_end"
KERNEL=="dm-*", ENV{DM_NAME}=="origin-*", GOTO="qubes_block_end"
KERNEL=="dm-*", ENV{DM_NAME}=="", GOTO="qubes_block_end"
KERNEL=="dm-*", ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}=="1", GOTO="qubes_block_end"
IMPORT{db}="QUBES_EXPOSED"
ACTION=="add", IMPORT{program}="/usr/lib/qubes/udev-block-add-change"
ACTION=="change", IMPORT{program}="/usr/lib/qubes/udev-block-add-change"
ACTION=="add", RUN+="/usr/lib/qubes/udev-block-add-change"
ACTION=="change", RUN+="/usr/lib/qubes/udev-block-add-change"
ACTION=="remove", RUN+="/usr/lib/qubes/udev-block-remove"
LABEL="qubes_block_end"
# Cleanup disconnected frontend from xenstore
ACTION=="remove", SUBSYSTEM=="block", ENV{MAJOR}=="202", RUN+="/usr/lib/qubes/udev-block-cleanup"

@ -0,0 +1,5 @@
# Create /dev/mapper/dmroot symlink on TemplateVM/StandaloneVM to make
# grub-mkconfig happy.
# On TemplateBasedVM, it is really a device mapper device.
SUBSYSTEM=="block", ENV{ID_PART_ENTRY_NAME}=="Root\x20filesystem", ATTR{ro}=="0", SYMLINK+="mapper/dmroot"

@ -4,3 +4,4 @@ KERNEL=="xen/gntdev", MODE="0660", GROUP="qubes"
KERNEL=="xen/gntalloc", MODE="0660", GROUP="qubes"
KERNEL=="xen/privcmd", MODE="0660", GROUP="qubes"
KERNEL=="xen/xenbus", MODE="0660", GROUP="qubes"
KERNEL=="xen/hypercall", MODE="0660", GROUP="qubes"

@ -3,6 +3,9 @@
# Handle only USB devices
SUBSYSTEM!="usb", GOTO="qubes_usb_end"
# ignore qemu emulated devices in HVM
ENV{ID_VENDOR}=="QEMU", GOTO="qubes_usb_end"
ACTION=="add", IMPORT{program}="/usr/lib/qubes/udev-usb-add-change"
ACTION=="change", IMPORT{program}="/usr/lib/qubes/udev-usb-add-change"
ACTION=="remove", RUN+="/usr/lib/qubes/udev-usb-remove"

@ -25,7 +25,7 @@ VERSION=`cat /sys/$DEVPATH/version | tr -d ' '|cut -f 1 -d .`
# ignore usbip-connected devices, as most likely already passed through from
# another VM
if [ "`echo $DEVPATH | cut -d / -f 2-4`" = "devices/platform/vhci_hcd" ]; then
if echo $DEVPATH | grep -q /vhci_hcd; then
exit 0
fi

@ -1 +1 @@
3.2.4
4.1.3

Loading…
Cancel
Save