added configuration file and logging

master
KatolaZ 8 years ago
parent 3a4c6d43e4
commit cfc67a8246
  1. 8
      binit.cfg
  2. 83
      config.go
  3. 117
      main.go

@ -0,0 +1,8 @@
##
## These are comments
##
host=localhost
port=8080
paste_dir=./pastes
templ_dir=./html

@ -0,0 +1,83 @@
package main
import (
"fmt"
"os"
"bufio"
"regexp"
"strings"
"log"
)
type Config struct {
host string
port string
paste_dir string
templ_dir string
log_fname string
logger *log.Logger
}
func (c Config) String() string {
var s string
s+= "Host: " + c.host + "\n"
s+= "Port: " + c.port + "\n"
s+= "paste_dir: " + c.paste_dir + "\n"
s+= "templ_dir: " + c.templ_dir + "\n"
return s
}
func parse_config (fname string, c *Config) error {
f, err := os.Open(fname);
if err != nil {
return err
}
r := bufio.NewScanner(f)
line := 0
for r.Scan (){
s := r.Text()
line += 1
if matched, _ := regexp.MatchString("^([ \t]*)$", s); matched != true {
// it's not a blank line
if matched, _ := regexp.MatchString("^#", s); matched != true {
// This is not a comment...
if matched, _ := regexp.MatchString("^([a-z_]+)=.*", s); matched == true {
// and contains an assignment
fields := strings.Split(s, "=")
switch fields[0]{
case "host":
c.host = fields[1]
case "port":
c.port = fields[1]
case "paste_dir":
c.paste_dir = fields[1]
case "templ_dir":
c.templ_dir = fields[1]
case "log_fname":
c.log_fname = fields[1]
default:
fmt.Fprintf(os.Stderr, "Error reading config file %s at line %d: unknown variable '%s'\n",
fname, line, fields[0])
}
} else {
fmt.Fprintf(os.Stderr, "Error reading config file %s at line %d: unknown statement '%s'\n",
fname, line, s)
}
}
}
}
return nil
}

@ -1,88 +1,111 @@
package main
import (
"fmt"
"net/http"
"crypto/sha256"
"fmt"
"io/ioutil"
"log"
"path/filepath"
"net/http"
"os"
"path/filepath"
"time"
"io/ioutil"
"io"
)
func handle_get_paste(w http.ResponseWriter, r *http.Request){
var p_conf = Config{
host: "localhost",
port: "8000",
paste_dir: "./pastes",
templ_dir: "./tmpl",
log_fname: "./binit.log",
}
func handle_get_paste(w http.ResponseWriter, r *http.Request) {
var paste_name, orig_name string
var err error
orig_name = filepath.Clean(r.URL.Path)
paste_name = "./pastes/" + orig_name
paste_name = p_conf.paste_dir + "/" + orig_name
fmt.Printf("orig_name: '%s'\npaste_name: '%s'\n", orig_name, paste_name)
orig_IP := r.RemoteAddr
log.Printf("Received GET from %s for '%s'\n", orig_IP, orig_name)
// The default is to serve index.html
if (orig_name == "/" ) || ( orig_name == "/index.html" ) {
http.ServeFile(w, r, "index.html")
if (orig_name == "/") || (orig_name == "/index.html") {
http.ServeFile(w, r, p_conf.templ_dir + "/index.html")
} else {
// otherwise, if the requested paste exists, we serve it...
if _, err = os.Stat(paste_name); err == nil && orig_name != "./" {
http.ServeFile(w, r, paste_name)
} else {
// otherwise, we give say we didn't find it
} else {
// otherwise, we give say we didn't find it
fmt.Fprintf(w, "Paste '%s' not found\n", orig_name)
return
}
}
}
func handle_put_paste(w http.ResponseWriter, r *http.Request) {
func handle_put_paste(w http.ResponseWriter, r *http.Request){
fmt.Printf("We are inside handle_put_paste\n");
if err := r.ParseForm(); err != nil{
if err := r.ParseForm(); err != nil {
// Invalid POST -- let's serve the default file
http.ServeFile(w, r, "index.html")
http.ServeFile(w, r, p_conf.templ_dir + "/index.html")
} else {
h := sha256.New()
req_body := r.PostForm
orig_IP := r.RemoteAddr
log.Printf("Received new POST from %s\n", orig_IP)
// get title, body, and time
title := req_body.Get("title")
paste := req_body.Get("paste")
now := time.Now().String()
// format content
// format content
content := fmt.Sprintf("# Title: %s\n# Pasted: %s\n------------\n%s", title, now, paste)
// ccompute the sha256 hash using title, body, and time
h.Write([]byte (content))
h.Write([]byte(content))
paste_hash := fmt.Sprintf("%x", h.Sum(nil))
fmt.Printf("hash: %s fname: %s\n", paste_hash, paste_hash[:16])
paste_dir := "./pastes/"
// Now we save the file
for i := 0; i < len(paste_hash) - 16; i ++ {
log.Printf(" `-- hash: %s\n", paste_hash)
paste_dir := p_conf.paste_dir + "/"
if _, err := os.Stat(paste_dir + paste_hash[i:i+16]); os.IsNotExist(err) {
// Now we save the file
for i := 0; i < len(paste_hash)-16; i++ {
paste_name := paste_hash[i:i+16]
if _, err := os.Stat(paste_dir + paste_name); os.IsNotExist(err) {
// The file does not exist, so we can create it
if err := ioutil.WriteFile(paste_dir + paste_hash[i:i+16], []byte (content), 0644); err == nil{
if err := ioutil.WriteFile(paste_dir+ paste_name, []byte(content), 0644); err == nil {
// and then we return the URL:
fmt.Fprintf(w, "<html><body>Link: <a href='%s'>%s</a></body></html>",
paste_hash[i:i+16], paste_hash[i:i+16])
return
log.Printf(" `-- saving paste to : %s", paste_dir + paste_name)
hostname := r.Host
if show := req_body.Get("show"); show != "" {
fmt.Fprintf(w, "%s/%s", hostname, paste_name)
return
} else{
fmt.Fprintf(w, "<html><body>Link: <a href='%s'>%s</a></body></html>",
paste_hash[i:i+16], paste_hash[i:i+16])
return
}
} else {
fmt.Fprintf(w, "Cannot create the paste!!!\n")
fmt.Fprintf(w, "Cannot create the paste.. Sorry!\n")
return
}
}
}
}
}
func req_handler(w http.ResponseWriter, r *http.Request){
func req_handler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
@ -94,7 +117,29 @@ func req_handler(w http.ResponseWriter, r *http.Request){
}
}
func main(){
func main() {
parse_config("binit.cfg", &p_conf)
f, err := os.OpenFile(p_conf.log_fname, os.O_APPEND | os.O_CREATE | os.O_RDWR, 0600)
if err != nil {
fmt.Fprintf(os.Stderr, "Error opening logfile: %s. Exiting\n", p_conf.log_fname)
os.Exit(1)
}
log.SetOutput(io.Writer(f))
log.SetPrefix("[binit]: ")
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)
log.Println("Binit version 0.1 -- Starting ")
log.Printf(" + listening on: %s:%s\n", p_conf.host, p_conf.port )
log.Printf(" + paste_dir: %s\n", p_conf.paste_dir)
log.Printf(" + templ_dir: %s\n", p_conf.templ_dir)
http.HandleFunc("/", req_handler)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
log.Fatal(http.ListenAndServe(p_conf.host + ":" + p_conf.port, nil))
}

Loading…
Cancel
Save