Welcome To Our Shell

Mister Spy & Souheyl Bypass Shell

Current Path : /home/cgabriel/20_dev/12_procpy/xy/

Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
Upload File :
Current File : //home/cgabriel/20_dev/12_procpy/xy/xyparser.py

# pyarmor pack  -e "\-F" xyparser.py

import os,re,sys,glob,time,datetime,random,json,hashlib,base64
from ecdsa import SigningKey,VerifyingKey   # ,NIST384p

#import mysql.connector    #    pip3 install  mysql-connector-python  (MySQL)     
#import pypyodbc           #    pip3 install pypyodbc                 (MS SQL)    
import sqlite3            #                                          (SQLite3)    

#   not working:

#import cx_Oracle         #    pip3 install cx_oracle (Linux works!) (Oracle)     
#import psycopg2          #    pip3 install psycopg2                 (PostgreSQL) 
#import mariadb           #    pip3 install mariadb                  (MariaDB)    
                          #    apt-get install mariadb-server mariadb-client libmariadbclient-dev
# from lark import Lark


def json1(x):
   return(json.dumps(x))

def hash1(x):
   return(hashlib.shake_256(bytearray(x,"utf8")).hexdigest(12))

class Rule ():
    pass

#**********************************************************************************

class XYparser ():

    def mark (self,remark=""):
    
        t = time.perf_counter()
        if self.t0 > 0:
            print ( ("%9.2f" % ((t-self.t0)*1000)) + " ms for:  " + remark )
        self.t0 = t

#**********************************************************************************

    def __init__ (self,*pars):
    

        self.t0   = -1.0
        self.dir  = pars[1]
        self.vkey = "913e4785a4472e3c70017c97a0b2602c4380f1cc018e9b5a71daba3731360981a4055c331eff51ac3f7e72cdfc28f46c"        
        self.id   = hashlib.shake_256(bytearray(str(time.time()),"utf8")).hexdigest(4)
        self.dbh  = None

#  1.  Check all the license files, and first of all, the hardcoded license

        text = None
        vkey = None

        for lic_file in ( [""] + glob.glob(self.dir[0]+"/*.license") ):
            if lic_file == "":
                try:
                    text = self.lic_file_hardcoded()
                    break
                except:
                    continue
            
            print("Check license file " + lic_file + " ...")
            m = re.search(r"^([0123456789abcdef])+(\S+)\.license",lic_file)
            if m:
                self.vkey = m.group(1)
                self.id   = m.group(2)
            
            zeilen    = open(lic_file).read().strip().split("\n")
            signature = ""
            while len(signature) < 90:
                m = re.search(r"^[0123456789abcdef]+$",zeilen[-1])
                if not m:
                    break
                signature = zeilen[-1] + signature
                zeilen.pop()
            text = ("\n".join(zeilen)).strip()

            try:    #  erstmal versuchen, ob die Signatur passt
                vkey = VerifyingKey.from_string( bytearray.fromhex(self.vkey))
                vkey.verify( bytearray.fromhex(signature) ,bytearray(text,"utf-8"))
                break
            except Exception as e:  #  wenn keine gueltige Signatur vorgefunden wird, dann neues Schluesselpaar generieren
                print(str(e))
                vkey = None
            
        if vkey == None:    #  keine gueltige Signatur
            if text == None:
                print("No license found.")
                return(None)
            self.show_new_keys(text)
            return(None)
            
        print("License ok.")

#  2.  Analyse the license file

        m = re.search(r"expiry\: +(\S+)",text.lower())
        if not m:
            print("No expiry date.")
            return(None)
        self.endtry     = ( datetime.datetime.strptime(m.group(1),"%Y/%m/%d") -
                            datetime.datetime.strptime("1970/01/01","%Y/%m/%d") ).total_seconds()

        m = re.search(r"start\: +(\S+)",text.lower())
        if not m:
            print("No start date.")
            return(None)
        self.starttry   = ( datetime.datetime.strptime(m.group(1),"%Y/%m/%d") -
                            datetime.datetime.strptime("1970/01/01","%Y/%m/%d") ).total_seconds()

        m = re.search(r"maxcycles\: +(\d+)",text.lower())
        if not m:
            print("No maxcycles.")
            return(None)
            return()
        self.max_cycles = int( m.group(1) )

        self.idouble    = 0   #  86400*7

        m = re.search(r"dbtype\: +(\S+)",text.lower())
        if not m:
            print("No dbtype.")
            return(None)
        self.dbtype    = m.group(1)

        m = re.search(r"dbfile\: +(\S+)",text.lower())
        if m:
            self.dbfile    = m.group(1)

        m = re.search(r"dburl\: +(\S+)",text.lower())
        if m:
            self.dburl     = m.group(1)

        m = re.search(r"dbuser\: +(\S+)",text.lower())
        if m:
            self.dbuser    = m.group(1)

        m = re.search(r"passwd\: +(\S+)",text.lower())
        if m:
            self.passwd    = m.group(1)

        m = re.search(r"database\: +(\S+)",text.lower())
        if m:
            self.database  = m.group(1)

        self.mark("start")
        self.sections = {}

