You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.4 KiB
Go

package gemini
import (
"crypto/rand"
"crypto/tls"
"gophi/core"
"io"
"github.com/grufwub/go-config"
"github.com/grufwub/go-logger"
)
func init() {
// As part of init perform initial entropy assertion
b := make([]byte, 1)
_, err := io.ReadFull(rand.Reader, b)
if err != nil {
logger.Fatal("Failed to assert safe source of system entropy exists!")
}
}
// Run does as says :)
func Run() {
// Create new TOML config parser
tree := make(config.Tree)
// Parse gemini specific flags, then all
certFile := tree.String("gemini.tls-cert", "")
keyFile := tree.String("gemini.tls-key", "")
core.ParseConfigAndSetup(
tree,
"gemini",
1965,
func() (*core.Listener, error) {
// Load the supplied key pair
cert, err := tls.LoadX509KeyPair(*certFile, *keyFile)
if err != nil {
return nil, err
}
// Create TLS config
config := &tls.Config{
Certificates: []tls.Certificate{cert},
}
config.Rand = rand.Reader
// Create listener!
l, err := tls.Listen("tcp", core.Bind+":"+core.Port, config)
if err != nil {
return nil, err
}
// Return wrapper listener
return core.NewListener(l), nil
},
newFileContent,
handleDirectory,
handleLargeFile,
appendCgiEnv,
)
// Generate the root redirect byte slice
// (has to be done here once the Hostname and Port have been set)
rootRedirect = buildRedirect("gemini://" + core.Hostname + ":" + core.Port + "/")
// Start!
core.Start(serve)
}