1#!/usr/bin/env python3 2# 3# SPDX-License-Identifier: GPL-2.0-only 4# 5# This file re-uses code spread throughout other Bitbake source files. 6# As such, all other copyrights belong to their own right holders. 7# 8 9 10import os 11import sys 12import json 13import pickle 14import codecs 15 16 17class EventPlayer: 18 """Emulate a connection to a bitbake server.""" 19 20 def __init__(self, eventfile, variables): 21 self.eventfile = eventfile 22 self.variables = variables 23 self.eventmask = [] 24 25 def waitEvent(self, _timeout): 26 """Read event from the file.""" 27 line = self.eventfile.readline().strip() 28 if not line: 29 return 30 try: 31 decodedline = json.loads(line) 32 if 'allvariables' in decodedline: 33 self.variables = decodedline['allvariables'] 34 return 35 if not 'vars' in decodedline: 36 raise ValueError 37 event_str = decodedline['vars'].encode('utf-8') 38 event = pickle.loads(codecs.decode(event_str, 'base64')) 39 event_name = "%s.%s" % (event.__module__, event.__class__.__name__) 40 if event_name not in self.eventmask: 41 return 42 return event 43 except ValueError as err: 44 print("Failed loading ", line) 45 raise err 46 47 def runCommand(self, command_line): 48 """Emulate running a command on the server.""" 49 name = command_line[0] 50 51 if name == "getVariable": 52 var_name = command_line[1] 53 variable = self.variables.get(var_name) 54 if variable: 55 return variable['v'], None 56 return None, "Missing variable %s" % var_name 57 58 elif name == "getAllKeysWithFlags": 59 dump = {} 60 flaglist = command_line[1] 61 for key, val in self.variables.items(): 62 try: 63 if not key.startswith("__"): 64 dump[key] = { 65 'v': val['v'], 66 'history' : val['history'], 67 } 68 for flag in flaglist: 69 dump[key][flag] = val[flag] 70 except Exception as err: 71 print(err) 72 return (dump, None) 73 74 elif name == 'setEventMask': 75 self.eventmask = command_line[-1] 76 return True, None 77 78 else: 79 raise Exception("Command %s not implemented" % command_line[0]) 80 81 def getEventHandle(self): 82 """ 83 This method is called by toasterui. 84 The return value is passed to self.runCommand but not used there. 85 """ 86 pass 87