cashierd.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. use std::net::SocketAddr;
  2. use std::str;
  3. use std::sync::Arc;
  4. use std::fs::OpenOptions;
  5. use std::io::Read;
  6. use std::{fs, path::Path, path::PathBuf};
  7. use toml;
  8. use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
  9. use drk::cli::{CashierdCli, CashierdConfig};
  10. use drk::wallet::{WalletDb, WalletPtr};
  11. use drk::service::CashierService;
  12. use drk::util::join_config_path;
  13. use drk::Result;
  14. use async_executor::Executor;
  15. use easy_parallel::Parallel;
  16. fn setup_addr(address: Option<SocketAddr>, default: SocketAddr) -> SocketAddr {
  17. match address {
  18. Some(addr) => addr,
  19. None => default,
  20. }
  21. }
  22. async fn start(executor: Arc<Executor<'_>>, config: Arc<&CashierdConfig>) -> Result<()> {
  23. let accept_addr: SocketAddr = config.accept_url.parse()?;
  24. let database_path = config.database_path.clone();
  25. let database_path = join_config_path(&PathBuf::from(database_path))?;
  26. let rocks = Rocks::new(&database_path)?;
  27. let rocks_cashierstore_column = RocksColumn::<columns::CashierKeys>::new(rocks);
  28. // Use pw: PASSWORD for now
  29. //let cashier_wallet = Arc::new(WalletDB::new("cashier.db", "PASSWORD")?);
  30. let wallet = Arc::new(WalletDb::new("cashier.db", config.password.clone())?);
  31. let cashier = CashierService::new(accept_addr, rocks_cashierstore_column, wallet)?;
  32. cashier.start(executor.clone()).await?;
  33. Ok(())
  34. }
  35. fn main() -> Result<()> {
  36. use simplelog::*;
  37. let ex = Arc::new(Executor::new());
  38. let (signal, shutdown) = async_channel::unbounded::<()>();
  39. let path = join_config_path(&PathBuf::from("cashierd.toml")).unwrap();
  40. let config: CashierdConfig = if Path::new(&path).exists() {
  41. CashierdConfig::load(path)?
  42. } else {
  43. CashierdConfig::load_default(path)?
  44. };
  45. let config_ptr = Arc::new(&config);
  46. let options = CashierdCli::load()?;
  47. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  48. let debug_level = if options.verbose {
  49. LevelFilter::Debug
  50. } else {
  51. LevelFilter::Off
  52. };
  53. let log_path = config.log_path.clone();
  54. CombinedLogger::init(vec![
  55. TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
  56. WriteLogger::new(
  57. LevelFilter::Debug,
  58. Config::default(),
  59. std::fs::File::create(log_path).unwrap(),
  60. ),
  61. ])
  62. .unwrap();
  63. let ex2 = ex.clone();
  64. let (_, result) = Parallel::new()
  65. // Run four executor threads.
  66. .each(0..3, |_| smol::future::block_on(ex.run(shutdown.recv())))
  67. // Run the main future on the current thread.
  68. .finish(|| {
  69. smol::future::block_on(async move {
  70. start(ex2, config_ptr).await?;
  71. drop(signal);
  72. Ok::<(), drk::Error>(())
  73. })
  74. });
  75. result
  76. }