1 /*
2  * Copyright 2018 Google Inc.
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 #include "updater.hpp"
18 
19 #include "bt.hpp"
20 #include "interface.hpp"
21 #include "lpc.hpp"
22 
23 #include <algorithm>
24 #include <memory>
25 
26 int updaterMain(BlobInterface* blob, const std::string& interface,
27                 const std::string& imagePath, const std::string& signaturePath)
28 {
29     std::unique_ptr<DataInterface> handler;
30 
31     /* Input has already been validated in this case. */
32     if (interface == "ipmibt")
33     {
34         handler = std::make_unique<BtDataHandler>(blob);
35     }
36     else if (interface == "ipmilpc")
37     {
38         handler = std::make_unique<LpcDataHandler>(blob);
39     }
40 
41     if (!handler)
42     {
43         /* TODO(venture): use a custom exception. */
44         std::fprintf(stderr, "Interface %s is unavailable\n",
45                      interface.c_str());
46         return -1;
47     }
48 
49     /* TODO(venture): Add optional parameter to specify the flash type, default
50      * to legacy for now.
51      */
52     std::string goalFirmware = "/flash/image";
53 
54     std::vector<std::string> blobs = blob->getBlobList();
55 
56     auto blobInst = std::find(blobs.begin(), blobs.end(), goalFirmware);
57     if (blobInst == blobs.end())
58     {
59         std::fprintf(stderr, "firmware goal not found!\n");
60         return -1; /* throw custom exception. */
61     }
62 
63     /* Get list of blob_ids, check for /flash/image, or /flash/tarball.
64      * TODO(venture) the mechanism doesn't care, but the caller of burn_my_bmc
65      * will have in mind which they're sending and we need to verify it's
66      * available and use it.
67      */
68 
69     /* Call stat on /flash/image (or /flash/tarball) and check if data interface
70      * is supported.
71      */
72 
73     return 0;
74 }
75