Fetch binaries.

This commit is contained in:
Gav Wood 2016-11-25 19:29:13 +01:00
parent 8cddf9976a
commit de8dd47ff9
No known key found for this signature in database
GPG Key ID: C49C1ACA1CC9B252
6 changed files with 55 additions and 6 deletions

1
Cargo.lock generated
View File

@ -287,6 +287,7 @@ dependencies = [
"ethash 1.4.0", "ethash 1.4.0",
"ethcore-bloom-journal 0.1.0", "ethcore-bloom-journal 0.1.0",
"ethcore-devtools 1.4.0", "ethcore-devtools 1.4.0",
"ethcore-hash-fetch 1.5.0",
"ethcore-io 1.5.0", "ethcore-io 1.5.0",
"ethcore-ipc 1.4.0", "ethcore-ipc 1.4.0",
"ethcore-ipc-codegen 1.4.0", "ethcore-ipc-codegen 1.4.0",

View File

@ -34,6 +34,7 @@ ethash = { path = "../ethash" }
ethcore-util = { path = "../util" } ethcore-util = { path = "../util" }
ethcore-io = { path = "../util/io" } ethcore-io = { path = "../util/io" }
ethcore-devtools = { path = "../devtools" } ethcore-devtools = { path = "../devtools" }
ethcore-hash-fetch = { path = "./hash-fetch" }
ethjson = { path = "../json" } ethjson = { path = "../json" }
ethcore-ipc = { path = "../ipc/rpc" } ethcore-ipc = { path = "../ipc/rpc" }
ethstore = { path = "../ethstore" } ethstore = { path = "../ethstore" }

View File

@ -30,4 +30,4 @@ mod client;
pub mod urlhint; pub mod urlhint;
pub use client::{HashFetch, Client}; pub use client::{HashFetch, Client, Error};

File diff suppressed because one or more lines are too long

View File

@ -14,11 +14,15 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
use std::sync::Weak; use std::sync::{Mutex, Weak, Arc};
use std::path::PathBuf;
use util::misc::{VersionInfo, ReleaseTrack, platform}; use util::misc::{VersionInfo, ReleaseTrack, platform};
use util::{Address, H160, H256, FixedHash}; use std::str::FromStr;
use util::{Bytes, Address, H160, H256, FixedHash};
use client::operations::Operations; use client::operations::Operations;
use client::{Client, UpdatePolicy, BlockId}; use client::{Client, BlockChainClient, UpdatePolicy, BlockId};
use fetch::HashFetch;
use fetch;
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub struct ReleaseInfo { pub struct ReleaseInfo {
@ -40,6 +44,7 @@ pub struct Updater {
client: Weak<Client>, client: Weak<Client>,
operations: Operations, operations: Operations,
update_policy: UpdatePolicy, update_policy: UpdatePolicy,
fetch_handler: Mutex<Option<fetch::Client>>,
// These don't change // These don't change
pub this: VersionInfo, pub this: VersionInfo,
@ -51,12 +56,38 @@ pub struct Updater {
const CLIENT_ID: &'static str = "parity"; const CLIENT_ID: &'static str = "parity";
struct FetchHandler {
client: Weak<Client>,
}
impl fetch::urlhint::ContractClient for FetchHandler {
fn registrar(&self) -> Result<Address, String> {
self.client.upgrade().ok_or_else(|| "Client not available".to_owned())?
.additional_params()
.get("registrar")
.and_then(|s| Address::from_str(s).ok())
.ok_or_else(|| "Registrar not available".into())
}
fn call(&self, address: Address, data: Bytes) -> Result<Bytes, String> {
self.client.upgrade().ok_or_else(|| "Client not available".to_owned())?
.call_contract(address, data)
}
}
fn start_fetch(client: Weak<Client>, hash: H256, on_done: Box<Fn(Result<PathBuf, fetch::Error>) + Send>) -> Result<fetch::Client, fetch::Error> {
let f = fetch::Client::new(Arc::new(FetchHandler { client: client, }));
let r = f.fetch(hash, on_done);
r.map(|_| f)
}
impl Updater { impl Updater {
pub fn new(client: Weak<Client>, operations: Address, update_policy: UpdatePolicy) -> Self { pub fn new(client: Weak<Client>, operations: Address, update_policy: UpdatePolicy) -> Self {
let mut u = Updater { let mut u = Updater {
client: client.clone(), client: client.clone(),
operations: Operations::new(operations, move |a, d| client.upgrade().ok_or("No client!".into()).and_then(|c| c.call_contract(a, d))), operations: Operations::new(operations, move |a, d| client.upgrade().ok_or("No client!".into()).and_then(|c| c.call_contract(a, d))),
update_policy: update_policy, update_policy: update_policy,
fetch_handler: Mutex::new(None),
this: VersionInfo::this(), this: VersionInfo::this(),
this_fork: None, this_fork: None,
latest: None, latest: None,
@ -140,6 +171,12 @@ impl Updater {
}) })
} }
fn fetch_done(&self, _r: Result<PathBuf, fetch::Error>) {
if let Ok(mut x) = self.fetch_handler.lock() {
*x = None;
}
}
pub fn tick(&mut self) { pub fn tick(&mut self) {
info!(target: "updater", "Current release is {}", self.this); info!(target: "updater", "Current release is {}", self.this);
@ -157,6 +194,15 @@ impl Updater {
"unreleased".into() "unreleased".into()
} }
); );
if let Some(b) = latest.track.binary {
if let Ok(mut fetch_handler) = self.fetch_handler.lock() {
if fetch_handler.is_none() {
let c = self.client.clone();
let f = move |r: Result<PathBuf, fetch::Error>| if let Some(c) = c.upgrade() { c.updater().as_ref().expect("updater exists; updater only owned by client; qed").fetch_done(r); };
*fetch_handler = start_fetch(self.client.clone(), b, Box::new(f)).ok();
}
}
}
info!(target: "updater", "Fork: this/current/latest/latest-known: {}/#{}/#{}/#{}", match self.this_fork { Some(f) => format!("#{}", f), None => "unknown".into(), }, current_number, latest.track.fork, latest.fork); info!(target: "updater", "Fork: this/current/latest/latest-known: {}/#{}/#{}/#{}", match self.this_fork { Some(f) => format!("#{}", f), None => "unknown".into(), }, current_number, latest.track.fork, latest.fork);
} }
} }

View File

@ -103,6 +103,7 @@ extern crate ethcore_bloom_journal as bloom_journal;
extern crate byteorder; extern crate byteorder;
extern crate transient_hashmap; extern crate transient_hashmap;
extern crate linked_hash_map; extern crate linked_hash_map;
extern crate ethcore_hash_fetch as fetch;
#[macro_use] #[macro_use]
extern crate log; extern crate log;