Преглед изворни кода

initial version of apt-helper

Michael Vogt пре 12 година
родитељ
комит
e43a426e5d

+ 1 - 1
apt-pkg/acquire-item.cc

@@ -2201,7 +2201,7 @@ pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash,
    if (stat(DestFile.c_str(),&Buf) == 0)
    {
       // Hmm, the partial file is too big, erase it
-      if ((unsigned long long)Buf.st_size > Size)
+      if ((Size > 0) && (unsigned long long)Buf.st_size > Size)
 	 unlink(DestFile.c_str());
       else
 	 PartialSize = Buf.st_size;

+ 127 - 0
cmdline/apt-helper.cc

@@ -0,0 +1,127 @@
+// -*- mode: cpp; mode: fold -*-
+// Description								/*{{{*/
+/* #####################################################################
+   apt-helper - cmdline helpers
+   ##################################################################### */
+									/*}}}*/
+// Include Files							/*{{{*/
+#include <config.h>
+
+#include <apt-pkg/cmndline.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/init.h>
+#include <apt-pkg/strutl.h>
+#include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/acquire.h>
+#include <apt-pkg/acquire-item.h>
+
+#include <apt-private/acqprogress.h>
+#include <apt-private/private-output.h>
+#include <apt-private/private-cmndline.h>
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+
+
+
+#include <apti18n.h>
+									/*}}}*/
+using namespace std;
+
+bool DoDownloadFile(CommandLine &CmdL)
+{
+   if (CmdL.FileSize() <= 2)
+      return _error->Error(_("Must specify at least one pair url/filename"));
+
+
+   pkgAcquire Fetcher;
+   AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet",0));
+   Fetcher.Setup(&Stat);
+   std::string download_uri = CmdL.FileList[1];
+   std::string targetfile = CmdL.FileList[2];
+   new pkgAcqFile(&Fetcher, download_uri, "", 0, "desc", "short-desc", 
+                  "dest-dir-ignored", targetfile);
+   Fetcher.Run();
+   if (!FileExists(targetfile))
+   {
+      _error->Error(_("Download Failed"));
+      return false;
+   }
+   return true;
+}
+
+bool ShowHelp(CommandLine &CmdL)
+{
+   ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
+	    COMMON_ARCH,__DATE__,__TIME__);
+
+   if (_config->FindB("version") == true)
+     return true;
+
+   cout << 
+    _("Usage: apt-helper [options] command\n"
+      "       apt-helper [options] download-file uri target-path\n"
+      "\n"
+      "apt-helper is a internal helper for apt\n"
+      "\n"
+      "Commands:\n"
+      "   download-file - download the given uri to the target-path\n"
+      "\n"
+      "                       This APT helper has Super Meep Powers.\n");
+   return true;
+}
+
+
+int main(int argc,const char *argv[])					/*{{{*/
+{
+   CommandLine::Dispatch Cmds[] = {{"help",&ShowHelp},
+				   {"download-file", &DoDownloadFile},
+                                   {0,0}};
+
+   std::vector<CommandLine::Args> Args = getCommandArgs(
+      "apt-download", CommandLine::GetCommand(Cmds, argc, argv));
+
+   // Set up gettext support
+   setlocale(LC_ALL,"");
+   textdomain(PACKAGE);
+
+   // Parse the command line and initialize the package library
+   CommandLine CmdL(Args.data(),_config);
+   if (pkgInitConfig(*_config) == false ||
+       CmdL.Parse(argc,argv) == false ||
+       pkgInitSystem(*_config,_system) == false)
+   {
+      if (_config->FindB("version") == true)
+	 ShowHelp(CmdL);
+      _error->DumpErrors();
+      return 100;
+   }
+
+   // See if the help should be shown
+   if (_config->FindB("help") == true ||
+       _config->FindB("version") == true ||
+       CmdL.FileSize() == 0)
+   {
+      ShowHelp(CmdL);
+      return 0;
+   }
+
+   InitOutput();
+
+   // Match the operation
+   CmdL.DispatchArg(Cmds);
+
+   // Print any errors or warnings found during parsing
+   bool const Errors = _error->PendingError();
+   if (_config->FindI("quiet",0) > 0)
+      _error->DumpErrors();
+   else
+      _error->DumpErrors(GlobalError::DEBUG);
+   return Errors == true ? 100 : 0;
+}
+									/*}}}*/

