0
0
mirror of https://github.com/libretro/Lakka-LibreELEC.git synced 2025-01-19 11:52:07 +00:00
mglae afa2e54219 docker: fix python addon (rev 132)
- Retry connection on error
- Add periodically kodi termination check via timeout
- Remove unneeded thread
- Do not import oe
2020-12-25 16:16:35 +01:00

297 lines
16 KiB
Python

# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv)
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
import os
import subprocess
import sys
import time
import xbmc
import xbmcaddon
import xbmcgui
__author__ = 'lrusak'
__addon__ = xbmcaddon.Addon()
__path__ = __addon__.getAddonInfo('path')
sys.path.append(__path__ + 'lib')
import dockermon
# docker events for api 1.23 (docker version 1.11.x)
# https://docs.docker.com/engine/reference/api/docker_remote_api_v1.23/#monitor-docker-s-events
docker_events = {
'container': {
'string': 30030,
'event': {
'attach': {
'string': 30031,
'enabled': '',
},
'commit': {
'string': 30032,
'enabled': '',
},
'copy': {
'string': 30033,
'enabled': '',
},
'create': {
'string': 30034,
'enabled': '',
},
'destroy': {
'string': 30035,
'enabled': '',
},
'die': {
'string': 30036,
'enabled': '',
},
'exec_create': {
'string': 30037,
'enabled': '',
},
'exec_start': {
'string': 30038,
'enabled': '',
},
'export': {
'string': 30039,
'enabled': '',
},
'kill': {
'string': 30040,
'enabled': True,
},
'oom': {
'string': 30041,
'enabled': True,
},
'pause': {
'string': 30042,
'enabled': '',
},
'rename': {
'string': 30043,
'enabled': '',
},
'resize': {
'string': 30044,
'enabled': '',
},
'restart': {
'string': 30045,
'enabled': '',
},
'start': {
'string': 30046,
'enabled': True,
},
'stop': {
'string': 30047,
'enabled': True,
},
'top': {
'string': 30048,
'enabled': '',
},
'unpause': {
'string': 30049,
'enabled': '',
},
'update': {
'string': 30050,
'enabled': '',
},
},
},
'image': {
'string': 30060,
'event': {
'delete': {
'string': 30061,
'enabled': '',
},
'import': {
'string': 30062,
'enabled': '',
},
'pull': {
'string': 30063,
'enabled': True,
},
'push': {
'string': 30064,
'enabled': '',
},
'tag': {
'string': 30065,
'enabled': '',
},
'untag': {
'string': 30066,
'enabled': '',
},
},
},
'volume': {
'string': 30070,
'event': {
'create': {
'string': 30071,
'enabled': '',
},
'mount': {
'string': 30072,
'enabled': '',
},
'unmount': {
'string': 30073,
'enabled': '',
},
'destroy': {
'string': 30074,
'enabled': '',
},
},
},
'network': {
'string': 30080,
'event': {
'create': {
'string': 30081,
'enabled': '',
},
'connect': {
'string': 30082,
'enabled': '',
},
'disconnect': {
'string': 30083,
'enabled': '',
},
'destroy': {
'string': 30084,
'enabled': '',
},
},
},
}
def print_notification(json_data):
event_string = docker_events[json_data['Type']]['event'][json_data['Action']]['string']
if __addon__.getSetting('notifications') == '0': # default
if docker_events[json_data['Type']]['event'][json_data['Action']]['enabled']:
try:
message = ' '.join([__addon__.getLocalizedString(30010),
json_data['Actor']['Attributes']['name'],
'|',
__addon__.getLocalizedString(30012),
__addon__.getLocalizedString(event_string)])
except KeyError as e:
message = ' '.join([__addon__.getLocalizedString(30011),
json_data['Type'],
'|',
__addon__.getLocalizedString(30012),
__addon__.getLocalizedString(event_string)])
elif __addon__.getSetting('notifications') == '1': # all
try:
message = ' '.join([__addon__.getLocalizedString(30010),
json_data['Actor']['Attributes']['name'],
'|',
__addon__.getLocalizedString(30012),
__addon__.getLocalizedString(event_string)])
except KeyError as e:
message = ' '.join([__addon__.getLocalizedString(30011),
json_data['Type'],
'|',
__addon__.getLocalizedString(30012),
__addon__.getLocalizedString(event_string)])
elif __addon__.getSetting('notifications') == '2': # none
pass
elif __addon__.getSetting('notifications') == '3': # custom
if __addon__.getSetting(json_data['Action']) == 'true':
try:
message = ' '.join([__addon__.getLocalizedString(30010),
json_data['Actor']['Attributes']['name'],
'|',
__addon__.getLocalizedString(30012),
__addon__.getLocalizedString(event_string)])
except KeyError as e:
message = ' '.join([__addon__.getLocalizedString(30011),
json_data['Type'],
'|',
__addon__.getLocalizedString(30012),
__addon__.getLocalizedString(event_string)])
dialog = xbmcgui.Dialog()
try:
if message != '':
length = int(__addon__.getSetting('notification_length')) * 1000
dialog.notification('Docker', message, __path__ + 'resources/icon.png', length)
xbmc.log('## service.system.docker ## %s' % message)
except NameError as e:
pass
class Main(object):
def __init__(self, *args, **kwargs):
#############################
# Temp cleanup for old method
restart_docker = False
if os.path.islink('/storage/.config/system.d/service.system.docker.socket'):
os.remove('/storage/.config/system.d/service.system.docker.socket')
if os.path.islink('/storage/.config/system.d/docker.socket'):
os.remove('/storage/.config/system.d/docker.socket')
if os.path.islink('/storage/.config/system.d/service.system.docker.service'):
if 'systemd' in os.readlink('/storage/.config/system.d/service.system.docker.service'):
os.remove('/storage/.config/system.d/service.system.docker.service')
restart_docker = True
if os.path.islink('/storage/.config/system.d/docker.service'):
if 'systemd' in os.readlink('/storage/.config/system.d/docker.service'):
os.remove('/storage/.config/system.d/docker.service')
restart_docker = True
if os.path.islink('/storage/.config/system.d/multi-user.target.wants/service.system.docker.service'):
if 'systemd' in os.readlink('/storage/.config/system.d/multi-user.target.wants/service.system.docker.service'):
os.remove('/storage/.config/system.d/multi-user.target.wants/service.system.docker.service')
restart_docker = True
if restart_docker:
subprocess.run(['systemctl','enable','/storage/.kodi/addons/service.system.docker/system.d/service.system.docker.service'], close_fds=True)
subprocess.run(['systemctl','restart','service.system.docker.service'], close_fds=True)
# end temp cleanup
#############################
monitor = DockerMonitor(self)
while not monitor.abortRequested():
try:
dockermon.watch(print_notification, run=lambda: not monitor.abortRequested())
except Exception:
monitor.waitForAbort(1)
del monitor
class DockerMonitor(xbmc.Monitor):
def __init__(self, *args, **kwargs):
xbmc.Monitor.__init__(self)
def onSettingsChanged(self):
pass
if ( __name__ == "__main__" ):
Main()
del __addon__