diff --git a/.gitignore b/.gitignore index ea8c4bf..272101a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/target +target +client/venv diff --git a/Cargo.lock b/Cargo.lock index a32fb63..e152190 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -815,6 +815,15 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchit" version = "0.8.4" @@ -1115,11 +1124,13 @@ name = "rdockup" version = "0.1.0" dependencies = [ "axum", + "log", "oci-client", "serde", "serde_json", "tokio", "tower-http", + "tracing", "tracing-subscriber", ] @@ -1140,8 +1151,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1152,9 +1172,15 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -1680,18 +1706,35 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 32660d7..09da5e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,4 +10,6 @@ axum = "0.8" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" tower-http = { version = "0.6", features = ["trace"] } -tracing-subscriber = "0.3" +tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } +tracing = "0.1" +log = "0.4" diff --git a/client/client b/client/client new file mode 100755 index 0000000..542fe86 --- /dev/null +++ b/client/client @@ -0,0 +1,52 @@ +#!/bin/env python + +import sys +import logging +import yaml +from requests import Session + + +# Global variables +base_url = "http://127.0.0.1:3000/api" + + +def get_events(s, image): + data = { + "image": image, + } + try: + r = s.post(base_url + "/tags", json=data) + return r.text + except Exception as e: + logging.error(e) + sys.exit(1) + + +def main(): + # Initialize logging + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", # Explicit date format + ) + + # Import config from file + with open("./config.yaml", "r", encoding="utf8") as file: + config = yaml.safe_load(file) + token = config["token"] + + # Read command line argument + image = sys.argv[1] + + s = Session() + s.headers.update( + { + 'Authorization': f"Bearer {token}", + 'Content-type': 'application/json' + } + ) + + print(get_events(s, image)) + +if __name__ == "__main__": + main() diff --git a/client/config.yaml b/client/config.yaml new file mode 100644 index 0000000..eaed224 --- /dev/null +++ b/client/config.yaml @@ -0,0 +1 @@ +token: my-secret-token diff --git a/client/requirements.txt b/client/requirements.txt new file mode 100644 index 0000000..def9526 --- /dev/null +++ b/client/requirements.txt @@ -0,0 +1,3 @@ +requests +pyyaml +logging diff --git a/src/api.rs b/src/api.rs index 3e12d19..0141b7d 100644 --- a/src/api.rs +++ b/src/api.rs @@ -19,7 +19,7 @@ fn validate_token(token: &str) -> bool { } pub fn create_router() -> Router { - Router::new().route("/tags", post(get_tags_handler)) + Router::new().route("/api/tags", post(get_tags_handler)) } async fn get_tags_handler( diff --git a/src/main.rs b/src/main.rs index 5c1f0af..1f227c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,30 @@ mod api; mod registry_client; -// use axum::Router; -use tower_http::trace::TraceLayer; -use tracing_subscriber::{filter::LevelFilter, layer::SubscriberExt, util::SubscriberInitExt}; +use tower_http::trace::{self, TraceLayer}; +use tracing::{Level, info}; +// use tracing_subscriber::EnvFilter; #[tokio::main] async fn main() { // Initialize logging for access logs - tracing_subscriber::registry() - .with(tracing_subscriber::fmt::layer()) - .with(LevelFilter::INFO) + tracing_subscriber::fmt() + // .with_env_filter( + // EnvFilter::try_from_default_env() + // .or_else(|_| EnvFilter::try_new("rdockup=error,tower_http=warn")) + // .unwrap(), + // ) + .with_target(false) + .json() .init(); // Build app with routes from api module and add logging middleware - let app = api::create_router().layer(TraceLayer::new_for_http()); - + let app = api::create_router().layer( + TraceLayer::new_for_http() + .make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO)) + .on_response(trace::DefaultOnResponse::new().level(Level::INFO)), + ); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); + info!("Starting server on {:?}", listener); axum::serve(listener, app).await.unwrap(); } diff --git a/src/registry_client.rs b/src/registry_client.rs index 716a434..59d8d9a 100644 --- a/src/registry_client.rs +++ b/src/registry_client.rs @@ -12,10 +12,12 @@ pub async fn get_tags(image: &str) -> Result> let client = Client::new(ClientConfig::default()); let img_ref: Reference = image.parse()?; let auth = RegistryAuth::Anonymous; - let tags = client.list_tags(&img_ref, &auth, None, None).await?; + let tags = client + .list_tags(&img_ref, &auth, Some(100), Some("17")) + .await?; let serialized_tags = SerializableTags { name: &tags.name, tags: &tags.tags, }; - Ok(serde_json::to_string_pretty(&serialized_tags)?) + Ok(serde_json::to_string(&serialized_tags)?) }