src/extras/fileserver/fctool
changeset 0 ca70ae20a155
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/extras/fileserver/fctool	Tue Feb 16 10:07:05 2010 +0530
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+#
+# A simple command line client for the simple file transfer server
+# for Series 60 Python environment.
+#     
+# Copyright (c) 2005 Nokia Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys
+import os
+import fileclient
+import binascii
+
+color=1
+
+if color:
+    colormap={'red': '\033[31;1m',
+              'green': '\033[32;1m',
+              'blue': '\033[34;1m',
+              'yellow': '\033[33;1m',
+              'cyan': '\033[36;1m',
+              'magenta': '\033[35;1m',
+              'white': '\033[37;1m',
+              }
+    coloroff='\033[0m'
+    def colorize(color,text):
+        return colormap[color]+text+coloroff
+else:
+    def colorize(color,text):
+        return text
+    
+def cmd_download(client,remotefile,localfile=None):
+    client.download(remotefile,localfile)
+    print "Downloaded file from "+remotefile+"."
+
+def cmd_upload(client,remotefile,localfile=None):
+    client.upload(remotefile,localfile)
+    print "Uploaded file to "+remotefile+"."
+
+def cmd_get(client,remotefile):
+    print "File contents: "+client.get(remotefile)
+
+def cmd_put(client,remotefile,content):
+    client.put(remotefile,content)
+    print "Data uploaded to file "+remotefile
+
+def cmd_eval(client,expression):
+    print "Result: "+repr(client.eval(expression))
+
+def cmd_exec(client,*expression):
+    client.exec_(' '.join(expression))
+
+def cmd_killserver(client):
+    client.killserver()
+    print "Sent quit command to server."
+
+def syncfiles(client,files):
+    """Update the given files on the remote host to the same
+    versions as on the local filesystem. The argument files is
+    a list of (localfile,remotefile) tuples."""
+    print "Obtaining remote checksums..."
+    #client.exec_('import sync')
+    (localfiles,remotefiles)=zip(*files)
+    remotesums=client.eval('file_checksums('+repr(remotefiles)+')')
+    print "Remote checksums: "+repr(remotesums)
+    localsums=map(file_checksum,localfiles)
+    for ((localfile,remotefile),localsum) in zip(files,localsums):
+        if localsum != remotesums[remotefile]:
+            print colorize('green',"Checksum mismatch for file "+remotefile+" - uploading...")
+            client.upload(remotefile,localfile)
+        else:
+            print colorize('white',"Checksum of "+remotefile+" matches - not uploading.")
+
+def cmd_syncdir(client,remotedir,localdir):
+    files=filter(lambda x: os.path.isfile(os.path.join(localdir,x)),os.listdir(localdir))
+    print "Synchronizing files: "+' '.join(files)
+    filelist=[(os.path.join(localdir,x),
+               os.path.join(remotedir,x)) for x in files]
+    syncfiles(client,filelist)
+
+def cmd_syncfiles(client,remotedir,*localfiles):
+    localfiles=filter(os.path.isfile,localfiles)
+    files=[]
+    for k in localfiles:
+        files.append((k,os.path.join(remotedir,os.path.basename(k))))
+    syncfiles(client,files)
+def cmd_ping(client):
+    print "Probing server..."
+    result=client.eval('2+2')
+    if result==4:
+        print "The server is alive and well."
+    else:
+        print "The server is down."
+def file_checksum(filename):
+    f=open(filename,'rb')
+    checksum = binascii.crc32(f.read())
+    f.close()
+    return checksum
+
+if len(sys.argv)<2:
+    print "Usage: fctool [-v] command [args]"
+    sys.exit()
+
+if sys.argv[1]=='-v':
+    verbose=1
+    del sys.argv[1]
+else:
+    verbose=0
+
+cmd=sys.argv[1]
+args=sys.argv[2:]
+
+try:
+    cmdfunc=globals()['cmd_'+cmd]
+except:
+    raise "Unknown command "+cmd
+
+#print "Executing command: "+cmd+str(tuple(args))
+
+client=fileclient.connect('/dev/ttyS4',verbose)
+
+cmdfunc(client,*args)