From 53ee87635e63341e55d1774a244cbc2d867e8c9a Mon Sep 17 00:00:00 2001 From: Grzegorz Daniluk <grzegorz.daniluk@cern.ch> Date: Mon, 21 Jul 2014 17:48:26 +0200 Subject: [PATCH] adding host-side python tool to verify WRS flashing --- userspace/host_tools/flash-verify.py | 194 +++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100755 userspace/host_tools/flash-verify.py diff --git a/userspace/host_tools/flash-verify.py b/userspace/host_tools/flash-verify.py new file mode 100755 index 000000000..d6961b7b3 --- /dev/null +++ b/userspace/host_tools/flash-verify.py @@ -0,0 +1,194 @@ +#!/usr/bin/python + +# Simple script that verifies if all images stored to WR Switch match with +# firmware binaries +# +# Copyright (C) 2014, CERN. +# +# Author: Grzegorz Daniluk <grzegorz.daniluk@cern.ch> +# +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version +# 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import os +import subprocess +import sys +import argparse +import paramiko +import hashlib +import time +import socket + + +######################## +## SOME CONSTANTS ## +######################## + +#defualts +SSH_USER = "root" +SSH_PASSWD = "" +MAC1_DEF = "02:34:56:78:9A:BC" # taken from flash-wrs +MAC2_DEF = "02:34:56:78:9A:00" # taken from flash-wrs +BAREBOX = "barebox.bin" +AT91F_DEF = "at91bootstrap.bin" +BBF_DEF = "bb.bin" +#BBF_DEF = "barebox.bin" +IRAM_DEF = "wrs-initramfs.gz" +ZIMG_DEF = "zImage" + +#others +AT91_MTD = "/dev/mtd2" +BB_MTD = "/dev/mtd3" +BOOT_VOL = "ubi0:boot" +BOOT_MNTPT = "/tmp/boot/" + +#patterns to compare +AT91_IDX = 0 +BB_IDX = 1 +IRAM_IDX = 2 +ZIMG_IDX = 3 +orig_md5s = [] +orig_sz = [] +orig_fnames = [AT91F_DEF, BBF_DEF, IRAM_DEF, ZIMG_DEF] +read_fnames = ["at91_r.bin", "bb_r.bin", "", ""] +read_devs = [AT91_MTD, BB_MTD, BOOT_VOL] + +######################## +def verify_binaries(odir, host, passwd): + print "Connecting to " + host + client = paramiko.SSHClient() + client.load_system_host_keys() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + #now make the connection + try: + client.connect(host, 22, SSH_USER, passwd) + except socket.error: + print "Could not connect to WR Switch, bye..." + sys.exit(0) + + # 1. make dd of at91bootstrap.bin + # 2. make dd of barebox + for test_no in range(AT91_IDX, BB_IDX+1): + sys.stdout.write("checking " + orig_fnames[test_no] + "...") + sys.stdout.flush() + cmd = "dd if=" + read_devs[test_no] + stdin, stdout, stderr = client.exec_command(cmd) + md5 = hashlib.md5(stdout.read(orig_sz[test_no])).hexdigest() + stdin.close() + stdout.close() + stderr.close() + if md5 == orig_md5s[test_no]: + print "OK" + else: + print "Error" + + #prepare for next two: + stdin, stdout, stderr = client.exec_command("mkdir " + BOOT_MNTPT) + cmd = "mount -t ubifs " + BOOT_VOL + " " + BOOT_MNTPT # + ";sleep 1" + stdin, stdout, stderr = client.exec_command(cmd) + time.sleep(5) + + # 3. check wrs-initramfs.gz + # 4. check zImage + for test_no in range(IRAM_IDX, ZIMG_IDX+1): + sys.stdout.write("checking " + orig_fnames[test_no] + "...") + sys.stdout.flush() + cmd = "md5sum " + BOOT_MNTPT + orig_fnames[test_no] + stdin, stdout, stderr = client.exec_command(cmd) + md5 = stdout.readline().split()[0] + stdin.close() + stdout.close() + stderr.close() + if md5 == orig_md5s[test_no]: + print "OK" + else: + print "Error" + + cmd = "umount " + BOOT_MNTPT + client.exec_command(cmd) + client.exec_command("rmdir " + BOOT_MNTPT) + + # that one is special and different from previous ones + # 5. Hardcoded mess, make it somehow nicer + sys.stdout.write("checking /usr filesystem...") + sys.stdout.flush() + f = open("usr.tar", 'w') + stdin, stdout, stderr = client.exec_command("tar -C /usr --exclude=var/lib/snmp -cvf - .") + f.write(stdout.read()) + f.close() + subprocess.call('mkdir -p temp_wr; tar -C temp_wr -xf usr.tar', shell=True) + subprocess.call('find ./temp_wr -type f -print0 | xargs -0 md5sum > read.md5', shell=True) + subprocess.call('rm -rf temp_wr/*', shell=True) + #now the same for reference image + subprocess.call('mkdir -p temp_wr; tar -C temp_wr -xzf '+odir+'wrs-usr.tar.gz', shell=True) + subprocess.call('find ./temp_wr -type f -print0 | xargs -0 md5sum > orig.md5', shell=True) + sz, md5_orig = anl_file("orig.md5") + sz, md5 = anl_file("read.md5") + if md5 == md5_orig: + print "OK" + else: + print "Error" + # time for a clean-up + subprocess.call('rm -rf temp_wr usr.tar orig.md5 read.md5', shell=True) + + # disconnect from WRS when all is done + client.close() + +######################## +# makes bb.bin from barebox.bin based on _m1_ and _m2_ MACs the same way +# flash-wrs does it +def make_bb_bin(odir, m1, m2): + f = open(odir+BAREBOX, 'r') + f2 = open(odir+BBF_DEF, 'w') + for line in f: + line = line.replace(MAC1_DEF, m1) + line = line.replace(MAC2_DEF, m2) + f2.write(line) + f.close() + f2.close() + +# returns the size (in bytes) and md5 hash string of a file +def anl_file(filename): + f = open(filename, 'r') + f.seek(0, os.SEEK_END) + size = f.tell() #size of the file + f.seek(0, os.SEEK_SET) + md5 = hashlib.md5(f.read()).hexdigest() #md5 of the file + f.close() + return (size, md5) + +# fills orig_md5s & orig_sz arrays with sizes and md5 of orig files +def read_orig_files(odir): + for i in range(0, len(orig_fnames)): + sz, md5 = anl_file(odir+orig_fnames[i]) + orig_sz.insert(i, sz) + orig_md5s.insert(i, md5) + +def main(): + parser = argparse.ArgumentParser(description='Tool for verifying images flashed to WR Switch') + parser.add_argument('--ip', default="192.168.3.18", help='IP address of the WR Switch') + parser.add_argument('--passwd', default=SSH_PASSWD, help='SSH password for the device') + parser.add_argument('--odir', default="orig/", help='directory with files to be verified') + parser.add_argument('--m1', default="", help='mac 1, must be the same as m1 in flash-wrs') + parser.add_argument('--m2', default="", help='mac 2, must be the same as m2 in flash-wrs') + args = parser.parse_args() + + # first create modified barebox.bin copy the same way flash-wrs does it + make_bb_bin(args.odir, args.m1, args.m2) + read_orig_files(args.odir) + verify_binaries(args.odir, args.ip, args.passwd) + + +if __name__ == '__main__': + main() -- GitLab