mash/main.py

206 lines
8.0 KiB
Python
Raw Permalink Normal View History

2024-07-15 13:06:07 +10:00
#!/usr/bin/python3
2024-07-29 13:09:44 +10:00
version = "0.2.0"
2024-07-05 09:42:14 +10:00
# Imports, of course.
2024-07-03 12:08:56 +10:00
import os
import socket
2024-07-03 12:08:56 +10:00
import subprocess
import shutil
2024-07-05 09:26:10 +10:00
from datetime import datetime
2024-07-04 09:49:07 +10:00
from os.path import expanduser
2024-07-03 12:08:56 +10:00
2024-07-05 09:42:14 +10:00
# Some initial variables
2024-07-03 13:31:27 +10:00
user = os.getlogin()
2024-08-28 14:58:29 +10:00
mashLocation = os.getcwd() + "/"
2024-07-04 09:49:07 +10:00
initDirectory = expanduser("~")
argList = ["", ""]
2024-07-05 09:42:14 +10:00
# Start work on checking whether a config file exists
2024-07-10 19:04:37 +10:00
if os.path.isfile(expanduser("~") + "/.config/mash/mash.conf") == False:
2024-08-28 14:58:29 +10:00
configFilePath = mashLocation + "mash.conf"
2024-07-15 14:05:01 +10:00
else:
configFilePath = (expanduser("~") + "/.config/mash/mash.conf")
2024-07-10 19:04:37 +10:00
# Parse config file, adding variables
2024-07-15 14:05:01 +10:00
configFileFile = open(configFilePath)
2024-07-10 19:04:37 +10:00
configFile = configFileFile.read()
confArgNumber = 0
confArgList = ["", ""]
for line in configFile:
for letter in line:
2024-07-11 16:55:08 +10:00
if letter == ':':
confArgList[confArgNumber] = confArgList[confArgNumber] + ":"
2024-07-10 19:04:37 +10:00
confArgNumber = confArgNumber + 1
2024-07-11 09:05:38 +10:00
elif letter == ',':
confArgList.append("")
2024-07-11 09:05:38 +10:00
confArgNumber = confArgNumber + 1
2024-07-10 19:04:37 +10:00
else:
try:
confArgList[confArgNumber] = confArgList[confArgNumber] + letter
except Exception:
confArgList.append(letter)
2024-07-11 09:05:38 +10:00
for word in confArgList:
if "\n" in word:
confArgList[confArgList.index(word)] = word.replace("\n", "")
2024-07-11 16:55:08 +10:00
for word in confArgList:
if word == "motd:":
motd = confArgList[confArgList.index(word) + 1]
if word == "mashPath:":
2024-07-15 10:03:44 +10:00
mashPathStr = (confArgList[confArgList.index(word) + 1])
pathStrIndex = 0
mashPath = [""]
for letter in mashPathStr:
if letter == ";":
pathStrIndex = pathStrIndex + 1
mashPath.append("")
else:
try:
mashPath[pathStrIndex] = mashPath[pathStrIndex] + letter
except Exception:
mashPath.append(letter)
2024-07-24 14:45:40 +10:00
if word == "colour:":
colourConf = confArgList[confArgList.index(word) + 1]
colourList = [""]
colourListIndex = 0
for letter in colourConf:
if letter == ";":
colourListIndex = colourListIndex + 1
colourList.append("")
else:
colourList[colourListIndex] = colourList[colourListIndex] + letter
colourCodes = []
for word in colourList:
if word == 'white':
colourCodes.append('\033[97m')
elif word == 'blue':
colourCodes.append('\033[34m')
elif word == 'green':
colourCodes.append('\033[32m')
elif word == 'yellow':
colourCodes.append('\033[33m')
2024-07-29 13:09:44 +10:00
elif word == 'pink':
colourCodes.append('\033[13m')
elif word == 'red':
2024-08-27 11:22:19 +10:00
colourCodes.append('\033[31m')
2024-07-29 13:09:44 +10:00
elif word == 'lblue':
colourCodes.append('\033[14m')
2024-07-05 09:42:14 +10:00
# Write the time to the history file
2024-08-28 14:58:29 +10:00
historyFile = open((mashLocation + "/.history.mash"), "a")
2024-07-05 09:26:10 +10:00
historyFile.write("\n")
historyFile.write(("Session on " + str(datetime.now())))
historyFile.write("\n")
2024-07-11 16:55:08 +10:00
# Welcome message. Configurable with "motd: (your motd here),"
print(motd)
2024-07-15 10:03:44 +10:00
os.chdir(initDirectory)
currentDirectory = initDirectory
2024-07-04 09:49:07 +10:00
2024-07-05 09:42:14 +10:00
# Main loop.
2024-07-15 10:03:44 +10:00
def mainLoop(startDir):
try:
currentDirectory = startDir
while True:
# Set directory and prompt for input.
os.chdir(currentDirectory)
2024-07-24 14:45:40 +10:00
command = input(colourCodes[0] + user + colourCodes[1] + "@" + colourCodes[2] + socket.gethostname() + colourCodes[3] + " " + currentDirectory + colourCodes[4] + " > ")
2024-07-15 14:05:01 +10:00
if command == "" :
mainLoop(currentDirectory)
2024-07-15 10:03:44 +10:00
# Clean some things up for the argument parser.
argNumber = 0
argList.clear()
2024-07-05 09:42:14 +10:00
2024-07-15 10:03:44 +10:00
# Argument parser
for letter in command:
if letter == " ":
argNumber = argNumber + 1
else:
try:
argList[argNumber] = argList[argNumber] + letter
except Exception:
argList.append(letter)
2024-07-05 09:42:14 +10:00
2024-07-15 10:03:44 +10:00
# Start work on pipes.
for word in argList:
if word == "&&":
print("This hasnt been implemented yet hahahahah")
elif word == "&":
print("This hasnt been implemented yet heheheheh")
elif word == "|":
print("What are you? A pipe master? We dont like those people here")
2024-07-05 09:42:14 +10:00
2024-07-15 10:03:44 +10:00
# Built in commands section
if argList[0] == "help":
print("This is Mash, Max's Shell. Mash has a few built in commands, which you can use to run commands, view files and interact with your system.")
print("Some commands you can run:")
print("")
print("cd Change your directory.")
print("history See previously ran commands.")
print("mat View contents of a file. If you're on a Unix-like OS, use 'cat' instead.")
print("mls View all files in a directory. If you're on a Unix-like OS, use 'ls' instead.")
print("version Print current version of Mash.")
print("exit Exit Mash.")
print("")
print("You can also run commands installed by your system. See your OS's documentation for more information.")
elif argList[0] == "exit":
exit()
elif argList[0] == "version":
print(version)
elif argList[0] == "mat":
matFile = open(argList[1])
print(matFile.read())
elif argList[0] == "mls":
try:
if argList[1] == "":
print(os.listdir(currentDirectory))
else:
argList[1] = mlsDirectory
if mlsDirectory[0] == "/":
print(os.listdir(mlsDirectory))
else:
print(os.listdir(currentDirectory + "/" + mlsDirectory))
except Exception:
2024-07-04 17:20:49 +10:00
print(os.listdir(currentDirectory))
2024-07-15 10:03:44 +10:00
elif argList[0] == "cd":
try:
directoryForCD = argList[1]
if directoryForCD[0] == "~":
currentDirectory = expanduser("~") + directoryForCD.replace("~", "")
if directoryForCD[0] == "/":
currentDirectory = directoryForCD
2024-07-04 17:20:49 +10:00
else:
2024-07-15 10:03:44 +10:00
currentDirectory = (currentDirectory + "/" + directoryForCD)
except Exception:
print("Either a directory was not provided or an error occured.")
elif argList[0] == "history":
historyReadFile = open((expanduser("~") + "/.history.mash"))
print(historyReadFile.read())
elif argList[0] == "mtime":
print(datetime.now())
elif argList[0] == "printconf":
print(configFile)
# If a built in command isn't what you wanted, run a new subprocess.
else:
for word in mashPath:
if os.path.isfile(word + "/" + argList[0]):
argList[0] = (word + "/" + argList[0])
try:
subprocess.run(argList)
except Exception:
print("Command", command, "either doesn't exist, isn't in the path or isn't in this directory.")
2024-07-05 09:26:10 +10:00
2024-07-15 10:03:44 +10:00
# Write to the history file
2024-08-28 14:58:29 +10:00
historyFile = open((mashLocation + "/.history.mash"), "a")
2024-07-15 10:03:44 +10:00
historyFile.write(command)
historyFile.write("\n")
historyFile.close()
2024-07-05 09:42:14 +10:00
2024-07-15 10:03:44 +10:00
# Handle errors in the main loop
#except Exception:
#print("Looks like there was an error. Exiting...")
2024-07-05 09:42:14 +10:00
# Handle ^C
2024-07-15 10:03:44 +10:00
except KeyboardInterrupt:
print("\n")
mainLoop(currentDirectory)
2024-07-29 13:09:44 +10:00
mainLoop(initDirectory)