added pjsip generation

This commit is contained in:
Alex 2022-08-27 15:36:28 -04:00
parent 6c338e14bb
commit 34bc843476
Signed by: technically
GPG Key ID: 46E0A080F69E83F1
6 changed files with 121 additions and 16 deletions

9
Cargo.lock generated
View File

@ -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",

View File

@ -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"
opt-level = "s"
lto = true

View File

@ -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##

27
examples/user.conf Normal file
View File

@ -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

6
examples/user.json Normal file
View File

@ -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"
}

View File

@ -1,21 +1,32 @@
use serde;
use worker::*;
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> Result<Response> {
// 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<Respo
if let Some(hostname) = ctx.param("hostname") {
let kv = ctx.kv("GONK_NODES")?;
return match kv.get("pjspi_base").cache_ttl(300).text().await? {
Some(a) => 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
}
.run(req, env)
.await
}