net.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. use std::{net::SocketAddr, str::FromStr, sync::Arc};
  2. use async_executor::Executor;
  3. use clap::Parser;
  4. use darkfi::{net, Result};
  5. async fn start(executor: Arc<Executor<'_>>, options: ProgramOptions) -> Result<()> {
  6. let p2p = net::P2p::new(options.network_settings);
  7. p2p.clone().start(executor.clone()).await?;
  8. p2p.run(executor).await?;
  9. Ok(())
  10. }
  11. struct ProgramOptions {
  12. network_settings: net::Settings,
  13. log_path: Box<std::path::PathBuf>,
  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. /// Logfile path
  31. #[clap(long)]
  32. pub log_path: Option<String>,
  33. /// RPC port
  34. #[clap(long)]
  35. pub rpc_port: Option<String>,
  36. }
  37. impl ProgramOptions {
  38. fn load() -> Result<ProgramOptions> {
  39. let programcli = DarkCli::parse();
  40. let accept_addr = if let Some(accept_addr) = programcli.accept {
  41. Some(accept_addr.parse()?)
  42. } else {
  43. None
  44. };
  45. let mut seed_addrs: Vec<SocketAddr> = vec![];
  46. if let Some(seeds) = programcli.seeds {
  47. for seed in seeds {
  48. seed_addrs.push(seed.parse()?);
  49. }
  50. }
  51. let mut manual_connects: Vec<SocketAddr> = vec![];
  52. if let Some(connections) = programcli.connect {
  53. for connect in connections {
  54. manual_connects.push(connect.parse()?);
  55. }
  56. }
  57. let connection_slots = if let Some(connection_slots) = programcli.connect_slots {
  58. connection_slots
  59. } else {
  60. 0
  61. };
  62. let log_path = Box::new(if let Some(log_path) = programcli.log_path {
  63. std::path::PathBuf::from_str(&log_path)?
  64. } else {
  65. std::path::PathBuf::from_str("hello")?
  66. });
  67. Ok(ProgramOptions {
  68. network_settings: net::Settings {
  69. inbound: accept_addr,
  70. outbound_connections: connection_slots,
  71. external_addr: accept_addr,
  72. peers: manual_connects,
  73. seeds: seed_addrs,
  74. ..Default::default()
  75. },
  76. log_path,
  77. })
  78. }
  79. }
  80. fn main() -> Result<()> {
  81. use simplelog::*;
  82. let options = ProgramOptions::load()?;
  83. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  84. CombinedLogger::init(vec![
  85. TermLogger::new(LevelFilter::Debug, logger_config, TerminalMode::Mixed, ColorChoice::Auto),
  86. WriteLogger::new(
  87. LevelFilter::Debug,
  88. Config::default(),
  89. std::fs::File::create(options.log_path.as_path()).unwrap(),
  90. ),
  91. ])
  92. .unwrap();
  93. let ex = Arc::new(Executor::new());
  94. smol::block_on(ex.run(start(ex.clone(), options)))
  95. /*
  96. let (_, result) = Parallel::new()
  97. // Run four executor threads.
  98. .each(0..3, |_| smol::future::block_on(ex.run(shutdown.recv())))
  99. // Run the main future on the current thread.
  100. .finish(|| {
  101. smol::future::block_on(async move {
  102. start(ex2, options).await?;
  103. drop(signal);
  104. Ok::<(), drk::Error>(())
  105. })
  106. });
  107. result
  108. */
  109. }