From 34bc8434766ea69595e2b06336ef122dea046d96 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 27 Aug 2022 15:36:28 -0400 Subject: [PATCH] added pjsip generation --- Cargo.lock | 9 ++--- Cargo.toml | 4 ++- base-configs/pjsip.conf | 13 +++++-- examples/user.conf | 27 ++++++++++++++ examples/user.json | 6 ++++ src/lib.rs | 78 ++++++++++++++++++++++++++++++++++++----- 6 files changed, 121 insertions(+), 16 deletions(-) create mode 100644 examples/user.conf create mode 100644 examples/user.json diff --git a/Cargo.lock b/Cargo.lock index e2e81b0..a081283 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -198,6 +198,7 @@ version = "0.0.0" dependencies = [ "cfg-if 0.1.10", "console_error_panic_hook", + "serde", "serde_json", "worker", ] @@ -433,18 +434,18 @@ checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "serde" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index a2bcd66..7865c78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ default = ["console_error_panic_hook"] cfg-if = "0.1.2" worker = "0.0.9" serde_json = "1.0.67" +serde = "1.0.144" # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires @@ -22,4 +23,5 @@ console_error_panic_hook = { version = "0.1.1", optional = true } [profile.release] # Tell `rustc` to optimize for small code size. -opt-level = "s" \ No newline at end of file +opt-level = "s" +lto = true \ No newline at end of file diff --git a/base-configs/pjsip.conf b/base-configs/pjsip.conf index 64c4af1..506c94a 100644 --- a/base-configs/pjsip.conf +++ b/base-configs/pjsip.conf @@ -1,4 +1,4 @@ -[transport-udp-nat] +[transport-udp] type=transport protocol=udp bind=0.0.0.0 @@ -9,4 +9,13 @@ local_net=127.0.0.1/32 external_media_address=##EXTERNAL_IP## external_signaling_address=##EXTERNAL_IP## - +[transport-tcp] +type=transport +protocol=tcp +bind=0.0.0.0 +local_net=192.168.0.0/16 +local_net=10.0.0.0/8 +local_net=172.16.0.0/12 +local_net=127.0.0.1/32 +external_media_address=##EXTERNAL_IP## +external_signaling_address=##EXTERNAL_IP## diff --git a/examples/user.conf b/examples/user.conf new file mode 100644 index 0000000..462a650 --- /dev/null +++ b/examples/user.conf @@ -0,0 +1,27 @@ +[##EXT##] +type=endpoint +auth=##EXT## +aors=##EXT## +incoming_mwi_mailbox=##EXT##@default +mailboxes=##EXT##@default +mwi_from_user=##EXT## +allow=all +transport=transport-udp +transport=transport-tcp +context=internal +directmedia=no +rewrite_contact=yes +rtp_symmetric=yes +force_rport=yes + +[##EXT##] +type=auth +auth_type=userpass +password=##CALL## +username=##PASS## + +[##EXT##] +type=aor +max_contacts=1 +mailboxes=##EXT##@default + diff --git a/examples/user.json b/examples/user.json new file mode 100644 index 0000000..1ac4a14 --- /dev/null +++ b/examples/user.json @@ -0,0 +1,6 @@ +{ + "comment": "This is to store user info and password", + "created_at": "2020-01-01T00:00:00.000Z", + "ext": "122434", + "passwd": "password" +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 695eed1..9ca4d0b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,21 +1,32 @@ +use serde; use worker::*; #[event(fetch)] pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> Result { - // Create an instance of the Router, which can use parameters (/user/:name) or wildcard values // (/file/*pathname). Alternatively, use `Router::with_data(D)` and pass in arbitrary data for // routes to access and share using the `ctx.data()` method. let router = Router::new(); + #[derive(serde::Serialize, serde::Deserialize)] + struct UserInfo { + ext: String, + passwd: String, + comment: String, + created_at: String, + } + router .get_async("/asterisk/:hostname", |_req, ctx| async move { if let Some(hostname) = ctx.param("hostname") { let kv = ctx.kv("GONK_NODES")?; - return match kv.get("asterisk_base").cache_ttl(300).text().await? { - Some(a) => Response::ok(&a), - None => Response::error(format!("Could not find asterisk.conf for {}", hostname), 404), + return match kv.get("base_asterisk").cache_ttl(300).text().await? { + Some(a) => Response::ok(&a), + None => Response::error( + format!("Could not find asterisk.conf for {}", hostname), + 404, + ), }; } Response::error("Bad Request", 400) @@ -24,12 +35,61 @@ pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> Result Response::ok(&a), - None => Response::error(format!("Could not find pjsip.conf for {}", hostname), 404), + return match kv.get("base_pjsip").cache_ttl(300).text().await? { + Some(base) => { + let mut conf = base + ""; + let remote_ip = + match _req.headers().get("CF-Connecting-IP").unwrap_or_default() { + Some(ip) => ip, + None => return Response::error("Could not find remote IP", 500), + }; + + conf = conf.replace("##EXTERNAL_IP##", &remote_ip) + "\nxx"; + + match kv.get("users").cache_ttl(300).text().await? { + Some(users) => { + let users = users.split(","); + let base_user = + match kv.get("base_user").cache_ttl(300).text().await? { + Some(base) => base, + None => { + return Response::error("Could not find user_base", 500) + } + }; + + for u in users { + let mut user = base_user.clone(); + let info: UserInfo = + match kv.get(u).cache_ttl(300).json().await? { + Some(info) => info, + None => { + return Response::error( + format!("Could not find user {}", u), + 500, + ) + } + }; + + user = user.replace("##CALL##", u); + user = user.replace("##EXT##", &info.ext); + user = user.replace("##PASSWD##", &info.passwd); + + conf = conf + &user; + } + } + None => { + return Response::error(format!("Could not find gonk users"), 404); + } + } + Response::ok(&conf) + } + None => { + Response::error(format!("Could not find pjsip.conf for {}", hostname), 404) + } }; } Response::error("Bad Request", 400) }) - .run(req, env).await -} \ No newline at end of file + .run(req, env) + .await +}