depot_query: query user information

The new '<user name"...">' node allows for querying the download
location and public key of the specified name.
This commit is contained in:
Norman Feske 2017-12-17 15:50:41 +01:00 committed by Christian Helmuth
parent f5fb9684db
commit 6552313098

View File

@ -110,6 +110,7 @@ struct Depot_query::Main
Reporter _directory_reporter { _env, "directory" };
Reporter _blueprint_reporter { _env, "blueprint" };
Reporter _user_reporter { _env, "user" };
typedef String<64> Rom_label;
typedef String<16> Architecture;
@ -122,6 +123,7 @@ struct Depot_query::Main
void _scan_depot_user_pkg(Archive::User const &user, Directory &dir, Xml_generator &xml);
void _query_pkg(Directory::Path const &path, Xml_generator &xml);
void _query_user(Archive::User const &user, Xml_generator &xml);
void _handle_config()
{
@ -131,6 +133,7 @@ struct Depot_query::Main
_directory_reporter.enabled(config.has_sub_node("scan"));
_blueprint_reporter.enabled(config.has_sub_node("query"));
_user_reporter .enabled(config.has_sub_node("user"));
_root.apply_config(config.sub_node("vfs"));
@ -140,7 +143,6 @@ struct Depot_query::Main
_architecture = config.attribute_value("arch", Architecture());
if (_directory_reporter.enabled()) {
Reporter::Xml_generator xml(_directory_reporter, [&] () {
config.for_each_sub_node("scan", [&] (Xml_node node) {
Archive::User const user = node.attribute_value("user", Archive::User());
@ -152,12 +154,18 @@ struct Depot_query::Main
}
if (_blueprint_reporter.enabled()) {
Reporter::Xml_generator xml(_blueprint_reporter, [&] () {
config.for_each_sub_node("query", [&] (Xml_node node) {
_query_pkg(node.attribute_value("pkg", Directory::Path()), xml); });
});
}
if (_user_reporter.enabled()) {
Reporter::Xml_generator xml(_user_reporter, [&] () {
config.for_each_sub_node("user", [&] (Xml_node node) {
_query_user(node.attribute_value("name", Archive::User()), xml); });
});
}
}
Main(Env &env) : _env(env) { _handle_config(); }
@ -300,5 +308,28 @@ void Depot_query::Main::_query_pkg(Directory::Path const &pkg_path, Xml_generato
}
void Depot_query::Main::_query_user(Archive::User const &user, Xml_generator &xml)
{
Directory user_dir(_root, Directory::Path("depot/", user));
xml.attribute("name", user);
File_content download(_heap, user_dir, "download", File_content::Limit{4*1024});
typedef String<256> Url;
download.for_each_line<Url>([&] (Url const &url) {
log("user url: ", url);
xml.node("url", [&] () { xml.append_sanitized(url.string()); }); });
File_content pubkey(_heap, user_dir, "pubkey", File_content::Limit{8*1024});
xml.node("pubkey", [&] () {
typedef String<80> Line;
pubkey.for_each_line<Line>([&] (Line const &line) {
xml.append_sanitized(line.string());
xml.append("\n");
});
});
}
void Component::construct(Genode::Env &env) { static Depot_query::Main main(env); }