#   3. Call a certain function

        if pars[0] == "__main__" and len(pars) > 2:
            self.__class__.__dict__[pars[2]](self,*pars[3:])
            return(None)
        else:
            self.__class__.__dict__["standard"](self,*pars[2:])
            return(None)

#**********************************************************************************

    def show_new_keys (self,text):

        print("")
        print("Actual verifying key: ",self.vkey)
        print("------------------------------------------------------------"+
              "-----------------------------------------------------------")
        skey1 = ""
        for keyfile in glob.glob(self.dir+"/*.keys"):   #  vielleicht findet man den signing key in der Liste
            for zeile in open(keyfile).read().split("\n"):
                if zeile.startswith(self.vkey):
                    m = re.search(r"^(.*?)([0123456789abcdef]+)",zeile[len(self.vkey):])
                    if m:
                        skey1 = m.group(2)
                        break
            if not skey1 == "":
                break
        
        if not skey1 == "":
            try:
                skey  = SigningKey.from_string( bytearray.fromhex(skey1))
            except:
                skey1 == ""
            
        new_keys_entry = 0
        if skey1 == "":
            skey  = SigningKey.generate()
            skey1 = skey.to_string().hex()
            new_keys_entry = 1
        
        print("New signing key:      ",skey1)
        vkey  = skey.verifying_key
        vkey1 = vkey.to_string().hex()
        print("New verifying key:    ",vkey1)
        try:
            os.mkdir(self.dir+"/generate")
        except:
            pass

        bed = 0
        for zeile in open(self.dir+"/generate/new.keys").read().split("\n"):
            if zeile.startswith(vkey1):
                bed = 1
                break
        if bed == 0:
            open(self.dir+"/generate/new.keys","a").write(vkey1 + "   " + skey1 + "\n")

        print("")
        print("Signed license file:")
        newsignature = skey.sign(bytearray(text,"utf-8")).hex()
        text = text + "\n\n" + newsignature[0:32] + "\n" + newsignature[32:64] + "\n" + newsignature[64:96] + "\n"
        print("")
        print(text)
        print("")
        open(self.dir + "/generate/" + vkey1 + "_" + self.id + ".license","w").write(text)
        
        pyfiles = glob.glob(self.dir+"/*xyparser*py")
        if len(pyfiles) > 0:
            text = open(pyfiles[0]).read()
            text = re.sub("\"([0123456789abcdef]{48})\"","\""+skey1+"\"",text)
            text = re.sub("\"([0123456789abcdef]{96})\"","\""+vkey1+"\"",text)
            open(self.dir + "/generate/xyparser_" + vkey1 + ".py","w").write(text)

#**********************************************************************************

    def sign_license (self,text):
    
        "64b95e70a62cfba0a08b5d152b75c5c23c4dc4036f1ec964"

#**********************************************************************************

    def dbh__database (self):
    

        print(self.dbtype)
        if not self.dbh:
            
            if self.dbtype[0:6] == "sqlite":
                self.dbh = sqlite3.connect(self.dbfile)

        return(self.dbh)

#**********************************************************************************

    def parse_db_rule (self):
    
        v            = Rule()   #  Check which variables are needed
        (e,f,g,h,i,j,k,l,m,n) = ( Rule(),Rule(),Rule(),Rule(),Rule(),
                                  Rule(),Rule(),Rule(),Rule(),Rule() )
        self.entries = []
        zaehler      = 0
        add_variable = ""
        var_types    = [" "*100,[]*100,1,0.9,None,{}]

        zaehler0 = 0
        while (0 == 0):
            zaehler0 = zaehler0 + 1
            if zaehler0 > 10000:
                return("115. Not parseable.")
            zaehler  = (zaehler + 1) % len(var_types)
            try:    #  Are enough variables set?
                self.execute_rule(v,e,f,g,h,i,j,k,l,m,n)
                break
            except Exception as ee:  #  No. We add one variable
                m = re.search(r"^(.*)attribute +\'(.*)\' *$",str(ee))
                if m:   #  ... and set it to None
                    add_variable          = m.group(2)
                    vars(v)[add_variable] = var_types[zaehler]
                    self.entries.append(m.group(2))   #  list the variable for the record
                else:  #  another fault at runtime, does not matter -> exit
                    if add_variable in vars(v):
                        del vars(v)[add_variable]
                    else:
