adduser/adduser.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)
}
}