From 2d51d10d3d9d9323cce9134f309b78bf6f64fcc4 Mon Sep 17 00:00:00 2001 From: Elvis Pranskevichus Date: Thu, 27 Feb 2025 17:59:01 -0800 Subject: [PATCH] Fix unrenamed bits in system units shipped in native packages (#144) This is a bit of a SNAFU, because the service units are broken on fresh systems, and on systems where EdgeDB 5.x and earlier was installed they would work, but will initialize the data in the wrong spot (`/var/lib/edgedb`) and owned by the wrong user (`edgedb`). This fixes the units and adds a check that errors out if the wrong data directory is detected, so people who have successfully installed Gel 6.0/6.1 would be informed to move and `chown` the data directory when upgrading to 6.2 and later. --- edgedbpkg/edgedb/IDENTIFIER-SLOT.plist.in | 8 ++++---- edgedbpkg/edgedb/IDENTIFIER-SLOT.service.in | 11 ++++++----- edgedbpkg/edgedb/__init__.py | 20 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/edgedbpkg/edgedb/IDENTIFIER-SLOT.plist.in b/edgedbpkg/edgedb/IDENTIFIER-SLOT.plist.in index 750df004..8dc59187 100644 --- a/edgedbpkg/edgedb/IDENTIFIER-SLOT.plist.in +++ b/edgedbpkg/edgedb/IDENTIFIER-SLOT.plist.in @@ -11,9 +11,9 @@ ProgramArguments - @@{bindir}/edgedb-server - --data-dir=@@{localstatedir}/lib/edgedb/@@{slot}/data/ - --runstate-dir=@@{runstatedir}/edgedb/ + @@{bindir}/@@{name} + --data-dir=@@{localstatedir}/lib/@@{name_for_user_and_dir}/@@{slot}/data/ + --runstate-dir=@@{runstatedir}/@@{name_for_user_and_dir}/ --tls-cert-mode=generate_self_signed @@ -21,7 +21,7 @@ UserName - edgedb + @@{name_for_user_and_dir} KeepAlive diff --git a/edgedbpkg/edgedb/IDENTIFIER-SLOT.service.in b/edgedbpkg/edgedb/IDENTIFIER-SLOT.service.in index 1d82132e..ba18a82f 100644 --- a/edgedbpkg/edgedb/IDENTIFIER-SLOT.service.in +++ b/edgedbpkg/edgedb/IDENTIFIER-SLOT.service.in @@ -7,13 +7,14 @@ After=network.target [Service] Type=notify -User=edgedb -Group=edgedb +User=@@{name_for_user_and_dir} +Group=@@{name_for_user_and_dir} -Environment=EDGEDATA=@@{localstatedir}/lib/edgedb/@@{slot}/data/ -RuntimeDirectory=edgedb +Environment=GELDATA=@@{localstatedir}/lib/@@{name_for_user_and_dir}/@@{slot}/data/ +RuntimeDirectory=@@{name_for_user_and_dir} -ExecStart=@@{bindir}/edgedb-server --data-dir=${EDGEDATA} --runstate-dir=%t/edgedb --tls-cert-mode=generate_self_signed +ExecStartPre=@@{pre_start_script} +ExecStart=@@{bindir}/@@{name} --data-dir=${GELDATA} --runstate-dir=%t/@@{name_for_user_and_dir} --tls-cert-mode=generate_self_signed ExecReload=/bin/kill -HUP ${MAINPID} KillMode=mixed KillSignal=SIGINT diff --git a/edgedbpkg/edgedb/__init__.py b/edgedbpkg/edgedb/__init__.py index 2516963e..f7da974d 100644 --- a/edgedbpkg/edgedb/__init__.py +++ b/edgedbpkg/edgedb/__init__.py @@ -308,6 +308,10 @@ def marketing_name(self) -> str: def marketing_slug(self) -> str: return "gel" + @property + def name_for_user_and_dir(self) -> str: + return self.marketing_slug + def version_includes_revision(self) -> bool: return ".s" in self.pretty_version @@ -575,6 +579,22 @@ def get_stdlib_install_script(self, build: targets.Build) -> str: ) return script + def get_pre_start_script(self, build: targets.Build) -> str: + if self.marketing_slug == "gel" and self.slot == "6": + # In pre-6.2 packages we shipped broken service units files + # that contained non-renamed user and data directory. + msg = ( + "Obsolete directory structure detected. " + 'Please move "/var/lib/edgedb/6/data" to "/var/lib/gel/6/data"' + ' and run `chown -R gel:gel "/var/lib/gel/6/data"`' + ) + return ( + "/bin/sh -c 'if [ -d /var/lib/edgedb/6/data ]; then " + + f"echo \\'{msg}\\' >&2; exit 1; fi'" + ) + else: + return "" + def get_private_libraries(self, build: targets.Build) -> list[str]: # Automatic dependency introspection points to libpq.so, # since some Postgres' client binaries require it. We _do_