1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
/* #####################################################################
apt-helper - cmdline helpers
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
#include <config.h>
#include <apt-pkg/configuration.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-pkg/proxy.h>
#include <apt-private/acqprogress.h>
#include <apt-private/private-output.h>
#include <apt-private/private-download.h>
#include <apt-private/private-cmndline.h>
#include <iostream>
#include <string>
#include <vector>
#include <apti18n.h>
/*}}}*/
static bool DoAutoDetectProxy(CommandLine &CmdL)
{
if (CmdL.FileSize() != 2)
return _error->Error(_("Need one URL as argument"));
URI ServerURL(CmdL.FileList[1]);
AutoDetectProxy(ServerURL);
std::string SpecificProxy = _config->Find("Acquire::"+ServerURL.Access+"::Proxy::" + ServerURL.Host);
ioprintf(std::cout, "Using proxy '%s' for URL '%s'\n",
SpecificProxy.c_str(), std::string(ServerURL).c_str());
return true;
}
static 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);
size_t fileind = 0;
std::vector<std::string> targetfiles;
while (fileind + 2 <= CmdL.FileSize())
{
std::string download_uri = CmdL.FileList[fileind + 1];
std::string targetfile = CmdL.FileList[fileind + 2];
std::string hash;
if (CmdL.FileSize() > fileind + 3)
hash = CmdL.FileList[fileind + 3];
// we use download_uri as descr and targetfile as short-descr
new pkgAcqFile(&Fetcher, download_uri, hash, 0, download_uri, targetfile,
"dest-dir-ignored", targetfile);
targetfiles.push_back(targetfile);
fileind += 3;
}
bool Failed = false;
if (AcquireRun(Fetcher, 0, &Failed, NULL) == false || Failed == true)
return _error->Error(_("Download Failed"));
if (targetfiles.empty() == false)
for (std::vector<std::string>::const_iterator f = targetfiles.begin(); f != targetfiles.end(); ++f)
if (FileExists(*f) == false)
return _error->Error(_("Download Failed"));
return true;
}
static bool ShowHelp(CommandLine &)
{
ioprintf(std::cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
COMMON_ARCH,__DATE__,__TIME__);
if (_config->FindB("version") == true)
return true;
std::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"
" auto-detect-proxy - detect proxy using apt.conf\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},
{"auto-detect-proxy", &DoAutoDetectProxy},
{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;
}
/*}}}*/
|