10aa0d114SJayanth Othayoth /**
20aa0d114SJayanth Othayoth  * Copyright © 2018 IBM Corporation
30aa0d114SJayanth Othayoth  *
40aa0d114SJayanth Othayoth  * Licensed under the Apache License, Version 2.0 (the "License");
50aa0d114SJayanth Othayoth  * you may not use this file except in compliance with the License.
60aa0d114SJayanth Othayoth  * You may obtain a copy of the License at
70aa0d114SJayanth Othayoth  *
80aa0d114SJayanth Othayoth  *     http://www.apache.org/licenses/LICENSE-2.0
90aa0d114SJayanth Othayoth  *
100aa0d114SJayanth Othayoth  * Unless required by applicable law or agreed to in writing, software
110aa0d114SJayanth Othayoth  * distributed under the License is distributed on an "AS IS" BASIS,
120aa0d114SJayanth Othayoth  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130aa0d114SJayanth Othayoth  * See the License for the specific language governing permissions and
140aa0d114SJayanth Othayoth  * limitations under the License.
150aa0d114SJayanth Othayoth  */
160aa0d114SJayanth Othayoth 
17cfbc8dc8SJayanth Othayoth #include "config.h"
18cfbc8dc8SJayanth Othayoth 
190aa0d114SJayanth Othayoth #include "argument.hpp"
20cfbc8dc8SJayanth Othayoth #include "certs_manager.hpp"
210aa0d114SJayanth Othayoth 
220aa0d114SJayanth Othayoth #include <iostream>
23cfbc8dc8SJayanth Othayoth #include <locale>
240aa0d114SJayanth Othayoth #include <string>
250aa0d114SJayanth Othayoth 
260aa0d114SJayanth Othayoth static void ExitWithError(const char* err, char** argv)
270aa0d114SJayanth Othayoth {
280aa0d114SJayanth Othayoth     phosphor::certs::util::ArgumentParser::usage(argv);
290aa0d114SJayanth Othayoth     std::cerr << std::endl;
300aa0d114SJayanth Othayoth     std::cerr << "ERROR: " << err << std::endl;
310aa0d114SJayanth Othayoth     exit(EXIT_FAILURE);
320aa0d114SJayanth Othayoth }
330aa0d114SJayanth Othayoth 
34cfbc8dc8SJayanth Othayoth inline void capitalize(std::string& s)
35cfbc8dc8SJayanth Othayoth {
36cfbc8dc8SJayanth Othayoth     s[0] = std::toupper(s[0]);
37cfbc8dc8SJayanth Othayoth }
38cfbc8dc8SJayanth Othayoth 
390aa0d114SJayanth Othayoth int main(int argc, char** argv)
400aa0d114SJayanth Othayoth {
410aa0d114SJayanth Othayoth     // Read arguments.
420aa0d114SJayanth Othayoth     auto options = phosphor::certs::util::ArgumentParser(argc, argv);
430aa0d114SJayanth Othayoth 
440aa0d114SJayanth Othayoth     // Parse arguments
450aa0d114SJayanth Othayoth     auto type = std::move((options)["type"]);
46cfbc8dc8SJayanth Othayoth     if ((type == phosphor::certs::util::ArgumentParser::empty_string) ||
47cfbc8dc8SJayanth Othayoth         !((type == phosphor::certs::SERVER) ||
48b50789ceSJayanth Othayoth           (type == phosphor::certs::CLIENT) ||
49b50789ceSJayanth Othayoth           (type == phosphor::certs::AUTHORITY)))
500aa0d114SJayanth Othayoth     {
51cfbc8dc8SJayanth Othayoth         ExitWithError("type not specified or invalid.", argv);
520aa0d114SJayanth Othayoth     }
530aa0d114SJayanth Othayoth 
540aa0d114SJayanth Othayoth     auto endpoint = std::move((options)["endpoint"]);
550aa0d114SJayanth Othayoth     if (endpoint == phosphor::certs::util::ArgumentParser::empty_string)
560aa0d114SJayanth Othayoth     {
570aa0d114SJayanth Othayoth         ExitWithError("endpoint not specified.", argv);
580aa0d114SJayanth Othayoth     }
590aa0d114SJayanth Othayoth 
600aa0d114SJayanth Othayoth     auto path = std::move((options)["path"]);
610aa0d114SJayanth Othayoth     if (path == phosphor::certs::util::ArgumentParser::empty_string)
620aa0d114SJayanth Othayoth     {
630aa0d114SJayanth Othayoth         ExitWithError("path not specified.", argv);
640aa0d114SJayanth Othayoth     }
650aa0d114SJayanth Othayoth 
66cfbc8dc8SJayanth Othayoth     // unit is an optional parameter
670aa0d114SJayanth Othayoth     auto unit = std::move((options)["unit"]);
680aa0d114SJayanth Othayoth 
69cfbc8dc8SJayanth Othayoth     auto bus = sdbusplus::bus::new_default();
70cfbc8dc8SJayanth Othayoth 
71cfbc8dc8SJayanth Othayoth     auto objPath = std::string(OBJPATH) + '/' + type + '/' + endpoint;
72cfbc8dc8SJayanth Othayoth 
73*6ceec40bSMarri Devender Rao     // Add sdbusplus ObjectManager
74*6ceec40bSMarri Devender Rao     sdbusplus::server::manager::manager objManager(bus, objPath.c_str());
75*6ceec40bSMarri Devender Rao 
76cfbc8dc8SJayanth Othayoth     phosphor::certs::Manager manager(bus, objPath.c_str(), type,
77cfbc8dc8SJayanth Othayoth                                      std::move(unit), std::move(path));
78cfbc8dc8SJayanth Othayoth 
79cfbc8dc8SJayanth Othayoth     // Adjusting Interface name as per std convention
80cfbc8dc8SJayanth Othayoth     capitalize(type);
81cfbc8dc8SJayanth Othayoth     capitalize(endpoint);
82cfbc8dc8SJayanth Othayoth     auto busName = std::string(BUSNAME) + '.' + type + '.' + endpoint;
83cfbc8dc8SJayanth Othayoth     bus.request_name(busName.c_str());
84cfbc8dc8SJayanth Othayoth 
85cfbc8dc8SJayanth Othayoth     while (true)
86cfbc8dc8SJayanth Othayoth     {
87cfbc8dc8SJayanth Othayoth         // process dbus calls / signals discarding unhandled
88cfbc8dc8SJayanth Othayoth         bus.process_discard();
89cfbc8dc8SJayanth Othayoth         bus.wait();
90cfbc8dc8SJayanth Othayoth     }
910aa0d114SJayanth Othayoth     return 0;
920aa0d114SJayanth Othayoth }
93