Skip to content
This repository has been archived by the owner on Apr 17, 2024. It is now read-only.

Migrate to Python #158

Closed
wants to merge 33 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6134f17
Create python structure
timmypidashev Apr 11, 2022
1450204
Restructure project
timmypidashev Apr 11, 2022
962eb3b
Update __init__.py
timmypidashev Apr 11, 2022
ebbf9d3
Add template argparse list
timmypidashev Apr 11, 2022
021cb6e
Polish __init__.py
timmypidashev Apr 11, 2022
d8345c4
Remove setup.py
timmypidashev Apr 11, 2022
54a753a
Create system_details(); error handler
timmypidashev Apr 12, 2022
1838b24
Add --crostini flag; update system tests
timmypidashev Apr 12, 2022
decc141
Create settings.py; create set_verbosity_level()
timmypidashev Apr 12, 2022
dc5326a
Delete input.py; create input_options
timmypidashev Apr 12, 2022
f957bfe
Update .gitignore
timmypidashev Apr 12, 2022
7d40ca5
Create interactions.py; polish and handle default config
timmypidashev Apr 12, 2022
0bcbf60
Add Exception catching; polish quite a lot.
timmypidashev Apr 13, 2022
a67aea9
Change naming scheme of argparse long args; rename system_details()
timmypidashev Apr 13, 2022
f587f2b
Structure system.py
timmypidashev Apr 13, 2022
e960b1c
Add colorful output and breath logo; remove deps: toilet, cprint
timmypidashev Apr 13, 2022
272094e
Add inquirer cli menu; minor polishes all over
timmypidashev Apr 14, 2022
8f2c7dd
Add crostini confirmation to inquirer
timmypidashev Apr 14, 2022
2b1ba06
Merge branch 'cb-linux:main' into port/python
timmypidashev Apr 19, 2022
8dcfd74
Update __init__ structure to properly run as a library; re-structure …
timmypidashev Apr 19, 2022
d370c9d
Rename bling.py -> output.py
timmypidashev Apr 21, 2022
c0a319c
Remove bling refs; Finish work on interactions for now
timmypidashev Apr 26, 2022
910befe
Create BreathSystem
timmypidashev Apr 26, 2022
7ba64ca
Fix password autoprompt
timmypidashev Apr 27, 2022
d4abe5a
Add install_dependencies; begin work on BreathInstaller()
timmypidashev Apr 27, 2022
218361d
Add run_cmd()
timmypidashev Apr 27, 2022
38a51b7
Merge branch 'cb-linux:main' into port/python
timmypidashev Apr 27, 2022
9d9f14c
Remove 'system_passwd' option from installer, as it is not longer needed
timmypidashev Apr 27, 2022
ba0817a
Create functions.py; swap color-codes for cprint
timmypidashev Apr 27, 2022
ad0424f
Begin work in installer, polish cli menu
timmypidashev Apr 27, 2022
920a1a9
Early bootstrap structure; lots of odds and ends
timmypidashev Apr 27, 2022
87959ae
Strip unneeded work in accordance with discussion
timmypidashev May 2, 2022
6c8578f
Merge branch 'cb-linux:main' into port/python
timmypidashev May 2, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,10 @@ kernel/*
!kernel/logo
kernel/logo/*
!kernel/logo/logo.png
!kernel/genimg.sh
!kernel/genimg.sh

# [port/python] Temporary ignore files to prevent accidentally pushing bloat
__pycache__/
breath.egg-info/
build/
dist/
132 changes: 132 additions & 0 deletions __init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#-*- encoding: utf-8 -*-

"""
Python Breath adaptation
"""

__title__ = 'breath'
__summary__ = 'A way to natively run Linux on modern Chromebooks without replacing firmware.'
__author__ = 'MilkyDeveloper'
__license__ = 'MIT'
__copyright__ = 'Copyright 2021-present MilkyDeveloper'
__version__ = '4.1.1-port/python'

import subprocess
import traceback
import argparse
import sys

# The default configuration options for Breath.
# Used for comparison between user options and defaults
# to determine if user interaction is necessary.
# NOTE: Changing these values changes Breath defaults!
defaults = {
'install_type': 'usb',
'distro': 'ubuntu',
'desktop': 'cli',
'hostname': 'chromebook',
'username': 'breath',
'password': 'breath_passwd',
'keymap': False,
'crostini': False,
'local_kernel': False,
'force_defaults': False,
'cleanup': False,
'verbose': False,
'view_defaults': False,
'version': False
}


class CustomHelpFormatter(argparse.HelpFormatter):
"""
Custom argparse help formatter. Currently this allows for the following:
- Disables metavar for short args. Example without(-t {usb, iso} --type {usb, iso}) | Example with(-t --type {usb, iso})
- Allows for extending the default column size for help variables.
"""
def __init__(self, prog):
super().__init__(prog, max_help_position=100, width=180)

def _format_action_invocation(self, action):
if not action.option_strings or action.nargs == 0:
return super()._format_action_invocation(action)
default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
return ', '.join(action.option_strings) + ' ' + args_string


def define_and_parse_args():
# TODO: Fix command-line formatting(Several wacky things like indentation between long and short args).
# TODO: Add nargs for short help.
"""
Define command-line arguments.
"""
fmt = lambda prog: CustomHelpFormatter(prog)

parser = argparse.ArgumentParser(
prog=__title__,
usage='&(prog)s [options...]',
description=__summary__,
formatter_class=fmt
)

parser.add_argument('-t', '--install_type', default=defaults['install_type'], choices=['usb', 'iso'], help='choose installation type (default: %(default)s)')
parser.add_argument('-d', '--distro', default=defaults['distro'], choices=['arch', 'debian', 'fedora', 'ubuntu'], help='choose distro (default: %(default)s)')
parser.add_argument('-de', '--desktop', default=defaults['desktop'], choices=['cli', 'gnome', 'kde', 'minimal', 'deepin', 'budgie', 'fce', 'lxqt', 'mate', 'openbox'], help='choose desktop environment (default: %(default)s)')
parser.add_argument('-hn', '--hostname', default=defaults['hostname'], help='set hostname (default: %(default)s)')
parser.add_argument('-u', '--username', default=defaults['username'], help='set username (default: %(default)s)')
parser.add_argument('-p', '--password', default=defaults['password'], help='set password (default: %(default)s)')
parser.add_argument('-k', '--keymap', default=defaults['keymap'], help='map keys to chromebook actions (default: %(default)s)', action='store_true')
parser.add_argument('-c', '--crostini', default=defaults['crostini'], help='installer using a chrome-based system (default: %(default)s)', action='store_true')
parser.add_argument('-lk', '--local_kernel', default=defaults['local_kernel'], help='use a local build of the kernel bzImage (default: %(default)s)', action='store_true')
parser.add_argument('-f', '--force_defaults', default=defaults['force_defaults'], help='install with default configuration (see defaults)', action='store_true')
parser.add_argument('-vd', '--view_defaults', default=defaults['view_defaults'], help='view default configuration options', action='store_true')
parser.add_argument('-v', '--version', default=defaults['version'], help='output version information and exit', action='store_true')

# Parse args
args = parser.parse_args()

# Add argparse options to dict(user_input)
user_input = (vars(args))

if args.view_defaults:
info(defaults)
sys.exit()

elif args.version:
info(f'{__title__} v{__version__}')
sys.exit()

else:
print(parser.print_help())
sys.exit()

return user_input


def run_as_a_module():
"""
Since we're running this as a 'python -m archinstall' module
or a compiled version of the project, this function
and the file '__main__.py' acts as a entry point.
"""

# Argparse command-line parsers
# NOTE: Runs only if ran as a module
options = define_and_parse_args()

try:
# Exit if running as root.
if os.geteuid() == 0:
sys.tracebacklimit = 0 # set as options is not yet defined
raise DontRunAsRoot('Please do not run Breath as root!')

# Run core installer here and pass options

except Exception:
"""
CPrint any exception not defined in Breath if caught.
NOTE: Verbosity levels ignored since an exception
thrown by python is usually a bug.
"""
sys.exit()
4 changes: 4 additions & 0 deletions __main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import breath

if __name__ == '__main__':
breath.run_as_a_module()