diff options
-rw-r--r-- | meta/classes-recipe/testimage.bbclass | 6 | ||||
-rw-r--r-- | meta/lib/oeqa/utils/qemurunner.py | 21 |
2 files changed, 14 insertions, 13 deletions
diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-recipe/testimage.bbclass index 8d2fab21df..819c7d2bf4 100644 --- a/meta/classes-recipe/testimage.bbclass +++ b/meta/classes-recipe/testimage.bbclass | |||
@@ -189,11 +189,7 @@ def get_testimage_boot_patterns(d): | |||
189 | search_login_succeeded,search_cmd_finished\n Make sure your TESTIMAGE_BOOT_PATTERNS=%s \ | 189 | search_login_succeeded,search_cmd_finished\n Make sure your TESTIMAGE_BOOT_PATTERNS=%s \ |
190 | contains an accepted flag.' % d.getVar('TESTIMAGE_BOOT_PATTERNS')) | 190 | contains an accepted flag.' % d.getVar('TESTIMAGE_BOOT_PATTERNS')) |
191 | return | 191 | return |
192 | # We know boot prompt is searched through in binary format, others might be expressions | 192 | boot_patterns[flag] = flagval.encode().decode('unicode-escape') |
193 | if flag == 'search_reached_prompt': | ||
194 | boot_patterns[flag] = flagval.encode() | ||
195 | else: | ||
196 | boot_patterns[flag] = flagval.encode().decode('unicode-escape') | ||
197 | return boot_patterns | 193 | return boot_patterns |
198 | 194 | ||
199 | 195 | ||
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 948f8adc9f..6a85f57e49 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py | |||
@@ -85,7 +85,7 @@ class QemuRunner: | |||
85 | accepted_patterns = ['search_reached_prompt', 'send_login_user', 'search_login_succeeded', 'search_cmd_finished'] | 85 | accepted_patterns = ['search_reached_prompt', 'send_login_user', 'search_login_succeeded', 'search_cmd_finished'] |
86 | default_boot_patterns = defaultdict(str) | 86 | default_boot_patterns = defaultdict(str) |
87 | # Default to the usual paterns used to communicate with the target | 87 | # Default to the usual paterns used to communicate with the target |
88 | default_boot_patterns['search_reached_prompt'] = b' login:' | 88 | default_boot_patterns['search_reached_prompt'] = ' login:' |
89 | default_boot_patterns['send_login_user'] = 'root\n' | 89 | default_boot_patterns['send_login_user'] = 'root\n' |
90 | default_boot_patterns['search_login_succeeded'] = r"root@[a-zA-Z0-9\-]+:~#" | 90 | default_boot_patterns['search_login_succeeded'] = r"root@[a-zA-Z0-9\-]+:~#" |
91 | default_boot_patterns['search_cmd_finished'] = r"[a-zA-Z0-9]+@[a-zA-Z0-9\-]+:~#" | 91 | default_boot_patterns['search_cmd_finished'] = r"[a-zA-Z0-9]+@[a-zA-Z0-9\-]+:~#" |
@@ -109,12 +109,15 @@ class QemuRunner: | |||
109 | sock.close() | 109 | sock.close() |
110 | raise | 110 | raise |
111 | 111 | ||
112 | def decode_qemulog(self, todecode): | ||
113 | # Sanitize the data received from qemu as it may contain control characters | ||
114 | msg = todecode.decode("utf-8", errors='ignore') | ||
115 | msg = re_control_char.sub('', msg) | ||
116 | return msg | ||
117 | |||
112 | def log(self, msg): | 118 | def log(self, msg): |
113 | if self.logfile: | 119 | if self.logfile: |
114 | # It is needed to sanitize the data received from qemu | 120 | msg = self.decode_qemulog(msg) |
115 | # because is possible to have control characters | ||
116 | msg = msg.decode("utf-8", errors='ignore') | ||
117 | msg = re_control_char.sub('', msg) | ||
118 | self.msg += msg | 121 | self.msg += msg |
119 | with codecs.open(self.logfile, "a", encoding="utf-8") as f: | 122 | with codecs.open(self.logfile, "a", encoding="utf-8") as f: |
120 | f.write("%s" % msg) | 123 | f.write("%s" % msg) |
@@ -468,7 +471,9 @@ class QemuRunner: | |||
468 | self.log(data) | 471 | self.log(data) |
469 | 472 | ||
470 | data = b'' | 473 | data = b'' |
471 | if self.boot_patterns['search_reached_prompt'] in bootlog: | 474 | |
475 | decodedlog = self.decode_qemulog(bootlog) | ||
476 | if self.boot_patterns['search_reached_prompt'] in decodedlog: | ||
472 | self.server_socket = qemusock | 477 | self.server_socket = qemusock |
473 | stopread = True | 478 | stopread = True |
474 | reachedlogin = True | 479 | reachedlogin = True |
@@ -488,10 +493,10 @@ class QemuRunner: | |||
488 | self.logger.warning("Target didn't reach login banner in %d seconds (%s)" % | 493 | self.logger.warning("Target didn't reach login banner in %d seconds (%s)" % |
489 | (self.boottime, time.strftime("%D %H:%M:%S"))) | 494 | (self.boottime, time.strftime("%D %H:%M:%S"))) |
490 | tail = lambda l: "\n".join(l.splitlines()[-25:]) | 495 | tail = lambda l: "\n".join(l.splitlines()[-25:]) |
491 | bootlog = bootlog.decode("utf-8") | 496 | bootlog = self.decode_qemulog(bootlog) |
492 | # in case bootlog is empty, use tail qemu log store at self.msg | 497 | # in case bootlog is empty, use tail qemu log store at self.msg |
493 | lines = tail(bootlog if bootlog else self.msg) | 498 | lines = tail(bootlog if bootlog else self.msg) |
494 | self.logger.warning("Last 25 lines of text:\n%s" % lines) | 499 | self.logger.warning("Last 25 lines of text (%d):\n%s" % (len(bootlog), lines)) |
495 | self.logger.warning("Check full boot log: %s" % self.logfile) | 500 | self.logger.warning("Check full boot log: %s" % self.logfile) |
496 | self._dump_host() | 501 | self._dump_host() |
497 | self.stop() | 502 | self.stop() |