def _wrap_app(self, name, app): cmds = (k for k in ("command", "stop-command") if k in app) for k in cmds: try: app[k] = self._wrap_exe(app[k], "{}-{}".format(k, name)) except FileNotFoundError: raise errors.InvalidAppCommandError(command=app[k], app=app) except meta_errors.CommandError as e: raise errors.InvalidAppCommandError(str(e), name)
def _wrap_app(self, name, app): cmds = (k for k in ("command", "stop-command") if k in app) for k in cmds: try: new_command = self._wrap_exe(app[k], "{}-{}".format(k, name)) except FileNotFoundError: raise errors.InvalidAppCommandError(command=app[k], app_name=app) except meta_errors.CommandError as e: raise errors.InvalidAppCommandError(str(e), name) if os.path.isfile(self._meta_runner): snap_runner = os.path.relpath(self._meta_runner, self._prime_dir) new_command = "{} $SNAP/{}".format(snap_runner, new_command) app[k] = new_command
def _wrap_app(self, name, app): cmds = (k for k in ('command', 'stop-command') if k in app) for k in cmds: try: app[k] = self._wrap_exe(app[k], '{}-{}'.format(k, name)) except meta_errors.CommandError as e: raise errors.InvalidAppCommandError(str(e), name)
def _add_command_chain_to_app(self, app_name, app): # First, validate the commands. Without a wrapper, we're bound by snapd's # restrictions. No quotes, and the first string must be a relative path from # the root of the snap. commands = (app[k] for k in ("command", "stop-command") if k in app) for command in commands: if not _APP_COMMAND_PATTERN.match(command): raise errors.InvalidAppCommandFormatError(command, app_name) command_without_args = command.split()[0] binary_path = os.path.join(self._prime_dir, command_without_args) is_executable = False with contextlib.suppress(FileNotFoundError): mode = os.stat(binary_path).st_mode is_executable = ( mode & stat.S_IXUSR or mode & stat.S_IXGRP or mode & stat.S_IXOTH ) if not is_executable: raise errors.InvalidAppCommandError(command_without_args, app_name) # Finally, assuming there is a meta runner, add it to the BEGINNING of the # command chain. This is to ensure all subsequent commands in the chain get # a valid environment. if os.path.isfile(self._meta_runner): app["command-chain"] = [ os.path.relpath(self._meta_runner, self._prime_dir) ] + app.get("command-chain", [])
def _wrap_app(self, name, app): cmds = (k for k in ('command', 'stop-command') if k in app) for k in cmds: try: app[k] = self._wrap_exe(app[k], '{}-{}'.format(k, name)) except CommandError as e: raise errors.InvalidAppCommandError(str(e), name) desktop_file_name = app.pop('desktop', '') if desktop_file_name: desktop_file = _DesktopFile( name=name, filename=desktop_file_name, snap_name=self._config_data['name'], prime_dir=self._prime_dir) desktop_file.parse_and_reformat() desktop_file.write(gui_dir=os.path.join(self.meta_dir, 'gui'))