| // Copyright 2021 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| syntax = "proto3"; |
| |
| package pw_software_update; |
| |
| import "pw_software_update/tuf.proto"; |
| import "pw_software_update/update_bundle.proto"; |
| import "pw_protobuf_protos/common.proto"; |
| import "google/protobuf/any.proto"; |
| |
| message BundledUpdateState { |
| enum State { |
| UNKNOWN = 0; |
| INACTIVE = 1; |
| READY_FOR_UPDATE = 2; |
| VERIFYING_UPDATE_BUNDLE = 3; |
| VERIFIED_AND_READY_TO_APPLY = 4; |
| APPLYING_UPDATE = 5; |
| } |
| |
| State manager_state = 1; |
| |
| // This is the percentage of estimated progress for the current update |
| // state in hundreths of a percent. (e.g. 5.00% = 500u) |
| optional uint32 current_state_progress_hundreth_percent = 2; |
| } |
| |
| message OperationResult { |
| BundledUpdateState state = 1; |
| optional google.protobuf.Any extended_status = 2; |
| } |
| |
| message PrepareUpdateResult { |
| OperationResult result = 1; |
| optional uint32 transfer_endpoint = 2; |
| } |
| |
| // TODO(pwbug/478): add documentation for details of api contract |
| service BundledUpdateService { |
| // Abort any current software update in progress. |
| // |
| // Safe to call at any point. |
| rpc Abort(pw.protobuf.Empty) returns (OperationResult) {}; |
| |
| // Get current state of software update. |
| // |
| // Safe to call at any point. |
| rpc SoftwareUpdateState(pw.protobuf.Empty) returns (OperationResult) {}; |
| |
| // Get the manifest of the software currently active on the device. |
| // |
| // Safe to call at any point. |
| rpc GetCurrentManifest(pw.protobuf.Empty) returns (stream Manifest) {}; |
| |
| // Verify the manifest of the software currently active on device. Do any |
| // device-specific checks of device contents as needed. |
| // |
| // Safe to call at any point. |
| rpc VerifyCurrentManifest(pw.protobuf.Empty) returns (OperationResult) {}; |
| |
| // Get the manifest of any verified and staged update. |
| // |
| // Safe to call at any point. |
| rpc GetStagedManifest(pw.protobuf.Empty) returns (Manifest) {}; |
| |
| // Prepare for software update. Do any device-specific tasks needed to be |
| // ready for update. Open pw_transfer channel used for staging bundle. Device |
| // UpdateState set to READY_FOR_UPDATE. |
| // |
| // Device UpdateState should be INACTIVE when calling, will otherwise be |
| // rejected. |
| rpc PrepareForUpdate(pw.protobuf.Empty) returns (OperationResult) {}; |
| |
| // Verify the bundle that has been transferred to the staging area. Close the |
| // pw_transfer channel used for staging bundle. |
| // |
| // Device UpdateState should be READY_FOR_UPDATE when calling, will otherwise |
| // be rejected. |
| rpc VerifyStagedBundle(pw.protobuf.Empty) returns (OperationResult) {}; |
| |
| // Trigger the application of the device, which might result in a device |
| // becoming slow to respond and possibly reboot. |
| // |
| // Device UpdateState should be VERIFIED_AND_READY_TO_APPLY when calling, will |
| // otherwise be rejected. |
| rpc ApplyUpdate(pw.protobuf.Empty) returns (OperationResult) {}; |
| } |