blob: 887dd04129d44900ceec6dc7273b1e2991f2c6d0 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2011 The Android Open Source Project
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//
rspangler@google.com49fdf182009-10-10 00:57:34 +000016
Amin Hassaniec7bc112020-10-29 16:47:58 -070017#ifndef UPDATE_ENGINE_COMMON_DOWNLOAD_ACTION_H_
18#define UPDATE_ENGINE_COMMON_DOWNLOAD_ACTION_H_
rspangler@google.com49fdf182009-10-10 00:57:34 +000019
rspangler@google.com49fdf182009-10-10 00:57:34 +000020#include <fcntl.h>
Alex Vakulenko44cab302014-07-23 13:12:15 -070021#include <sys/stat.h>
22#include <sys/types.h>
rspangler@google.com49fdf182009-10-10 00:57:34 +000023
Ben Chan02f7c1d2014-10-18 15:18:02 -070024#include <memory>
rspangler@google.com49fdf182009-10-10 00:57:34 +000025#include <string>
Kelvin Zhang22b62e42020-12-14 14:50:40 -050026#include <utility>
rspangler@google.com49fdf182009-10-10 00:57:34 +000027
Alex Deymo39910dc2015-11-09 17:04:30 -080028#include "update_engine/common/action.h"
Alex Deymo1b3556c2016-02-03 09:54:02 -080029#include "update_engine/common/boot_control_interface.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080030#include "update_engine/common/http_fetcher.h"
Sen Jiang5ae865b2017-04-18 14:24:40 -070031#include "update_engine/common/multi_range_http_fetcher.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080032#include "update_engine/payload_consumer/delta_performer.h"
33#include "update_engine/payload_consumer/install_plan.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000034
Darin Petkov7ed561b2011-10-04 02:59:03 -070035// The Download Action downloads a specified url to disk. The url should point
36// to an update in a delta payload format. The payload will be piped into a
Andrew de los Reyesf9185172010-05-03 11:07:05 -070037// DeltaPerformer that will apply the delta to the disk.
rspangler@google.com49fdf182009-10-10 00:57:34 +000038
rspangler@google.com49fdf182009-10-10 00:57:34 +000039namespace chromeos_update_engine {
40
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070041class DownloadActionDelegate {
42 public:
Alex Deymoe8948702014-11-11 21:44:45 -080043 virtual ~DownloadActionDelegate() = default;
44
Alex Deymo22ad8612015-11-20 17:59:11 -030045 // Called periodically after bytes are received. This method will be invoked
Alex Deymo542c19b2015-12-03 07:43:31 -030046 // only if the DownloadAction is running. |bytes_progressed| is the number of
47 // bytes downloaded since the last call of this method, |bytes_received|
48 // the number of bytes downloaded thus far and |total| is the number of bytes
49 // expected.
50 virtual void BytesReceived(uint64_t bytes_progressed,
51 uint64_t bytes_received,
52 uint64_t total) = 0;
53
54 // Returns whether the download should be canceled, in which case the
55 // |cancel_reason| error should be set to the reason why the download was
56 // canceled.
57 virtual bool ShouldCancel(ErrorCode* cancel_reason) = 0;
58
59 // Called once the complete payload has been downloaded. Note that any errors
60 // while applying or downloading the partial payload will result in this
61 // method not being called.
62 virtual void DownloadComplete() = 0;
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070063};
64
Darin Petkov73058b42010-10-06 16:32:19 -070065class PrefsInterface;
rspangler@google.com49fdf182009-10-10 00:57:34 +000066
Amin Hassani008c4582019-01-13 16:22:47 -080067class DownloadAction : public InstallPlanAction, public HttpFetcherDelegate {
rspangler@google.com49fdf182009-10-10 00:57:34 +000068 public:
Alex Deymof2858572016-02-25 11:20:13 -080069 // Debugging/logging
70 static std::string StaticType() { return "DownloadAction"; }
71
rspangler@google.com49fdf182009-10-10 00:57:34 +000072 // Takes ownership of the passed in HttpFetcher. Useful for testing.
73 // A good calling pattern is:
Amin Hassani538bd592020-11-04 20:46:08 -080074 // DownloadAction(prefs, boot_contol, hardware,
Amin Hassani7ecda262017-07-11 17:10:50 -070075 // new WhateverHttpFetcher, false);
Jay Srinivasanf0572052012-10-23 18:12:56 -070076 DownloadAction(PrefsInterface* prefs,
Alex Deymo1b3556c2016-02-03 09:54:02 -080077 BootControlInterface* boot_control,
78 HardwareInterface* hardware,
Amin Hassani7ecda262017-07-11 17:10:50 -070079 HttpFetcher* http_fetcher,
Kelvin Zhang1304fe72021-10-06 19:12:12 -070080 bool interactive,
81 std::string update_certs_path = constants::kUpdateCertificatesPath
82 );
Alex Deymo610277e2014-11-11 21:18:11 -080083 ~DownloadAction() override;
Alex Deymof2858572016-02-25 11:20:13 -080084
85 // InstallPlanAction overrides.
Alex Deymo610277e2014-11-11 21:18:11 -080086 void PerformAction() override;
Alex Deymof2858572016-02-25 11:20:13 -080087 void SuspendAction() override;
88 void ResumeAction() override;
Alex Deymo610277e2014-11-11 21:18:11 -080089 void TerminateProcessing() override;
Alex Deymof2858572016-02-25 11:20:13 -080090 std::string Type() const override { return StaticType(); }
rspangler@google.com49fdf182009-10-10 00:57:34 +000091
Andrew de los Reyesf9185172010-05-03 11:07:05 -070092 // Testing
Kelvin Zhang22b62e42020-12-14 14:50:40 -050093 void SetTestFileWriter(std::unique_ptr<DeltaPerformer> writer) {
94 delta_performer_ = std::move(writer);
95 }
Andrew de los Reyesf9185172010-05-03 11:07:05 -070096
Darin Petkov1023a602010-08-30 13:47:51 -070097 int GetHTTPResponseCode() { return http_fetcher_->http_response_code(); }
98
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070099 // HttpFetcherDelegate methods (see http_fetcher.h)
Amin Hassani0cd9d772018-07-31 23:55:43 -0700100 bool ReceivedBytes(HttpFetcher* fetcher,
101 const void* bytes,
102 size_t length) override;
Alex Deymo610277e2014-11-11 21:18:11 -0800103 void SeekToOffset(off_t offset) override;
Alex Deymo60ca1a72015-06-18 18:19:15 -0700104 void TransferComplete(HttpFetcher* fetcher, bool successful) override;
105 void TransferTerminated(HttpFetcher* fetcher) override;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000106
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700107 DownloadActionDelegate* delegate() const { return delegate_; }
Amin Hassani008c4582019-01-13 16:22:47 -0800108 void set_delegate(DownloadActionDelegate* delegate) { delegate_ = delegate; }
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700109
Sen Jiang5ae865b2017-04-18 14:24:40 -0700110 void set_base_offset(int64_t base_offset) { base_offset_ = base_offset; }
111
Darin Petkov9b230572010-10-08 10:20:09 -0700112 HttpFetcher* http_fetcher() { return http_fetcher_.get(); }
113
rspangler@google.com49fdf182009-10-10 00:57:34 +0000114 private:
Kelvin Zhangcc011d32020-07-10 18:20:08 -0400115 // Attempt to load cached manifest data from prefs
116 // return true on success, false otherwise.
117 bool LoadCachedManifest(int64_t manifest_size);
118
Sen Jiang6c736682017-03-10 15:01:36 -0800119 // Start downloading the current payload using delta_performer.
120 void StartDownloading();
121
Sen Jiang0affc2c2017-02-10 15:55:05 -0800122 // Pointer to the current payload in install_plan_.payloads.
123 InstallPlan::Payload* payload_{nullptr};
124
Amin Hassani538bd592020-11-04 20:46:08 -0800125 // Required pointers.
Darin Petkov73058b42010-10-06 16:32:19 -0700126 PrefsInterface* prefs_;
Alex Deymo1b3556c2016-02-03 09:54:02 -0800127 BootControlInterface* boot_control_;
128 HardwareInterface* hardware_;
Darin Petkov73058b42010-10-06 16:32:19 -0700129
Sen Jiang5ae865b2017-04-18 14:24:40 -0700130 // Pointer to the MultiRangeHttpFetcher that does the http work.
131 std::unique_ptr<MultiRangeHttpFetcher> http_fetcher_;
Jay Srinivasanedce2832012-10-24 18:57:47 -0700132
Amin Hassani7ecda262017-07-11 17:10:50 -0700133 // If |true|, the update is user initiated (vs. periodic update checks). Hence
134 // the |delta_performer_| can decide not to use O_DSYNC flag for faster
135 // update.
Amin Hassanied37d682018-04-06 13:22:00 -0700136 bool interactive_;
Amin Hassani7ecda262017-07-11 17:10:50 -0700137
Ben Chan02f7c1d2014-10-18 15:18:02 -0700138 std::unique_ptr<DeltaPerformer> delta_performer_;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000139
Darin Petkov9ce452b2010-11-17 14:33:28 -0800140 // Used by TransferTerminated to figure if this action terminated itself or
141 // was terminated by the action processor.
David Zeuthena99981f2013-04-29 13:42:47 -0700142 ErrorCode code_;
Darin Petkov9ce452b2010-11-17 14:33:28 -0800143
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700144 // For reporting status to outsiders
145 DownloadActionDelegate* delegate_;
Aaron Wood9321f502017-09-07 11:18:54 -0700146 uint64_t bytes_received_{0}; // per file/range
147 uint64_t bytes_received_previous_payloads_{0};
Sen Jiang5ae865b2017-04-18 14:24:40 -0700148 uint64_t bytes_total_{0};
Alex Deymo22ad8612015-11-20 17:59:11 -0300149 bool download_active_{false};
Darin Petkov9d911fa2010-08-19 09:36:08 -0700150
Sen Jiang5ae865b2017-04-18 14:24:40 -0700151 // Loaded from prefs before downloading any payload.
152 size_t resume_payload_index_{0};
153
154 // Offset of the payload in the download URL, used by UpdateAttempterAndroid.
155 int64_t base_offset_{0};
156
Kelvin Zhang1304fe72021-10-06 19:12:12 -0700157 // The path to the zip file with X509 certificates.
158 const std::string update_certificates_path_;
159
rspangler@google.com49fdf182009-10-10 00:57:34 +0000160 DISALLOW_COPY_AND_ASSIGN(DownloadAction);
161};
162
163// We want to be sure that we're compiled with large file support on linux,
164// just in case we find ourselves downloading large images.
Alex Vakulenko0103c362016-01-20 07:56:15 -0800165static_assert(8 == sizeof(off_t), "off_t not 64 bit");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000166
167} // namespace chromeos_update_engine
168
Kelvin Zhang1304fe72021-10-06 19:12:12 -0700169#endif // UPDATE_ENGINE_COMMON_DOWNLOAD_ACTION_H_