#                        print(zaehler,add_variable)
                        vars(v)[add_variable] = var_types[zaehler]
                        self.entries.append(add_variable)   #  list the variable for the record

        (e,f,g,h,i,j,k,l,m,n) = (Rule(),Rule(),Rule(),Rule(),Rule(),Rule(),Rule(),Rule(),Rule(),Rule())
        return(v,e,f,g,h,i,j,k,l,m,n)


#****************************************************************************************

    def evaluate_db_rule (self,tree0):
    
        v = Rule()
        
#        self.mark("701")
        tree = tree0.split("\n")
        
        for entry in self.entries:

#            if "xxsequenceeditor".startswith(entry):
#                m = re.search(r"^(.*?)sequence +editor(.*)$",tree0,re.DOTALL|re.IGNORECASE)
#                if m:
#                    vars(v)[entry] = m.group(2).strip() + "\n"
#                    continue

            while (0 == 0):

                if entry in self.sections:   #  check whether entry has position info
                    if "_" in entry:
                        [entry0,entry1]    = entry.split("_")
                        [row0,row,col,anz] = self.sections[entry]
                    else:
                        entry1             = entry
                        [row,col,anz]      = self.sections[entry]
                        entry0             = None
                    if not entry0 or entry0 in tree[row0].replace(" ","").replace(".","").replace("-","").replace("(","").replace(")","").lower():
                        try:
                            spalten            = tree[row].split(";")
                            spalte             = spalten[col].replace(" ","").replace(".","").replace("-","").replace("(","").replace(")","")
                        except:
                            spalte = " x x x"
                        if spalte.lower().startswith(entry1): # check whether the
                            if   anz == 1:                    # position info is correct
                                vars(v)[entry] = spalten[col+1]
                            elif anz == 2:
                                vars(v)[entry] = spalten[col+1] + spalten[col+2]
                            elif anz == 9:
                                vals   = []
                                offset = 1
                                while (0 == 0):
                                    if not tree[row+offset].strip() == "":
                                        break
                                    offset = offset + 1
                                zusatz = tree[row+offset].split(";")
                                if zusatz[0].strip() == "":
                                    offset = offset + 1
                                else:
                                    zusatz = None
                                while (0 == 0):
                                    spalten3 = tree[row+offset].split(";")
                                    if len(spalten3) < 4 or len(spalten3) < col+1:
                                        break
                                    if zusatz and not spalten3[col].strip() == "":
                                        vals.append(spalten3[col]+zusatz[col])
                                    else:
                                        vals.append(spalten3[col])
                                    offset = offset + 1
                                vars(v)[entry] = vals
                            else:
                                text = ""
                                for zeile3 in tree[row:]:
                                    if zeile3.strip() == "":
                                        vars(v)[entry] = text
                                        break
                                    text = text + zeile3 + "\n"
                            break                 #  and go out, if it is the case

#-----------------------------------------------------------------------------------------

                if "_" in entry:      #  here we try to find the right position info
                    [entry0,entry1] = entry.split("_")
                    bed             = 0
                else:
                    entry0 = None
                    entry1 = entry
                    bed    = 1
   
                anz    =  0
                row    = -1
                row0   = -1
                zeile0 = ""
                for zeile in tree:
                
                    row = row + 1
                
                    if zeile.lower().startswith("index") or zeile.lower().startswith("line"):
                        zeile0 = zeile
                        continue

                    if entry0:
                        if zeile0.strip() == "":
                            zeile5 = zeile.replace(" ","").replace(".","").replace("-","")
                            zeile7 = zeile5.replace("(","").replace(")","").split(";")
                            if entry0 in zeile7[0].lower():
                                bed  = 1
                                row0 = row
                        if zeile.strip() == "":
                            bed = 0

                    col     = 0
                    spalten = zeile.split(";")
                
                    for spalte in spalten:
                        spalte1 = spalte.replace(" ","").replace(".","").replace("-","").replace("(","").replace(")","")
                        if bed == 1 and spalte1.replace(" ","").lower().startswith(entry1):
