main.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. use std::fs::File;
  2. use std::io::BufReader;
  3. use crate::server::Server;
  4. use clap::{App, Arg};
  5. use tokio::runtime::Builder;
  6. use tokio_rustls::rustls::{internal::pemfile, Certificate, PrivateKey};
  7. mod client;
  8. mod connection;
  9. mod crypto;
  10. mod db;
  11. mod proto;
  12. mod protocol;
  13. mod server;
  14. fn main() {
  15. let matches = App::new("Rumble")
  16. .version("0.0.1")
  17. .about("Rumble is a mumble server written in Rust.")
  18. .arg(
  19. Arg::with_name("ip")
  20. .long("ip")
  21. .default_value("0.0.0.0")
  22. .takes_value(true)
  23. .help("Specific IP or hostname to bind to"),
  24. )
  25. .arg(
  26. Arg::with_name("port")
  27. .long("port")
  28. .short("p")
  29. .default_value("64738")
  30. .takes_value(true)
  31. .help("Port to use"),
  32. )
  33. .arg(
  34. Arg::with_name("certificate")
  35. .long("cert_file")
  36. .short("c")
  37. .takes_value(true)
  38. .required(true)
  39. .help("Path to a ssl certificate"),
  40. )
  41. .arg(
  42. Arg::with_name("private key")
  43. .long("private_key")
  44. .short("k")
  45. .takes_value(true)
  46. .required(true)
  47. .help("Path to a ssl keyfile"),
  48. )
  49. .get_matches();
  50. let ip = matches.value_of("ip").unwrap();
  51. let port = matches.value_of("port").unwrap();
  52. let cert_file = matches.value_of("certificate").unwrap();
  53. let keyfile = matches.value_of("private key").unwrap();
  54. let path = "db/".to_string();
  55. let config = server::Config {
  56. ip_address: ip.parse().unwrap(),
  57. port: port.parse().unwrap(),
  58. certificate: read_certificate(cert_file),
  59. private_key: read_private_key(keyfile),
  60. path_to_db_file: path,
  61. };
  62. let server = Server::new(config);
  63. let tokio_rt = Builder::new_multi_thread().enable_all().build().unwrap();
  64. tokio_rt.block_on(async {
  65. server.run().await;
  66. });
  67. }
  68. fn read_certificate(path: &str) -> Certificate {
  69. let mut file = BufReader::new(File::open(path).unwrap());
  70. pemfile::certs(&mut file).unwrap().remove(0)
  71. }
  72. fn read_private_key(path: &str) -> PrivateKey {
  73. let mut file = BufReader::new(File::open(path).unwrap());
  74. pemfile::pkcs8_private_keys(&mut file).unwrap().remove(0)
  75. }