Skip to content

Commit

Permalink
Merge pull request #1353 from dbungert/jammy.1
Browse files Browse the repository at this point in the history
fixes targetting jammy.1
  • Loading branch information
dbungert authored Jul 15, 2022
2 parents 762a7d9 + 492c1b4 commit 5d7fd35
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 4 deletions.
16 changes: 16 additions & 0 deletions snapcraft.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,22 @@ version: git
summary: Ubuntu installer
description: The Ubuntu server installer
confinement: classic
source-code: https://github.com/canonical/subiquity
issues: https://bugs.launchpad.net/subiquity/+filebug

apps:
subiquity:
command: usr/bin/subiquity-cmd
environment:
# Save original values of environment variables, we want to restore them
# for the debug shell (LP: #1975629) and restart (LP: #1978139)
PYTHONPATH_ORIG: $PYTHONPATH
PATH_ORIG: $PATH
PYTHONIOENCODING_ORIG: $PYTHONIOENCODING
PYTHONIOENCODING: utf-8
SUBIQUITY_ROOT_ORIG: $SUBIQUITY_ROOT
SUBIQUITY_ROOT: $SNAP
PYTHON_ORIG: $PYTHON
PYTHON: $SNAP/usr/bin/python3.8
probert:
command: bin/probert
Expand All @@ -29,8 +38,15 @@ apps:
daemon: simple
restart-condition: always
environment:
# Save original values of environment variables, we want to restore them
# for the debug shell (LP: #1975629).
PYTHONPATH_ORIG: $PYTHONPATH
PATH_ORIG: $PATH
PYTHONIOENCODING_ORIG: $PYTHONIOENCODING
PYTHONIOENCODING: utf-8
SUBIQUITY_ROOT_ORIG: $SUBIQUITY_ROOT
SUBIQUITY_ROOT: $SNAP
PYTHON_ORIG: $PYTHON
PYTHON: $SNAP/usr/bin/python3.8
os-prober:
command: usr/bin/os-prober
Expand Down
9 changes: 6 additions & 3 deletions subiquity/client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from subiquitycore.screen import is_linux_tty
from subiquitycore.tuicontroller import Skip
from subiquitycore.tui import TuiApplication
from subiquitycore.utils import orig_environ
from subiquitycore.view import BaseView

from subiquity.client.controller import Confirm
Expand Down Expand Up @@ -202,7 +203,7 @@ def restart(self, remove_last_screen=True, restart_server=False):
cmdline.extend(['--server-pid', self.opts.server_pid])
log.debug("restarting %r", cmdline)

os.execvp(cmdline[0], cmdline)
os.execvpe(cmdline[0], cmdline, orig_environ(os.environ))

def resp_hook(self, response):
headers = response.headers
Expand Down Expand Up @@ -467,7 +468,7 @@ def select_initial_screen(self):
async def _select_initial_screen(self, index):
endpoint_names = []
for c in self.controllers.instances[:index]:
if c.endpoint_name:
if getattr(c, 'endpoint_name', None) is not None:
endpoint_names.append(c.endpoint_name)
if endpoint_names:
await self.client.meta.mark_configured.POST(endpoint_names)
Expand Down Expand Up @@ -544,8 +545,10 @@ def _before():
os.system("clear")
print(DEBUG_SHELL_INTRO)

env = orig_environ(os.environ)
cmd = ["bash"]
self.run_command_in_foreground(
["bash"], before_hook=_before, after_hook=after_hook, cwd='/')
cmd, env=env, before_hook=_before, after_hook=after_hook, cwd='/')

def note_file_for_apport(self, key, path):
self.error_reporter.note_file_for_apport(key, path)
Expand Down
2 changes: 1 addition & 1 deletion subiquity/server/controllers/refresh.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ async def check_for_update(self, context):
async def start_update(self, context):
change = await self.app.snapd.post(
'v2/snaps/{}'.format(self.snap_name),
{'action': 'refresh'})
{'action': 'refresh', 'ignore-running': True})
context.description = "change id: {}".format(change)
return change

Expand Down
64 changes: 64 additions & 0 deletions subiquitycore/tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Copyright 2022 Canonical, Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

# from unittest.mock import Mock

from subiquitycore.tests import SubiTestCase
from subiquitycore.utils import orig_environ


class TestOrigEnviron(SubiTestCase):
def test_empty(self):
env = {}
expected = env
self.assertEqual(expected, orig_environ(env))

def test_orig_path(self):
env = {'PATH': 'a', 'PATH_ORIG': 'b'}
expected = {'PATH': 'b'}
self.assertEqual(expected, orig_environ(env))

def test_not_this_key(self):
env = {'PATH': 'a', 'PATH_ORIG_AAAAA': 'b'}
expected = env
self.assertEqual(expected, orig_environ(env))

def test_remove_empty_key(self):
env = {'STUFF': 'a', 'STUFF_ORIG': ''}
expected = {}
self.assertEqual(expected, orig_environ(env))

def test_practical(self):
snap = '/snap/subiquity/1234'
env = {
'TERM': 'linux',
'PYTHONIOENCODING_ORIG': '',
'PYTHONIOENCODING': 'utf-8',
'SUBIQUITY_ROOT_ORIG': '',
'SUBIQUITY_ROOT': snap,
'PYTHON_ORIG': '',
'PYTHON': f'{snap}/usr/bin/python3.8',
'PYTHONPATH_ORIG': '',
'PYTHONPATH': f'{snap}/stuff/things',
'PY3OR2_PYTHON_ORIG': '',
'PY3OR2_PYTHON': f'{snap}/usr/bin/python3.8',
'PATH_ORIG': '/usr/bin:/bin',
'PATH': '/usr/bin:/bin:/snap/bin'
}
expected = {
'TERM': 'linux',
'PATH': '/usr/bin:/bin',
}
self.assertEqual(expected, orig_environ(env))
15 changes: 15 additions & 0 deletions subiquitycore/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,21 @@ def _clean_env(env):
return env


def orig_environ(env):
if env is None:
env = os.environ
ret = env.copy()
for key, val in env.items():
if key.endswith('_ORIG'):
key_to_restore = key[:-len('_ORIG')]
if val:
ret[key_to_restore] = val
else:
del ret[key_to_restore]
del ret[key]
return ret


def run_command(cmd: List[str], *, input=None, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, encoding='utf-8', errors='replace',
env=None, **kw) -> subprocess.CompletedProcess:
Expand Down

0 comments on commit 5d7fd35

Please sign in to comment.