#outline #vpn #server-api #api #api-bindings #oulinevpn

outline_api

Outline VPN服务器API的实现

9个稳定版本

2.1.0 2023年12月3日
2.0.4 2023年11月28日
2.0.2 2023年9月14日
1.0.3 2023年9月8日

#706 in Web编程

MIT许可证

26KB
257

outline-api

本包实现了OutlineVPN管理API。

License Rust

安装

要使用此包,您需要在您的系统上安装Rust和Cargo。一旦安装,您可以通过运行以下命令将此包添加到您的应用程序中

cargo add outline-api

用法

您可以使用此库构建自己的OutlineVPN管理应用,例如

main.rs

extern crate toml;

use std::{fs, io, time::Duration};
use toml::Value;

fn main() {
    let toml_str = fs::read_to_string("config.toml").expect("Failed to read config file");

    let toml_value: Value = toml::from_str(&toml_str).expect("Failed to parse config.toml");

    let server_section = toml_value
        .get("server")
        .expect("Missing [server] section")
        .as_table()
        .expect("[server] section should be a table");

    let cert_sha256 = server_section
        .get("cert_sha256")
        .and_then(Value::as_str)
        .expect("Missing or invalid cert_sha256");

    let api_url = server_section
        .get("api_url")
        .and_then(Value::as_str)
        .expect("Missing or invalid api_url");

    let request_timeout = server_section
        .get("request_timeout_in_sec")
        .and_then(|timeout| timeout.as_integer())
        .map(|timeout_secs| Duration::from_secs(timeout_secs as u64))
        .expect("Missing or invalid request_timeout");

    let vpn = outline_api::new(cert_sha256, api_url, Some(request_timeout));

    match vpn.get_server_info() {
        Ok(info) => println!("Server info: {}", info),
        Err(err) => eprintln!("Error getting server info: {}", err),
    }

    let raw_id = get_user_input("Provide user ID:");
    match raw_id.parse::<u16>() {
        Ok(id) => match vpn.delete_access_key_by_id(&id) {
            Ok(info) => println!("response: {:?}\n", info),
            Err(err) => {
                eprintln!("Error delete_access_key_by_id: {}", err)
            }
        },
        Err(_) => {
            eprintln!("Failed to parse the ID input as number (u16)");
        }
    }

    fn get_user_input(prompt: &str) -> String {
        println!("{}", prompt);
        let mut input = String::new();
        io::stdin()
            .read_line(&mut input)
            .expect("Failed to read line");
        input.trim().to_string()
    }
}

config.toml

[server]
cert_sha256 = "CERT_SHA256" # like E2DE8...2A75D
api_url = "https://<IP_ADDR>:<PORT>/<SECRET>"
request_timeout_in_sec = 5

Outline API

以下是关于OutlineVPN API的一些重要说明

  • API的官方版本(见api.yml)并不完全正确。
  • 实际上,服务器上没有提供/access-keys/<ID>端点。

依赖

~6–19MB
~283K SLoC