121 lines
3.4 KiB
Go
121 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"git.xdrm.io/logauth/schastsp/client"
|
|
"git.xdrm.io/logauth/schastsp/context"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
|
|
executionStart := time.Now().UnixNano()
|
|
|
|
/* (1) Flag management (cli arguments)
|
|
---------------------------------------------------------*/
|
|
/* (1) Secret folder */
|
|
clientConfigPath := flag.String("file", "/tmp/schastsp_keys", "Configuration folder, it will contain sensitive data (keys), make sure to control it properly.")
|
|
|
|
/* (2) request | response */
|
|
isRequest := flag.Bool("req", false, "Will generate a request into standard output.")
|
|
isResponse := flag.Bool("res", false, "Will proceed a response management from standard input.")
|
|
|
|
/* (3) Context window size */
|
|
winSize := flag.Uint("win", 2000, "Time window value in ms.")
|
|
|
|
/* (4) Context minimum depth value */
|
|
minDepth := flag.Uint("min", 0x0f0, "Minimum depth value.")
|
|
|
|
/* (5) Context maximum depth value */
|
|
maxDepth := flag.Uint("max", 0xfff, "Maximum depth value.")
|
|
|
|
/* (6) Context depth threshold */
|
|
thrDepth := flag.Uint("thr", 0x00a, "Depth threshold protecting minimum depth to be reached.")
|
|
|
|
/* (7) Synchronisation request (special order) */
|
|
syncRequest := flag.Bool("sync", false, "If set, proceeds a synchronisation request and outputs the synchronisation key.")
|
|
|
|
/* (8) Parse flags */
|
|
flag.Parse()
|
|
|
|
/* (2) Create context + client
|
|
---------------------------------------------------------*/
|
|
/* (1) Create context */
|
|
ctx, err := context.Create(float64(*winSize)/1e3, uint16(*minDepth), uint16(*thrDepth), uint16(*maxDepth))
|
|
if err != nil {
|
|
os.Stderr.WriteString(fmt.Sprintf("[CLIENT_ERROR:context] %s\n", err))
|
|
return
|
|
}
|
|
|
|
/* (2) Create client */
|
|
cli, err := client.New(ctx, *clientConfigPath)
|
|
if err != nil {
|
|
os.Stderr.WriteString(fmt.Sprintf("[CLIENT_ERROR:client] %s\n", err))
|
|
return
|
|
}
|
|
|
|
/* (3) Dispatch execution
|
|
---------------------------------------------------------*/
|
|
/* (1) If synchronisation request */
|
|
if *syncRequest {
|
|
synchronisationRequest(cli)
|
|
|
|
/* (2) If request */
|
|
} else if *isRequest {
|
|
|
|
err = cli.Send(os.Stdout)
|
|
if err != nil {
|
|
os.Stderr.WriteString(fmt.Sprintf("[CLIENT_ERROR:request] %s\n", err))
|
|
}
|
|
|
|
/* (3) If response */
|
|
} else if *isResponse {
|
|
|
|
err = cli.Receive(os.Stdin)
|
|
if err != nil {
|
|
os.Stderr.WriteString(fmt.Sprintf("[CLIENT_ERROR:response] %s\n", err))
|
|
return
|
|
}
|
|
|
|
/* (4) Else -> nothing */
|
|
} else {
|
|
os.Stderr.WriteString(fmt.Sprintf("Missing argument.\n\nYou must give one of the 3 available actions :\n -req to manage a request\n -res to manage a response\n -sync to get a synchronisation key\n"))
|
|
}
|
|
|
|
executionStop := time.Now().UnixNano()
|
|
nsElapsed := float64(executionStop - executionStart)
|
|
usElapsed := float64(nsElapsed / 1e3)
|
|
msElapsed := float64(usElapsed / 1e3)
|
|
sElapsed := float64(msElapsed / 1e3)
|
|
|
|
if sElapsed >= 1 {
|
|
os.Stderr.WriteString(fmt.Sprintf("executed in %.3f s\n", sElapsed))
|
|
} else if msElapsed >= 1 {
|
|
os.Stderr.WriteString(fmt.Sprintf("executed in %.3f ms\n", msElapsed))
|
|
} else if usElapsed >= 1 {
|
|
os.Stderr.WriteString(fmt.Sprintf("executed in %.3f us\n", usElapsed))
|
|
} else if nsElapsed >= 1 {
|
|
os.Stderr.WriteString(fmt.Sprintf("executed in %.3f ns\n", nsElapsed))
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func synchronisationRequest(cli *client.T) {
|
|
|
|
/* (1) Get synchronisation key */
|
|
syncKey, err := cli.SynchronisationKey()
|
|
if err != nil {
|
|
fmt.Errorf("[CLIENT_ERROR:syncKey] %s\n", err)
|
|
return
|
|
}
|
|
|
|
/* (2) Print synchronisation key */
|
|
os.Stdout.Write(syncKey)
|
|
|
|
return
|
|
|
|
}
|