| 1 | use std::io; |
| 2 | use std::env; |
| 3 | use std::path; |
| 4 | use std::error; |
| 5 | use git2; |
| 6 | |
| 7 | fn check_ip() -> Result<(), io::Error> { |
| 8 | match env::var("REMOTE_ADDR") { |
| 9 | Ok(remote_ip) => match env::var("WHITELIST_IP") { |
| 10 | Ok(whitelist_ip) => { |
| 11 | if remote_ip == whitelist_ip { |
| 12 | Ok(()) |
| 13 | } else { |
| 14 | Err(io::Error::new(io::ErrorKind::ConnectionRefused, format!("Blocked connection from {}", remote_ip))) |
| 15 | } |
| 16 | } |
| 17 | Err(e) => Err(io::Error::new(io::ErrorKind::ConnectionRefused, e)), |
| 18 | } |
| 19 | Err(e) => Err(io::Error::new(io::ErrorKind::ConnectionRefused, e)), |
| 20 | } |
| 21 | } |
| 22 | |
| 23 | fn main() -> Result<(), Box<dyn error::Error>> { |
| 24 | match check_ip() { |
| 25 | Ok(()) => { |
| 26 | let mut repo_name = String::new(); |
| 27 | io::stdin().read_line(&mut repo_name)?; |
| 28 | // remove trailing newline |
| 29 | repo_name.pop(); |
| 30 | |
| 31 | let mut opts = git2::RepositoryInitOptions::new(); |
| 32 | git2::RepositoryInitOptions::bare(&mut opts, true) |
| 33 | .mode(git2::RepositoryInitMode::SHARED_GROUP) |
| 34 | .no_reinit(true) |
| 35 | .template_path(path::Path::new("./templates")); |
| 36 | |
| 37 | let repo = git2::Repository::init_opts(format!("{}.git", repo_name), &opts)?; |
| 38 | |
| 39 | let public_user = env::var("USER").unwrap(); |
| 40 | let public_name = env::var("PUBLIC").unwrap(); |
| 41 | let public_path = env::var("PATH").unwrap(); |
| 42 | repo.remote( |
| 43 | &public_name, |
| 44 | &format!( |
| 45 | "{user}@{public}:{path}/{repo}.git", |
| 46 | user = public_user, |
| 47 | public = public_name, |
| 48 | path = public_path, |
| 49 | repo = repo_name |
| 50 | ) |
| 51 | )?; |
| 52 | Ok(()) |
| 53 | } |
| 54 | Err(e) => Err(Box::new(e)), |
| 55 | } |
| 56 | } |