New commands: cp & mv

git-svn-id: https://kippo.googlecode.com/svn/trunk@159 951d7100-d841-11de-b865-b3884708a8e2
This commit is contained in:
desaster
2010-07-13 17:00:53 +00:00
parent e5ac632312
commit eb708a2f08

View File

@@ -1,7 +1,8 @@
# Copyright (c) 2009 Upi Tamminen <desaster@gmail.com> # Copyright (c) 2009 Upi Tamminen <desaster@gmail.com>
# See the COPYRIGHT file for more information # See the COPYRIGHT file for more information
import os, time, anydbm, datetime import os, time, anydbm, datetime, getopt
from copy import deepcopy, copy
from kippo.core.honeypot import HoneyPotCommand from kippo.core.honeypot import HoneyPotCommand
from kippo.core.fs import * from kippo.core.fs import *
from twisted.internet import reactor from twisted.internet import reactor
@@ -77,6 +78,140 @@ class command_rm(HoneyPotCommand):
dir.remove(i) dir.remove(i)
commands['/bin/rm'] = command_rm commands['/bin/rm'] = command_rm
class command_cp(HoneyPotCommand):
def call(self):
if not len(self.args):
self.writeln("cp: missing file operand")
self.writeln("Try `cp --help' for more information.")
return
try:
optlist, args = getopt.gnu_getopt(self.args,
'-abdfiHlLPpRrsStTuvx')
except getopt.GetoptError, err:
self.writeln('Unrecognized option')
return
recursive = False
for opt in optlist:
if opt[0] in ('-r', '-a', '-R'):
recursive = True
def resolv(path):
return self.fs.resolve_path(path, self.honeypot.cwd)
if len(args) < 2:
self.writeln("cp: missing destination file operand after `%s'" % \
(self.args[0],))
self.writeln("Try `cp --help' for more information.")
return
sources, dest = args[:-1], args[-1]
if len(sources) > 1 and not self.fs.is_dir(resolv(dest)):
self.writeln("cp: target `%s' is not a directory" % (dest,))
return
if dest[-1] == '/' and not self.fs.exists(resolv(dest)) and \
not recursive:
self.writeln(
"cp: cannot create regular file `%s': Is a directory" % \
(dest,))
return
if self.fs.is_dir(resolv(dest)):
is_dir = True
else:
is_dir = False
parent = os.path.dirname(resolv(dest))
if not self.fs.exists(parent):
self.writeln("cp: cannot create regular file " + \
"`%s': No such file or directory" % (dest,))
return
for src in sources:
if not self.fs.exists(resolv(src)):
self.writeln(
"cp: cannot stat `%s': No such file or directory" % (src,))
continue
if not recursive and self.fs.is_dir(resolv(src)):
self.writeln("cp: omitting directory `%s'" % (src,))
continue
s = deepcopy(self.fs.getfile(resolv(src)))
if is_dir:
dir = self.fs.get_path(resolv(dest))
outfile = os.path.basename(src)
else:
dir = self.fs.get_path(os.path.dirname(resolv(dest)))
outfile = os.path.basename(dest.rstrip('/'))
if outfile in [x[A_NAME] for x in dir]:
dir.remove([x for x in dir if x[A_NAME] == outfile][0])
s[A_NAME] = outfile
dir.append(s)
commands['/bin/cp'] = command_cp
class command_mv(HoneyPotCommand):
def call(self):
if not len(self.args):
self.writeln("mv: missing file operand")
self.writeln("Try `mv --help' for more information.")
return
try:
optlist, args = getopt.gnu_getopt(self.args, '-bfiStTuv')
except getopt.GetoptError, err:
self.writeln('Unrecognized option')
self.exit()
def resolv(path):
return self.fs.resolve_path(path, self.honeypot.cwd)
if len(args) < 2:
self.writeln("mv: missing destination file operand after `%s'" % \
(self.args[0],))
self.writeln("Try `mv --help' for more information.")
return
sources, dest = args[:-1], args[-1]
if len(sources) > 1 and not self.fs.is_dir(resolv(dest)):
self.writeln("mv: target `%s' is not a directory" % (dest,))
return
if dest[-1] == '/' and not self.fs.exists(resolv(dest)) and \
len(sources) != 1:
self.writeln(
"mv: cannot create regular file `%s': Is a directory" % \
(dest,))
return
if self.fs.is_dir(resolv(dest)):
is_dir = True
else:
is_dir = False
parent = os.path.dirname(resolv(dest))
if not self.fs.exists(parent):
self.writeln("mv: cannot create regular file " + \
"`%s': No such file or directory" % \
(dest,))
return
for src in sources:
if not self.fs.exists(resolv(src)):
self.writeln(
"mv: cannot stat `%s': No such file or directory" % \
(src,))
continue
s = self.fs.getfile(resolv(src))
if is_dir:
dir = self.fs.get_path(resolv(dest))
outfile = os.path.basename(src)
else:
dir = self.fs.get_path(os.path.dirname(resolv(dest)))
outfile = os.path.basename(dest)
if dir != os.path.dirname(resolv(src)):
s[A_NAME] = outfile
dir.append(s)
sdir = self.fs.get_path(os.path.dirname(resolv(src)))
sdir.remove(s)
else:
s[A_NAME] = outfile
commands['/bin/mv'] = command_mv
class command_mkdir(HoneyPotCommand): class command_mkdir(HoneyPotCommand):
def call(self): def call(self):
for f in self.args: for f in self.args: