Skip to content

Instantly share code, notes, and snippets.

@olymk2
Created January 5, 2016 08:51
Show Gist options
  • Save olymk2/80b3c8689e65371fa2d8 to your computer and use it in GitHub Desktop.
Save olymk2/80b3c8689e65371fa2d8 to your computer and use it in GitHub Desktop.
import os
import Queue
import argparse
import webbrowser
import socket, fcntl, struct
import time, threading
from subprocess import Popen, PIPE
from docker import Client
docker_client = Client(base_url='unix://var/run/docker.sock')
import signal
import json
from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Notify as notify
APPINDICATOR_ID = 'Docker Containers'
def main():
indicator = appindicator.Indicator.new(APPINDICATOR_ID, 'sample_icon.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(build_menu())
notify.init(APPINDICATOR_ID)
gtk.main()
def build_menu():
menu = gtk.Menu()
for container in docker_client.containers():
container_info = docker_client.inspect_container(container['Id'])
#~ if filter not in container_info['Name']:
menu_container = gtk.MenuItem(container_info['Name'])
#menu_container.connect('activate', fetch_container_info, container)
menu.append(menu_container)
submenu = gtk.Menu()
for port in container['Ports']:
if 'PublicPort' in port:
menu_port = gtk.MenuItem('127.0.0.1:%s' % port['PublicPort'])
menu_port.connect('activate', fetch_container_info, container, port['PublicPort'])
submenu.append(menu_port)
menu_port = gtk.MenuItem('Show Logs')
menu_port.connect('activate', fetch_container_logs, container)
submenu.append(menu_port)
menu_container.set_submenu(submenu)
item_quit = gtk.MenuItem('Quit')
item_quit.connect('activate', quit)
menu.append(item_quit)
menu.show_all()
return menu
def fetch_container_logs(menu_item, container):
with open('/tmp/docker_container.log', 'w') as fp:
fp.write(docker_client.logs(container))
webbrowser.open('file:///tmp/docker_container.log')
def fetch_container_info(menu_item, container, port):
notify.Notification.new(container['Image'], container['Image'], None).show()
webbrowser.open('http://127.0.0.1:%s' % container['Ports'][0]['PublicPort'])
return None
def quit(_):
notify.uninit()
gtk.main_quit()
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal.SIG_DFL)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment