mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-31 15:12:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			237 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import os
 | |
| import sys
 | |
| import getopt
 | |
| import subprocess
 | |
| import signal
 | |
| import re
 | |
| 
 | |
| def check_unikid_json(infile, outfile, verbose=0):
 | |
|     if not os.path.exists(infile):
 | |
|         print "WARN: %s does not exist", infile
 | |
| 
 | |
|     try:
 | |
|         fi = open(infile, "r")
 | |
|     except IOError:
 | |
|         print "WARN: Unable to open %s", infile
 | |
|         sys.exit(2)
 | |
| 
 | |
|     lines = fi.readlines()
 | |
|     fi.close()
 | |
| 
 | |
|     try:
 | |
|         fo = open(outfile, "w+")
 | |
|     except IOError:
 | |
|         print "WARN: Unable to open %s", f
 | |
|         sys.exit(2)
 | |
| 
 | |
|     curid = 1
 | |
|     refcount = 0
 | |
|     idlist = {}
 | |
|     myid = []
 | |
|     for myline in lines:
 | |
|         if "{" in myline:
 | |
|             refcount += 1
 | |
|             myid.append(curid)
 | |
|             curid = 1
 | |
|             idlist[refcount] = {}
 | |
| 
 | |
|         if "}" in myline:
 | |
|             del idlist[refcount]
 | |
|             curid = myid.pop()
 | |
|             refcount -= 1
 | |
| 
 | |
|         try:
 | |
|             key_id, value = myline.split(":", 1)
 | |
|         except ValueError:
 | |
|             fo.write(myline)
 | |
|             continue
 | |
| 
 | |
|         key_id = key_id.strip('\"\t\n\r ')
 | |
|         value = value.strip(',\"\t\n\r ')
 | |
| 
 | |
|         if key_id in idlist[refcount]:
 | |
|             newkey_id = key_id + str(curid)
 | |
|             while newkey_id in idlist[refcount]:
 | |
|                 curid += 1
 | |
|                 newkey_id = key_id + str(curid)
 | |
| 
 | |
|             if verbose:
 | |
|                 print "level ", refcount, " : key ", key_id, " changed into ", newkey_id
 | |
| 
 | |
|             myline = myline.replace(key_id, newkey_id, 1)
 | |
|             key_id = newkey_id
 | |
| 
 | |
|         idlist[refcount][key_id] = value
 | |
|         fo.write(myline)
 | |
| 
 | |
|     fo.close()
 | |
| 
 | |
|     return
 | |
| 
 | |
| def check_suspend_json(infile, outfile, verbose=0):
 | |
|     if not os.path.exists(infile):
 | |
|         print "WARN: %s does not exist", infile
 | |
| 
 | |
|     try:
 | |
|         fi = open(infile, "r")
 | |
|     except IOError:
 | |
|         print "WARN: Unable to open %s", infile
 | |
|         sys.exit(2)
 | |
| 
 | |
|     lines = fi.readlines()
 | |
|     fi.close()
 | |
| 
 | |
|     try:
 | |
|         fo = open(outfile, "w+")
 | |
|     except IOError:
 | |
|         print "WARN: Unable to open %s", f
 | |
|         sys.exit(2)
 | |
| 
 | |
| 
 | |
|     taskobj = 0
 | |
|     curid = ""
 | |
|     for myline in lines:
 | |
| 
 | |
|         exception = 0
 | |
|         key_id = "exception"
 | |
| 
 | |
|         try:
 | |
|             key_id, value = myline.split(":", 1)
 | |
|         except ValueError:
 | |
|             if "suspend" in myline:
 | |
|                 key_id = "suspend"
 | |
|                 exception = 1
 | |
| 
 | |
|         key_id = key_id.strip('\"\t\n\r ')
 | |
| 
 | |
|         if not "tasks" in key_id and \
 | |
|            taskobj == 0:
 | |
|             fo.write(myline)
 | |
|             continue
 | |
| 
 | |
|         if "{" in myline:
 | |
|             taskobj += 1
 | |
|             if taskobj == 2:
 | |
|                 curid = key_id
 | |
| 
 | |
|         if "}" in myline:
 | |
|             taskobj -= 1
 | |
| 
 | |
|         if "suspend" in key_id and \
 | |
