Add the nix-store --serve command
This is essentially the substituter API operating on the local store, which will be used by the ssh substituter. It runs in a loop rather than just taking one command so that in the future nix will be able to keep one connection open for multiple instances of the substituter. Signed-off-by: Shea Levy <shea@shealevy.com>
This commit is contained in:
parent
84a8b5e9af
commit
3a38d0f356
3 changed files with 55 additions and 0 deletions
|
@ -258,6 +258,37 @@ string StoreAPI::makeValidityRegistration(const PathSet & paths,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StoreAPI::serve(Source & in, Sink & out, bool sign)
|
||||||
|
{
|
||||||
|
for (string cmd = readString(in); !cmd.empty(); cmd = readString(in)) {
|
||||||
|
if (cmd == "query") {
|
||||||
|
for (cmd = readString(in); !cmd.empty(); cmd = readString(in)) {
|
||||||
|
PathSet paths = readStrings<PathSet>(in);
|
||||||
|
if (cmd == "have") {
|
||||||
|
writeStrings(queryValidPaths(paths), out);
|
||||||
|
} else if (cmd == "info") {
|
||||||
|
// !!! Maybe we want a queryPathInfos?
|
||||||
|
foreach (PathSet::iterator, i, paths) {
|
||||||
|
ValidPathInfo info = queryPathInfo(*i);
|
||||||
|
writeString(info.path, out);
|
||||||
|
writeString(info.deriver, out);
|
||||||
|
writeStrings(info.references, out);
|
||||||
|
// !!! Maybe we want compression?
|
||||||
|
writeLongLong(info.narSize, out); // downloadSize
|
||||||
|
writeLongLong(info.narSize, out);
|
||||||
|
}
|
||||||
|
writeString("", out);
|
||||||
|
} else
|
||||||
|
throw Error(format("Unknown serve query `%1%'") % cmd);
|
||||||
|
}
|
||||||
|
} else if (cmd == "substitute")
|
||||||
|
exportPath(readString(in), sign, out);
|
||||||
|
else
|
||||||
|
throw Error(format("Unknown serve command `%1%'") % cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ValidPathInfo decodeValidPathInfo(std::istream & str, bool hashGiven)
|
ValidPathInfo decodeValidPathInfo(std::istream & str, bool hashGiven)
|
||||||
{
|
{
|
||||||
ValidPathInfo info;
|
ValidPathInfo info;
|
||||||
|
|
|
@ -248,6 +248,10 @@ public:
|
||||||
`nix-store --register-validity'. */
|
`nix-store --register-validity'. */
|
||||||
string makeValidityRegistration(const PathSet & paths,
|
string makeValidityRegistration(const PathSet & paths,
|
||||||
bool showDerivers, bool showHash);
|
bool showDerivers, bool showHash);
|
||||||
|
|
||||||
|
/* Serve the store for ssh substituters by taking commands
|
||||||
|
* from in and printing results to out */
|
||||||
|
void serve(Source & in, Sink & out, bool sign);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -834,6 +834,24 @@ static void opClearFailedPaths(Strings opFlags, Strings opArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Serve the nix store in a way usable by a restricted ssh user
|
||||||
|
static void opServe(Strings opFlags, Strings opArgs)
|
||||||
|
{
|
||||||
|
if (!opArgs.empty())
|
||||||
|
throw UsageError("no arguments expected");
|
||||||
|
// Could eventually take a username argument?
|
||||||
|
bool sign;
|
||||||
|
foreach (Strings::iterator, i, opFlags)
|
||||||
|
if (*i == "--sign") sign = true;
|
||||||
|
else throw UsageError(format("unknown flag `%1%'") % *i);
|
||||||
|
|
||||||
|
FdSource in(STDIN_FILENO);
|
||||||
|
FdSink out(STDOUT_FILENO);
|
||||||
|
|
||||||
|
store->serve(in, out, sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Scan the arguments; find the operation, set global flags, put all
|
/* Scan the arguments; find the operation, set global flags, put all
|
||||||
other flags in a list, and put all other arguments in another
|
other flags in a list, and put all other arguments in another
|
||||||
list. */
|
list. */
|
||||||
|
@ -904,6 +922,8 @@ void run(Strings args)
|
||||||
indirectRoot = true;
|
indirectRoot = true;
|
||||||
else if (arg == "--no-output")
|
else if (arg == "--no-output")
|
||||||
noOutput = true;
|
noOutput = true;
|
||||||
|
else if (arg == "--serve")
|
||||||
|
op = opServe;
|
||||||
else if (arg[0] == '-') {
|
else if (arg[0] == '-') {
|
||||||
opFlags.push_back(arg);
|
opFlags.push_back(arg);
|
||||||
if (arg == "--max-freed" || arg == "--max-links" || arg == "--max-atime") { /* !!! hack */
|
if (arg == "--max-freed" || arg == "--max-links" || arg == "--max-atime") { /* !!! hack */
|
||||||
|
|
Loading…
Reference in a new issue