From 2349f69d36091268ab7e1f854f8d9c5cbfdab578 Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Thu, 21 Mar 2024 21:18:35 -0400 Subject: [PATCH] initial commit --- lib/mbs/framework/Application.py | 24 ++ lib/mbs/framework/ConsoleApplication.py | 6 + lib/mbs/framework/Guid.py | 337 ++++++++++++++++++ lib/mbs/framework/REPLApplication.py | 30 ++ lib/mbs/framework/__init__.py | 12 + .../__pycache__/Application.cpython-311.pyc | Bin 0 -> 1555 bytes .../ConsoleApplication.cpython-311.pyc | Bin 0 -> 673 bytes .../__pycache__/Guid.cpython-311.pyc | Bin 0 -> 13654 bytes .../REPLApplication.cpython-311.pyc | Bin 0 -> 1290 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 979 bytes 10 files changed, 409 insertions(+) create mode 100644 lib/mbs/framework/Application.py create mode 100644 lib/mbs/framework/ConsoleApplication.py create mode 100644 lib/mbs/framework/Guid.py create mode 100644 lib/mbs/framework/REPLApplication.py create mode 100644 lib/mbs/framework/__init__.py create mode 100644 lib/mbs/framework/__pycache__/Application.cpython-311.pyc create mode 100644 lib/mbs/framework/__pycache__/ConsoleApplication.cpython-311.pyc create mode 100644 lib/mbs/framework/__pycache__/Guid.cpython-311.pyc create mode 100644 lib/mbs/framework/__pycache__/REPLApplication.cpython-311.pyc create mode 100644 lib/mbs/framework/__pycache__/__init__.cpython-311.pyc diff --git a/lib/mbs/framework/Application.py b/lib/mbs/framework/Application.py new file mode 100644 index 0000000..1e9ccf1 --- /dev/null +++ b/lib/mbs/framework/Application.py @@ -0,0 +1,24 @@ +class Application: + + def start(self): + self.before_start_internal() + + self._start_internal() + + self.before_stop_internal() + + def before_start_internal(self): + pass + + def before_stop_internal(self): + pass + + def _start_internal(self): + pass + + def stop(self): + self._stop_internal() + + def _stop_internal(self): + exit(0) + \ No newline at end of file diff --git a/lib/mbs/framework/ConsoleApplication.py b/lib/mbs/framework/ConsoleApplication.py new file mode 100644 index 0000000..7988a9d --- /dev/null +++ b/lib/mbs/framework/ConsoleApplication.py @@ -0,0 +1,6 @@ +from .Application import Application + +class ConsoleApplication (Application): + + def clear(self): + print("\033c", end='') diff --git a/lib/mbs/framework/Guid.py b/lib/mbs/framework/Guid.py new file mode 100644 index 0000000..d3c7dcd --- /dev/null +++ b/lib/mbs/framework/Guid.py @@ -0,0 +1,337 @@ + +class UUIDParseFailureKind: + FORMAT = 2 + +class UUIDParseNumbers: + NOSPACE = 2 + +class UUIDParseResult: + + def __init__(self): + self.parsedGuid = Guid() + self.kind = None + self.message = None + + def setFailure(kind, message): + self.kind = kind + self.message = message + +class Guid: + + __urand = None + + def __init__(self, val : str = None): + if Guid.__urand is None: + Guid.__urand = open("/dev/urandom", "rb") + + self.value = val + + self.__a = 0 + self.__b = 0 + self.__c = 0 + self.__d = 0 + self.__e = 0 + self.__f = 0 + self.__g = 0 + self.__h = 0 + self.__i = 0 + self.__j = 0 + self.__k = 0 + + @staticmethod + def __stringToInt(guidString : str, parsePos : int, requiredLength : int, flags : int, result : int, parseResult): + parseWhat = guidString[parsePos:(parsePos+requiredLength)] + result = int(parseWhat, 16) + parsePos += requiredLength + return (parsePos, result) + + @staticmethod + def __tryParseGuidWithDashes(guidString : str) -> UUIDParseResult: + startPos = 0 + temp = 0 + templ = 0 + currentPos = 0 + result = UUIDParseResult() + hasDashes = True + + # check to see that it's the proper length + if guidString[0] == '{': + + if len(guidString) != 38 or guidString[37] != '}': + result.setFailure(UUIDParseFailureKind.FORMAT, "Format_GuidInvLen[{38]") + return result + + startPos = 1 + + elif guidString[0] == '(': + + if len(guidString) != 38 or guidString[37] != ')': + + result.setFailure(UUIDParseFailureKind.FORMAT, "Format_GuidInvLen[(38]") + return result + + startPos = 1 + + elif len(guidString) != 36: + + if len(guidString) != 32: + + result.setFailure(UUIDParseFailureKind.FORMAT, "Format_GuidInvLen[36]") + return result + + else: + + hasDashes = False + + if hasDashes: + + if (guidString[8 + startPos] != '-' or + guidString[13 + startPos] != '-' or + guidString[18 + startPos] != '-' or + guidString[23 + startPos] != '-'): + + result.setFailure(UUIDParseFailureKind.FORMAT, "Format_GuidDashes") + return result + + currentPos = startPos + + (parsePos, temp) = Guid.__stringToInt(guidString, currentPos, 8, UUIDParseNumbers.NOSPACE, temp, result) + result.parsedGuid.__a = temp + currentPos = parsePos + + if hasDashes: + currentPos = currentPos + 1; # Increment past the '-'; + + (parsePos, temp) = Guid.__stringToInt(guidString, currentPos, 4, UUIDParseNumbers.NOSPACE, temp, result) + result.parsedGuid.__b = temp + currentPos = parsePos + + if hasDashes: + currentPos = currentPos + 1 # Increment past the '-'; + + (parsePos, temp) = Guid.__stringToInt(guidString, currentPos, 4, UUIDParseNumbers.NOSPACE, temp, result) + result.parsedGuid.__c = temp + currentPos = parsePos + + if hasDashes: + currentPos = currentPos + 1 # Increment past the '-'; + + (parsePos, temp) = Guid.__stringToInt(guidString, currentPos, 4, UUIDParseNumbers.NOSPACE, temp, result) + result.parsedGuid.__d = temp >> 8 + result.parsedGuid.__e = temp + currentPos = parsePos + + if hasDashes: + currentPos = currentPos + 1 # Increment past the '-'; + startPos = currentPos + + (parsePos, templ) = Guid.__stringToInt(guidString, currentPos, 8, UUIDParseNumbers.NOSPACE, templ, result) + currentPos = parsePos + + (parsePos, temp2) = Guid.__stringToInt(guidString, currentPos, 4, UUIDParseNumbers.NOSPACE, templ, result) + + # /* + # if ($currentPos - $startPos != 12) { + # $result->setFailure(UUIDParseFailureKind::FORMAT, "Format_GuidInvLen(*)") + # return $result; + # } + # */ + result.parsedGuid.__j = temp2 >> 8 + result.parsedGuid.__k = temp2 + + temp = templ + result.parsedGuid.__f = temp >> 24 + result.parsedGuid.__g = temp >> 16 + result.parsedGuid.__h = temp >> 8 + result.parsedGuid.__i = temp + return result + + def parse(value : str): + if value is None: + return None + + result = Guid.__tryParseGuidWithDashes(value) + return result.parsedGuid + + def __eq__(self, other): + # /* + # if ( + # $uuid->clock_seq_hi_and_reserved == self.clock_seq_hi_and_reserved + # && $uuid->node == self.node + # && $uuid->time_hi_and_version == self.time_hi_and_version + # && $uuid->time_low == self.time_low + # && $uuid->time_mid == self.time_mid + # ) + # { + # return true; + # } + # */ + return ( + other.__a == self.__a + and other.__b == self.__b + and other.__c == self.__c + and other.__d == self.__d + and other.__e == self.__e + and other.__f == self.__f + and other.__g == self.__g + and other.__h == self.__h + and other.__i == self.__i + and other.__j == self.__j + and other.__k == self.__k + ) + + @staticmethod + def __init_bits(): + __pr_bits = False + if Guid.__urand is not None: + __pr_bits += Guid.__urand.read(16) + + if not self.__pr_bits: + fp = open ( '/dev/urandom', 'rb' ) + if fp is not False: + __pr_bits += fp.read(16) + fp.close() + + else: + + # If /dev/urandom isn't available (eg: in non-unix systems), use mt_rand(). + __pr_bits = "" + for cnt in range(0, 16): + __pr_bits += chr ( __mt_rand ( 0, 255 ) ) + + return __pr_bits + + """ + @brief Generates a Universally Unique IDentifier, version 4. + + This function generates a truly random UUID. The built in CakePHP String::uuid() function + is not cryptographically secure. You should uses this function instead. + + @see http://tools.ietf.org/html/rfc4122#section-4.4 + @see http://en.wikipedia.org/wiki/UUID + @return UUID A UUID, made up of 32 hex digits and 4 hyphens. + """ + @staticmethod + def generate(): + uuid = Guid() + __pr_bits = Guid.__init_bits() + + uuid.__a = (int(pr_bits[3]) << 24) | (int(pr_bits[2]) << 16) | (int(pr_bits[1]) << 8) | pr_bits[0] + uuid.__b = ((int(pr_bits[5]) << 8) | pr_bits[4]) + uuid.__c = ((int(pr_bits[7]) << 8) | pr_bits[6]) + uuid.__d = pr_bits[8] + uuid.__e = pr_bits[9] + uuid.__f = pr_bits[10] + uuid.__g = pr_bits[11] + uuid.__h = pr_bits[12] + uuid.__i = pr_bits[13] + uuid.__j = pr_bits[14] + uuid.__k = pr_bits[15] + + return uuid + + @staticmethod + def __hexToChar(a : int) -> str: + a = a & 0xf + + v = 0 + if a > 9: + v = a - 10 + 0x61 + else: + v = a + 0x30 + + return chr(v) + + @staticmethod + def __hexsToChars(a : int, b : int, hex : bool = False): + guidChars = "" + if hex: + guidChars = "0x" + + guidChars += Guid.__hexToChar(a >> 4) + guidChars += Guid.__hexToChar(a) + if hex: + guidChars += ",0x" + + guidChars += Guid.__hexToChar(b >> 4) + guidChars += Guid.__hexToChar(b) + return guidChars + + # public function __toString() + # { + # } + # public function __toStringFormat($includeDashes = true, $prefix = "{", $suffix = "}") + # { + # $guidChars = $prefix; + # $guidChars += Guid.__hexsToChars(self._a >> 24, self._a >> 16) + # $guidChars += Guid.__hexsToChars(self._a >> 8, self._a) + # if ($includeDashes) $guidChars += '-'; + # $guidChars += Guid.__hexsToChars(self._b >> 8, self._b) + # if ($includeDashes) $guidChars += '-'; + # $guidChars += Guid.__hexsToChars(self._c >> 8, self._c) + # if ($includeDashes) $guidChars += '-'; + # $guidChars += Guid.__hexsToChars(self._d, self._e) + # if ($includeDashes) $guidChars += '-'; + # $guidChars += Guid.__hexsToChars(self._f, self._g) + # $guidChars += Guid.__hexsToChars(self._h, self._i) + # $guidChars += Guid.__hexsToChars(self._j, self._k) + # $guidChars += $suffix; + # return $guidChars; + # } + + def format(input : str): + output = input + output = output[0:8] + "-" + output[8:(8+4)] + "-" + output[12:12+4] + "-" + output[16:16+4] + "-" + output[20:] + return "{" + output + "}" + + def get_value(self) -> str: + return self.value + + + def strip(self): + guidChars = "" + guidChars += Guid.__hexsToChars(self.__a >> 24, self.__a >> 16) + guidChars += Guid.__hexsToChars(self.__a >> 8, self.__a) + guidChars += Guid.__hexsToChars(self.__b >> 8, self.__b) + guidChars += Guid.__hexsToChars(self.__c >> 8, self.__c) + guidChars += Guid.__hexsToChars(self.__d, self.__e) + guidChars += Guid.__hexsToChars(self.__f, self.__g) + guidChars += Guid.__hexsToChars(self.__h, self.__i) + guidChars += Guid.__hexsToChars(self.__j, self.__k) + return guidChars.lower() + + def __str__(self): + # //return self.format(strtoupper( sprintf ( '%08s%04s%04x%04x%012s', self.time_low, self.time_mid, self.time_hi_and_version, self.clock_seq_hi_and_reserved, self.node ) )) + dash = True + guidChars = "{" + guidChars += Guid.__hexsToChars(self.__a >> 24, self.__a >> 16) + guidChars += Guid.__hexsToChars(self.__a >> 8, self.__a) + + if (dash): + guidChars += '-' + + guidChars += Guid.__hexsToChars(self.__b >> 8, self.__b) + if (dash): + guidChars += '-' + + guidChars += Guid.__hexsToChars(self.__c >> 8, self.__c) + if (dash): + guidChars += '-' + + guidChars += Guid.__hexsToChars(self.__d, self.__e) + if (dash): + guidChars += '-' + + guidChars += Guid.__hexsToChars(self.__f, self.__g) + guidChars += Guid.__hexsToChars(self.__h, self.__i) + guidChars += Guid.__hexsToChars(self.__j, self.__k) + guidChars += "}" + return guidChars.lower() + + @staticmethod + def create(): + + from uuid import uuid4 + u = uuid4() + g = Guid.parse(str(u)) + return g diff --git a/lib/mbs/framework/REPLApplication.py b/lib/mbs/framework/REPLApplication.py new file mode 100644 index 0000000..3c22e5e --- /dev/null +++ b/lib/mbs/framework/REPLApplication.py @@ -0,0 +1,30 @@ +from .ConsoleApplication import ConsoleApplication + +class REPLApplication (ConsoleApplication): + + def _start_internal(self): + + while (True): + # print ("open instance attribute relationship close") + inp = input(self.get_prompt()) + + if inp == "clear": + self.clear() + continue + + elif inp == "exit": + break + + elif inp == "help": + + continue + + self.process_input(inp) + + exit(0) + + def get_prompt(self): + return "> " + + def process_input(self, value): + pass \ No newline at end of file diff --git a/lib/mbs/framework/__init__.py b/lib/mbs/framework/__init__.py new file mode 100644 index 0000000..4ad0c4a --- /dev/null +++ b/lib/mbs/framework/__init__.py @@ -0,0 +1,12 @@ +from .Application import Application +from .ConsoleApplication import ConsoleApplication +from .Guid import Guid +from .REPLApplication import REPLApplication + +def format_cwd(arg : str): + import os + return arg.replace("/home/" + os.getlogin(), "~") + +def parse_cwd(arg : str): + import os + return arg.replace("~/", "/home/" + os.getlogin() + "/") \ No newline at end of file diff --git a/lib/mbs/framework/__pycache__/Application.cpython-311.pyc b/lib/mbs/framework/__pycache__/Application.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76dcbc017401862639ded33a0260be7d05075757 GIT binary patch literal 1555 zcmbtU&1)J_5T7@G<~yO$NIoQmK=9BA?ID*E=&3z<$<52M@oid(QS){~8Y#ts|AW__ zQY8P3iqNu9DD>2utv%(`nP+@#Ru6%`b$@T(%rNttd9!|5TABx1V*iixMgaWe!(>J8 zh0!hvZ9sSp5?Ua|4FcTKJ6=VQcnrBnX`h(&wWP9aWwKNIGF*$LB-qA;bHhh53v`?=aQr#N0V837# zW0~P+N;6I*g#9EOLq`;H5kGa}oYs_Mxt^^&t6cRQRkbVrN?5UO{AzXM))9Wxbt(}19TJ=RpoYi`gHnN%t|`!^{9PUCe0BRv))|xHG_=?&LS32=L$@ zn6SQwI0j~{B&^qlaQDO;eda5reo$lO>B z@?*^tO6YD9+|Ng#!_;-m=bX^0LD6 zqGerN+Lf_IEm8zMj*5pv@s+6*1Lq%4k)8)Vwp^iN;9}e=LDM|LXbiJMFt98zF$4o~ zBWd0AF~iRHK-PIahCx@R2^4Zd?;(bF$(Q3gkJR>r<{=5gh!A3kX+aUE;Wz94&M@eF F{{V_+HcS8j literal 0 HcmV?d00001 diff --git a/lib/mbs/framework/__pycache__/ConsoleApplication.cpython-311.pyc b/lib/mbs/framework/__pycache__/ConsoleApplication.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..226791cacfd157ff26558e00c7de059293a311d2 GIT binary patch literal 673 zcmZutF-yZh6n=L}skC;mI8UDBPs5Ofew8+nPaRYt%;i|4>l0G5KnM|3I1sGIQE7+HHL4%yk@n{m)(TA zGh`spWg_JTF$SiVeqB?VmEo?{(#rC^6Dzum&%$8a5}uB?BFAkwr&3#WSENkyEKu~9 rdpNg~cCo99NYKReAwu6^jJ?9z)Bn{s4TjaG;db+r{(jG(M#X*r?KYSO literal 0 HcmV?d00001 diff --git a/lib/mbs/framework/__pycache__/Guid.cpython-311.pyc b/lib/mbs/framework/__pycache__/Guid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00ef536b2ff95596d2ba26effd2c22715017e8bf GIT binary patch literal 13654 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 literal 0 HcmV?d00001 diff --git a/lib/mbs/framework/__pycache__/__init__.cpython-311.pyc b/lib/mbs/framework/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e07452e282c85bface5764b04537f62a2c8e0d1 GIT binary patch literal 979 zcmb7C&ubGw6rP#gB%8#bRw=Zn9y}O`E~Xw#5kacxL4q`RNh#~PGf9{3W|!Fwr9V=7 z@Fa-2Sw%34w1!^%Q#R1UvR6;N1p*#&^3B?mu2#^uZ@>BGy|-`Yeau0jkV9Y^`@x=J zguaW-#K;L5Re`)k6j5v;8`TjOoLJb#bsTfaA~va$n9G)AOLYl&ipdQ^(=X+E>V#*2 zr>Rmy#q2Ts4Ha>ezwf%1Y3RP`v|u~6=(Ie?V#%odsBKcnUR-+k^vRi2BPxJqLg@V~Q-)!P}^JwhD5;jFN5Ko6I>0#_K-d;b~+O7?t*+^6<18rjV=0qGX&_ zR~?(FW4zOsBI0;ahBMdF4HhX)=37qFZ1oAxKq)T(c%sML-1xTI_PA=9FI0EKUv*mZ zDm6X-hN~NEdXsr-gX=b1clesBX=cmxHSMOm5#<^Vw{>4L)+wKYMrqNp1h9)joZFod zPpIVI&MIi8irv4Iuxb9F_hk@x75J)J%y2O)mj#GB!^QZK