These are my books! Ow!

Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>

git-svn-id: file:///srv/svn/repo/tokiko/trunk@15 8f5ca974-a7f8-e144-9f80-d41d5039c194
This commit is contained in:
yakumo.izuru 2023-10-12 22:35:31 +00:00
parent 0eab3816aa
commit e8bcb5c8de
7 changed files with 111 additions and 168 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
tokiko

36
Makefile Normal file
View File

@ -0,0 +1,36 @@
GO ?= go
RM ?= rm
GOFLAGS ?= -v -ldflags "-w -X `go list`.Version=$(VERSION) -X `go list`.Commit=$(COMMIT) -X `go list`.Build=$(BUILD)" -mod=vendor
PREFIX ?= /usr/local
BINDIR ?= bin
MANDIR ?= share/man
MKDIR ?= mkdir
CP ?= cp
SYSCONFDIR ?= /etc
VERSION = `git describe --abbrev=0 --tags 2>/dev/null || echo "$VERSION"`
COMMIT = `git rev-parse --short HEAD || echo "$COMMIT"`
BRANCH = `git rev-parse --abbrev-ref HEAD`
BUILD = `git show -s --pretty=format:%cI`
GOARCH ?= amd64
GOOS ?= linux
all: tokiko
tokiko:
$(GO) build $(GOFLAGS) ./cmd/tokiko
clean:
$(RM) -f tokiko
install:
$(MKDIR) -p $(DESTDIR)$(PREFIX)/$(BINDIR)
$(MKDIR) -p $(DESTDIR)$(PREFIX)/$(MANDIR)/man1
$(MKDIR) -p $(DESTDIR)${SYSCONFDIR}/tokiko
$(CP) -f tokiko $(DESTDIR)$(PREFIX)/$(BINDIR)
$(CP) -f doc/tokiko.1 $(DESTDIR)$(PREFIX)/$(MANDIR)/man1
[ -f $(DESTDIR)${SYSCONFDIR}/tokiko/config.ini ] || $(CP) -f config.ini $(DESTDIR)${SYSCONFDIR}/tokiko/config.ini
test:
go test
vendor:
go mod vendor
.PHONY: tokiko clean install

19
README
View File

@ -3,15 +3,18 @@ Tokiko
A simple gopher daemon written in Golang.
Forked from shokara/thomomys
Flags
-----
-i = IP address for Tokiko to listen on (Default: 0.0.0.0)
-p = Port for Tokiko to listen on (Default: 70)
-h = Default hostname that gets printed for links (Default: localhost)
-d = Root directory that gets served (Default: current directory)
Config
------
addr = IP address for Tokiko to listen on (Default: 127.0.0.1)
port = Port for Tokiko to listen on (Default: 70)
hostname = Default hostname that gets printed for links (Default: localhost)
rootdir = Root directory that gets served (Default: /var/gopher)
Why?
----
Anything can and will happen. Simple as that.
And while environment variables are okay, they are rather messy to deal with, in my opinion, but that's just me I guess.
Yes.
Credits
-------
I blatantly copied the parseconfig code from https://git.z3bra.org/partage

6
go.mod
View File

@ -1,3 +1,7 @@
module gt.kalli.st/novaburst/thomomys
module marisa.chaotic.ninja/tokiko
go 1.18
require gopkg.in/ini.v1 v1.67.0
require github.com/stretchr/testify v1.8.4 // indirect

7
go.sum Normal file
View File

@ -0,0 +1,7 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

158
main.go
View File

