/* * ░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ * ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ * ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ * ░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ * ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ * ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ * ░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░ * ascii art from: https://patorjk.com/software/taag/ :) */ import os import net.http struct PackageInfo { name string version string } struct Manifest { packages []PackageInfo } const default_mirrors = [ 'https://git.curds.dev/chersbobers/bur-packages/raw/branch/main/' ] fn main() { args := os.args if args.len < 2 { println('commands: bur [install|update|upgrade|remove]') return } cmd := args[1] if !os.exists('/etc/bur/burmirrors.conf') { os.mkdir_all('/etc/bur/') or { } os.write_file('/etc/bur/burmirrors.conf', default_mirrors[0]) or { } println('made bur conf at /etc/bur/burmirrors.conf') } match cmd { 'install' { if args.len < 3 { println('error: please provide a package name') return } install_function(args[2]) } 'update' { update_function() } 'upgrade' { if args.len < 3 { println('error: please provide a package name') return } upgrade_function(args[2]) } 'remove' { if args.len < 3 { println('error: please provide a package name') return } remove_function(args[2]) } else { println('commands: bur [install|update|upgrade|remove]') } } } fn get_active_mirrors() []string { mut list := []string{} conf_path := '/etc/bur/burmirrors.conf' if os.exists(conf_path) { preferred := os.read_file(conf_path) or { '' }.trim_space() if preferred != '' { list << preferred } } for m in default_mirrors { if m !in list { list << m } } return list } fn install_function(name string) { mut success := false mut current_hash := '' active_mirrors := get_active_mirrors() for mirror in active_mirrors { url := mirror + name + '/' + name + '.c' println('trying mirror: ' + mirror) resp := http.get(url) or { println('mirror down skipping') continue } if resp.status_code != 200 { println('not found on this mirror skipping') continue } // Using concatenation to be safe for file paths tmp_path := '/tmp/' + name + '.c' os.write_file(tmp_path, resp.body) or { println('error failed writing to tmp') return } hash_resp := http.get(mirror + name + '/' + name + '.hash') or { continue } if hash_resp.status_code == 200 { current_hash = hash_resp.body.trim_space() } success = true break } if !success { println('error: ' + name + ' not found on any mirrors!') return } println('boringly compiling ' + name) compile_cmd := 'tcc /tmp/' + name + '.c -o /bin/' + name + '.elf' res := os.execute(compile_cmd) if res.exit_code == 0 { println('boringly compiled ' + name + '.elf run ' + name + ' in your terminal to run') os.rm('/tmp/' + name + '.c') or { } if current_hash != '' { os.mkdir_all('/var/db/bur/') or { } os.write_file('/var/db/bur/' + name + '.hash', current_hash) or { } } } else { println('oh crud ' + name + ' failed to compile!') println(res.output) } } fn update_function() { println('checking mirrors for manifest...') mut success := false active_mirrors := get_active_mirrors() for mirror in active_mirrors { manifest_url := mirror + 'packages.json' resp := http.get(manifest_url) or { continue } if resp.status_code != 200 { continue } os.mkdir_all('/var/db/bur/') or { } os.write_file('/var/db/bur/packages.json', resp.body) or { println('failed to save packages to the json :(') return } success = true break } if success { println('done! list refreshed. run bur upgrade [name] to check for updates.') } else { println('error: could not update from any mirrors') } } fn upgrade_function(name string) { mut remote_hash := '' mut success := false active_mirrors := get_active_mirrors() for mirror in active_mirrors { hash_url := mirror + name + '/' + name + '.hash' resp := http.get(hash_url) or { continue } if resp.status_code != 200 { continue } remote_hash = resp.body.trim_space() success = true break } if !success { println('error: could not check remote hash on any mirror') return } hash_path := '/var/db/bur/' + name + '.hash' if os.exists(hash_path) { local_hash := os.read_file(hash_path) or { '' }.trim_space() if local_hash == remote_hash { println(name + ' is already the latest version.') return } } println('new version of ' + name + ' found! upgrading...') install_function(name) } fn remove_function(name string) { println('removing ' + name + ' play the bugle ;_;') executable_path := '/bin/' + name + '.elf' if os.exists(executable_path) { os.rm(executable_path) or { println('oh crud could not remove the binary') } } else { println('HEY ' + name + '.elf was not found in /bin/!') } hash_path := '/var/db/bur/' + name + '.hash' if os.exists(hash_path) { os.rm(hash_path) or { } } println('rip ' + name + ' it has been removed') }