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 <iostream>
24 #include <map>
25 #include "argument.hpp"
26 #include "monitor.hpp"
27 
28 using namespace phosphor::unit::failure;
29 
30 /**
31  * Prints usage and exits the program
32  *
33  * @param[in] err - the error message to print
34  * @param[in] argv - argv from main()
35  */
36 void exitWithError(const char* err, char** argv)
37 {
38     std::cerr << "ERROR: " << err << "\n";
39     ArgumentParser::usage(argv);
40     exit(EXIT_FAILURE);
41 }
42 
43 static const std::map<std::string, Monitor::Action> actions = {
44     {"start", Monitor::Action::start}, {"stop", Monitor::Action::stop}};
45 
46 int main(int argc, char** argv)
47 {
48     ArgumentParser args(argc, argv);
49 
50     auto source = args["source"];
51     if (source == ArgumentParser::emptyString)
52     {
53         exitWithError("Source not specified", argv);
54     }
55 
56     auto target = args["target"];
57     if (target == ArgumentParser::emptyString)
58     {
59         exitWithError("Target not specified", argv);
60     }
61 
62     auto a = actions.find(args["action"]);
63     if (a == actions.end())
64     {
65         exitWithError("Missing or invalid action specified", argv);
66     }
67 
68     Monitor monitor{source, target, a->second};
69 
70     monitor.analyze();
71 
72     return 0;
73 }
74