From ff77c78ecc570e001ba1dd9069c1bdc3b3ee59bd Mon Sep 17 00:00:00 2001 From: Rusty Bird Date: Wed, 25 Jul 2018 12:44:53 +0000 Subject: [PATCH] Unify qvm-{copy,move}-to-vm.{gnome,kde} and fix some bugs - Symlink the other three tools to qvm-copy-to-vm.gnome, use the same code where possible, and select differing behavior based on invoked name (like the CLI tools). This brings qvm-move-to-vm.kde up to date for R4.0 (bugfix on 89183e9). - Get rid of a window focus race between zenity/kdialog and the qubes.Filecopy dom0 permission dialog: Only launch the GUI after the first line has been read from qfile-agent. - Avoid visual glitches (e.g. for a non-existing file) by special-casing a no-op progress function for $SIZE == 0. - Pass -- separator between 'rm -rf' and the files to be removed, in case someone or something ever invokes the tool on relative file names starting with a dash. - Pass -b (implies --apparent-size) and -s to du, to simplify percentage calculation and to avoid unnecessary output. --- Makefile | 6 ++-- qubes-rpc/qvm-copy-to-vm.gnome | 48 ++++++++++++++++++++++++------ qubes-rpc/qvm-copy-to-vm.kde | 47 ----------------------------- qubes-rpc/qvm-move-to-vm.gnome | 35 ---------------------- qubes-rpc/qvm-move-to-vm.kde | 54 ---------------------------------- 5 files changed, 42 insertions(+), 148 deletions(-) delete mode 100755 qubes-rpc/qvm-copy-to-vm.kde delete mode 100755 qubes-rpc/qvm-move-to-vm.gnome delete mode 100755 qubes-rpc/qvm-move-to-vm.kde diff --git a/Makefile b/Makefile index a99ef4d..366c51d 100644 --- a/Makefile +++ b/Makefile @@ -241,10 +241,10 @@ install-common: install-doc install qubes-rpc/qvm-copy $(DESTDIR)/usr/bin ln -s qvm-copy-to-vm $(DESTDIR)/usr/bin/qvm-move-to-vm ln -s qvm-copy $(DESTDIR)/usr/bin/qvm-move - install qubes-rpc/qvm-copy-to-vm.kde $(DESTDIR)$(LIBDIR)/qubes install qubes-rpc/qvm-copy-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes - install qubes-rpc/qvm-move-to-vm.kde $(DESTDIR)$(LIBDIR)/qubes - install qubes-rpc/qvm-move-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes + ln -s qvm-copy-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes/qvm-move-to-vm.gnome + ln -s qvm-copy-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes/qvm-copy-to-vm.kde + ln -s qvm-copy-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes/qvm-move-to-vm.kde install qubes-rpc/qvm-actions.sh $(DESTDIR)$(LIBDIR)/qubes install -m 0644 misc/uca_qubes.xml $(DESTDIR)$(LIBDIR)/qubes mkdir -p $(DESTDIR)/etc/xdg/xfce4/xfconf/xfce-perchannel-xml diff --git a/qubes-rpc/qvm-copy-to-vm.gnome b/qubes-rpc/qvm-copy-to-vm.gnome index 1d01581..d603342 100755 --- a/qubes-rpc/qvm-copy-to-vm.gnome +++ b/qubes-rpc/qvm-copy-to-vm.gnome @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # The Qubes OS Project, http://www.qubes-os.org # @@ -20,13 +20,43 @@ # # -SIZE=$(du --apparent-size -c -- "$@" 2>/dev/null | tail -1 | cut -f 1) +SIZE=$(du -bcs -- "$@" 2>/dev/null | tail -n 1 | cut -f 1) +set -e -o pipefail -export PROGRESS_TYPE=gui +if [[ $SIZE == 0 ]]; then + progress() { + cat >/dev/null + } +elif [[ $0 == *.kde ]] && command -v kdialog >/dev/null; then + progress() { + (while read -r CURRSIZE; do + if [[ $CURRSIZE == 0 ]]; then + # shellcheck disable=SC2207 + REF=( $(kdialog --progressbar "$DESCRIPTION") ) + trap 'qdbus "${REF[@]}" close' EXIT # for this subshell + qdbus "${REF[@]}" Set "" maximum "$SIZE" + fi -# shellcheck disable=SC2016 -/usr/lib/qubes/qrexec-client-vm '$default' qubes.Filecopy /usr/lib/qubes/qfile-agent "$@" | -(while read -r sentsize ; do - CURRSIZE=$((sentsize / 1024)) - echo $((100 * CURRSIZE / SIZE)) -done) | zenity --progress --text="Copying files..." --auto-close + qdbus "${REF[@]}" Set "" value "$CURRSIZE" + done) >/dev/null # hide qdbus's empty output lines + } +else + progress() { + while read -r CURRSIZE; do + echo $((100 * CURRSIZE / SIZE)) + done | { + read -r # wait for first line (always "0") and throw it away + zenity --progress --text="$DESCRIPTION" --auto-close + } + } +fi + +if [[ ${0##*/} == qvm-move-to-vm.* ]]; then + DESCRIPTION="Moving files..." + trap '[[ $? == 0 ]] && rm -rf -- "$@"' EXIT +else + DESCRIPTION="Copying files..." +fi + +PROGRESS_TYPE=gui /usr/lib/qubes/qrexec-client-vm \$default qubes.Filecopy \ + /usr/lib/qubes/qfile-agent "$@" | progress diff --git a/qubes-rpc/qvm-copy-to-vm.kde b/qubes-rpc/qvm-copy-to-vm.kde deleted file mode 100755 index 181f302..0000000 --- a/qubes-rpc/qvm-copy-to-vm.kde +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# The Qubes OS Project, http://www.qubes-os.org -# -# Copyright (C) 2010 Rafal Wojtczuk -# -# 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. -# -# -if command -v kdialog 2> /dev/null; then - SIZE=$(du --apparent-size -c -- "$@" 2> /dev/null | tail -1 | cut -f 1) - REF=$(kdialog --progressbar "Copy progress") - # shellcheck disable=SC2086 - qdbus $REF org.freedesktop.DBus.Properties.Set "" maximum "$SIZE" - - export PROGRESS_TYPE=gui - - # shellcheck disable=SC2016 - /usr/lib/qubes/qrexec-client-vm '$default' qubes.Filecopy \ - /usr/lib/qubes/qfile-agent "$@" | - (while read -r sentsize ; do - CURRSIZE=$((sentsize / 1024)) - # shellcheck disable=SC2086 - qdbus $REF org.freedesktop.DBus.Properties.Set "" value "$CURRSIZE" - done) - - # shellcheck disable=SC2086 - qdbus $REF close - # we do not want a dozen error messages, do we - # if ! [ "x"$agentstatus = xDONE ] ; then - # kdialog --sorry 'Abnormal file copy termination; see /var/log/qubes/qrexec.xid.log in dom0 for more details' - # fi -else - exec /usr/lib/qubes/qvm-copy-to-vm.gnome "$@" -fi diff --git a/qubes-rpc/qvm-move-to-vm.gnome b/qubes-rpc/qvm-move-to-vm.gnome deleted file mode 100755 index 1385c9f..0000000 --- a/qubes-rpc/qvm-move-to-vm.gnome +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# -# The Qubes OS Project, http://www.qubes-os.org -# -# Copyright (C) 2010 Rafal Wojtczuk -# -# 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. -# -# - -SIZE=$(du --apparent-size -c -- "$@" 2>/dev/null | tail -1 | cut -f 1) - -export PROGRESS_TYPE=gui - -set -o pipefail -set -e -# shellcheck disable=SC2016 -/usr/lib/qubes/qrexec-client-vm '$default' qubes.Filecopy /usr/lib/qubes/qfile-agent "$@" | -(while read -r sentsize ; do - CURRSIZE=$((sentsize / 1024)) - echo $((100 * CURRSIZE / SIZE)) -done) | zenity --progress --text="Moving files..." --auto-close -rm -rf "$@" diff --git a/qubes-rpc/qvm-move-to-vm.kde b/qubes-rpc/qvm-move-to-vm.kde deleted file mode 100755 index 9ea3493..0000000 --- a/qubes-rpc/qvm-move-to-vm.kde +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -# -# The Qubes OS Project, http://www.qubes-os.org -# -# Copyright (C) 2010 Rafal Wojtczuk -# -# 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. -# -# -if type kdialog 2> /dev/null; then - VM=$(kdialog -inputbox "Enter the VM name to send files to:") - if [ "X$VM" = X ] ; then exit 0 ; fi - - SIZE=$(du --apparent-size -c -- "$@" 2> /dev/null | tail -1 | cut -f 1) - REF=$(kdialog --progressbar "Move progress") - # shellcheck disable=SC2086 - qdbus $REF org.freedesktop.DBus.Properties.Set "" maximum "$SIZE" - - export PROGRESS_TYPE=gui - - set -o pipefail - /usr/lib/qubes/qrexec-client-vm "$VM" qubes.Filecopy \ - /usr/lib/qubes/qfile-agent "$@" | - (while read -r sentsize ; do - CURRSIZE=$((sentsize / 1024)) - # shellcheck disable=SC2086 - qdbus $REF org.freedesktop.DBus.Properties.Set "" value "$CURRSIZE" - done) - # shellcheck disable=SC2181 - if [ $? -eq 0 ]; then - rm -rf "$@" - fi - - # shellcheck disable=SC2086 - qdbus $REF close - # we do not want a dozen error messages, do we - # if ! [ "x"$agentstatus = xDONE ] ; then - # kdialog --sorry 'Abnormal file copy termination; see /var/log/qubes/qrexec.xid.log in dom0 for more details' - # fi -else - exec /usr/lib/qubes/qvm-move-to-vm.gnome "$@" -fi