1 /**
2  * Copyright © 2017 IBM Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /**
18  * This application will check the ActiveState property
19  * on the source unit passed in.  If that state is 'failed',
20  * then it will either stop or start the target unit, depending
21  * on the command line arguments.
22  */
23 #include "argument.hpp"
24 #include "monitor.hpp"
25 
26 #include <iostream>
27 #include <map>
28 
29 using namespace phosphor::unit::failure;
30 
31 /**
32  * Prints usage and exits the program
33  *
34  * @param[in] err - the error message to print
35  * @param[in] argv - argv from main()
36  */
37 void exitWithError(const char* err, char** argv)
38 {
39     std::cerr << "ERROR: " << err << "\n";
40     ArgumentParser::usage(argv);
41     exit(EXIT_FAILURE);
42 }
43 
44 static const std::map<std::string, Monitor::Action> actions = {
45     {"start", Monitor::Action::start}, {"stop", Monitor::Action::stop}};
46 
47 int main(int argc, char** argv)
48 {
49     ArgumentParser args(argc, argv);
50 
51     auto source = args["source"];
52     if (source == ArgumentParser::emptyString)
53     {
54         exitWithError("Source not specified", argv);
55     }
56 
57     auto target = args["target"];
58     if (target == ArgumentParser::emptyString)
59     {
60         exitWithError("Target not specified", argv);
61     }
62 
63     auto a = actions.find(args["action"]);
64     if (a == actions.end())
65     {
66         exitWithError("Missing or invalid action specified", argv);
67     }
68 
69     Monitor monitor{source, target, a->second};
70 
71     monitor.analyze();
72 
73     return 0;
74 }
75