mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-09-07 01:09:55 +00:00
Compare commits
2 Commits
ffc5c14177
...
b1c7dfa3c9
Author | SHA1 | Date | |
---|---|---|---|
b1c7dfa3c9 | |||
97b906c536 |
@ -72,16 +72,17 @@ class Setup(Handler):
|
|||||||
|
|
||||||
application = Application(repository_id, configuration, report=report)
|
application = Application(repository_id, configuration, report=report)
|
||||||
|
|
||||||
Setup.configuration_create_makepkg(args.packager, args.makeflags_jobs, application.repository.paths)
|
with application.repository.paths.preserve_owner():
|
||||||
Setup.executable_create(application.repository.paths, repository_id)
|
Setup.configuration_create_makepkg(args.packager, args.makeflags_jobs, application.repository.paths)
|
||||||
repository_server = f"file://{application.repository.paths.repository}" if args.server is None else args.server
|
Setup.executable_create(application.repository.paths, repository_id)
|
||||||
Setup.configuration_create_devtools(
|
repository_server = f"file://{application.repository.paths.repository}" if args.server is None else args.server
|
||||||
repository_id, args.from_configuration, args.mirror, args.multilib, repository_server)
|
Setup.configuration_create_devtools(
|
||||||
Setup.configuration_create_sudo(application.repository.paths, repository_id)
|
repository_id, args.from_configuration, args.mirror, args.multilib, repository_server)
|
||||||
|
Setup.configuration_create_sudo(application.repository.paths, repository_id)
|
||||||
|
|
||||||
application.repository.repo.init()
|
application.repository.repo.init()
|
||||||
# lazy database sync
|
# lazy database sync
|
||||||
application.repository.pacman.handle # pylint: disable=pointless-statement
|
application.repository.pacman.handle # pylint: disable=pointless-statement
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _set_service_setup_parser(root: SubParserAction) -> argparse.ArgumentParser:
|
def _set_service_setup_parser(root: SubParserAction) -> argparse.ArgumentParser:
|
||||||
@ -280,6 +281,5 @@ class Setup(Handler):
|
|||||||
command = Setup.build_command(paths.root, repository_id)
|
command = Setup.build_command(paths.root, repository_id)
|
||||||
command.unlink(missing_ok=True)
|
command.unlink(missing_ok=True)
|
||||||
command.symlink_to(Setup.ARCHBUILD_COMMAND_PATH)
|
command.symlink_to(Setup.ARCHBUILD_COMMAND_PATH)
|
||||||
paths.chown(command) # we would like to keep owner inside ahriman's home
|
|
||||||
|
|
||||||
arguments = [_set_service_setup_parser]
|
arguments = [_set_service_setup_parser]
|
||||||
|
@ -130,8 +130,8 @@ class Pacman(LazyLogging):
|
|||||||
return # database for some reason deos not exist
|
return # database for some reason deos not exist
|
||||||
|
|
||||||
self.logger.info("copy pacman database %s from operating system root to ahriman's home %s", src, dst)
|
self.logger.info("copy pacman database %s from operating system root to ahriman's home %s", src, dst)
|
||||||
shutil.copy(src, dst)
|
with self.repository_paths.preserve_owner(dst.parent):
|
||||||
self.repository_paths.chown(dst)
|
shutil.copy(src, dst)
|
||||||
|
|
||||||
def database_init(self, handle: Handle, repository: str, architecture: str) -> DB:
|
def database_init(self, handle: Handle, repository: str, architecture: str) -> DB:
|
||||||
"""
|
"""
|
||||||
|
@ -95,8 +95,8 @@ class SQLite(
|
|||||||
sqlite3.register_converter("json", json.loads)
|
sqlite3.register_converter("json", json.loads)
|
||||||
|
|
||||||
if self._configuration.getboolean("settings", "apply_migrations", fallback=True):
|
if self._configuration.getboolean("settings", "apply_migrations", fallback=True):
|
||||||
self.with_connection(lambda connection: Migrations.migrate(connection, self._configuration))
|
with self._repository_paths.preserve_owner():
|
||||||
self._repository_paths.chown(self.path)
|
self.with_connection(lambda connection: Migrations.migrate(connection, self._configuration))
|
||||||
|
|
||||||
def package_clear(self, package_base: str, repository_id: RepositoryId | None = None) -> None:
|
def package_clear(self, package_base: str, repository_id: RepositoryId | None = None) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
import contextlib
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
@ -221,22 +222,14 @@ class RepositoryPaths(LazyLogging):
|
|||||||
stat = path.stat()
|
stat = path.stat()
|
||||||
return stat.st_uid, stat.st_gid
|
return stat.st_uid, stat.st_gid
|
||||||
|
|
||||||
def cache_for(self, package_base: str) -> Path:
|
def _chown(self, path: Path) -> None:
|
||||||
"""
|
|
||||||
get path to cached PKGBUILD and package sources for the package base
|
|
||||||
|
|
||||||
Args:
|
|
||||||
package_base(str): package base name
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Path: full path to directory for specified package base cache
|
|
||||||
"""
|
|
||||||
return self.cache / package_base
|
|
||||||
|
|
||||||
def chown(self, path: Path) -> None:
|
|
||||||
"""
|
"""
|
||||||
set owner of path recursively (from root) to root owner
|
set owner of path recursively (from root) to root owner
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
More likely you don't want to call this method explicitly, consider using :func:`preserve_owner`
|
||||||
|
as context manager
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
path(Path): path to be chown
|
path(Path): path to be chown
|
||||||
|
|
||||||
@ -256,6 +249,45 @@ class RepositoryPaths(LazyLogging):
|
|||||||
set_owner(path)
|
set_owner(path)
|
||||||
path = path.parent
|
path = path.parent
|
||||||
|
|
||||||
|
def cache_for(self, package_base: str) -> Path:
|
||||||
|
"""
|
||||||
|
get path to cached PKGBUILD and package sources for the package base
|
||||||
|
|
||||||
|
Args:
|
||||||
|
package_base(str): package base name
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Path: full path to directory for specified package base cache
|
||||||
|
"""
|
||||||
|
return self.cache / package_base
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def preserve_owner(self, path: Path | None = None) -> Generator[None, None, None]:
|
||||||
|
"""
|
||||||
|
perform any action preserving owner for any newly created file or directory
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path(Path, optional): use this path as root instead of repository root (Default value = None)
|
||||||
|
"""
|
||||||
|
path = path or self.root
|
||||||
|
|
||||||
|
def walk(root: Path) -> Generator[Path, None, None]:
|
||||||
|
for child in root.iterdir():
|
||||||
|
yield child
|
||||||
|
if child in (self.chroot.parent,):
|
||||||
|
yield from child.iterdir()
|
||||||
|
elif child.is_dir():
|
||||||
|
yield from walk(child)
|
||||||
|
|
||||||
|
# get current filesystem and run action
|
||||||
|
previous_snapshot = set(walk(path))
|
||||||
|
yield
|
||||||
|
|
||||||
|
# get newly created files and directories and chown them
|
||||||
|
new_entries = set(walk(path)).difference(previous_snapshot)
|
||||||
|
for entry in new_entries:
|
||||||
|
self._chown(entry)
|
||||||
|
|
||||||
def tree_clear(self, package_base: str) -> None:
|
def tree_clear(self, package_base: str) -> None:
|
||||||
"""
|
"""
|
||||||
clear package specific files
|
clear package specific files
|
||||||
@ -274,12 +306,13 @@ class RepositoryPaths(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
if self.repository_id.is_empty:
|
if self.repository_id.is_empty:
|
||||||
return # do not even try to create tree in case if no repository id set
|
return # do not even try to create tree in case if no repository id set
|
||||||
for directory in (
|
|
||||||
self.cache,
|
with self.preserve_owner():
|
||||||
self.chroot,
|
for directory in (
|
||||||
self.packages,
|
self.cache,
|
||||||
self.pacman,
|
self.chroot,
|
||||||
self.repository,
|
self.packages,
|
||||||
):
|
self.pacman,
|
||||||
directory.mkdir(mode=0o755, parents=True, exist_ok=True)
|
self.repository,
|
||||||
self.chown(directory)
|
):
|
||||||
|
directory.mkdir(mode=0o755, parents=True, exist_ok=True)
|
||||||
|
@ -72,7 +72,7 @@ def _create_socket(configuration: Configuration, application: Application) -> so
|
|||||||
async def remove_socket(_: Application) -> None:
|
async def remove_socket(_: Application) -> None:
|
||||||
unix_socket.unlink(missing_ok=True)
|
unix_socket.unlink(missing_ok=True)
|
||||||
|
|
||||||
application.on_shutdown.append(remove_socket) # type: ignore[arg-type]
|
application.on_shutdown.append(remove_socket)
|
||||||
|
|
||||||
return sock
|
return sock
|
||||||
|
|
||||||
@ -142,8 +142,8 @@ def setup_server(configuration: Configuration, spawner: Spawn, repositories: lis
|
|||||||
InitializeError: if no repositories set
|
InitializeError: if no repositories set
|
||||||
"""
|
"""
|
||||||
application = Application(logger=logging.getLogger(__name__))
|
application = Application(logger=logging.getLogger(__name__))
|
||||||
application.on_shutdown.append(_on_shutdown) # type: ignore[arg-type]
|
application.on_shutdown.append(_on_shutdown)
|
||||||
application.on_startup.append(_on_startup) # type: ignore[arg-type]
|
application.on_startup.append(_on_startup)
|
||||||
|
|
||||||
application.middlewares.append(normalize_path_middleware(append_slash=False, remove_slash=True))
|
application.middlewares.append(normalize_path_middleware(append_slash=False, remove_slash=True))
|
||||||
application.middlewares.append(exception_handler(application.logger))
|
application.middlewares.append(exception_handler(application.logger))
|
||||||
@ -166,11 +166,16 @@ def setup_server(configuration: Configuration, spawner: Spawn, repositories: lis
|
|||||||
# package cache
|
# package cache
|
||||||
if not repositories:
|
if not repositories:
|
||||||
raise InitializeError("No repositories configured, exiting")
|
raise InitializeError("No repositories configured, exiting")
|
||||||
database = SQLite.load(configuration)
|
|
||||||
watchers: dict[RepositoryId, Watcher] = {}
|
watchers: dict[RepositoryId, Watcher] = {}
|
||||||
|
configuration_path, _ = configuration.check_loaded()
|
||||||
for repository_id in repositories:
|
for repository_id in repositories:
|
||||||
application.logger.info("load repository %s", repository_id)
|
application.logger.info("load repository %s", repository_id)
|
||||||
client = Client.load(repository_id, configuration, database, report=False) # explicitly load local client
|
# load settings explicitly for architecture if any
|
||||||
|
repository_configuration = Configuration.from_path(configuration_path, repository_id)
|
||||||
|
# load database instance, because it holds identifier
|
||||||
|
database = SQLite.load(repository_configuration)
|
||||||
|
# explicitly load local client
|
||||||
|
client = Client.load(repository_id, repository_configuration, database, report=False)
|
||||||
watchers[repository_id] = Watcher(client)
|
watchers[repository_id] = Watcher(client)
|
||||||
application[WatcherKey] = watchers
|
application[WatcherKey] = watchers
|
||||||
# workers cache
|
# workers cache
|
||||||
|
Reference in New Issue
Block a user