(possibly) Added UDP linker capabilities
This commit is contained in:
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
Experimenting with a Go server for personal uses. Combines a simple website server with a tcp forwarder.
|
Experimenting with a Go server for personal uses. Combines a simple website server with a tcp forwarder.
|
||||||
|
|
||||||
Configure which ports go to which addresses via /etc/darkstorm-server.conf in the form `port address`.
|
Configure which ports go to which addresses via /etc/darkstorm-server.conf in the form `type port address`. If type is not given, tcp is assumed.
|
||||||
|
|||||||
+25
-14
@@ -12,7 +12,12 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func tcpLinker() {
|
type link struct {
|
||||||
|
addr string
|
||||||
|
linkType string
|
||||||
|
}
|
||||||
|
|
||||||
|
func linker() {
|
||||||
links, err := parseConf()
|
links, err := parseConf()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error while trying to parse config file:", err, "tcp linker signing off")
|
log.Println("Error while trying to parse config file:", err, "tcp linker signing off")
|
||||||
@@ -28,7 +33,7 @@ func tcpLinker() {
|
|||||||
open := make(map[int]bool)
|
open := make(map[int]bool)
|
||||||
for port, addr := range links {
|
for port, addr := range links {
|
||||||
open[port] = true
|
open[port] = true
|
||||||
go link(port, addr, failChan)
|
go createLink(port, addr, failChan)
|
||||||
}
|
}
|
||||||
failWaiting:
|
failWaiting:
|
||||||
for portFail := <-failChan; ; portFail = <-failChan {
|
for portFail := <-failChan; ; portFail = <-failChan {
|
||||||
@@ -51,13 +56,14 @@ failWaiting:
|
|||||||
}
|
}
|
||||||
fails[portFail]++
|
fails[portFail]++
|
||||||
log.Println("Restarting linking for port", portFail)
|
log.Println("Restarting linking for port", portFail)
|
||||||
go link(portFail, links[portFail], failChan)
|
go createLink(portFail, links[portFail], failChan)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func link(port int, addr string, failChan chan int) {
|
func createLink(port int, l link, failChan chan int) {
|
||||||
listen, err := net.Listen("tcp", ":"+strconv.Itoa(port))
|
log.Println("Linking", port, "to", l.addr, "with type", l.linkType)
|
||||||
|
listen, err := net.Listen(l.linkType, ":"+strconv.Itoa(port))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error while trying to listen to port ", port, ":", err)
|
log.Println("Error while trying to listen to port ", port, ":", err)
|
||||||
failChan <- port
|
failChan <- port
|
||||||
@@ -71,16 +77,16 @@ func link(port int, addr string, failChan chan int) {
|
|||||||
failChan <- port
|
failChan <- port
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = copyConn(con, addr)
|
err = copyConn(con, l)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error while trying copy data from port", port, "to address", addr, ":", err)
|
log.Println("Error while trying copy data from port", port, "to address", l.addr, ":", err)
|
||||||
failChan <- port
|
failChan <- port
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseConf() (links map[int]string, err error) {
|
func parseConf() (links map[int]link, err error) {
|
||||||
conf, err := os.Open("/etc/darkstorm-server.conf")
|
conf, err := os.Open("/etc/darkstorm-server.conf")
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@@ -88,7 +94,7 @@ func parseConf() (links map[int]string, err error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
lineNum := 0
|
lineNum := 0
|
||||||
links = make(map[int]string)
|
links = make(map[int]link)
|
||||||
rdr := bufio.NewReader(conf)
|
rdr := bufio.NewReader(conf)
|
||||||
multilineComment := false
|
multilineComment := false
|
||||||
var line string
|
var line string
|
||||||
@@ -130,15 +136,20 @@ func parseConf() (links map[int]string, err error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
split := strings.Split(line, " ")
|
split := strings.Split(line, " ")
|
||||||
if len(split) != 2 {
|
if len(split) < 2 || len(split) > 3 {
|
||||||
return nil, errors.New("invalid line #" + strconv.Itoa(lineNum))
|
return nil, errors.New("invalid line #" + strconv.Itoa(lineNum))
|
||||||
}
|
}
|
||||||
|
var l link
|
||||||
|
if len(split) == 3 {
|
||||||
|
} else {
|
||||||
|
l.linkType = "tcp"
|
||||||
|
}
|
||||||
var i int
|
var i int
|
||||||
i, err = strconv.Atoi(split[0])
|
i, err = strconv.Atoi(split[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("invalid line #" + strconv.Itoa(lineNum))
|
return nil, errors.New("invalid line #" + strconv.Itoa(lineNum))
|
||||||
}
|
}
|
||||||
links[i] = split[1]
|
links[i] = l
|
||||||
line = ""
|
line = ""
|
||||||
}
|
}
|
||||||
err = nil
|
err = nil
|
||||||
@@ -148,10 +159,10 @@ func parseConf() (links map[int]string, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyConn(src net.Conn, addr string) error {
|
func copyConn(src net.Conn, l link) error {
|
||||||
dst, err := net.Dial("tcp", addr)
|
dst, err := net.Dial(l.linkType, l.addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Erro while dialing", addr)
|
log.Println("Erro while dialing", l.addr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
var quitChan chan string = make(chan string)
|
var quitChan chan string = make(chan string)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
go tcpLinker()
|
go linker()
|
||||||
go webserver()
|
go webserver()
|
||||||
for failure := <-quitChan; ; failure = <-quitChan {
|
for failure := <-quitChan; ; failure = <-quitChan {
|
||||||
switch failure {
|
switch failure {
|
||||||
@@ -28,7 +28,7 @@ func tcpLinkerRestart() {
|
|||||||
log.Println("TCP linker failed. Restarting in 5 seconds...")
|
log.Println("TCP linker failed. Restarting in 5 seconds...")
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
log.Println("Restarting tcp linker")
|
log.Println("Restarting tcp linker")
|
||||||
tcpLinker()
|
linker()
|
||||||
}
|
}
|
||||||
|
|
||||||
func websiteRestart() {
|
func websiteRestart() {
|
||||||
|
|||||||
Reference in New Issue
Block a user