diff options
author | Michael Vogt <mvo@debian.org> | 2014-02-27 16:46:05 +0100 |
---|---|---|
committer | Michael Vogt <mvo@debian.org> | 2014-02-27 22:34:57 +0100 |
commit | ed9665aedf77b3b8345bd4ed33de7885738e29f0 (patch) | |
tree | 8fa63b4e39e614852fcf9a2047ed2e2aa8b3926d | |
parent | fc104da6a583736223b2f941e43a05ea26b63a7d (diff) |
initial version of apt-helper
-rw-r--r-- | apt-pkg/acquire-item.cc | 2 | ||||
-rw-r--r-- | cmdline/apt-helper.cc | 127 | ||||
-rw-r--r-- | cmdline/makefile | 7 | ||||
-rwxr-xr-x | debian/rules | 3 | ||||
-rw-r--r-- | debian/tests/run-tests | 1 | ||||
-rw-r--r-- | test/integration/framework | 43 | ||||
-rwxr-xr-x | test/integration/test-apt-https-no-redirect | 2 |
7 files changed, 148 insertions, 37 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 36bb48382..de03011bf 100644 --- a/apt-pkg/acquire-item.cc +++ b/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; diff --git a/cmdline/apt-helper.cc b/cmdline/apt-helper.cc new file mode 100644 index 000000000..c1c8b2178 --- /dev/null +++ b/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; +} + /*}}}*/ diff --git a/cmdline/makefile b/cmdline/makefile index f89192e10..c4a249cd6 100644 --- a/cmdline/makefile +++ b/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) diff --git a/debian/rules b/debian/rules index 1b3782ab6..eec016607 100755 --- a/debian/rules +++ b/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/* diff --git a/debian/tests/run-tests b/debian/tests/run-tests index 6dc4eaa93..e03db9b0c 100644 --- a/debian/tests/run-tests +++ b/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 diff --git a/test/integration/framework b/test/integration/framework index 99214ef73..911a4d742 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -111,6 +111,9 @@ aptftparchive() { runapt apt-ftparchive "$@"; } aptkey() { runapt apt-key "$@"; } aptmark() { runapt apt-mark "$@"; } apt() { runapt apt "$@"; } +apthelper() { + LD_LIBRARY_PATH=${APTHELPERBINDIR} ${APTHELPERBINDIR}/apt-helper "$@"; +} aptwebserver() { LD_LIBRARY_PATH=${APTWEBSERVERBINDIR} ${APTWEBSERVERBINDIR}/aptwebserver "$@"; } @@ -177,6 +180,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 +938,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 diff --git a/test/integration/test-apt-https-no-redirect b/test/integration/test-apt-https-no-redirect index c405d1167..0408c6832 100755 --- a/test/integration/test-apt-https-no-redirect +++ b/test/integration/test-apt-https-no-redirect @@ -19,6 +19,6 @@ msgtest 'normal https download works' downloadfile 'https://localhost:4433/pool/apt_1.0/changelog' changelog >/dev/null 2>/dev/null && 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 +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 || msgfail |