Browse Source

Updated: Added logging to file. We chdir.

We need to chdir to the exe file so we know where our
config files are, and where we will create logfiles.
Steve Thielemann 3 years ago
parent
commit
191975b6de
6 changed files with 107 additions and 21 deletions
  1. 1 0
      door/convert.go
  2. 24 9
      door/door.go
  3. 9 9
      door/input.go
  4. 6 1
      door/input_test.go
  5. 65 2
      door/menu_test.go
  6. 2 0
      door/panel.go

+ 1 - 0
door/convert.go

@@ -6,6 +6,7 @@ package door
 // This converts CP437 to Unicode for rendering in Unicode terminals
 // like the linux telnet client.
 // This does everything but: \x07, \x08, \x0a and \x0d.
+// 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x1b (ANSI spec)
 func CP437_to_Unicode(cp437 string) string {
 	var result string
 

+ 24 - 9
door/door.go

@@ -22,7 +22,9 @@ import (
 	"bufio"
 	"flag"
 	"fmt"
+	"log"
 	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"syscall"
@@ -208,10 +210,10 @@ func (d *Door) detect() {
 		r, err := syscall.Read(d.READFD, buffer)
 		results = string(buffer[:r])
 		output := strings.Replace(results, "\x1b", "^[", -1)
-		fmt.Println("DETECT:", r, err, output)
+		log.Println("DETECT:", r, err, output)
 	} else {
 		// local telnet echos the reply  :()
-		fmt.Println("DETECT: Nothing received.")
+		log.Println("DETECT: Nothing received.")
 		return
 	}
 
@@ -249,7 +251,7 @@ func (d *Door) detect() {
 					width := results[:pos]
 
 					Width, err = strconv.Atoi(width)
-					fmt.Printf("Width: %s, %d, %v\n", results, Width, err)
+					log.Printf("Width: %s, %d, %v\n", results, Width, err)
 				}
 			} else {
 				Height = 0
@@ -257,26 +259,39 @@ func (d *Door) detect() {
 			}
 		}
 	}
-	fmt.Printf("Unicode %v Screen: %d X %d\n", Unicode, Width, Height)
+	log.Printf("Unicode %v Screen: %d X %d\n", Unicode, Width, Height)
 }
 
 // Initialize door framework.  Parse commandline, read dropfile,
 // detect terminal capabilities.
