first commit
This commit is contained in:
commit
fb5e0c7aef
5
.env.example
Normal file
5
.env.example
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
BUCKET_NAME=
|
||||||
|
AWS_ACCESS_KEY_ID=
|
||||||
|
AWS_SECRET_ACCESS_KEY=
|
||||||
|
AWS_REGION=
|
||||||
|
AWS_ENDPOINT_URL_S3=
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/target
|
||||||
|
.env
|
||||||
|
result.json
|
2769
Cargo.lock
generated
Normal file
2769
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
13
Cargo.toml
Normal file
13
Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "twimg-test"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
aws-config = { version = "1.5.13", features = ["behavior-version-latest"] }
|
||||||
|
aws-sdk-s3 = "1.68.0"
|
||||||
|
dotenvy = "0.15.7"
|
||||||
|
reqwest = { version = "0.12.12", features = ["rustls-tls"] }
|
||||||
|
serde = { version = "1.0.217", features = ["derive"] }
|
||||||
|
serde_json = "1.0.135"
|
||||||
|
tokio = { version = "1.43.0", features = ["full"] }
|
10
Dockerfile
Normal file
10
Dockerfile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
FROM rust:1.84 as builder
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
COPY . .
|
||||||
|
RUN cargo install --path .
|
||||||
|
|
||||||
|
FROM debian:bookworm-slim
|
||||||
|
COPY --from=builder /usr/local/cargo/bin/twimg-test /usr/local/bin/twimg-test
|
||||||
|
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||||
|
WORKDIR /app
|
||||||
|
CMD ["bash", "-c", "while :; do twimg-test; sleep 60; done"]
|
11
compose.yaml
Normal file
11
compose.yaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
services:
|
||||||
|
twimg-test:
|
||||||
|
image: sim1222/twimg-test:latest
|
||||||
|
build: .
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- v6
|
||||||
|
env_file: .env
|
||||||
|
networks:
|
||||||
|
v6:
|
||||||
|
enable_ipv6: true
|
219
src/main.rs
Normal file
219
src/main.rs
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
use std::{
|
||||||
|
env,
|
||||||
|
net::Ipv6Addr,
|
||||||
|
time::{Duration, SystemTime},
|
||||||
|
};
|
||||||
|
|
||||||
|
use dotenvy::dotenv;
|
||||||
|
use reqwest::Response;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tokio::{fs, time::Instant};
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
dotenv();
|
||||||
|
|
||||||
|
let ips: Vec<Ipv6Addr> = vec![
|
||||||
|
"2a04:4e42:1000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:11::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:12::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:13::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:14::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:15::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:16::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:17::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:19::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:1a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:1b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:1c::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:1d::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:1e::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:1f::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:200::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:20::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:21::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:22::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:23::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:24::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:25::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:26::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:27::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:29::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2d::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2e::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:2f::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:3000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:30::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:32::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:33::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:34::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:3::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:35::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:37::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:38::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:39::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:3a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:3b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:400::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4039::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:41::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:42::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:43::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:44::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:46::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:47::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:48::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:49::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4c::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4d::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4e::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:4f::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:5000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:50::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:51::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:52::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:54::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:5::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:56::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:58::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:59::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:5a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:600::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6012::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6015::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:601a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6048::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6069::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6076::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:608c::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:61::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:62::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:64::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:66::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:69::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:6f::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:70::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:71::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:72::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:73::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:74::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:75::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:76::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:77::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:78::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:79::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7c::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7d::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:7f::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:80::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:82::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:83::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:84::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:85::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:86::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:87::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:88::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:89::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8c::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8d::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8e::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:8f::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:9000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:9::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:a000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:a::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:b000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:b::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:c000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:c::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:d::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:f000::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fcf::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fd0::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fd1::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fd2::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fd9::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fda::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fdf::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fe4::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fe5::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fed::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:ff0::159".parse().unwrap(),
|
||||||
|
"2a04:4e42:fff::159".parse().unwrap(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let test_url = "https://pbs.twimg.com/media/GhPAiRlaEAA9h4z?format=jpg&name=4096x4096";
|
||||||
|
|
||||||
|
let client = reqwest::Client::builder()
|
||||||
|
.danger_accept_invalid_certs(true)
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct TestResult {
|
||||||
|
ip: Ipv6Addr,
|
||||||
|
duration: Duration,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct ResultJson {
|
||||||
|
tested_at: SystemTime,
|
||||||
|
results: Vec<TestResult>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut results: Vec<TestResult> = Vec::new();
|
||||||
|
|
||||||
|
for ip in ips {
|
||||||
|
let start = Instant::now();
|
||||||
|
let res = client
|
||||||
|
.get(test_url.replace("pbs.twimg.com", &format!("[{}]", &ip.to_string())))
|
||||||
|
.header(reqwest::header::HOST, "pbs.twimg.com")
|
||||||
|
.send()
|
||||||
|
.await;
|
||||||
|
let duration = start.elapsed();
|
||||||
|
println!("IP: {}, STATUS: {:?}, TIME: {:?}", ip, res, duration);
|
||||||
|
results.push(TestResult { ip, duration });
|
||||||
|
}
|
||||||
|
|
||||||
|
results.sort_by(|a, b| a.duration.cmp(&b.duration));
|
||||||
|
|
||||||
|
println!("{:#?}", results);
|
||||||
|
|
||||||
|
let result_json_name = std::path::Path::new("result.json");
|
||||||
|
let result_json = serde_json::to_string(&ResultJson {
|
||||||
|
tested_at: SystemTime::now(),
|
||||||
|
results,
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
fs::write(result_json_name, result_json).await.unwrap();
|
||||||
|
|
||||||
|
let config = aws_config::load_from_env().await;
|
||||||
|
let client = aws_sdk_s3::Client::new(&config);
|
||||||
|
let body = aws_sdk_s3::primitives::ByteStream::from_path(result_json_name)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
client
|
||||||
|
.put_object()
|
||||||
|
.bucket(env::var("BUCKET_NAME").unwrap())
|
||||||
|
.key("twimg/result.json")
|
||||||
|
.body(body)
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user