#                            print(entry,col,zeile0,zeile[0:30])
                            if entry0 and row0 == row:
                                anz = 9
                            elif col == 0 and zeile0.strip() == "":
                                anz = -1
                            elif len(spalten[col:]) < 3:
                                anz = 1
                            elif len(spalten[col:]) == 3:
                                anz = 2
                            elif re.search(r"^[A-Za-z][A-Za-z]$",spalten[col+2]):
                                anz = 2
                            else:
                                anz = 1
                            if entry0:
                                self.sections[entry] = [row0,row,col,anz]
                            else:
                                self.sections[entry] = [row,col,anz]
#                            print(entry,self.sections[entry])
                            break
                        col = col + 1
                
                    if not anz == 0:
                        break
                    zeile0 = zeile
                
                if anz == 0:
                    print("105. " + entry + " not found.")
                    return("105. Not found.")
        
 
        (e,f,g,h,i,j,k,l,m,n) = ( Rule(),Rule(),Rule(),Rule(),Rule(),
                                  Rule(),Rule(),Rule(),Rule(),Rule() )

#        self.mark("tree evaluated")
        self.execute_rule(v,e,f,g,h,i,j,k,l,m,n)
#        self.mark("dbcols set")
#        for x in vars(e):
#            print(vars(e)[x])
#        for x in vars(f):
#            print(vars(e)[x])
#        for x in vars(g):
#            print(vars(e)[x])
#        self.mark("printed")
        
        return(v,e,f,g,h,i,j,k,l,m,n)
        

#**********************************************************************************************

    def parsing_loop (self,wait_if_idle=100,processing_dirs=["."]):
    

        self.dbh__database()
        self.interval = 1.0 / float(self.max_cycles)


        time1 = time.time() - 0.001

        while (0 == 0):
        
            time0             = time1
            time1             = time.time()
            print(time0,time1)
            if time1 > self.endtry:
                print("Trial period is expired.")
                return()
            tdiff             = time1 - time0
            trialtime         = time1 - self.starttry
            halbwertsperioden = 0
            if self.idouble > 10:   #   Zeit, nach der sich das Auswerteintervall verdoppelt
                halbwertsperioden = int(trialtime/self.idouble)
#                print ("TT",trialtime,self.idouble)
            interval          = self.interval * 2**halbwertsperioden
            sleeptime         = interval - tdiff
#            print("HH",halbwertsperioden,tdiff,"SLEEP",sleeptime,"GESAMT",tdiff+sleeptime)
            if sleeptime > 0:
                time.sleep(sleeptime)
                time1 = time1 + sleeptime             
#            print(time1)            


            file_found = ""
            basedir    = ""

            processing_dirs1 = []
            for dir in processing_dirs:
                if dir[-2:] == "**":
                    dir  = dir[:-2]
                    processing_dirs1 = processing_dirs1 + [x(0) for x in os.walk(dir)]
                else:
                    processing_dirs1 = processing_dirs1 + glob.glob(dir)

            for dir in processing_dirs1:
                
                if not os.path.isfile(dir+"/"+self.id + ".id"):
                    open(dir+"/"+self.id+".id","w").write("1\n")

                dateilist = glob.glob(dir + "/*.csv")
                for datei in dateilist:
                    dateiroot = datei[0:-4]
                    if not os.path.isfile(dateiroot+".processed"):
                        if not os.path.isfile(dir+"/"+dateiroot+".process"):
                            open(dir+"/"+dateiroot+".process","w").write("1\n")
                            file_found = dateiroot
                            basedir    = dir
                            break
                        
                if not file_found == "":
                    break
            
            if file_found == "":
                print("")
                print( " No file found.","("+str(int(time.time()))+")")
                time.sleep(0.001*wait_if_idle)
#                return()
                continue
 
            if not os.path.isfile(basedir+"/"+self.id + ".id"):
                return("101")

            if ("%21.20f" % time.perf_counter())[-1] == "7":
                if len(glob.glob(basedir+"/*.id")) > 1:
                    return("102")
            
            print("Parse " + file_found+".csv","("+str(int(time.time()))+")")
            
            try:
                csv_file_text = open(file_found+".csv").read()
            except:
                csv_file_text = open(file_found+".csv",encoding="latin-1").read()

            (v,e,f,g,h,i,j,k,l,m,n) = self.evaluate_db_rule(csv_file_text)
            self.write_db(v,e,f,g,h,i,j,k,l,m,n)

            if "_delete_csv" in vars(v) and v._delete_csv == 1:
                os.unlink(file_found+".csv")
            else:
                open(dateiroot+".processed","w").write("1\n")
            os.unlink(dateiroot+".process")
            
                
