forked from lix-project/lix
commit
3871131308
|
@ -30,23 +30,7 @@ using namespace std::string_literals;
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
struct DownloadSettings : Config
|
DownloadSettings downloadSettings;
|
||||||
{
|
|
||||||
Setting<bool> enableHttp2{this, true, "http2",
|
|
||||||
"Whether to enable HTTP/2 support."};
|
|
||||||
|
|
||||||
Setting<std::string> userAgentSuffix{this, "", "user-agent-suffix",
|
|
||||||
"String appended to the user agent in HTTP requests."};
|
|
||||||
|
|
||||||
Setting<size_t> httpConnections{this, 25, "http-connections",
|
|
||||||
"Number of parallel HTTP connections.",
|
|
||||||
{"binary-caches-parallel-connections"}};
|
|
||||||
|
|
||||||
Setting<unsigned long> connectTimeout{this, 0, "connect-timeout",
|
|
||||||
"Timeout for connecting to servers during downloads. 0 means use curl's builtin default."};
|
|
||||||
};
|
|
||||||
|
|
||||||
static DownloadSettings downloadSettings;
|
|
||||||
|
|
||||||
static GlobalConfig::Register r1(&downloadSettings);
|
static GlobalConfig::Register r1(&downloadSettings);
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,34 @@
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
struct DownloadSettings : Config
|
||||||
|
{
|
||||||
|
Setting<bool> enableHttp2{this, true, "http2",
|
||||||
|
"Whether to enable HTTP/2 support."};
|
||||||
|
|
||||||
|
Setting<std::string> userAgentSuffix{this, "", "user-agent-suffix",
|
||||||
|
"String appended to the user agent in HTTP requests."};
|
||||||
|
|
||||||
|
Setting<size_t> httpConnections{this, 25, "http-connections",
|
||||||
|
"Number of parallel HTTP connections.",
|
||||||
|
{"binary-caches-parallel-connections"}};
|
||||||
|
|
||||||
|
Setting<unsigned long> connectTimeout{this, 0, "connect-timeout",
|
||||||
|
"Timeout for connecting to servers during downloads. 0 means use curl's builtin default."};
|
||||||
|
|
||||||
|
Setting<unsigned int> tries{this, 5, "download-attempts",
|
||||||
|
"How often Nix will attempt to download a file before giving up."};
|
||||||
|
};
|
||||||
|
|
||||||
|
extern DownloadSettings downloadSettings;
|
||||||
|
|
||||||
struct DownloadRequest
|
struct DownloadRequest
|
||||||
{
|
{
|
||||||
std::string uri;
|
std::string uri;
|
||||||
std::string expectedETag;
|
std::string expectedETag;
|
||||||
bool verifyTLS = true;
|
bool verifyTLS = true;
|
||||||
bool head = false;
|
bool head = false;
|
||||||
size_t tries = 5;
|
size_t tries = downloadSettings.tries;
|
||||||
unsigned int baseRetryTimeMs = 250;
|
unsigned int baseRetryTimeMs = 250;
|
||||||
ActivityId parentAct;
|
ActivityId parentAct;
|
||||||
bool decompress = true;
|
bool decompress = true;
|
||||||
|
|
|
@ -255,7 +255,7 @@ public:
|
||||||
"Secret keys with which to sign local builds."};
|
"Secret keys with which to sign local builds."};
|
||||||
|
|
||||||
Setting<unsigned int> tarballTtl{this, 60 * 60, "tarball-ttl",
|
Setting<unsigned int> tarballTtl{this, 60 * 60, "tarball-ttl",
|
||||||
"How soon to expire files fetched by builtins.fetchTarball and builtins.fetchurl."};
|
"How long downloaded files are considered up-to-date."};
|
||||||
|
|
||||||
Setting<bool> requireSigs{this, true, "require-sigs",
|
Setting<bool> requireSigs{this, true, "require-sigs",
|
||||||
"Whether to check that any non-content-addressed path added to the "
|
"Whether to check that any non-content-addressed path added to the "
|
||||||
|
|
|
@ -84,7 +84,6 @@ protected:
|
||||||
try {
|
try {
|
||||||
DownloadRequest request(cacheUri + "/" + path);
|
DownloadRequest request(cacheUri + "/" + path);
|
||||||
request.head = true;
|
request.head = true;
|
||||||
request.tries = 5;
|
|
||||||
getDownloader()->download(request);
|
getDownloader()->download(request);
|
||||||
return true;
|
return true;
|
||||||
} catch (DownloadError & e) {
|
} catch (DownloadError & e) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ Logger * logger = makeDefaultLogger();
|
||||||
|
|
||||||
void Logger::warn(const std::string & msg)
|
void Logger::warn(const std::string & msg)
|
||||||
{
|
{
|
||||||
log(lvlInfo, ANSI_RED "warning:" ANSI_NORMAL " " + msg);
|
log(lvlWarn, ANSI_RED "warning:" ANSI_NORMAL " " + msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
class SimpleLogger : public Logger
|
class SimpleLogger : public Logger
|
||||||
|
@ -46,6 +46,7 @@ public:
|
||||||
char c;
|
char c;
|
||||||
switch (lvl) {
|
switch (lvl) {
|
||||||
case lvlError: c = '3'; break;
|
case lvlError: c = '3'; break;
|
||||||
|
case lvlWarn: c = '4'; break;
|
||||||
case lvlInfo: c = '5'; break;
|
case lvlInfo: c = '5'; break;
|
||||||
case lvlTalkative: case lvlChatty: c = '6'; break;
|
case lvlTalkative: case lvlChatty: c = '6'; break;
|
||||||
default: c = '7';
|
default: c = '7';
|
||||||
|
|
|
@ -6,6 +6,7 @@ namespace nix {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
lvlError = 0,
|
lvlError = 0,
|
||||||
|
lvlWarn,
|
||||||
lvlInfo,
|
lvlInfo,
|
||||||
lvlTalkative,
|
lvlTalkative,
|
||||||
lvlChatty,
|
lvlChatty,
|
||||||
|
|
|
@ -8,19 +8,52 @@
|
||||||
#include "shared.hh"
|
#include "shared.hh"
|
||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
#include "progress-bar.hh"
|
#include "progress-bar.hh"
|
||||||
|
#include "download.hh"
|
||||||
#include "finally.hh"
|
#include "finally.hh"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
|
||||||
extern std::string chrootHelperName;
|
extern std::string chrootHelperName;
|
||||||
|
|
||||||
void chrootHelper(int argc, char * * argv);
|
void chrootHelper(int argc, char * * argv);
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
/* Check if we have a non-loopback/link-local network interface. */
|
||||||
|
static bool haveInternet()
|
||||||
|
{
|
||||||
|
struct ifaddrs * addrs;
|
||||||
|
|
||||||
|
if (getifaddrs(&addrs))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Finally free([&]() { freeifaddrs(addrs); });
|
||||||
|
|
||||||
|
for (auto i = addrs; i; i = i->ifa_next) {
|
||||||
|
if (!i->ifa_addr) continue;
|
||||||
|
if (i->ifa_addr->sa_family == AF_INET) {
|
||||||
|
if (ntohl(((sockaddr_in *) i->ifa_addr)->sin_addr.s_addr) != INADDR_LOOPBACK) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (i->ifa_addr->sa_family == AF_INET6) {
|
||||||
|
if (!IN6_IS_ADDR_LOOPBACK(((sockaddr_in6 *) i->ifa_addr)->sin6_addr.s6_addr) &&
|
||||||
|
!IN6_IS_ADDR_LINKLOCAL(((sockaddr_in6 *) i->ifa_addr)->sin6_addr.s6_addr))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::string programPath;
|
std::string programPath;
|
||||||
|
|
||||||
struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
||||||
{
|
{
|
||||||
bool printBuildLogs = false;
|
bool printBuildLogs = false;
|
||||||
|
bool useNet = true;
|
||||||
|
|
||||||
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
|
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
|
||||||
{
|
{
|
||||||
|
@ -53,6 +86,11 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
||||||
.longName("version")
|
.longName("version")
|
||||||
.description("show version information")
|
.description("show version information")
|
||||||
.handler([&]() { printVersion(programName); });
|
.handler([&]() { printVersion(programName); });
|
||||||
|
|
||||||
|
mkFlag()
|
||||||
|
.longName("no-net")
|
||||||
|
.description("disable substituters and consider all previously downloaded files up-to-date")
|
||||||
|
.handler([&]() { useNet = false; });
|
||||||
}
|
}
|
||||||
|
|
||||||
void printFlags(std::ostream & out) override
|
void printFlags(std::ostream & out) override
|
||||||
|
@ -103,7 +141,7 @@ void mainWrapped(int argc, char * * argv)
|
||||||
if (legacy) return legacy(argc, argv);
|
if (legacy) return legacy(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
verbosity = lvlError;
|
verbosity = lvlWarn;
|
||||||
settings.verboseBuild = false;
|
settings.verboseBuild = false;
|
||||||
evalSettings.pureEval = true;
|
evalSettings.pureEval = true;
|
||||||
|
|
||||||
|
@ -119,6 +157,23 @@ void mainWrapped(int argc, char * * argv)
|
||||||
|
|
||||||
startProgressBar(args.printBuildLogs);
|
startProgressBar(args.printBuildLogs);
|
||||||
|
|
||||||
|
if (args.useNet && !haveInternet()) {
|
||||||
|
warn("you don't have Internet access; disabling some network-dependent features");
|
||||||
|
args.useNet = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!args.useNet) {
|
||||||
|
// FIXME: should check for command line overrides only.
|
||||||
|
if (!settings.useSubstitutes.overriden)
|
||||||
|
settings.useSubstitutes = false;
|
||||||
|
if (!settings.tarballTtl.overriden)
|
||||||
|
settings.tarballTtl = std::numeric_limits<unsigned int>::max();
|
||||||
|
if (!downloadSettings.tries.overriden)
|
||||||
|
downloadSettings.tries = 0;
|
||||||
|
if (!downloadSettings.connectTimeout.overriden)
|
||||||
|
downloadSettings.connectTimeout = 1;
|
||||||
|
}
|
||||||
|
|
||||||
args.command->prepare();
|
args.command->prepare();
|
||||||
args.command->run();
|
args.command->run();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue