net.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. use std::{net::SocketAddr, str::FromStr, 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. log_path: Box<std::path::PathBuf>,
  15. }
  16. #[derive(Parser)]
  17. #[clap(name = "dnode")]
  18. pub struct DarkCli {
  19. /// accept address
  20. #[clap(short, long)]
  21. pub accept: Option<String>,
  22. /// seed nodes
  23. #[clap(long, short)]
  24. pub seeds: Option<Vec<String>>,
  25. /// manual connections
  26. #[clap(short, short)]
  27. pub connect: Option<Vec<String>>,
  28. /// connections slots
  29. #[clap(long)]
  30. pub connect_slots: Option<u32>,
  31. /// Logfile path
  32. #[clap(long)]
  33. pub log_path: Option<String>,
  34. /// RPC port
  35. #[clap(long)]
  36. pub rpc_port: Option<String>,
  37. }
  38. impl ProgramOptions {
  39. fn load() -> Result<ProgramOptions> {
  40. let programcli = DarkCli::parse();
  41. let accept_addr = if let Some(accept_addr) = programcli.accept {
  42. Some(accept_addr.parse()?)
  43. } else {
  44. None
  45. };
  46. let mut seed_addrs: Vec<SocketAddr> = vec![];
  47. if let Some(seeds) = programcli.seeds {
  48. for seed in seeds {
  49. seed_addrs.push(seed.parse()?);
  50. }
  51. }
  52. let mut manual_connects: Vec<SocketAddr> = vec![];
  53. if let Some(connections) = programcli.connect {
  54. for connect in connections {
  55. manual_connects.push(connect.parse()?);
  56. }
  57. }
  58. let connection_slots = if let Some(connection_slots) = programcli.connect_slots {
  59. connection_slots
  60. } else {
  61. 0
  62. };
  63. let log_path = Box::new(if let Some(log_path) = programcli.log_path {
  64. std::path::PathBuf::from_str(&log_path)?
  65. } else {
  66. std::path::PathBuf::from_str("hello")?
  67. });
  68. Ok(ProgramOptions {
  69. network_settings: net::Settings {
  70. inbound: accept_addr,
  71. outbound_connections: connection_slots,
  72. external_addr: accept_addr,
  73. peers: manual_connects,
  74. seeds: seed_addrs,
  75. ..Default::default()
  76. },
  77. log_path,
  78. })
  79. }
  80. }
  81. fn main() -> Result<()> {
  82. let options = ProgramOptions::load()?;
  83. let (lvl, conf) = log_config(1)?;
  84. TermLogger::init(lvl, conf, TerminalMode::Mixed, ColorChoice::Auto)?;
  85. let ex = Arc::new(Executor::new());
  86. smol::block_on(ex.run(start(ex.clone(), options)))
  87. }