#****************************************************************************************

    def write_db (self,v,e,f,g,h,i,j,k,l,m,n):

        self.mark("start_write_db")
        text = []

        try:
            v._keylen
        except:
            v._keylen = 4
                        
        try:
            v._speed
        except:
            v._speed = 1
            
        v._keylen = v._keylen * (1 + v._speed)

        cyclekey  = ""
        cursor = self.dbh.cursor()
        while (0 == 0):
            while (0 == 0):
                cyclekey = cyclekey + str(random.randint(100000000000,999999999999))  #  eindeutiger key des Zyklus
                if len(cyclekey) > 400:
                    break
            cyclekey = hashlib.shake_256(bytearray(cyclekey,"utf8"))  #  .hexdigest(6)
            cyclekey = cyclekey.hexdigest(v._keylen)
#            cyclekey = str( base64.b64encode(cyclekey.digest(6)), "utf-8" )
            if "+" in cyclekey or "/" in cyclekey:
                continue
                
            if v._speed == 1:   #  wenn dieser Test uebersprungen wird, dann sind auch die keys doppelt so lang
                break

            bed = 0
            for tabelle in ([e,f,g,h,i,j,k,l,m,n]):      #  gehe durch jede Tabelle und pruefe, ob schon
                try:                                     #  dieser cyclekey existiert
                    cursor.execute("select CYCLEKEY from " + tabelle.TABLE + " where CYCLEKEY='"+cyclekey+"'")
                except:
                    continue
                if cursor.fetchone():
                    bed = 1
                    break

            if bed == 0:
                break

        for tabelle in ([e,f,g,h,i,j,k,l,m,n]):      #  gehe durch jede Tabelle

            spalten   = []
            werte     = []
            tablename = ""
            cyclekey1 = cyclekey

            for x in vars(tabelle):    #  sammle alle Werte
                if x == "TABLE":
                    tablename = vars(tabelle)[x]
                elif x == "CYCLEKEY":
                    cyclekey1 = vars(tabelle)[x]
                else: 
                    spalten.append(x)
                    val = vars(tabelle)[x]
                    if not type(val) == type([]):
                        val = [val]
                    werte.append(val)
            if tablename == "":
                continue
            tpl = "INSERT INTO " + tablename + " (CYCLEKEY,CYCLECOUNT," + ",".join(spalten) + ") VALUES (\""+cyclekey1+"\",\""
            cursor = self.dbh.cursor()

        
            cyclecount = 0
            while (0 == 0):      #  schreibe alle zeilen als insert statements (zu jedem zyklus koennen mehrere werte
                                                        #  in der tabelle stehen)
                bed    = 0
                values = [str(cyclecount+1)]
                vdata  = []
                for x in werte:
                    if len(x) > cyclecount:
                        values.append('?')
                        vdata.append(x[cyclecount])
                        bed = 1
                    else:
                        values.append('?')
                        vdata.append(x[-1])
#                        values.append('')
                if bed == 0:
                    break
                join_values = '","'.join(values) + "\")"
                join_values = re.sub(r"\"\?\"","?",join_values,9999)
                text.append(tpl + join_values) 
                text.append(",".join(vdata))


                while (0 == 0):  #  add tables and columns as long as there are some missing

                    try:
                        if cursor.execute(tpl + join_values,vdata):
                            break
                    except Exception as e:
                        if re.search(r"^UNIQUE",str(e),re.IGNORECASE):
                            break
                        m = re.search(r"(Unknown +column .*?|no +column +named +)([A-Z0-9\_]+)",str(e))
                        if m:
                            o = m.group(2)   #  column extension
                            cursor.execute("alter table " + tablename + " add column " + o + " TEXT")
                            cursor.execute("create index " + o + "_" + tablename + "_idx on " + tablename + "(" + o + ")")
                        else:
                            m = re.search(r"(table|TABLE)",str(e))
                            if m:
                                cursor.execute("create table " + tablename + 
                                               "(CYCLEKEY TEXT,CYCLECOUNT TEXT, UNIQUE(CYCLEKEY,CYCLECOUNT))")
                                cursor.execute("create index CYCLEKEY_"+tablename+"_idx on " + tablename + "(CYCLEKEY)")
                            else:
                                print("117.",str(e))
                                return("117. " + str(e))  # if there is another error

                cyclecount = cyclecount + 1
            self.dbh.commit()
        
