2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | /target | ||||||
|  | **/*.rs.bk | ||||||
							
								
								
									
										1274
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1274
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										25
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | [package] | ||||||
|  | name = "reveal-sync" | ||||||
|  | version = "0.1.0" | ||||||
|  | authors = ["Sean Cross <sean@xobs.io>"] | ||||||
|  | edition = "2018" | ||||||
|  |  | ||||||
|  | #[dependencies] | ||||||
|  | #clap = "2.25" | ||||||
|  | #error-type = "0.1" | ||||||
|  | #futures = "0.1" | ||||||
|  | #futures-cpupool = "0.1" | ||||||
|  | #git2 = "0.8" | ||||||
|  | #http = "0.1" | ||||||
|  | #hyper = "0.12" | ||||||
|  | ##hyper-staticfile = "0.3" | ||||||
|  | #serde_json = "1.0" | ||||||
|  | #websocket = "0.22" | ||||||
|  |  | ||||||
|  | [dependencies] | ||||||
|  | git2 = "0.8" | ||||||
|  | iron = "0.6" | ||||||
|  | mount = "0.4" | ||||||
|  | serde_json = "1.0" | ||||||
|  | staticfile = "0.5" | ||||||
|  | websocket = "0.22" | ||||||
							
								
								
									
										95
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | extern crate git2; | ||||||
|  | extern crate iron; | ||||||
|  | extern crate mount; | ||||||
|  | extern crate serde_json; | ||||||
|  | extern crate staticfile; | ||||||
|  |  | ||||||
|  | // This example serves the docs from target/doc/staticfile at /doc/ | ||||||
|  | // | ||||||
|  | // Run `cargo doc && cargo run --example doc_server`, then | ||||||
|  | // point your browser to http://127.0.0.1:3000/doc/ | ||||||
|  |  | ||||||
|  | use std::path::{Path, PathBuf}; | ||||||
|  |  | ||||||
|  | use iron::{Iron, IronResult, status}; | ||||||
|  | use iron::prelude::{Chain, Request, Response}; | ||||||
|  | use mount::Mount; | ||||||
|  | use staticfile::Static; | ||||||
|  |  | ||||||
|  | use git2::Repository; | ||||||
|  |  | ||||||
|  | struct WebHookConfig { | ||||||
|  |     secret: String, | ||||||
|  |     repo_root: PathBuf, | ||||||
|  |     repo_prefixes: Vec<String>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fn redeploy_repo(url: &str, path: &Path) -> Result<(), ()> { | ||||||
|  |     eprintln!("Cloning {}", url); | ||||||
|  |     let repo = match Repository::clone(url, path) { | ||||||
|  |         Ok(repo) => repo, | ||||||
|  |         Err(e) => panic!("failed to clone: {}", e), | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fn webhook(req: &mut Request, config: &WebHookConfig) -> IronResult<Response> { | ||||||
|  |     eprintln!("Webhook Request: {:?}", req); | ||||||
|  |     let v: serde_json::Value = serde_json::from_reader(&mut req.body).unwrap(); | ||||||
|  |  | ||||||
|  |     if let Some(found_secret) = v.get("secret") { | ||||||
|  |         if found_secret != &config.secret { | ||||||
|  |             return Ok(Response::with(status::Unauthorized)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         return Ok(Response::with(status::Unauthorized)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if let Some(repository) = v.get("repository") { | ||||||
|  |         if let Some(html_url) = repository.get("html_url") { | ||||||
|  |             if let Some(html_url_str) = html_url.as_str() { | ||||||
|  |                 if html_url_str.starts_with("https://git.xobs.io/xobs") { | ||||||
|  |                     redeploy_repo(html_url_str, &Path::new("C:\\Code\\talkserved")); | ||||||
|  |                 } | ||||||
|  |                 else { | ||||||
|  |                     eprintln!("HTML URL isn't a string"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 eprintln!("URL doesn't start with match"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             eprintln!("No HTML URL found"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         eprintln!("No repository key found"); | ||||||
|  |     } | ||||||
|  |     // eprintln!("Value: {:?}", v); | ||||||
|  |     Ok(Response::with(status::Ok)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fn main() { | ||||||
|  |     let mut mount = Mount::new(); | ||||||
|  |     let hostaddr = "0.0.0.0:9119".to_owned(); | ||||||
|  |     let config = WebHookConfig { | ||||||
|  |         secret: "1234".to_owned(), | ||||||
|  |         repo_root: Path::new("D:\\Code\\talkserved").to_path_buf(), | ||||||
|  |         repo_prefixes: vec!["https://git.xobs.io/xobs".to_owned()], | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     // Serve the shared JS/CSS at / | ||||||
|  |     mount.mount("/", Static::new(config.repo_root.clone())); | ||||||
|  |  | ||||||
|  |     // Listen for calls to "/webhook" and process accordingly | ||||||
|  |     mount.mount("/webhook", Chain::new(move |req: &mut Request| { | ||||||
|  |         webhook(req, &config) | ||||||
|  |     })); | ||||||
|  |  | ||||||
|  |     println!("Doc server running on http://{}", hostaddr); | ||||||
|  |  | ||||||
|  |     Iron::new(mount).http(hostaddr).unwrap(); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user