aboutsummaryrefslogtreecommitdiff
path: root/middleware/fs.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/fs.go')
-rw-r--r--middleware/fs.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/middleware/fs.go b/middleware/fs.go
new file mode 100644
index 000000000..5970d0e99
--- /dev/null
+++ b/middleware/fs.go
@@ -0,0 +1,45 @@
+package middleware
+
+import (
+ "net/http"
+ "os"
+ "path/filepath"
+ "runtime"
+)
+
+// dir wraps http.Dir that restrict file access to a specific directory tree.
+type dir http.Dir
+
+// CoreDir is the directory where middleware can store assets, like zone files after a zone transfer
+// or public and private keys or anything else a middleware might need. The convention is to place
+// assets in a subdirectory named after the fully qualified zone.
+//
+// example.org./Kexample<something>.key
+//
+// CoreDir will default to "$HOME/.coredns" on Unix, but it's location can be overriden with the COREDNSPATH
+// environment variable.
+var CoreDir dir = dir(fsPath())
+
+// fsPath returns the path to the directory where the application may store data.
+// If COREDNSPATH env variable. is set, that value is used. Otherwise, the path is
+// the result of evaluating "$HOME/.coredns".
+func fsPath() string {
+ if corePath := os.Getenv("COREDNSPATH"); corePath != "" {
+ return corePath
+ }
+ return filepath.Join(userHomeDir(), ".coredns")
+}
+
+// userHomeDir returns the user's home directory according to environment variables.
+//
+// Credit: http://stackoverflow.com/a/7922977/1048862
+func userHomeDir() string {
+ if runtime.GOOS == "windows" {
+ home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
+ if home == "" {
+ home = os.Getenv("USERPROFILE")
+ }
+ return home
+ }
+ return os.Getenv("HOME")
+}