Fetch binaries.
This commit is contained in:
parent
8cddf9976a
commit
de8dd47ff9
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -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",
|
||||||
|
@ -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" }
|
||||||
|
@ -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
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user