diff --git a/blend b/blend index 570a068..4328181 100755 --- a/blend +++ b/blend @@ -87,14 +87,19 @@ def error(err): distro_map = { - 'arch-linux': 'docker.io/library/archlinux', - 'debian': 'quay.io/toolbx-images/debian-toolbox:testing', - 'fedora-39': 'registry.fedoraproject.org/fedora-toolbox:39', - 'centos': 'quay.io/toolbx-images/centos-toolbox:latest', - 'ubuntu-22.04': 'quay.io/toolbx/ubuntu-toolbox:22.04', + 'arch': 'docker.io/library/archlinux', + 'almalinux-9': 'quay.io/almalinux/almalinux:9', + 'crystal-linux': 'registry.getcryst.al/crystal/misc/docker:latest', + 'debian': 'docker.io/library/debian:latest', + 'fedora-38': 'docker.io/library/fedora:38', + 'kali-linux': 'docker.io/kalilinux/kali-rolling', + 'neurodebian-bookworm': 'docker.io/library/neurodebian:nd120', + 'rocky-linux': 'docker.io/rockylinux/rockylinux:9', + 'ubuntu-22.04': 'docker.io/library/ubuntu:22.04', + 'ubuntu-23.04': 'docker.io/library/ubuntu:23.04' } -default_distro = 'arch-linux' +default_distro = 'arch' def get_distro(): @@ -128,17 +133,11 @@ def check_container(name): def check_container_status(name): - if os.environ.get('SUDO_USER') == None: - return host_get_output("podman inspect --type container " + name + " --format \"{{.State.Status}}\"") - else: - return host_get_output(f"sudo -u {os.environ.get('SUDO_USER')} podman inspect --type container " + name + " --format \"{{.State.Status}}\"") + return host_get_output("podman inspect --type container " + name + " --format \"{{.State.Status}}\"") def core_start_container(name, new_container=False): - sudo = [] - if os.environ.get('SUDO_USER') != None: - sudo = ['sudo', '-u', os.environ.get('SUDO_USER')] - subprocess.call([*sudo, 'podman', 'start', name], + subprocess.call(['podman', 'start', name], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) start_time = time.time() - 1000 # workaround @@ -149,15 +148,11 @@ def core_start_container(name, new_container=False): subprocess.call(['podman', 'logs', '--since', str(start_time), name]) exit(1) - if os.environ.get('SUDO_USER') == None: - logproc = pexpect.spawn( - 'podman', args=['logs', '-f', '--since', str(start_time), name], timeout=3600) - else: - logproc = pexpect.spawn( - 'sudo', args=['-u', os.environ.get('SUDO_USER'), 'podman', 'logs', '-f', '--since', str(start_time), name], timeout=3600) + logproc = pexpect.spawn( + 'podman', args=['logs', '-f', '--since', str(start_time), name], timeout=300) logproc.logfile_read = sys.stdout.buffer - logproc.expect('Started container.') + logproc.expect('Completed container setup.') logproc.terminate() diff --git a/blend-settings/src/internal/js/android.js b/blend-settings/src/internal/js/android.js index ae216b3..f999b58 100644 --- a/blend-settings/src/internal/js/android.js +++ b/blend-settings/src/internal/js/android.js @@ -50,7 +50,7 @@ function install_aurora_store() { let aurora_store_worker = new Worker( `data:text/javascript, require('child_process').spawnSync('sh', ['-c', 'mkdir -p ~/.cache/blend-settings; rm -f ~/.cache/blend-settings/aurora.apk']) - let s1 = require('child_process').spawnSync('sh', ['-c', 'wget -O ~/.cache/blend-settings/aurora.apk https://f-droid.org/repo/com.aurora.store_58.apk']).status + let s1 = require('child_process').spawnSync('sh', ['-c', 'wget -O ~/.cache/blend-settings/aurora.apk https://gitlab.com/AuroraOSS/AuroraStore/uploads/bbc1bd5a77ab2b40bbf288ccbef8d1f0/AuroraStore_4.1.1.apk']).status if (s1 != 0) { postMessage('failed') } else { @@ -194,4 +194,4 @@ $('#automatic-state-toggle').on('change', () => { } } } -}); +}); \ No newline at end of file diff --git a/blend-settings/src/internal/js/system.js b/blend-settings/src/internal/js/system.js index 25644ab..ef7f3c5 100644 --- a/blend-settings/src/internal/js/system.js +++ b/blend-settings/src/internal/js/system.js @@ -18,16 +18,6 @@ function update_system() { } function check_system_update() { - if (require('fs').existsSync('/.update')) { - document.getElementById('update-btn').onclick = () => { - require('child_process').spawnSync('reboot') - } - - document.getElementById('update-btn').textContent = 'Reboot' - document.getElementById('update-btn').disabled = false - - return; - } let start_update_worker = new Worker( `data:text/javascript, let s = require('child_process').spawnSync('systemctl', ['is-active', '--quiet', 'akshara-system-update']).status diff --git a/blend-settings/src/package-installer.html b/blend-settings/src/package-installer.html index a20640b..e70380f 100644 --- a/blend-settings/src/package-installer.html +++ b/blend-settings/src/package-installer.html @@ -97,14 +97,18 @@ document.getElementById('source_select').innerHTML = ` + + + ` } else if (package_name.endsWith('.rpm')) { document.getElementById('packaging-format').src = '../static/RPM.svg' package_type = 'rpm' document.getElementById('source_select').innerHTML = ` - - + + + ` } else if (package_name.endsWith('.apk')) { document.getElementById('packaging-format').src = '../static/APK.svg' @@ -113,14 +117,15 @@ require('fs').stat('/var/lib/waydroid/waydroid.prop', (err, stat) => { if (err != null) { - document.getElementById('install-button').outerHTML = "

You'll need to initialize Android app support from the System app first.

" + document.getElementById('install-button').outerHTML = "

You'll need to initialize Android app support from the blendOS Settings app first.

" } }) } else if (package_name.includes('.pkg.tar')) { document.getElementById('packaging-format').src = '../static/PKG.svg' package_type = 'pkg' document.getElementById('source_select').innerHTML = ` - + + ` } diff --git a/blend-settings/src/pages/containers.html b/blend-settings/src/pages/containers.html index 54806c2..d7bf67b 100644 --- a/blend-settings/src/pages/containers.html +++ b/blend-settings/src/pages/containers.html @@ -10,11 +10,16 @@
diff --git a/init-blend b/init-blend index ecad72e..ed00527 100755 --- a/init-blend +++ b/init-blend @@ -62,7 +62,29 @@ while true; do esac done -echo 'Starting container... (this may take a few minutes)' +cat << 'EOF' + + + ▄▄▄▄ ██▓ ▓█████ ███▄ █ ▓█████▄ +▓█████▄ ▓██▒ ▓█ ▀ ██ ▀█ █ ▒██▀ ██▌ +▒██▒ ▄██▒██░ ▒███ ▓██ ▀█ ██▒░██ █▌ +▒██░█▀ ▒██░ ▒▓█ ▄ ▓██▒ ▐▌██▒░▓█▄ ▌ +░▓█ ▀█▓░██████▒░▒████▒▒██░ ▓██░░▒████▓ +░▒▓███▀▒░ ▒░▓ ░░░ ▒░ ░░ ▒░ ▒ ▒ ▒▒▓ ▒ +▒░▒ ░ ░ ░ ▒ ░ ░ ░ ░░ ░░ ░ ▒░ ░ ▒ ▒ + ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ + ░ ░ ░ ░ ░ ░ ░ + ░ ░ + +=================== + Credits +=================== + +* NVIDIA driver support - Luca Di Maio (from Distrobox) +EOF + +echo +echo 'Starting blend... (this may take a few minutes)' echo bmount() { @@ -386,7 +408,7 @@ for full_file in /usr/share/applications/*.desktop; do chmod 755 "${HOME}/.local/share/applications/blend;${CONTAINER_NAME};${file}" done -echo "Started container." +echo "Completed container setup." mkdir -p /usr/share/applications /usr/bin inotifywait -m /usr/share/applications /usr/bin -e create,delete,move 2>/dev/null | diff --git a/user b/user deleted file mode 100755 index ed8d6a4..0000000 --- a/user +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/python3 - -import os -import yaml -import click -import subprocess - -from urllib.request import urlopen - - -class colors: - reset = '\033[0m' - bold = '\033[01m' - disable = '\033[02m' - underline = '\033[04m' - reverse = '\033[07m' - strikethrough = '\033[09m' - invisible = '\033[08m' - - class fg: - black = '\033[30m' - red = '\033[31m' - green = '\033[32m' - orange = '\033[33m' - blue = '\033[34m' - purple = '\033[35m' - cyan = '\033[36m' - lightgrey = '\033[37m' - darkgrey = '\033[90m' - lightred = '\033[91m' - lightgreen = '\033[92m' - yellow = '\033[93m' - lightblue = '\033[94m' - pink = '\033[95m' - lightcyan = '\033[96m' - - rainbow = [lightred, orange, yellow, - lightgreen, lightcyan, blue, purple] - seq = 0 - - def random(self): - if self.seq == 7: - self.seq = 0 - self.seq += 1 - return self.rainbow[self.seq - 1] - - def clear_seq(self): - self.seq = 0 - - class bg: - black = '\033[40m' - red = '\033[41m' - green = '\033[42m' - orange = '\033[43m' - blue = '\033[44m' - purple = '\033[45m' - cyan = '\033[46m' - lightgrey = '\033[47m' - - -fg = colors.fg() - - -def info(msg): - print(colors.bold + fg.cyan + '[INFO] ' + - colors.reset + msg + colors.reset) - - -def print_list(msg): - print(colors.bold + fg.random() + '[LIST] ' + - colors.reset + msg + colors.reset) - - -def modrun(msg): - print(colors.bold + fg.green + '[MODRUN] ' + - colors.reset + msg + colors.reset) - - -def container_msg(msg): - print(colors.bold + fg.purple + '[CONTAINER] ' + - colors.reset + msg + colors.reset) - - -def association_msg(msg): - print(colors.bold + fg.random() + '[ASSOCIATION] ' + - colors.reset + msg + colors.reset) - - -def warn(warning): - print(colors.bold + fg.yellow + '[WARNING] ' + - colors.reset + warning + colors.reset) - - -def error(err): - print(colors.bold + fg.red + '[ERROR] ' + - colors.reset + err + colors.reset) - - -def proceed(): - print(colors.bold + fg.red + '[QUESTION] ' + - colors.reset + 'would you like to proceed?' + colors.reset) - info(f'(press {colors.bold}ENTER{colors.reset} to proceed, or {colors.bold}^C{colors.reset}/{colors.bold}^D{colors.reset} to cancel)') - input() - - -@click.group("cli") -def cli(): - """Manage user operations using the user utility on blendOS.""" - - -def main(): - cli(prog_name="user") - - -@cli.command("associate") -@click.argument('association') -@click.argument('container') -def associate_binary(association, container): - ''' - Create an association (for example, apt -> ubuntu) - ''' - - if not os.path.exists(os.path.expanduser(f'~/.local/bin/blend_bin/{association}.{container}')): - error(f'{colors.bold}{association}.{container}{colors.reset} does not exist') - exit() - if os.path.isfile(os.path.expanduser('~/.local/bin/blend_bin/.associations')): - subprocess.run(['sed', '-i', f's/^{association}\\x0//g', - os.path.expanduser('~/.local/bin/blend_bin/.associations')]) - with open(os.path.expanduser('~/.local/bin/blend_bin/.associations'), 'a+') as f: - f.write(f'{association}\0{container}\n') - _exists = os.path.exists(os.path.expanduser( - f'~/.local/bin/blend_bin/{association}')) - subprocess.run(['ln', '-sf', f'{association}.{container}', - os.path.expanduser(f'~/.local/bin/blend_bin/{association}')]) - association_msg(('modified' if _exists else 'created') + - f' {colors.bold}{association} -> {container}{colors.reset}') - - -@cli.command("dissociate") -@click.argument('association') -def associate_binary(association): - ''' - Remove an association - ''' - - if not os.path.exists(os.path.expanduser(f'~/.local/bin/blend_bin/{association}')): - error(f'{colors.bold}{association}{colors.reset} does not exist') - exit() - if os.path.isfile(os.path.expanduser('~/.local/bin/blend_bin/.associations')): - subprocess.run(['sed', '-i', f's/^{association}\\x0//g', - os.path.expanduser('~/.local/bin/blend_bin/.associations')]) - subprocess.run( - ['rm', '-f', os.path.expanduser(f'~/.local/bin/blend_bin/{association}')]) - association_msg(f'dissociated {colors.bold}{association}') - - -@cli.command("create-container") -@click.argument('container_name') -@click.argument('distro', default='arch') -def create_container(container_name, distro): - ''' - Create a container - ''' - if distro not in ('arch', 'almalinux-9', 'crystal-linux', 'debian', 'fedora-38', 'kali-linux', 'neurodebian-bookworm', 'rocky-linux', 'ubuntu-22.04', 'ubuntu-23.04'): - error( - f'distro {colors.bold}{distro}{colors.reset} not supported') - if subprocess.run(['podman', 'container', 'exists', container_name], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).returncode == 0: - error(f'container {colors.bold}{container_name}{colors.reset} already exists') - exit(1) - subprocess.run(['blend', 'create-container', '-cn', container_name, '-d', distro]) - - -@cli.command("delete-container") -@click.argument('container') -def delete_container(container): - ''' - Delete a container - ''' - if subprocess.run(['podman', 'container', 'exists', container], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).returncode != 0: - error(f'container {colors.bold}{container}{colors.reset} does not exist') - exit(1) - subprocess.run(['blend', 'remove-container', container]) - - -@cli.command("shell") -@click.argument('container') -def shell(container): - ''' - Enter a shell inside a container - ''' - if subprocess.run(['podman', 'container', 'exists', container], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).returncode != 0: - error(f'container {colors.bold}{container}{colors.reset} does not exist') - exit(1) - creation_env = os.environ.copy() - creation_env['BLEND_NO_CHECK'] = 'true' - subprocess.run(['blend', 'enter', '-cn', container], env=creation_env) - - -@cli.command("exec") -@click.argument('container') -@click.argument('cmds', nargs=-1, required=True) -def exec_c(container, cmds): - ''' - Run a command inside a container - ''' - if subprocess.run(['podman', 'container', 'exists', container], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).returncode != 0: - error(f'container {colors.bold}{container}{colors.reset} does not exist') - exit(1) - creation_env = os.environ.copy() - creation_env['BLEND_NO_CHECK'] = 'true' - cmds = [ cmd.replace('\\-', '-') for cmd in cmds] - subprocess.run(['blend', 'enter', '-cn', container, '--', *cmds], env=creation_env) - - -@cli.command("install") -@click.argument('container') -@click.argument('pkgs', nargs=-1, required=True) -def install_c(container, pkgs): - ''' - Install a package inside a container - ''' - if os.path.isfile(os.path.expanduser(f'~/.local/bin/blend_bin/apt.{container}')): - subprocess.run([f'sudo.{container}', 'apt', 'update']) - subprocess.run([f'sudo.{container}', 'apt', 'install', *pkgs]) - elif os.path.isfile(os.path.expanduser(f'~/.local/bin/blend_bin/dnf.{container}')): - subprocess.run([f'sudo.{container}', 'dnf', 'install', *pkgs]) - elif os.path.isfile(os.path.expanduser(f'~/.local/bin/blend_bin/pacman.{container}')): - subprocess.run([f'sudo.{container}', 'pacman', '-Syu', *pkgs]) - else: - error(f'container {colors.bold}{container}{colors.reset} does not exist') - exit(1) - - -@cli.command("remove") -@click.argument('container') -@click.argument('pkgs', nargs=-1, required=True) -def remove_c(container, pkgs): - ''' - Remove a package inside a container - ''' - if os.path.isfile(os.path.expanduser(f'~/.local/bin/blend_bin/apt.{container}')): - subprocess.run([f'sudo.{container}', 'apt', 'purge', *pkgs]) - elif os.path.isfile(os.path.expanduser(f'~/.local/bin/blend_bin/dnf.{container}')): - subprocess.run([f'sudo.{container}', 'dnf', 'remove', *pkgs]) - elif os.path.isfile(os.path.expanduser(f'~/.local/bin/blend_bin/pacman.{container}')): - subprocess.run([f'sudo.{container}', 'pacman', '-Rcns', *pkgs]) - else: - error(f'container {colors.bold}{container}{colors.reset} does not exist') - exit(1) - - -if __name__ == '__main__': - main()