-func (d *Door) Init() {
+func (d *Door) Init(doorname string) {
 	var dropfile string
 	d.Pushback = NewFIFOBuffer(5)
 
+	// Get path to binary, and chdir to it.
+	binaryPath, _ := os.Executable()
+	binaryPath = filepath.Dir(binaryPath)
+	_ = os.Chdir(binaryPath)
+
 	flag.StringVar(&dropfile, "d", "", "Path to dropfile")
 	flag.Parse()
 	if len(dropfile) == 0 {
 		flag.PrintDefaults()
 		os.Exit(2)
 	}
-	fmt.Printf("Loading: %s\n", dropfile)
 
 	d.ReadDropfile(dropfile)
+	logfilename := fmt.Sprintf("%s-%d.log", doorname, d.Config.Node)
+	logf, err := os.OpenFile(logfilename, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)
+	if err != nil {
+		panic(fmt.Sprintf("Error creating log file %s: %v", logfilename, err))
+	}
+
+	log.SetOutput(logf)
+	//= log.New(logf, fmt.Sprintf("%s-%d", doorname, d.Config.Node), log.Ldate|log.Ltime|log.Lshortfile)
+	log.Printf("Loading dropfile %s\n", dropfile)
 
-	fmt.Printf("BBS %s, User %s / Handle %s / File %d\n", d.Config.BBSID, d.Config.Real_name, d.Config.Handle, d.Config.Comm_handle)
+	log.Printf("BBS %s, User %s / Handle %s / File %d\n", d.Config.BBSID, d.Config.Real_name, d.Config.Handle, d.Config.Comm_handle)
 	d.detect()
 	if Unicode {
 		BOXES = BOXES_UNICODE
@@ -295,12 +310,12 @@ func (d *Door) Write(output string) {
 	buffer := []byte(output)
 	n, err := syscall.Write(d.WRITEFD, buffer)
 	if err != nil {
-		fmt.Println("Write error/HANGUP?", n)
+		log.Println("Write error/HANGUP?", n)
 		d.Disconnected = true
 	}
 	// No, this isn't it.  The # of bytes in buffer == bytes written.
 	if n != len(buffer) {
-		fmt.Printf("Write fail: %d != %d\n", len(buffer), n)
+		log.Printf("Write fail: %d != %d\n", len(buffer), n)
 	}
 }
 

+ 9 - 9
door/input.go

@@ -1,7 +1,7 @@
 package door
 
 import (
-	"fmt"
+	"log"
 	"strconv"
 	"strings"
 	"syscall"
@@ -101,7 +101,7 @@ func (d *Door) getch() int {
 	r, err := syscall.Read(d.READFD, buffer)
 	if r != 1 {
 		// I'm getting write error here... (when disconnected)
-		fmt.Printf("Read said ready, but didn't read a character %d %v.\n", r, err)
+		log.Printf("Read said ready, but didn't read a character %d %v.\n", r, err)
 		// hangup
 		d.Disconnected = true
 		return -2
@@ -116,7 +116,7 @@ func (d *Door) getkey_or_pushback() int {
 
 	if false {
 		key := d.getch()
-		fmt.Printf("%d / %X\n", key, key)
+		log.Printf("%d / %X\n", key, key)
 		return key
 	} else {
 		return d.getch()
@@ -151,7 +151,7 @@ func (d *Door) GetKey() int {
 			if c2 != 0x00 && c2 != 0x0a {
 				// wasn't 0x00 or 0x0a
 				d.Pushback.Push(c2)
-				// fmt.Printf("Push 0x0d trailer %d / %x\n", c2, c2)
+				// log.Printf("Push 0x0d trailer %d / %x\n", c2, c2)
 			}
 		}
 		return c
@@ -217,7 +217,7 @@ func (d *Door) GetKey() int {
 		case 0x53:
 			return XKEY_DELETE
 		default:
-			fmt.Printf("ERROR Doorway mode: 0x00 %x\n", c2)
+			log.Printf("ERROR Doorway mode: 0x00 %x\n", c2)
 			return XKEY_UNKNOWN
 		}
 	}
@@ -264,7 +264,7 @@ func (d *Door) GetKey() int {
 			return XKEY_INSERT
 		case "[1":
 			// Syncterm is lost, could be F1..F5?
-			fmt.Printf("ERROR (Syncterm) Extended %#v\n", extended)
+			log.Printf("ERROR (Syncterm) Extended %#v\n", extended)
 			return XKEY_UNKNOWN
 		case "[2~":
 			return XKEY_INSERT // terminal
@@ -301,7 +301,7 @@ func (d *Door) GetKey() int {
 		case "Ot":
 			return XKEY_F5 // syncterm
 		default:
-			fmt.Printf("ERROR Extended %#v\n", extended)
+			log.Printf("ERROR Extended %#v\n", extended)
 			return XKEY_UNKNOWN
 		}
 
@@ -336,7 +336,7 @@ retry:
 		errno, ok := err.(syscall.Errno)
 		if ok && errno == syscall.EINTR {
 			// Should I retry my syscall.Select here?  Yes! -1 is not return value.
-			fmt.Printf("WaitKey: EINTR\n")
+			log.Printf("WaitKey: EINTR\n")
 			goto retry
 			// return -1
 		}
@@ -348,7 +348,7 @@ retry:
 			This seemed to happen when I called WaitKey many times with usecs.
 		*/
 
-		fmt.Println("-1 : ", err)
+		log.Println("-1 : ", err)
 		// hangup ?!
 		return -2
 	}

+ 6 - 1
door/input_test.go

@@ -43,11 +43,16 @@ func TestDoorInputConnection(t *testing.T) {
 	tmpFile.Close()
 
 	d := Door{}
+
+	// If I call d.Init() more then once flag complains about flag redefined.
 	// Reset flags
 	flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
 	// preset commandline args so door can init
 	os.Args = []string{"door", "-d", tmpFile.Name()}
-	d.Init()
+	d.Init("input-test")
+
+	// clean up logfile
+	defer os.Remove("input-test-12.log")
 
 	// Ok!
 	if !Unicode {

+ 65 - 2
door/menu_test.go

@@ -6,6 +6,7 @@ import (
 	"io/ioutil"
 	"net"
 	"os"
+	"strings"
 	"testing"
 	"time"
 )
@@ -50,7 +51,10 @@ func TestMenuConnection(t *testing.T) {
 	flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
 	// preset commandline args so door can init
 	os.Args = []string{"door", "-d", tmpFile.Name()}
-	d.Init()
+	d.Init("menu-test")
+
+	// clean up log file
+	defer os.Remove("menu-test-12.log")
 
 	// Ok!
 	if !Unicode {
@@ -66,12 +70,71 @@ func TestMenuConnection(t *testing.T) {
 	}
 
 	// These are the commands sent to detect ... throw this all away.
-	buffer = make([]byte, 128)
+	buffer = make([]byte, 1024)
 	server.SetReadDeadline(time.Now().Add(time.Millisecond * 20))
 	_, err = server.Read(buffer)
 	// t.Errorf("Buffer : %#v\n", buffer[:r])
 	server.SetReadDeadline(time.Time{})
 
 	// Ready to test!
+	m := Menu{Panel: Panel{Width: 10,
+		X:     2,
+		Y:     2,
+		Style: DOUBLE,
+	}}
+
+	// Use simple renders for testing
+	m.SelectedR = func(text string) string {
+		return ColorText("BLACK ON WHITE") + text
+	}
+	m.UnselectedR = func(text string) string {
+		return ColorText("WHI ON BLA") + text
+	}
+
+	m.AddSelection("A", "ART")
+	m.AddSelection("B", "BOO")
+	m.AddSelection("C", "Cat")
+
+	var choice int
+
+	// preload the key buffer with commands
+	// BUG:  I can't use \x1b[A because of the way extended codes work there.
+	keys := "\x00\x50\x00\x50\r" // down, down, ENTER
+	server.Write([]byte(keys))
+
+	choice = m.Choose(&d)
+
+	if choice != 3 {
+		t.Errorf("Expected menu option C, got %d / %c", choice, m.GetOption(choice))
+	}
+
+	// Read the display output
+	server.SetReadDeadline(time.Now().Add(time.Millisecond * 200))
+	r, err := server.Read(buffer)
+	server.SetReadDeadline(time.Time{})
+	output := string(buffer[:r])
+	// t.Errorf("OUTPUT: (len %d) %#v", r, output)
+
+	parts := strings.SplitAfter(output, "H")
+	for _, part := range parts {
+		t.Logf("Got: %#v", part)
+	}
+
+	m.Chosen = 1
+
+	keys = "\x00\x48\r" // up, ENTER
+	server.Write([]byte(keys))
+
+	choice = m.Choose(&d)
+
+	if choice != 1 {
+		t.Errorf("Expected menu option A, got %d / %c", choice, m.GetOption(choice))
+	}
+
+	// Read the display output
+	server.SetReadDeadline(time.Now().Add(time.Millisecond * 200))
+	r, err = server.Read(buffer)
+	server.SetReadDeadline(time.Time{})
+	output = string(buffer[:r])
 
 }

+ 2 - 0
door/panel.go

@@ -105,6 +105,8 @@ func (p *Panel) UpdateLine(index int) string {
 	var output string
 	var style int = int(p.Style)
 
+	p.Lines[index].Update()
+
 	row := p.Y + index
 	col := p.X
 	if style > 0 {