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:
parent
0eab3816aa
commit
e8bcb5c8de
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
tokiko
|
36
Makefile
Normal file
36
Makefile
Normal 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
19
README
@ -3,15 +3,18 @@ Tokiko
|
|||||||
A simple gopher daemon written in Golang.
|
A simple gopher daemon written in Golang.
|
||||||
Forked from shokara/thomomys
|
Forked from shokara/thomomys
|
||||||
|
|
||||||
Flags
|
Config
|
||||||
-----
|
------
|
||||||
-i = IP address for Tokiko to listen on (Default: 0.0.0.0)
|
addr = IP address for Tokiko to listen on (Default: 127.0.0.1)
|
||||||
-p = Port for Tokiko to listen on (Default: 70)
|
port = Port for Tokiko to listen on (Default: 70)
|
||||||
-h = Default hostname that gets printed for links (Default: localhost)
|
hostname = Default hostname that gets printed for links (Default: localhost)
|
||||||
-d = Root directory that gets served (Default: current directory)
|
rootdir = Root directory that gets served (Default: /var/gopher)
|
||||||
|
|
||||||
|
|
||||||
Why?
|
Why?
|
||||||
----
|
----
|
||||||
Anything can and will happen. Simple as that.
|
Yes.
|
||||||
And while environment variables are okay, they are rather messy to deal with, in my opinion, but that's just me I guess.
|
|
||||||
|
Credits
|
||||||
|
-------
|
||||||
|
I blatantly copied the parseconfig code from https://git.z3bra.org/partage
|
||||||
|
6
go.mod
6
go.mod
@ -1,3 +1,7 @@
|
|||||||
module gt.kalli.st/novaburst/thomomys
|
module marisa.chaotic.ninja/tokiko
|
||||||
|
|
||||||
go 1.18
|
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
7
go.sum
Normal 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
158
main.go
@ -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
50
version.go
Normal 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()
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user