@@ -15,7 +15,6 @@ import (
15
15
"os/exec"
16
16
"path"
17
17
"regexp"
18
- "runtime"
19
18
"strconv"
20
19
"strings"
21
20
"time"
@@ -28,16 +27,24 @@ import (
28
27
. "github.com/netsec-ethz/scion-apps/webapp/util"
29
28
)
30
29
31
- var addr = flag .String ("a" , "0.0.0.0" , "server host address" )
32
- var port = flag .Int ("p" , 8080 , "server port number" )
33
- var root = flag .String ("r" , "." , "file system path to browse from" )
30
+ // browseRoot is browse-only, consider security (def: cwd)
31
+ var browseRoot = flag .String ("r" , "." ,
32
+ "Root path to browse from, CAUTION: read-access granted from -a and -p." )
33
+
34
+ // staticRoot for serving/writing static data (def: cwd)
35
+ var staticRoot = flag .String ("s" , "." ,
36
+ "Static path of web server files (local repo scion-apps/webapp)." )
37
+
38
+ // cwdPath - this is where images are going, this is runtime (record, no settings)
39
+ var cwdPath = "."
40
+
41
+ var addr = flag .String ("a" , "127.0.0.1" , "Address of server host." )
42
+ var port = flag .Int ("p" , 8000 , "Port of server host." )
34
43
var cmdBufLen = 1024
35
44
var browserAddr = "127.0.0.1"
36
45
var rootmarker = ".webapp"
37
- var srcpath string
38
46
var myIa string
39
47
var id = "webapp"
40
- var logDir = "./logs"
41
48
42
49
// Ensures an inactive browser will end continuous testing
43
50
var maxContTimeout = time .Duration (10 ) * time .Minute
@@ -57,16 +64,25 @@ type Page struct {
57
64
MyIA string
58
65
}
59
66
67
+ func ensurePath (srcpath , staticDir string ) string {
68
+ dir := path .Join (srcpath , staticDir )
69
+ if _ , err := os .Stat (dir ); os .IsNotExist (err ) {
70
+ os .Mkdir (dir , os .ModePerm )
71
+ }
72
+ return dir
73
+ }
74
+
60
75
func main () {
61
76
flag .Parse ()
62
- _ , srcfile , _ , _ := runtime .Caller (0 )
63
- srcpath = path .Dir (srcfile )
77
+ // correct static files are required for the app to serve them, else fail
78
+ if _ , err := os .Stat (path .Join (* staticRoot , "static" )); os .IsNotExist (err ) {
79
+ log .Error ("-s flag must be set with local repo: scion-apps/webapp" )
80
+ CheckFatal (err )
81
+ return
82
+ }
64
83
65
84
// logging
66
- logDirPath := path .Join (srcpath , "logs" )
67
- if _ , err := os .Stat (logDirPath ); os .IsNotExist (err ) {
68
- os .Mkdir (logDirPath , os .ModePerm )
69
- }
85
+ logDirPath := ensurePath (* staticRoot , "logs" )
70
86
log .Root ().SetHandler (log .MultiHandler (
71
87
log .LvlFilterHandler (log .LvlDebug ,
72
88
log .StreamHandler (os .Stderr , fmt15 .Fmt15Format (fmt15 .ColorMap ))),
@@ -76,20 +92,17 @@ func main() {
76
92
log .Info ("======================> Webapp started" )
77
93
78
94
// prepare templates
79
- templates = prepareTemplates (srcpath )
95
+ templates = prepareTemplates (* staticRoot )
80
96
// open and manage database
81
- dbpath := path .Join (srcpath , "webapp.db" )
97
+ dbpath := path .Join (* staticRoot , "webapp.db" )
82
98
model .InitDB (dbpath )
83
99
defer model .CloseDB ()
84
100
model .LoadDB ()
85
101
go model .MaintainDatabase ()
86
- dataDirPath := path .Join (srcpath , "data" )
87
- if _ , err := os .Stat (dataDirPath ); os .IsNotExist (err ) {
88
- os .Mkdir (dataDirPath , os .ModePerm )
89
- }
102
+ ensurePath (* staticRoot , "data" )
90
103
// generate client/server default
91
- lib .GenClientNodeDefaults (srcpath )
92
- lib .GenServerNodeDefaults (srcpath )
104
+ lib .GenClientNodeDefaults (* staticRoot )
105
+ lib .GenServerNodeDefaults (* staticRoot )
93
106
myIa = lib .GetLocalIa ()
94
107
refreshRootDirectory ()
95
108
appsBuildCheck ("bwtester" )
@@ -103,11 +116,11 @@ func main() {
103
116
http .HandleFunc ("/astopo" , astopoHandler )
104
117
http .HandleFunc ("/crt" , crtHandler )
105
118
http .HandleFunc ("/trc" , trcHandler )
106
- fsStatic := http .FileServer (http .Dir (path .Join (srcpath , "static" )))
119
+ fsStatic := http .FileServer (http .Dir (path .Join (* staticRoot , "static" )))
107
120
http .Handle ("/static/" , http .StripPrefix ("/static/" , fsStatic ))
108
- fsImageFetcher := http .FileServer (http .Dir ("." ))
109
- http .Handle ("/images /" , http .StripPrefix ("/images /" , fsImageFetcher ))
110
- fsFileBrowser := http .FileServer (http .Dir (* root ))
121
+ fsData := http .FileServer (http .Dir (path . Join ( * staticRoot , "data" ) ))
122
+ http .Handle ("/data /" , http .StripPrefix ("/data /" , fsData ))
123
+ fsFileBrowser := http .FileServer (http .Dir (* browseRoot ))
111
124
http .Handle ("/files/" , http .StripPrefix ("/files/" , fsFileBrowser ))
112
125
113
126
http .HandleFunc ("/command" , commandHandler )
@@ -129,7 +142,7 @@ func main() {
129
142
http .HandleFunc ("/gettrc" , lib .TrcHandler )
130
143
131
144
log .Info (fmt .Sprintf ("Browser access: at http://%s:%d." , browserAddr , * port ))
132
- log .Info ("File browser root:" , "root" , * root )
145
+ log .Info ("File browser root:" , "root" , * browseRoot )
133
146
log .Info (fmt .Sprintf ("Listening on %s:%d..." , * addr , * port ))
134
147
err := http .ListenAndServe (fmt .Sprintf ("%s:%d" , * addr , * port ), logRequestHandler (http .DefaultServeMux ))
135
148
CheckFatal (err )
@@ -481,16 +494,16 @@ func writeCmdOutput(w http.ResponseWriter, reader io.Reader, stdin io.WriteClose
481
494
}
482
495
// store in database
483
496
model .StoreBwTestItem (d )
484
- lib .WriteBwtestCsv (d , srcpath )
497
+ lib .WriteBwtestCsv (d , * staticRoot )
485
498
}
486
499
}
487
500
488
501
func healthCheckHandler (w http.ResponseWriter , r * http.Request ) {
489
- lib .HealthCheckHandler (w , r , srcpath )
502
+ lib .HealthCheckHandler (w , r , * staticRoot )
490
503
}
491
504
492
505
func getBwByTimeHandler (w http.ResponseWriter , r * http.Request ) {
493
- lib .GetBwByTimeHandler (w , r , bwActive , srcpath )
506
+ lib .GetBwByTimeHandler (w , r , bwActive , * staticRoot )
494
507
}
495
508
496
509
// Handles locating most recent image formatting it for graphic display in response.
@@ -499,13 +512,13 @@ func findImageHandler(w http.ResponseWriter, r *http.Request) {
499
512
}
500
513
501
514
func getNodesHandler (w http.ResponseWriter , r * http.Request ) {
502
- lib .GetNodesHandler (w , r , srcpath )
515
+ lib .GetNodesHandler (w , r , * staticRoot )
503
516
}
504
517
505
518
// Used to workaround cache-control issues by ensuring root specified by user
506
519
// has updated last modified date by writing a .webapp file
507
520
func refreshRootDirectory () {
508
- cliFp := path .Join (srcpath , * root , rootmarker )
521
+ cliFp := path .Join (* staticRoot , * browseRoot , rootmarker )
509
522
err := ioutil .WriteFile (cliFp , []byte (`` ), 0644 )
510
523
CheckError (err )
511
524
}
0 commit comments