167 lines
4.2 KiB
V
167 lines
4.2 KiB
V
module main
|
|
|
|
import json
|
|
import os
|
|
import term
|
|
|
|
struct Person {
|
|
mut:
|
|
username string [json: Username]
|
|
email string [json: Email]
|
|
pubkey string [json: Pubkey]
|
|
desc string [json: Desc]
|
|
}
|
|
|
|
fn init() {
|
|
if os.args.len < 2 {
|
|
fail("please supply a file as an argument")
|
|
exit(1)
|
|
}
|
|
|
|
if !os.exists(os.args[1]) {
|
|
fail("file \"${os.args[1]}\" does not exist")
|
|
exit(1)
|
|
}
|
|
}
|
|
|
|
fn fail(msg string) {
|
|
eprintln(term.bright_red("!ERR! :: $msg"))
|
|
}
|
|
|
|
fn prog(msg string) {
|
|
println(" ... ${term.bright_green(msg)}")
|
|
}
|
|
|
|
fn main() {
|
|
file := os.args[1]
|
|
|
|
prog("file '${term.bold(file)}' found")
|
|
|
|
prog("reading from '${term.bold(file)}'")
|
|
raw_content := os.read_file(file) or {
|
|
fail("reading from $file failed")
|
|
exit(1)
|
|
}
|
|
|
|
prog("decoding json data")
|
|
account := json.decode(Person, raw_content) or {
|
|
fail("decoding json data failed")
|
|
exit(1)
|
|
}
|
|
uname := account.username
|
|
email := account.email
|
|
key := account.pubkey
|
|
chown := "$uname:$uname"
|
|
home_folder := "/home/$uname"
|
|
www_folder := "/usr/local/var/www/users/$uname"
|
|
gemini_folder := "/usr/local/var/gemini/public/users/$uname"
|
|
|
|
/* adding user to user registry */
|
|
os.execute("echo '$uname - $email' | sudo tee -a /root/.ur")
|
|
|
|
prog("adding account for ${term.bold(uname)}")
|
|
execute_pw := os.execute("sudo pw user add -n $uname -d $home_folder -G tilde,www -m -s /usr/local/bin/bash")
|
|
if execute_pw.exit_code != 0 {
|
|
fail(execute_pw.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("creating ssh folder")
|
|
execute_mkssh := os.execute("sudo mkdir $home_folder/.ssh")
|
|
if execute_mkssh.exit_code != 0 {
|
|
fail(execute_mkssh.output)
|
|
exit(1)
|
|
}
|
|
|
|
|
|
prog("writing ssh key to authorized_keys file")
|
|
execute_ssh := os.execute("echo '$key' | sudo tee -a $home_folder/.ssh/authorized_keys >/dev/null")
|
|
if execute_ssh.exit_code != 0 {
|
|
fail(execute_ssh.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chowning ssh folder")
|
|
execute_chown := os.execute("sudo chown -R $chown $home_folder/.ssh")
|
|
if execute_chown.exit_code != 0 {
|
|
fail(execute_chown.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chmodding ssh folder")
|
|
execute_chmod := os.execute("sudo chmod -R 600 $home_folder/.ssh")
|
|
if execute_chmod.exit_code != 0 {
|
|
fail(execute_chmod.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chmodding ssh folder with exec")
|
|
execute_chmod_sec := os.execute("sudo chmod -R u+rwx $home_folder/.ssh")
|
|
if execute_chmod_sec.exit_code != 0 {
|
|
fail(execute_chmod_sec.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("creating www folder")
|
|
execute_www := os.execute("sudo mkdir $www_folder")
|
|
if execute_www.exit_code != 0 {
|
|
fail(execute_www.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("creating gemini folder")
|
|
execute_gemini := os.execute("sudo mkdir $gemini_folder")
|
|
if execute_gemini.exit_code != 0 {
|
|
fail(execute_gemini.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("linking www folder")
|
|
execute_link_www := os.execute("sudo ln -s $www_folder $home_folder/public_html")
|
|
if execute_link_www.exit_code != 0 {
|
|
fail(execute_link_www.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("linking gemini folder")
|
|
execute_link_gemini := os.execute("sudo ln -s $gemini_folder $home_folder/public_gemini")
|
|
if execute_link_gemini.exit_code != 0 {
|
|
fail(execute_link_gemini.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chowning www folder")
|
|
execute_chown_www := os.execute("sudo chown -R $uname:www $www_folder")
|
|
if execute_chown_www.exit_code != 0 {
|
|
fail(execute_chown_www.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chowning gemini folder")
|
|
execute_chown_gemini := os.execute("sudo chown -R $uname:tilde $gemini_folder")
|
|
if execute_chown_gemini.exit_code != 0 {
|
|
fail(execute_chown_gemini.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chowning www link")
|
|
execute_chown_www_link := os.execute("sudo chown $uname:www $home_folder/public_html")
|
|
if execute_chown_www_link.exit_code != 0 {
|
|
fail(execute_chown_www_link.output)
|
|
exit(1)
|
|
}
|
|
|
|
prog("chowning gemini link")
|
|
execute_chown_gemini_link := os.execute("sudo chown $uname:tilde $home_folder/public_gemini")
|
|
if execute_chown_gemini_link.exit_code != 0 {
|
|
fail(execute_chown_gemini_link.output)
|
|
exit(1)
|
|
}
|
|
|
|
send_email := os.execute("echo 'Your account \'$uname\' has now been created on tilde.guru. The ssh key you have supplied is used to ssh into the server. Welcome!' | mutt -b sarmonsiill@tilde.guru -s 'Account has been created on tilde.guru' -- $email")
|
|
if send_email.exit_code != 0 {
|
|
fail(send_email.output)
|
|
exit(1)
|
|
}
|
|
}
|