Commit 1ed17e94b1aea32a988b4ca0f9213519de557bee
1 parent
05acf2c258
Exists in
master
전주기 시연용 응용 프로그램 추가
Showing
8 changed files
with
1556 additions
and
0 deletions
Show diff stats
go/src/fullcycle/analog-kernel/input-sample
... | ... | @@ -0,0 +1,294 @@ |
1 | +[ 0.000000] Booting Linux on physical CPU 0x0 | |
2 | +[ 0.000000] Linux version 4.9.80-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #1098 SMP Fri Mar 9 19:11:42 GMT 2018 | |
3 | +[ 0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7), cr=10c5383d | |
4 | +[ 0.000000] CPU: div instructions available: patching division code | |
5 | +[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache | |
6 | +[ 0.000000] OF: fdt:Machine model: Raspberry Pi 3 Model B Rev 1.2 | |
7 | +[ 0.000000] cma: Reserved 8 MiB at 0x3ac00000 | |
8 | +[ 0.000000] Memory policy: Data cache writealloc | |
9 | +[ 0.000000] percpu: Embedded 14 pages/cpu @ba35b000 s25600 r8192 d23552 u57344 | |
10 | +[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 240555 | |
11 | +[ 0.000000] Kernel command line: 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 console=ttyS0,115200 console=tty1 root=PARTUUID=c80dc558-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait | |
12 | +[ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes) | |
13 | +[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes) | |
14 | +[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes) | |
15 | +[ 0.000000] Memory: 940364K/970752K available (7168K kernel code, 487K rwdata, 2032K rodata, 1024K init, 770K bss, 22196K reserved, 8192K cma-reserved) | |
16 | +[ 0.000000] Virtual kernel memory layout: | |
17 | +[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) | |
18 | +[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB) | |
19 | +[ 0.000000] vmalloc : 0xbb800000 - 0xff800000 (1088 MB) | |
20 | +[ 0.000000] lowmem : 0x80000000 - 0xbb400000 ( 948 MB) | |
21 | +[ 0.000000] modules : 0x7f000000 - 0x80000000 ( 16 MB) | |
22 | +[ 0.000000] .text : 0x80008000 - 0x80800000 (8160 kB) | |
23 | +[ 0.000000] .init : 0x80b00000 - 0x80c00000 (1024 kB) | |
24 | +[ 0.000000] .data : 0x80c00000 - 0x80c79cbc ( 488 kB) | |
25 | +[ 0.000000] .bss : 0x80c7b000 - 0x80d3b9e4 ( 771 kB) | |
26 | +[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 | |
27 | +[ 0.000000] Hierarchical RCU implementation. | |
28 | +[ 0.000000] Build-time adjustment of leaf fanout to 32. | |
29 | +[ 0.000000] NR_IRQS:16 nr_irqs:16 16 | |
30 | +[ 0.000000] arm_arch_timer: Architected cp15 timer(s) running at 19.20MHz (phys). | |
31 | +[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x46d987e47, max_idle_ns: 440795202767 ns | |
32 | +[ 0.000007] sched_clock: 56 bits at 19MHz, resolution 52ns, wraps every 4398046511078ns | |
33 | +[ 0.000022] Switching to timer-based delay loop, resolution 52ns | |
34 | +[ 0.000301] Console: colour dummy device 80x30 | |
35 | +[ 0.001189] console [tty1] enabled | |
36 | +[ 0.001237] Calibrating delay loop (skipped), value calculated using timer frequency.. 38.40 BogoMIPS (lpj=192000) | |
37 | +[ 0.001304] pid_max: default: 32768 minimum: 301 | |
38 | +[ 0.001640] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes) | |
39 | +[ 0.001682] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes) | |
40 | +[ 0.002721] Disabling memory control group subsystem | |
41 | +[ 0.002825] CPU: Testing write buffer coherency: ok | |
42 | +[ 0.002889] ftrace: allocating 22627 entries in 67 pages | |
43 | +[ 0.050538] CPU0: update cpu_capacity 1024 | |
44 | +[ 0.050590] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 | |
45 | +[ 0.050651] Setting up static identity map for 0x100000 - 0x100034 | |
46 | +[ 0.052502] CPU1: update cpu_capacity 1024 | |
47 | +[ 0.052509] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 | |
48 | +[ 0.053151] CPU2: update cpu_capacity 1024 | |
49 | +[ 0.053158] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002 | |
50 | +[ 0.053782] CPU3: update cpu_capacity 1024 | |
51 | +[ 0.053788] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003 | |
52 | +[ 0.053876] Brought up 4 CPUs | |
53 | +[ 0.054049] SMP: Total of 4 processors activated (153.60 BogoMIPS). | |
54 | +[ 0.054078] CPU: All CPU(s) started in HYP mode. | |
55 | +[ 0.054105] CPU: Virtualization extensions available. | |
56 | +[ 0.054925] devtmpfs: initialized | |
57 | +[ 0.066064] VFP support v0.3: implementor 41 architecture 3 part 40 variant 3 rev 4 | |
58 | +[ 0.066387] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns | |
59 | +[ 0.066447] futex hash table entries: 1024 (order: 4, 65536 bytes) | |
60 | +[ 0.067005] pinctrl core: initialized pinctrl subsystem | |
61 | +[ 0.067938] NET: Registered protocol family 16 | |
62 | +[ 0.070178] DMA: preallocated 1024 KiB pool for atomic coherent allocations | |
63 | +[ 0.078975] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers. | |
64 | +[ 0.079024] hw-breakpoint: maximum watchpoint size is 8 bytes. | |
65 | +[ 0.079206] Serial: AMBA PL011 UART driver | |
66 | +[ 0.081108] bcm2835-mbox 3f00b880.mailbox: mailbox enabled | |
67 | +[ 0.081656] uart-pl011 3f201000.serial: could not find pctldev for node /soc/gpio@7e200000/uart0_pins, deferring probe | |
68 | +[ 0.082020] irq: no irq domain found for /soc/aux@0x7e215000 ! | |
69 | +[ 0.151380] bcm2835-dma 3f007000.dma: DMA legacy API manager at bb80d000, dmachans=0x1 | |
70 | +[ 0.153246] SCSI subsystem initialized | |
71 | +[ 0.153569] usbcore: registered new interface driver usbfs | |
72 | +[ 0.153679] usbcore: registered new interface driver hub | |
73 | +[ 0.153796] usbcore: registered new device driver usb | |
74 | +[ 0.160347] raspberrypi-firmware soc:firmware: Attached to firmware from 2018-03-13 18:45 | |
75 | +[ 0.161752] clocksource: Switched to clocksource arch_sys_counter | |
76 | +[ 0.209297] VFS: Disk quotas dquot_6.6.0 | |
77 | +[ 0.209409] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) | |
78 | +[ 0.209638] FS-Cache: Loaded | |
79 | +[ 0.209906] CacheFiles: Loaded | |
80 | +[ 0.222053] NET: Registered protocol family 2 | |
81 | +[ 0.222946] TCP established hash table entries: 8192 (order: 3, 32768 bytes) | |
82 | +[ 0.223084] TCP bind hash table entries: 8192 (order: 4, 65536 bytes) | |
83 | +[ 0.223295] TCP: Hash tables configured (established 8192 bind 8192) | |
84 | +[ 0.223407] UDP hash table entries: 512 (order: 2, 16384 bytes) | |
85 | +[ 0.223474] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes) | |
86 | +[ 0.223706] NET: Registered protocol family 1 | |
87 | +[ 0.224139] RPC: Registered named UNIX socket transport module. | |
88 | +[ 0.224171] RPC: Registered udp transport module. | |
89 | +[ 0.224199] RPC: Registered tcp transport module. | |
90 | +[ 0.224226] RPC: Registered tcp NFSv4.1 backchannel transport module. | |
91 | +[ 0.225201] hw perfevents: enabled with armv7_cortex_a7 PMU driver, 7 counters available | |
92 | +[ 0.227516] workingset: timestamp_bits=14 max_order=18 bucket_order=4 | |
93 | +[ 0.243575] FS-Cache: Netfs 'nfs' registered for caching | |
94 | +[ 0.244570] NFS: Registering the id_resolver key type | |
95 | +[ 0.244620] Key type id_resolver registered | |
96 | +[ 0.244648] Key type id_legacy registered | |
97 | +[ 0.247075] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251) | |
98 | +[ 0.247226] io scheduler noop registered | |
99 | +[ 0.247256] io scheduler deadline registered (default) | |
100 | +[ 0.247542] io scheduler cfq registered | |
101 | +[ 0.253205] BCM2708FB: allocated DMA memory fad10000 | |
102 | +[ 0.253258] BCM2708FB: allocated DMA channel 0 @ bb80d000 | |
103 | +[ 0.261949] Console: switching to colour frame buffer device 82x26 | |
104 | +[ 0.269369] Serial: 8250/16550 driver, 1 ports, IRQ sharing enabled | |
105 | +[ 0.273301] bcm2835-rng 3f104000.rng: hwrng registered | |
106 | +[ 0.275682] vc-mem: phys_addr:0x00000000 mem_base=0x3ec00000 mem_size:0x40000000(1024 MiB) | |
107 | +[ 0.280940] vc-sm: Videocore shared memory driver | |
108 | +[ 0.298295] brd: module loaded | |
109 | +[ 0.309480] loop: module loaded | |
110 | +[ 0.311864] Loading iSCSI transport class v2.0-870. | |
111 | +[ 0.314857] libphy: Fixed MDIO Bus: probed | |
112 | +[ 0.317213] usbcore: registered new interface driver lan78xx | |
113 | +[ 0.319579] usbcore: registered new interface driver smsc95xx | |
114 | +[ 0.321831] dwc_otg: version 3.00a 10-AUG-2012 (platform bus) | |
115 | +[ 0.552154] Core Release: 2.80a | |
116 | +[ 0.554363] Setting default values for core params | |
117 | +[ 0.556552] Finished setting default values for core params | |
118 | +[ 0.759140] Using Buffer DMA mode | |
119 | +[ 0.761337] Periodic Transfer Interrupt Enhancement - disabled | |
120 | +[ 0.763656] Multiprocessor Interrupt Enhancement - disabled | |
121 | +[ 0.765971] OTG VER PARAM: 0, OTG VER FLAG: 0 | |
122 | +[ 0.768319] Dedicated Tx FIFOs mode | |
123 | +[ 0.770929] WARN::dwc_otg_hcd_init:1032: FIQ DMA bounce buffers: virt = 0xbad04000 dma = 0xfad04000 len=9024 | |
124 | +[ 0.775666] FIQ FSM acceleration enabled for : | |
125 | +[ 0.775666] Non-periodic Split Transactions | |
126 | +[ 0.775666] Periodic Split Transactions | |
127 | +[ 0.775666] High-Speed Isochronous Endpoints | |
128 | +[ 0.775666] Interrupt/Control Split Transaction hack enabled | |
129 | +[ 0.786746] WARN::hcd_init_fiq:459: FIQ on core 1 at 0x8059b380 | |
130 | +[ 0.789026] WARN::hcd_init_fiq:460: FIQ ASM at 0x8059b6f0 length 36 | |
131 | +[ 0.791285] WARN::hcd_init_fiq:486: MPHI regs_base at 0xbb878000 | |
132 | +[ 0.793550] dwc_otg 3f980000.usb: DWC OTG Controller | |
133 | +[ 0.795866] dwc_otg 3f980000.usb: new USB bus registered, assigned bus number 1 | |
134 | +[ 0.798224] dwc_otg 3f980000.usb: irq 62, io mem 0x00000000 | |
135 | +[ 0.800538] Init: Port Power? op_state=1 | |
136 | +[ 0.802811] Init: Power Port (0) | |
137 | +[ 0.805198] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002 | |
138 | +[ 0.807508] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 | |
139 | +[ 0.809802] usb usb1: Product: DWC OTG Controller | |
140 | +[ 0.812061] usb usb1: Manufacturer: Linux 4.9.80-v7+ dwc_otg_hcd | |
141 | +[ 0.814327] usb usb1: SerialNumber: 3f980000.usb | |
142 | +[ 0.817410] hub 1-0:1.0: USB hub found | |
143 | +[ 0.819607] hub 1-0:1.0: 1 port detected | |
144 | +[ 0.822544] usbcore: registered new interface driver usb-storage | |
145 | +[ 0.824871] mousedev: PS/2 mouse device common for all mice | |
146 | +[ 0.827965] bcm2835-wdt 3f100000.watchdog: Broadcom BCM2835 watchdog timer | |
147 | +[ 0.830488] bcm2835-cpufreq: min=600000 max=1200000 | |
148 | +[ 0.833165] sdhci: Secure Digital Host Controller Interface driver | |
149 | +[ 0.835478] sdhci: Copyright(c) Pierre Ossman | |
150 | +[ 0.838000] sdhost-bcm2835 3f202000.sdhost: could not get clk, deferring probe | |
151 | +[ 0.842594] mmc-bcm2835 3f300000.mmc: could not get clk, deferring probe | |
152 | +[ 0.845137] sdhci-pltfm: SDHCI platform and OF driver helper | |
153 | +[ 0.849016] ledtrig-cpu: registered to indicate activity on CPUs | |
154 | +[ 0.851668] hidraw: raw HID events driver (C) Jiri Kosina | |
155 | +[ 0.854366] usbcore: registered new interface driver usbhid | |
156 | +[ 0.856826] usbhid: USB HID core driver | |
157 | +[ 0.860069] vchiq: vchiq_init_state: slot_zero = 0xbad80000, is_master = 0 | |
158 | +[ 0.863954] [vc_sm_connected_init]: start | |
159 | +[ 0.872620] [vc_sm_connected_init]: end - returning 0 | |
160 | +[ 0.875442] Initializing XFRM netlink socket | |
161 | +[ 0.877894] NET: Registered protocol family 17 | |
162 | +[ 0.880431] Key type dns_resolver registered | |
163 | +[ 0.883248] Registering SWP/SWPB emulation handler | |
164 | +[ 0.886437] registered taskstats version 1 | |
165 | +[ 0.895220] uart-pl011 3f201000.serial: cts_event_workaround enabled | |
166 | +[ 0.897794] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 87, base_baud = 0) is a PL011 rev2 | |
167 | +[ 0.904299] console [ttyS0] disabled | |
168 | +[ 0.906753] 3f215040.serial: ttyS0 at MMIO 0x0 (irq = 220, base_baud = 31250000) is a 16550 | |
169 | +[ 1.899569] console [ttyS0] enabled | |
170 | +[ 1.906298] sdhost: log_buf @ bad07000 (fad07000) | |
171 | +[ 1.991780] mmc0: sdhost-bcm2835 loaded - DMA enabled (>1) | |
172 | +[ 2.001958] mmc-bcm2835 3f300000.mmc: mmc_debug:0 mmc_debug2:0 | |
173 | +[ 2.010292] mmc-bcm2835 3f300000.mmc: DMA channel allocated | |
174 | +[ 2.039017] Indeed it is in host mode hprt0 = 00021501 | |
175 | +[ 2.131876] of_cfs_init | |
176 | +[ 2.133893] random: fast init done | |
177 | +[ 2.142450] of_cfs_init: OK | |
178 | +[ 2.147979] Waiting for root device PARTUUID=c80dc558-02... | |
179 | +[ 2.151869] mmc1: queuing unknown CIS tuple 0x80 (2 bytes) | |
180 | +[ 2.153435] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) | |
181 | +[ 2.155002] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) | |
182 | +[ 2.157820] mmc1: queuing unknown CIS tuple 0x80 (7 bytes) | |
183 | +[ 2.213728] mmc0: host does not support reading read-only switch, assuming write-enable | |
184 | +[ 2.232871] mmc0: new high speed SDHC card at address aaaa | |
185 | +[ 2.241224] mmcblk0: mmc0:aaaa SC16G 14.8 GiB | |
186 | +[ 2.247801] usb 1-1: new high-speed USB device number 2 using dwc_otg | |
187 | +[ 2.256822] Indeed it is in host mode hprt0 = 00001101 | |
188 | +[ 2.329935] mmcblk0: p1 p2 | |
189 | +[ 2.357583] mmc1: new high speed SDIO card at address 0001 | |
190 | +[ 2.427039] EXT4-fs (mmcblk0p2): INFO: recovery required on readonly filesystem | |
191 | +[ 2.436690] EXT4-fs (mmcblk0p2): write access will be enabled during recovery | |
192 | +[ 2.458484] EXT4-fs (mmcblk0p2): recovery complete | |
193 | +[ 2.467210] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) | |
194 | +[ 2.479804] VFS: Mounted root (ext4 filesystem) readonly on device 179:2. | |
195 | +[ 2.492049] usb 1-1: New USB device found, idVendor=0424, idProduct=9514 | |
196 | +[ 2.500151] devtmpfs: mounted | |
197 | +[ 2.506664] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 | |
198 | +[ 2.518166] Freeing unused kernel memory: 1024K | |
199 | +[ 2.526223] hub 1-1:1.0: USB hub found | |
200 | +[ 2.532766] hub 1-1:1.0: 5 ports detected | |
201 | +[ 2.851799] usb 1-1.1: new high-speed USB device number 3 using dwc_otg | |
202 | +[ 2.960961] systemd[1]: System time before build time, advancing clock. | |
203 | +[ 2.982100] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00 | |
204 | +[ 2.991832] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 | |
205 | +[ 3.004854] smsc95xx v1.0.5 | |
206 | +[ 3.081379] NET: Registered protocol family 10 | |
207 | +[ 3.102250] ip_tables: (C) 2000-2006 Netfilter Core Team | |
208 | +[ 3.105781] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-3f980000.usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:d1:b3:bf | |
209 | +[ 3.152858] systemd[1]: systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN) | |
210 | +[ 3.180405] systemd[1]: Detected architecture arm. | |
211 | +[ 3.204807] systemd[1]: Set hostname to <raspberrypi>. | |
212 | +[ 3.655243] systemd[1]: Listening on udev Kernel Socket. | |
213 | +[ 3.666913] systemd[1]: Started Forward Password Requests to Wall Directory Watch. | |
214 | +[ 3.683625] systemd[1]: Listening on Journal Socket. | |
215 | +[ 3.694815] systemd[1]: Listening on Syslog Socket. | |
216 | +[ 3.706356] systemd[1]: Created slice System Slice. | |
217 | +[ 3.719823] systemd[1]: Mounting RPC Pipe File System... | |
218 | +[ 3.735831] systemd[1]: Starting Restore / save the current clock... | |
219 | +[ OK ] Started Show Plymouth Boot Screen. | |
220 | +[ OK ] Reached target Encrypted Volumes. | |
221 | +[ OK ] Reached target Paths. | |
222 | +[ OK ] Started Forward Password Requests to Plymouth Directory Watch. | |
223 | +[ OK ] Started File System Check on /dev/disk/by-partuuid/c80dc558-01. | |
224 | + Mounting /boot... | |
225 | +[ OK ] Mounted /boot. | |
226 | +[ OK ] Reached target Local File Systems. | |
227 | + Starting Set console font and keymap... | |
228 | + Starting Tell Plymouth To Write Out Runtime Data... | |
229 | + Starting Raise network interfaces... | |
230 | + Starting Preprocess NFS configuration... | |
231 | + Starting Create Volatile Files and Directories... | |
232 | +[ OK ] Started Tell Plymouth To Write Out Runtime Data. | |
233 | +[ OK ] Started Preprocess NFS configuration. | |
234 | +[ OK ] Reached target NFS client services. | |
235 | +[ OK ] Reached target Remote File Systems (Pre). | |
236 | +[ OK ] Reached target Remote File Systems. | |
237 | +[ OK ] Started Create Volatile Files and Directories. | |
238 | + Starting Network Time Synchronization... | |
239 | + Starting Update UTMP about System Boot/Shutdown... | |
240 | +[ OK ] Started Update UTMP about System Boot/Shutdown. | |
241 | +[ OK ] Started Network Time Synchronization. | |
242 | +[ OK ] Reached target System Initialization. | |
243 | +[ OK ] Listening on triggerhappy.socket. | |
244 | +[ OK ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket. | |
245 | +[ OK ] Listening on D-Bus System Message Bus Socket. | |
246 | +[ OK ] Reached target Sockets. | |
247 | +[ OK ] Reached target Basic System. | |
248 | + Starting LSB: Switch to ondemand cpu…or (unless shift key is pressed)... | |
249 | + Starting System Logging Service... | |
250 | + Starting LSB: Autogenerate and use a swap file... | |
251 | +[ OK ] Started Regular background program processing daemon. | |
252 | + Starting dhcpcd on all interfaces... | |
253 | + Starting triggerhappy global hotkey daemon... | |
254 | + Starting Save/Restore Sound Card State... | |
255 | + Starting Configure Bluetooth Modems connected by UART... | |
256 | + Starting Avahi mDNS/DNS-SD Stack... | |
257 | +[ OK ] Started D-Bus System Message Bus. | |
258 | +[ OK ] Started Avahi mDNS/DNS-SD Stack. | |
259 | + Starting Disable WiFi if country not set... | |
260 | +[ OK ] Started Daily Cleanup of Temporary Directories. | |
261 | + Starting Login Service... | |
262 | +[ OK ] Reached target System Time Synchronized. | |
263 | +[ OK ] Started Daily apt download activities. | |
264 | +[ OK ] Started Daily apt upgrade and clean activities. | |
265 | +[ OK ] Reached target Timers. | |
266 | +[ OK ] Started triggerhappy global hotkey daemon. | |
267 | +[ OK ] Started System Logging Service. | |
268 | +[ OK ] Started Save/Restore Sound Card State. | |
269 | +[ OK ] Started Disable WiFi if country not set. | |
270 | + Starting Load/Save RF Kill Switch Status... | |
271 | +[ OK ] Started Login Service. | |
272 | +[ OK ] Started Raise network interfaces. | |
273 | +[ OK ] Started LSB: Switch to ondemand cpu …rnor (unless shift key is pressed). | |
274 | +[ OK ] Started Load/Save RF Kill Switch Status. | |
275 | +[ OK ] Started LSB: Autogenerate and use a swap file. | |
276 | +[ OK ] Started Configure Bluetooth Modems connected by UART. | |
277 | + Starting Bluetooth service... | |
278 | +[ OK ] Started Bluetooth service. | |
279 | +[ OK ] Reached target Bluetooth. | |
280 | + Starting Hostname Service... | |
281 | +[ OK ] Started Hostname Service. | |
282 | +[ OK ] Started Set console font and keymap. | |
283 | +[ OK ] Started dhcpcd on all interfaces. | |
284 | +[ OK ] Reached target Network. | |
285 | + Starting /etc/rc.local Compatibility... | |
286 | + Starting Permit User Sessions... | |
287 | +[ OK ] Started /etc/rc.local Compatibility. | |
288 | +[ OK ] Started Permit User Sessions. | |
289 | + Starting Terminate Plymouth Boot Screen... | |
290 | + Starting Hold until boot process finishes up... | |
291 | + | |
292 | +Raspbian GNU/Linux 9 raspberrypi ttyS0 | |
293 | +raspberrypi login: | |
294 | +end of kernel | ... | ... |
go/src/fullcycle/analog-kernel/main.go
... | ... | @@ -0,0 +1,100 @@ |
1 | +package main | |
2 | + | |
3 | +import ( | |
4 | + "bufio" | |
5 | + "encoding/json" | |
6 | + "fmt" | |
7 | + "io/ioutil" | |
8 | + "log" | |
9 | + "os" | |
10 | + | |
11 | + "fullcycle/analog-kernel/parser" | |
12 | +) | |
13 | + | |
14 | +const defaultResult = ` | |
15 | +{ | |
16 | + "result": { | |
17 | + "cpu" : { | |
18 | + "name": "ARMv7 Processor", | |
19 | + "id": "410fd034", | |
20 | + "revision": "4", | |
21 | + "arch": "ARMv7", | |
22 | + "cr": "10c5383d" | |
23 | + }, | |
24 | + | |
25 | + "model" : { | |
26 | + "model": "Raspberry Pi 3 Model B Rev 1.2" | |
27 | + } | |
28 | + }, | |
29 | + | |
30 | + "report": { | |
31 | + "log_id": "012-3233-4423", | |
32 | + "date": "2018/04/18", | |
33 | + | |
34 | + "target": "raspberry pi3", | |
35 | + "hardware": [ | |
36 | + { | |
37 | + "title": "CPU", | |
38 | + "result": "PASS" | |
39 | + }, | |
40 | + { | |
41 | + "title": "Memory", | |
42 | + "result": "FAIL", | |
43 | + "message": "Not found in booting log messages" | |
44 | + } | |
45 | + ], | |
46 | + | |
47 | + "os": [ | |
48 | + ], | |
49 | + | |
50 | + "device": [ | |
51 | + ] | |
52 | + } | |
53 | +} | |
54 | +` | |
55 | + | |
56 | +func check(err error) { | |
57 | + if err != nil { | |
58 | + log.Fatal(err) | |
59 | + } | |
60 | +} | |
61 | + | |
62 | +var uuid string | |
63 | + | |
64 | +func init() { | |
65 | + if len(os.Args) == 1 { | |
66 | + fmt.Fprintf(os.Stderr, "Usage: %v <UUID>\n", os.Args[0]) | |
67 | + os.Exit(1) | |
68 | + } | |
69 | + | |
70 | + uuid = os.Args[1] | |
71 | +} | |
72 | + | |
73 | +func main() { | |
74 | + var r parser.Request | |
75 | + | |
76 | + // Read the sheet. | |
77 | + fname := fmt.Sprintf("sheet-%v.json", uuid) | |
78 | + b, err := ioutil.ReadFile(fname) | |
79 | + check(err) | |
80 | + | |
81 | + err = json.Unmarshal(b, &r.Sheet) | |
82 | + check(err) | |
83 | + | |
84 | + // Read stdin. | |
85 | + s := bufio.NewScanner(os.Stdin) | |
86 | + for s.Scan() { | |
87 | + if l := s.Text(); l == "end of kernel" { | |
88 | + break | |
89 | + } else { | |
90 | + r.Log = append(r.Log, l) | |
91 | + } | |
92 | + } | |
93 | + | |
94 | + // Parse. | |
95 | + p := parser.New() | |
96 | + result := p.Parse(&r) | |
97 | + | |
98 | + // Print. | |
99 | + fmt.Print(result) | |
100 | +} | ... | ... |
go/src/fullcycle/analog-kernel/parser/device.go
... | ... | @@ -0,0 +1,64 @@ |
1 | +package parser | |
2 | + | |
3 | +import "regexp" | |
4 | + | |
5 | +type deviceTableElement struct { | |
6 | + name string | |
7 | + reString string | |
8 | + re *regexp.Regexp | |
9 | +} | |
10 | + | |
11 | +var deviceTable = []deviceTableElement{ | |
12 | + {"AMBA PL011 UART Device", "Serial: AMBA PL011 UART driver", nil}, | |
13 | + {"BCM2835 Mailbox", "bcm2835-mbox[[:print:]]+mailbox enabled", nil}, | |
14 | + {"BCM2835 DMA", "bcm2835-dma[[:print:]]+DMA legacy API manager", nil}, | |
15 | + {"RaspberryPi Firmware", "raspberrypi-firmware soc:firmware: Attached to firmware", nil}, | |
16 | + {"BCM2708FB", "BCM2708FB: allocated DMA memory", nil}, | |
17 | + {"BCM2835 RNG", "bcm2835-rng[[:print:]]+hwrng registered", nil}, | |
18 | + {"Videocore Memory", "vc-mem: phys_addr:", nil}, | |
19 | + {"Videocore Shared Memory", "vc-sm: Videocore shared memory driver", nil}, | |
20 | + {"Microchip LAN78XX Based USB Ethernet Adapter", "new interface driver lan78xx", nil}, | |
21 | + {"SMSC LAN95XX Based USB 2.0 10/100 Ethernet Device", "new interface driver smsc95xx", nil}, | |
22 | + {"DesignWare OTG", "dwc_otg: version ", nil}, | |
23 | + {"USB Mass Storage", "new interface driver usb-storage", nil}, | |
24 | + {"BCM2835 Watchdog Timer", "bcm2835-wdt[[:print:]]+Broadcom BCM2835 watchdog timer", nil}, | |
25 | + {"BCM2835 CPU Frequency Scaler", "bcm2835-cpufreq: min=", nil}, | |
26 | + {"Secure Digital Host Controller Interface", "sdhci: Secure Digital Host Controller Interface driver", nil}, | |
27 | + {"8250/16550 Serial Device", "Serial: 8250/16550 driver", nil}, | |
28 | + {"SDHC Card", "new high speed SDHC card", nil}, | |
29 | + {"SDIO Card", "new high speed SDIO card", nil}, | |
30 | + {"S3C Power Management", "S3C Power Management, Copyright 2004 Simtec Electronics", nil}, | |
31 | + {"SCSI subsystem", "SCSI subsystem initialized", nil}, | |
32 | + {"ARM Mali", "Mali: Mali device driver loaded", nil}, | |
33 | + {"Generic vibrator", "vibrator_init: vibrator", nil}, | |
34 | + {"Broadcom Dongle Host Driver", "dhd_module_init in", nil}, | |
35 | + {"Intel® Performance Counter Monitor", "intel_pmu_driver [[:print:]]+: after pmu initialization", nil}, | |
36 | + {"Generic Wi-Fi", "found wifi platform device wlan", nil}, | |
37 | + {"Broadcom SDIO", "bcmsdh_sdmmc: bcmsdh_sdmmc_probe Enter", nil}, | |
38 | + {"s3c64xx SPI", "s3c64xx-spi 13920000.spi: spi bus clock parent not specified, using clock at index 0 as parent", nil}, | |
39 | + {"NLS-HR22", "hid-generic [0-9]+:1EAB:1A03.[0-9]+: input,hidraw[0-9]+: USB HID v1.00 Keyboard", nil}, | |
40 | + {"CP210X", "cp210x [0-9]+-[0-9]+.[0-9]+:[0-9]+.[0-9]+: cp210x converter detected", nil}, | |
41 | + {"NetWinder Floating Point Emulator", "NetWinder Floating Point Emulator", nil}, | |
42 | + {"Block layer SCSI generic", "Block layer SCSI generic \\(bsg\\) driver", nil}, | |
43 | + {"SCSI Media Changer", "SCSI Media Changer driver", nil}, | |
44 | + {"Nuvoton NUC970 EHCI Host Controller", "Nuvoton NUC970 EHCI Host Controller", nil}, | |
45 | + {"Nuvoton NUC970 OHCI Host Controller", "Nuvoton NUC970 OHCI Host Controller", nil}, | |
46 | + {"Wireless RNDIS USB", "new interface driver rndis_wlan", nil}, | |
47 | + {"ASIX AX88xxx Based USB 2.0 Ethernet Adapters", "new interface driver asix", nil}, | |
48 | + {"ASIX AX88179/178A USB 3.0/2.0 to Gigabit Ethernet", "new interface driver ax88179_178a", nil}, | |
49 | + {"CDC Ethernet", "new interface driver cdc_ether", nil}, | |
50 | + {"CDC EEM", "new interface driver cdc_eem", nil}, | |
51 | + {"NetChip 1080 based cables (Laplink, ...)", "new interface driver net1080", nil}, | |
52 | + {"Host for RNDIS and ActiveSync devices", "new interface driver rndis_host", nil}, | |
53 | + {"Simple USB Network Links (CDC Ethernet subset)", "new interface driver cdc_subset", nil}, | |
54 | + {"Sharp Zaurus (stock ROMs) and compatible", "new interface driver zaurus", nil}, | |
55 | + {"CDC NCM", "new interface driver cdc_ncm", nil}, | |
56 | + {"CDC MBIM", "new interface driver cdc_mbim", nil}, | |
57 | + {"I2C EEPROM", "at24 .* EEPROM", nil}, | |
58 | +} | |
59 | + | |
60 | +func init() { | |
61 | + for i, e := range deviceTable { | |
62 | + deviceTable[i].re = regexp.MustCompile(e.reString) | |
63 | + } | |
64 | +} | ... | ... |
go/src/fullcycle/analog-kernel/parser/parse.go
... | ... | @@ -0,0 +1,586 @@ |
1 | +package parser | |
2 | + | |
3 | +import ( | |
4 | + "regexp" | |
5 | + "strconv" | |
6 | + "strings" | |
7 | +) | |
8 | + | |
9 | +var parseFuncList = []func(chan string, chan jsonObject){ | |
10 | + parseMemory, | |
11 | + parseMemoryLayout, | |
12 | + parseTimestamps, | |
13 | + parseStatus, | |
14 | + parseHashTables, | |
15 | + parseLinux, | |
16 | + parseCpu, | |
17 | + parseModel, | |
18 | + parseDeviceFound, | |
19 | + parseKernelCommandLine, | |
20 | + parseCma, | |
21 | + parseSlub, | |
22 | + parsePidMax, | |
23 | + parseWorkingset, | |
24 | +} | |
25 | + | |
26 | +var reTimestamp = regexp.MustCompile(`^\[[[:blank:]]*[[:digit:]]+\.[[:digit:]]+[[:blank:]]*\]`) | |
27 | +var reAddress = regexp.MustCompile(`0x[[:xdigit:]]+`) | |
28 | + | |
29 | +func parseMemory(lines chan string, chanOutput chan jsonObject) { | |
30 | + m := make(jsonObject) | |
31 | + m["type"] = "memory" | |
32 | + | |
33 | + rLine := regexp.MustCompile("Memory: [[:ascii:]]+ available") | |
34 | + rBytes := regexp.MustCompile("[[:digit:]]+[Kk]") | |
35 | + for line := range lines { | |
36 | + if found := rLine.FindString(line); found != "" { | |
37 | + r := rBytes.FindAllString(line, 2) | |
38 | + m["available"] = r[0] | |
39 | + m["total"] = r[1] | |
40 | + chanOutput <- m | |
41 | + return | |
42 | + } | |
43 | + } | |
44 | + | |
45 | + m["available"] = "" | |
46 | + m["total"] = "" | |
47 | + | |
48 | + chanOutput <- m | |
49 | +} | |
50 | + | |
51 | +func parseMemoryLayout(lines chan string, chanOutput chan jsonObject) { | |
52 | + rHeaderArm := regexp.MustCompile("Virtual kernel memory layout:") | |
53 | + rHeaderX86 := regexp.MustCompile("Zone ranges:") | |
54 | + for line := range lines { | |
55 | + if rHeaderArm.MatchString(line) { | |
56 | + parseMemoryLayoutArm(lines, chanOutput) | |
57 | + return | |
58 | + } | |
59 | + | |
60 | + if rHeaderX86.MatchString(line) { | |
61 | + parseMemoryLayoutX86(lines, chanOutput) | |
62 | + return | |
63 | + } | |
64 | + } | |
65 | + | |
66 | + m := make(jsonObject) | |
67 | + m["type"] = "memory_layout" | |
68 | + m["layout"] = make([]jsonObject, 0) | |
69 | + | |
70 | + chanOutput <- m | |
71 | +} | |
72 | + | |
73 | +func parseMemoryLayoutArm(lines chan string, chanOutput chan jsonObject) { | |
74 | + m := make(jsonObject) | |
75 | + m["type"] = "memory_layout" | |
76 | + m["layout"] = make([]jsonObject, 0) | |
77 | + | |
78 | + rLine := regexp.MustCompile(`[[:print:]]+:[[:blank:]]*0x[[:xdigit:]]+[[:blank:]]*-[[:blank:]]*0x[[:xdigit:]]+`) | |
79 | + rLabel := regexp.MustCompile(`[[:graph:]]+`) | |
80 | + | |
81 | + for line := range lines { | |
82 | + line = removeTimestamp(line) | |
83 | + if rLine.MatchString(line) { | |
84 | + item := make(jsonObject) | |
85 | + item["label"] = rLabel.FindString(line) | |
86 | + | |
87 | + r := reAddress.FindAllString(line, 2) | |
88 | + item["from"] = r[0] | |
89 | + item["to"] = r[1] | |
90 | + | |
91 | + m["layout"] = append(m["layout"].([]jsonObject), item) | |
92 | + } else { | |
93 | + break | |
94 | + } | |
95 | + } | |
96 | + | |
97 | + chanOutput <- m | |
98 | +} | |
99 | + | |
100 | +func parseMemoryLayoutX86(lines chan string, chanOutput chan jsonObject) { | |
101 | + m := make(jsonObject) | |
102 | + m["type"] = "memory_layout" | |
103 | + m["layout"] = make([]jsonObject, 0) | |
104 | + | |
105 | + rLine := regexp.MustCompile(`[[:print:]]+\[mem[[:blank:]]+0x[[:xdigit:]]+-0x[[:xdigit:]]+\]`) | |
106 | + rLabel := regexp.MustCompile(`[[:graph:]]+`) | |
107 | + | |
108 | + for line := range lines { | |
109 | + line = removeTimestamp(line) | |
110 | + if rLine.MatchString(line) { | |
111 | + item := make(jsonObject) | |
112 | + item["label"] = rLabel.FindString(line) | |
113 | + | |
114 | + r := reAddress.FindAllString(line, 2) | |
115 | + item["from"] = r[0] | |
116 | + item["to"] = r[1] | |
117 | + | |
118 | + m["layout"] = append(m["layout"].([]jsonObject), item) | |
119 | + } else { | |
120 | + break | |
121 | + } | |
122 | + } | |
123 | + | |
124 | + chanOutput <- m | |
125 | +} | |
126 | + | |
127 | +func parseTimestamps(lines chan string, chanOutput chan jsonObject) { | |
128 | + rVal := regexp.MustCompile(`[[:digit:]]+\.[[:digit:]]+`) | |
129 | + | |
130 | + list := make(jsonArray, 0) | |
131 | + for line := range lines { | |
132 | + if reTimestamp.MatchString(line) { | |
133 | + t := reTimestamp.FindString(line) | |
134 | + v := rVal.FindString(t) | |
135 | + f, _ := strconv.ParseFloat(v, 64) | |
136 | + list = append(list, f) | |
137 | + } | |
138 | + } | |
139 | + | |
140 | + m := make(jsonObject) | |
141 | + m["type"] = "timestamps" | |
142 | + m["timestamps"] = list | |
143 | + | |
144 | + chanOutput <- m | |
145 | +} | |
146 | + | |
147 | +func parseStatus(lines chan string, chanOutput chan jsonObject) { | |
148 | + rLine := regexp.MustCompile(`^\[[[:blank:]]*(OK|FAIL)[[:blank:]]*\][[:blank:]]+`) | |
149 | + rOk := regexp.MustCompile(`^\[[[:blank:]]*OK[[:blank:]]*\]`) | |
150 | + | |
151 | + list := make([]jsonObject, 0) | |
152 | + for line := range lines { | |
153 | + if rLine.MatchString(line) { | |
154 | + item := make(jsonObject) | |
155 | + if rOk.MatchString(line) { | |
156 | + item["status"] = "ok" | |
157 | + } else { | |
158 | + item["status"] = "fail" | |
159 | + } | |
160 | + | |
161 | + prefix := rLine.FindString(line) | |
162 | + label := strings.TrimPrefix(line, prefix) | |
163 | + item["label"] = label | |
164 | + | |
165 | + list = append(list, item) | |
166 | + } | |
167 | + } | |
168 | + | |
169 | + m := make(jsonObject) | |
170 | + m["type"] = "status" | |
171 | + m["list"] = list | |
172 | + | |
173 | + chanOutput <- m | |
174 | +} | |
175 | + | |
176 | +func parseHashTables(lines chan string, chanOutput chan jsonObject) { | |
177 | + rLine := regexp.MustCompile(`[[:graph:]]+ hash table entries:`) | |
178 | + | |
179 | + list := make([]jsonObject, 0) | |
180 | + for line := range lines { | |
181 | + if rLine.MatchString(line) { | |
182 | + line = removeTimestamp(line) | |
183 | + | |
184 | + item := make(jsonObject) | |
185 | + | |
186 | + label := regexp.MustCompile(`[[:print:]]+ hash table entries:`).FindString(line) | |
187 | + | |
188 | + item["label"] = strings.TrimSuffix(label, " hash table entries:") | |
189 | + | |
190 | + entries := regexp.MustCompile(`hash table entries: [[:digit:]]+`).FindString(line) | |
191 | + entries = strings.TrimPrefix(entries, "hash table entries: ") | |
192 | + | |
193 | + item["entries"], _ = strconv.ParseInt(entries, 10, 64) | |
194 | + | |
195 | + order := regexp.MustCompile(`order:? [[:digit:]-]+`).FindString(line) | |
196 | + orderPrefix := regexp.MustCompile(`order:? `).FindString(order) | |
197 | + order = strings.TrimPrefix(order, orderPrefix) | |
198 | + | |
199 | + item["order"], _ = strconv.ParseInt(order, 10, 64) | |
200 | + | |
201 | + size := regexp.MustCompile(`[[:digit:]]+ bytes`).FindString(line) | |
202 | + size = strings.TrimSuffix(size, " bytes") | |
203 | + | |
204 | + item["size"], _ = strconv.ParseInt(size, 10, 64) | |
205 | + | |
206 | + list = append(list, item) | |
207 | + } | |
208 | + } | |
209 | + | |
210 | + m := make(jsonObject) | |
211 | + m["type"] = "hash_tables" | |
212 | + m["list"] = list | |
213 | + | |
214 | + chanOutput <- m | |
215 | +} | |
216 | + | |
217 | +func parseLinux(lines chan string, chanOutput chan jsonObject) { | |
218 | + m := make(jsonObject) | |
219 | + m["type"] = "linux" | |
220 | + m["version"] = "" | |
221 | + m["builder"] = "" | |
222 | + m["toolchain"] = "" | |
223 | + m["label"] = "" | |
224 | + | |
225 | + rLine := regexp.MustCompile(`Linux version[[:blank:]]+[[:graph:]]+[[:blank:]]+([[:print:]]+)[[:blank:]]+([[:print:]]+)[[:blank:]]+#[[:print:]]+`) | |
226 | + for line := range lines { | |
227 | + if rLine.MatchString(line) { | |
228 | + line = rLine.FindString(line) | |
229 | + line = strings.TrimPrefix(line, "Linux version ") | |
230 | + | |
231 | + m["version"] = regexp.MustCompile(`[[:graph:]]+`).FindString(line) | |
232 | + m["os"] = "linux" | |
233 | + | |
234 | + bracketed := regexp.MustCompile(`\([[:print:]]+?\)`).FindAllString(line, 2) | |
235 | + for i, s := range bracketed { | |
236 | + switch i { | |
237 | + case 0: | |
238 | + m["builder"] = removeBrackets(s) | |
239 | + case 1: | |
240 | + m["toolchain"] = removeBrackets(s) | |
241 | + } | |
242 | + } | |
243 | + | |
244 | + m["label"] = regexp.MustCompile(`#[[:print:]]+`).FindString(line) | |
245 | + | |
246 | + break | |
247 | + } | |
248 | + } | |
249 | + | |
250 | + chanOutput <- m | |
251 | +} | |
252 | + | |
253 | +func parseCpu(lines chan string, chanOutput chan jsonObject) { | |
254 | + m := make(jsonObject) | |
255 | + m["type"] = "cpu" | |
256 | + m["name"] = "" | |
257 | + m["id"] = "" | |
258 | + m["revision"] = "" | |
259 | + m["arch"] = "" | |
260 | + m["cr"] = "" | |
261 | + m["data_cache"] = "" | |
262 | + m["instruction_cache"] = "" | |
263 | + | |
264 | + rLine1 := regexp.MustCompile(`CPU:[[:blank:]]+[[:print:]]+[[:blank:]]+\[[[:xdigit:]]+\][[:blank:]]+revision[[:blank:]]+[[:digit:]][[:blank:]]+\([[:print:]]+\), cr=[[:xdigit:]]+`) | |
265 | + rLine2 := regexp.MustCompile(`CPU:[[:blank:]]+[[:print:]]+[[:blank:]]+data cache,[[:blank:]]+[[:print:]]+[[:blank:]]+instruction cache`) | |
266 | + for line := range lines { | |
267 | + if rLine1.MatchString(line) { | |
268 | + line = rLine1.FindString(line) | |
269 | + line = strings.TrimPrefix(line, "CPU: ") | |
270 | + | |
271 | + name := regexp.MustCompile(`[[:print:]]+\[`).FindString(line) | |
272 | + name = strings.TrimSuffix(name, "[") | |
273 | + name = strings.TrimSpace(name) | |
274 | + | |
275 | + m["name"] = name | |
276 | + | |
277 | + id := regexp.MustCompile(`\[[[:xdigit:]]+\]`).FindString(line) | |
278 | + id = strings.TrimPrefix(id, "[") | |
279 | + id = strings.TrimSuffix(id, "]") | |
280 | + | |
281 | + m["id"] = id | |
282 | + | |
283 | + revision := regexp.MustCompile(`revision[[:blank:]]+[[:digit:]]+`).FindString(line) | |
284 | + revision = strings.TrimPrefix(revision, "revision") | |
285 | + revision = strings.TrimSpace(revision) | |
286 | + | |
287 | + m["revision"] = revision | |
288 | + | |
289 | + arch := regexp.MustCompile(`\([[:print:]]+\)`).FindString(line) | |
290 | + arch = strings.TrimPrefix(arch, "(") | |
291 | + arch = strings.TrimSuffix(arch, ")") | |
292 | + arch = strings.TrimSpace(arch) | |
293 | + | |
294 | + m["arch"] = arch | |
295 | + | |
296 | + cr := regexp.MustCompile(`cr=[[:xdigit:]]+`).FindString(line) | |
297 | + cr = strings.TrimPrefix(cr, "cr=") | |
298 | + | |
299 | + m["cr"] = cr | |
300 | + } else if rLine2.MatchString(line) { | |
301 | + line = rLine2.FindString(line) | |
302 | + line = strings.TrimPrefix(line, `CPU: `) | |
303 | + | |
304 | + dataCache := regexp.MustCompile(`[[:print:]]+data cache`).FindString(line) | |
305 | + dataCache = strings.TrimSuffix(dataCache, "data cache") | |
306 | + dataCache = strings.TrimSpace(dataCache) | |
307 | + | |
308 | + m["data_cache"] = dataCache | |
309 | + | |
310 | + instructionCache := regexp.MustCompile(`,[[:print:]]+instruction cache`).FindString(line) | |
311 | + instructionCache = strings.TrimPrefix(instructionCache, ",") | |
312 | + instructionCache = strings.TrimSuffix(instructionCache, "instruction cache") | |
313 | + instructionCache = strings.TrimSpace(instructionCache) | |
314 | + | |
315 | + m["instruction_cache"] = instructionCache | |
316 | + } | |
317 | + } | |
318 | + | |
319 | + chanOutput <- m | |
320 | +} | |
321 | + | |
322 | +func parseModel(lines chan string, chanOutput chan jsonObject) { | |
323 | + m := make(jsonObject) | |
324 | + m["type"] = "model" | |
325 | + m["model"] = "" | |
326 | + | |
327 | + rLine := regexp.MustCompile(`(Machine model: [[:print:]]+)|(Machine: [[:print:]]+)`) | |
328 | + rLineEdison := regexp.MustCompile(`Linux version[[:print:]]+edison`) | |
329 | + rLineARTIK := regexp.MustCompile(`CPU EXYNOS3250`) | |
330 | + for line := range lines { | |
331 | + if rLine.MatchString(line) { | |
332 | + line = rLine.FindString(line) | |
333 | + line = strings.TrimPrefix(line, "Machine model: ") | |
334 | + line = strings.TrimPrefix(line, "Machine: ") | |
335 | + | |
336 | + m["model"] = strings.TrimSpace(line) | |
337 | + | |
338 | + break | |
339 | + } else if rLineEdison.MatchString(line) { | |
340 | + m["model"] = "Intel Edison" | |
341 | + | |
342 | + break | |
343 | + } else if rLineARTIK.MatchString(line) { | |
344 | + m["model"] = "SAMSUNG ARTIK5" | |
345 | + | |
346 | + break | |
347 | + } | |
348 | + } | |
349 | + | |
350 | + chanOutput <- m | |
351 | +} | |
352 | + | |
353 | +func parseDeviceFound(lines chan string, chanOutput chan jsonObject) { | |
354 | + list := make([]string, 0) | |
355 | + for line := range lines { | |
356 | + for _, e := range deviceTable { | |
357 | + if e.re.MatchString(line) { | |
358 | + list = append(list, e.name) | |
359 | + } | |
360 | + } | |
361 | + } | |
362 | + | |
363 | + m := make(jsonObject) | |
364 | + m["type"] = "device_found" | |
365 | + m["list"] = list | |
366 | + | |
367 | + chanOutput <- m | |
368 | +} | |
369 | + | |
370 | +func parseKernelCommandLine(lines chan string, chanOutput chan jsonObject) { | |
371 | + m := make(jsonObject) | |
372 | + m["type"] = "kernel_command_line" | |
373 | + m["kernel_command_line"] = "" | |
374 | + | |
375 | + rLine := regexp.MustCompile("Kernel command line: [[:print:]]+") | |
376 | + for line := range lines { | |
377 | + if rLine.MatchString(line) { | |
378 | + line = rLine.FindString(line) | |
379 | + | |
380 | + cmdline := strings.TrimPrefix(line, "Kernel command line: ") | |
381 | + cmdline = strings.TrimSpace(cmdline) | |
382 | + if strings.HasPrefix(cmdline, `"`) && strings.HasSuffix(cmdline, `"`) { | |
383 | + cmdline = strings.TrimPrefix(cmdline, `"`) | |
384 | + cmdline = strings.TrimSuffix(cmdline, `"`) | |
385 | + } | |
386 | + | |
387 | + m["kernel_command_line"] = cmdline | |
388 | + | |
389 | + break | |
390 | + } | |
391 | + } | |
392 | + | |
393 | + chanOutput <- m | |
394 | +} | |
395 | + | |
396 | +func parseCma(lines chan string, chanOutput chan jsonObject) { | |
397 | + m := make(jsonObject) | |
398 | + m["type"] = "cma" | |
399 | + m["size"] = "" | |
400 | + m["address"] = "" | |
401 | + | |
402 | + rLine := regexp.MustCompile("cma: Reserved [[:print:]]+ at [[:print:]]+") | |
403 | + for line := range lines { | |
404 | + if rLine.MatchString(line) { | |
405 | + line = rLine.FindString(line) | |
406 | + line = strings.TrimPrefix(line, "cma: Reserved ") | |
407 | + | |
408 | + size := regexp.MustCompile(`[[:print:]]+ at`).FindString(line) | |
409 | + size = strings.TrimSuffix(size, "at") | |
410 | + size = strings.TrimSpace(size) | |
411 | + | |
412 | + m["size"] = size | |
413 | + | |
414 | + address := regexp.MustCompile(`at [[:print:]]+`).FindString(line) | |
415 | + address = strings.TrimPrefix(address, "at") | |
416 | + address = strings.TrimSpace(address) | |
417 | + | |
418 | + m["address"] = address | |
419 | + | |
420 | + break | |
421 | + } | |
422 | + } | |
423 | + | |
424 | + chanOutput <- m | |
425 | +} | |
426 | + | |
427 | +func parseSlub(lines chan string, chanOutput chan jsonObject) { | |
428 | + m := make(jsonObject) | |
429 | + m["type"] = "slub" | |
430 | + m["hw_align"] = "" | |
431 | + m["order"] = "" | |
432 | + m["min_objects"] = "" | |
433 | + m["cpus"] = "" | |
434 | + m["nodes"] = "" | |
435 | + | |
436 | + rLine := regexp.MustCompile("SLUB: HWalign=[[:digit:]]+, Order=[[:digit:]]+-[[:digit:]]+, MinObjects=[[:digit:]]+, CPUs=[[:digit:]]+, Nodes=[[:digit:]]+") | |
437 | + for line := range lines { | |
438 | + if rLine.MatchString(line) { | |
439 | + line = rLine.FindString(line) | |
440 | + | |
441 | + hwAlign := regexp.MustCompile(`HWalign=[[:digit:]]+`).FindString(line) | |
442 | + hwAlign = strings.TrimPrefix(hwAlign, `HWalign=`) | |
443 | + | |
444 | + m["hw_align"] = hwAlign | |
445 | + | |
446 | + order := regexp.MustCompile(`Order=[[:digit:]]+-[[:digit:]]+`).FindString(line) | |
447 | + order = strings.TrimPrefix(order, `Order=`) | |
448 | + | |
449 | + m["order"] = order | |
450 | + | |
451 | + minObjects := regexp.MustCompile(`MinObjects=[[:digit:]]+`).FindString(line) | |
452 | + minObjects = strings.TrimPrefix(minObjects, `MinObjects=`) | |
453 | + | |
454 | + m["min_objects"] = minObjects | |
455 | + | |
456 | + cpus := regexp.MustCompile(`CPUs=[[:digit:]]+`).FindString(line) | |
457 | + cpus = strings.TrimPrefix(cpus, `CPUs=`) | |
458 | + | |
459 | + m["cpus"] = cpus | |
460 | + | |
461 | + nodes := regexp.MustCompile(`Nodes=[[:digit:]]+`).FindString(line) | |
462 | + nodes = strings.TrimPrefix(nodes, `Nodes=`) | |
463 | + | |
464 | + m["nodes"] = nodes | |
465 | + | |
466 | + break | |
467 | + } | |
468 | + } | |
469 | + | |
470 | + chanOutput <- m | |
471 | +} | |
472 | + | |
473 | +func parsePidMax(lines chan string, chanOutput chan jsonObject) { | |
474 | + m := make(jsonObject) | |
475 | + m["type"] = "pid_max" | |
476 | + m["default"] = "" | |
477 | + m["min"] = "" | |
478 | + | |
479 | + rLine := regexp.MustCompile("pid_max:[[:blank:]]+default:[[:blank:]]*[[:digit:]]+[[:blank:]]+minimum:[[:blank:]]*[[:digit:]]+") | |
480 | + for line := range lines { | |
481 | + if rLine.MatchString(line) { | |
482 | + line = rLine.FindString(line) | |
483 | + | |
484 | + m["default"] = extract(line, | |
485 | + `default:[[:blank:]]*[[:digit:]]+`, | |
486 | + `default:[[:blank:]]*`, | |
487 | + ``) | |
488 | + | |
489 | + m["min"] = extract(line, | |
490 | + `minimum:[[:blank:]]*[[:digit:]]+`, | |
491 | + `minimum:[[:blank:]]*`, | |
492 | + ``) | |
493 | + | |
494 | + break | |
495 | + } | |
496 | + } | |
497 | + | |
498 | + chanOutput <- m | |
499 | +} | |
500 | + | |
501 | +func parseWorkingset(lines chan string, chanOutput chan jsonObject) { | |
502 | + m := make(jsonObject) | |
503 | + m["type"] = "workingset" | |
504 | + m["timestamp bits"] = "" | |
505 | + m["max_order"] = "" | |
506 | + m["bucket_order"] = "" | |
507 | + | |
508 | + rLine := regexp.MustCompile("workingset: timestamp_bits=[[:digit:]]+ max_order=[[:digit:]]+ bucket_order=[[:digit:]]+") | |
509 | + for line := range lines { | |
510 | + if rLine.MatchString(line) { | |
511 | + line = rLine.FindString(line) | |
512 | + | |
513 | + m["timestamp_bits"] = extract(line, | |
514 | + `timestamp_bits=[[:digit:]]+`, | |
515 | + `timestamp_bits=`, | |
516 | + ``) | |
517 | + | |
518 | + m["max_order"] = extract(line, | |
519 | + `max_order=[[:digit:]]+`, | |
520 | + `max_order=`, | |
521 | + ``) | |
522 | + | |
523 | + m["bucket_order"] = extract(line, | |
524 | + `bucket_order=[[:digit:]]+`, | |
525 | + `bucket_order=`, | |
526 | + ``) | |
527 | + | |
528 | + break | |
529 | + } | |
530 | + } | |
531 | + | |
532 | + chanOutput <- m | |
533 | +} | |
534 | + | |
535 | +func removeBrackets(s string) string { | |
536 | + for strings.HasPrefix(s, "(") && strings.HasSuffix(s, ")") { | |
537 | + openCount := strings.Count(s, "(") | |
538 | + closeCount := strings.Count(s, ")") | |
539 | + | |
540 | + if openCount > closeCount { | |
541 | + s = strings.TrimPrefix(s, "(") | |
542 | + } else if openCount < closeCount { | |
543 | + s = strings.TrimSuffix(s, ")") | |
544 | + } else { | |
545 | + s = strings.TrimPrefix(s, "(") | |
546 | + s = strings.TrimSuffix(s, ")") | |
547 | + } | |
548 | + } | |
549 | + | |
550 | + return s | |
551 | +} | |
552 | + | |
553 | +func removeTimestamp(s string) string { | |
554 | + if reTimestamp.MatchString(s) { | |
555 | + t := reTimestamp.FindString(s) | |
556 | + s = strings.TrimPrefix(s, t) | |
557 | + } | |
558 | + return strings.TrimSpace(s) | |
559 | +} | |
560 | + | |
561 | +func extract(from string, chunk, prefix, suffix string) string { | |
562 | + reChunk, err := regexp.Compile(chunk) | |
563 | + if err != nil { | |
564 | + return "" | |
565 | + } | |
566 | + | |
567 | + rePrefix, err := regexp.Compile(prefix) | |
568 | + if err != nil { | |
569 | + return "" | |
570 | + } | |
571 | + | |
572 | + reSuffix, err := regexp.Compile(suffix) | |
573 | + if err != nil { | |
574 | + return "" | |
575 | + } | |
576 | + | |
577 | + b := reChunk.FindString(from) | |
578 | + | |
579 | + p := rePrefix.FindString(b) | |
580 | + b = strings.TrimPrefix(b, p) | |
581 | + | |
582 | + s := reSuffix.FindString(b) | |
583 | + b = strings.TrimSuffix(b, s) | |
584 | + | |
585 | + return b | |
586 | +} | ... | ... |
go/src/fullcycle/analog-kernel/parser/parser.go
... | ... | @@ -0,0 +1,250 @@ |
1 | +package parser | |
2 | + | |
3 | +import ( | |
4 | + "encoding/json" | |
5 | + "fmt" | |
6 | + "io/ioutil" | |
7 | + "strings" | |
8 | +) | |
9 | + | |
10 | +type jsonObject map[string]interface{} | |
11 | +type jsonArray []interface{} | |
12 | + | |
13 | +type Request struct { | |
14 | + Log []string `json:"log"` | |
15 | + Sheet Sheet `json:"sheet"` | |
16 | +} | |
17 | + | |
18 | +type Sheet struct { | |
19 | + LogID string `json:"log_id"` | |
20 | + Date string `json:"date"` | |
21 | + Target string `json:"target"` | |
22 | + Memory string `json:"memory"` | |
23 | + StartLine string `json:"start_line"` | |
24 | + | |
25 | + Hardware []SheetEntry `json:"hardware"` | |
26 | + OS []SheetEntry `json:"os"` | |
27 | + Device []SheetEntry `json:"device"` | |
28 | +} | |
29 | + | |
30 | +type SheetEntry struct { | |
31 | + Title string `json:"title"` | |
32 | + Check [][]string `json:"check"` | |
33 | + ErrorMessage []string `json:"error_message"` | |
34 | +} | |
35 | + | |
36 | +type Parser struct { | |
37 | + InChan chan string | |
38 | + OutChan chan jsonObject | |
39 | +} | |
40 | + | |
41 | +func New() *Parser { | |
42 | + parser := &Parser{} | |
43 | + return parser | |
44 | +} | |
45 | + | |
46 | +func (p *Parser) Parse(request *Request) string { | |
47 | + p.start() | |
48 | + for _, line := range request.Log { | |
49 | + p.InChan <- line | |
50 | + } | |
51 | + p.stop() | |
52 | + | |
53 | + return p.makeResult(request.Sheet) | |
54 | +} | |
55 | + | |
56 | +func (p *Parser) start() { | |
57 | + p.InChan = make(chan string, 100) | |
58 | + p.OutChan = make(chan jsonObject, 1) | |
59 | + | |
60 | + // Go parse functions | |
61 | + inputChanList := make([]chan string, len(parseFuncList)) | |
62 | + outputChanList := make([]chan jsonObject, len(parseFuncList)) | |
63 | + for i, parseFunc := range parseFuncList { | |
64 | + f := parseFunc | |
65 | + | |
66 | + inputChan := make(chan string, 10) | |
67 | + outputChan := make(chan jsonObject, 1) | |
68 | + | |
69 | + inputChanList[i] = inputChan | |
70 | + outputChanList[i] = outputChan | |
71 | + | |
72 | + go func() { | |
73 | + defer func() { | |
74 | + if r := recover(); r != nil { | |
75 | + //p.Fatal("Internal Error", r, string(debug.Stack())) | |
76 | + } | |
77 | + for range inputChan { | |
78 | + } | |
79 | + close(outputChan) | |
80 | + }() | |
81 | + f(inputChan, outputChan) | |
82 | + }() | |
83 | + } | |
84 | + | |
85 | + // Broadcast input | |
86 | + go func() { | |
87 | + for input := range p.InChan { | |
88 | + for _, inputChan := range inputChanList { | |
89 | + inputChan <- input | |
90 | + } | |
91 | + } | |
92 | + | |
93 | + for _, inputChan := range inputChanList { | |
94 | + close(inputChan) | |
95 | + } | |
96 | + }() | |
97 | + | |
98 | + // Merge output | |
99 | + go func() { | |
100 | + output := make(jsonObject) | |
101 | + | |
102 | + for _, outputChan := range outputChanList { | |
103 | + for parsed := range outputChan { | |
104 | + output[parsed["type"].(string)] = parsed | |
105 | + } | |
106 | + } | |
107 | + | |
108 | + p.OutChan <- output | |
109 | + close(p.OutChan) | |
110 | + }() | |
111 | +} | |
112 | + | |
113 | +func (p *Parser) stop() { | |
114 | + close(p.InChan) | |
115 | +} | |
116 | + | |
117 | +func (p *Parser) makeReport(result jsonObject, checklist []SheetEntry) ([]jsonObject, bool) { | |
118 | + var report []jsonObject | |
119 | + | |
120 | + totalPass := true | |
121 | + | |
122 | + for _, entry := range checklist { | |
123 | + reportEntry := make(jsonObject) | |
124 | + reportEntry["title"] = entry.Title | |
125 | + | |
126 | + pass := true | |
127 | + for _, c := range entry.Check { | |
128 | + o, ok := result[c[0]].(jsonObject) | |
129 | + if !ok { | |
130 | + reportEntry["result"] = "FAIL" | |
131 | + reportEntry["message"] = entry.ErrorMessage[0] | |
132 | + pass = false | |
133 | + break | |
134 | + } | |
135 | + switch o[c[1]].(type) { | |
136 | + case string: | |
137 | + if len(c[2]) > 0 { | |
138 | + v, ok := o[c[1]].(string) | |
139 | + if !ok { | |
140 | + reportEntry["result"] = "FAIL" | |
141 | + reportEntry["message"] = entry.ErrorMessage[0] | |
142 | + pass = false | |
143 | + break | |
144 | + } | |
145 | + if strings.Compare(v, c[2]) != 0 { | |
146 | + reportEntry["result"] = "FAIL" | |
147 | + reportEntry["message"] = entry.ErrorMessage[0] | |
148 | + pass = false | |
149 | + break | |
150 | + } | |
151 | + } | |
152 | + case []string: | |
153 | + if len(c[2]) > 0 { | |
154 | + l, ok := o[c[1]].([]string) | |
155 | + if !ok { | |
156 | + reportEntry["result"] = "FAIL" | |
157 | + reportEntry["message"] = entry.ErrorMessage[0] | |
158 | + pass = false | |
159 | + break | |
160 | + } | |
161 | + | |
162 | + found := false | |
163 | + for _, v := range l { | |
164 | + if strings.Compare(v, c[2]) == 0 { | |
165 | + found = true | |
166 | + } | |
167 | + } | |
168 | + if !found { | |
169 | + reportEntry["result"] = "FAIL" | |
170 | + reportEntry["message"] = entry.ErrorMessage[0] | |
171 | + pass = false | |
172 | + break | |
173 | + } | |
174 | + } | |
175 | + case []jsonObject: | |
176 | + if len(c[2]) > 0 { | |
177 | + list, ok := o[c[1]].([]jsonObject) | |
178 | + if !ok { | |
179 | + reportEntry["result"] = "FAIL" | |
180 | + reportEntry["message"] = entry.ErrorMessage[0] | |
181 | + pass = false | |
182 | + break | |
183 | + } | |
184 | + | |
185 | + found := false | |
186 | + for _, v := range list { | |
187 | + label := v["label"].(string) | |
188 | + if strings.Compare(label, c[2]) == 0 { | |
189 | + found = true | |
190 | + } | |
191 | + } | |
192 | + if !found { | |
193 | + reportEntry["result"] = "FAIL" | |
194 | + reportEntry["message"] = entry.ErrorMessage[0] | |
195 | + pass = false | |
196 | + break | |
197 | + } | |
198 | + } | |
199 | + default: | |
200 | + fmt.Printf("%v fail (type: %T)\n", c[1], o[c[1]]) | |
201 | + reportEntry["result"] = "FAIL" | |
202 | + pass = false | |
203 | + } | |
204 | + } | |
205 | + if pass { | |
206 | + reportEntry["result"] = "PASS" | |
207 | + } else { | |
208 | + totalPass = false | |
209 | + } | |
210 | + report = append(report, reportEntry) | |
211 | + } | |
212 | + | |
213 | + return report, totalPass | |
214 | +} | |
215 | + | |
216 | +func (p *Parser) makeResult(sheet Sheet) string { | |
217 | + output := make(jsonObject) | |
218 | + | |
219 | + result := <-p.OutChan | |
220 | + report := make(jsonObject) | |
221 | + | |
222 | + pass := true | |
223 | + totalPass := true | |
224 | + | |
225 | + result["memory_size"] = sheet.Memory | |
226 | + | |
227 | + report["log_id"] = sheet.LogID | |
228 | + report["date"] = sheet.Date | |
229 | + report["target"] = sheet.Target | |
230 | + | |
231 | + report["hardware"], pass = p.makeReport(result, sheet.Hardware) | |
232 | + totalPass = totalPass && pass | |
233 | + report["os"], pass = p.makeReport(result, sheet.OS) | |
234 | + totalPass = totalPass && pass | |
235 | + report["device"], pass = p.makeReport(result, sheet.Device) | |
236 | + totalPass = totalPass && pass | |
237 | + | |
238 | + if totalPass { | |
239 | + report["pass"] = "PASS" | |
240 | + } | |
241 | + | |
242 | + output["result"] = result | |
243 | + output["report"] = report | |
244 | + | |
245 | + b, err := json.MarshalIndent(output, "", " ") | |
246 | + if err == nil { | |
247 | + ioutil.WriteFile("anal-kernel-response.json", b, 0644) | |
248 | + } | |
249 | + return string(b) | |
250 | +} | ... | ... |
go/src/fullcycle/analog-kernel/sheet-sample.json
... | ... | @@ -0,0 +1,203 @@ |
1 | +{ | |
2 | + "log_id": "012-3233-4423", | |
3 | + "date": "2018/04/18", | |
4 | + | |
5 | + "target": "raspberry pi3", | |
6 | + "hardware": [ | |
7 | + { | |
8 | + "title": "Check the CPU type", | |
9 | + "check": [ | |
10 | + ["cpu", "name", "ARMv7 Processor"] | |
11 | + ], | |
12 | + "error_message": [ | |
13 | + "Not found in booting log messages" | |
14 | + ] | |
15 | + }, | |
16 | + { | |
17 | + "title": "Check memory size", | |
18 | + "check": [ | |
19 | + ["memory", "total", "970752K"] | |
20 | + ], | |
21 | + "error_message": [ | |
22 | + "Not found in booting log messages", | |
23 | + "Wrong size" | |
24 | + ] | |
25 | + }, | |
26 | + { | |
27 | + "title": "Check board model type", | |
28 | + "check": [ | |
29 | + ["model", "model", "Raspberry Pi 3 Model B Rev 1.2"] | |
30 | + ], | |
31 | + "error_message": [ | |
32 | + "Not found in booting log messages", | |
33 | + "Wrong model" | |
34 | + ] | |
35 | + }, | |
36 | + { | |
37 | + "title": "Check CMA", | |
38 | + "check": [ | |
39 | + ["cma", "size", ""] | |
40 | + ], | |
41 | + "error_message": [ | |
42 | + "Not found in booting log messages" | |
43 | + ] | |
44 | + } | |
45 | + ], | |
46 | + "os": [ | |
47 | + { | |
48 | + "title": "Check OS type (Linux)", | |
49 | + "check": [ | |
50 | + ["linux", "type", "linux"] | |
51 | + ], | |
52 | + "error_message": [ | |
53 | + "Not found in booting log messages" | |
54 | + ] | |
55 | + }, | |
56 | + { | |
57 | + "title": "Check kernel memory layout", | |
58 | + "check": [ | |
59 | + ["memory_layout", "layout", "vector"], | |
60 | + ["memory_layout", "layout", "fixmap"], | |
61 | + ["memory_layout", "layout", "vmalloc"], | |
62 | + ["memory_layout", "layout", "lowmem"], | |
63 | + ["memory_layout", "layout", "modules"], | |
64 | + ["memory_layout", "layout", ".text"], | |
65 | + ["memory_layout", "layout", ".init"], | |
66 | + ["memory_layout", "layout", ".data"], | |
67 | + ["memory_layout", "layout", ".bss"] | |
68 | + ], | |
69 | + "error_message": [ | |
70 | + "Not found in booting log messages" | |
71 | + ] | |
72 | + }, | |
73 | + { | |
74 | + "title": "Check kernel hash tables", | |
75 | + "check": [ | |
76 | + ["hash_tables", "list", "PID"], | |
77 | + ["hash_tables", "list", "Dentry cache"], | |
78 | + ["hash_tables", "list", "Inode-cache"], | |
79 | + ["hash_tables", "list", "Mount-cache"], | |
80 | + ["hash_tables", "list", "Mountpoint-cache"], | |
81 | + ["hash_tables", "list", "futex"], | |
82 | + ["hash_tables", "list", "VFS: Dquot-cache"], | |
83 | + ["hash_tables", "list", "TCP established"], | |
84 | + ["hash_tables", "list", "TCP bind"], | |
85 | + ["hash_tables", "list", "UDP"], | |
86 | + ["hash_tables", "list", "UDP-Lite"] | |
87 | + ], | |
88 | + "error_message": [ | |
89 | + "Not found in booting log messages" | |
90 | + ] | |
91 | + } | |
92 | + ], | |
93 | + "device": [ | |
94 | + { | |
95 | + "title": "Check driver existance (UART)", | |
96 | + "check": [ | |
97 | + ["device_found", "list", "AMBA PL011 UART Device"] | |
98 | + ], | |
99 | + "error_message": [ | |
100 | + "Not found in booting log messages" | |
101 | + ] | |
102 | + }, | |
103 | + { | |
104 | + "title": "Check driver existance (Mailbox)", | |
105 | + "check": [ | |
106 | + ["device_found", "list", "BCM2835 Mailbox"] | |
107 | + ], | |
108 | + "error_message": [ | |
109 | + "Not found in booting log messages" | |
110 | + ] | |
111 | + }, | |
112 | + { | |
113 | + "title": "Check driver existance (DMA)", | |
114 | + "check": [ | |
115 | + ["device_found", "list", "BCM2835 DMA"] | |
116 | + ], | |
117 | + "error_message": [ | |
118 | + "Not found in booting log messages" | |
119 | + ] | |
120 | + }, | |
121 | + { | |
122 | + "title": "Check driver existance (SCSI)", | |
123 | + "check": [ | |
124 | + ["device_found", "list", "SCSI subsystem"] | |
125 | + ], | |
126 | + "error_message": [ | |
127 | + "Not found in booting log messages" | |
128 | + ] | |
129 | + }, | |
130 | + { | |
131 | + "title": "Check driver existance (Ethernet)", | |
132 | + "check": [ | |
133 | + ["device_found", "list", "SMSC LAN95XX Based USB 2.0 10/100 Ethernet Device"] | |
134 | + ], | |
135 | + "error_message": [ | |
136 | + "Not found in booting log messages" | |
137 | + ] | |
138 | + }, | |
139 | + { | |
140 | + "title": "Check driver existance (Watchdog Timer)", | |
141 | + "check": [ | |
142 | + ["device_found", "list", "BCM2835 Watchdog Timer"] | |
143 | + ], | |
144 | + "error_message": [ | |
145 | + "Not found in booting log messages" | |
146 | + ] | |
147 | + }, | |
148 | + { | |
149 | + "title": "Check driver existance (USB Mass Storage)", | |
150 | + "check": [ | |
151 | + ["device_found", "list", "USB Mass Storage"] | |
152 | + ], | |
153 | + "error_message": [ | |
154 | + "Not found in booting log messages" | |
155 | + ] | |
156 | + }, | |
157 | + { | |
158 | + "title": "Check driver existance (BCM FrameBuffer)", | |
159 | + "check": [ | |
160 | + ["device_found", "list", "BCM2708FB"] | |
161 | + ], | |
162 | + "error_message": [ | |
163 | + "Not found in booting log messages" | |
164 | + ] | |
165 | + }, | |
166 | + { | |
167 | + "title": "Check driver existance (Random Generator)", | |
168 | + "check": [ | |
169 | + ["device_found", "list", "BCM2835 RNG"] | |
170 | + ], | |
171 | + "error_message": [ | |
172 | + "Not found in booting log messages" | |
173 | + ] | |
174 | + }, | |
175 | + { | |
176 | + "title": "Check driver existance (SDHCI)", | |
177 | + "check": [ | |
178 | + ["device_found", "list", "Secure Digital Host Controller Interface"] | |
179 | + ], | |
180 | + "error_message": [ | |
181 | + "Not found in booting log messages" | |
182 | + ] | |
183 | + }, | |
184 | + { | |
185 | + "title": "Check driver existance (MMC:SDHC)", | |
186 | + "check": [ | |
187 | + ["device_found", "list", "SDHC Card"] | |
188 | + ], | |
189 | + "error_message": [ | |
190 | + "Not found in booting log messages" | |
191 | + ] | |
192 | + }, | |
193 | + { | |
194 | + "title": "Check driver existance (MMC:SDIO)", | |
195 | + "check": [ | |
196 | + ["device_found", "list", "SDIO Card"] | |
197 | + ], | |
198 | + "error_message": [ | |
199 | + "Not found in booting log messages" | |
200 | + ] | |
201 | + } | |
202 | + ] | |
203 | +} | ... | ... |
go/src/fullcycle/analog-kernel/test.sh
go/src/fullcycle/do-iperf/main.go
... | ... | @@ -0,0 +1,56 @@ |
1 | +package main | |
2 | + | |
3 | +import ( | |
4 | + "bufio" | |
5 | + "fmt" | |
6 | + "io" | |
7 | + "log" | |
8 | + "os" | |
9 | + "os/exec" | |
10 | +) | |
11 | + | |
12 | +func main() { | |
13 | + var host string | |
14 | + var out io.Writer | |
15 | + | |
16 | + if l := len(os.Args); l == 1 { | |
17 | + host = "172.30.0.1" | |
18 | + out = os.Stdout | |
19 | + } else if l == 2 { | |
20 | + host = os.Args[1] | |
21 | + out = os.Stdout | |
22 | + } else { | |
23 | + f, err := os.OpenFile(os.Args[2], os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) | |
24 | + if err != nil { | |
25 | + log.Fatal(err) | |
26 | + } | |
27 | + defer f.Close() | |
28 | + | |
29 | + host = os.Args[1] | |
30 | + out = f | |
31 | + } | |
32 | + | |
33 | + test("hw-wifi", host, out) | |
34 | +} | |
35 | + | |
36 | +func test(code, host string, out io.Writer) { | |
37 | + c := exec.Command("iperf", "-c", host, "-i", "1", "-t", "10") | |
38 | + stdout, err := c.StdoutPipe() | |
39 | + | |
40 | + err = c.Start() | |
41 | + if err != nil { | |
42 | + log.Fatal(err) | |
43 | + } | |
44 | + | |
45 | + state := 0 | |
46 | + | |
47 | + s := bufio.NewScanner(stdout) | |
48 | + for s.Scan() { | |
49 | + fmt.Fprintf(out, "{\"code\": \"%v\", \"state\": %v, \"data\": \"%v\", \"timeout\": 10}\n", code, state, s.Text()) | |
50 | + if state < 90 { | |
51 | + state += 10 | |
52 | + } | |
53 | + } | |
54 | + | |
55 | + fmt.Fprintf(out, "{\"code\": \"%v\", \"state\": 100, \"data\": \"\", \"timeout\": 10}\n", code) | |
56 | +} | ... | ... |