|
|
@@ -0,0 +1,125 @@ |
|
|
# Based on https://gist.github.com/4063716 |
|
|
# |
|
|
# Provides a simple shell with basic |
|
|
# commands for dealing with files and |
|
|
# directories. |
|
|
# |
|
|
# This script will try and prevent |
|
|
# unsafe file operations outside of |
|
|
# Documents directory. |
|
|
# |
|
|
# Add a setting named allow_unsafe and |
|
|
# in the config dict and set to True |
|
|
# to disable these preventative measures. |
|
|
|
|
|
import os |
|
|
import cmd |
|
|
import console |
|
|
import shlex |
|
|
import sys |
|
|
|
|
|
config = {} |
|
|
|
|
|
def main(): |
|
|
shell = Shell() |
|
|
shell.prompt = '> ' |
|
|
shell.cmdloop() |
|
|
|
|
|
colors = {'blue':(0,0,1), |
|
|
'red':(1,0,0)} |
|
|
|
|
|
def get_color(color): |
|
|
return colors.get(color, None) |
|
|
|
|
|
def print_in_color(color_name, msg): |
|
|
color = get_color(color_name) |
|
|
if color: |
|
|
console.set_color(*color) |
|
|
print msg |
|
|
console.set_color() |
|
|
|
|
|
class Shell(cmd.Cmd): |
|
|
|
|
|
def __init__(self): |
|
|
cmd.Cmd.__init__(self) |
|
|
self.startup_dir = os.getcwd() |
|
|
|
|
|
def safe_path(self, path): |
|
|
if config.get('allow_unsafe'): |
|
|
return True |
|
|
paths = [self.startup_dir, os.path.normpath(path)] |
|
|
return self.startup_dir == os.path.commonprefix(paths) |
|
|
|
|
|
def do_ls(self, line): |
|
|
try: |
|
|
for f in sorted(os.listdir(os.getcwd())): |
|
|
if os.path.isdir(f): |
|
|
print_in_color('blue', f) |
|
|
else: |
|
|
print_in_color('default', f) |
|
|
except OSError, e: |
|
|
print e |
|
|
|
|
|
def do_pwd(self, line): |
|
|
print os.getcwd() |
|
|
|
|
|
def do_cat(self, line): |
|
|
args = shlex.split(line) |
|
|
if len(args) == 0: |
|
|
return |
|
|
try: |
|
|
with open(args[0], 'r') as f: |
|
|
for l in f: |
|
|
sys.stdout.write(l) |
|
|
except Exception, e: |
|
|
print_in_color('red', e) |
|
|
|
|
|
def do_cd(self, line): |
|
|
args = shlex.split(line) |
|
|
if not args: |
|
|
args = ['~/Documents'] |
|
|
dir = os.path.expanduser(args[0]) |
|
|
if os.path.exists(dir): |
|
|
os.chdir(dir) |
|
|
self.do_pwd(line) |
|
|
else: |
|
|
print 'Directory does not exist: ' + dir |
|
|
|
|
|
def do_mkdir(self, line): |
|
|
args = shlex.split(line) |
|
|
if len(args) == 0: |
|
|
return |
|
|
if not self.safe_path(os.getcwd()): |
|
|
print 'Changes to unsafe directories are disabled.' |
|
|
return |
|
|
if os.path.exists(args[0]): |
|
|
print 'Directory already exists: ' + args[0] |
|
|
return |
|
|
try: |
|
|
os.mkdir(args[0]) |
|
|
except OSError, e: |
|
|
print e |
|
|
|
|
|
def do_rm(self, line): |
|
|
args = shlex.split(line) |
|
|
if len(args == 0): |
|
|
return |
|
|
if not os.path.exists(args[0]): |
|
|
print 'Invalid path: ' + args[0] |
|
|
return |
|
|
elif not self.safe_path(os.path.abspath(args[0])): |
|
|
print 'Changes to unsafe directories are disabled.' |
|
|
return |
|
|
elif os.path.isdir(args[0]): |
|
|
try: |
|
|
os.rmdir(args[0]) |
|
|
except OSError, e: |
|
|
print e |
|
|
else: |
|
|
try: |
|
|
os.remove(args[0]) |
|
|
except OSError, e: |
|
|
print e |
|
|
|
|
|
if __name__ == '__main__': |
|
|
main() |