blob: 980e2a1e28f2f7193e993c4c5414193c03945098 [file] [log] [blame]
#include <stdlib.h>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <ostream>
#include <string>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#ifndef IN_GOOGLE3
#include "absl/log/globals.h"
#endif
#include "absl/log/initialize.h"
#include "absl/log/log.h"
#include "nlohmann/json.hpp"
#include "config_generator.h"
#ifndef IN_GOOGLE3
// See absl/log/globals.h for detailed instructions
ABSL_FLAG(
int, stderrthreshold, 0,
"Messages logged at or above this level are directed to stderr in addition "
"to other registered log sinks; default to >= absl::LogSeverity::kInfo");
ABSL_FLAG(
int, minloglevel, 0,
"Messages logged at or above this severity are directed to all registered "
"log sinks or skipped otherwise; default to >= absl::LogSeverity::kInfo");
#endif
ABSL_FLAG(std::string, command, "update",
"Command to run; supported command: 'clear', 'update'; 'clear' "
"command will clear the authorization policy file so that every "
"request is rejected; 'update' command will parse the base policy "
"file and add nodes on the same machine");
ABSL_FLAG(std::string, gmi_path,
"/var/google/googlemachineidentity/live/machine_identity.pb",
"Path to the Google Machine Identity (GMI) file.");
ABSL_FLAG(std::string, server_cert_path, "/var/volatile/prodid/server.pem",
"Path to the Zatar server certificate file.");
ABSL_FLAG(std::string, one_path,
"/var/google/googlemachineidentity/live/offline_node_entities.pb",
"Path to the Offline Node Entities file.");
ABSL_FLAG(std::string, authz_configuration_path,
"/var/google/authz_policies/redfish.json",
"Path to the current authorization configuration file.");
ABSL_FLAG(std::string, output_path, "/tmp/redfish.json",
"Path to the output authorization configuration file.");
void DumpFile(const std::string& content, const std::string& path) {
std::ofstream outputFileStream;
// Throws on failures
outputFileStream.exceptions(std::ofstream::failbit | std::ofstream::badbit |
std::ofstream::eofbit);
outputFileStream.open(path, std::ios::out);
outputFileStream << content << "\n" << std::flush;
outputFileStream.close();
}
int main(int argc, char* argv[]) {
absl::ParseCommandLine(argc, argv);
#ifndef IN_GOOGLE3
absl::SetMinLogLevel(
static_cast<absl::LogSeverityAtLeast>(absl::GetFlag(FLAGS_minloglevel)));
absl::SetStderrThreshold(static_cast<absl::LogSeverityAtLeast>(
absl::GetFlag(FLAGS_stderrthreshold)));
#endif
absl::InitializeLog();
using ::milotic::authz::ConfigGenerator;
std::string output_path = absl::GetFlag(FLAGS_output_path);
std::string command = absl::GetFlag(FLAGS_command);
if (command == "clear") {
DumpFile(ConfigGenerator::EmptyConfiguration().dump(2), output_path);
return EXIT_SUCCESS;
}
using ::milotic::authz::GeneratorOptions;
GeneratorOptions options = {
.gmi_path = absl::GetFlag(FLAGS_gmi_path),
.server_cert_path = absl::GetFlag(FLAGS_server_cert_path),
.authz_configuration_path = absl::GetFlag(FLAGS_authz_configuration_path),
.offline_node_entities_path = absl::GetFlag(FLAGS_one_path)};
nlohmann::json result_config =
ConfigGenerator::GenerateConfiguration(options);
if (result_config.empty()) {
LOG(ERROR) << "Failed! See error logs.";
return EXIT_FAILURE;
}
DumpFile(result_config.dump(2), output_path);
return EXIT_SUCCESS;
}