Ver Fonte

Add sled db

Sergey Chushin há 3 anos atrás
pai
commit
34f4dae94c
5 ficheiros alterados com 217 adições e 13 exclusões
  1. 170 0
      Cargo.lock
  2. 3 0
      Cargo.toml
  3. 19 0
      src/db.rs
  4. 12 8
      src/main.rs
  5. 13 5
      src/server.rs

+ 170 - 0
Cargo.lock

@@ -32,6 +32,15 @@ version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "bitflags"
 version = "1.2.1"
@@ -44,6 +53,12 @@ version = "3.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe"
 
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
 [[package]]
 name = "bytes"
 version = "1.0.1"
@@ -77,12 +92,64 @@ dependencies = [
  "vec_map",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "lazy_static",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "lazy_static",
+]
+
 [[package]]
 name = "either"
 version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
 
+[[package]]
+name = "fs2"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
 [[package]]
 name = "getrandom"
 version = "0.2.2"
@@ -103,6 +170,15 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "instant"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "js-sys"
 version = "0.3.50"
@@ -124,6 +200,15 @@ version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714"
 
+[[package]]
+name = "lock_api"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176"
+dependencies = [
+ "scopeguard",
+]
+
 [[package]]
 name = "log"
 version = "0.4.14"
@@ -139,6 +224,15 @@ version = "2.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
 
+[[package]]
+name = "memoffset"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d"
+dependencies = [
+ "autocfg",
+]
+
 [[package]]
 name = "mio"
 version = "0.7.11"
@@ -186,6 +280,31 @@ version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
 
+[[package]]
+name = "parking_lot"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi",
+]
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.6"
@@ -330,9 +449,12 @@ dependencies = [
 name = "rumble"
 version = "0.1.0"
 dependencies = [
+ "bincode",
  "clap",
  "protobuf",
  "protoc-rust",
+ "serde",
+ "sled",
  "tokio",
  "tokio-rustls",
 ]
@@ -350,6 +472,12 @@ dependencies = [
  "webpki",
 ]
 
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
 [[package]]
 name = "sct"
 version = "0.6.0"
@@ -360,6 +488,48 @@ dependencies = [
  "untrusted",
 ]
 
+[[package]]
+name = "serde"
+version = "1.0.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "sled"
+version = "0.34.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d0132f3e393bcb7390c60bb45769498cf4550bcb7a21d7f95c02b69f6362cdc"
+dependencies = [
+ "crc32fast",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+ "fs2",
+ "fxhash",
+ "libc",
+ "log",
+ "parking_lot",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
+
 [[package]]
 name = "spin"
 version = "0.5.2"

+ 3 - 0
Cargo.toml

@@ -11,6 +11,9 @@ clap = "2.33.3"
 tokio = { version = "1.5.0", features = ["rt-multi-thread", "net", "io-util"] }
 tokio-rustls = "0.22.0"
 protobuf = "2.22.1"
+sled = "0.34.6"
+serde = { version = "1.0.125", features = ["derive"] }
+bincode = "1.3.3"
 
 [build-dependencies]
 protoc-rust = "2.22.1"

+ 19 - 0
src/db.rs

@@ -0,0 +1,19 @@
+pub struct Db {
+    db: sled::Db,
+    users: sled::Tree,
+    channels: sled::Tree,
+}
+
+impl Db {
+    pub fn open(path_to_db_file: &str) -> Self {
+        let db = sled::open(path_to_db_file).expect("Unable to open database");
+        let users = db.open_tree(USER_TREE_NAME).unwrap();
+        let channels = db.open_tree(CHANNEL_TREE_NAME).unwrap();
+
+        Db {
+            db,
+            users,
+            channels,
+        }
+    }
+}

+ 12 - 8
src/main.rs

@@ -1,12 +1,14 @@
-mod server;
-mod proto;
-mod protocol;
-
 use std::fs::File;
 use std::io::BufReader;
-use clap::{Arg, App};
+
+use clap::{App, Arg};
 use tokio::runtime::Builder;
-use tokio_rustls::rustls::{Certificate, PrivateKey, internal::pemfile};
+use tokio_rustls::rustls::{Certificate, internal::pemfile, PrivateKey};
+
+mod server;
+mod proto;
+mod protocol;
+mod db;
 
 fn main() {
     let matches = App::new("Rumble")
@@ -41,12 +43,14 @@ fn main() {
     let port = matches.value_of("port").unwrap();
     let cert_file = matches.value_of("certificate").unwrap();
     let keyfile = matches.value_of("private key").unwrap();
+    let path = "db/".to_string();
 
     let config = server::Config {
         ip_address: ip.parse().unwrap(),
         port: port.parse().unwrap(),
         certificate: read_certificate(cert_file),
-        private_key: read_private_key(keyfile)
+        private_key: read_private_key(keyfile),
+        path_to_db_file: path,
     };
 
     let tokio_rt = Builder::new_multi_thread()
@@ -54,7 +58,7 @@ fn main() {
         .build()
         .unwrap();
     tokio_rt.block_on(async {
-        server::run(config).await;
+        server::run(config).await.unwrap();
     });
 }
 

+ 13 - 5
src/server.rs

@@ -1,18 +1,25 @@
 use std::net::{IpAddr, SocketAddr};
 use std::sync::Arc;
+
 use tokio::net::{TcpListener, TcpStream};
-use tokio_rustls::rustls::{Certificate, PrivateKey, ServerConfig, NoClientAuth};
-use tokio_rustls::{TlsAcceptor, server::TlsStream};
-use crate::protocol::{MumblePacketStream};
+use tokio_rustls::{server::TlsStream, TlsAcceptor};
+use tokio_rustls::rustls::{Certificate, NoClientAuth, PrivateKey, ServerConfig};
+
+use crate::connection::Connection;
+use crate::db::Db;
+use crate::proto::mumble::Version;
+use crate::protocol::MumblePacketStream;
 
 pub struct Config {
     pub ip_address: IpAddr,
     pub port: u16,
     pub certificate: Certificate,
     pub private_key: PrivateKey,
+    pub path_to_db_file: String,
 }
 
 pub async fn run(config: Config) -> std::io::Result<()> {
+    let db = Arc::new(Db::open(&config.path_to_db_file));
     let mut tls_config = ServerConfig::new(NoClientAuth::new());
     tls_config.set_single_cert(vec![config.certificate], config.private_key)
         .expect("Invalid private key");
@@ -25,14 +32,15 @@ pub async fn run(config: Config) -> std::io::Result<()> {
     loop {
         let (stream, _) = listener.accept().await?;
         let acceptor = acceptor.clone();
+        let db = Arc::clone(&db);
 
         tokio::spawn(async move {
             let stream = acceptor.accept(stream).await;
             if let Ok(stream) = stream {
-                process(MumblePacketStream::new(stream)).await;
+                process(db, MumblePacketStream::new(stream)).await;
             }
         });
     }
 }
 
-async fn process(stream: MumblePacketStream<TlsStream<TcpStream>>) {}
+async fn process(db: Arc<Db>, stream: MumblePacketStream<TlsStream<TcpStream>>) {}