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