81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
import Service
|
|
import sha
|
|
import binascii
|
|
import time
|
|
|
|
|
|
def is_group_service_type(stype):
|
|
"""Return True if the service type matches a group
|
|
service type, or False if it does not."""
|
|
if stype.endswith("_group_olpc._tcp") or stype.endswith("_group_olpc._udp"):
|
|
return True
|
|
return False
|
|
|
|
|
|
def _stringify_sha(sha_hash):
|
|
"""Convert binary sha1 hash data into printable characters."""
|
|
print_sha = ""
|
|
for char in sha_hash:
|
|
print_sha = print_sha + binascii.b2a_hex(char)
|
|
return print_sha
|
|
|
|
def _sha_data(data):
|
|
"""sha1 hash some bytes."""
|
|
sha_hash = sha.new()
|
|
sha_hash.update(data)
|
|
return sha_hash.digest()
|
|
|
|
|
|
__GROUP_NAME_TAG = "Name"
|
|
__GROUP_RESOURCE_TAG = "Resource"
|
|
|
|
def new_group_service(group_name, resource):
|
|
"""Create a new service suitable for defining a new group."""
|
|
if type(group_name) != type("") or not len(group_name):
|
|
raise ValueError("group name must be a valid string.")
|
|
if type(resource) != type("") or not len(resource):
|
|
raise ValueError("group resource must be a valid string.")
|
|
|
|
# Create a randomized service type
|
|
data_string = "%s%s%s%s" % (time.time(), random.randint(10000, 100000), \
|
|
group_name, resource)
|
|
hash_string = _stringify_sha(_sha_data(data_string))
|
|
stype = "_%s_group_olpc._udp" % hash_string
|
|
|
|
properties = {__GROUP_NAME_TAG: group_name, __GROUP_RESOURCE_TAG: resource }
|
|
owner_nick = ""
|
|
port = random.randint(5000, 65000)
|
|
# Use random currently unassigned multicast address
|
|
address = "232.%d.%d.%d" % (random.randint(0, 254), random.randint(1, 254),
|
|
random.randint(1, 254))
|
|
service = Service.Service(owner_nick, stype, "local", address=address,
|
|
port=port, properties=properties)
|
|
return service
|
|
|
|
|
|
class Group(object):
|
|
"""Represents a collection of buddies all interested in the same resource."""
|
|
def __init__(self, service):
|
|
if not isinstance(service, Service.Service):
|
|
raise ValueError("service argument was not a Service object.")
|
|
if not service.is_group_service():
|
|
raise ValueError("provided serivce was not a group service.")
|
|
name = service.get_one_property(__GROUP_NAME_TAG)
|
|
if name == None:
|
|
raise ValueError("provided service did not provide a group name.")
|
|
self._name = name
|
|
resource = service.get_one_property(__GROUP_RESOURCE_TAG)
|
|
if resource == None:
|
|
raise ValueError("provided service did not provide a group resource.")
|
|
self._resource = resource
|
|
self._service = service
|
|
|
|
def get_name(self):
|
|
return self._name
|
|
|
|
def get_service(self):
|
|
return self._service
|
|
|
|
def get_resource(self):
|
|
return self._resource
|