Add request-count check; Clean up solana-drone and fmt
This commit is contained in:
committed by
Greg Fitzgerald
parent
e57dae0f31
commit
64cf69045a
@ -14,20 +14,21 @@ use getopts::Options;
|
|||||||
use solana::crdt::get_ip_addr;
|
use solana::crdt::get_ip_addr;
|
||||||
use solana::drone::{Drone, DroneRequest};
|
use solana::drone::{Drone, DroneRequest};
|
||||||
use solana::mint::MintDemo;
|
use solana::mint::MintDemo;
|
||||||
use solana::signature::GenKeys;
|
// use solana::signature::GenKeys;
|
||||||
|
use std::env;
|
||||||
use std::io::{stdin, Read};
|
use std::io::{stdin, Read};
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::env;
|
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use tokio_codec::{Decoder, BytesCodec};
|
use std::thread;
|
||||||
|
// use std::time::Duration;
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
use tokio::prelude::*;
|
use tokio::prelude::*;
|
||||||
|
use tokio_codec::{BytesCodec, Decoder};
|
||||||
|
|
||||||
fn print_usage(program: &str, opts: Options) {
|
fn print_usage(program: &str, opts: Options) {
|
||||||
// TODO: Write this help information
|
|
||||||
let mut brief = format!("Usage: cat <transaction.log> | {} [options]\n\n", program);
|
let mut brief = format!("Usage: cat <transaction.log> | {} [options]\n\n", program);
|
||||||
brief += " This is dummy content and still needs updating\n";
|
brief += " Run a Solana Drone to act as the custodian of the mint's remaining tokens\n";
|
||||||
|
|
||||||
print!("{}", opts.usage(&brief));
|
print!("{}", opts.usage(&brief));
|
||||||
}
|
}
|
||||||
@ -35,7 +36,12 @@ fn print_usage(program: &str, opts: Options) {
|
|||||||
fn main() {
|
fn main() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
let mut opts = Options::new();
|
let mut opts = Options::new();
|
||||||
opts.optopt("t", "", "time", "time slice over which to limit token requests to drone");
|
opts.optopt(
|
||||||
|
"t",
|
||||||
|
"",
|
||||||
|
"time",
|
||||||
|
"time slice over which to limit token requests to drone",
|
||||||
|
);
|
||||||
opts.optopt("c", "", "cap", "request limit for time slice");
|
opts.optopt("c", "", "cap", "request limit for time slice");
|
||||||
opts.optflag("h", "help", "print help");
|
opts.optflag("h", "help", "print help");
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
@ -53,16 +59,22 @@ fn main() {
|
|||||||
}
|
}
|
||||||
let time_slice: Option<u64>;
|
let time_slice: Option<u64>;
|
||||||
if matches.opt_present("t") {
|
if matches.opt_present("t") {
|
||||||
time_slice = matches.opt_str("t").expect("unexpected string from input").parse().ok();
|
time_slice = matches
|
||||||
}
|
.opt_str("t")
|
||||||
else {
|
.expect("unexpected string from input")
|
||||||
|
.parse()
|
||||||
|
.ok();
|
||||||
|
} else {
|
||||||
time_slice = None;
|
time_slice = None;
|
||||||
}
|
}
|
||||||
let request_cap: Option<u64>;
|
let request_cap: Option<u64>;
|
||||||
if matches.opt_present("c") {
|
if matches.opt_present("c") {
|
||||||
request_cap = matches.opt_str("c").expect("unexpected string from input").parse().ok();
|
request_cap = matches
|
||||||
}
|
.opt_str("c")
|
||||||
else {
|
.expect("unexpected string from input")
|
||||||
|
.parse()
|
||||||
|
.ok();
|
||||||
|
} else {
|
||||||
request_cap = None;
|
request_cap = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,26 +103,44 @@ fn main() {
|
|||||||
transactions_addr.set_port(8000);
|
transactions_addr.set_port(8000);
|
||||||
let mut requests_addr = drone_addr.clone();
|
let mut requests_addr = drone_addr.clone();
|
||||||
requests_addr.set_port(8003);
|
requests_addr.set_port(8003);
|
||||||
let drone = Arc::new(Mutex::new(Drone::new(mint_keypair, drone_addr, transactions_addr, requests_addr, time_slice, request_cap)));
|
let drone = Arc::new(Mutex::new(Drone::new(
|
||||||
|
mint_keypair,
|
||||||
|
drone_addr,
|
||||||
|
transactions_addr,
|
||||||
|
requests_addr,
|
||||||
|
time_slice,
|
||||||
|
request_cap,
|
||||||
|
)));
|
||||||
|
|
||||||
|
let drone1 = drone.clone();
|
||||||
|
thread::spawn(move || loop {
|
||||||
|
let time = drone1.lock().unwrap().time_slice;
|
||||||
|
thread::sleep(time);
|
||||||
|
drone1.lock().unwrap().clear_request_count();
|
||||||
|
});
|
||||||
|
|
||||||
let socket = TcpListener::bind(&drone_addr).unwrap();
|
let socket = TcpListener::bind(&drone_addr).unwrap();
|
||||||
println!("Listening on: {}", drone_addr);
|
println!("Drone started. Listening on: {}", drone_addr);
|
||||||
let done = socket
|
let done = socket
|
||||||
.incoming()
|
.incoming()
|
||||||
.map_err(|e| println!("failed to accept socket; error = {:?}", e))
|
.map_err(|e| println!("failed to accept socket; error = {:?}", e))
|
||||||
.for_each(move |socket| {
|
.for_each(move |socket| {
|
||||||
let drone1 = drone.clone();
|
let drone2 = drone.clone();
|
||||||
let client_ip = socket.peer_addr().expect("drone peer_addr").ip();
|
// let client_ip = socket.peer_addr().expect("drone peer_addr").ip();
|
||||||
let framed = BytesCodec::new().framed(socket);
|
let framed = BytesCodec::new().framed(socket);
|
||||||
let (_writer, reader) = framed.split();
|
let (_writer, reader) = framed.split();
|
||||||
|
|
||||||
let processor = reader
|
let processor = reader
|
||||||
.for_each(move |bytes| {
|
.for_each(move |bytes| {
|
||||||
let req: DroneRequest = deserialize(&bytes).expect("deserialize packet in drone");
|
let req: DroneRequest =
|
||||||
println!("req: {:?}", req);
|
deserialize(&bytes).expect("deserialize packet in drone");
|
||||||
let result = drone1.lock().unwrap().check_rate_limit(client_ip);
|
println!("Airdrop requested...");
|
||||||
println!("ip check: {:?}", result);
|
// let res = drone2.lock().unwrap().check_rate_limit(client_ip);
|
||||||
let result1 = drone1.lock().unwrap().send_airdrop(req);
|
let res1 = drone2.lock().unwrap().send_airdrop(req);
|
||||||
println!("data: {:?}", result1);
|
match res1 {
|
||||||
|
Ok(_) => println!("Airdrop sent!"),
|
||||||
|
Err(_) => println!("Request limit reached for this time slice"),
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
.and_then(|()| {
|
.and_then(|()| {
|
||||||
|
Reference in New Issue
Block a user