summaryrefslogtreecommitdiff
path: root/internal/recordline/recordline.go
blob: 5ff06abdb39be6a2dda458466717a1a3a72621a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package recordline

import (
	"strconv"
	"strings"
)

// Fields holds the values parsed from a single uptimed record line.
type Fields struct {
	Uptime      uint64
	BootTime    uint64
	OS          string
	KernelName  string
	KernelMajor string
}

// Parse parses one non-empty line of the form "uptime:boottime:os..." from an
// uptimed .records file. It returns false if the line is empty or malformed.
func Parse(line string) (Fields, bool) {
	line = strings.TrimSpace(line)
	if line == "" {
		return Fields{}, false
	}
	parts := strings.SplitN(line, ":", 3)
	if len(parts) != 3 {
		return Fields{}, false
	}
	uptime, err := strconv.ParseUint(parts[0], 10, 64)
	if err != nil {
		return Fields{}, false
	}
	bootTime, err := strconv.ParseUint(parts[1], 10, 64)
	if err != nil {
		return Fields{}, false
	}
	osStr := parts[2]
	kernelName := osStr
	if i := strings.Index(osStr, " "); i > 0 {
		kernelName = osStr[:i]
	}
	kernelMajor := kernelName + " "
	rest := osStr
	if i := strings.Index(osStr, " "); i >= 0 {
		rest = osStr[i+1:]
	}
	if j := strings.Index(rest, "."); j >= 0 {
		kernelMajor += rest[:j] + "..."
	} else {
		kernelMajor += rest + "..."
	}
	return Fields{
		Uptime:      uptime,
		BootTime:    bootTime,
		OS:          osStr,
		KernelName:  kernelName,
		KernelMajor: kernelMajor,
	}, true
}