--- Begin Message ---
Package: apt-proxy
Version: 1.9.36~svn
Severity: wishlist
Tags: patch
Hello,
I am working on adding avahi/zeroconf support to apt-proxy. Current
patches only advertise the service if "avahi" option is set to 1 in
apt-proxy.conf file.
For this to be useful, apt (itself or through apt-zeroconf) should be
able to understand that an apt-proxy instance is running in the
network. This and publishing also which archive are being served are
things that I hope I can go on adding soon.
Cheers,
-- System Information:
Debian Release: 4.0
APT prefers unstable
APT policy: (500, 'unstable'), (101, 'experimental')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-1-686
Locale: lang=es_es.ut...@euro, lc_ctype=es_es.ut...@euro (charmap=UTF-8)
Versions of packages apt-proxy depends on:
ii adduser 3.102 Add and remove users and groups
ii bzip2 1.0.3-6 high-quality block-sorting file co
ii debconf [debconf-2.0] 1.5.11 Debian configuration management sy
ii logrotate 3.7.1-3 Log rotation utility
ii python 2.4.4-2 An interactive high-level object-o
ii python-apt 0.6.20 Python interface to libapt-pkg
ii python-central 0.5.12 register and build utility for Pyt
ii python-twisted-web 0.6.0-1 An HTTP protocol implementation to
apt-proxy recommends no packages.
-- debconf information excluded
>From 09f68dff0f6f8ab417a4b8316be936e926a4e679 Mon Sep 17 00:00:00 2001
From: Jose Carlos Garcia Sogo <[email protected]>
Date: Tue, 13 Feb 2007 00:15:09 +0100
Subject: [PATCH] Initial work for supporting avahi publising service in apt-proxy.
---
apt_proxy/apt_proxy.py | 8 +++
apt_proxy/avahisrv.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 121 insertions(+), 0 deletions(-)
diff --git a/apt_proxy/apt_proxy.py b/apt_proxy/apt_proxy.py
index 5b454af..ed4c913 100644
--- a/apt_proxy/apt_proxy.py
+++ b/apt_proxy/apt_proxy.py
@@ -28,6 +28,9 @@ from misc import log, MirrorRecycler
import twisted_compat
from clients import HttpRequestClient
+from avahisrv import AvahiService
+import socket
+
#from posixfile import SEEK_SET, SEEK_CUR, SEEK_END
#since posixfile is considered obsolete I'll define the SEEK_* constants
#myself.
@@ -280,6 +283,7 @@ class Factory(protocol.ServerFactory):
self.periodicCallback = None
self.databases = databaseManager(self)
self.recycler = None
+ self.avahisrv = None
def __del__(self):
pass
@@ -319,6 +323,8 @@ class Factory(protocol.ServerFactory):
self.dumpdbs()
self.recycler = MirrorRecycler(self, 1)
#self.recycler.start()
+ self.avahisrv = AvahiService('apt-proxy@'+socket.gethostname(), '_apt-proxy._tcp', '', '', 9999, ['apt-proxy service'])
+ self.avahisrv.run()
def configurationChanged(self, oldconfig = None):
"""
@@ -508,6 +514,8 @@ class Factory(protocol.ServerFactory):
self.recycler = None
self.stopPeriodic()
#self.closeDatabases()
+ self.avahiservice.stop()
+
def dumpdbs (self):
def dump_update(key, value):
diff --git a/apt_proxy/avahisrv.py b/apt_proxy/avahisrv.py
new file mode 100644
index 0000000..074aab5
--- /dev/null
+++ b/apt_proxy/avahisrv.py
@@ -0,0 +1,113 @@
+# This file is part of apt-proxy.
+# It is heavily based on similar file from apt-zeroconf.
+#
+# Copytight (C) 2006 - Jose Carlos Garcia Sogo <[email protected]>
+#
+# Copyright (C) 2006 - Florian Ludwig <[email protected]>
+# Franz Pletz <[email protected]>
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with apt-zeroconf; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import avahi
+import dbus, dbus.glib
+import gobject
+
+import threading
+from misc import log
+
+
+class AvahiService(threading.Thread):
+ """
+ This class takes care of publishing services in Avahi.
+ When instantiating you have to pass a service name, a type,
+ current domain and host, port used to contact the service and
+ a descriptive txt.
+
+ It will run in its own thread looping for different Avahi services.
+
+ """
+ def __init__(self, name, stype, domain, host, port, txt):
+ threading.Thread.__init__(self)
+ self.group = None
+ self.n_rename = 0
+
+ self.stype = stype
+ self.name = name
+ self.domain = domain
+ self.host = host
+ self.port = port
+ self.txt = txt
+
+
+ def _server_state_changed(self, state):
+ if state == avahi.SERVER_COLLISION:
+ log.warning('Server name collision')
+ self._remove_servivce()
+ elif state == avahi.SERVER_RUNNING:
+ self._add_service()
+
+ def _remove_service(self):
+ if not self.group is None:
+ self.group.Reset()
+
+ def _add_service(self):
+ if self.group is None:
+ self.group = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME,
+ self.server.EntryGroupNew()),
+ avahi.DBUS_INTERFACE_ENTRY_GROUP)
+ self.group.connect_to_signal('StateChanged',
+ self._entry_group_state_changed)
+
+ assert self.group.IsEmpty()
+ log.debug('Creating service \'%s\' of type \'%s\'' %
+ (self.name, self.stype))
+
+ self.group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, 0,
+ self.name, self.stype, self.domain, self.host,
+ dbus.UInt16(self.port),
+ avahi.string_array_to_txt_array(self.txt))
+ self.group.Commit()
+ log.debug('Service commited')
+
+ def _entry_group_state_changed(self, state, wtf):
+ if state == avahi.ENTRY_GROUP_ESTABLISHED:
+ log.debug('Service established.')
+ elif state == avahi.ENTRY_GROUP_COLLISION:
+ self.n_rename += 1
+ if self.n_rename >= 12:
+ log.error('No suitable service name found after %i '
+ 'retries, exiting.' % n_rename)
+ self.stop()
+ else:
+ self.name = self.server.GetAlternativeServiceName(name)
+ log.warning('Service name collision, changing name to '
+ '\'%s\'.' % name)
+ self._remove_service()
+ self._add_service()
+
+ def run(self):
+ self.bus = dbus.SystemBus()
+ self.server = self.bus.get_object ('org.freedesktop.Avahi', avahi.DBUS_PATH_SERVER)
+ self.interface = dbus.Interface (self.server, avahi.DBUS_INTERFACE_SERVER)
+ log.debug('Avahi service created')
+ self.server.connect_to_signal('StateChanged', self._server_state_changed)
+ self._server_state_changed(self.server.GetState())
+
+ self.ml = gobject.MainLoop()
+ gobject.threads_init()
+ self.ml.run()
+
+ def stop(self):
+ self.ml.quit()
--
1.4.4.4
>From 520007c8de5be652f4d792cf8eeef73bde74d0f5 Mon Sep 17 00:00:00 2001
From: Jose Carlos Garcia Sogo <[email protected]>
Date: Thu, 15 Feb 2007 00:09:55 +0100
Subject: [PATCH] - avahi publishing will be only run if 'avahi' var is set in config file.
- use 'port' setting from configuration, instead of hardcoding it to 9999
---
apt_proxy/apt_proxy.py | 5 +++--
apt_proxy/apt_proxy_conf.py | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/apt_proxy/apt_proxy.py b/apt_proxy/apt_proxy.py
index ed4c913..8c8766e 100644
--- a/apt_proxy/apt_proxy.py
+++ b/apt_proxy/apt_proxy.py
@@ -323,8 +323,9 @@ class Factory(protocol.ServerFactory):
self.dumpdbs()
self.recycler = MirrorRecycler(self, 1)
#self.recycler.start()
- self.avahisrv = AvahiService('apt-proxy@'+socket.gethostname(), '_apt-proxy._tcp', '', '', 9999, ['apt-proxy service'])
- self.avahisrv.run()
+ if getattr(self.config, 'avahi'):
+ self.avahisrv = AvahiService('apt-proxy@'+socket.gethostname(), '_apt-proxy._tcp', '', '', getattr(self.config, 'port'), ['apt-proxy service'])
+ self.avahisrv.run()
def configurationChanged(self, oldconfig = None):
"""
diff --git a/apt_proxy/apt_proxy_conf.py b/apt_proxy/apt_proxy_conf.py
index d99df6a..8d38027 100644
--- a/apt_proxy/apt_proxy_conf.py
+++ b/apt_proxy/apt_proxy_conf.py
@@ -101,7 +101,8 @@ class apConfig:
['http_proxy', None , 'proxyspec'],
['username', 'aptproxy', 'string'],
['bandwidth_limit', None, '*int'],
- ['use_experimental_decompressors', False, 'boolean']
+ ['use_experimental_decompressors', False, 'boolean'],
+ ['avahi', False, 'boolean']
]
"""
--
1.4.4.4
--- End Message ---