| #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; |
| } |