feat: upload config
This commit is contained in:
		| @ -12,8 +12,10 @@ var ( | |||||||
| 	configFromDir = flag.String("config-from-dir", "", "Build configuration from this directory") | 	configFromDir = flag.String("config-from-dir", "", "Build configuration from this directory") | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func readConfig() (config *localconfig.Config, err error) { | func configFilePath() string { | ||||||
| 	configFile := filepath.Join(*dataDir, "config.yaml") | 	return filepath.Join(*dataDir, "config.yaml") | ||||||
|  | } | ||||||
| 	return localconfig.FromFile(configFile) |  | ||||||
|  | func readConfig() (config *localconfig.Config, err error) { | ||||||
|  | 	return localconfig.FromFile(configFilePath()) | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,11 +3,16 @@ package main | |||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"flag" | 	"flag" | ||||||
|  | 	"io" | ||||||
|  | 	"io/ioutil" | ||||||
| 	"log" | 	"log" | ||||||
| 	"net" | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"novit.nc/direktil/pkg/localconfig" | 	"novit.nc/direktil/pkg/localconfig" | ||||||
| ) | ) | ||||||
| @ -248,3 +253,59 @@ func serveCluster(w http.ResponseWriter, r *http.Request) { | |||||||
| 		http.NotFound(w, r) | 		http.NotFound(w, r) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func uploadConfig(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	if !authorizeHosts(r) { // FIXME admin token instead | ||||||
|  | 		forbidden(w, r) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if r.Method != "POST" { | ||||||
|  | 		http.NotFound(w, r) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	out, err := ioutil.TempFile(*dataDir, ".config-upload") | ||||||
|  | 	if err != nil { | ||||||
|  | 		writeError(w, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	defer os.Remove(out.Name()) | ||||||
|  |  | ||||||
|  | 	func() { | ||||||
|  | 		defer out.Close() | ||||||
|  | 		if _, err = io.Copy(out, r.Body); err != nil { | ||||||
|  | 			writeError(w, err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	archivesPath := filepath.Join(*dataDir, "archives") | ||||||
|  | 	cfgPath := configFilePath() | ||||||
|  |  | ||||||
|  | 	err = os.MkdirAll(archivesPath, 0700) | ||||||
|  | 	if err != nil { | ||||||
|  | 		writeError(w, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	backupPath := filepath.Join(archivesPath, "config."+time.Now().Format(time.RFC3339)+".yaml") | ||||||
|  | 	err = os.Rename(cfgPath, backupPath) | ||||||
|  | 	if err != nil { | ||||||
|  | 		writeError(w, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = os.Rename(out.Name(), configFilePath()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		writeError(w, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func writeError(w http.ResponseWriter, err error) { | ||||||
|  | 	log.Print("request failed: ", err) | ||||||
|  | 	w.WriteHeader(http.StatusInternalServerError) | ||||||
|  | 	w.Write([]byte(http.StatusText(http.StatusInternalServerError))) | ||||||
|  | } | ||||||
|  | |||||||
| @ -36,6 +36,8 @@ func main() { | |||||||
| 	// by default, serve a host resource by its IP | 	// by default, serve a host resource by its IP | ||||||
| 	http.HandleFunc("/", serveHostByIP) | 	http.HandleFunc("/", serveHostByIP) | ||||||
|  |  | ||||||
|  | 	http.HandleFunc("/configs", uploadConfig) | ||||||
|  |  | ||||||
| 	http.HandleFunc("/hosts", serveHosts) | 	http.HandleFunc("/hosts", serveHosts) | ||||||
| 	http.HandleFunc("/hosts/", serveHost) | 	http.HandleFunc("/hosts/", serveHost) | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user