Version 0.0.1
This commit is contained in:
parent
469cb9f52d
commit
7b9c878d8f
43 changed files with 1063 additions and 7209 deletions
163
cmd/main/main.go
Normal file
163
cmd/main/main.go
Normal file
|
@ -0,0 +1,163 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"puppy"
|
||||
)
|
||||
|
||||
var logBanner string = `
|
||||
========================================
|
||||
PUPPYSTARTEDPUPPYSTARTEDPUPPYSTARTEDPUPP
|
||||
.--. .---.
|
||||
/:. '. .' .. '._.---.
|
||||
/:::-. \.-"""-;' .-:::. .::\
|
||||
/::'| '\/ _ _ \' '\:' ::::|
|
||||
__.' | / (o|o) \ ''. ':/
|
||||
/ .:. / | ___ | '---'
|
||||
| ::::' /: (._.) .:\
|
||||
\ .=' |:' :::|
|
||||
'""' \ .-. ':/
|
||||
'---'|I|'---'
|
||||
jgs '-'
|
||||
PUPPYSTARTEDPUPPYSTARTEDPUPPYSTARTEDPUPP
|
||||
========================================
|
||||
`
|
||||
|
||||
type listenArg struct {
|
||||
Type string
|
||||
Addr string
|
||||
}
|
||||
|
||||
func quitErr(msg string) {
|
||||
os.Stderr.WriteString(msg)
|
||||
os.Stderr.WriteString("\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func checkErr(err error) {
|
||||
if err != nil {
|
||||
quitErr(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func parseListenString(lstr string) (*listenArg, error) {
|
||||
args := strings.SplitN(lstr, ":", 2)
|
||||
if len(args) != 2 {
|
||||
return nil, errors.New("invalid listener. Must be in the form of \"tye:addr\"")
|
||||
}
|
||||
argStruct := &listenArg{
|
||||
Type: strings.ToLower(args[0]),
|
||||
Addr: args[1],
|
||||
}
|
||||
if argStruct.Type != "tcp" && argStruct.Type != "unix" {
|
||||
return nil, fmt.Errorf("invalid listener type: %s", argStruct.Type)
|
||||
}
|
||||
return argStruct, nil
|
||||
}
|
||||
|
||||
func unixAddr() string {
|
||||
return fmt.Sprintf("%s/proxy.%d.%d.sock", os.TempDir(), os.Getpid(), time.Now().UnixNano())
|
||||
}
|
||||
|
||||
var mln net.Listener
|
||||
var logger *log.Logger
|
||||
|
||||
func cleanup() {
|
||||
if mln != nil {
|
||||
mln.Close()
|
||||
}
|
||||
}
|
||||
|
||||
var MainLogger *log.Logger
|
||||
|
||||
func main() {
|
||||
defer cleanup()
|
||||
// Handle signals
|
||||
sigc := make(chan os.Signal, 1)
|
||||
signal.Notify(sigc, os.Interrupt, os.Kill, syscall.SIGTERM)
|
||||
go func() {
|
||||
<-sigc
|
||||
if logger != nil {
|
||||
logger.Println("Caught signal. Cleaning up.")
|
||||
}
|
||||
cleanup()
|
||||
os.Exit(0)
|
||||
}()
|
||||
|
||||
msgListenStr := flag.String("msglisten", "", "Listener for the message handler. Examples: \"tcp::8080\", \"tcp:127.0.0.1:8080\", \"unix:/tmp/foobar\"")
|
||||
autoListen := flag.Bool("msgauto", false, "Automatically pick and open a unix or tcp socket for the message listener")
|
||||
debugFlag := flag.Bool("dbg", false, "Enable debug logging")
|
||||
flag.Parse()
|
||||
|
||||
if *debugFlag {
|
||||
logfile, err := os.OpenFile("log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
checkErr(err)
|
||||
logger = log.New(logfile, "[*] ", log.Lshortfile)
|
||||
} else {
|
||||
logger = log.New(ioutil.Discard, "[*] ", log.Lshortfile)
|
||||
log.SetFlags(0)
|
||||
}
|
||||
MainLogger = logger
|
||||
|
||||
// Parse arguments to structs
|
||||
if *msgListenStr == "" && *autoListen == false {
|
||||
quitErr("message listener address or `--msgauto` required")
|
||||
}
|
||||
if *msgListenStr != "" && *autoListen == true {
|
||||
quitErr("only one of listener address or `--msgauto` can be used")
|
||||
}
|
||||
|
||||
// Create the message listener
|
||||
var listenStr string
|
||||
if *msgListenStr != "" {
|
||||
msgAddr, err := parseListenString(*msgListenStr)
|
||||
checkErr(err)
|
||||
if msgAddr.Type == "tcp" {
|
||||
var err error
|
||||
mln, err = net.Listen("tcp", msgAddr.Addr)
|
||||
checkErr(err)
|
||||
} else if msgAddr.Type == "unix" {
|
||||
var err error
|
||||
mln, err = net.Listen("unix", msgAddr.Addr)
|
||||
checkErr(err)
|
||||
} else {
|
||||
quitErr("unsupported listener type:" + msgAddr.Type)
|
||||
}
|
||||
listenStr = fmt.Sprintf("%s:%s", msgAddr.Type, msgAddr.Addr)
|
||||
} else {
|
||||
fpath := unixAddr()
|
||||
ulisten, err := net.Listen("unix", fpath)
|
||||
if err == nil {
|
||||
mln = ulisten
|
||||
listenStr = fmt.Sprintf("unix:%s", fpath)
|
||||
} else {
|
||||
tcplisten, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
quitErr("unable to open any messaging ports")
|
||||
}
|
||||
mln = tcplisten
|
||||
listenStr = fmt.Sprintf("tcp:%s", tcplisten.Addr().String())
|
||||
}
|
||||
}
|
||||
|
||||
// Set up the intercepting proxy
|
||||
iproxy := puppy.NewInterceptingProxy(logger)
|
||||
iproxy.AddHTTPHandler("puppy", puppy.CreateWebUIHandler())
|
||||
|
||||
// Create a message server and have it serve for the iproxy
|
||||
mserv := puppy.NewProxyMessageListener(logger, iproxy)
|
||||
logger.Print(logBanner)
|
||||
fmt.Println(listenStr)
|
||||
mserv.Serve(mln) // serve until killed
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue