Automatically use --no-net if there are no network interfaces
This commit is contained in:
parent
615a9d031d
commit
04a5976996
2 changed files with 55 additions and 11 deletions
|
@ -1,6 +1,5 @@
|
||||||
#include "common-args.hh"
|
#include "common-args.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "download.hh"
|
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
@ -36,16 +35,6 @@ MixCommonArgs::MixCommonArgs(const string & programName)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mkFlag()
|
|
||||||
.longName("no-net")
|
|
||||||
.description("disable substituters and consider all previously downloaded files up-to-date")
|
|
||||||
.handler([]() {
|
|
||||||
settings.useSubstitutes = false;
|
|
||||||
settings.tarballTtl = std::numeric_limits<unsigned int>::max();
|
|
||||||
downloadSettings.tries = 0;
|
|
||||||
downloadSettings.connectTimeout = 1;
|
|
||||||
});
|
|
||||||
|
|
||||||
std::string cat = "config";
|
std::string cat = "config";
|
||||||
globalConfig.convertToArgs(*this, cat);
|
globalConfig.convertToArgs(*this, cat);
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
{
|
{
|
||||||
|
@ -52,6 +85,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
|
||||||
|
@ -118,6 +156,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