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…
	
	Add table
		Add a link
		
	
		Reference in a new issue