diff --git a/README.md b/README.md index a6d467f..006679c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ pyOS (prounounced "pious") is a python implemention of a psuedo unix-like operat Requirements ------------- -- Python 2.7+ +- Python 3.5+ Features -------- @@ -36,4 +36,16 @@ Todo Setup ----- - cd into the pyOS directory -- run pyOS.py \ No newline at end of file +- run pyOS.py + - Username: root + - Password: pass + +```text +> python ./pyOS.py +STARTING +root x has permisison for /programs/login.py +user: root +password: +root x has permisison for /programs/interpreter.py +root@pyOS:/$ +``` \ No newline at end of file diff --git a/documents/consumer.py b/documents/consumer.py index 9eb9f51..6376895 100644 --- a/documents/consumer.py +++ b/documents/consumer.py @@ -3,7 +3,7 @@ def run(shell, args): for line in shell.stdin.read(): - print line + print(line) time.sleep(1*random.random()) def help(): diff --git a/documents/producer.py b/documents/producer.py index f968e3d..0f6ecc9 100644 --- a/documents/producer.py +++ b/documents/producer.py @@ -2,7 +2,7 @@ import random def run(shell, args): - for x in xrange(20): + for x in range(20): shell.stdout.write(str(x)) time.sleep(1*random.random()) diff --git a/kernel/filesystem.py b/kernel/filesystem.py index c78e817..f8a42b9 100644 --- a/kernel/filesystem.py +++ b/kernel/filesystem.py @@ -1,8 +1,7 @@ import os import shutil -import imp import glob - +import importlib.util from kernel.constants import BASEPATH def abs_path(path): @@ -91,7 +90,14 @@ def open_program(path): x = abs_path(path) if not is_dir(path): try: - program = imp.load_source('program', x) + + spec = importlib.util.spec_from_file_location("program", x) + if not spec: + return + + program = importlib.util.module_from_spec(spec) + spec.loader.exec_module(program) + except IOError: program = False else: diff --git a/kernel/metadata.py b/kernel/metadata.py index 7984dcf..a1c84db 100644 --- a/kernel/metadata.py +++ b/kernel/metadata.py @@ -2,7 +2,7 @@ import sqlite3 from kernel.constants import METADATAFILE -from kernel.utils import calc_permission_number, calc_permission_string +from kernel.utils import calc_permission_number from kernel.utils import convert_many def build_meta_data_database(fsmatches): @@ -49,7 +49,7 @@ def get_meta_data(path): data = cur.fetchone() if data: ## force data to be strings and not unicode - data = tuple(str(x) if type(x) == unicode else x for x in data) + data = tuple(str(x) if type(x) == str else x for x in data) return data def get_all_meta_data(path='/'): @@ -62,7 +62,7 @@ def get_all_meta_data(path='/'): data = cur.fetchall() if data: ## force data to be strings and not unicode - data = [tuple(str(x) if type(x) == unicode else x for x in row) for row in data] + data = [tuple(str(x) if type(x) == str else x for x in row) for row in data] return data def add_path(path, owner, permission): diff --git a/kernel/shell.py b/kernel/shell.py index f231f69..8f041a4 100644 --- a/kernel/shell.py +++ b/kernel/shell.py @@ -1,4 +1,3 @@ -import re import threading import kernel.stream diff --git a/kernel/shutdown.py b/kernel/shutdown.py index a668e21..fd1a740 100644 --- a/kernel/shutdown.py +++ b/kernel/shutdown.py @@ -1,2 +1,2 @@ def run(): - print "SHUTTING DOWN" + print("SHUTTING DOWN") diff --git a/kernel/startup.py b/kernel/startup.py index df756db..7245b45 100644 --- a/kernel/startup.py +++ b/kernel/startup.py @@ -3,7 +3,7 @@ import kernel.userdata def run(): - print "STARTING" + print("STARTING") kernel.userdata.build_user_data_database() kernel.metadata.build_meta_data_database(kernel.filesystem.list_all('/')) diff --git a/kernel/stream.py b/kernel/stream.py index 9a234ff..cc6f519 100644 --- a/kernel/stream.py +++ b/kernel/stream.py @@ -10,7 +10,7 @@ def __init__(self, name='', value=None, writer=None, reader=None): self._line = 0 self.closed = False - def __nonzero__(self): + def __bool__(self): return bool(self.reader) def set_reader(self, callback): @@ -58,7 +58,7 @@ def broadcast(self): pass # self.reader() else: if any(self.value): - print "<%s> %s" % (self.name, '\n'.join(self.value[:-1])), + print("<%s> %s" % (self.name, '\n'.join(self.value[:-1])), end=' ') def __repr__(self): return "" % ( diff --git a/kernel/system.py b/kernel/system.py index 9d91fa4..b79e08c 100644 --- a/kernel/system.py +++ b/kernel/system.py @@ -132,9 +132,9 @@ def wrapper(self, *args, **kwargs): if laccess.isdigit(): laccess = list(set(args[int(laccess)]) & {'r', 'w'})[0] if has_permission(path, 'root', laccess): - print "root %s has permisison for %s" % (laccess, path) + print("root %s has permisison for %s" % (laccess, path)) else: - print "root %s permission denied for %s" % (laccess, path) + print("root %s permission denied for %s" % (laccess, path)) return function(self, *args, **kwargs) return wrapper return real_decorator diff --git a/kernel/userdata.py b/kernel/userdata.py index d23b5ff..3c36b71 100644 --- a/kernel/userdata.py +++ b/kernel/userdata.py @@ -36,7 +36,7 @@ def get_user_data(user): data = cur.fetchone() if data: ## force data to be strings and not unicode - data = tuple(str(x) if type(x) == unicode else x for x in data) + data = tuple(str(x) if type(x) == str else x for x in data) return data def get_all_user_data(): @@ -49,7 +49,7 @@ def get_all_user_data(): data = cur.fetchall() if data: ## force data to be strings and not unicode - data = [tuple(str(x) if type(x) == unicode else x for x in row) for row in data] + data = [tuple(str(x) if type(x) == str else x for x in row) for row in data] return data ####################################### diff --git a/programs/head.py b/programs/head.py index 6beb70f..6084279 100644 --- a/programs/head.py +++ b/programs/head.py @@ -16,7 +16,7 @@ def run(shell, args): shell.stdout.write("==> %s <==" % (x, )) try: f = shell.syscall.open_file(path, 'r') - for x in xrange(args.lineamount): + for x in range(args.lineamount): shell.stdout.write(f.readline().rstrip()) f.close() except IOError: @@ -24,7 +24,7 @@ def run(shell, args): if shell.stdin: if args.paths: shell.stdout.write("==> %% stdin %% <==") - for x in xrange(args.lineamount): + for x in range(args.lineamount): shell.stdout.write(shell.stdin.readline()) shell.stdout.write("") else: diff --git a/programs/interpreter.py b/programs/interpreter.py index ad5262a..7edaf42 100644 --- a/programs/interpreter.py +++ b/programs/interpreter.py @@ -15,7 +15,7 @@ def run(shell, args): user = shell.get_var('USER') while System.state >= RUNNING: - data = raw_input("%s@%s:%s$ "% (user, OSNAME, shell.get_path())) + data = input("%s@%s:%s$ "% (user, OSNAME, shell.get_path())) data = data.strip() if data: cleaned, command = shell_expansion(shell, data) diff --git a/programs/login.py b/programs/login.py index 5c2407b..c6232b5 100644 --- a/programs/login.py +++ b/programs/login.py @@ -4,8 +4,8 @@ from kernel.system import System def run(shell, args): - user = raw_input("user: ") - password = hashlib.sha256(getpass.getpass("password: ")).hexdigest() + user = input("user: ") + password = hashlib.sha256(getpass.getpass("password: ").encode('utf-8')).hexdigest() if shell.syscall.correct_password(user, password): # == db(user).password stuff = { diff --git a/programs/ls.py b/programs/ls.py index cfc88a1..6521b2d 100644 --- a/programs/ls.py +++ b/programs/ls.py @@ -38,22 +38,32 @@ def ls(shell, relpath, args): if a: maxlen = max(max([len(x) for x in a]), 1) # arbitrary line length - columns = (80 / maxlen) - 1 + columns_max = 80 + columns = (columns_max / maxlen) - 1 b = [] + pos = 0 + line = "\n" + to_add = "" for i, x in enumerate(a): - newline = "\n" if not ((i + 1) % columns) else "" if not ((i + 1) % columns): newline = "\n" spacing = "" else: newline = "" spacing = " " * (maxlen - len(x) + 1) - b.append(x + spacing + newline) - shell.stdout.write(''.join(b).rstrip()) + to_add = "%s%s%s" % (x, spacing, newline) + if pos < columns_max: + pos += len(to_add) + line += to_add + else: + b.append(line) + pos = 0 + line = "" + shell.stdout.write("%s\n" % '\n'.join(b)) if len(args.paths) > 1: shell.stdout.write("") except OSError: - shell.stderr.write('ls: cannot acces %s: no such file or directory\n' % (relpath, )) + shell.stderr.write('ls: cannot access %s: no such file or directory\n' % (relpath, )) def help(): return parser.help_msg() diff --git a/programs/sed.py b/programs/sed.py index 2b9847e..74b38a5 100644 --- a/programs/sed.py +++ b/programs/sed.py @@ -171,10 +171,10 @@ def help(): { commands } group of commands s s/regex/replacement/flags replacement - \L turn replacement lowercase until \U or \E + \L turn replacement lowercase until \\U or \E \l turn the next char lowercase - \U turn replacement uppercase until \L or \E - \u turn the next char to uppercase + \\U turn replacement uppercase until \L or \E + \\u turn the next char to uppercase \E Stop case conversion \[n] number of inclusions & matched pattern diff --git a/programs/tee.py b/programs/tee.py index 8b9e6aa..4a41757 100644 --- a/programs/tee.py +++ b/programs/tee.py @@ -30,7 +30,7 @@ def run(shell, args): f.close() else: for line in shell.stdin.read(): - print line + print(line) shell.stdout.write(line) def help(): diff --git a/pyOS.py b/pyOS.py index 7f4a8e9..04e1909 100644 --- a/pyOS.py +++ b/pyOS.py @@ -1,4 +1,4 @@ from kernel.system import System if __name__ == '__main__': - System.run() \ No newline at end of file + System.run()