From 8b36dc0e29e24ef7867412e9c14f8459fdd7590f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B8=D1=80=D0=B5=D1=86=D0=BA=D0=B8=D0=B9=20=D0=9C?= =?UTF-8?q?=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Thu, 14 Dec 2017 15:53:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20dbus=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=20=D0=B0=20=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20?= =?UTF-8?q?--dbus=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/cl-dbus-core.py | 73 +++++++++++++++++++++++++++++++++ data/org.calculate.Core.conf | 21 ++++++++++ data/org.calculate.Core.service | 4 ++ setup.py | 48 ++++++++++++++++++---- 4 files changed, 137 insertions(+), 9 deletions(-) create mode 100755 data/cl-dbus-core.py create mode 100644 data/org.calculate.Core.conf create mode 100644 data/org.calculate.Core.service diff --git a/data/cl-dbus-core.py b/data/cl-dbus-core.py new file mode 100755 index 0000000..656f2da --- /dev/null +++ b/data/cl-dbus-core.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python2 + +# Copyright 2017 Mir Calculate. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from gi.repository import GLib + +import dbus +import dbus.service +import dbus.mainloop.glib +from calculate.lib.utils.ip import check_port +from calculate.lib.utils.files import writeFile +import os +import time + +DBUS_INTERFACE="org.calculate.CoreInterface" +DBUS_NAME="org.calculate.Core" +DBUS_OBJECT="/Core" + + + +class CoreObject(dbus.service.Object): + + @dbus.service.method(DBUS_INTERFACE, + in_signature='i', out_signature='b') + def Start(self, port): + try: + if not self.check_core(port): + os.system("source /etc/profile;/sbin/start-stop-daemon --background --start " + "--pidfile /var/run/cl_core.pid " + "--exec /usr/sbin/cl-core -- " + "--pid-file /var/run/cl_core.pid --close-on-inactive --start") + for x in xrange(0, 24): + if self.check_core(port): + return True + time.sleep(0.5) + else: + return False + return True + finally: + self.mainloop.quit() + + @dbus.service.method(DBUS_INTERFACE, + in_signature='i', out_signature='b') + def Ping(self, port): + try: + return self.check_core(port) + finally: + self.mainloop.quit() + + def check_core(self, port): + return check_port("127.0.0.1", port) + + +if __name__ == '__main__': + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + + system_bus = dbus.SystemBus() + name = dbus.service.BusName(DBUS_NAME, system_bus) + obj = CoreObject(system_bus, DBUS_OBJECT) + obj.mainloop = GLib.MainLoop() + obj.mainloop.run() diff --git a/data/org.calculate.Core.conf b/data/org.calculate.Core.conf new file mode 100644 index 0000000..3a366ef --- /dev/null +++ b/data/org.calculate.Core.conf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/data/org.calculate.Core.service b/data/org.calculate.Core.service new file mode 100644 index 0000000..5325c3d --- /dev/null +++ b/data/org.calculate.Core.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.calculate.Core +Exec=/usr/bin/python2 /usr/libexec/calculate/cl-dbus-core.py +User=root diff --git a/setup.py b/setup.py index b8d22c0..532ac25 100755 --- a/setup.py +++ b/setup.py @@ -23,11 +23,29 @@ from glob import glob import distutils from distutils.core import setup from distutils.command import install_data as module_install_data +from distutils.command import install as module_install from distutils.util import change_root, convert_path -class install_data(module_install_data.install_data): - def run (self): - self.mkpath(self.install_dir) + +class install(module_install.install): + user_options = module_install.install.user_options + [ + ("dbus", None, "install dbus service") + ] + def initialize_options(self): + module_install.install.initialize_options(self) + self.dbus = False + self.data_files = self.distribution.data_files + self.outfiles = [] + self.uses = [] + + def finalize_options(self): + module_install.install.finalize_options(self) + if self.dbus: + self.uses.append("dbus") + self.sub_commands = [x for x in self.sub_commands if x[0] != 'install_data'] + + def install_data_run(self): + self.mkpath(self.install_data) for f in self.data_files: if isinstance(f, str): # it's a simple file, so copy it @@ -35,14 +53,18 @@ class install_data(module_install_data.install_data): if self.warn_dir: self.warn("setup script did not provide a directory for " "'%s' -- installing right in '%s'" % - (f, self.install_dir)) - (out, _) = self.copy_file(f, self.install_dir) + (f, self.install_data)) + (out, _) = self.copy_file(f, self.install_data) self.outfiles.append(out) else: # it's a tuple with path to install to and a list of files + if len(f) > 2: + if f[2] not in self.uses: + continue + dir = convert_path(f[0]) if not os.path.isabs(dir): - dir = os.path.join(self.install_dir, dir) + dir = os.path.join(self.install_data, dir) elif self.root: dir = change_root(self.root, dir) self.mkpath(dir) @@ -66,7 +88,12 @@ class install_data(module_install_data.install_data): os.chmod(out,chmod) self.outfiles.append(out) -__version__ = "3.2.2" + def run (self): + module_install.install.run(self) + self.install_data_run() + + +__version__ = "3.5.7" __app__ = "calculate-core" @@ -92,9 +119,12 @@ setup( ('/usr/libexec/calculate', [('data/cl-core-wrapper', 0755)]), ('/usr/libexec/calculate', [('data/cl-pkg-cache', 0755)]), ('/usr/libexec/calculate', [('data/cl-check-admin', 0755)]), - ('/usr/libexec/calculate', [('data/cl-variable', 0755)]) + ('/usr/libexec/calculate', [('data/cl-variable', 0755)]), + ('/usr/libexec/calculate', [('data/cl-dbus-core.py', 0755)], "dbus"), + ('/usr/share/dbus-1/system.d', [('data/org.calculate.Core.conf', 0644)], "dbus"), + ('/usr/share/dbus-1/system-services', [('data/org.calculate.Core.service', 0644)], "dbus"), ), package_dir = {'calculate.core': "pym/core"}, packages = packages, - cmdclass={'install_data': install_data} + cmdclass={'install': install } )