#        text = "\n".join(text) + "\n"
#        print(text)
        self.mark("end_write_db")
        return(text)
        

#****************************************************************************************

    exec('def execute_rule (self,V,E,F,G,H,I,J,K,L,M,N):\n\n' 
          + re.sub("\n","\n    ","\nself=''\n"+
            re.sub(r"json *\(","json1(",
            re.sub(r"hash *\(","hash1(",open(glob.glob("*.rule")[0]).read()))))
                   # self = '' for avoid hacking

#****************************************************************************************

    def standard (self,*pars):
    
        self.parse_db_rule()
        self.parsing_loop()

#****************************************************************************************
#****************************************************************************************

    def test1 (self,*pars):

        self.mark("A")
        self.xy16_parser()
        self.parse_db_rule('')
        erg = self.parser.parse(open("xyexample.csv").read())
        self.mark("B")

        for el in erg.find_data("servo"):
            for el1 in el.find_data("settingline"):
                print(el1.children[0].value)

        for ch in next(erg.find_data("values")).children:
            for vv in ch.children[0:3]:
                print(vv.value)
            print("")
        self.mark("C")

#    p.processing_dirs = (".")
#    p.parsing_loop()
    
#****************************************************************************************

    def test2 (self,*pars):
    
        self.parse_db_rule()
        self.mark("db rules parsed")
#        erg = self.parser.parse(open("xyexample.csv").read())
        erg = open("xyexample.csv").read()
        self.mark("file opened")
        (v,e,f,g,h,i,j,k,l,m,n) = self.evaluate_db_rule(erg)

        self.mark("dbcols set")
        for x in vars(e):
            print(x,vars(e)[x])
        for x in vars(f):
            print(x,vars(f)[x])
        for x in vars(g):
            print(x,vars(g)[x])
        self.mark("printed")




#****************************************************************************************

    def test3 (self,*pars):
    
        os.system("rm *rocess*")
        os.system("del *rocess*")
        self.parse_db_rule()
        self.mark("db rules parsed")

#        erg = self.parser.parse(open("xyexample.csv").read())

        self.parsing_loop()

#        erg = open("xyexample.csv").read()
#        self.mark("file opened")
#        self.evaluate_db_rule(erg)

#****************************************************************************************

    def test4 (self,*pars):
    
        skey = SigningKey.generate()

        skey = self.hex_to_byte(skey)
        skey = SigningKey.from_string(skey)

        vkey = skey.verifying_key
        
        signature = skey.sign(bytearray(open("xyexample.csv").read(),"utf-8"))
        print(skey.to_string().hex())
        print(signature.hex())        
        print(vkey.verify(signature,bytearray(open("xyexample1.csv").read(),"utf-8")))



#****************************************************************************************
#****************************************************************************************
#****************************************************************************************
#****************************************************************************************

