Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--PKGBUILD35
-rw-r--r--PKGBUILDs/archinstall-bin/PKGBUILD39
-rw-r--r--PKGBUILDs/archinstall/PKGBUILD30
-rw-r--r--PKGBUILDs/python-archinstall/PKGBUILD40
-rw-r--r--README.md25
-rw-r--r--VERSION1
-rw-r--r--__init__.py3
-rw-r--r--archinstall/__init__.py33
-rw-r--r--archinstall/__main__.py30
-rw-r--r--archinstall/lib/disk.py13
-rw-r--r--archinstall/lib/installer.py20
-rw-r--r--archinstall/lib/luks.py2
-rw-r--r--archinstall/lib/networking.py4
-rw-r--r--archinstall/lib/output.py6
-rw-r--r--archinstall/lib/profiles.py20
-rw-r--r--archinstall/lib/storage.py2
-rw-r--r--archinstall/lib/user_interaction.py33
-rw-r--r--docs/archinstall/general.rst7
-rw-r--r--docs/examples/binary.rst6
-rw-r--r--docs/help/discord.rst2
-rw-r--r--docs/help/issues.rst2
-rw-r--r--docs/index.rst5
-rw-r--r--docs/installing/binary.rst10
-rw-r--r--docs/installing/guided.rst4
-rw-r--r--docs/installing/python.rst2
-rw-r--r--docs/pull_request_template.md39
-rw-r--r--examples/guided.py41
-rw-r--r--examples/minimal.py6
-rw-r--r--profiles/applications/gnome.py4
-rw-r--r--profiles/awesome.py6
-rw-r--r--profiles/cinnamon.py3
-rw-r--r--profiles/desktop.py12
-rw-r--r--profiles/gnome.py2
-rw-r--r--profiles/i3-gaps.py2
-rw-r--r--profiles/i3-wm.py2
-rw-r--r--profiles/kde.py4
-rw-r--r--profiles/minimal.py20
-rw-r--r--profiles/xfce4.py2
-rw-r--r--profiles/xorg.py2
-rw-r--r--pyproject.toml3
-rw-r--r--setup.cfg39
-rw-r--r--setup.py29
43 files changed, 289 insertions, 303 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 59bc3eff..48cc14d1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,7 +6,7 @@ Therefore guidelines and style changes to the code might come into affect as wel
## Discussions
-Currently, questions, bugs and suggestions should be reported through [GitHub issue tracker](https://github.com/Torxed/archinstall/issues).<br>
+Currently, questions, bugs and suggestions should be reported through [GitHub issue tracker](https://github.com/archlinux/archinstall/issues).<br>
For less formal discussions there are also a [archinstall Discord server](https://discord.gg/cqXU88y).
## Coding convention
diff --git a/PKGBUILD b/PKGBUILD
index 7e073666..7a5da658 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -2,43 +2,24 @@
# Contributor: Giancarlo Razzolini <grazzolini@archlinux.org>
# Contributor: demostanis worlds <demostanis@protonmail.com>
-pkgbase=archinstall-git
-pkgname=('archinstall-git' 'python-archinstall-git')
+pkgname=archinstall-git
pkgver=$(git describe --long | sed 's/\([^-]*-g\)/r\1/;s/-/./g')
pkgrel=1
pkgdesc="Just another guided/automated Arch Linux installer with a twist"
arch=('any')
-url="https://github.com/Torxed/archinstall"
+url="https://github.com/archlinux/archinstall"
license=('GPL')
depends=('python')
makedepends=('python-setuptools')
+provides=('python-archinstall')
+conflicts=('archinstall' 'python-archinstall' 'python-archinstall-git')
build() {
- cd "$startdir"
-
+ cd "$startdir"
python setup.py build
}
-
-package_archinstall-git() {
- depends=('python-archinstall-git')
- conflicts=('archinstall')
- cd "$startdir"
-
- mkdir -p "${pkgdir}/usr/bin"
-
- # Install a guided profile
- cat - > "${pkgdir}/usr/bin/archinstall" <<EOF
-#!/bin/sh
-python -m archinstall $@
-EOF
-
- chmod +x "${pkgdir}/usr/bin/archinstall"
-}
-
-package_python-archinstall-git() {
- conflicts=('python-archinstall')
- cd "$startdir"
-
- python setup.py install --prefix=/usr --root="${pkgdir}" --optimize=1 --skip-build
+package() {
+ cd "$startdir"
+ python setup.py install --root="${pkgdir}" --optimize=1 --skip-build
}
diff --git a/PKGBUILDs/archinstall-bin/PKGBUILD b/PKGBUILDs/archinstall-bin/PKGBUILD
deleted file mode 100644
index 855d19a5..00000000
--- a/PKGBUILDs/archinstall-bin/PKGBUILD
+++ /dev/null
@@ -1,39 +0,0 @@
-# Maintainer: Anton Hvornum anton@hvornum.se
-# Contributor: Anton Hvornum anton@hvornum.se
-
-pkgname="archinstall-bin"
-pkgver="2.1.3"
-pkgdesc="Installs a pre-built binary of ${pkgname}"
-pkgrel=1
-url="https://github.com/Torxed/archinstall"
-license=('GPLv3')
-provides=("${pkgname}")
-arch=('x86_64')
-source=("${pkgname}-v${pkgver}-x86_64.tar.gz::https://github.com/Torxed/archinstall/archive/v$pkgver.tar.gz")
-#depends=('python>=3.8')
-makedepends=('python>=3.8' 'nuitka')
-optdepends=('pyttsx3: Adds text-to-speach support for log/screen output.')
-sha256sums=('53c00f7e7ad245cd2cbbf041b5a735df2fc29454c24b1d369f678cc0610b7cea')
-
-build() {
- cd "${pkgname}-${pkgver}"
-
- nuitka3 --standalone --show-progress archinstall
- cp -r examples/ archinstall.dist/
-}
-
-package() {
- echo "${srcdir}"
- cd "${pkgname}-${pkgver}"
-
- mkdir -p "${pkgdir}/var/lib/archinstall/"
- mkdir -p "${pkgdir}/usr/bin"
-
- mv archinstall.dist/* "${pkgdir}/var/lib/archinstall/"
-
- echo '#!/bin/bash' > "${pkgdir}/usr/bin/archinstall-bin"
- echo '(cd /var/lib/archinstall && exec ./archinstall)' >> "${pkgdir}/usr/bin/archinstall-bin"
-
- chmod +x "${pkgdir}/var/lib/archinstall/archinstall"
- chmod +x "${pkgdir}/usr/bin/archinstall-bin"
-}
diff --git a/PKGBUILDs/archinstall/PKGBUILD b/PKGBUILDs/archinstall/PKGBUILD
deleted file mode 100644
index 961ee79c..00000000
--- a/PKGBUILDs/archinstall/PKGBUILD
+++ /dev/null
@@ -1,30 +0,0 @@
-# Maintainer: Anton Hvornum <anton@hvornum.se>
-# Contributor: demostanis worlds <demostanis@protonmail.com>
-
-pkgname="archinstall"
-pkgver="2.1.3"
-pkgdesc="Installs launcher scripts for archinstall"
-pkgrel=1
-url="https://github.com/Torxed/archinstall"
-license=('GPLv3')
-provides=("${pkgname}")
-arch=('x86_64')
-source=("${pkgname}-v${pkgver}-x86_64.tar.gz::https://github.com/Torxed/archinstall/archive/v$pkgver.tar.gz")
-depends=('python-archinstall')
-sha256sums=('53c00f7e7ad245cd2cbbf041b5a735df2fc29454c24b1d369f678cc0610b7cea')
-
-package() {
- mkdir -p "${pkgdir}/usr/bin"
-
- # Install a guided profile
- cat - > "${pkgdir}/usr/bin/archinstall" <<EOF
-#!/bin/sh
-
-python -m archinstall $@
-EOF
-
- chmod +x "${pkgdir}/usr/bin/archinstall"
-}
-
-# vim:ft=sh
-
diff --git a/PKGBUILDs/python-archinstall/PKGBUILD b/PKGBUILDs/python-archinstall/PKGBUILD
deleted file mode 100644
index 3a735ac9..00000000
--- a/PKGBUILDs/python-archinstall/PKGBUILD
+++ /dev/null
@@ -1,40 +0,0 @@
-# Maintainer: Anton Hvornum <anton@hvornum.se>
-# Contributor: demostanis worlds <demostanis@protonmail.com>
-
-pkgname="python-archinstall"
-pkgver="2.1.3"
-pkgdesc="Installs ${pkgname} as a python library."
-pkgrel=1
-url="https://github.com/Torxed/archinstall"
-source=("${pkgname}-v${pkgver}-x86_64.tar.gz::https://github.com/Torxed/archinstall/archive/v$pkgver.tar.gz")
-license=('GPLv3')
-provides=("${pkgname}")
-arch=('x86_64')
-depends=('python>=3.8')
-makedepends=('python-setuptools')
-optdepends=('pyttsx3: Adds text-to-speech support for log/screen output.')
-sha256sums=('53c00f7e7ad245cd2cbbf041b5a735df2fc29454c24b1d369f678cc0610b7cea')
-
-build() {
- cd "archinstall-${pkgver}"
-
- python setup.py build
-
- # Build man pages
- cd docs
- make man
-}
-
-package() {
- cd "archinstall-${pkgver}"
-
- python setup.py install \
- --prefix=/usr \
- --root="${pkgdir}" \
- --optimize=1
-
- install -Dm644 docs/_build/man/archinstall.1 "${pkgdir}"/usr/share/man/man1/archinstall.1
-}
-
-# vim:ft=sh
-
diff --git a/README.md b/README.md
index 5451b55f..31ffc964 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# <img src="https://github.com/Torxed/archinstall/raw/master/docs/logo.png" alt="drawing" width="200"/>
+# <img src="https://github.com/archlinux/archinstall/raw/master/docs/logo.png" alt="drawing" width="200"/>
Just another guided/automated [Arch Linux](https://wiki.archlinux.org/index.php/Arch_Linux) installer with a twist.
The installer also doubles as a python library to install Arch Linux and manage services, packages and other things inside the installed system *(Usually from a live medium)*.
@@ -42,7 +42,7 @@ with archinstall.Filesystem(harddrive, archinstall.GPT) as fs:
harddrive.partition[0].format('fat32')
with archinstall.luks2(harddrive.partition[1], 'luksloop', disk_password) as unlocked_device:
unlocked_device.format('btrfs')
-
+
with archinstall.Installer(unlocked_device, hostname='testmachine') as installation:
if installation.minimal_installation():
installation.add_bootloader(harddrive.partition[0])
@@ -62,7 +62,7 @@ This installer will perform the following:
* Installs a basic instance of Arch Linux *(base base-devel linux linux-firmware btrfs-progs efibootmgr)*
* Installs and configures a bootloader to partition 0 on uefi. on bios it sets the root to partition 0.
* Install additional packages *(nano, wget, git)*
- * Installs a network-profile called [awesome](https://github.com/Torxed/archinstall/blob/master/profiles/awesome.py) *(more on network profiles in the documentation)*
+ * Installs a profile with a window manager called [awesome](https://github.com/archlinux/archinstall/blob/master/profiles/awesome.py) *(more on profile installations in the [documentation](https://python-archinstall.readthedocs.io/en/latest/archinstall/Profile.html))*.
> **Creating your own ISO with this script on it:** Follow [ArchISO](https://wiki.archlinux.org/index.php/archiso)'s guide on how to create your own ISO or use a pre-built [guided ISO](https://hvornum.se/archiso/) to skip the python installation step, or to create auto-installing ISO templates. Further down are examples and cheat sheets on how to create different live ISO's.
@@ -73,6 +73,23 @@ When doing so, attach any `install-session_*.log` to the issue ticket which can
# Testing
+## Using a Live ISO Image
+
+If you want to test a commit, branch or bleeding edge release from the repository using the vanilla Arch Live ISO image, you can replace the version of archinstall with a new version and run that with the steps described below.
+
+ 1. You need a working network connection
+ 2. Install the build requirements with `pacman -Sy; pacman -S git python-pip`
+ *(note that this may or may not work depending on your RAM and current state of the squashfs maximum filesystem free space)*
+ 3. Uninstall the previous version of archinstall with `pip uninstall archinstall`
+ 4. Now clone the latest repository with `git clone https://github.com/archlinux/archinstall`
+ 5. Enter the repository with `cd archinstall`
+ *At this stage, you can choose to check out a feature branch for instance with `git checkout torxed-v2.2.0`*
+ 6. Build the project and install it using `python setup.py install`
+
+After this, running archinstall with `python -m archinstall` will run against whatever branch you chose in step 5.
+
+## Without a Live ISO Image
+
To test this without a live ISO, the simplest approach is to use a local image and create a loop device.<br>
This can be done by installing `pacman -S arch-install-scripts util-linux` locally and doing the following:
@@ -87,5 +104,5 @@ This will create a *5GB* `testimage.img` and create a loop device which we can u
`archinstall` is installed and executed in [guided mode](#docs-todo). Once the installation is complete,<br>
~~you can use qemu/kvm to boot the test media.~~ *(You'd actually need to do some EFI magic in order to point the EFI vars to the partition 0 in the test medium so this won't work entirely out of the box, but gives you a general idea of what we're going for here)*
-There's also a [Building and Testing](https://github.com/Torxed/archinstall/wiki/Building-and-Testing) guide.<br>
+There's also a [Building and Testing](https://github.com/archlinux/archinstall/wiki/Building-and-Testing) guide.<br>
It will go through everything from packaging, building and running *(with qemu)* the installer against a dev branch.
diff --git a/VERSION b/VERSION
deleted file mode 100644
index abae0d9a..00000000
--- a/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-2.1.3 \ No newline at end of file
diff --git a/__init__.py b/__init__.py
deleted file mode 100644
index bd22d3f4..00000000
--- a/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This __init__ file is just here to support the
-# use of archinstall as a git submodule.
-from .archinstall import *
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index 91cf17be..8a49bef6 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -14,6 +14,8 @@ from .lib.output import *
from .lib.storage import *
from .lib.hardware import *
+__version__ = "2.1.3"
+
## Basic version of arg.parse() supporting:
## --key=value
## --boolean
@@ -27,4 +29,33 @@ for arg in sys.argv[1:]:
key, val = arg[2:], True
arguments[key] = val
else:
- positionals.append(arg) \ No newline at end of file
+ positionals.append(arg)
+
+
+# TODO: Learn the dark arts of argparse...
+# (I summon thee dark spawn of cPython)
+
+def run_as_a_module():
+ """
+ Since we're running this as a 'python -m archinstall' module OR
+ a nuitka3 compiled version of the project.
+ This function and the file __main__ acts as a entry point.
+ """
+
+ # Add another path for finding profiles, so that list_profiles() in Script() can find guided.py, unattended.py etc.
+ storage['PROFILE_PATH'].append(os.path.abspath(f'{os.path.dirname(__file__)}/examples'))
+
+ if len(sys.argv) == 1:
+ sys.argv.append('guided')
+
+ try:
+ script = Script(sys.argv[1])
+ except ProfileNotFound as err:
+ print(f"Couldn't find file: {err}")
+ sys.exit(1)
+
+ os.chdir(os.path.abspath(os.path.dirname(__file__)))
+
+ # Remove the example directory from the PROFILE_PATH, to avoid guided.py etc shows up in user input questions.
+ storage['PROFILE_PATH'].pop()
+ script.execute()
diff --git a/archinstall/__main__.py b/archinstall/__main__.py
index 63c2f715..86ed0108 100644
--- a/archinstall/__main__.py
+++ b/archinstall/__main__.py
@@ -2,33 +2,5 @@ import archinstall
import sys
import os
-# TODO: Learn the dark arts of argparse...
-# (I summon thee dark spawn of cPython)
-
-def run_as_a_module():
- """
- Since we're running this as a 'python -m archinstall' module OR
- a nuitka3 compiled version of the project.
- This function and the file __main__ acts as a entry point.
- """
-
- # Add another path for finding profiles, so that list_profiles() in Script() can find guided.py, unattended.py etc.
- archinstall.storage['PROFILE_PATH'].append(os.path.abspath(f'{os.path.dirname(__file__)}/examples'))
-
- if len(sys.argv) == 1:
- sys.argv.append('guided')
-
- try:
- script = archinstall.Script(sys.argv[1])
- except archinstall.ProfileNotFound as err:
- print(f"Couldn't find file: {err}")
- sys.exit(1)
-
- os.chdir(os.path.abspath(os.path.dirname(__file__)))
-
- # Remove the example directory from the PROFILE_PATH, to avoid guided.py etc shows up in user input questions.
- archinstall.storage['PROFILE_PATH'].pop()
- script.execute()
-
if __name__ == '__main__':
- run_as_a_module()
+ archinstall.run_as_a_module()
diff --git a/archinstall/lib/disk.py b/archinstall/lib/disk.py
index 4ea9f214..e2f4d76e 100644
--- a/archinstall/lib/disk.py
+++ b/archinstall/lib/disk.py
@@ -25,11 +25,12 @@ class BlockDevice():
self.path = path
self.info = info
+ self.keep_partitions = True
self.part_cache = OrderedDict()
- # TODO: Currently disk encryption is a BIT missleading.
+ # TODO: Currently disk encryption is a BIT misleading.
# It's actually partition-encryption, but for future-proofing this
# I'm placing the encryption password on a BlockDevice level.
- self.encryption_passwoed = None
+ self.encryption_password = None
def __repr__(self, *args, **kwargs):
return f"BlockDevice({self.device})"
@@ -285,10 +286,10 @@ class Partition():
handle = luks2(self, None, None)
return handle.encrypt(self, *args, **kwargs)
- def format(self, filesystem=None, path=None, allow_formatting=None, log_formating=True):
+ def format(self, filesystem=None, path=None, allow_formatting=None, log_formatting=True):
"""
Format can be given an overriding path, for instance /dev/null to test
- the formating functionality and in essence the support for the given filesystem.
+ the formatting functionality and in essence the support for the given filesystem.
"""
if filesystem is None:
filesystem = self.filesystem
@@ -306,7 +307,7 @@ class Partition():
if not allow_formatting:
raise PermissionError(f"{self} is not formatable either because instance is locked ({self.allow_formatting}) or a blocking flag was given ({allow_formatting})")
- if log_formating:
+ if log_formatting:
log(f'Formatting {path} -> {filesystem}', level=LOG_LEVELS.Info)
if filesystem == 'btrfs':
@@ -401,7 +402,7 @@ class Partition():
2. UnknownFilesystemFormat that indicates that we don't support the given filesystem type
"""
try:
- self.format(self.filesystem, '/dev/null', log_formating=False, allow_formatting=True)
+ self.format(self.filesystem, '/dev/null', log_formatting=False, allow_formatting=True)
except SysCallError:
pass # We supported it, but /dev/null is not formatable as expected so the mkfs call exited with an error code
except UnknownFilesystemFormat as err:
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index 8938b371..e9343cd1 100644
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -79,7 +79,7 @@ class Installer():
return self
def __exit__(self, *args, **kwargs):
- # b''.join(sys_command(f'sync')) # No need to, since the underlaying fs() object will call sync.
+ # b''.join(sys_command(f'sync')) # No need to, since the underlying fs() object will call sync.
# TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager
if len(args) >= 2 and args[1]:
@@ -91,7 +91,7 @@ class Installer():
# We avoid printing /mnt/<log path> because that might confuse people if they note it down
# and then reboot, and a identical log file will be found in the ISO medium anyway.
print(f"[!] A log file has been created here: {os.path.join(storage['LOG_PATH'], storage['LOG_FILE'])}")
- print(f" Please submit this issue (and file) to https://github.com/Torxed/archinstall/issues")
+ print(f" Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues")
raise args[1]
self.genfstab()
@@ -104,8 +104,10 @@ class Installer():
self.log('Some required steps were not successfully installed/configured before leaving the installer:', bg='black', fg='red', level=LOG_LEVELS.Warning)
for step in missing_steps:
self.log(f' - {step}', bg='black', fg='red', level=LOG_LEVELS.Warning)
- self.log(f"Detailed error logs can be found at: {log_path}", level=LOG_LEVELS.Warning)
- self.log(f"Submit this zip file as an issue to https://github.com/Torxed/archinstall/issues", level=LOG_LEVELS.Warning)
+
+ self.log(f"Detailed error logs can be found at: {storage['LOG_PATH']}", level=LOG_LEVELS.Warning)
+ self.log(f"Submit this zip file as an issue to https://github.com/archlinux/archinstall/issues", level=LOG_LEVELS.Warning)
+
self.sync_log_to_install_medium()
return False
@@ -155,7 +157,7 @@ class Installer():
fstab_fh.write(fstab)
if not os.path.isfile(f'{self.mountpoint}/etc/fstab'):
- raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n{o}')
+ raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n{fstab}')
return True
@@ -274,7 +276,7 @@ class Installer():
return True
def minimal_installation(self):
- ## Add nessecary packages if encrypting the drive
+ ## Add necessary packages if encrypting the drive
## (encrypted partitions default to btrfs for now, so we need btrfs-progs)
## TODO: Perhaps this should be living in the function which dictates
## the partitioning. Leaving here for now.
@@ -319,14 +321,14 @@ class Installer():
mkinit.write('MODULES=(btrfs)\n')
mkinit.write('BINARIES=(/usr/bin/btrfs)\n')
mkinit.write('FILES=()\n')
- mkinit.write('HOOKS=(base udev autodetect modconf block encrypt filesystems keymap keyboard fsck)\n')
+ mkinit.write('HOOKS=(base udev autodetect keyboard keymap modconf block encrypt filesystems fsck)\n')
sys_command(f'/usr/bin/arch-chroot {self.mountpoint} mkinitcpio -p linux')
elif self.partition.encrypted:
with open(f'{self.mountpoint}/etc/mkinitcpio.conf', 'w') as mkinit:
mkinit.write('MODULES=()\n')
mkinit.write('BINARIES=()\n')
mkinit.write('FILES=()\n')
- mkinit.write('HOOKS=(base udev autodetect modconf block encrypt filesystems keymap keyboard fsck)\n')
+ mkinit.write('HOOKS=(base udev autodetect keyboard keymap modconf block encrypt filesystems fsck)\n')
sys_command(f'/usr/bin/arch-chroot {self.mountpoint} mkinitcpio -p linux')
self.helper_flags['base'] = True
@@ -433,7 +435,7 @@ class Installer():
# The tricky thing with doing the import archinstall.session instead is that
# profiles might be run from a different chroot, and there's no way we can
# guarantee file-path safety when accessing the installer object that way.
- # Doing the __builtins__ replacement, ensures that the global vriable "installation"
+ # Doing the __builtins__ replacement, ensures that the global variable "installation"
# is always kept up to date. It's considered a nasty hack - but it's a safe way
# of ensuring 100% accuracy of archinstall session variables.
__builtins__['installation'] = self
diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py
index 62067ec1..a1d42196 100644
--- a/archinstall/lib/luks.py
+++ b/archinstall/lib/luks.py
@@ -43,8 +43,6 @@ class luks2():
return True
def encrypt(self, partition, password=None, key_size=512, hash_type='sha512', iter_time=10000, key_file=None):
- # TODO: We should be able to integrate this into the main log some how.
- # Perhaps post-mortem?
if not self.partition.allow_formatting:
raise DiskError(f'Could not encrypt volume {self.partition} due to it having a formatting lock.')
diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py
index 882bcff3..2dc8be9b 100644
--- a/archinstall/lib/networking.py
+++ b/archinstall/lib/networking.py
@@ -56,7 +56,7 @@ def wirelessScan(interface):
storage['_WIFI'][interface]['scanning'] = True
-# TOOD: Full WiFi experience might get evolved in the future, pausing for now 2021-01-25
+# TODO: Full WiFi experience might get evolved in the future, pausing for now 2021-01-25
def getWirelessNetworks(interface):
# TODO: Make this oneliner pritter to check if the interface is scanning or not.
if not '_WIFI' in storage or interface not in storage['_WIFI'] or storage['_WIFI'][interface].get('scanning', False) is False:
@@ -65,4 +65,4 @@ def getWirelessNetworks(interface):
time.sleep(5)
for line in sys_command(f"iwctl station {interface} get-networks"):
- print(line) \ No newline at end of file
+ print(line)
diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py
index 537fb695..6b184b4b 100644
--- a/archinstall/lib/output.py
+++ b/archinstall/lib/output.py
@@ -6,7 +6,7 @@ from pathlib import Path
from .storage import storage
# TODO: use logging's built in levels instead.
-# Altough logging is threaded and I wish to avoid that.
+# Although logging is threaded and I wish to avoid that.
# It's more Pythonistic or w/e you want to call it.
class LOG_LEVELS:
Critical = 0b001
@@ -88,7 +88,7 @@ def log(*args, **kwargs):
# Attempt to colorize the output if supported
# Insert default colors and override with **kwargs
if supports_color():
- kwargs = {'bg' : 'black', 'fg': 'white', **kwargs}
+ kwargs = {'fg': 'white', **kwargs}
string = stylize_output(string, **kwargs)
# If a logfile is defined in storage,
@@ -130,4 +130,4 @@ def log(*args, **kwargs):
# We use sys.stdout.write()+flush() instead of print() to try and
# fix issue #94
sys.stdout.write(f"{string}\n")
- sys.stdout.flush() \ No newline at end of file
+ sys.stdout.flush()
diff --git a/archinstall/lib/profiles.py b/archinstall/lib/profiles.py
index 70c21a67..7e76c891 100644
--- a/archinstall/lib/profiles.py
+++ b/archinstall/lib/profiles.py
@@ -112,11 +112,11 @@ class Script():
if f"{self.profile}" in self.examples:
return self.localize_path(self.examples[self.profile]['path'])
- # TODO: Redundant, the below block shouldnt be needed as profiles are stripped of their .py, but just in case for now:
+ # TODO: Redundant, the below block shouldn't be needed as profiles are stripped of their .py, but just in case for now:
elif f"{self.profile}.py" in self.examples:
return self.localize_path(self.examples[f"{self.profile}.py"]['path'])
- # Path was not found in any known examples, check if it's an abolute path
+ # Path was not found in any known examples, check if it's an absolute path
if os.path.isfile(self.profile):
return self.profile
@@ -156,7 +156,7 @@ class Profile(Script):
def install(self):
# Before installing, revert any temporary changes to the namespace.
- # This ensures that the namespace during installation is the original initation namespace.
+ # This ensures that the namespace during installation is the original initiation namespace.
# (For instance awesome instead of aweosme.py or app-awesome.py)
self.namespace = self.original_namespace
return self.execute()
@@ -177,6 +177,7 @@ class Profile(Script):
if hasattr(imported, '_prep_function'):
return True
return False
+
def has_post_install(self):
with open(self.path, 'r') as source:
source_data = source.read()
@@ -193,6 +194,11 @@ class Profile(Script):
if hasattr(imported, '_post_install'):
return True
+ def is_top_level_profile(self):
+ with open(self.path, 'r') as source:
+ source_data = source.read()
+ return 'top_level_profile = True' in source_data
+
@property
def packages(self) -> list:
"""
@@ -231,11 +237,11 @@ class Application(Profile):
if f"{self.profile}" in self.examples:
return self.localize_path(self.examples[self.profile]['path'])
- # TODO: Redundant, the below block shouldnt be needed as profiles are stripped of their .py, but just in case for now:
+ # TODO: Redundant, the below block shouldn't be needed as profiles are stripped of their .py, but just in case for now:
elif f"{self.profile}.py" in self.examples:
return self.localize_path(self.examples[f"{self.profile}.py"]['path'])
- # Path was not found in any known examples, check if it's an abolute path
+ # Path was not found in any known examples, check if it's an absolute path
if os.path.isfile(self.profile):
return os.path.basename(self.profile)
@@ -247,7 +253,7 @@ class Application(Profile):
def install(self):
# Before installing, revert any temporary changes to the namespace.
- # This ensures that the namespace during installation is the original initation namespace.
+ # This ensures that the namespace during installation is the original initiation namespace.
# (For instance awesome instead of aweosme.py or app-awesome.py)
self.namespace = self.original_namespace
- return self.execute() \ No newline at end of file
+ return self.execute()
diff --git a/archinstall/lib/storage.py b/archinstall/lib/storage.py
index 9bda017d..43d088bb 100644
--- a/archinstall/lib/storage.py
+++ b/archinstall/lib/storage.py
@@ -14,7 +14,7 @@ storage = {
os.path.join(os.path.dirname(os.path.abspath(__file__)), 'profiles'),
#os.path.abspath(f'{os.path.dirname(__file__)}/../examples')
],
- 'UPSTREAM_URL' : 'https://raw.githubusercontent.com/Torxed/archinstall/master/profiles',
+ 'UPSTREAM_URL' : 'https://raw.githubusercontent.com/archlinux/archinstall/master/profiles',
'PROFILE_DB' : None, # Used in cases when listing profiles is desired, not mandatory for direct profile grabing.
'LOG_PATH' : '/var/log/archinstall',
'LOG_FILE' : 'install.log',
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index 58f88bd2..b94bf3f5 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -1,4 +1,4 @@
-import getpass, pathlib, os, shutil
+import getpass, pathlib, os, shutil, re
from .exceptions import *
from .profiles import Profile
from .locale_helpers import search_keyboard_layout
@@ -18,11 +18,21 @@ def get_terminal_width():
def get_longest_option(options):
return max([len(x) for x in options])
+def check_for_correct_username(username):
+ if re.match(r'^[a-z_][a-z0-9_-]*\$?$', username) and len(username) <= 32:
+ return True
+ log(
+ "The username you entered is invalid. Try again",
+ level=LOG_LEVELS.Warning,
+ fg='red'
+ )
+ return False
+
def get_password(prompt="Enter a password: "):
while (passwd := getpass.getpass(prompt)):
passwd_verification = getpass.getpass(prompt='And one more time for verification: ')
if passwd != passwd_verification:
- log(' * Passwords did not match * ', bg='black', fg='red')
+ log(' * Passwords did not match * ', fg='red')
continue
if len(passwd.strip()) <= 0:
@@ -50,14 +60,16 @@ def print_large_list(options, padding=5, margin_bottom=0, separator=': '):
def ask_for_superuser_account(prompt='Create a required super-user with sudo privileges: ', forced=False):
while 1:
new_user = input(prompt).strip(' ')
-
+
if not new_user and forced:
# TODO: make this text more generic?
# It's only used to create the first sudo user when root is disabled in guided.py
- log(' * Since root is disabled, you need to create a least one (super) user!', bg='black', fg='red')
+ log(' * Since root is disabled, you need to create a least one (super) user!', fg='red')
continue
elif not new_user and not forced:
raise UserError("No superuser was created.")
+ elif not check_for_correct_username(new_user):
+ continue
password = get_password(prompt=f'Password for user {new_user}: ')
return {new_user: {"!password" : password}}
@@ -70,6 +82,8 @@ def ask_for_additional_users(prompt='Any additional users to install (leave blan
new_user = input(prompt).strip(' ')
if not new_user:
break
+ if not check_for_correct_username(new_user):
+ continue
password = get_password(prompt=f'Password for user {new_user}: ')
if input("Should this user be a sudo (super) user (y/N): ").strip(' ').lower() in ('y', 'yes'):
@@ -89,6 +103,14 @@ def ask_for_a_timezone():
level=LOG_LEVELS.Warning,
fg='red'
)
+
+def ask_for_audio_selection():
+ audio = "pulseaudio" # Default for most desktop environments
+ pipewire_choice = input("Would you like to install pipewire instead of pulseaudio as the default audio server? [Y/n] ").lower()
+ if pipewire_choice in ("y", ""):
+ audio = "pipewire"
+
+ return audio
def ask_to_configure_network():
# Optionally configure one network interface.
@@ -110,7 +132,6 @@ def ask_to_configure_network():
log(
"You need to enter a valid IP in IP-config mode.",
level=LOG_LEVELS.Warning,
- bg='black',
fg='red'
)
@@ -153,7 +174,7 @@ def ask_for_main_filesystem_format():
def generic_select(options, input_text="Select one of the above by index or absolute value: ", sort=True):
"""
A generic select function that does not output anything
- other than the options and their indexs. As an example:
+ other than the options and their indexes. As an example:
generic_select(["first", "second", "third option"])
1: first
diff --git a/docs/archinstall/general.rst b/docs/archinstall/general.rst
index e5459749..776a38b1 100644
--- a/docs/archinstall/general.rst
+++ b/docs/archinstall/general.rst
@@ -12,7 +12,7 @@ Packages
========
.. autofunction:: archinstall.find_package
-
+Be
.. autofunction:: archinstall.find_packages
Locale related
@@ -24,9 +24,6 @@ Locale related
.. autofunction:: archinstall.set_keyboard_language
-..
- autofunction:: archinstall.Installer.set_keyboard_layout
-
Services
========
@@ -90,4 +87,4 @@ Exceptions
.. autofunction:: archinstall.ProfileError
-.. autofunction:: archinstall.SysCallError \ No newline at end of file
+.. autofunction:: archinstall.SysCallError
diff --git a/docs/examples/binary.rst b/docs/examples/binary.rst
index 6940d591..51dbd1dd 100644
--- a/docs/examples/binary.rst
+++ b/docs/examples/binary.rst
@@ -1,4 +1,4 @@
-.. _examples.python:
+.. _examples.binary:
Binary executable
=================
@@ -11,7 +11,7 @@ It's compiled using `nuitka <https://nuitka.net/>`_ with the flag `--standalone`
Executing the binary
--------------------
-As an example we'll use the `guided <https://github.com/Torxed/archinstall/blob/master/examples/guided.py>`_ installer.
+As an example we'll use the `guided <https://github.com/archlinux/archinstall/blob/master/examples/guided.py>`_ installer.
To run the `guided` installed, all you have to do *(after installing or compiling the binary)*, is run:
@@ -20,4 +20,4 @@ To run the `guided` installed, all you have to do *(after installing or compilin
./archinstall guided
As mentioned, the binary is a bit rudimentary and only supports executing whatever is found directly under `./archinstall/examples`.
-Anything else won't be found. This is subject to change in the future to make it a bit more flexible. \ No newline at end of file
+Anything else won't be found. This is subject to change in the future to make it a bit more flexible.
diff --git a/docs/help/discord.rst b/docs/help/discord.rst
index 609fbecb..ce15766a 100644
--- a/docs/help/discord.rst
+++ b/docs/help/discord.rst
@@ -3,7 +3,7 @@
Discord
=======
-There's a discord channel which is frequent by some `contributors <https://github.com/Torxed/archinstall/graphs/contributors>`_.
+There's a discord channel which is frequent by some `contributors <https://github.com/archlinux/archinstall/graphs/contributors>`_.
To join the server, head over to `https://discord.gg/cqXU88y <https://discord.gg/cqXU88y>`_'s server and join in.
There's not many rules other than common sense and treat others with respect.
diff --git a/docs/help/issues.rst b/docs/help/issues.rst
index f29b18cc..d4f71b70 100644
--- a/docs/help/issues.rst
+++ b/docs/help/issues.rst
@@ -3,7 +3,7 @@
Issue tracker & bugs
====================
-Issues and bugs should be reported over at `https://github.com/Torxed/archinstall/issues <https://github.com/Torxed/archinstall/issues>`_.
+Issues and bugs should be reported over at `https://github.com/archlinux/archinstall/issues <https://github.com/Torxed/archinstall/issues>`_.
General questions, enhancements and security issues can be reported over there too.
For quick issues or if you need help, head over the to the Discord server which has a help channel.
diff --git a/docs/index.rst b/docs/index.rst
index fea8f788..deb2734e 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -46,7 +46,8 @@ Some of the features of Archinstall are:
..
examples/scripting
-.. toctree::
+..
+ .. toctree::
:maxdepth: 3
:caption: Programming Guide
@@ -66,4 +67,4 @@ Some of the features of Archinstall are:
:maxdepth: 3
:caption: API Helper functions
- archinstall/general \ No newline at end of file
+ archinstall/general
diff --git a/docs/installing/binary.rst b/docs/installing/binary.rst
index c51fb2c0..504d6e3e 100644
--- a/docs/installing/binary.rst
+++ b/docs/installing/binary.rst
@@ -1,10 +1,10 @@
-.. _installing.binary
+.. _installing.binary:
Binary executable
=================
Archinstall can be compiled into a standalone executable.
-For Arch Linux based systems, there's a package for this called `archinstall <https://archlinux.life/>`_.
+For Arch Linux based systems, there's a package for this called `archinstall <https://archlinux.org/packages/extra/any/archinstall/>`_.
.. warning::
This is not required if you're running archinstall on a pre-built ISO. The installation is only required if you're creating your own scripted installations.
@@ -21,7 +21,7 @@ Archinstall is on the `official repositories <https://wiki.archlinux.org/index.p
Using PKGBUILD
--------------
-The `source <https://github.com/Torxed/archinstall>`_ contains a binary `PKGBUILD <https://github.com/Torxed/archinstall/tree/master/PKGBUILD/archinstall>`_ which can be either copied straight off the website. Or cloned using `git clone https://github.com/Torxed/archinstall`.
+The `source <https://github.com/archlinux/archinstall>`_ contains a binary `PKGBUILD <https://github.com/Torxed/archinstall/tree/master/PKGBUILD/archinstall>`_ which can be either copied straight off the website. Or cloned using `git clone https://github.com/Torxed/archinstall`.
Once you've obtained the `PKGBUILD`, building it is pretty straight forward.
@@ -37,7 +37,7 @@ Which should produce a `archinstall-X.x.z-1.pkg.tar.zst` that can be installed u
.. note::
- For a complete guide on the build process, please consult the wiki on `PKGBUILD <https://wiki.archlinux.org/index.php/PKGBUILD>`_.
+ For a complete guide on the build process, please consult the `PKGBUILD on ArchWiki <https://wiki.archlinux.org/index.php/PKGBUILD>`_.
Manual compilation
------------------
@@ -49,4 +49,4 @@ Simply clone or download the source, and while standing in the cloned folder `./
nuitka3 --standalone --show-progress archinstall
-This requires the `nuitka <https://archlinux.org/packages/community/any/nuitka/>`_ package as well as `python3` to be installed locally. \ No newline at end of file
+This requires the `nuitka <https://archlinux.org/packages/community/any/nuitka/>`_ package as well as `python3` to be installed locally.
diff --git a/docs/installing/guided.rst b/docs/installing/guided.rst
index 40d86055..8699ae62 100644
--- a/docs/installing/guided.rst
+++ b/docs/installing/guided.rst
@@ -64,7 +64,7 @@ Default is :code:`auto detect best mirror`
As an example:
- * :code:`Sweden` *(wich a capital :code:`S`)* will only use mirrors from Sweden.
+ * :code:`Sweden` *(with a capital :code:`S`)* will only use mirrors from Sweden.
Selection of drive
------------------
@@ -173,4 +173,4 @@ After which you can press :code:`Enter` can be pressed in order to start the for
Post installation
-----------------
-Once the installation is complete, green text should appear saying that it's safe to `reboot`, which is also the command you use to reboot. \ No newline at end of file
+Once the installation is complete, green text should appear saying that it's safe to `reboot`, which is also the command you use to reboot.
diff --git a/docs/installing/python.rst b/docs/installing/python.rst
index 94cfb243..68365753 100644
--- a/docs/installing/python.rst
+++ b/docs/installing/python.rst
@@ -54,7 +54,7 @@ Or you can clone it, we'll clone it here but both methods work the same.
.. code-block:: console
- git clone https://github.com/Torxed/archinstall
+ git clone https://github.com/archlinux/archinstall
Either you can move the folder into your project and simply do
diff --git a/docs/pull_request_template.md b/docs/pull_request_template.md
index 886ea244..c2f694ce 100644
--- a/docs/pull_request_template.md
+++ b/docs/pull_request_template.md
@@ -1,31 +1,28 @@
-# Pull Request Template
+🚨 PR Guidelines:
-Make sure you've checked out the [contribution guideline](https://github.com/Torxed/archinstall/blob/master/CONTRIBUTING.md).<br>
-Most of the guidelines are not enforced, but is heavily encouraged.
+# New features *(v2.2.0)*
-## Description
+Merge new features in to `torxed-v2.2.0`.<br>
+This branch is designated for potential breaking changes, added complexity and new functionality.
-Please include a summary of the change and which issue is fixed.<br>
-It is also helpful to add links to online documentation or to the implementation of the code you are changing.
+# Bug fixes *(v2.1.4)*
-## Bugs and Issues
+Merge against `master` for bug fixes and anything that improves stability and quality of life.<br>
+This excludes:
+ * New functionality
+ * Added complexity
+ * Breaking changes
-If this pull-request fixes an issue or a bug, please mention the issues with the approriate issue referece *(Example: &#35;8)*.
+Any changes to `master` automatically gets pulled in to `torxed-v2.2.0` to avoid merge hell.
-## How Has This Been Tested?
+# Describe your PR
-If possible, mention any tests you have made with the current code base included in the pull-requests.<br>
-Any core-developer will also run tests, but this helps speed things up. Below is a template that can be used:
+If the changes has been discussed in an Issue, please tag it so we can backtrace from the Issue later on.<br>
+If the PR is larger than ~20 lines, please describe it here unless described in an issue.
-As an example:
+# Testing
-**Test Configuration**:
-* Hardware: VirtualBox 6.1
-* Specific steps: Ran installer with additional packages `nano` and `wget`
+Any new feature or stability improvement should be tested if possible.
+Please follow the test instructions at the bottom of the README.
-## Checklist:
-
-- [ ] My code follows the style guidelines of this project
-- [ ] I have performed a self-review of my own code to the best of my abilities
-- [ ] I have commented my code, particularly in hard-to-understand areas
-- [ ] I have made corresponding changes to the documentation where possible/if applicable
+*These PR guidelines will change after 2021-05-01, which is when `v2.1.4` gets onto the new ISO*
diff --git a/examples/guided.py b/examples/guided.py
index 81cc2991..66cc2405 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -1,6 +1,7 @@
import getpass, time, json, sys, signal, os
import archinstall
from archinstall.lib.hardware import hasUEFI
+from archinstall.lib.profiles import Profile
"""
This signal-handler chain (and global variable)
@@ -59,7 +60,7 @@ def ask_user_questions():
if archinstall.arguments['harddrive'].has_partitions():
archinstall.log(f"{archinstall.arguments['harddrive']} contains the following partitions:", fg='yellow')
- # We curate a list pf supported paritions
+ # We curate a list pf supported partitions
# and print those that we don't support.
partition_mountpoints = {}
for partition in archinstall.arguments['harddrive']:
@@ -70,7 +71,7 @@ def ask_user_questions():
except archinstall.UnknownFilesystemFormat as err:
archinstall.log(f" {partition} (Filesystem not supported)", fg='red')
- # We then ask what to do with the paritions.
+ # We then ask what to do with the partitions.
if (option := archinstall.ask_for_disk_layout()) == 'abort':
archinstall.log(f"Safely aborting the installation. No changes to the disk or system has been made.")
exit(1)
@@ -90,7 +91,7 @@ def ask_user_questions():
mountpoint = input(f"Enter a mount-point for {partition}: ").strip(' ')
if len(mountpoint):
- # Get a valid & supported filesystem for the parition:
+ # Get a valid & supported filesystem for the partition:
while 1:
new_filesystem = input(f"Enter a valid filesystem for {partition} (leave blank for {partition.filesystem}): ").strip(' ')
if len(new_filesystem) <= 0:
@@ -113,7 +114,7 @@ def ask_user_questions():
try:
partition.format(new_filesystem, path='/dev/null', log_formating=False, allow_formatting=True)
except archinstall.UnknownFilesystemFormat:
- archinstall.log(f"Selected filesystem is not supported yet. If you want archinstall to support '{new_filesystem}', please create a issue-ticket suggesting it on github at https://github.com/Torxed/archinstall/issues.")
+ archinstall.log(f"Selected filesystem is not supported yet. If you want archinstall to support '{new_filesystem}', please create a issue-ticket suggesting it on github at https://github.com/archlinux/archinstall/issues.")
archinstall.log(f"Until then, please enter another supported filesystem.")
continue
except archinstall.SysCallError:
@@ -121,7 +122,7 @@ def ask_user_questions():
# But that means our .format() function supported it.
break
- # When we've selected all three criterias,
+ # When we've selected all three criteria,
# We can safely mark the partition for formatting and where to mount it.
# TODO: allow_formatting might be redundant since target_mountpoint should only be
# set if we actually want to format it anyway.
@@ -167,23 +168,35 @@ def ask_user_questions():
# Ask for archinstall-specific profiles (such as desktop environments etc)
if not archinstall.arguments.get('profile', None):
- archinstall.arguments['profile'] = archinstall.select_profile(archinstall.list_profiles())
+ archinstall.arguments['profile'] = archinstall.select_profile(filter(lambda profile: (Profile(None, profile).is_top_level_profile()), archinstall.list_profiles()))
else:
archinstall.arguments['profile'] = archinstall.list_profiles()[archinstall.arguments['profile']]
- # Check the potentially selected profiles preperations to get early checks if some additional questions are needed.
+ # Check the potentially selected profiles preparations to get early checks if some additional questions are needed.
if archinstall.arguments['profile'] and archinstall.arguments['profile'].has_prep_function():
with archinstall.arguments['profile'].load_instructions(namespace=f"{archinstall.arguments['profile'].namespace}.py") as imported:
if not imported._prep_function():
archinstall.log(
' * Profile\'s preparation requirements was not fulfilled.',
- bg='black',
fg='red'
)
exit(1)
+ # Ask about audio server selection if one is not already set
+ if not archinstall.arguments.get('audio', None):
+
+ # only ask for audio server selection on a desktop profile
+ if str(archinstall.arguments['profile']) == 'Profile(desktop)':
+ archinstall.arguments['audio'] = archinstall.ask_for_audio_selection()
+ else:
+ # packages installed by a profile may depend on audio and something may get installed anyways, not much we can do about that.
+ # we will not try to remove packages post-installation to not have audio, as that may cause multiple issues
+ archinstall.arguments['audio'] = 'none'
+
# Additional packages (with some light weight error handling for invalid package names)
if not archinstall.arguments.get('packages', None):
+ print("Packages not part of the desktop environment are not installed by default.")
+ print("If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt.")
archinstall.arguments['packages'] = [package for package in input('Write additional packages to install (space separated, leave blank to skip): ').split(' ') if len(package)]
# Verify packages that were given
@@ -329,7 +342,15 @@ def perform_installation(device, boot_partition, language, mirrors):
installation.enable_service('systemd-networkd')
installation.enable_service('systemd-resolved')
-
+ if archinstall.arguments.get('audio', None) != None:
+ installation.log(f"The {archinstall.arguments.get('audio', None)} audio server will be used.", level=archinstall.LOG_LEVELS.Info)
+ if archinstall.arguments.get('audio', None) == 'pipewire':
+ print('Installing pipewire ...')
+ installation.add_additional_packages(["pipewire", "pipewire-alsa", "pipewire-docs", "pipewire-jack", "pipewire-media-session", "pipewire-pulse", "gst-plugin-pipewire", "libpulse"])
+ elif archinstall.arguments.get('audio', None) == 'pulseaudio':
+ print('Installing pulseaudio ...')
+ installation.add_additional_packages("pulseaudio")
+
if archinstall.arguments.get('packages', None) and archinstall.arguments.get('packages', None)[0] != '':
installation.add_additional_packages(archinstall.arguments.get('packages', None))
@@ -358,5 +379,3 @@ def perform_installation(device, boot_partition, language, mirrors):
ask_user_questions()
perform_installation_steps()
-
-
diff --git a/examples/minimal.py b/examples/minimal.py
index b5bb34e0..6016bbbf 100644
--- a/examples/minimal.py
+++ b/examples/minimal.py
@@ -24,7 +24,7 @@ with archinstall.Filesystem(harddrive) as fs:
installation.add_bootloader()
installation.add_additional_packages(['nano', 'wget', 'git'])
- installation.install_profile('awesome')
+ installation.install_profile('minimal')
- installation.user_create('anton', 'test')
- installation.user_set_pw('root', 'toor') \ No newline at end of file
+ installation.user_create('devel', 'devel')
+ installation.user_set_pw('root', 'toor')
diff --git a/profiles/applications/gnome.py b/profiles/applications/gnome.py
index 1f2a20a1..e26290dc 100644
--- a/profiles/applications/gnome.py
+++ b/profiles/applications/gnome.py
@@ -1,4 +1,4 @@
import archinstall
-installation.add_additional_packages("gnome gnome-extra gdm") # We'll create a gnome-minimal later, but for now, we'll avoid issues by giving more than we need.
-# Note: gdm should be part of the gnome group, but adding it here for clarity \ No newline at end of file
+installation.add_additional_packages("gnome gnome-tweaks gdm")
+# Note: gdm should be part of the gnome group, but adding it here for clarity
diff --git a/profiles/awesome.py b/profiles/awesome.py
index 8004fc62..0d133962 100644
--- a/profiles/awesome.py
+++ b/profiles/awesome.py
@@ -2,7 +2,11 @@
import archinstall
-__packages__ = ['nano', 'nemo', 'gpicview-gtk3', 'chromium', 'openssh', 'sshfs', 'htop', 'scrot', 'wget']
+is_top_level_profile = False
+
+# New way of defining packages for a profile, which is iterable and can be used out side
+# of the profile to get a list of "what packages will be installed".
+__packages__ = ['nano', 'nemo', 'gpicview-gtk3', 'openssh', 'sshfs', 'htop', 'scrot', 'wget']
def _prep_function(*args, **kwargs):
"""
diff --git a/profiles/cinnamon.py b/profiles/cinnamon.py
index dac38bd3..1a796bc7 100644
--- a/profiles/cinnamon.py
+++ b/profiles/cinnamon.py
@@ -1,7 +1,8 @@
# A desktop environment using "Cinnamon"
-
import archinstall
+is_top_level_profile = False
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
diff --git a/profiles/desktop.py b/profiles/desktop.py
index 0c89e543..389198d6 100644
--- a/profiles/desktop.py
+++ b/profiles/desktop.py
@@ -2,6 +2,8 @@
import archinstall, os
+is_top_level_profile = True
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
@@ -10,11 +12,11 @@ def _prep_function(*args, **kwargs):
for more input before any other installer steps start.
"""
- supported_desktops = ['gnome', 'kde', 'awesome', 'xfce4', 'cinnamon']
+ supported_desktops = ['gnome', 'kde', 'awesome', 'xfce4', 'cinnamon', 'i3-gaps', 'i3-wm']
desktop = archinstall.generic_select(supported_desktops, 'Select your desired desktop environment: ')
- # Temporarly store the selected desktop profile
- # in a session-safe location, since this module will get re-loaded
+ # Temporarily store the selected desktop profile
+ # in a session-safe location, since this module will get reloaded
# the next time it gets executed.
archinstall.storage['_desktop_profile'] = desktop
@@ -29,7 +31,7 @@ def _prep_function(*args, **kwargs):
if __name__ == 'desktop':
"""
This "profile" is a meta-profile.
- There are no specific desktop-steps, it simply routes
+ There are no desktop-specific steps, it simply routes
the installer to whichever desktop environment/window manager was chosen.
Maybe in the future, a network manager or similar things *could* be added here.
@@ -37,7 +39,7 @@ if __name__ == 'desktop':
it trying to be a turn-key desktop distribution.
There are plenty of desktop-turn-key-solutions based on Arch Linux,
- this is therefor just a helper to get started
+ this is therefore just a helper to get started
"""
# TODO: Remove magic variable 'installation' and place it
diff --git a/profiles/gnome.py b/profiles/gnome.py
index b37679de..c75cafee 100644
--- a/profiles/gnome.py
+++ b/profiles/gnome.py
@@ -2,6 +2,8 @@
import archinstall
+is_top_level_profile = False
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
diff --git a/profiles/i3-gaps.py b/profiles/i3-gaps.py
index 50511dce..e900117a 100644
--- a/profiles/i3-gaps.py
+++ b/profiles/i3-gaps.py
@@ -1,5 +1,7 @@
import archinstall, subprocess
+is_top_level_profile = False
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
diff --git a/profiles/i3-wm.py b/profiles/i3-wm.py
index cd6cbc81..a2449e39 100644
--- a/profiles/i3-wm.py
+++ b/profiles/i3-wm.py
@@ -1,5 +1,7 @@
import archinstall, subprocess
+is_top_level_profile = False
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
diff --git a/profiles/kde.py b/profiles/kde.py
index 59276c4f..d6abe029 100644
--- a/profiles/kde.py
+++ b/profiles/kde.py
@@ -1,7 +1,9 @@
-# A desktop environement using "KDE".
+# A desktop environment using "KDE".
import archinstall, os
+is_top_level_profile = False
+
# TODO: Remove hard dependency of bash (due to .bash_profile)
def _prep_function(*args, **kwargs):
diff --git a/profiles/minimal.py b/profiles/minimal.py
new file mode 100644
index 00000000..79821a89
--- /dev/null
+++ b/profiles/minimal.py
@@ -0,0 +1,20 @@
+# Used to do a minimal install
+
+import archinstall, os
+
+is_top_level_profile = True
+
+def _prep_function(*args, **kwargs):
+ """
+ Magic function called by the importing installer
+ before continuing any further. For minimal install,
+ we don't need to do anything special here, but it
+ needs to exist and return True.
+ """
+ return True # Do nothing and just return True
+
+if __name__ == 'minimal':
+ """
+ This "profile" is a meta-profile.
+ It is used for a custom minimal installation, without any desktop-specific packages.
+ """
diff --git a/profiles/xfce4.py b/profiles/xfce4.py
index 36c9958a..c8637eda 100644
--- a/profiles/xfce4.py
+++ b/profiles/xfce4.py
@@ -1,6 +1,8 @@
# A desktop environment using "Xfce4"
+is_top_level_profile = False
+
import archinstall
def _prep_function(*args, **kwargs):
diff --git a/profiles/xorg.py b/profiles/xorg.py
index 542558c6..33356859 100644
--- a/profiles/xorg.py
+++ b/profiles/xorg.py
@@ -2,6 +2,8 @@
import archinstall, os
+is_top_level_profile = True
+
AVAILABLE_DRIVERS = {
# Sub-dicts are layer-2 options to be selected
# and lists are a list of packages to be installed
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000..9787c3bd
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 00000000..e5d79ef3
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,39 @@
+[metadata]
+name = archinstall
+version = attr: archinstall.__version__
+description = Arch Linux installer - guided, templates etc.
+author = Anton Hvornum
+author_email = anton@hvornum.se
+long_description = file: README.md
+long_description_content_type = text/markdown
+license = GPL
+license_files =
+ LICENSE
+project_urls =
+ Source = https://github.com/archlinux/archinstall
+ Documentation = https://archinstall.readthedocs.io/
+classifers =
+ Programming Language :: Python :: 3
+ Programming Language :: Python :: 3.8
+ Programming Language :: Python :: 3.9
+ License :: OSI Approved :: GNU General Public License v3 (GPLv3)
+ Operating System :: POSIX :: Linux
+
+[options]
+packages = find:
+python_requires = >= 3.8
+
+[options.packages.find]
+include =
+ archinstall
+ archinstall.*
+
+[options.package_data]
+archinstall =
+ examples/*.py
+ profiles/*.py
+ profiles/applications/*.py
+
+[options.entry_points]
+console_scripts =
+ archinstall = archinstall:run_as_a_module
diff --git a/setup.py b/setup.py
index 02029a70..a4f49f92 100644
--- a/setup.py
+++ b/setup.py
@@ -1,27 +1,2 @@
-import setuptools, glob, shutil
-
-with open("README.md", "r") as fh:
- long_description = fh.read()
-
-with open('VERSION', 'r') as fh:
- VERSION = fh.read()
-
-setuptools.setup(
- name="archinstall",
- version=VERSION,
- author="Anton Hvornum",
- author_email="anton@hvornum.se",
- description="Arch Linux installer - guided, templates etc.",
- long_description=long_description,
- long_description_content_type="text/markdown",
- url="https://github.com/Torxed/archinstall",
- packages=setuptools.find_packages(),
- classifiers=[
- "Programming Language :: Python :: 3.8",
- "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
- "Operating System :: POSIX :: Linux",
- ],
- python_requires='>=3.8',
- setup_requires=['wheel'],
- package_data={'archinstall': glob.glob('examples/*.py') + glob.glob('profiles/*.py') + glob.glob('profiles/applications/*.py')},
-)
+import setuptools
+setuptools.setup()