diff --git a/rigo/daemon/__init__.py b/rigo/RigoDaemon/__init__.py
similarity index 100%
rename from rigo/daemon/__init__.py
rename to rigo/RigoDaemon/__init__.py
diff --git a/rigo/daemon/app.py b/rigo/RigoDaemon/app.py
similarity index 89%
rename from rigo/daemon/app.py
rename to rigo/RigoDaemon/app.py
index 1c2c8f255..d560c714e 100755
--- a/rigo/daemon/app.py
+++ b/rigo/RigoDaemon/app.py
@@ -26,7 +26,7 @@ import dbus.mainloop.glib
from gi.repository import GLib, GObject
-DAEMON_LOGGING = True
+DAEMON_LOGGING = False
DAEMON_DEBUG = False
# If place here, we won't trigger etpUi['debug']
if "--debug" in sys.argv:
@@ -39,11 +39,9 @@ if "--daemon-logging" in sys.argv:
# Entropy imports
sys.path.insert(0, '/usr/lib/rigo')
sys.path.insert(0, '/usr/lib/entropy/lib')
-sys.path.insert(0, '/usr/lib/entropy/server')
-sys.path.insert(0, '/usr/lib/entropy/client')
sys.path.insert(0, '../../lib')
-sys.path.insert(0, '../../server')
-sys.path.insert(0, '../../client')
+sys.path.insert(0, '../lib')
+sys.path.insert(0, './')
from entropy.cache import EntropyCacher
# update default writeback timeout
@@ -66,7 +64,6 @@ TEXT = TextInterface()
DAEMON_LOGFILE = os.path.join(etpConst['syslogdir'], "rigo-daemon.log")
DAEMON_LOG = LogFile(SystemSettings()['system']['log_level']+1,
DAEMON_LOGFILE, header = "[rigo-daemon]")
-PREVIOUS_PROGRESS = ''
if DAEMON_LOGGING:
# redirect possible exception tracebacks to log file
@@ -75,15 +72,11 @@ if DAEMON_LOGGING:
def write_output(*args, **kwargs):
message = time.strftime('[%H:%M:%S %d/%m/%Y %Z]') + " " + args[0]
- global PREVIOUS_PROGRESS
- if PREVIOUS_PROGRESS == message:
- return
- PREVIOUS_PROGRESS = message
if DAEMON_LOGGING:
DAEMON_LOG.write(message)
DAEMON_LOG.flush()
if DAEMON_DEBUG:
- TEXT.output(*args, **kwargs)
+ TEXT.output(message, *args[1:], **kwargs)
def install_exception_handler():
sys.excepthook = handle_exception
@@ -234,6 +227,7 @@ class RigoDaemonService(dbus.service.Object):
self._ping_sched.set_delay_before(True)
self._ping_sched.daemon = True
self._ping_sched.name = "PingThread"
+ self._ping_sched_startup = Lock()
self._current_activity_mutex = Lock()
self._current_activity = ActivityStates.AVAILABLE
@@ -245,7 +239,6 @@ class RigoDaemonService(dbus.service.Object):
Entropy.set_daemon(self)
self._entropy = Entropy()
write_output("__init__: dbus service loaded")
- self._ping_sched.start()
def stop(self):
"""
@@ -254,6 +247,7 @@ class RigoDaemonService(dbus.service.Object):
if DAEMON_DEBUG:
write_output("stop(): called")
with self._activity_mutex:
+ self._ping_sched.kill()
with self._current_activity_mutex:
self._current_activity = ActivityStates.NOT_AVAILABLE
self._close_local_resources()
@@ -262,7 +256,7 @@ class RigoDaemonService(dbus.service.Object):
entropy.tools.kill_threads()
os.kill(os.getpid(), signal.SIGTERM)
- def _update_repositories(self, repositories, request_id, force):
+ def _update_repositories(self, repositories, force):
"""
Repositories Update execution code.
"""
@@ -270,6 +264,15 @@ class RigoDaemonService(dbus.service.Object):
with self._current_activity_mutex:
self._current_activity = ActivityStates.UPDATING_REPOSITORIES
self._close_local_resources()
+
+ if not repositories:
+ repositories = list(
+ SystemSettings()['repositories']['available'])
+
+ if DAEMON_DEBUG:
+ write_output("_update_repositories(): %s" % (
+ repositories,))
+
result = 99
try:
updater = self._entropy.Repositories(
@@ -278,20 +281,18 @@ class RigoDaemonService(dbus.service.Object):
except AttributeError as err:
write_output("_update_repositories error: %s" % (err,))
self.repositories_updated(
- request_id, 1,
- _("No repositories configured"))
+ 1, _("No repositories configured"))
return
except Exception as err:
write_output("_update_repositories error 2: %s" % (err,))
self.repositories_updated(
- request_id, 2,
- _("Unhandled Exception"))
+ 2, _("Unhandled Exception"))
return
finally:
with self._current_activity_mutex:
self._current_activity = \
ActivityStates.AVAILABLE
- self.repositories_updated(request_id, result, "")
+ self.repositories_updated(result, "")
def _close_local_resources(self):
"""
@@ -307,13 +308,21 @@ class RigoDaemonService(dbus.service.Object):
Note: this is blocking and will issue the
exclusive_acquired() signal when done.
"""
+ acquire = False
with self._acquired_exclusive_mutex:
if not self._acquired_exclusive:
- self._entropy.lock_resources(
- blocking=True,
- shared=False)
# now we got the exclusive lock
self._acquired_exclusive = True
+ acquire = True
+
+ if acquire:
+ if DAEMON_DEBUG:
+ write_output("_acquire_exclusive: about to acquire lock")
+ self._entropy.lock_resources(
+ blocking=True,
+ shared=False)
+ if DAEMON_DEBUG:
+ write_output("_acquire_exclusive: just acquired lock")
self.exclusive_acquired()
@@ -329,19 +338,19 @@ class RigoDaemonService(dbus.service.Object):
### DBUS METHODS
- @dbus.service.method(BUS_NAME, in_signature='asib',
+ @dbus.service.method(BUS_NAME, in_signature='asb',
out_signature='')
- def update_repositories(self, repositories, request_id, force):
+ def update_repositories(self, repositories, force):
"""
Request RigoDaemon to update the given repositories.
At the end of the execution, the "repositories_updated"
signal will be raised.
"""
if DAEMON_DEBUG:
- write_output("update_repositories called: %s, id: %i" % (
- repositories, request_id,))
+ write_output("update_repositories called: %s" % (
+ repositories,))
task = ParallelTask(self._update_repositories, repositories,
- request_id, force)
+ force)
task.daemon = True
task.name = "UpdateRepositoriesThread"
task.start()
@@ -355,6 +364,11 @@ class RigoDaemonService(dbus.service.Object):
"""
if DAEMON_DEBUG:
write_output("connect(): called")
+ acquired = self._ping_sched_startup.acquire(False)
+ if acquired:
+ if DAEMON_DEBUG:
+ write_output("connect(): starting ping() signaling")
+ self._ping_sched.start()
with self._activity_mutex:
initconfig_entropy_constants(etpConst['systemroot'])
self._entropy.Settings().clear()
@@ -467,11 +481,10 @@ class RigoDaemonService(dbus.service.Object):
pass
@dbus.service.signal(dbus_interface=BUS_NAME,
- signature='iis')
- def repositories_updated(self, request_id, result, message):
+ signature='is')
+ def repositories_updated(self, result, message):
"""
- Repositories have been updated. This signal comes from
- the request_id passed to update_repositories().
+ Repositories have been updated.
"result" is an integer carrying execution return status.
"""
if DAEMON_DEBUG:
@@ -511,11 +524,17 @@ class RigoDaemonService(dbus.service.Object):
if __name__ == "__main__":
+ if os.getuid() != 0:
+ write_output("RigoDaemon: must run as root")
+ raise SystemExit(1)
try:
daemon = RigoDaemonService()
except dbus.exceptions.DBusException:
raise SystemExit(1)
GLib.threads_init()
main_loop = GObject.MainLoop()
- main_loop.run()
+ try:
+ main_loop.run()
+ except KeyboardInterrupt:
+ raise SystemExit(1)
raise SystemExit(0)
diff --git a/rigo/daemon/dbus/org.sabayon.Rigo.conf b/rigo/RigoDaemon/dbus/org.sabayon.Rigo.conf
similarity index 100%
rename from rigo/daemon/dbus/org.sabayon.Rigo.conf
rename to rigo/RigoDaemon/dbus/org.sabayon.Rigo.conf
diff --git a/rigo/daemon/dbus/org.sabayon.Rigo.service b/rigo/RigoDaemon/dbus/org.sabayon.Rigo.service
similarity index 100%
rename from rigo/daemon/dbus/org.sabayon.Rigo.service
rename to rigo/RigoDaemon/dbus/org.sabayon.Rigo.service
diff --git a/rigo/daemon/dbus/org.sabayon.Rigo.xml b/rigo/RigoDaemon/dbus/org.sabayon.Rigo.xml
similarity index 92%
rename from rigo/daemon/dbus/org.sabayon.Rigo.xml
rename to rigo/RigoDaemon/dbus/org.sabayon.Rigo.xml
index bdfb165b9..b621e4247 100644
--- a/rigo/daemon/dbus/org.sabayon.Rigo.xml
+++ b/rigo/RigoDaemon/dbus/org.sabayon.Rigo.xml
@@ -10,7 +10,6 @@
-
diff --git a/rigo/RigoDaemon/devel-start-daemon.sh b/rigo/RigoDaemon/devel-start-daemon.sh
new file mode 100755
index 000000000..eba8cae9b
--- /dev/null
+++ b/rigo/RigoDaemon/devel-start-daemon.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if [ "$(whoami)" != "root" ]; then
+ echo "run this as root" >&2
+ exit 1
+fi
+
+cp dbus/org.sabayon.Rigo.conf /etc/dbus-1/system.d/ || exit 1
+chown root:root /etc/dbus-1/system.d/org.sabayon.Rigo.conf || exit 1
+
+cp dbus/org.sabayon.Rigo.xml /usr/share/dbus-1/interfaces/ || exit 1
+chown root:root /usr/share/dbus-1/interfaces/org.sabayon.Rigo.xml || exit 1
+
+cd ../ && ./RigoDaemon/app.py --debug
diff --git a/rigo/daemon/enums.py b/rigo/RigoDaemon/enums.py
similarity index 100%
rename from rigo/daemon/enums.py
rename to rigo/RigoDaemon/enums.py
diff --git a/rigo/daemon/devel-install-daemon.sh b/rigo/daemon/devel-install-daemon.sh
deleted file mode 100755
index 63bbe7c68..000000000
--- a/rigo/daemon/devel-install-daemon.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-if [ "$(whoami)" != "root" ]; then
- echo "run this as root" >&2
- exit 1
-fi
-
-cp dbus/org.sabayon.Rigo.conf /etc/dbus-1/system.d/ || exit 1
-chown root:root /etc/dbus-1/system.d/org.sabayon.Rigo.conf || exit 1
-
-cp dbus/org.sabayon.Rigo.xml /usr/share/dbus-1/interfaces/ || exit 1
-chown root:root /usr/share/dbus-1/interfaces/org.sabayon.Rigo.xml || exit 1
-
-cp dbus/org.sabayon.Rigo.service /usr/share/dbus-1/system-services/ || exit 1
-chown root:root /usr/share/dbus-1/system-services/org.sabayon.Rigo.service || exit 1
-
-sed -i "s:app.py:app.py --daemon-logging --debug:" \
- /usr/share/dbus-1/system-services/org.sabayon.Rigo.service || exit 1
-
-if [ ! -d "/usr/lib/rigo/RigoDaemon" ]; then
- mkdir -p /usr/lib/rigo/RigoDaemon || exit 1
-fi
-cp *.py /usr/lib/rigo/RigoDaemon/ -p || exit 1
-chmod 755 /usr/lib/rigo/RigoDaemon/app.py || exit 1
diff --git a/rigo/rigo_app.py b/rigo/rigo_app.py
index 89b8b263f..168cb6c06 100644
--- a/rigo/rigo_app.py
+++ b/rigo/rigo_app.py
@@ -181,7 +181,7 @@ class RigoServiceController(GObject.Object):
return self.__entropy_bus
- def _repositories_updated_signal(self, request_id, result, message):
+ def _repositories_updated_signal(self, result, message):
"""
Signal coming from RigoDaemon notifying us that repositories have
been updated.
@@ -350,15 +350,20 @@ class RigoServiceController(GObject.Object):
"""
# FIXME, complete, need to be nice and not block, etc
# FIXME, ask for password.
- acquired_sem = Semaphore()
+ acquired_sem = Semaphore(0)
const_debug_write(__name__, "RigoServiceController: "
"_scale_up: enter")
+ def _acquirer():
+ const_debug_write(__name__, "RigoServiceController: "
+ "_scale_up: acquired!")
+ acquired_sem.release()
+
# start the rendezvous
sig_match = self._entropy_bus.connect_to_signal(
self._EXCLUSIVE_ACQUIRED_SIGNAL,
- acquired_sem.release,
+ _acquirer,
dbus_interface=self.DBUS_INTERFACE)
dbus.Interface(
@@ -367,6 +372,8 @@ class RigoServiceController(GObject.Object):
).acquire_exclusive()
self._entropy.unlock_resources()
+ # FIXME: lock down UI here and show a please wait
+ # state, or the user won't understand what's happening
acquired_sem.acquire() # CANBLOCK
sig_match.remove()
@@ -382,7 +389,7 @@ class RigoServiceController(GObject.Object):
Release RigoDaemon Entropy Resources and regain
control here.
"""
- acquired_sem = Semaphore()
+ acquired_sem = Semaphore(0)
# start the rendezvous
const_debug_write(__name__, "RigoServiceController: "
@@ -473,7 +480,7 @@ class RigoServiceController(GObject.Object):
iface = dbus.Interface(
self._entropy_bus,
dbus_interface=self.DBUS_INTERFACE)
- iface.update_repositories(repositories, 1, force)
+ iface.update_repositories(repositories, force)
def update_repositories(self, repositories, force):
"""
@@ -845,8 +852,7 @@ class ApplicationsViewController(GObject.Object):
"""
Spawn Repository Update on RigoDaemon
"""
- self._service.update_repositories(
- self._entropy.repositories(), True)
+ self._service.update_repositories([], True)
def _update_repositories_safe(self):
"""
@@ -1026,7 +1032,7 @@ class NotificationViewController(GObject.Object):
# FIXME, lxnay complete
print("On Upgrade Request Received", args)
# FIXME, this is for testing, REMOVE !!!!
- self._service.update_repositories(self._entropy.repositories(), True)
+ self._service.update_repositories([], True)
def _on_update(self, *args):
"""
@@ -1034,7 +1040,8 @@ class NotificationViewController(GObject.Object):
"""
# FIXME, lxnay complete
print("On Update Request Received", args)
- self._service.update_repositories(self._entropy.repositories(), True)
+
+ self._service.update_repositories([], True)
def _on_update_show(self, *args):
"""