@ -1,158 +0,0 @@
// A barebones gopher server written in Golang
// This fork in particular uses flags instead of environment variables.
// Copyright:
// (C) 2021 Shokara Kou
// (C) 2023 Izuru Yakumo
package main
import (
"bufio"
"io"
"log"
"net"
"os"
"strings"
"flag"
)
var (
ADDR_IP string
ADDR_PORT string
HOSTNAME string
SRVDIR string
)
func formatLine(line string) string {
trimmed := strings.TrimRight(line, "\r\n")
splitted := strings.Split(trimmed, "\t")
if len(splitted) == 3 {
return line
} else if len(splitted) == 2 {
line += "\t" + HOSTNAME + "\t" + ADDR_PORT
} else if len(splitted) == 1 {
line += "\tErr\t" + HOSTNAME + "\t" + ADDR_PORT
}
return line + "\n"
}
func writeError(c net.Conn, msg string) {
c.Write([]byte(formatLine("3" + msg)))
}
func printGophermap(c net.Conn, dir string) {
file, err := os.Open(dir + "/Gophermap")
if err != nil {
writeError(c, err.Error())
log.Println(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Println(err)
}
}()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
c.Write([]byte(formatLine(scanner.Text()) + "\n"))
}
c.Write([]byte(".\r\n"))
}
func printFile(c net.Conn, path string) {
file, err := os.Open(path)
if err != nil {
writeError(c, err.Error())
log.Println(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Println(err)
}
}()
const bufSz = 1024
b := make([]byte, bufSz)
for {
readSz, err := file.Read(b)
if err != nil {
if err != io.EOF {
log.Println(err)
}
break
}
c.Write(b[:readSz])
}
}
func connHandle(c net.Conn) {
data, err := bufio.NewReader(c).ReadString('\n')
if err != nil {
log.Println(err)
return
}
selector := strings.TrimRight(data, "\r\n")
if selector == "" {
printGophermap(c, "./")
} else if strings.Contains(selector, "..") {
writeError(c, "Selector contains ..")
} else if selector[0] == '/' {
info, err := os.Stat(selector[1:])
if err != nil {
writeError(c, err.Error())
log.Println(err)
c.Close()
return
}
if info.IsDir() {
printGophermap(c, selector[1:])
} else {
printFile(c, selector[1:])
}
} else {
writeError(c, "Selector doesn't start with a /")
}
c.Close()
}
func init() {
flag.StringVar(&ADDR_IP, "i", "0.0.0.0", "IP address for Tokiko to listen on .Default is 0.0.0.0")
flag.StringVar(&ADDR_PORT, "p", "70", "Port for Tokiko to listen on. Default is 70")
flag.StringVar(&HOSTNAME, "h", "localhost", "Hostname that gets printed for links. Default is localhost")
flag.StringVar(&SRVDIR, "s", ".", "Root directory that gets served. Default is current directory")
}
func main() {
flag.Parse()
LISTEN_ADDR := ADDR_IP + ":" + ADDR_PORT
log.Printf("Starting thomomys on %s\n", LISTEN_ADDR)
os.Chdir(SRVDIR)
l, err := net.Listen("tcp", LISTEN_ADDR)
if err != nil {
log.Fatal(err)
return
}
defer l.Close()
for {
c, err := l.Accept()
if err != nil {
log.Println(err)
return
}
go connHandle(c)
}
}

50
version.go Normal file
View File

@ -0,0 +1,50 @@
package tokiko
import (
"fmt"
"runtime/debug"
"strings"
)
const (
defaultVersion = "0.0.0"
defaultCommit = "HEAD"
defaultBuild = "0000-01-01:00:00+00:00"
)
var (
// Version is the tagged release version in the form <major>.<minor>.<patch>
// following semantic versioning and is overwritten by the build system.
Version = defaultVersion
// Commit is the commit sha of the build (normally from Git) and is overwritten
// by the build system.
Commit = defaultCommit
// Build is the date and time of the build as an RFC3339 formatted string
// and is overwritten by the build system.
Build = defaultBuild
)
// FullVersion display the full version and build
func FullVersion() string {
var sb strings.Builder
isDefault := Version == defaultVersion && Commit == defaultCommit && Build == defaultBuild
if !isDefault {
sb.WriteString(fmt.Sprintf("%s@%s %s", Version, Commit, Build))
}
if info, ok := debug.ReadBuildInfo(); ok {
if isDefault {
sb.WriteString(fmt.Sprintf(" %s", info.Main.Version))
}
sb.WriteString(fmt.Sprintf(" %s", info.GoVersion))
if info.Main.Sum != "" {
sb.WriteString(fmt.Sprintf(" %s", info.Main.Sum))
}
}
return sb.String()
}