migrate
This commit is contained in:
44
classic/sn/Makefile
Normal file
44
classic/sn/Makefile
Normal file
@@ -0,0 +1,44 @@
|
||||
##
|
||||
##
|
||||
##
|
||||
|
||||
.PHONY: help all
|
||||
|
||||
help: ## This help.
|
||||
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
||||
|
||||
.DEFAULT_GOAL := all
|
||||
|
||||
bin/:
|
||||
@mkdir -p bin
|
||||
|
||||
all: ## build linux, darwin & windows
|
||||
all: linux darwin windows
|
||||
|
||||
linux: bin/ ## build linux binary
|
||||
@go get github.com/marcinbor85/gohex
|
||||
@GOOS=linux GOARCH=amd64 \
|
||||
go build -installsuffix cgo -ldflags=" -s -w" \
|
||||
-o bin/beeon-classic-sn-linux-amd64 \
|
||||
sn.go
|
||||
|
||||
darwin: bin/ ## build darwin binary
|
||||
@go get github.com/marcinbor85/gohex
|
||||
@GOOS=darwin GOARCH=amd64 \
|
||||
go build -installsuffix cgo -ldflags=" -s -w" \
|
||||
-o bin/beeon-classic-sn-darwin-amd64 \
|
||||
sn.go
|
||||
|
||||
windows: bin/ ## build windows binary
|
||||
@go get github.com/marcinbor85/gohex
|
||||
@GOOS=windows GOARCH=amd64 \
|
||||
go build -installsuffix cgo -ldflags=" -s -w" \
|
||||
-o bin/beeon-classic-sn-windows-amd64.exe \
|
||||
sn.go
|
||||
|
||||
mod-tidy:
|
||||
@go clean --modcache
|
||||
@GOPROXY=direct GOSUMDB=off go mod tidy
|
||||
|
||||
clean:
|
||||
@rm -rf bin
|
||||
5
classic/sn/go.mod
Normal file
5
classic/sn/go.mod
Normal file
@@ -0,0 +1,5 @@
|
||||
module microjelly.com/beeon/classic/sn
|
||||
|
||||
go 1.13
|
||||
|
||||
require github.com/marcinbor85/gohex v0.0.0-20200531163658-baab2527a9a2
|
||||
2
classic/sn/go.sum
Normal file
2
classic/sn/go.sum
Normal file
@@ -0,0 +1,2 @@
|
||||
github.com/marcinbor85/gohex v0.0.0-20200531163658-baab2527a9a2 h1:n7R8fUwWZUB2XtyzBNsYNNm9/XgOBj6pvLi7GLMCHtM=
|
||||
github.com/marcinbor85/gohex v0.0.0-20200531163658-baab2527a9a2/go.mod h1:Pb6XcsXyropB9LNHhnqaknG/vEwYztLkQzVCHv8sQ3M=
|
||||
177
classic/sn/sn.go
Normal file
177
classic/sn/sn.go
Normal file
@@ -0,0 +1,177 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/marcinbor85/gohex"
|
||||
)
|
||||
|
||||
var (
|
||||
snLetters = []rune("ABCDEF0123456789")
|
||||
snStock string = "BEE#-##-#######"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
stockSN := snBytes(snStock)
|
||||
|
||||
inhFile := flag.String("inh", "beeon-classic.hex", "input hex file")
|
||||
insFile := flag.String("ins", "beeon-sn.txt", "input sn(s) file")
|
||||
mkFile := flag.Bool("mk", false, "make-file : create random sn(s)")
|
||||
mkPfx := flag.String("mk-p", "#-##", "make-file-prefix : string to add befoer random sn(s)")
|
||||
mkAmount := flag.Int("mk-a", 1024, "make-file-amount : how many random sn(s) to make")
|
||||
flag.Parse()
|
||||
|
||||
// make the sn(s) if being asked
|
||||
if *mkFile {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
made := 0
|
||||
failLimit := 20
|
||||
randStrings := make([]string, *mkAmount)
|
||||
for made < *mkAmount {
|
||||
newS := strings.ToUpper(randSeq(7))
|
||||
if contains(randStrings, newS) {
|
||||
failLimit--
|
||||
if failLimit < 0 {
|
||||
break
|
||||
}
|
||||
continue
|
||||
}
|
||||
randStrings[made] = newS
|
||||
made++
|
||||
}
|
||||
|
||||
for _, v := range randStrings {
|
||||
fmt.Printf("%s-%s\n", *mkPfx, v)
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
// else patch hex and dump to stdout
|
||||
sFile, err := os.OpenFile(*insFile, os.O_RDWR, 0666)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer sFile.Close()
|
||||
line, err := popLine(sFile)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if string(line) == "" {
|
||||
panic(fmt.Errorf("no sn(s) %v", line))
|
||||
}
|
||||
newSN := snBytes(strings.Trim(string(line), "\n"))
|
||||
|
||||
hFile, err := os.Open(*inhFile)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer hFile.Close()
|
||||
|
||||
mem := gohex.NewMemory()
|
||||
err = mem.ParseIntelHex(hFile)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
rawBytes := mem.ToBinary(0x0000, 8192, 0x00)
|
||||
indexSN := bytes.Index(rawBytes, stockSN)
|
||||
|
||||
// patch in new SN +6 (BxExEx<>)
|
||||
mem.SetBinary(uint32(indexSN+6), newSN)
|
||||
|
||||
mem.DumpIntelHex(os.Stdout, 16)
|
||||
}
|
||||
|
||||
func randSeq(n int) string {
|
||||
b := make([]rune, n)
|
||||
for i := range b {
|
||||
b[i] = snLetters[rand.Intn(len(snLetters))]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func contains(a []string, x string) bool {
|
||||
for _, n := range a {
|
||||
if x == n {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func snBytes(i string) []byte {
|
||||
|
||||
bytes := make([]byte, len(i)*2)
|
||||
r := []byte(i)
|
||||
idx := 0
|
||||
for _, rx := range r {
|
||||
bytes[idx] = rx
|
||||
idx = idx + 2
|
||||
}
|
||||
return bytes
|
||||
|
||||
}
|
||||
|
||||
func snString(i string) string {
|
||||
o := "{ \"SN\": ["
|
||||
r := []rune(i)
|
||||
c := ""
|
||||
for _, rx := range r {
|
||||
o = fmt.Sprintf("%s%s-%d, 0", o, c, rx)
|
||||
c = ", "
|
||||
}
|
||||
return o + " ] }"
|
||||
}
|
||||
|
||||
func popLine(f *os.File) ([]byte, error) {
|
||||
fi, err := f.Stat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
buf := bytes.NewBuffer(make([]byte, 0, fi.Size()))
|
||||
|
||||
_, err = f.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = io.Copy(buf, f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
line, err := buf.ReadBytes('\n')
|
||||
if err != nil && err != io.EOF {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_, err = f.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
nw, err := io.Copy(f, buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = f.Truncate(nw)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = f.Sync()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_, err = f.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return line, nil
|
||||
}
|
||||
Reference in New Issue
Block a user