#   DEL_BEGIN


    def xxxy16_parser (self):


        grammar = '''

start:          " "*  "\\n"*  header                        
                "\\n"+  index                         
                "\\n"+  resultinfo                    
                "\\n"+  procvalcurve
                "\\n"+  procvaleo               
                "\\n"+  eosettings                    
                "\\n"+  switchsignals     
                "\\n"+  deviceinfo
                "\\n"+  servo
                "\\n"+  channelx
                "\\n"+  channely             
                "\\n"+  cyclecontrol
                "\\n"+  evalsettings            
                "\\n"+  triggery              
                "\\n"+  blocksettings                 
                "\\n"*  measuringcurve                
                "\\n"*  values
                "\\n"*  sequence
                "\\n"*
                
           

header:         "Part protocol"
                "\\nFile name"                   filename
                "\\nProtocol version"            protocolversion

                filename:                        /;[A-Za-z0-9\-\_\-\.]*/
                protocolversion:                 /;[0-9\.]*/


index:          "Index;Result information;Process values - curve related;Process values - EO related;Evaluation objects settings;Switch signal settings;Device information;Servo;Channel-X settings;Channel-Y settings;Cycle control settings;Evaluation settings;Trigger Y settings;Block settings;Measuring curve;Measuring points;Sequence;"
                "\\nLine"                        linenumbers
                
                linenumbers:                     /;[0-9\;]*/


resultinfo:     "Result information"
                "\\nDate"                        date
                "\\nTime"                        time
                "\\nCycle number"                cyclenumber
                "\\nTotal result"                totalresult
                "\\nTriggered switch signals"    triggeredswitchsignals
                "\\nPart serial number"          partserialnumber
                "\\nMeasuring program name"      measuringprogramname
                "\\nMeasuring program number"    measuringprogramnumber
                "\\nZero X offset"               zeroxoffset
                "\\nTara Y offset"               tarayoffset

                date:                            /;\d\d\d\d\/\d\d\/\d\d/ 
                time:                            /;\d\d\:\d\d\:\d\d/
                cyclenumber:                     integer
                totalresult:                     /;(OK|NOK)/
                triggeredswitchsignals:          string
                partserialnumber:                string
                measuringprogramname:            string
                measuringprogramnumber:          integer
                zeroxoffset:                     number  unitx
                tarayoffset:                     number  unity
                
                integer:                         /;\d*/
                number:                          /;\-?\d*[,\.]?\d*/
                string:                          /;[A-Za-z\d\.\,\-\+\_\/\;\%\|\(\) ]*/
                unitx:                           /;[A-Za-z]+/
                unity:                           /;[A-Za-z]+/
                unitz:                           /;[A-Za-z\-]*/


procvalcurve:   "Process values - curve related"
                "\\nBlock X"                     curveblockx      ";XMIN-X"   curvexminx
                "\\nBlock Y"                     curveblocky      ";XMIN-Y"   curvexminy
                "\\nRef X"                       curverefx        ";XMAX-X"   curvexmaxx
                "\\nPeak-peak X"                 curvepeakpeakx   ";XMAX-Y"   curvexmaxy
                "\\nPeak-peak Y"                 curvepeakpeaky   ";YMIN-X"   curveyminx
                "\\n"                            ";"+             ";YMIN-Y"   curveyminy
                "\\n"                            ";"+             ";YMAX-X"   curveymaxx
                "\\n"                            ";"+             ";YMAX-Y"   curveymaxy
                
                curveblockx:                     number  unitx
                curveblocky:                     number  unity
                curverefx:                       number  unitx
                curvepeakpeakx:                  number  unitx
                curvepeakpeaky:                  number  unity
                
                curvexminx:                      number  unitx
                curvexminy:                      number  unity
                curvexmaxx:                      number  unitx
                curvexmaxy:                      number  unity
                curveyminx:                      number  unitx
                curveyminy:                      number  unity
                curveymaxx:                      number  unitx
                curveymaxy:                      number  unity
                


procvaleo:      "Process values - EO related"  procvaleocols
                "\\n"       dimprocessvalues
                "\\nEO-01"  eoaprocessvalues
                "\\nEO-02"  eobprocessvalues
                "\\nEO-03"  eocprocessvalues
                "\\nEO-04"  eodprocessvalues
                "\\nEO-05"  eoeprocessvalues
                "\\nEO-06"  eofprocessvalues
                "\\nEO-07"  eogprocessvalues
                "\\nEO-08"  eohprocessvalues
                "\\nEO-09"  eoiprocessvalues
                "\\nEO-10"  eojprocessvalues  

                procvaleocols:                   string

                dimprocessvalues:                string
                eoaprocessvalues:                string
                eobprocessvalues:                string
                eocprocessvalues:                string
                eodprocessvalues:                string
                eoeprocessvalues:                string
                eofprocessvalues:                string
                eogprocessvalues:                string
                eohprocessvalues:                string
                eoiprocessvalues:                string
                eojprocessvalues:                string



eosettings:     "Evaluation objects settings"    eosettingscols
                "\\nEO-01"  eoasettingsvalues
                "\\nEO-02"  eobsettingsvalues
                "\\nEO-03"  eocsettingsvalues
                "\\nEO-04"  eodsettingsvalues
                "\\nEO-05"  eoesettingsvalues
                "\\nEO-06"  eofsettingsvalues
                "\\nEO-07"  eogsettingsvalues
                "\\nEO-08"  eohsettingsvalues
                "\\nEO-09"  eoisettingsvalues
                "\\nEO-10"  eojsettingsvalues  

                eosettingscols:                   string

                eoasettingsvalues:                string
                eobsettingsvalues:                string
                eocsettingsvalues:                string
                eodsettingsvalues:                string
                eoesettingsvalues:                string
                eofsettingsvalues:                string
                eogsettingsvalues:                string
                eohsettingsvalues:                string
                eoisettingsvalues:                string
                eojsettingsvalues:                string



switchsignals:  "Switch signal settings"    switchsignalcols
                "\\nType S1"   switchsignala
                "\\nType S2"   switchsignalb
                
                switchsignalcols:                 string
                switchsignala:                    string
                switchsignalb:                    string
                

deviceinfo:     "Device information"      ";"*  ( "\\n"    settingline )+    "\\n"
servo:          "Servo"                   ";"*  ( "\\n"    settingline )+    "\\n"
channelx:       "Channel-X settings"      ";"*  ( "\\n"    settingline )+    "\\n"
channely:       "Channel-Y settings"      ";"*  ( "\\n"    settingline )+    "\\n"
cyclecontrol:   "Cycle control settings"  ";"*  ( "\\n"    settingline )+    "\\n"
evalsettings:   "Evaluation settings"     ";"*  ( "\\n"    settingline )+    "\\n"
triggery:       "Trigger Y settings"      ";"*  ( "\\n"    settingline )+    "\\n"
blocksettings:  "Block settings"          ";"*  ( "\\n"    settingline )+    "\\n"


measuringcurve: "Measuring curve"         ";"*  ( "\\n"    settingline )+    "\\n"+
                "Time"  settingline

values:         "\\n"  settingline  "\\n"  dataline+

sequence:       "Sequence Editor"      ";"*  ( "\\n"    settingline )+    "\\n"

                settingline:               /[A-Za-z\d\.\,\-\+\_\/\%\|\(\)\; ]+/
                dataline:                  /[\d\,\-\;]+/  "\\n"

'''

        grammar     = re.sub(r"\n +([a-z]+\:)","\n\\1",grammar,99999999,re.DOTALL)
        grammar     = re.sub(r"\n +([A-Z]+\:)","\n\\1",grammar,99999999,re.DOTALL)
        grammar     = re.sub("\n +([^\n])","  \\1",     grammar,99999999,re.DOTALL)
        self.parser = Lark(grammar,parser="lalr")

