11use actix_cors:: Cors ;
2- use actix_web:: middleware:: Logger ;
3- use actix_web:: { get, post, web, App , HttpResponse , HttpServer , Responder , Result } ;
2+ use actix_web:: {
3+ get, middleware:: Logger , post, web, App , HttpResponse , HttpServer , Responder , Result ,
4+ } ;
45use actix_web_httpauth:: middleware:: HttpAuthentication ;
6+ use async_std:: prelude:: * ;
57use chrono:: Utc ;
68use serde:: { Deserialize , Serialize } ;
79use serde_json:: json;
8- use std:: fs;
9- use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
10- use std:: process;
11- use std:: process:: { Command , Output } ;
12- use std:: str;
13- use std:: thread;
10+ use std:: {
11+ fs,
12+ io:: Write ,
13+ net:: { IpAddr , Ipv4Addr , SocketAddr } ,
14+ process,
15+ process:: { Command , Output } ,
16+ str, thread,
17+ } ;
18+
1419#[ macro_use]
1520extern crate log;
16- use std:: io;
17- use std:: io:: Write ;
1821
1922mod auth;
2023
@@ -127,6 +130,25 @@ fn run_project(project: Project, mut log: std::fs::File, mut metadata_log: std::
127130 metadata_log. write_all ( json_metadata. as_bytes ( ) ) . unwrap ( ) ;
128131}
129132
133+ fn spawn_job ( logs_dir : & String , project : Project ) -> String {
134+ let job_name = create_job_name ( & project. name ) ;
135+ let file_name = create_log_name ( & job_name, logs_dir) ;
136+ let metadata_file_name = create_metadata_log_name ( & job_name, logs_dir) ;
137+
138+ fs:: create_dir_all ( logs_dir) . expect ( "Failed to create log directory" ) ;
139+
140+ let log = fs:: File :: create ( file_name) . expect ( "Failed to create log file" ) ;
141+ let metadata =
142+ fs:: File :: create ( metadata_file_name) . expect ( "Failed to create metadata log file" ) ;
143+
144+ thread:: spawn ( move || {
145+ debug ! ( "Starting to process {} project" , & project. name) ;
146+ run_project ( project, log, metadata)
147+ } ) ;
148+
149+ job_name
150+ }
151+
130152#[ post( "/webhook" ) ]
131153async fn webhook ( body : web:: Json < WebhookPayload > , ctx : web:: Data < Context > ) -> impl Responder {
132154 debug ! ( "Webhook recieved" ) ;
@@ -139,52 +161,43 @@ async fn webhook(body: web::Json<WebhookPayload>, ctx: web::Data<Context>) -> im
139161 . projects
140162 . into_iter ( )
141163 . find ( |project| project. name == body. name )
142- . map ( |project| {
143- let job_name = create_job_name ( & body. name ) ;
144- let file_name = create_log_name ( & job_name, & ctx. logs_dir ) ;
145- let metadata_file_name = create_metadata_log_name ( & job_name, & ctx. logs_dir ) ;
146-
147- fs:: create_dir_all ( & ctx. logs_dir ) . expect ( "Failed to create log directory" ) ;
148-
149- let log = fs:: File :: create ( file_name) . expect ( "Failed to create log file" ) ;
150- let metadata =
151- fs:: File :: create ( metadata_file_name) . expect ( "Failed to create metadata log file" ) ;
152-
153- thread:: spawn ( move || {
154- debug ! ( "Starting to process {} project" , & project. name) ;
155- run_project ( project, log, metadata)
156- } ) ;
157-
158- job_name
159- } ) ;
164+ . map ( |project| spawn_job ( & ctx. logs_dir , project) ) ;
160165
161166 match job_name {
162- Some ( job_name ) => HttpResponse :: Ok ( ) . body ( format ! ( "200 Ok\n Job: {}" , job_name ) ) ,
167+ Some ( job ) => HttpResponse :: Ok ( ) . body ( format ! ( "200 Ok\n Job: {}" , job ) ) ,
163168 None => HttpResponse :: NotFound ( ) . body ( "404 Not Found" ) ,
164169 }
165170}
166171
167- #[ get( "/logs " ) ]
168- async fn get_logs ( ctx : web:: Data < Context > ) -> impl Responder {
172+ #[ get( "/jobs " ) ]
173+ async fn get_jogs ( ctx : web:: Data < Context > ) -> Result < web :: Json < serde_json :: value :: Value > > {
169174 let log_dir = shellexpand:: tilde ( & ctx. logs_dir ) . into_owned ( ) ;
170- let logs = fs:: read_dir ( log_dir)
171- . unwrap ( )
172- . map ( |res| res. map ( |e| e. path ( ) . file_name ( ) . unwrap ( ) . to_owned ( ) ) )
173- . collect :: < Result < Vec < _ > , io:: Error > > ( )
174- . unwrap ( ) ;
175+ let mut logs: Vec < String > = Vec :: new ( ) ;
176+
177+ let mut dir = async_std:: fs:: read_dir ( log_dir) . await ?;
178+
179+ while let Some ( entry) = dir. next ( ) . await {
180+ let path = entry?. path ( ) ;
181+
182+ let name = path. file_name ( ) . unwrap ( ) . to_owned ( ) . into_string ( ) . unwrap ( ) ;
183+
184+ if name. ends_with ( ".json" ) {
185+ logs. push ( name. replace ( ".json" , "" ) ) ;
186+ }
187+ }
175188
176- HttpResponse :: Ok ( ) . body ( format ! ( "{:?}" , logs) )
189+ Ok ( web :: Json ( serde_json :: to_value ( & logs) ? ) )
177190}
178191
179- #[ get( "/logs/{log_name }" ) ]
180- async fn get_log (
181- log_name : web:: Path < String > ,
192+ #[ get( "/jobs/{job_name }" ) ]
193+ async fn get_job_by_name (
194+ job_name : web:: Path < String > ,
182195 ctx : web:: Data < Context > ,
183196) -> Result < web:: Json < serde_json:: value:: Value > > {
184197 let log_dir = shellexpand:: tilde ( & ctx. logs_dir ) . into_owned ( ) ;
185198
186- let log_file_name = format ! ( "{}/{}.log" , & log_dir, log_name ) ;
187- let metadata_file_name = format ! ( "{}/{}.json" , & log_dir, log_name ) ;
199+ let log_file_name = format ! ( "{}/{}.log" , & log_dir, job_name ) ;
200+ let metadata_file_name = format ! ( "{}/{}.json" , & log_dir, job_name ) ;
188201
189202 let log = async_std:: fs:: read_to_string ( log_file_name) . await ?;
190203 let metadata = async_std:: fs:: read_to_string ( metadata_file_name) . await ?;
@@ -303,8 +316,8 @@ async fn main() -> std::io::Result<()> {
303316 . wrap ( HttpAuthentication :: bearer ( auth:: validator) )
304317 . wrap ( Cors :: new ( ) . supports_credentials ( ) . finish ( ) )
305318 . service ( webhook)
306- . service ( get_log )
307- . service ( get_logs )
319+ . service ( get_jogs )
320+ . service ( get_job_by_name )
308321 } )
309322 . bind ( socket) ?
310323 . run ( )
0 commit comments