1*1bbe3d1eSWilliam A. Kennington III /**
2*1bbe3d1eSWilliam A. Kennington III  * Copyright © 2018 IBM Corporation
3*1bbe3d1eSWilliam A. Kennington III  *
4*1bbe3d1eSWilliam A. Kennington III  * Licensed under the Apache License, Version 2.0 (the "License");
5*1bbe3d1eSWilliam A. Kennington III  * you may not use this file except in compliance with the License.
6*1bbe3d1eSWilliam A. Kennington III  * You may obtain a copy of the License at
7*1bbe3d1eSWilliam A. Kennington III  *
8*1bbe3d1eSWilliam A. Kennington III  *     http://www.apache.org/licenses/LICENSE-2.0
9*1bbe3d1eSWilliam A. Kennington III  *
10*1bbe3d1eSWilliam A. Kennington III  * Unless required by applicable law or agreed to in writing, software
11*1bbe3d1eSWilliam A. Kennington III  * distributed under the License is distributed on an "AS IS" BASIS,
12*1bbe3d1eSWilliam A. Kennington III  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1bbe3d1eSWilliam A. Kennington III  * See the License for the specific language governing permissions and
14*1bbe3d1eSWilliam A. Kennington III  * limitations under the License.
15*1bbe3d1eSWilliam A. Kennington III  */
16*1bbe3d1eSWilliam A. Kennington III #include "argument.hpp"
17*1bbe3d1eSWilliam A. Kennington III #include "ncsi_util.hpp"
18*1bbe3d1eSWilliam A. Kennington III 
19*1bbe3d1eSWilliam A. Kennington III #include <iostream>
20*1bbe3d1eSWilliam A. Kennington III #include <string>
21*1bbe3d1eSWilliam A. Kennington III 
22*1bbe3d1eSWilliam A. Kennington III static void exitWithError(const char* err, char** argv)
23*1bbe3d1eSWilliam A. Kennington III {
24*1bbe3d1eSWilliam A. Kennington III     phosphor::network::ncsi::ArgumentParser::usage(argv);
25*1bbe3d1eSWilliam A. Kennington III     std::cerr << "ERROR: " << err << "\n";
26*1bbe3d1eSWilliam A. Kennington III     exit(EXIT_FAILURE);
27*1bbe3d1eSWilliam A. Kennington III }
28*1bbe3d1eSWilliam A. Kennington III 
29*1bbe3d1eSWilliam A. Kennington III int main(int argc, char** argv)
30*1bbe3d1eSWilliam A. Kennington III {
31*1bbe3d1eSWilliam A. Kennington III     using namespace phosphor::network;
32*1bbe3d1eSWilliam A. Kennington III     using namespace phosphor::network::ncsi;
33*1bbe3d1eSWilliam A. Kennington III     // Read arguments.
34*1bbe3d1eSWilliam A. Kennington III     auto options = ArgumentParser(argc, argv);
35*1bbe3d1eSWilliam A. Kennington III     int packageInt{};
36*1bbe3d1eSWilliam A. Kennington III     int channelInt{};
37*1bbe3d1eSWilliam A. Kennington III     int indexInt{};
38*1bbe3d1eSWilliam A. Kennington III 
39*1bbe3d1eSWilliam A. Kennington III     // Parse out interface argument.
40*1bbe3d1eSWilliam A. Kennington III     auto ifIndex = (options)["index"];
41*1bbe3d1eSWilliam A. Kennington III     try
42*1bbe3d1eSWilliam A. Kennington III     {
43*1bbe3d1eSWilliam A. Kennington III         indexInt = stoi(ifIndex, nullptr);
44*1bbe3d1eSWilliam A. Kennington III     }
45*1bbe3d1eSWilliam A. Kennington III     catch (const std::exception& e)
46*1bbe3d1eSWilliam A. Kennington III     {
47*1bbe3d1eSWilliam A. Kennington III         exitWithError("Interface not specified.", argv);
48*1bbe3d1eSWilliam A. Kennington III     }
49*1bbe3d1eSWilliam A. Kennington III 
50*1bbe3d1eSWilliam A. Kennington III     if (indexInt < 0)
51*1bbe3d1eSWilliam A. Kennington III     {
52*1bbe3d1eSWilliam A. Kennington III         exitWithError("Interface value should be greater than equal to 0",
53*1bbe3d1eSWilliam A. Kennington III                       argv);
54*1bbe3d1eSWilliam A. Kennington III     }
55*1bbe3d1eSWilliam A. Kennington III 
56*1bbe3d1eSWilliam A. Kennington III     // Parse out package argument.
57*1bbe3d1eSWilliam A. Kennington III     auto package = (options)["package"];
58*1bbe3d1eSWilliam A. Kennington III     try
59*1bbe3d1eSWilliam A. Kennington III     {
60*1bbe3d1eSWilliam A. Kennington III         packageInt = stoi(package, nullptr);
61*1bbe3d1eSWilliam A. Kennington III     }
62*1bbe3d1eSWilliam A. Kennington III     catch (const std::exception& e)
63*1bbe3d1eSWilliam A. Kennington III     {
64*1bbe3d1eSWilliam A. Kennington III         packageInt = DEFAULT_VALUE;
65*1bbe3d1eSWilliam A. Kennington III     }
66*1bbe3d1eSWilliam A. Kennington III 
67*1bbe3d1eSWilliam A. Kennington III     if (packageInt < 0)
68*1bbe3d1eSWilliam A. Kennington III     {
69*1bbe3d1eSWilliam A. Kennington III         packageInt = DEFAULT_VALUE;
70*1bbe3d1eSWilliam A. Kennington III     }
71*1bbe3d1eSWilliam A. Kennington III 
72*1bbe3d1eSWilliam A. Kennington III     // Parse out channel argument.
73*1bbe3d1eSWilliam A. Kennington III     auto channel = (options)["channel"];
74*1bbe3d1eSWilliam A. Kennington III     try
75*1bbe3d1eSWilliam A. Kennington III     {
76*1bbe3d1eSWilliam A. Kennington III         channelInt = stoi(channel, nullptr);
77*1bbe3d1eSWilliam A. Kennington III     }
78*1bbe3d1eSWilliam A. Kennington III     catch (const std::exception& e)
79*1bbe3d1eSWilliam A. Kennington III     {
80*1bbe3d1eSWilliam A. Kennington III         channelInt = DEFAULT_VALUE;
81*1bbe3d1eSWilliam A. Kennington III     }
82*1bbe3d1eSWilliam A. Kennington III 
83*1bbe3d1eSWilliam A. Kennington III     if (channelInt < 0)
84*1bbe3d1eSWilliam A. Kennington III     {
85*1bbe3d1eSWilliam A. Kennington III         channelInt = DEFAULT_VALUE;
86*1bbe3d1eSWilliam A. Kennington III     }
87*1bbe3d1eSWilliam A. Kennington III 
88*1bbe3d1eSWilliam A. Kennington III     auto setCmd = (options)["set"];
89*1bbe3d1eSWilliam A. Kennington III     if (setCmd == "true")
90*1bbe3d1eSWilliam A. Kennington III     {
91*1bbe3d1eSWilliam A. Kennington III         // Can not perform set operation without package.
92*1bbe3d1eSWilliam A. Kennington III         if (packageInt == DEFAULT_VALUE)
93*1bbe3d1eSWilliam A. Kennington III         {
94*1bbe3d1eSWilliam A. Kennington III             exitWithError("Package not specified.", argv);
95*1bbe3d1eSWilliam A. Kennington III         }
96*1bbe3d1eSWilliam A. Kennington III         return ncsi::setChannel(indexInt, packageInt, channelInt);
97*1bbe3d1eSWilliam A. Kennington III     }
98*1bbe3d1eSWilliam A. Kennington III     else if ((options)["info"] == "true")
99*1bbe3d1eSWilliam A. Kennington III     {
100*1bbe3d1eSWilliam A. Kennington III         return ncsi::getInfo(indexInt, packageInt);
101*1bbe3d1eSWilliam A. Kennington III     }
102*1bbe3d1eSWilliam A. Kennington III     else if ((options)["clear"] == "true")
103*1bbe3d1eSWilliam A. Kennington III     {
104*1bbe3d1eSWilliam A. Kennington III         return ncsi::clearInterface(indexInt);
105*1bbe3d1eSWilliam A. Kennington III     }
106*1bbe3d1eSWilliam A. Kennington III     else
107*1bbe3d1eSWilliam A. Kennington III     {
108*1bbe3d1eSWilliam A. Kennington III         exitWithError("No Command specified", argv);
109*1bbe3d1eSWilliam A. Kennington III     }
110*1bbe3d1eSWilliam A. Kennington III     return 0;
111*1bbe3d1eSWilliam A. Kennington III }
112