diff --git a/service/lib/agama/dbus/bus.rb b/service/lib/agama/dbus/bus.rb index 0f462905d3..3f350b3745 100644 --- a/service/lib/agama/dbus/bus.rb +++ b/service/lib/agama/dbus/bus.rb @@ -25,7 +25,7 @@ module Agama module DBus # Represents the Agama bus, a distinct one from the system and session buses. - class Bus < ::DBus::Connection + class Bus < ::DBus::BusConnection class << self # Returns the current D-Bus connection # diff --git a/service/lib/agama/dbus/users_service.rb b/service/lib/agama/dbus/language_service.rb similarity index 76% rename from service/lib/agama/dbus/users_service.rb rename to service/lib/agama/dbus/language_service.rb index 33975348ba..c6505d158a 100644 --- a/service/lib/agama/dbus/users_service.rb +++ b/service/lib/agama/dbus/language_service.rb @@ -21,25 +21,25 @@ require "dbus" require "agama/dbus/bus" -require "agama/dbus/users" -require "agama/users" +require "agama/dbus/language" +require "agama/language" module Agama module DBus - # D-Bus service (org.opensuse.Agama.Users1) + # D-Bus service (org.opensuse.Agama.Language1) # # It connects to the system D-Bus and answers requests on objects below - # `/org/opensuse/Agama/Users1`. - class UsersService + # `/org/opensuse/Agama/Language1`. + class LanguageService # Service name # # @return [String] - SERVICE_NAME = "org.opensuse.Agama.Users1" + SERVICE_NAME = "org.opensuse.Agama.Language1" private_constant :SERVICE_NAME - # System D-Bus + # Agama D-Bus # - # @return [::DBus::Connection] + # @return [::DBus::BusConnection] attr_reader :bus # @param _config [Config] Configuration object @@ -75,18 +75,18 @@ def service # @return [Array<::DBus::Object>] def dbus_objects @dbus_objects ||= [ - users_dbus + language_dbus ] end - # @return [Agama::DBus::Users] - def users_dbus - @users_dbus ||= Agama::DBus::Users.new(users_backend(logger), logger) + # @return [Agama::DBus::Language] + def language_dbus + @language_dbus ||= Agama::DBus::Language.new(language_backend(logger), logger) end - # @return [Agama::Users] - def users_backend(logger) - @users_backend ||= Agama::Users.new(logger) + # @return [Agama::Language] + def language_backend(logger) + @language_backend ||= Agama::Language.new(logger).tap(&:probe) end end end diff --git a/service/lib/agama/dbus/manager_service.rb b/service/lib/agama/dbus/manager_service.rb index 0e1d438697..06c5e21cc3 100644 --- a/service/lib/agama/dbus/manager_service.rb +++ b/service/lib/agama/dbus/manager_service.rb @@ -21,9 +21,11 @@ require "dbus" require "agama/manager" +require "agama/users" require "agama/cockpit_manager" require "agama/dbus/bus" require "agama/dbus/manager" +require "agama/dbus/users" require "agama/dbus/storage/proposal" module Agama @@ -33,15 +35,20 @@ module DBus # It connects to the system D-Bus and answers requests on objects below # `/org/opensuse/Agama1`. class ManagerService - # Service name + # List of D-Bus services exposed by this class # - # @return [String] - SERVICE_NAME = "org.opensuse.Agama1" - private_constant :SERVICE_NAME + # This basically allows to define "aliases" - all exposed services holds the same objects + # but under different names + # + # @return [Array] + MANAGER_SERVICE = "org.opensuse.Agama1" + USERS_SERVICE = "org.opensuse.Agama.Users1" + private_constant :MANAGER_SERVICE + private_constant :USERS_SERVICE - # System D-Bus + # Agama D-Bus # - # @return [::DBus::Connection] + # @return [::DBus::BusConnection] attr_reader :bus # Installation manager @@ -49,11 +56,17 @@ class ManagerService # @return [Agama::Manager] attr_reader :manager + # Users manager + # + # @return [Agama::Users] + attr_reader :users + # @param config [Config] Configuration # @param logger [Logger] def initialize(config, logger = nil) @config = config @manager = Agama::Manager.new(config, logger) + @users = Agama::Users.new(logger) @logger = logger || Logger.new($stdout) @bus = Bus.current end @@ -70,10 +83,14 @@ def start # Exports the installer object through the D-Bus service def export + # manager service initialization dbus_objects.each { |o| service.export(o) } paths = dbus_objects.map(&:path).join(", ") logger.info "Exported #{paths} objects" + + # Request our service names only when we're ready to serve the objects + service_aliases.each { |s| bus.request_name(s) } end # Call this from some main loop to dispatch the D-Bus messages @@ -94,21 +111,33 @@ def setup_cockpit cockpit.setup(config.data["web"]) end - # @return [::DBus::Service] + def service_aliases + @service_aliases ||= [ + MANAGER_SERVICE, + USERS_SERVICE + ] + end + + # @return [::DBus::ObjectServer] def service - @service ||= bus.request_service(SERVICE_NAME) + @service ||= bus.object_server end # @return [Array<::DBus::Object>] def dbus_objects @dbus_objects ||= [ - manager_dbus + manager_dbus, + users_dbus ] end def manager_dbus @manager_dbus ||= Agama::DBus::Manager.new(manager, logger) end + + def users_dbus + @users_dbus ||= Agama::DBus::Users.new(users, logger) + end end end end diff --git a/service/lib/agama/dbus/questions_service.rb b/service/lib/agama/dbus/questions_service.rb index bcb4189ba0..b0a09f9437 100644 --- a/service/lib/agama/dbus/questions_service.rb +++ b/service/lib/agama/dbus/questions_service.rb @@ -35,7 +35,7 @@ class QuestionsService # D-Bus connection # - # @return [::DBus::Connection] + # @return [::DBus::BusConnection] attr_reader :bus # Constructor diff --git a/service/lib/agama/dbus/software_service.rb b/service/lib/agama/dbus/software_service.rb index 308724531f..6e64211c56 100644 --- a/service/lib/agama/dbus/software_service.rb +++ b/service/lib/agama/dbus/software_service.rb @@ -36,7 +36,7 @@ class SoftwareService # D-Bus connection # - # @return [::DBus::Connection] + # @return [::DBus::BusConnection] attr_reader :bus # @param config [Config] Configuration object diff --git a/service/package/rubygem-agama.changes b/service/package/rubygem-agama.changes index 301948090d..6a464e6400 100644 --- a/service/package/rubygem-agama.changes +++ b/service/package/rubygem-agama.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Jun 7 08:54:58 UTC 2023 - Michal Filka + +- Merge the users D-Bus service into the main one to save some resources + (gh#openSUSE/agama#596). + ------------------------------------------------------------------- Wed Jun 7 05:33:27 UTC 2023 - Imobach Gonzalez Sosa diff --git a/service/share/org.opensuse.Agama.Users1.service b/service/share/org.opensuse.Agama.Users1.service index 1eec4cad96..0d32b94598 100644 --- a/service/share/org.opensuse.Agama.Users1.service +++ b/service/share/org.opensuse.Agama.Users1.service @@ -1,4 +1,4 @@ [D-BUS Service] Name=org.opensuse.Agama.Users1 -Exec=/usr/bin/agamactl users +Exec=/usr/bin/agamactl manager User=root diff --git a/service/test/agama/dbus/manager_service_test.rb b/service/test/agama/dbus/manager_service_test.rb index 2f2f0f78fb..24bdfed15f 100644 --- a/service/test/agama/dbus/manager_service_test.rb +++ b/service/test/agama/dbus/manager_service_test.rb @@ -29,7 +29,7 @@ let(:config) { Agama::Config.new } let(:logger) { Logger.new($stdout, level: :warn) } let(:manager) { Agama::Manager.new(config, logger) } - let(:bus) { instance_double(Agama::DBus::Bus) } + let(:bus) { instance_double(Agama::DBus::Bus, request_name: nil) } let(:bus_service) do instance_double(::DBus::ObjectServer, export: nil) end @@ -40,7 +40,7 @@ before do allow(Agama::DBus::Bus).to receive(:current).and_return(bus) - allow(bus).to receive(:request_service).and_return(bus_service) + allow(bus).to receive(:object_server).and_return(bus_service) allow(Agama::Manager).to receive(:new).with(config, logger).and_return(manager) allow(Agama::CockpitManager).to receive(:new).and_return(cockpit) allow(manager).to receive(:software).and_return(software_client) diff --git a/setup-service.sh b/setup-service.sh index 0c5562ddbb..629a29e1c2 100755 --- a/setup-service.sh +++ b/setup-service.sh @@ -67,6 +67,11 @@ $SUDO cp -v $MYDIR/service/share/dbus.conf /usr/share/dbus-1/agama.conf ( cd $MYDIR/service/share DBUSDIR=/usr/share/dbus-1/agama-services + + # cleanup previous installation + [[ -d $DBUSDIR ]] && $SUDO rm -r $DBUSDIR + + # create services $SUDO mkdir -p $DBUSDIR for SVC in org.opensuse.Agama*.service; do sudosed "s@\(Exec\)=/usr/bin/@\1=$MYDIR/service/bin/@" $SVC $DBUSDIR/$SVC diff --git a/setup.sh b/setup.sh index a4e2c48f8d..cdf0f51e2a 100755 --- a/setup.sh +++ b/setup.sh @@ -39,6 +39,6 @@ $SUDO ln -snf `pwd`/web/dist /usr/share/cockpit/agama echo echo "D-Bus will start the services, see journalctl for their logs." echo "To start the services manually, logging to the terminal:" -echo " cd service; $SUDO bundle exec bin/agamactl" +echo " $SUDO systemctl start agama.service" echo echo "Visit http://localhost:9090/cockpit/@localhost/agama/index.html"