pamac-classic/pamac-daemon

417 lines
12 KiB
Plaintext
Raw Normal View History

2013-02-27 11:15:51 -03:00
#! /usr/bin/python
# -*-coding:utf-8-*-
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GObject
import pyalpm
2013-03-05 06:52:27 -03:00
#import traceback
2013-03-15 13:15:34 -03:00
from multiprocessing import Process
2013-02-27 11:15:51 -03:00
from pamac import config, common
class PamacDBusService(dbus.service.Object):
def __init__(self):
bus=dbus.SystemBus()
bus_name = dbus.service.BusName('org.manjaro.pamac', bus)
dbus.service.Object.__init__(self, bus_name, '/org/manjaro/pamac')
self.t = None
2013-03-15 13:15:34 -03:00
self.task = None
2013-02-27 11:15:51 -03:00
self.error = ''
self.warning = ''
self.previous_action = ''
2013-02-27 11:15:51 -03:00
self.action = 'Preparing...'
self.previous_icon = ''
2013-02-27 11:15:51 -03:00
self.icon = '/usr/share/pamac/icons/24x24/status/setup.png'
self.previous_target = ''
2013-02-27 11:15:51 -03:00
self.target = ''
self.previous_percent = 0
2013-02-27 11:15:51 -03:00
self.percent = 0
self.total_size = 0
self.already_transferred = 0
2013-03-18 11:29:20 -03:00
self.handle = config.handle()
def get_handle(self):
print('daemon get handle')
self.handle = config.handle()
self.handle.dlcb = self.cb_dl
self.handle.totaldlcb = self.totaldlcb
self.handle.eventcb = self.cb_event
self.handle.questioncb = self.cb_conv
self.handle.progresscb = self.cb_progress
self.handle.logcb = self.cb_log
2013-02-27 11:15:51 -03:00
@dbus.service.signal('org.manjaro.pamac')
def EmitAction(self, action):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitIcon(self, icon):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitTarget(self, target):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitPercent(self, percent):
pass
def cb_event(self, ID, event, tupel):
if ID is 1:
self.action = 'Checking dependencies...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
elif ID is 3:
self.action = 'Checking file conflicts...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
elif ID is 5:
self.action = 'Resolving dependencies...'
self.icon = '/usr/share/pamac/icons/24x24/status/setup.png'
elif ID is 7:
self.action = 'Checking inter conflicts...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
elif ID is 9:
self.action = 'Installing...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
elif ID is 10:
formatted_event = 'Installed {} ({})'.format(tupel[0].name, tupel[0].version)
common.write_log_file(formatted_event)
print(formatted_event)
elif ID is 11:
self.action = 'Removing...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-delete.png'
elif ID is 12:
formatted_event = 'Removed {} ({})'.format(tupel[0].name, tupel[0].version)
common.write_log_file(formatted_event)
print(formatted_event)
elif ID is 13:
self.action = 'Upgrading...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-update.png'
elif ID is 14:
formatted_event = 'Upgraded {} ({} -> {})'.format(tupel[1].name, tupel[1].version, tupel[0].version)
common.write_log_file(formatted_event)
print(formatted_event)
elif ID is 15:
self.action = 'Checking integrity...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
self.already_transferred = 0
elif ID is 17:
self.action = 'Loading packages files...'
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
print('Loading packages files')
elif ID is 26:
self.action = 'Configuring...'
self.icon = '/usr/share/pamac/icons/24x24/status/setup.png'
2013-03-02 11:27:52 -03:00
self.EmitPercent(str(2))
2013-02-27 11:15:51 -03:00
print('Configuring a package')
elif ID is 27:
print('Downloading a file')
else :
self.action = ''
2013-03-02 11:27:52 -03:00
#self.EmitTarget('')
#self.EmitPercent(0)
if self.action != self.previous_action:
self.previous_action = self.action
self.EmitAction(self.action)
if self.icon != self.previous_icon:
self.previous_icon = self.icon
self.EmitIcon(self.icon)
2013-02-27 11:15:51 -03:00
print(ID,event)
def cb_conv(self, *args):
print("conversation", args)
def cb_log(self, level, line):
_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
if not (level & _logmask):
return
if level & pyalpm.LOG_ERROR:
self.error += "ERROR: "+line
print(self.error)
2013-03-15 13:15:34 -03:00
#self.t.release()
2013-02-27 11:15:51 -03:00
elif level & pyalpm.LOG_WARNING:
self.warning += "WARNING: "+line
elif level & pyalpm.LOG_DEBUG:
line = "DEBUG: " + line
print(line)
elif level & pyalpm.LOG_FUNCTION:
line = "FUNC: " + line
print(line)
def totaldlcb(self, _total_size):
self.total_size = _total_size
def cb_dl(self, _target, _transferred, total):
if self.total_size > 0:
fraction = (_transferred+self.already_transferred)/self.total_size
size = 0
2013-03-15 13:15:34 -03:00
try:
if (self.t.to_remove or self.t.to_add):
for pkg in self.t.to_remove+self.t.to_add:
if pkg.filename == _target:
2013-03-15 13:15:34 -03:00
size = pkg.size
if _transferred == size:
self.already_transferred += size
self.action = 'Downloading '+common.format_size(self.total_size)
self.target = _target
self.percent = round(fraction, 2)
2013-03-15 13:15:34 -03:00
self.icon = '/usr/share/pamac/icons/24x24/status/package-download.png'
else:
self.action = 'Refreshing...'
self.target = _target
self.percent = 2
self.icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png'
if self.action != self.previous_action:
self.previous_action = self.action
self.EmitAction(self.action)
if self.icon != self.previous_icon:
self.previous_icon = self.icon
self.EmitIcon(self.icon)
if self.target != self.previous_target:
self.previous_target = self.target
self.EmitTarget(self.target)
if self.percent != self.previous_percent:
self.previous_percent = self.percent
self.EmitPercent(self.percent)
2013-03-15 13:15:34 -03:00
except pyalpm.error:
pass
2013-02-27 11:15:51 -03:00
def cb_progress(self, _target, _percent, n, i):
self.target = _target+' ('+str(i)+'/'+str(n)+')'
#self.percent = round(_percent/100, 2)
self.percent = round(i/n, 2)
if self.target != self.previous_target:
self.previous_target = self.target
self.EmitTarget(self.target)
if self.percent != self.previous_percent:
self.previous_percent = self.percent
self.EmitPercent(self.percent)
2013-02-27 11:15:51 -03:00
2013-03-15 13:15:34 -03:00
def policykit_test(self, sender, connexion, action):
2013-02-27 11:15:51 -03:00
bus = dbus.SystemBus()
proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False)
dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus')
sender_pid = dbus_info.GetConnectionUnixProcessID(sender)
proxy_policykit = bus.get_object('org.freedesktop.PolicyKit1','/org/freedesktop/PolicyKit1/Authority',False)
policykit_authority = dbus.Interface(proxy_policykit,'org.freedesktop.PolicyKit1.Authority')
Subject = ('unix-process', {'pid': dbus.UInt32(sender_pid, variant_level=1),
'start-time': dbus.UInt64(0, variant_level=1)})
(is_authorized,is_challenge,details) = policykit_authority.CheckAuthorization(Subject, action, {'': ''}, dbus.UInt32(1), '')
return is_authorized
@dbus.service.signal('org.manjaro.pamac')
def EmitAvailableUpdates(self, updates_nb):
pass
def CheckUpdates(self):
2013-03-18 07:07:58 -03:00
updates = 0
2013-03-18 11:29:20 -03:00
if config.syncfirst:
for name in config.syncfirst:
pkg = self.handle.get_localdb().get_pkg(name)
if pkg:
candidate = pyalpm.sync_newversion(pkg, self.handle.get_syncdbs())
if candidate:
updates += 1
if not updates:
for pkg in self.handle.get_localdb().pkgcache:
candidate = pyalpm.sync_newversion(pkg, self.handle.get_syncdbs())
if candidate:
updates += 1
2013-02-27 11:15:51 -03:00
self.EmitAvailableUpdates(updates)
2013-03-15 13:15:34 -03:00
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
def Refresh(self, success, nosuccess):
def refresh():
self.target = ''
self.percent = 0
self.error = ''
2013-03-18 11:29:20 -03:00
for db in self.handle.get_syncdbs():
2013-03-15 13:15:34 -03:00
try:
2013-03-18 11:29:20 -03:00
self.t = self.handle.init_transaction()
2013-03-15 13:15:34 -03:00
db.update(force=False)
except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n'
#break
finally:
2013-03-18 11:29:20 -03:00
try:
self.t.release()
except:
pass
2013-03-15 13:15:34 -03:00
if self.error:
self.EmitTransactionError(self.error)
2013-03-18 07:07:58 -03:00
else:
self.EmitTransactionDone('')
2013-03-18 11:29:20 -03:00
self.CheckUpdates()
2013-03-15 13:15:34 -03:00
self.task = Process(target=refresh)
self.task.start()
success('')
2013-02-27 11:15:51 -03:00
@dbus.service.method('org.manjaro.pamac', 'a{sb}', 's', sender_keyword='sender', connection_keyword='connexion')
def Init(self, options, sender=None, connexion=None):
self.error = ''
if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
try:
2013-03-18 11:29:20 -03:00
self.get_handle()
self.t = self.handle.init_transaction(**options)
2013-03-15 13:15:34 -03:00
print('Init:',self.t.flags)
2013-02-27 11:15:51 -03:00
except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n'
finally:
return self.error
else :
return 'You are not authorized'
@dbus.service.method('org.manjaro.pamac', '', 's')
def Sysupgrade(self):
self.error = ''
try:
2013-03-15 13:15:34 -03:00
self.t.sysupgrade(downgrade=False)
print('to_upgrade:',self.t.to_add)
2013-02-27 11:15:51 -03:00
except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n'
finally:
return self.error
@dbus.service.method('org.manjaro.pamac', 's', 's')
def Remove(self, pkgname):
self.error = ''
try:
2013-03-18 11:29:20 -03:00
pkg = self.handle.get_localdb().get_pkg(pkgname)
2013-02-27 11:15:51 -03:00
if pkg is not None:
2013-03-15 13:15:34 -03:00
self.t.remove_pkg(pkg)
2013-02-27 11:15:51 -03:00
except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n'
finally:
return self.error
@dbus.service.method('org.manjaro.pamac', 's', 's')
def Add(self, pkgname):
self.error = ''
try:
2013-03-18 11:29:20 -03:00
for repo in self.handle.get_syncdbs():
2013-02-27 11:15:51 -03:00
pkg = repo.get_pkg(pkgname)
if pkg:
2013-03-15 13:15:34 -03:00
self.t.add_pkg(pkg)
2013-02-27 11:15:51 -03:00
break
except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n'
finally:
return self.error
@dbus.service.method('org.manjaro.pamac', '', 's')
def Prepare(self):
self.error = ''
try:
2013-03-15 13:15:34 -03:00
self.t.prepare()
print('to_add:',self.t.to_add)
print('to_remove:',self.t.to_remove)
2013-02-27 11:15:51 -03:00
except pyalpm.error as e:
print(e)
self.error += ' --> '+str(e)+'\n'
finally:
return self.error
@dbus.service.method('org.manjaro.pamac', '', 'as')
def To_Remove(self):
liste = []
2013-03-15 13:15:34 -03:00
for pkg in self.t.to_remove:
2013-02-27 11:15:51 -03:00
liste.append(pkg.name)
2013-03-15 13:15:34 -03:00
return liste
2013-02-27 11:15:51 -03:00
@dbus.service.method('org.manjaro.pamac', '', 'as')
def To_Add(self):
liste = []
2013-03-15 13:15:34 -03:00
for pkg in self.t.to_add:
2013-02-27 11:15:51 -03:00
liste.append(pkg.name)
2013-03-15 13:15:34 -03:00
return liste
2013-02-27 11:15:51 -03:00
2013-03-15 13:15:34 -03:00
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
def Interrupt(self, success, nosuccess):
def interrupt():
self.error = ''
#try:
# self.t.interrupt()
#except pyalpm.error as e:
# self.error += ' --> '+str(e)+'\n'
2013-02-27 11:15:51 -03:00
try:
2013-03-15 13:15:34 -03:00
self.t.release()
#except pyalpm.error as e:
#self.error += ' --> '+str(e)+'\n'
except:
pass
finally:
self.CheckUpdates()
#if self.error:
#self.EmitTransactionError(self.error)
self.task.terminate()
interrupt()
success('')
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion', async_callbacks=('success', 'nosuccess'))
def Commit(self, success, nosuccess, sender=None, connexion=None):
def commit():
self.error = ''
try:
self.t.commit()
2013-02-27 11:15:51 -03:00
except pyalpm.error as e:
#error = traceback.format_exc()
self.error += ' --> '+str(e)+'\n'
#except dbus.exceptions.DBusException:
#pass
finally:
self.CheckUpdates()
2013-03-15 13:15:34 -03:00
if self.error:
self.EmitTransactionError(self.error)
else:
self.EmitTransactionDone('Transaction successfully finished')
try:
authorized = self.policykit_test(sender,connexion,'org.manjaro.pamac.commit')
except dbus.exceptions.DBusException as e:
2013-03-15 13:15:34 -03:00
self.EmitTransactionError('You are not authorized')
success('')
else:
if authorized:
self.task = Process(target=commit)
self.task.start()
else :
self.t.release()
self.EmitTransactionError('You are not authorized')
success('')
2013-03-15 13:15:34 -03:00
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionDone(self, message):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionError(self, message):
pass
2013-02-27 11:15:51 -03:00
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion')
def Release(self, sender=None, connexion=None):
self.error = ''
if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
try:
2013-03-15 13:15:34 -03:00
self.t.release()
2013-02-27 11:15:51 -03:00
except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n'
finally:
return self.error
else :
return 'You are not authorized'
@dbus.service.method('org.manjaro.pamac')
def StopDaemon(self):
try:
2013-03-15 13:15:34 -03:00
self.t.release()
2013-02-27 11:15:51 -03:00
except:
pass
mainloop.quit()
2013-03-15 13:15:34 -03:00
GObject.threads_init()
2013-02-27 11:15:51 -03:00
DBusGMainLoop(set_as_default=True)
myservice = PamacDBusService()
mainloop = GObject.MainLoop()
mainloop.run()