|            exception == 1:
 | |
| 
 | |
|             if verbose:
 | |
|                 print "value ", curid, " added to suspend key"
 | |
| 
 | |
|             if "," in myline:
 | |
|                 myline = myline.replace(",", " : " + "\"" + curid + "\",", 1)
 | |
|             else:
 | |
|                 myline = myline.replace("\n", " : " + "\"" + curid + "\"\n", 1)
 | |
| 
 | |
|         fo.write(myline)
 | |
| 
 | |
|     fo.close()
 | |
| 
 | |
|     return
 | |
| 
 | |
| # remove trailing commas that may appear after closing
 | |
| # brackets and last entries in every section
 | |
| def remove_trailing_commas(outfile):
 | |
|     try:
 | |
|         f = open(outfile, 'r+')
 | |
|     except IOError:
 | |
|         print "WARN: Unable to open %s", f
 | |
|         sys.exit(2)
 | |
| 
 | |
|     lines = f.read()
 | |
|     check_last_entry_regex = r'(.),(\n\s*})'
 | |
|     check_end_bracket_regex = r'(}),(\n\s*})'
 | |
| 
 | |
|     lines = re.sub(check_last_entry_regex, r'\g<1>\g<2>', lines)
 | |
|     lines = re.sub(check_end_bracket_regex, r'\g<1>\g<2>', lines)
 | |
| 
 | |
|     f.seek(0)
 | |
|     f.write(lines)
 | |
|     f.truncate()
 | |
|     f.close()
 | |
| 
 | |
|     return
 | |
| 
 | |
| 
 | |
| # Search for comments to remove
 | |
| def comment_remover(text):
 | |
|     def replacer(match):
 | |
|         s = match.group(0)
 | |
|         if s.startswith('/'):
 | |
|             return " " # note: a space and not an empty string
 | |
|         else:
 | |
|             return s
 | |
| 
 | |
|     pattern = re.compile(
 | |
|               r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
 | |
|                 re.DOTALL | re.MULTILINE)
 | |
| 
 | |
|     return re.sub(pattern, replacer, text)
 | |
| 
 | |
| # Remove all comments inside the file
 | |
| def remove_all_comments(outfile):
 | |
|     try:
 | |
|         f = open(outfile, 'r+')
 | |
|     except IOError:
 | |
|         print "WARN: Unable to open %s", f
 | |
|         sys.exit(2)
 | |
| 
 | |
|     lines = f.read()
 | |
| 
 | |
|     lines = comment_remover(lines)
 | |
|     f.seek(0)
 | |
|     f.write(lines)
 | |
|     f.truncate()
 | |
| 
 | |
|     f.close()
 | |
| 
 | |
|     return
 | |
| 
 | |
| if __name__ == '__main__':
 | |
| 
 | |
|     def handleSigTERM(signum, frame):
 | |
|         sys.exit()
 | |
| 
 | |
|     signal.signal(signal.SIGTERM, handleSigTERM)
 | |
|     signal.signal(signal.SIGINT, handleSigTERM)
 | |
| 
 | |
|     outfile = "unikid.json"
 | |
|     selfupdate = 0
 | |
|     verbose = 0
 | |
|     dry_run = False
 | |
| 
 | |
|     try:
 | |
|         opts, args = getopt.getopt(sys.argv[1:], "o:avd")
 | |
|     except getopt.GetoptError as err:
 | |
|         print str(err) # will print something like "option -a not recognized"
 | |
|         sys.exit(2)
 | |
| 
 | |
|     for o, a in opts:
 | |
|         if o == "-o":
 | |
|             outfile = a
 | |
|         if o == "-a":
 | |
|             selfupdate = 1
 | |
|         if o == "-v":
 | |
|             verbose = 1
 | |
|         if o == "-d":
 | |
|             dry_run = True
 | |
| 
 | |
|     for f in args:
 | |
|         if selfupdate:
 | |
|             outfile = f
 | |
| 
 | |
|         check_suspend_json(f, outfile)
 | |
|         check_unikid_json(outfile, outfile)
 | |
|         remove_trailing_commas(outfile)
 | |
|         remove_all_comments(outfile)
 | |
| 
 | |
|         if not dry_run:
 | |
|             subprocess.call(["rt-app", outfile])
 |