+ 7 - 0
cmdline/makefile

@@ -47,6 +47,13 @@ LIB_MAKES = apt-pkg/makefile
 SOURCE = apt-mark.cc
 include $(PROGRAM_H)
 
+# The apt-helper
+PROGRAM=apt-helper
+SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile
+SOURCE = apt-helper.cc
+include $(PROGRAM_H)
+
 # The apt-report-mirror-failure program
 #SOURCE=apt-report-mirror-failure
 #TO=$(BIN)

+ 3 - 0
debian/rules

@@ -207,6 +207,9 @@ apt: build-binary build-manpages debian/apt.install
 	#mv debian/$@/usr/bin/apt-report-mirror-failure \
 	#   debian/$@/usr/lib/apt/apt-report-mirror-failure \
 
+	# move the apt-helper in place
+	mv debian/$@/usr/bin/apt-helper debian/$@/usr/lib/apt/apt-helper 
+
 	dh_bugfiles -p$@
 	dh_lintian -p$@
 	dh_installexamples -p$@ $(BLD)/docs/examples/*

+ 1 - 0
debian/tests/run-tests

@@ -14,5 +14,6 @@ make -C test/interactive-helper/
 # run against the installed apt
 APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR=$(pwd)/build/bin \
 APT_INTEGRATION_TESTS_METHODS_DIR=/usr/lib/apt/methods \
+APT_INTEGRATION_TESTS_LIBEXEC_DIR=/usr/lib/apt/ \
 APT_INTEGRATION_TESTS_BUILD_DIR=/usr/bin \
 ./test/integration/run-tests

+ 18 - 51
test/integration/framework

@@ -90,18 +90,18 @@ msgdone() {
 		echo "${CDONE}DONE${CNORMAL}";
 	fi
 }
-
+getaptconfig() {
+	if [ -f ./aptconfig.conf ]; then
+            echo "./aptconfig.conf"
+	elif [ -f ../aptconfig.conf ]; then
+            echo "../aptconfig.conf"
+        fi
+}
 runapt() {
 	msgdebug "Executing: ${CCMD}$*${CDEBUG} "
 	local CMD="$1"
 	shift
-	if [ -f ./aptconfig.conf ]; then
-		MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
-	elif [ -f ../aptconfig.conf ]; then
-		MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
-	else
-		MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
-	fi
+	MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
 }
 aptconfig() { runapt apt-config "$@"; }
 aptcache() { runapt apt-cache "$@"; }
@@ -111,6 +111,9 @@ aptftparchive() { runapt apt-ftparchive "$@"; }
 aptkey() { runapt apt-key "$@"; }
 aptmark() { runapt apt-mark "$@"; }
 apt() { runapt apt "$@"; }
+apthelper() { 
+  APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${APTHELPERBINDIR} ${APTHELPERBINDIR}/apt-helper "$@";
+}
 aptwebserver() {
   LD_LIBRARY_PATH=${APTWEBSERVERBINDIR} ${APTWEBSERVERBINDIR}/aptwebserver "$@";
 }
@@ -118,17 +121,11 @@ dpkg() {
 	command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
 }
 aptitude() {
-	if [ -f ./aptconfig.conf ]; then
-		APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY}  command aptitude "$@"
-	elif [ -f ../aptconfig.conf ]; then
-		APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command aptitude "$@"
-	else
-		LD_LIBRARY_PATH=${BUILDDIRECTORY}  command aptitude "$@"
-	fi
+	APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${BUILDDIRECTORY}  command aptitude "$@"
 }
 gdb() {
 	echo "gdb: run »$*«"
-	APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command gdb ${BUILDDIRECTORY}/$1 --args "$@"
+	APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${BUILDDIRECTORY} command gdb ${BUILDDIRECTORY}/$1 --args "$@"
 }
 http() {
 	LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/methods/http
@@ -177,6 +174,7 @@ setupenvironment() {
         # allow overriding the default BUILDDIR location
 	BUILDDIRECTORY=${APT_INTEGRATION_TESTS_BUILD_DIR:-"${TESTDIRECTORY}/../../build/bin"}
         METHODSDIR=${APT_INTEGRATION_TESTS_METHODS_DIR:-"${BUILDDIRECTORY}/methods"}
+        APTHELPERBINDIR=${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"}
         APTWEBSERVERBINDIR=${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}"}
 	test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first"
         # -----
@@ -934,41 +932,10 @@ changetocdrom() {
 }
 
 downloadfile() {
-	PROTO="$(echo "$1" | cut -d':' -f 1)"
-        if [ ! -x "${METHODSDIR}/${PROTO}" ]; then
-            msgwarn "can not find ${METHODSDIR}/${PROTO}"
-            return 1
-        fi
-	local DOWNLOG="${TMPWORKINGDIRECTORY}/download.log"
-	rm -f "$DOWNLOG"
-	touch "$DOWNLOG"
-	{
-		echo "601 Configuration
-Config-Item: Acquire::https::CaInfo=${TESTDIR}/apt.pem
-Config-Item: Debug::Acquire::${PROTO}=1
-
-600 Acquire URI
-URI: $1
-Filename: ${2}
-"
-		# simple worker keeping stdin open until we are done (201) or error (400)
-		# and requesting new URIs on try-agains/redirects in-between
-		{ tail -n 999 -f "$DOWNLOG" & echo "TAILPID: $!"; } | while read f1 f2; do
-			if [ "$f1" = 'TAILPID:' ]; then
-				TAILPID="$f2"
-			elif [ "$f1" = 'New-URI:' ]; then
-				echo "600 Acquire URI
-URI: $f2
-Filename: ${2}
-"
-			elif [ "$f1" = '201' ] || [ "$f1" = '400' ]; then
-				# tail would only die on next read – which never happens
-				test -z "$TAILPID" || kill -s HUP "$TAILPID"
-				break
-			fi
-		done
-	} | LD_LIBRARY_PATH=${BUILDDIRECTORY} ${METHODSDIR}/${PROTO} 2>&1 | tee "$DOWNLOG"
-	rm "$DOWNLOG"
+        PROTO="$(echo "$1" | cut -d':' -f 1)"
+        apthelper -o Acquire::https::CaInfo=${TESTDIR}/apt.pem \
+                  -o Debug::Acquire::${PROTO}=1 \
+                  download-file "$1" "$2" 2>&1
 	# only if the file exists the download was successful
 	if [ -e "$2" ]; then
 		return 0

+ 17 - 3
test/integration/test-apt-https-no-redirect

@@ -12,13 +12,27 @@ setupaptarchive --no-update
 
 changetohttpswebserver  -o 'aptwebserver::redirect::replace::/redirectme/=http://localhost:8080/'
 
+DOWNLOG='download-testfile.log'
 msgtest 'normal http download works'
-downloadfile 'http://localhost:8080/pool/apt_1.0/changelog' changelog2 >/dev/null 2>/dev/null && msgpass || msgfail
+downloadfile 'http://localhost:8080/pool/apt_1.0/changelog' changelog2 > "$DOWNLOG" && msgpass || msgfail
 
 msgtest 'normal https download works'
-downloadfile 'https://localhost:4433/pool/apt_1.0/changelog' changelog >/dev/null 2>/dev/null && msgpass || msgfail
+downloadfile 'https://localhost:4433/pool/apt_1.0/changelog' changelog > "$DOWNLOG" && msgpass || msgfail
 
 msgtest 'redirecting https to http does not work'
-downloadfile 'https://localhost:4433/redirectme/pool/apt_1.0/changelog' changelog3 2>&1 | grep "Protocol http not supported or disabled in libcurl" > /dev/null && msgpass
+if ! downloadfile 'https://localhost:4433/redirectme/pool/apt_1.0/changelog' changelog3 > "$DOWNLOG"; then
+    msgpass
+else
+    cat >&2 "$DOWNLOG"
+    msgfail
+fi
+    
+msgtest 'https methods given proper error on redirect attempt'
+if grep -q 'Protocol http not supported or disabled in libcurl' "$DOWNLOG"; then
+    msgpass
+else
+    cat >&2 "$DOWNLOG"
+    msgfail
+fi