--- /dev/null
+#!/usr/bin/env python
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
+import sys, os
+sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
+import cons
+
+def daemonize():
+ sys.stdin.close()
+ sys.stdout.close()
+ sys.stderr.close()
+ pid=os.fork()
+ if pid!=0:
+ sys.exit(0)
+
+#daemonize()
+
+
+while True:
+ for readable in cons.readables():
+ if readable==cons.privlistener:
+ newsock,addr=readable.accept()
+ cons.add(cons.Connection(newsock, False))
+ elif readable==cons.publistener:
+ newsock,addr=readable.accept()
+ cons.add(cons.Connection(newsock, True))
+ else:
+ readable.handleinput()
+
--- /dev/null
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
+def parse(con):
+ if '\0' not in con.data:
+ return
+ cmds=con.data.split('\0')[:-1]
+
+ for cmd in cmds:
+ con.data=con.data[len(cmd)+1:]
+ cmdname=cmd[:4]
+ if cmdname in cmdlist:
+ cmdlist[cmdname](con, cmd[5:])
+ else:
+ raise CmdError
+ # TODO: log this
+
+locks={}
+
+def lock(con, arg, hard):
+ if arg not in locks:
+ locks[arg]=hard
+ con.sock.send("OK")
+ elif locks[arg]:
+ con.sock.send("HARD") # Hard lock - you can go get a cup of tea
+ else:
+ con.sock.send("SOFT") # Soft lock - try in a second or two
+
+
+def unlock(con, arg):
+ if arg in locks:
+ del locks[arg]
+
+def lock_soft(con, arg):
+ lock(con, arg, False)
+
+def lock_hard(con, arg):
+ lock(con, arg, True)
+
+CmdError="CmdError"
+
+cmdlist={'lcks':lock_soft, 'lckh':lock_hard, 'ulck':unlock}
+
fullpath=path
else:
fullpath=config.ftp_dir+path
-
- try:
- os.stat(fullpath)
- except OSError, (errno, errmsg):
- return False
- else:
- return True
+ return os.path.exists(fullpath)
def checkdir(dir):
if not fileexists(sys.argv[1]):
--- /dev/null
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
+import socket
+import os
+import select
+from common import fileexists
+import ftpio
+import cmds
+
+class Connection:
+ def __init__(self, sock, authorized):
+ sock.setblocking(False)
+ self.sock=sock
+ self.authorized=authorized
+ self.fileno=sock.fileno
+ self.data=""
+ def destroy(self):
+ self.sock.close()
+ rm(self)
+ def handleinput(self):
+ newdata=self.sock.recv(8192)
+ if not newdata:
+ self.destroy()
+ self.data=self.data+newdata
+ try:
+ cmds.parse(self)
+ except cmds.CmdError:
+ self.destroy()
+
+def add(con):
+ cons.append(con)
+
+def rm(con):
+ cons.remove(con)
+
+def readables():
+ lst=cons[:]
+ lst.append(privlistener)
+ lst.append(publistener)
+ inlst,outlst,errlst = select.select(lst, [], [], 0)
+ return inlst
+
+def createlistener(path):
+ if fileexists(path):
+ os.remove(path)
+
+ s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ s.setblocking(False)
+ s.bind(path)
+ if path==ftpio.pubsock:
+ os.chmod(path, 0606)
+ else:
+ os.chmod(path, 0600)
+ s.listen(3)
+ return s
+
+cons=[]
+
+privlistener=createlistener(ftpio.privsock)
+publistener=createlistener(ftpio.pubsock)
+
+
+
--- /dev/null
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
+import os
+import socket
+import time
+import config
+
+privsock=os.environ['HOME']+'/pld-ftp-admin/var/privsock'
+pubsock=config.value['pubsock']
+
+if os.environ.has_key('HOME'):
+ socketname=privsock
+else:
+ socketname=pubsock
+
+def connect():
+ global sock
+ sock=socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ sock.connect(socketname)
+
+def lock(path, hard=False):
+ def dolock():
+ if hard:
+ sock.send('lckh %s\0' % path)
+ else:
+ sock.send('lcks %s\0' % path)
+ return sock.recv(20)
+ for i in range(3):
+ retcode=dolock()
+ if retcode=="OK":
+ return True
+ elif retcode=="HARD":
+ return False
+ if i!=2:
+ time.sleep(1)
+ return False
+
+def unlock(path):
+ sock.send('ulck %s\0' % path)
+
+