27 lines
1.4 KiB
Python
27 lines
1.4 KiB
Python
"""Narrow client: the web app never receives Docker's daemon socket."""
|
|
import json
|
|
import os
|
|
import socket
|
|
|
|
MANAGED_LABEL='io.athena-deck.managed=true'
|
|
ROLE_LABEL='io.athena-deck.role=application'
|
|
|
|
class DockerSupport:
|
|
def call(self,action,service=None,values=None):
|
|
path=os.environ.get('DECK_DOCKER_HELPER_SOCKET','/run/athena-deck-docker/control.sock')
|
|
with socket.socket(socket.AF_UNIX) as sock:
|
|
sock.settimeout(1900);sock.connect(path);sock.sendall(json.dumps({'action':action,**({'service':service} if service is not None else {}),**(values or {})}).encode()+b'\n')
|
|
with sock.makefile('rb') as stream:raw=stream.readline(67108865)
|
|
if len(raw)>67108864:raise ValueError('Docker-Helferantwort zu groß.')
|
|
value=json.loads(raw)
|
|
if 'error' in value:raise ValueError(value['error'])
|
|
return value
|
|
def status(self):
|
|
try:return dict(self.call('status'),helper_available=True)
|
|
except (OSError,ValueError):return dict(helper_available=False,installed=None,reachable=False,services=[],install_supported=False,job=None,message='Docker-Systemhelfer nicht verbunden. Der Deck-Installer muss ihn auf dem Debian-Host einrichten.',labels=[MANAGED_LABEL,ROLE_LABEL])
|
|
def install(self):return self.call('install')
|
|
|
|
def container_action(self,action,ident):
|
|
if action not in ('start','stop','delete'):raise ValueError('Ungültige Containeraktion.')
|
|
return self.call('container-'+action,ident)
|