net.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use std::{net::SocketAddr, sync::Arc};
  2. use async_executor::Executor;
  3. use clap::Parser;
  4. use simplelog::*;
  5. use darkfi::{net, util::cli::log_config, Result};
  6. async fn start(executor: Arc<Executor<'_>>, options: ProgramOptions) -> Result<()> {
  7. let p2p = net::P2p::new(options.network_settings).await;
  8. p2p.clone().start(executor.clone()).await?;
  9. p2p.run(executor).await?;
  10. Ok(())
  11. }
  12. struct ProgramOptions {
  13. network_settings: net::Settings,
  14. }
  15. #[derive(Parser)]
  16. #[clap(name = "dnode")]
  17. pub struct DarkCli {
  18. /// accept address
  19. #[clap(short, long)]
  20. pub accept: Option<String>,
  21. /// seed nodes
  22. #[clap(long, short)]
  23. pub seeds: Option<Vec<String>>,
  24. /// manual connections
  25. #[clap(short, short)]
  26. pub connect: Option<Vec<String>>,
  27. /// connections slots
  28. #[clap(long)]
  29. pub connect_slots: Option<u32>,
  30. /// RPC port
  31. #[clap(long)]
  32. pub rpc_port: Option<String>,
  33. }
  34. impl ProgramOptions {
  35. fn load() -> Result<ProgramOptions> {
  36. let programcli = DarkCli::parse();
  37. let accept_addr = if let Some(accept_addr) = programcli.accept {
  38. Some(accept_addr.parse()?)
  39. } else {
  40. None
  41. };
  42. let mut seed_addrs: Vec<SocketAddr> = vec![];
  43. if let Some(seeds) = programcli.seeds {
  44. for seed in seeds {
  45. seed_addrs.push(seed.parse()?);
  46. }
  47. }
  48. let mut manual_connects: Vec<SocketAddr> = vec![];
  49. if let Some(connections) = programcli.connect {
  50. for connect in connections {
  51. manual_connects.push(connect.parse()?);
  52. }
  53. }
  54. let connection_slots = if let Some(connection_slots) = programcli.connect_slots {
  55. connection_slots
  56. } else {
  57. 0
  58. };
  59. Ok(ProgramOptions {
  60. network_settings: net::Settings {
  61. inbound: accept_addr,
  62. outbound_connections: connection_slots,
  63. external_addr: accept_addr,
  64. peers: manual_connects,
  65. seeds: seed_addrs,
  66. ..Default::default()
  67. },
  68. })
  69. }
  70. }
  71. fn main() -> Result<()> {
  72. let options = ProgramOptions::load()?;
  73. let (lvl, conf) = log_config(1)?;
  74. TermLogger::init(lvl, conf, TerminalMode::Mixed, ColorChoice::Auto)?;
  75. let ex = Arc::new(Executor::new());
  76. smol::block_on(ex.run(start(ex.clone(), options)))
  77. }