(c) 2010 Invisible Things Lab Authors: ========= Joanna Rutkowska <joanna@invisiblethingslab.com> Rafal Wojtczuk <rafal@invisiblethingslab.com>pull/1/head v1.0.0
commit
b5e395d385
@ -0,0 +1,39 @@
|
|||||||
|
The Template Builder
|
||||||
|
======================
|
||||||
|
|
||||||
|
(applies also to the netvm builder)
|
||||||
|
|
||||||
|
1) get a clean image of a Linux install (e.g. by using virt-install) NOTE: We
|
||||||
|
assume that the image will have a two-partition layout:
|
||||||
|
|
||||||
|
img1 <--- the root fs (/)
|
||||||
|
img2 <--- the swap
|
||||||
|
|
||||||
|
2) update symlinks in rpms_to_install so that they point to the current version
|
||||||
|
of rpms to install
|
||||||
|
|
||||||
|
3) Now, you can "qubeize" the image. This must be done as root. E.g.:
|
||||||
|
|
||||||
|
# ./qubeize_image clean_images/some_image.img f12-x64-compact
|
||||||
|
|
||||||
|
4) Make sure the symlinks in vm_kernels point to correct kernel and initramfs
|
||||||
|
files.
|
||||||
|
|
||||||
|
4a) In order to prepare a patched initramfs file, use the
|
||||||
|
patch_appvm_initramfs.sh program that is installed as part of
|
||||||
|
qubes-core-dom0.rpm:
|
||||||
|
|
||||||
|
# /usr/lib/qubes/patch_appvm_initramfs.sh \
|
||||||
|
<original_initrafms> \
|
||||||
|
<filename_for_patched_initramfs> \
|
||||||
|
/abs_path/vm-initramfs-patches/qubes_cow_setup.sh
|
||||||
|
|
||||||
|
|
||||||
|
4b) Manually adjust the appmenus
|
||||||
|
|
||||||
|
5) Finally, build the Template RPM (do it as normal user, not root), e.g.:
|
||||||
|
|
||||||
|
$./build_rpm <name>
|
||||||
|
|
||||||
|
The resulting rpm is stored in rpm/noarch directory.
|
||||||
|
|
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cp ../rpms_3rd_party/libflashplayer.so mnt/usr/lib64/mozilla/plugins/
|
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SRC=$1
|
||||||
|
DSTDIR=$2
|
||||||
|
DST=$DSTDIR/$(basename $SRC)
|
||||||
|
|
||||||
|
# Do not copy KDE/GNOME specific apps, e.g. "Home", "Find files", etc
|
||||||
|
if grep -q OnlyShowIn $SRC ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q ^Name $SRC ; then
|
||||||
|
echo "WARNING: app $SRC doesn't have Name keyword, skipping..."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -e "s/^\(Name.*\)=\(.*\)/\1=%VMNAME%: \2/" \
|
||||||
|
-e "s/^\(GenericName.*\)=\(.*\)/\1=%VMNAME%: \2/" \
|
||||||
|
-e "s/^Exec=\(.*\)/Exec=qvm-run -q --tray -a %VMNAME% \'\1\'/" \
|
||||||
|
<$SRC | \
|
||||||
|
grep -v "^Mime" | \
|
||||||
|
grep -v "^Icon" | \
|
||||||
|
grep -v "^TryExec" | \
|
||||||
|
grep -v "^Startup" >$DST
|
||||||
|
|
||||||
|
echo X-Qubes-VmName=%VMNAME% >> $DST
|
||||||
|
echo Icon=%VMDIR%/icon.png >> $DST
|
@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SRC=$1
|
||||||
|
DSTDIR=$2
|
||||||
|
DST=$DSTDIR/$(basename $SRC)
|
||||||
|
|
||||||
|
sed -e "s/^\(Name.*\)=\(.*\)/\1=%VMNAME%: \2/" \
|
||||||
|
-e "s/^\(GenericName.*\)=\(.*\)/\1=%VMNAME%: \2/" \
|
||||||
|
-e "s/^Exec=\(.*\)/Exec=qvm-run -q --tray -a --user=root %VMNAME% \"\1\"/" \
|
||||||
|
<$SRC | \
|
||||||
|
grep -v "^Mime" | \
|
||||||
|
grep -v "^TryExec" | \
|
||||||
|
grep -v "^Startup" >$DST
|
||||||
|
|
||||||
|
#echo "Categories=%VMNAME%" >> $DST
|
||||||
|
|
||||||
|
echo X-Qubes-VmName=%VMNAME% >> $DST
|
||||||
|
echo Icon=%VMDIR%/icon.png >> $DST
|
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SRC=$1
|
||||||
|
DSTDIR=$2
|
||||||
|
VMNAME=$3
|
||||||
|
VMDIR=$4
|
||||||
|
|
||||||
|
DST=$DSTDIR/$VMNAME-$(basename $SRC)
|
||||||
|
|
||||||
|
sed -e "s/%VMNAME%/$VMNAME/" \
|
||||||
|
-e "s %VMDIR% $VMDIR " \
|
||||||
|
<$SRC >$DST
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SRC=$1
|
||||||
|
DST=$2
|
||||||
|
VMNAME=$3
|
||||||
|
VMDIR=$4
|
||||||
|
|
||||||
|
sed -e "s/%VMNAME%/$VMNAME/" \
|
||||||
|
-e "s %VMDIR% $VMDIR " \
|
||||||
|
<$SRC >$DST
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=Directory
|
||||||
|
Name=%VMNAME% (NetVM)
|
||||||
|
Icon=/usr/share/qubes/icons/netvm.png
|
@ -0,0 +1,5 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=Directory
|
||||||
|
Name=%VMNAME% (TemplateVM)
|
||||||
|
Icon=/usr/share/qubes/icons/template.png
|
@ -0,0 +1,5 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=Directory
|
||||||
|
Name=%VMNAME% (VM)
|
||||||
|
Icon=%VMDIR%/icon.png
|
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
NAME=$1
|
||||||
|
|
||||||
|
if [ x$NAME = x ] ; then
|
||||||
|
echo "usage $0 <netvm_name>"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
rpmbuild --sign --target noarch --define "netvm_name $NAME" -bb netvm.spec
|
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
NAME=$1
|
||||||
|
|
||||||
|
if [ x$NAME = x ] ; then
|
||||||
|
echo "usage $0 <template_name>"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
rpmbuild --sign --target noarch --define "template_name $NAME" -bb templates.spec
|
@ -0,0 +1 @@
|
|||||||
|
*
|
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SRCDIR=$1
|
||||||
|
VMNAME=$2
|
||||||
|
VMDIR=$3
|
||||||
|
APPSDIR=$4
|
||||||
|
|
||||||
|
if [ $# != 4 ]; then
|
||||||
|
echo "usage: $0 <apps_templates_dir> <vmname> <vmdir> <apps_dir>"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
mkdir -p $APPSDIR
|
||||||
|
|
||||||
|
find $SRCDIR -name "*.desktop" -exec appmenus/convert_apptemplate2vm.sh {} $APPSDIR $VMNAME $VMDIR \;
|
||||||
|
|
||||||
|
appmenus/convert_dirtemplate2vm.sh appmenus/qubes-netvm.directory.template $APPSDIR/$VMNAME-vm.directory $VMNAME $VMDIR
|
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SRCDIR=$1
|
||||||
|
VMNAME=$2
|
||||||
|
VMDIR=$3
|
||||||
|
APPSDIR=$4
|
||||||
|
|
||||||
|
if [ $# != 4 ]; then
|
||||||
|
echo "usage: $0 <apps_templates_dir> <vmname> <vmdir> <apps_dir>"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
mkdir -p $APPSDIR
|
||||||
|
|
||||||
|
find $SRCDIR -name "*.desktop" -exec appmenus/convert_apptemplate2vm.sh {} $APPSDIR $VMNAME $VMDIR \;
|
||||||
|
|
||||||
|
appmenus/convert_dirtemplate2vm.sh appmenus/qubes-templatevm.directory.template $APPSDIR/$VMNAME-vm.directory $VMNAME $VMDIR
|
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
APPSORIG=$1
|
||||||
|
APPSTMPL=$2
|
||||||
|
|
||||||
|
if [ $# != 2 ]; then
|
||||||
|
echo "usage $0 <apps_orig_dir> <apps_templ_dir>"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f $APPSTMPL/*
|
||||||
|
mkdir -p $APPSTMPL
|
||||||
|
find $APPSORIG -name "*.desktop" -exec appmenus/convert_app2template.sh {} $APPSTMPL \;
|
||||||
|
|
||||||
|
cp appmenus/qubes-vm.directory.template $APPSTMPL
|
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
APPSORIG=$1
|
||||||
|
APPSTMPL=$2
|
||||||
|
|
||||||
|
if [ $# != 2 ]; then
|
||||||
|
echo "usage $0 <apps_orig_dir> <apps_templ_dir>"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
#rm -f $APPSTMPL/*
|
||||||
|
mkdir -p $APPSTMPL
|
||||||
|
find $APPSORIG -name "*.desktop" -exec appmenus/convert_app2template_for_netvm.sh {} $APPSTMPL \;
|
||||||
|
|
||||||
|
cp appmenus/qubes-vm.directory.template $APPSTMPL
|
@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
ROOTIMG=$1
|
||||||
|
|
||||||
|
if [ x$ROOTIMG = x ] ; then
|
||||||
|
echo "usage: $0 <root.img>"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We assume that the input root.img has the following structure:
|
||||||
|
|
||||||
|
# /dev/sda1 <--- root fs
|
||||||
|
# /dev/sda2 <--- swap
|
||||||
|
|
||||||
|
# and that the first partition starts at offset 63*512 from the begging of the image file
|
||||||
|
OFFSET=$((63*512))
|
||||||
|
|
||||||
|
mkdir -p mnt
|
||||||
|
|
||||||
|
MNTDIR=$(pwd)/mnt
|
||||||
|
|
||||||
|
LOOP=$(/sbin/losetup -f -s -o $OFFSET $ROOTIMG)
|
||||||
|
|
||||||
|
if [ x$LOOP = x ] ; then
|
||||||
|
echo "Cannot setup loopback device for the $ROOTIMG file -- perhaps a permissions problem?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mount $LOOP $MNTDIR || {
|
||||||
|
echo "Cannot mount $LOOP to $MNTDIR"
|
||||||
|
/sbin/losetup -d $LOOP
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
# generate unmount script
|
||||||
|
BASENAE=$(basename $ROOTIMG)
|
||||||
|
UNMOUNT_SCRIPT=$(echo unmount_root-$BASENAE.sh)
|
||||||
|
echo "#!/bin/sh" > $UNMOUNT_SCRIPT
|
||||||
|
echo "umount $MNTDIR || { echo \"Cannot unmount!\"; exit 1; }" >> $UNMOUNT_SCRIPT
|
||||||
|
echo "/sbin/losetup -d $LOOP || { echo \"Cannot delete the loop device\"; exit 1; }" >> $UNMOUNT_SCRIPT
|
||||||
|
echo "rm -f $UNMOUNT_SCRIPT" >> $UNMOUNT_SCRIPT
|
||||||
|
chmod +x $UNMOUNT_SCRIPT
|
||||||
|
|
@ -0,0 +1,108 @@
|
|||||||
|
#
|
||||||
|
# This SPEC is for bulding RPM packages that contain complete Qubes NetVM files
|
||||||
|
# This includes the VM's root image, patched with all qubes rpms, etc
|
||||||
|
#
|
||||||
|
|
||||||
|
%{!?version: %define version %(cat version_netvm)}
|
||||||
|
|
||||||
|
Name: qubes-servicevm-%{netvm_name}
|
||||||
|
Version: %{version}
|
||||||
|
Release: 1
|
||||||
|
Summary: Qubes NetVM image for '%{netvm_name}'
|
||||||
|
|
||||||
|
License: GPL
|
||||||
|
URL: http://www.qubes-os.org
|
||||||
|
Source: .
|
||||||
|
|
||||||
|
Requires: qubes-core-dom0 xdg-utils
|
||||||
|
|
||||||
|
%define _builddir %(pwd)
|
||||||
|
%define _rpmdir %(pwd)/rpm
|
||||||
|
%define dest_dir /var/lib/qubes/servicevms/%{netvm_name}
|
||||||
|
|
||||||
|
%description
|
||||||
|
Qubes NetVM image for '%{netvm_name}'.
|
||||||
|
|
||||||
|
%build
|
||||||
|
cd qubeized_images
|
||||||
|
rm -f %{netvm_name}-root.img.tar
|
||||||
|
tar --sparse -cf %{netvm_name}-root.img.tar %{netvm_name}-root.img
|
||||||
|
cd ..
|
||||||
|
./create_apps_for_netvm.sh netvm/apps.templates/ %{netvm_name} %{dest_dir} qubeized_images/%{netvm_name}-apps
|
||||||
|
|
||||||
|
%install
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}
|
||||||
|
ln qubeized_images/%{netvm_name}-root.img.tar $RPM_BUILD_ROOT/%{dest_dir}/root.img.tar
|
||||||
|
touch $RPM_BUILD_ROOT/%{dest_dir}/root.img # we will create the real file in %post
|
||||||
|
|
||||||
|
sed -e s/%NETVMNAME%/%{netvm_name}/ < vm_conf_files/netvm.conf >\
|
||||||
|
$RPM_BUILD_ROOT/%{dest_dir}/%{netvm_name}.conf
|
||||||
|
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}/kernels
|
||||||
|
cp vm_kernels/vmlinuz $RPM_BUILD_ROOT/%{dest_dir}/kernels/vmlinuz
|
||||||
|
cp vm_kernels/initramfs $RPM_BUILD_ROOT/%{dest_dir}/kernels/initramfs
|
||||||
|
|
||||||
|
cp vm_initramfs_patches/qubes_cow_setup.sh $RPM_BUILD_ROOT/%{dest_dir}/kernels/qubes_cow_setup.sh
|
||||||
|
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}/apps
|
||||||
|
cp -r qubeized_images/%{netvm_name}-apps/* $RPM_BUILD_ROOT/%{dest_dir}/apps
|
||||||
|
touch $RPM_BUILD_ROOT/%{dest_dir}/icon.png
|
||||||
|
|
||||||
|
%post
|
||||||
|
echo "--> Processing the root.img... (this might take a while)"
|
||||||
|
tar --sparse -xf %{dest_dir}/root.img.tar -C %{dest_dir}
|
||||||
|
rm -f %{dest_dir}/root.img.tar
|
||||||
|
mv %{dest_dir}/%{netvm_name}-root.img %{dest_dir}/root.img
|
||||||
|
chown root.qubes %{dest_dir}/root.img
|
||||||
|
chmod 0660 %{dest_dir}/root.img
|
||||||
|
|
||||||
|
export XDG_DATA_DIRS=/usr/share/
|
||||||
|
if [ "$1" -gt 1 ] ; then
|
||||||
|
# upgrading already installed template...
|
||||||
|
echo "--> Removing previous menu shortcuts..."
|
||||||
|
xdg-desktop-menu uninstall --mode system %{dest_dir}/apps/*.directory %{dest_dir}/apps/*.desktop
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Instaling menu shortcuts..."
|
||||||
|
ln -sf /usr/share/qubes/icons/netvm.png %{dest_dir}/icon.png
|
||||||
|
xdg-desktop-menu install --mode system %{dest_dir}/apps/*.directory %{dest_dir}/apps/*.desktop
|
||||||
|
|
||||||
|
echo "--> Adding to Qubes DB..."
|
||||||
|
if [ "$1" = 1 ] ; then
|
||||||
|
# installing for the first time
|
||||||
|
qvm-add-netvm %{netvm_name}
|
||||||
|
else
|
||||||
|
qvm-remove -q --just-db %{netvm_name}
|
||||||
|
qvm-add-netvm %{netvm_name}
|
||||||
|
fi
|
||||||
|
|
||||||
|
%preun
|
||||||
|
if [ "$1" = 0 ] ; then
|
||||||
|
# no more packages left
|
||||||
|
qvm-remove -q --just-db %{netvm_name}
|
||||||
|
|
||||||
|
# we need to have it here, because rpm -U <template>
|
||||||
|
# apparently executes %preun of the old package *after* %post of the new packages...
|
||||||
|
echo "--> Removing menu shortcuts..."
|
||||||
|
export XDG_DATA_DIRS=/usr/share/
|
||||||
|
xdg-desktop-menu uninstall --mode system %{dest_dir}/apps/*.directory %{dest_dir}/apps/*.desktop
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
%clean
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
|
||||||
|
%files
|
||||||
|
%defattr(660,root,qubes,770)
|
||||||
|
%dir %{dest_dir}
|
||||||
|
%ghost %{dest_dir}/root.img
|
||||||
|
%{dest_dir}/root.img.tar
|
||||||
|
%{dest_dir}/%{netvm_name}.conf
|
||||||
|
%dir %{dest_dir}/kernels
|
||||||
|
%{dest_dir}/kernels/vmlinuz
|
||||||
|
%{dest_dir}/kernels/initramfs
|
||||||
|
%{dest_dir}/kernels/qubes_cow_setup.sh
|
||||||
|
%attr (775,root,qubes) %dir %{dest_dir}/apps
|
||||||
|
%attr (664,root,qubes) %{dest_dir}/apps/*
|
||||||
|
%{dest_dir}/icon.png
|
@ -0,0 +1,173 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Exec=konsole
|
||||||
|
Icon=utilities-terminal
|
||||||
|
X-DocPath=konsole/index.html
|
||||||
|
Terminal=false
|
||||||
|
X-KDE-StartupNotify=true
|
||||||
|
|
||||||
|
Name=Konsole
|
||||||
|
Name[af]=Konsole
|
||||||
|
Name[ar]=كونسول
|
||||||
|
Name[as]=Konsole
|
||||||
|
Name[be]=Konsole
|
||||||
|
Name[be@latin]=Konsole
|
||||||
|
Name[bg]=Konsole
|
||||||
|
Name[bn]=কনসোল
|
||||||
|
Name[bn_IN]=Konsole
|
||||||
|
Name[br]=Konsole
|
||||||
|
Name[ca]=Konsole
|
||||||
|
Name[ca@valencia]=Konsole
|
||||||
|
Name[cs]=Konsole
|
||||||
|
Name[csb]=Kònsola
|
||||||
|
Name[cy]=Konsole
|
||||||
|
Name[da]=Konsole
|
||||||
|
Name[de]=Konsole
|
||||||
|
Name[el]=Κονσόλα
|
||||||
|
Name[en_GB]=Konsole
|
||||||
|
Name[eo]=Konsole
|
||||||
|
Name[es]=Konsole
|
||||||
|
Name[et]=Konsool
|
||||||
|
Name[eu]=Kontsola
|
||||||
|
Name[fi]=Konsole
|
||||||
|
Name[fr]=Konsole
|
||||||
|
Name[fy]=Konsole
|
||||||
|
Name[ga]=Konsole
|
||||||
|
Name[gl]=Konsole
|
||||||
|
Name[gu]=કોન્સોલ
|
||||||
|
Name[he]=Konsole
|
||||||
|
Name[hi]=कंसोल
|
||||||
|
Name[hne]=कंसोल
|
||||||
|
Name[hr]=Konzola
|
||||||
|
Name[hsb]=Konsola
|
||||||
|
Name[hu]=Konsole
|
||||||
|
Name[is]=Skjáhermir
|
||||||
|
Name[it]=Konsole
|
||||||
|
Name[ja]=Konsole
|
||||||
|
Name[ka]=კონსოლი
|
||||||
|
Name[kk]=Konsole
|
||||||
|
Name[km]=កុងសូល
|
||||||
|
Name[kn]=ಕನ್ಸೋಲ್
|
||||||
|
Name[ko]=Konsole
|
||||||
|
Name[ku]=Konsol
|
||||||
|
Name[lt]=Konsole
|
||||||
|
Name[lv]=Konsole
|
||||||
|
Name[mai]=कंसोल
|
||||||
|
Name[mk]=Конзола
|
||||||
|
Name[ml]=കണ്സോള്
|
||||||
|
Name[mr]=कंसोल
|
||||||
|
Name[ms]=Konsole
|
||||||
|
Name[nb]=Konsole
|
||||||
|
Name[nds]=Konsole
|
||||||
|
Name[ne]=कन्सोल
|
||||||
|
Name[nl]=Konsole
|
||||||
|
Name[nn]=Konsoll
|
||||||
|
Name[oc]=Konsole
|
||||||
|
Name[or]=କୋଲସୋଲ
|
||||||
|
Name[pa]=ਕਨਸੋਲ
|
||||||
|
Name[pl]=Konsola
|
||||||
|
Name[pt]=Konsole
|
||||||
|
Name[pt_BR]=Konsole
|
||||||
|
Name[ro]=Konsolă
|
||||||
|
Name[ru]=Konsole
|
||||||
|
Name[se]=Konsolla
|
||||||
|
Name[si]=Konsole
|
||||||
|
Name[sk]=Konzola
|
||||||
|
Name[sl]=Konzola
|
||||||
|
Name[sr]=Конзола
|
||||||
|
Name[sr@latin]=Konsole
|
||||||
|
Name[sv]=Konsole
|
||||||
|
Name[ta]=கான்சோல்
|
||||||
|
Name[te]=కాన్సోల్
|
||||||
|
Name[tg]=Консол
|
||||||
|
Name[th]=คอนโซล K
|
||||||
|
Name[tr]=Konsole
|
||||||
|
Name[uk]=Konsole
|
||||||
|
Name[uz]=Konsole
|
||||||
|
Name[uz@cyrillic]=Konsole
|
||||||
|
Name[vi]=Konsole
|
||||||
|
Name[wa]=Konsole
|
||||||
|
Name[xh]=Konsole
|
||||||
|
Name[x-test]=xxKonsolexx
|
||||||
|
Name[zh_CN]=Konsole
|
||||||
|
Name[zh_TW]=Konsole
|
||||||
|
|
||||||
|
GenericName=Terminal
|
||||||
|
GenericName[af]=Terminaal
|
||||||
|
GenericName[ar]=طرفيّة
|
||||||
|
GenericName[as]=টাৰ্মিনেল
|
||||||
|
GenericName[be@latin]=Terminał
|
||||||
|
GenericName[bg]=Терминал
|
||||||
|
GenericName[bn]=টার্মিনাল
|
||||||
|
GenericName[bn_IN]=টার্মিন্যাল
|
||||||
|
GenericName[ca]=Terminal
|
||||||
|
GenericName[ca@valencia]=Terminal
|
||||||
|
GenericName[cs]=Terminál
|
||||||
|
GenericName[csb]=Terminal
|
||||||
|
GenericName[da]=Terminal
|
||||||
|
GenericName[de]=Terminal
|
||||||
|
GenericName[el]=Τερματικό
|
||||||
|
GenericName[en_GB]=Terminal
|
||||||
|
GenericName[eo]=Terminalo
|
||||||
|
GenericName[es]=Terminal
|
||||||
|
GenericName[et]=Terminal
|
||||||
|
GenericName[eu]=Terminala
|
||||||
|
GenericName[fi]=Komentoikkuna
|
||||||
|
GenericName[fr]=Terminal
|
||||||
|
GenericName[fy]=Terminal
|
||||||
|
GenericName[ga]=Teirminéal
|
||||||
|
GenericName[gl]=Terminal
|
||||||
|
GenericName[gu]=ટર્મિનલ
|
||||||
|
GenericName[he]=מסוף
|
||||||
|
GenericName[hi]=टर्मिनल
|
||||||
|
GenericName[hne]=टर्मिनल
|
||||||
|
GenericName[hr]=Terminal
|
||||||
|
GenericName[hsb]=Terminal
|
||||||
|
GenericName[hu]=Terminál
|
||||||
|
GenericName[is]=Skjáhermir
|
||||||
|
GenericName[it]=Terminale
|
||||||
|
GenericName[ja]=ターミナル
|
||||||
|
GenericName[kk]=Терминал
|
||||||
|
GenericName[km]=ស្ថានីយ
|
||||||
|
GenericName[kn]=ಆದೇಶತೆರೆ (ಟರ್ಮಿನಲ್)
|
||||||
|
GenericName[ko]=터미널
|
||||||
|
GenericName[ku]=Termînal
|
||||||
|
GenericName[lt]=Terminalas
|
||||||
|
GenericName[lv]=Terminālis
|
||||||
|
GenericName[mai]=टर्मिनल
|
||||||
|
GenericName[mk]=Терминал
|
||||||
|
GenericName[ml]=ടെര്മിനല്
|
||||||
|
GenericName[mr]=टर्मिनल
|
||||||
|
GenericName[nb]=Terminal
|
||||||
|
GenericName[nds]=Konsool
|
||||||
|
GenericName[nl]=Terminal
|
||||||
|
GenericName[nn]=Terminal
|
||||||
|
GenericName[or]=ଟର୍ମିନାଲ
|
||||||
|
GenericName[pa]=ਟਰਮੀਨਲ
|
||||||
|
GenericName[pl]=Terminal
|
||||||
|
GenericName[pt]=Terminal
|
||||||
|
GenericName[pt_BR]=Terminal
|
||||||
|
GenericName[ro]=Terminal
|
||||||
|
GenericName[ru]=Терминал
|
||||||
|
GenericName[se]=Terminal
|
||||||
|
GenericName[si]=Terminal
|
||||||
|
GenericName[sk]=Terminál
|
||||||
|
GenericName[sl]=Terminal
|
||||||
|
GenericName[sr]=Терминал
|
||||||
|
GenericName[sr@latin]=Terminal
|
||||||
|
GenericName[sv]=Terminal
|
||||||
|
GenericName[ta]=முனையம்
|
||||||
|
GenericName[te]=టెర్మినల్
|
||||||
|
GenericName[tg]=Терминал
|
||||||
|
GenericName[th]=เทอร์มินัล
|
||||||
|
GenericName[tr]=Uçbirim
|
||||||
|
GenericName[uk]=Термінал
|
||||||
|
GenericName[uz]=Terminal
|
||||||
|
GenericName[uz@cyrillic]=Терминал
|
||||||
|
GenericName[wa]=Terminå
|
||||||
|
GenericName[x-test]=xxTerminalxx
|
||||||
|
GenericName[zh_CN]=终端
|
||||||
|
GenericName[zh_TW]=終端機
|
||||||
|
X-DBUS-StartupType=Unique
|
||||||
|
X-KDE-AuthorizeAction=shell_access
|
||||||
|
Categories=Qt;KDE;System;TerminalEmulator;
|
@ -0,0 +1,174 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Exec=qvm-run -q --tray -a --user=root %VMNAME% "konsole"
|
||||||
|
Icon=%VMDIR%/icon.png
|
||||||
|
X-DocPath=konsole/index.html
|
||||||
|
Terminal=false
|
||||||
|
X-KDE-StartupNotify=true
|
||||||
|
|
||||||
|
Name=%VMNAME%: Konsole
|
||||||
|
Name[af]=%VMNAME%: Konsole
|
||||||
|
Name[ar]=%VMNAME%: كونسول
|
||||||
|
Name[as]=%VMNAME%: Konsole
|
||||||
|
Name[be]=%VMNAME%: Konsole
|
||||||
|
Name[be@latin]=%VMNAME%: Konsole
|
||||||
|
Name[bg]=%VMNAME%: Konsole
|
||||||
|
Name[bn]=%VMNAME%: কনসোল
|
||||||
|
Name[bn_IN]=%VMNAME%: Konsole
|
||||||
|
Name[br]=%VMNAME%: Konsole
|
||||||
|
Name[ca]=%VMNAME%: Konsole
|
||||||
|
Name[ca@valencia]=%VMNAME%: Konsole
|
||||||
|
Name[cs]=%VMNAME%: Konsole
|
||||||
|
Name[csb]=%VMNAME%: Kònsola
|
||||||
|
Name[cy]=%VMNAME%: Konsole
|
||||||
|
Name[da]=%VMNAME%: Konsole
|
||||||
|
Name[de]=%VMNAME%: Konsole
|
||||||
|
Name[el]=%VMNAME%: Κονσόλα
|
||||||
|
Name[en_GB]=%VMNAME%: Konsole
|
||||||
|
Name[eo]=%VMNAME%: Konsole
|
||||||
|
Name[es]=%VMNAME%: Konsole
|
||||||
|
Name[et]=%VMNAME%: Konsool
|
||||||
|
Name[eu]=%VMNAME%: Kontsola
|
||||||
|
Name[fi]=%VMNAME%: Konsole
|
||||||
|
Name[fr]=%VMNAME%: Konsole
|
||||||
|
Name[fy]=%VMNAME%: Konsole
|
||||||
|
Name[ga]=%VMNAME%: Konsole
|
||||||
|
Name[gl]=%VMNAME%: Konsole
|
||||||
|
Name[gu]=%VMNAME%: કોન્સોલ
|
||||||
|
Name[he]=%VMNAME%: Konsole
|
||||||
|
Name[hi]=%VMNAME%: कंसोल
|
||||||
|
Name[hne]=%VMNAME%: कंसोल
|
||||||
|
Name[hr]=%VMNAME%: Konzola
|
||||||
|
Name[hsb]=%VMNAME%: Konsola
|
||||||
|
Name[hu]=%VMNAME%: Konsole
|
||||||
|
Name[is]=%VMNAME%: Skjáhermir
|
||||||
|
Name[it]=%VMNAME%: Konsole
|
||||||
|
Name[ja]=%VMNAME%: Konsole
|
||||||
|
Name[ka]=%VMNAME%: კონსოლი
|
||||||
|
Name[kk]=%VMNAME%: Konsole
|
||||||
|
Name[km]=%VMNAME%: កុងសូល
|
||||||
|
Name[kn]=%VMNAME%: ಕನ್ಸೋಲ್
|
||||||
|
Name[ko]=%VMNAME%: Konsole
|
||||||
|
Name[ku]=%VMNAME%: Konsol
|
||||||
|
Name[lt]=%VMNAME%: Konsole
|
||||||
|
Name[lv]=%VMNAME%: Konsole
|
||||||
|
Name[mai]=%VMNAME%: कंसोल
|
||||||
|
Name[mk]=%VMNAME%: Конзола
|
||||||
|
Name[ml]=%VMNAME%: കണ്സോള്
|
||||||
|
Name[mr]=%VMNAME%: कंसोल
|
||||||
|
Name[ms]=%VMNAME%: Konsole
|
||||||
|
Name[nb]=%VMNAME%: Konsole
|
||||||
|
Name[nds]=%VMNAME%: Konsole
|
||||||
|
Name[ne]=%VMNAME%: कन्सोल
|
||||||
|
Name[nl]=%VMNAME%: Konsole
|
||||||
|
Name[nn]=%VMNAME%: Konsoll
|
||||||
|
Name[oc]=%VMNAME%: Konsole
|
||||||
|
Name[or]=%VMNAME%: କୋଲସୋଲ
|
||||||
|
Name[pa]=%VMNAME%: ਕਨਸੋਲ
|
||||||
|
Name[pl]=%VMNAME%: Konsola
|
||||||
|
Name[pt]=%VMNAME%: Konsole
|
||||||
|
Name[pt_BR]=%VMNAME%: Konsole
|
||||||
|
Name[ro]=%VMNAME%: Konsolă
|
||||||
|
Name[ru]=%VMNAME%: Konsole
|
||||||
|
Name[se]=%VMNAME%: Konsolla
|
||||||
|
Name[si]=%VMNAME%: Konsole
|
||||||
|
Name[sk]=%VMNAME%: Konzola
|
||||||
|
Name[sl]=%VMNAME%: Konzola
|
||||||
|
Name[sr]=%VMNAME%: Конзола
|
||||||
|
Name[sr@latin]=%VMNAME%: Konsole
|
||||||
|
Name[sv]=%VMNAME%: Konsole
|
||||||
|
Name[ta]=%VMNAME%: கான்சோல்
|
||||||
|
Name[te]=%VMNAME%: కాన్సోల్
|
||||||
|
Name[tg]=%VMNAME%: Консол
|
||||||
|
Name[th]=%VMNAME%: คอนโซล K
|
||||||
|
Name[tr]=%VMNAME%: Konsole
|
||||||
|
Name[uk]=%VMNAME%: Konsole
|
||||||
|
Name[uz]=%VMNAME%: Konsole
|
||||||
|
Name[uz@cyrillic]=%VMNAME%: Konsole
|
||||||
|
Name[vi]=%VMNAME%: Konsole
|
||||||
|
Name[wa]=%VMNAME%: Konsole
|
||||||
|
Name[xh]=%VMNAME%: Konsole
|
||||||
|
Name[x-test]=%VMNAME%: xxKonsolexx
|
||||||
|
Name[zh_CN]=%VMNAME%: Konsole
|
||||||
|
Name[zh_TW]=%VMNAME%: Konsole
|
||||||
|
|
||||||
|
GenericName=%VMNAME%: Terminal
|
||||||
|
GenericName[af]=%VMNAME%: Terminaal
|
||||||
|
GenericName[ar]=%VMNAME%: طرفيّة
|
||||||
|
GenericName[as]=%VMNAME%: টাৰ্মিনেল
|
||||||
|
GenericName[be@latin]=%VMNAME%: Terminał
|
||||||
|
GenericName[bg]=%VMNAME%: Терминал
|
||||||
|
GenericName[bn]=%VMNAME%: টার্মিনাল
|
||||||
|
GenericName[bn_IN]=%VMNAME%: টার্মিন্যাল
|
||||||
|
GenericName[ca]=%VMNAME%: Terminal
|
||||||
|
GenericName[ca@valencia]=%VMNAME%: Terminal
|
||||||
|
GenericName[cs]=%VMNAME%: Terminál
|
||||||
|
GenericName[csb]=%VMNAME%: Terminal
|
||||||
|
GenericName[da]=%VMNAME%: Terminal
|
||||||
|
GenericName[de]=%VMNAME%: Terminal
|
||||||
|
GenericName[el]=%VMNAME%: Τερματικό
|
||||||
|
GenericName[en_GB]=%VMNAME%: Terminal
|
||||||
|
GenericName[eo]=%VMNAME%: Terminalo
|
||||||
|
GenericName[es]=%VMNAME%: Terminal
|
||||||
|
GenericName[et]=%VMNAME%: Terminal
|
||||||
|
GenericName[eu]=%VMNAME%: Terminala
|
||||||
|
GenericName[fi]=%VMNAME%: Komentoikkuna
|
||||||
|
GenericName[fr]=%VMNAME%: Terminal
|
||||||
|
GenericName[fy]=%VMNAME%: Terminal
|
||||||
|
GenericName[ga]=%VMNAME%: Teirminéal
|
||||||
|
GenericName[gl]=%VMNAME%: Terminal
|
||||||
|
GenericName[gu]=%VMNAME%: ટર્મિનલ
|
||||||
|
GenericName[he]=%VMNAME%: מסוף
|
||||||
|
GenericName[hi]=%VMNAME%: टर्मिनल
|
||||||
|
GenericName[hne]=%VMNAME%: टर्मिनल
|
||||||
|
GenericName[hr]=%VMNAME%: Terminal
|
||||||
|
GenericName[hsb]=%VMNAME%: Terminal
|
||||||
|
GenericName[hu]=%VMNAME%: Terminál
|
||||||
|
GenericName[is]=%VMNAME%: Skjáhermir
|
||||||
|
GenericName[it]=%VMNAME%: Terminale
|
||||||
|
GenericName[ja]=%VMNAME%: ターミナル
|
||||||
|
GenericName[kk]=%VMNAME%: Терминал
|
||||||
|
GenericName[km]=%VMNAME%: ស្ថានីយ
|
||||||
|
GenericName[kn]=%VMNAME%: ಆದೇಶತೆರೆ (ಟರ್ಮಿನಲ್)
|
||||||
|
GenericName[ko]=%VMNAME%: 터미널
|
||||||
|
GenericName[ku]=%VMNAME%: Termînal
|
||||||
|
GenericName[lt]=%VMNAME%: Terminalas
|
||||||
|
GenericName[lv]=%VMNAME%: Terminālis
|
||||||
|
GenericName[mai]=%VMNAME%: टर्मिनल
|
||||||
|
GenericName[mk]=%VMNAME%: Терминал
|
||||||
|
GenericName[ml]=%VMNAME%: ടെര്മിനല്
|
||||||
|
GenericName[mr]=%VMNAME%: टर्मिनल
|
||||||
|
GenericName[nb]=%VMNAME%: Terminal
|
||||||
|
GenericName[nds]=%VMNAME%: Konsool
|
||||||
|
GenericName[nl]=%VMNAME%: Terminal
|
||||||
|
GenericName[nn]=%VMNAME%: Terminal
|
||||||
|
GenericName[or]=%VMNAME%: ଟର୍ମିନାଲ
|
||||||
|
GenericName[pa]=%VMNAME%: ਟਰਮੀਨਲ
|
||||||
|
GenericName[pl]=%VMNAME%: Terminal
|
||||||
|
GenericName[pt]=%VMNAME%: Terminal
|
||||||
|
GenericName[pt_BR]=%VMNAME%: Terminal
|
||||||
|
GenericName[ro]=%VMNAME%: Terminal
|
||||||
|
GenericName[ru]=%VMNAME%: Терминал
|
||||||
|
GenericName[se]=%VMNAME%: Terminal
|
||||||
|
GenericName[si]=%VMNAME%: Terminal
|
||||||
|
GenericName[sk]=%VMNAME%: Terminál
|
||||||
|
GenericName[sl]=%VMNAME%: Terminal
|
||||||
|
GenericName[sr]=%VMNAME%: Терминал
|
||||||
|
GenericName[sr@latin]=%VMNAME%: Terminal
|
||||||
|
GenericName[sv]=%VMNAME%: Terminal
|
||||||
|
GenericName[ta]=%VMNAME%: முனையம்
|
||||||
|
GenericName[te]=%VMNAME%: టెర్మినల్
|
||||||
|
GenericName[tg]=%VMNAME%: Терминал
|
||||||
|
GenericName[th]=%VMNAME%: เทอร์มินัล
|
||||||
|
GenericName[tr]=%VMNAME%: Uçbirim
|
||||||
|
GenericName[uk]=%VMNAME%: Термінал
|
||||||
|
GenericName[uz]=%VMNAME%: Terminal
|
||||||
|
GenericName[uz@cyrillic]=%VMNAME%: Терминал
|
||||||
|
GenericName[wa]=%VMNAME%: Terminå
|
||||||
|
GenericName[x-test]=%VMNAME%: xxTerminalxx
|
||||||
|
GenericName[zh_CN]=%VMNAME%: 终端
|
||||||
|
GenericName[zh_TW]=%VMNAME%: 終端機
|
||||||
|
X-DBUS-StartupType=Unique
|
||||||
|
X-KDE-AuthorizeAction=shell_access
|
||||||
|
Categories=Qt;KDE;System;TerminalEmulator;
|
||||||
|
X-Qubes-VmName=%VMNAME%
|
@ -0,0 +1,5 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=Directory
|
||||||
|
Name=%VMNAME% (VM)
|
||||||
|
Icon=%VMDIR%/icon.png
|
@ -0,0 +1,8 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Exec=(qvm-run -q --tray -a --user=root netvm "stalonetray --background white --geometry 100x40" && qvm-run -q netvm --user=root "/usr/bin/nm-applet &")
|
||||||
|
Icon=%VMDIR%/icon.png
|
||||||
|
Name=%VMNAME%: Show Tray
|
||||||
|
Categories=System
|
||||||
|
StartupNotify=false
|
||||||
|
X-Qubes-VmName=%VMNAME%
|
@ -0,0 +1,68 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
CLEANIMG=$1
|
||||||
|
NAME=$2
|
||||||
|
IS_NETVM=$3
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "usage $0 <clean_image_file> <template_name>"
|
||||||
|
echo "usage $0 <clean_image_file> <template_name> netvm"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x$CLEANIMG = x ]; then
|
||||||
|
echo "Image file not specified!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x$NAME = x ]; then
|
||||||
|
echo "Name not given!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ID=$(id -ur)
|
||||||
|
|
||||||
|
if [ $ID != 0 ] ; then
|
||||||
|
echo "This script should be run as root user."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
IMG=qubeized_images/$NAME-root.img
|
||||||
|
echo "--> Copying $CLEANIMG to $IMG..."
|
||||||
|
cp $CLEANIMG $IMG || exit 1
|
||||||
|
|
||||||
|
echo "--> Mouting $IMG"
|
||||||
|
|
||||||
|
mkdir -p mnt
|
||||||
|
mount -o loop,offset=$((63*512)) qubeized_images/$NAME-root.img mnt || exit 1
|
||||||
|
|
||||||
|
echo "--> Installing RPMs..."
|
||||||
|
rpm --force --root=$(pwd)/mnt -ihv rpms_to_install/*
|
||||||
|
|
||||||
|
|
||||||
|
echo "--> Copying the Apps Menu shortcuts..."
|
||||||
|
APPSORIG=qubeized_images/$NAME-apps.orig
|
||||||
|
APPSTEMPL=qubeized_images/$NAME-apps.templates
|
||||||
|
mkdir -p $APPSORIG
|
||||||
|
cp -r $(pwd)/mnt/usr/share/applications/* $APPSORIG
|
||||||
|
|
||||||
|
if [ x$IS_NETVM != x ]; then
|
||||||
|
if ! [ -d netvm/apps.templates ] ; then
|
||||||
|
echo "--> ERROR: Missing netvm/apps.templates directory."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "--> Createing the Apps Menu templates..."
|
||||||
|
./create_apps_templates.sh $APPSORIG $APPSTEMPL
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x$IS_NETVM == x ]; then
|
||||||
|
echo "--> Installing 3rd party apps"
|
||||||
|
./add_3rd_party_software.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "--> Unmounting $IMG"
|
||||||
|
umount mnt
|
||||||
|
|
||||||
|
echo "Qubeized image stored at: $IMG"
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
*
|
@ -0,0 +1 @@
|
|||||||
|
noarch/
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/kernel-2.6.32.9-1.pvops0.qubes.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/kernel-firmware-2.6.32.9-1.pvops0.qubes.noarch.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../core/rpm/x86_64/qubes-core-appvm-1.0.0-1.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../gui/rpm/x86_64/qubes-gui-vm-1.0.0-1.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../gui/rpm/x86_64/qubes-vchan-vm-{kernel-2.6.32.9-1.pvops0.qubes.x86_64}-1.0.0-1.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/xen-libs-3.4.2-2.qubes.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/xen-qubes-vm-essentials-3.4.2-2.qubes.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/bridge-utils-1.2-8.fc12.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/kernel-2.6.31.9-1.pvops0.qubes.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/kernel-firmware-2.6.31.9-1.pvops0.qubes.noarch.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../core/rpm/x86_64/qubes-core-netvm-1.0.0-1.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../gui/rpm/x86_64/qubes-gui-vm-1.0.0-1.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../gui/rpm/x86_64/qubes-vchan-vm-{kernel-2.6.31.9-1.pvops0.qubes.x86_64}-1.0.0-1.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/stalonetray-0.7.6-4.fc12.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/xen-libs-3.4.2-2.qubes.x86_64.rpm
|
@ -0,0 +1 @@
|
|||||||
|
../../rpms_3rd_party/xen-qubes-vm-essentials-3.4.2-2.qubes.x86_64.rpm
|
@ -0,0 +1,126 @@
|
|||||||
|
#
|
||||||
|
# This SPEC is for bulding RPM packages that contain complete Qubes Template files
|
||||||
|
# This includes the VM's root image, patched with all qubes rpms, etc
|
||||||
|
#
|
||||||
|
|
||||||
|
%{!?version: %define version %(cat version_appvm)}
|
||||||
|
|
||||||
|
Name: qubes-template-%{template_name}
|
||||||
|
Version: %{version}
|
||||||
|
Release: 1
|
||||||
|
Summary: Qubes template for %{template_name}
|
||||||
|
|
||||||
|
License: GPL
|
||||||
|
URL: http://www.qubes-os.org
|
||||||
|
Source: .
|
||||||
|
|
||||||
|
Requires: qubes-core-dom0 xdg-utils
|
||||||
|
|
||||||
|
%define _builddir %(pwd)
|
||||||
|
%define _rpmdir %(pwd)/rpm
|
||||||
|
%define dest_dir /var/lib/qubes/vm-templates/%{template_name}
|
||||||
|
|
||||||
|
%description
|
||||||
|
Qubes template for %{template_name}
|
||||||
|
|
||||||
|
%build
|
||||||
|
cd qubeized_images
|
||||||
|
rm -f root.img.part.*
|
||||||
|
tar --sparse -cf - %{template_name}-root.img | split -d -b 1G - root.img.part.
|
||||||
|
cd ..
|
||||||
|
./create_apps_for_templatevm.sh qubeized_images/%{template_name}-apps.templates/ %{template_name} %{dest_dir} qubeized_images/%{template_name}-apps
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}
|
||||||
|
for i in qubeized_images/root.img.part.* ; do ln $i $RPM_BUILD_ROOT/%{dest_dir}/`basename $i` ; done
|
||||||
|
touch $RPM_BUILD_ROOT/%{dest_dir}/root.img # we will create the real file in %post
|
||||||
|
touch $RPM_BUILD_ROOT/%{dest_dir}/private.img # we will create the real file in %post
|
||||||
|
|
||||||
|
cp vm_conf_files/appvm-template.conf $RPM_BUILD_ROOT/%{dest_dir}/appvm-template.conf
|
||||||
|
cp vm_conf_files/templatevm.conf $RPM_BUILD_ROOT/%{dest_dir}/templatevm.conf
|
||||||
|
sed -e s/%TEMPLATENAME%/%{template_name}/ < vm_conf_files/templatevm.conf >\
|
||||||
|
$RPM_BUILD_ROOT/%{dest_dir}/%{template_name}.conf
|
||||||
|
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}/kernels
|
||||||
|
cp vm_kernels/vmlinuz $RPM_BUILD_ROOT/%{dest_dir}/kernels/vmlinuz
|
||||||
|
cp vm_kernels/initramfs $RPM_BUILD_ROOT/%{dest_dir}/kernels/initramfs
|
||||||
|
|
||||||
|
cp vm_initramfs_patches/qubes_cow_setup.sh $RPM_BUILD_ROOT/%{dest_dir}/kernels/qubes_cow_setup.sh
|
||||||
|
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}/apps.templates
|
||||||
|
mkdir -p $RPM_BUILD_ROOT/%{dest_dir}/apps
|
||||||
|
cp -r qubeized_images/%{template_name}-apps.templates/* $RPM_BUILD_ROOT/%{dest_dir}/apps.templates
|
||||||
|
cp -r qubeized_images/%{template_name}-apps/* $RPM_BUILD_ROOT/%{dest_dir}/apps
|
||||||
|
touch $RPM_BUILD_ROOT/%{dest_dir}/icon.png
|
||||||
|
|
||||||
|
%post
|
||||||
|
echo "--> Processing the root.img... (this might take a while)"
|
||||||
|
cat %{dest_dir}/root.img.part.* | tar --sparse -xf - -C %{dest_dir}
|
||||||
|
rm -f %{dest_dir}/root.img.part.*
|
||||||
|
mv %{dest_dir}/%{template_name}-root.img %{dest_dir}/root.img
|
||||||
|
chown root.qubes %{dest_dir}/root.img
|
||||||
|
chmod 0660 %{dest_dir}/root.img
|
||||||
|
|
||||||
|
if [ "$1" = 1 ] ; then
|
||||||
|
# installing for the first time
|
||||||
|
echo "--> Creating private.img..."
|
||||||
|
truncate -s 2G %{dest_dir}/private.img
|
||||||
|
mkfs.ext4 -q -F %{dest_dir}/private.img
|
||||||
|
chown root.qubes %{dest_dir}/private.img
|
||||||
|
chmod 0660 %{dest_dir}/private.img
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
export XDG_DATA_DIRS=/usr/share/
|
||||||
|
if [ "$1" -gt 1 ] ; then
|
||||||
|
# upgrading already installed template...
|
||||||
|
echo "--> Removing previous menu shortcuts..."
|
||||||
|
xdg-desktop-menu uninstall --mode system %{dest_dir}/apps/*.directory %{dest_dir}/apps/*.desktop
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Instaling menu shortcuts..."
|
||||||
|
ln -sf /usr/share/qubes/icons/template.png %{dest_dir}/icon.png
|
||||||
|
xdg-desktop-menu install --mode system %{dest_dir}/apps/*.directory %{dest_dir}/apps/*.desktop
|
||||||
|
|
||||||
|
if [ "$1" = 1 ] ; then
|
||||||
|
# installing for the first time
|
||||||
|
qvm-add-template --rpm %{template_name}
|
||||||
|
fi
|
||||||
|
|
||||||
|
%preun
|
||||||
|
if [ "$1" = 0 ] ; then
|
||||||
|
# no more packages left
|
||||||
|
qvm-remove -q --just-db %{template_name}
|
||||||
|
|
||||||
|
# we need to have it here, because rpm -U <template>
|
||||||
|
# apparently executes %preun of the old package *after* %post of the new packages...
|
||||||
|
echo "--> Removing menu shortcuts..."
|
||||||
|
export XDG_DATA_DIRS=/usr/share/
|
||||||
|
xdg-desktop-menu uninstall --mode system %{dest_dir}/apps/*.directory %{dest_dir}/apps/*.desktop
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
%clean
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
|
||||||
|
%files
|
||||||
|
%defattr(660,root,qubes,770)
|
||||||
|
%dir %{dest_dir}
|
||||||
|
%ghost %{dest_dir}/root.img
|
||||||
|
%{dest_dir}/root.img.part.*
|
||||||
|
%ghost %{dest_dir}/private.img
|
||||||
|
%{dest_dir}/appvm-template.conf
|
||||||
|
%{dest_dir}/templatevm.conf
|
||||||
|
%{dest_dir}/%{template_name}.conf
|
||||||
|
%dir %{dest_dir}/kernels
|
||||||
|
%{dest_dir}/kernels/vmlinuz
|
||||||
|
%{dest_dir}/kernels/initramfs
|
||||||
|
%{dest_dir}/kernels/qubes_cow_setup.sh
|
||||||
|
%attr (775,root,qubes) %dir %{dest_dir}/apps
|
||||||
|
%attr (664,root,qubes) %{dest_dir}/apps/*
|
||||||
|
%attr (775,root,qubes) %dir %{dest_dir}/apps.templates
|
||||||
|
%attr (664,root,qubes) %{dest_dir}/apps.templates/*
|
||||||
|
%{dest_dir}/icon.png
|
@ -0,0 +1 @@
|
|||||||
|
1.0.0
|
@ -0,0 +1 @@
|
|||||||
|
1.0.0
|
@ -0,0 +1,23 @@
|
|||||||
|
#
|
||||||
|
# This is a Xen VM config file for AppVMs
|
||||||
|
#
|
||||||
|
|
||||||
|
kernel="%TEMPLATEDIR%/kernels/vmlinuz"
|
||||||
|
ramdisk="%TEMPLATEDIR%/kernels/initramfs"
|
||||||
|
extra="ro nomodeset rd_NO_PLYMOUTH 3"
|
||||||
|
root="/dev/mapper/dmroot"
|
||||||
|
|
||||||
|
memory = 400
|
||||||
|
name = "%VMNAME%"
|
||||||
|
|
||||||
|
disk = [ 'file:%TEMPLATEDIR%/root.img,xvda,r',
|
||||||
|
'file:%VMDIR%/private.img,xvdb,w',
|
||||||
|
'file:%VMDIR%/root-cow.img,xvdc,w',
|
||||||
|
'file:%VMDIR%/swap-cow.img,xvdd,w'
|
||||||
|
]
|
||||||
|
|
||||||
|
vcpus = 1
|
||||||
|
|
||||||
|
on_poweroff = 'destroy'
|
||||||
|
on_reboot = 'destroy'
|
||||||
|
on_crash = 'destroy'
|
@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# This is a Xen VM config file for the netvm
|
||||||
|
#
|
||||||
|
|
||||||
|
kernel="/var/lib/qubes/servicevms/%NETVMNAME%/kernels/vmlinuz"
|
||||||
|
ramdisk="/var/lib/qubes/servicevms/%NETVMNAME%/kernels/initramfs"
|
||||||
|
extra="ro nomodeset rd_NO_PLYMOUTH 3 pci=nomsi"
|
||||||
|
root="/dev/mapper/dmroot"
|
||||||
|
|
||||||
|
memory = 200
|
||||||
|
name = "%NETVMNAME%"
|
||||||
|
pci = [ %NETVMPCIDEVS% ]
|
||||||
|
|
||||||
|
disk = [ 'file:/var/lib/qubes/servicevms/%NETVMNAME%/root.img,xvda,w',
|
||||||
|
]
|
||||||
|
|
||||||
|
vcpus = 1
|
||||||
|
|
||||||
|
on_poweroff = 'destroy'
|
||||||
|
on_reboot = 'destroy'
|
||||||
|
on_crash = 'destroy'
|
@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# This is a Xen VM config file for the Template VM
|
||||||
|
#
|
||||||
|
|
||||||
|
kernel="/var/lib/qubes/vm-templates/%TEMPLATENAME%/kernels/vmlinuz"
|
||||||
|
ramdisk="/var/lib/qubes/vm-templates/%TEMPLATENAME%/kernels/initramfs"
|
||||||
|
extra="ro nomodeset rd_NO_PLYMOUTH 3"
|
||||||
|
root="/dev/mapper/dmroot"
|
||||||
|
|
||||||
|
memory = 400
|
||||||
|
name = "%TEMPLATENAME%"
|
||||||
|
|
||||||
|
disk = [ 'file:/var/lib/qubes/vm-templates/%TEMPLATENAME%/root.img,xvda,w',
|
||||||
|
'file:/var/lib/qubes/vm-templates/%TEMPLATENAME%/private.img,xvdb,w',
|
||||||
|
]
|
||||||
|
|
||||||
|
vcpus = 1
|
||||||
|
|
||||||
|
on_poweroff = 'destroy'
|
||||||
|
on_reboot = 'destroy'
|
||||||
|
on_crash = 'destroy'
|
@ -0,0 +1,37 @@
|
|||||||
|
#
|
||||||
|
# This file should be places in pre-mount directory in dracut's initramfs
|
||||||
|
#
|
||||||
|
|
||||||
|
#!/bin/sh
|
||||||
|
echo "Qubes initramfs script here:"
|
||||||
|
|
||||||
|
if [ -e /dev/mapper/dmroot ] ; then
|
||||||
|
die "Qubes: FATAL error: /dev/mapper/dmroot already exists?!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
modprobe xen-blkfront || echo "Qubes: Cannot load Xen Block Frontend..."
|
||||||
|
|
||||||
|
echo "Waiting for /dev/xvda* devices..."
|
||||||
|
while ! [ -e /dev/xvda ]; do sleep 0.1; done
|
||||||
|
while ! [ -e /dev/xvda1 ] ; do sleep 0.1; done
|
||||||
|
while ! [ -e /dev/xvda2 ] ; do sleep 0.1; done
|
||||||
|
|
||||||
|
if [ `blockdev --getro /dev/xvda` = 1 ] ; then
|
||||||
|
echo "Qubes: Doing COW setup for AppVM..."
|
||||||
|
|
||||||
|
while ! [ -e /dev/xvdc ]; do sleep 0.1; done
|
||||||
|
while ! [ -e /dev/xvdd ]; do sleep 0.1; done
|
||||||
|
|
||||||
|
echo "0 `blockdev --getsz /dev/xvda1` snapshot /dev/xvda1 /dev/xvdc P 16" | \
|
||||||
|
dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; }
|
||||||
|
echo "0 `blockdev --getsz /dev/xvda2` snapshot /dev/xvda2 /dev/xvdd P 16" | \
|
||||||
|
dmsetup create dmswap || { echo "Qubes: FATAL: cannot create dmswap!"; }
|
||||||
|
echo Qubes: done.
|
||||||
|
else
|
||||||
|
echo "Qubes: Doing R/W setup for TemplateVM..."
|
||||||
|
echo "0 `blockdev --getsz /dev/xvda1` linear /dev/xvda1 0" | \
|
||||||
|
dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; }
|
||||||
|
echo "0 `blockdev --getsz /dev/xvda2` linear /dev/xvda2 0" | \
|
||||||
|
dmsetup create dmswap || { echo "Qubes: FATAL: cannot create dmswap!"; exit 1; }
|
||||||
|
echo Qubes: done.
|
||||||
|
fi
|
@ -0,0 +1,2 @@
|
|||||||
|
initramfs-*
|
||||||
|
vmlinuz-*
|
@ -0,0 +1 @@
|
|||||||
|
initramfs-2.6.32.9-1.pvops0.qubes.x86_64.qubeized.img
|
@ -0,0 +1 @@
|
|||||||
|
vmlinuz-2.6.32.9-1.pvops0.qubes.x86_64
|
@ -0,0 +1,2 @@
|
|||||||
|
initramfs-*
|
||||||
|
vmlinuz-*
|
@ -0,0 +1 @@
|
|||||||
|
initramfs-2.6.31.9-1.pvops0.qubes.x86_64.qubeized.img
|
@ -0,0 +1 @@
|
|||||||
|
vmlinuz-2.6.31.9-1.pvops0.qubes.x86_64
|
Loading…
Reference in new issue