0
|
1 |
#!/usr/bin/env python
|
|
2 |
#
|
|
3 |
# A simple command line client for the simple file transfer server
|
|
4 |
# for Series 60 Python environment.
|
|
5 |
#
|
|
6 |
# Copyright (c) 2005 Nokia Corporation
|
|
7 |
#
|
|
8 |
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9 |
# you may not use this file except in compliance with the License.
|
|
10 |
# You may obtain a copy of the License at
|
|
11 |
#
|
|
12 |
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13 |
#
|
|
14 |
# Unless required by applicable law or agreed to in writing, software
|
|
15 |
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17 |
# See the License for the specific language governing permissions and
|
|
18 |
# limitations under the License.
|
|
19 |
|
|
20 |
import sys
|
|
21 |
import os
|
|
22 |
import fileclient
|
|
23 |
import binascii
|
|
24 |
|
|
25 |
color=1
|
|
26 |
|
|
27 |
if color:
|
|
28 |
colormap={'red': '\033[31;1m',
|
|
29 |
'green': '\033[32;1m',
|
|
30 |
'blue': '\033[34;1m',
|
|
31 |
'yellow': '\033[33;1m',
|
|
32 |
'cyan': '\033[36;1m',
|
|
33 |
'magenta': '\033[35;1m',
|
|
34 |
'white': '\033[37;1m',
|
|
35 |
}
|
|
36 |
coloroff='\033[0m'
|
|
37 |
def colorize(color,text):
|
|
38 |
return colormap[color]+text+coloroff
|
|
39 |
else:
|
|
40 |
def colorize(color,text):
|
|
41 |
return text
|
|
42 |
|
|
43 |
def cmd_download(client,remotefile,localfile=None):
|
|
44 |
client.download(remotefile,localfile)
|
|
45 |
print "Downloaded file from "+remotefile+"."
|
|
46 |
|
|
47 |
def cmd_upload(client,remotefile,localfile=None):
|
|
48 |
client.upload(remotefile,localfile)
|
|
49 |
print "Uploaded file to "+remotefile+"."
|
|
50 |
|
|
51 |
def cmd_get(client,remotefile):
|
|
52 |
print "File contents: "+client.get(remotefile)
|
|
53 |
|
|
54 |
def cmd_put(client,remotefile,content):
|
|
55 |
client.put(remotefile,content)
|
|
56 |
print "Data uploaded to file "+remotefile
|
|
57 |
|
|
58 |
def cmd_eval(client,expression):
|
|
59 |
print "Result: "+repr(client.eval(expression))
|
|
60 |
|
|
61 |
def cmd_exec(client,*expression):
|
|
62 |
client.exec_(' '.join(expression))
|
|
63 |
|
|
64 |
def cmd_killserver(client):
|
|
65 |
client.killserver()
|
|
66 |
print "Sent quit command to server."
|
|
67 |
|
|
68 |
def syncfiles(client,files):
|
|
69 |
"""Update the given files on the remote host to the same
|
|
70 |
versions as on the local filesystem. The argument files is
|
|
71 |
a list of (localfile,remotefile) tuples."""
|
|
72 |
print "Obtaining remote checksums..."
|
|
73 |
#client.exec_('import sync')
|
|
74 |
(localfiles,remotefiles)=zip(*files)
|
|
75 |
remotesums=client.eval('file_checksums('+repr(remotefiles)+')')
|
|
76 |
print "Remote checksums: "+repr(remotesums)
|
|
77 |
localsums=map(file_checksum,localfiles)
|
|
78 |
for ((localfile,remotefile),localsum) in zip(files,localsums):
|
|
79 |
if localsum != remotesums[remotefile]:
|
|
80 |
print colorize('green',"Checksum mismatch for file "+remotefile+" - uploading...")
|
|
81 |
client.upload(remotefile,localfile)
|
|
82 |
else:
|
|
83 |
print colorize('white',"Checksum of "+remotefile+" matches - not uploading.")
|
|
84 |
|
|
85 |
def cmd_syncdir(client,remotedir,localdir):
|
|
86 |
files=filter(lambda x: os.path.isfile(os.path.join(localdir,x)),os.listdir(localdir))
|
|
87 |
print "Synchronizing files: "+' '.join(files)
|
|
88 |
filelist=[(os.path.join(localdir,x),
|
|
89 |
os.path.join(remotedir,x)) for x in files]
|
|
90 |
syncfiles(client,filelist)
|
|
91 |
|
|
92 |
def cmd_syncfiles(client,remotedir,*localfiles):
|
|
93 |
localfiles=filter(os.path.isfile,localfiles)
|
|
94 |
files=[]
|
|
95 |
for k in localfiles:
|
|
96 |
files.append((k,os.path.join(remotedir,os.path.basename(k))))
|
|
97 |
syncfiles(client,files)
|
|
98 |
def cmd_ping(client):
|
|
99 |
print "Probing server..."
|
|
100 |
result=client.eval('2+2')
|
|
101 |
if result==4:
|
|
102 |
print "The server is alive and well."
|
|
103 |
else:
|
|
104 |
print "The server is down."
|
|
105 |
def file_checksum(filename):
|
|
106 |
f=open(filename,'rb')
|
|
107 |
checksum = binascii.crc32(f.read())
|
|
108 |
f.close()
|
|
109 |
return checksum
|
|
110 |
|
|
111 |
if len(sys.argv)<2:
|
|
112 |
print "Usage: fctool [-v] command [args]"
|
|
113 |
sys.exit()
|
|
114 |
|
|
115 |
if sys.argv[1]=='-v':
|
|
116 |
verbose=1
|
|
117 |
del sys.argv[1]
|
|
118 |
else:
|
|
119 |
verbose=0
|
|
120 |
|
|
121 |
cmd=sys.argv[1]
|
|
122 |
args=sys.argv[2:]
|
|
123 |
|
|
124 |
try:
|
|
125 |
cmdfunc=globals()['cmd_'+cmd]
|
|
126 |
except:
|
|
127 |
raise "Unknown command "+cmd
|
|
128 |
|
|
129 |
#print "Executing command: "+cmd+str(tuple(args))
|
|
130 |
|
|
131 |
client=fileclient.connect('/dev/ttyS4',verbose)
|
|
132 |
|
|
133 |
cmdfunc(client,*args)
|