1bf58cd64SPatrick Venture /*
2bf58cd64SPatrick Venture  * Copyright 2018 Google Inc.
3bf58cd64SPatrick Venture  *
4bf58cd64SPatrick Venture  * Licensed under the Apache License, Version 2.0 (the "License");
5bf58cd64SPatrick Venture  * you may not use this file except in compliance with the License.
6bf58cd64SPatrick Venture  * You may obtain a copy of the License at
7bf58cd64SPatrick Venture  *
8bf58cd64SPatrick Venture  *     http://www.apache.org/licenses/LICENSE-2.0
9bf58cd64SPatrick Venture  *
10bf58cd64SPatrick Venture  * Unless required by applicable law or agreed to in writing, software
11bf58cd64SPatrick Venture  * distributed under the License is distributed on an "AS IS" BASIS,
12bf58cd64SPatrick Venture  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf58cd64SPatrick Venture  * See the License for the specific language governing permissions and
14bf58cd64SPatrick Venture  * limitations under the License.
15bf58cd64SPatrick Venture  */
16bf58cd64SPatrick Venture 
17bf58cd64SPatrick Venture #include "updater.hpp"
18bf58cd64SPatrick Venture 
19*0533d0b0SPatrick Venture #include "blob_errors.hpp"
20*0533d0b0SPatrick Venture 
2100887597SPatrick Venture #include <algorithm>
22af69625fSPatrick Venture #include <memory>
23af69625fSPatrick Venture 
24a658636fSPatrick Venture int updaterMain(BlobInterface* blob, DataInterface* handler,
2500887597SPatrick Venture                 const std::string& imagePath, const std::string& signaturePath)
26bf58cd64SPatrick Venture {
27af69625fSPatrick Venture     /* TODO(venture): Add optional parameter to specify the flash type, default
28af69625fSPatrick Venture      * to legacy for now.
29af69625fSPatrick Venture      */
3000887597SPatrick Venture     std::string goalFirmware = "/flash/image";
3100887597SPatrick Venture 
320bf8bf0cSPatrick Venture     /* Get list of blob_ids, check for /flash/image, or /flash/tarball.
330bf8bf0cSPatrick Venture      * TODO(venture) the mechanism doesn't care, but the caller of burn_my_bmc
340bf8bf0cSPatrick Venture      * will have in mind which they're sending and we need to verify it's
350bf8bf0cSPatrick Venture      * available and use it.
360bf8bf0cSPatrick Venture      */
3700887597SPatrick Venture     std::vector<std::string> blobs = blob->getBlobList();
3800887597SPatrick Venture     auto blobInst = std::find(blobs.begin(), blobs.end(), goalFirmware);
3900887597SPatrick Venture     if (blobInst == blobs.end())
4000887597SPatrick Venture     {
4100887597SPatrick Venture         std::fprintf(stderr, "firmware goal not found!\n");
4200887597SPatrick Venture         return -1; /* throw custom exception. */
4300887597SPatrick Venture     }
44af69625fSPatrick Venture 
45af69625fSPatrick Venture     /* Call stat on /flash/image (or /flash/tarball) and check if data interface
4600887597SPatrick Venture      * is supported.
4700887597SPatrick Venture      */
480bf8bf0cSPatrick Venture     auto stat = blob->getStat(goalFirmware);
498a55dcbdSPatrick Venture     if ((stat.blob_state & handler->supportedType()) == 0)
508a55dcbdSPatrick Venture     {
518a55dcbdSPatrick Venture         std::fprintf(stderr, "data interface selected not supported.\n");
528a55dcbdSPatrick Venture         return -1; /* throw custom exception. */
538a55dcbdSPatrick Venture     }
54af69625fSPatrick Venture 
55*0533d0b0SPatrick Venture     /* Yay, our data handler is supported. */
56*0533d0b0SPatrick Venture     std::uint16_t session;
57*0533d0b0SPatrick Venture     try
58*0533d0b0SPatrick Venture     {
59*0533d0b0SPatrick Venture         session = blob->openBlob(goalFirmware, handler->supportedType());
60*0533d0b0SPatrick Venture     }
61*0533d0b0SPatrick Venture     catch (const BlobException& b)
62*0533d0b0SPatrick Venture     {
63*0533d0b0SPatrick Venture         std::fprintf(stderr, "blob exception received: %s\n", b.what());
64*0533d0b0SPatrick Venture         return -1;
65*0533d0b0SPatrick Venture     }
66*0533d0b0SPatrick Venture 
67*0533d0b0SPatrick Venture     std::fprintf(stderr, "using session: %d\n", session);
68*0533d0b0SPatrick Venture 
69bf58cd64SPatrick Venture     return 0;
70bf58cd64SPatrick Venture }
71