2b1152328e638494f389876e9b3d483d27795ae5
[sockgit.git] / src / main.rs
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 }