mirror of
https://github.com/la5nta/pat
synced 2026-08-13 17:46:54 -04:00
By doing graceful shutdown, we're able to properly close all of the open resources such as modem connections and ongoing sessions. This will allow transport drivers controlling stateful TNCs (e.g. ptc-go) to recover the initial TNC state before termination. Resolves #314
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
// Copyright 2016 Martin Hebnes Pedersen (LA5NTA). All rights reserved.
|
|
// Use of this source code is governed by the MIT-license that can be
|
|
// found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/spf13/pflag"
|
|
)
|
|
|
|
var ErrNoCmd = fmt.Errorf("no cmd")
|
|
|
|
type Command struct {
|
|
Str string
|
|
Aliases []string
|
|
Desc string
|
|
HandleFunc func(ctx context.Context, args []string)
|
|
Usage string
|
|
Options map[string]string
|
|
Example string
|
|
|
|
LongLived bool
|
|
MayConnect bool
|
|
}
|
|
|
|
func (cmd Command) PrintUsage() {
|
|
fmt.Fprintf(os.Stderr, "%s - %s\n", cmd.Str, cmd.Desc)
|
|
|
|
fmt.Fprintf(os.Stderr, "\nUsage:\n %s %s\n", cmd.Str, strings.TrimSpace(cmd.Usage))
|
|
|
|
if len(cmd.Options) > 0 {
|
|
fmt.Fprint(os.Stderr, "\nOptions:\n")
|
|
for f, desc := range cmd.Options {
|
|
fmt.Fprintf(os.Stderr, " %-17s %s\n", f, desc)
|
|
}
|
|
}
|
|
|
|
if cmd.Example != "" {
|
|
fmt.Fprintf(os.Stderr, "\nExample:\n %s\n", strings.TrimSpace(cmd.Example))
|
|
}
|
|
|
|
fmt.Fprint(os.Stderr, "\n")
|
|
}
|
|
|
|
func parseFlags(args []string) (cmd Command, arguments []string) {
|
|
var options []string
|
|
var err error
|
|
cmd, options, arguments, err = findCommand(args)
|
|
if err != nil {
|
|
pflag.Usage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
optionsSet().Parse(options)
|
|
|
|
if len(arguments) == 0 {
|
|
arguments = append(arguments, "")
|
|
}
|
|
|
|
switch arguments[0] {
|
|
case "--help", "-help", "help", "-h":
|
|
cmd.PrintUsage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func findCommand(args []string) (cmd Command, pre, post []string, err error) {
|
|
cmdMap := make(map[string]Command, len(commands))
|
|
for _, c := range commands {
|
|
cmdMap[c.Str] = c
|
|
for _, alias := range c.Aliases {
|
|
cmdMap[alias] = c
|
|
}
|
|
}
|
|
|
|
for i, arg := range args {
|
|
if cmd, ok := cmdMap[arg]; ok {
|
|
return cmd, args[1:i], args[i+1:], nil
|
|
}
|
|
}
|
|
err = ErrNoCmd
|
|
return
|
|
}
|