forked from lix-project/lix
1a68710d4d
This is useful for one-off situations where you want to specify a builder on the command line instead of having to mess with nix.machines. E.g. $ nix-build -A hello --argstr system x86_64-darwin \ --option builders 'root@macstadium1 x86_64-darwin' will perform the specified build on "macstadium1". It also removes the need for a separate nix.machines file since you can specify builders in nix.conf directly. (In fact nix.machines is yet another hack that predates the general nix.conf configuration file, IIRC.) Note: this option is supported by the daemon for trusted users. The fact that this allows trusted users to specify paths to SSH keys to which they don't normally have access is maybe a bit too much trust...
82 lines
2.6 KiB
C++
82 lines
2.6 KiB
C++
#include "machines.hh"
|
||
#include "util.hh"
|
||
#include "globals.hh"
|
||
|
||
#include <algorithm>
|
||
|
||
namespace nix {
|
||
|
||
Machine::Machine(decltype(storeUri) storeUri,
|
||
decltype(systemTypes) systemTypes,
|
||
decltype(sshKey) sshKey,
|
||
decltype(maxJobs) maxJobs,
|
||
decltype(speedFactor) speedFactor,
|
||
decltype(supportedFeatures) supportedFeatures,
|
||
decltype(mandatoryFeatures) mandatoryFeatures) :
|
||
storeUri(
|
||
// Backwards compatibility: if the URI is a hostname,
|
||
// prepend ssh://.
|
||
storeUri.find("://") != std::string::npos || hasPrefix(storeUri, "local") || hasPrefix(storeUri, "remote") || hasPrefix(storeUri, "auto")
|
||
? storeUri
|
||
: "ssh://" + storeUri),
|
||
systemTypes(systemTypes),
|
||
sshKey(sshKey),
|
||
maxJobs(maxJobs),
|
||
speedFactor(std::max(1U, speedFactor)),
|
||
supportedFeatures(supportedFeatures),
|
||
mandatoryFeatures(mandatoryFeatures)
|
||
{}
|
||
|
||
bool Machine::allSupported(const std::set<string> & features) const {
|
||
return std::all_of(features.begin(), features.end(),
|
||
[&](const string & feature) {
|
||
return supportedFeatures.count(feature) ||
|
||
mandatoryFeatures.count(feature);
|
||
});
|
||
}
|
||
|
||
bool Machine::mandatoryMet(const std::set<string> & features) const {
|
||
return std::all_of(mandatoryFeatures.begin(), mandatoryFeatures.end(),
|
||
[&](const string & feature) {
|
||
return features.count(feature);
|
||
});
|
||
}
|
||
|
||
void parseMachines(const std::string & s, Machines & machines)
|
||
{
|
||
for (auto line : tokenizeString<std::vector<string>>(s, "\n;")) {
|
||
chomp(line);
|
||
line.erase(std::find(line.begin(), line.end(), '#'), line.end());
|
||
if (line.empty()) continue;
|
||
auto tokens = tokenizeString<std::vector<string>>(line);
|
||
auto sz = tokens.size();
|
||
if (sz < 1)
|
||
throw FormatError("bad machine specification ‘%s’", line);
|
||
machines.emplace_back(tokens[0],
|
||
sz >= 2 ? tokenizeString<std::vector<string>>(tokens[1], ",") : std::vector<string>{settings.thisSystem},
|
||
sz >= 3 ? tokens[2] : "",
|
||
sz >= 4 ? std::stoull(tokens[3]) : 1LL,
|
||
sz >= 5 ? std::stoull(tokens[4]) : 1LL,
|
||
sz >= 6 ? tokenizeString<std::set<string>>(tokens[5], ",") : std::set<string>{},
|
||
sz >= 7 ? tokenizeString<std::set<string>>(tokens[6], ",") : std::set<string>{});
|
||
}
|
||
}
|
||
|
||
Machines getMachines()
|
||
{
|
||
Machines machines;
|
||
|
||
try {
|
||
parseMachines(readFile(getEnv("NIX_REMOTE_SYSTEMS", settings.nixConfDir + "/machines")), machines);
|
||
} catch (const SysError & e) {
|
||
if (e.errNo != ENOENT)
|
||
throw;
|
||
}
|
||
|
||
parseMachines(settings.builders, machines);
|
||
|
||
return machines;
|
||
}
|
||
|
||
}
|