main.go 1.82 KB
package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
	"strings"

	"golang.org/x/sys/unix"

	"fullcycle/analog-kernel/parser"
)

const ioctlReadTermios = unix.TCGETS
const ioctlWriteTermios = unix.TCSETS

const defaultResult = `
{
	"result": {
		"cpu" : {
			"name": "ARMv7 Processor",
			"id": "410fd034",
			"revision": "4",
			"arch": "ARMv7",
			"cr": "10c5383d"
		},

		"model" : {
			"model": "Raspberry Pi 3 Model B Rev 1.2"
		}
	},

	"report": {
		"log_id": "012-3233-4423",
		"date": "2018/04/18",

		"target": "raspberry pi3",
		"hardware": [
			{
				"title": "CPU",
				"result": "PASS"
			},
			{
				"title": "Memory",
				"result": "FAIL",
				"message": "Not found in booting log messages"
			}
		],

		"os": [
		],

		"device": [
		]
	}
}
`

func check(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

var uuid string

func init() {
	if len(os.Args) == 1 {
		fmt.Fprintf(os.Stderr, "Usage: %v <UUID>\n", os.Args[0])
		os.Exit(1)
	}

	uuid = os.Args[1]
}

func main() {
	// Disable echo for stdin.
	termios, err := unix.IoctlGetTermios(0, ioctlReadTermios)
	check(err)

	termios.Lflag &= ^(uint32(unix.ECHO | unix.ICANON))
	termios.Cc[unix.VMIN] = 1
	termios.Cc[unix.VTIME] = 0

	err = unix.IoctlSetTermios(0, ioctlWriteTermios, termios)
	check(err)

	var r parser.Request

	// Read the sheet.
	fname := fmt.Sprintf("sheet-%v.json", uuid)
	b, err := ioutil.ReadFile(fname)
	check(err)

	err = json.Unmarshal(b, &r.Sheet)
	check(err)

	// Read stdin.
	stdin := bufio.NewReader(os.Stdin)
	for {
		s, err := stdin.ReadString('\n')
		if err != nil {
			if err != io.EOF {
				log.Fatal(err)
				break
			}

			continue
		}

		s = strings.Trim(s, "\r\n")
		if s == "end of kernel" {
			break
		}

		r.Log = append(r.Log, s)
	}

	// Parse.
	p := parser.New()
	result := p.Parse(&r)

	// Print.
	fmt.Print(result)
}