I'm trying to implement a file server using the code below. However
the locking doesn't work. I can delete while put'ing a file.

Anyone got an idea about why?

best regards,
seb




#! /usr/bin/env python

import Pyro.core, Pyro.naming
from Pyro.errors import PyroError, NamingError
import sys
import urllib
import os
import fcntl

class fileServer(Pyro.core.ObjBase):
        basePath = "/home/snot/diku/dist/opg2/files_to_serve"

        def __init__(self):
                Pyro.core.ObjBase.__init__(self)
                self.basePath = self.basePath.strip("..")
                if not os.path.isdir(self.basePath) or
os.path.islink(self.basePath):
                        raise "invalid path"

        def get(self, uri):
                f = open(self.basePath + uri, 'r+')
                fcntl.flock(f, fcntl.LOCK_SH)
                data = f.read()
                fcntl.flock(f, fcntl.LOCK_UN)
                f.close()
                return data

        def put(self, uri, payload):
                f = open(self.basePath + urllib.unquote_plus(uri), 'w')
                fcntl.flock(f, fcntl.LOCK_EX)
                f.truncate()
                f.write(payload)
                fcntl.flock(f, fcntl.LOCK_UN)
                f.close()

        def delete(self, uri):
                f = open(self.basePath + urllib.unquote_plus(uri), 'w')
                fcntl.flock(f, fcntl.LOCK_EX)
                os.unlink(self.basePath + uri)
                fcntl.flock(f, fcntl.LOCK_UN)
                f.close()

try:
        Pyro.core.initServer()
        daemon = Pyro.core.Daemon()
        locator = Pyro.naming.NameServerLocator()
        print 'Searching for Name Server...'
        try:
                ns = locator.getNS()
        except Pyro.errors.PyroError, message:
                print message
                sys.exit(1)

        daemon.useNameServer(ns)

        try:
                ns.unregister("fileServer")
        except NamingError:
                pass

        uri = daemon.connect(fileServer(), "fileServer")

        print "The daemon runs on port:", daemon.port
        print "The object's uri is:", uri

        daemon.requestLoop()
except KeyboardInterrupt:
        ns.unregister("fileServer")
        print "ctrl + c pressed"

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to