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