#****************************************************************************************

    def xxparse_db_rule (self,db_rule):
    
        self.db_rule = []
        self.entries = []

        zeilen = []      #  Multilines zusammenfuegen, Kommentare entfernen
        for zeile in db_rule.split("\n"):
            zeile1 = re.sub(r"\#.*$","",zeile)
            if zeile1.strip() == "":
                continue
            if zeile1[0] == " ":
                zeilen[-1] = zeilen[-1] + "  " + zeile1
            else:
                zeilen.append(zeile1)
                
        zeilen1 = []
        for zeile in zeilen:    #   Pre-Prozessor fuer 10 EOs
            if "[i]" in zeile:
                zaehler = "01"
                while (0 == 0):
                    zeilen1.append(re.sub(r"\[i\]",zaehler,zeile))
                    if zaehler == "10":
                        break
                    zaehler = "%02u" % (int(zaehler) + 1)
            else:
                zeilen1.append(zeile)


        for zeile in zeilen1:   #  Alle benoetigten Variablen auflisten
            
            while (0 == 0):
                m = re.search("^(.*?R\.)([A-Za-z][A-Za-z\_\d]*)(.*$)",text,re.DOTALL)
                if not m:
                    b = b + text
                    break
                val_field = m.group(2)
                if not val_field in self.entries:
                    self.entries.append(val_field)
                b = b + m.group(1) + "self.RULE['" + m.group(2) + "']"
                text = m.group(3)
            self.db_rule.append([a,b])

#****************************************************************************************

    def xxevaluate_db_rule (self,tree):
    
        v = Rule()
        e = Rule()
        
        for val_field in self.entries:
            
            print(val_field)
            vars(v)[val_field] = ""
            for ch in next(tree.find_data(val_field)).children:
                if type(ch).__name__ == "Tree":
                    vars(v)[val_field] += ch.children[0].value.replace(";","")
                else:
                    vars(v)[val_field] =  ch.value.replace(";","")

        self.mark("100")
        self.execute_rule(v,e)
        self.mark("101")
        print(vars(e))
        self.mark("102")
        
#   DEL_END


#****************************************************************************************

if __name__ == "__main__":
    
    XYparser(*tuple(["__main__"]+sys.argv[1:]))





bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped)
Email: contact@elmoujehidin.net bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped) Email: contact@elmoujehidin.net