| Alex Deymo | aea4c1c | 2015-08-19 20:24:43 -0700 | [diff] [blame] | 1 | // | 
|  | 2 | // Copyright (C) 2013 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 | // | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 16 |  | 
| Gilad Arnold | cf175a0 | 2014-07-10 16:48:47 -0700 | [diff] [blame] | 17 | #ifndef UPDATE_ENGINE_P2P_MANAGER_H_ | 
|  | 18 | #define UPDATE_ENGINE_P2P_MANAGER_H_ | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 19 |  | 
|  | 20 | #include <string> | 
|  | 21 | #include <vector> | 
|  | 22 |  | 
|  | 23 | #include <base/callback.h> | 
| Alex Vakulenko | 75039d7 | 2014-03-25 12:36:28 -0700 | [diff] [blame] | 24 | #include <base/files/file_path.h> | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 25 | #include <base/memory/ref_counted.h> | 
| Alex Vakulenko | 75039d7 | 2014-03-25 12:36:28 -0700 | [diff] [blame] | 26 | #include <base/time/time.h> | 
| David Zeuthen | 92d9c8b | 2013-09-11 10:58:11 -0700 | [diff] [blame] | 27 | #include <policy/device_policy.h> | 
|  | 28 | #include <policy/libpolicy.h> | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 29 |  | 
| Alex Deymo | 39910dc | 2015-11-09 17:04:30 -0800 | [diff] [blame] | 30 | #include "update_engine/common/clock_interface.h" | 
|  | 31 | #include "update_engine/common/prefs_interface.h" | 
| Gilad Arnold | 4a0321b | 2014-10-28 15:57:30 -0700 | [diff] [blame] | 32 | #include "update_engine/update_manager/update_manager.h" | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 33 |  | 
|  | 34 | namespace chromeos_update_engine { | 
|  | 35 |  | 
|  | 36 | // Interface for sharing and discovering files via p2p. | 
|  | 37 | class P2PManager { | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 38 | public: | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 39 | // Interface used for P2PManager implementations. The sole reason | 
|  | 40 | // for this interface is unit testing. | 
|  | 41 | class Configuration { | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 42 | public: | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 43 | virtual ~Configuration() {} | 
|  | 44 |  | 
|  | 45 | // Gets the path to the p2p dir being used, e.g. /var/cache/p2p. | 
|  | 46 | virtual base::FilePath GetP2PDir() = 0; | 
|  | 47 |  | 
|  | 48 | // Gets the argument vector for starting (if |is_start| is True) | 
|  | 49 | // resp. stopping (if |is_start| is False) the p2p service | 
|  | 50 | // e.g. ["initctl", "start", "p2p"] or ["initctl", "stop", "p2p"]. | 
|  | 51 | virtual std::vector<std::string> GetInitctlArgs(bool is_start) = 0; | 
|  | 52 |  | 
|  | 53 | // Gets the argument vector for invoking p2p-client, e.g. | 
|  | 54 | // "p2p-client --get-url=file_id_we_want --minimum-size=42123". | 
|  | 55 | virtual std::vector<std::string> GetP2PClientArgs( | 
|  | 56 | const std::string& file_id, size_t minimum_size) = 0; | 
|  | 57 | }; | 
|  | 58 |  | 
|  | 59 | virtual ~P2PManager() {} | 
|  | 60 |  | 
|  | 61 | // The type for the callback used in LookupUrlForFile(). | 
|  | 62 | // If the lookup failed, |url| is empty. | 
|  | 63 | typedef base::Callback<void(const std::string& url)> LookupCallback; | 
|  | 64 |  | 
| David Zeuthen | 92d9c8b | 2013-09-11 10:58:11 -0700 | [diff] [blame] | 65 | // Use the device policy specified by |device_policy|. If this is | 
| Alex Vakulenko | 88b591f | 2014-08-28 16:48:57 -0700 | [diff] [blame] | 66 | // null, then no device policy is used. | 
| David Zeuthen | 92d9c8b | 2013-09-11 10:58:11 -0700 | [diff] [blame] | 67 | virtual void SetDevicePolicy(const policy::DevicePolicy* device_policy) = 0; | 
|  | 68 |  | 
| Gilad Arnold | 4a0321b | 2014-10-28 15:57:30 -0700 | [diff] [blame] | 69 | // Returns true iff P2P is currently allowed for use on this device. This | 
|  | 70 | // value is determined and maintained by the Update Manager. | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 71 | virtual bool IsP2PEnabled() = 0; | 
|  | 72 |  | 
|  | 73 | // Ensures that the p2p subsystem is running (e.g. starts it if it's | 
|  | 74 | // not already running) and blocks until this is so. Returns false | 
|  | 75 | // if an error occurred. | 
|  | 76 | virtual bool EnsureP2PRunning() = 0; | 
|  | 77 |  | 
|  | 78 | // Ensures that the p2p subsystem is not running (e.g. stops it if | 
|  | 79 | // it's running) and blocks until this is so. Returns false if an | 
|  | 80 | // error occurred. | 
|  | 81 | virtual bool EnsureP2PNotRunning() = 0; | 
|  | 82 |  | 
|  | 83 | // Cleans up files in /var/cache/p2p owned by this application as | 
|  | 84 | // per the |file_extension| and |num_files_to_keep| values passed | 
|  | 85 | // when the object was constructed. This may be called even if | 
|  | 86 | // the p2p subsystem is not running. | 
|  | 87 | virtual bool PerformHousekeeping() = 0; | 
|  | 88 |  | 
|  | 89 | // Asynchronously finds a peer that serves the file identified by | 
|  | 90 | // |file_id|. If |minimum_size| is non-zero, will find a peer that | 
|  | 91 | // has at least that many bytes. When the result is ready |callback| | 
| Alex Deymo | 0b3db6b | 2015-08-10 15:19:37 -0700 | [diff] [blame] | 92 | // is called from the current message loop. | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 93 | // | 
|  | 94 | // This operation may take a very long time to complete because part | 
|  | 95 | // of the p2p protocol involves waiting for the LAN-wide sum of all | 
|  | 96 | // num-connections to drop below a given threshold. However, if | 
|  | 97 | // |max_time_to_wait| is non-zero, the operation is guaranteed to | 
|  | 98 | // not exceed this duration. | 
|  | 99 | // | 
|  | 100 | // If the file is not available on the LAN (or if mDNS/DNS-SD is | 
|  | 101 | // filtered), this is guaranteed to not take longer than 5 seconds. | 
|  | 102 | virtual void LookupUrlForFile(const std::string& file_id, | 
|  | 103 | size_t minimum_size, | 
|  | 104 | base::TimeDelta max_time_to_wait, | 
|  | 105 | LookupCallback callback) = 0; | 
|  | 106 |  | 
|  | 107 | // Shares a file identified by |file_id| in the directory | 
|  | 108 | // /var/cache/p2p. Initially the file will not be visible, that is, | 
|  | 109 | // it will have a .tmp extension and not be shared via p2p. Use the | 
|  | 110 | // FileMakeVisible() method to change this. | 
|  | 111 | // | 
|  | 112 | // If you know the final size of the file, pass it in the | 
|  | 113 | // |expected_size| parameter. Otherwise pass zero. If non-zero, the | 
|  | 114 | // amount of free space in /var/cache/p2p is checked and if there is | 
|  | 115 | // less than twice the amount of space available, this method | 
|  | 116 | // fails. Additionally, disk space will be reserved via fallocate(2) | 
|  | 117 | // and |expected_size| is written to the user.cros-p2p-filesize | 
|  | 118 | // xattr of the created file. | 
|  | 119 | // | 
|  | 120 | // If the file already exists, true is returned. Any on-disk xattr | 
|  | 121 | // is not updated. | 
|  | 122 | virtual bool FileShare(const std::string& file_id, | 
|  | 123 | size_t expected_size) = 0; | 
|  | 124 |  | 
|  | 125 | // Gets a fully qualified path for the file identified by |file_id|. | 
|  | 126 | // If the file has not been shared already using the FileShare() | 
| Alex Vakulenko | 75039d7 | 2014-03-25 12:36:28 -0700 | [diff] [blame] | 127 | // method, an empty base::FilePath is returned - use FilePath::empty() to | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 128 | // find out. | 
|  | 129 | virtual base::FilePath FileGetPath(const std::string& file_id) = 0; | 
|  | 130 |  | 
|  | 131 | // Gets the actual size of the file identified by |file_id|. This is | 
|  | 132 | // equivalent to reading the value of the st_size field of the | 
|  | 133 | // struct stat on the file given by FileGetPath(). Returns -1 if an | 
|  | 134 | // error occurs. | 
|  | 135 | // | 
|  | 136 | // For a file just created with FileShare() this will return 0. | 
|  | 137 | virtual ssize_t FileGetSize(const std::string& file_id) = 0; | 
|  | 138 |  | 
|  | 139 | // Gets the expected size of the file identified by |file_id|. This | 
|  | 140 | // is equivalent to reading the value of the user.cros-p2p-filesize | 
|  | 141 | // xattr on the file given by FileGetPath(). Returns -1 if an error | 
|  | 142 | // occurs. | 
|  | 143 | // | 
|  | 144 | // For a file just created with FileShare() this will return the | 
|  | 145 | // value of the |expected_size| parameter passed to that method. | 
|  | 146 | virtual ssize_t FileGetExpectedSize(const std::string& file_id) = 0; | 
|  | 147 |  | 
|  | 148 | // Gets whether the file identified by |file_id| is publicly | 
| Alex Vakulenko | 88b591f | 2014-08-28 16:48:57 -0700 | [diff] [blame] | 149 | // visible. If |out_result| is not null, the result is returned | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 150 | // there. Returns false if an error occurs. | 
|  | 151 | virtual bool FileGetVisible(const std::string& file_id, | 
|  | 152 | bool *out_result) = 0; | 
|  | 153 |  | 
|  | 154 | // Makes the file identified by |file_id| publicly visible | 
|  | 155 | // (e.g. removes the .tmp extension). If the file is already | 
|  | 156 | // visible, this method does nothing. Returns False if | 
|  | 157 | // the method fails or there is no file for |file_id|. | 
|  | 158 | virtual bool FileMakeVisible(const std::string& file_id) = 0; | 
|  | 159 |  | 
|  | 160 | // Counts the number of shared files used by this application | 
|  | 161 | // (cf. the |file_extension parameter|. Returns -1 if an error | 
|  | 162 | // occurred. | 
|  | 163 | virtual int CountSharedFiles() = 0; | 
|  | 164 |  | 
|  | 165 | // Creates a suitable P2PManager instance and initializes the object | 
|  | 166 | // so it's ready for use. The |file_extension| parameter is used to | 
|  | 167 | // identify your application, use e.g. "cros_au".  If | 
| Alex Vakulenko | 88b591f | 2014-08-28 16:48:57 -0700 | [diff] [blame] | 168 | // |configuration| is non-null, the P2PManager will take ownership | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 169 | // of the Configuration object and use it (hence, it must be | 
|  | 170 | // heap-allocated). | 
|  | 171 | // | 
|  | 172 | // The |num_files_to_keep| parameter specifies how many files to | 
|  | 173 | // keep after performing housekeeping (cf. the PerformHousekeeping() | 
| David Zeuthen | 41f2cf5 | 2014-11-05 12:29:45 -0500 | [diff] [blame] | 174 | // method) - pass zero to allow infinitely many files. The | 
|  | 175 | // |max_file_age| parameter specifies the maximum file age after | 
|  | 176 | // performing housekeeping (pass zero to allow files of any age). | 
| Gilad Arnold | 4a0321b | 2014-10-28 15:57:30 -0700 | [diff] [blame] | 177 | static P2PManager* Construct( | 
|  | 178 | Configuration *configuration, | 
|  | 179 | ClockInterface *clock, | 
|  | 180 | chromeos_update_manager::UpdateManager* update_manager, | 
|  | 181 | const std::string& file_extension, | 
|  | 182 | const int num_files_to_keep, | 
|  | 183 | const base::TimeDelta& max_file_age); | 
| David Zeuthen | 27a48bc | 2013-08-06 12:06:29 -0700 | [diff] [blame] | 184 | }; | 
|  | 185 |  | 
|  | 186 | }  // namespace chromeos_update_engine | 
|  | 187 |  | 
| Gilad Arnold | cf175a0 | 2014-07-10 16:48:47 -0700 | [diff] [blame] | 188 | #endif  // UPDATE_ENGINE_P2P_MANAGER_H_ |