OLD | NEW |
---|---|
1 package main | 1 package main |
2 | 2 |
3 import ( | 3 import ( |
4 "bytes" | 4 "bytes" |
5 "crypto/md5" | 5 "crypto/md5" |
6 "database/sql" | 6 "database/sql" |
7 "encoding/base64" | 7 "encoding/base64" |
8 "encoding/binary" | 8 "encoding/binary" |
9 "encoding/json" | 9 "encoding/json" |
10 "flag" | 10 "flag" |
11 "fmt" | 11 "fmt" |
12 htemplate "html/template" | 12 htemplate "html/template" |
13 "image" | 13 "image" |
14 _ "image/gif" | 14 _ "image/gif" |
15 _ "image/jpeg" | 15 _ "image/jpeg" |
16 "image/png" | 16 "image/png" |
17 "io/ioutil" | 17 "io/ioutil" |
18 "log" | 18 "log" |
19 "math/rand" | 19 "math/rand" |
20 "net" | |
20 "net/http" | 21 "net/http" |
21 "os" | 22 "os" |
22 "os/exec" | 23 "os/exec" |
23 "path/filepath" | 24 "path/filepath" |
24 "regexp" | 25 "regexp" |
25 "strings" | 26 "strings" |
26 "text/template" | 27 "text/template" |
27 "time" | 28 "time" |
28 ) | 29 ) |
29 | 30 |
30 import ( | 31 import ( |
31 "github.com/fiorix/go-web/autogzip" | 32 "github.com/fiorix/go-web/autogzip" |
32 _ "github.com/go-sql-driver/mysql" | 33 _ "github.com/go-sql-driver/mysql" |
33 _ "github.com/mattn/go-sqlite3" | 34 _ "github.com/mattn/go-sqlite3" |
35 "github.com/rcrowley/go-metrics" | |
34 ) | 36 ) |
35 | 37 |
36 const ( | 38 const ( |
37 RESULT_COMPILE = `../../experimental/webtry/safec++ -DSK_GAMMA_SRGB -DSK _GAMMA_APPLY_TO_A8 -DSK_SCALAR_TO_FLOAT_EXCLUDED -DSK_ALLOW_STATIC_GLOBAL_INITIA LIZERS=1 -DSK_SUPPORT_GPU=0 -DSK_SUPPORT_OPENCL=0 -DSK_FORCE_DISTANCEFIELD_FONTS =0 -DSK_SCALAR_IS_FLOAT -DSK_CAN_USE_FLOAT -DSK_SAMPLES_FOR_X -DSK_BUILD_FOR_UNI X -DSK_USE_POSIX_THREADS -DSK_SYSTEM_ZLIB=1 -DSK_DEBUG -DSK_DEVELOPER=1 -I../../ src/core -I../../src/images -I../../tools/flags -I../../include/config -I../../i nclude/core -I../../include/pathops -I../../include/pipe -I../../include/effects -I../../include/ports -I../../src/sfnt -I../../include/utils -I../../src/utils -I../../include/images -g -fno-exceptions -fstrict-aliasing -Wall -Wextra -Winit -self -Wpointer-arith -Wno-unused-parameter -m64 -fno-rtti -Wnon-virtual-dtor -c ../../../cache/%s.cpp -o ../../../cache/%s.o` | 39 RESULT_COMPILE = `../../experimental/webtry/safec++ -DSK_GAMMA_SRGB -DSK _GAMMA_APPLY_TO_A8 -DSK_SCALAR_TO_FLOAT_EXCLUDED -DSK_ALLOW_STATIC_GLOBAL_INITIA LIZERS=1 -DSK_SUPPORT_GPU=0 -DSK_SUPPORT_OPENCL=0 -DSK_FORCE_DISTANCEFIELD_FONTS =0 -DSK_SCALAR_IS_FLOAT -DSK_CAN_USE_FLOAT -DSK_SAMPLES_FOR_X -DSK_BUILD_FOR_UNI X -DSK_USE_POSIX_THREADS -DSK_SYSTEM_ZLIB=1 -DSK_DEBUG -DSK_DEVELOPER=1 -I../../ src/core -I../../src/images -I../../tools/flags -I../../include/config -I../../i nclude/core -I../../include/pathops -I../../include/pipe -I../../include/effects -I../../include/ports -I../../src/sfnt -I../../include/utils -I../../src/utils -I../../include/images -g -fno-exceptions -fstrict-aliasing -Wall -Wextra -Winit -self -Wpointer-arith -Wno-unused-parameter -m64 -fno-rtti -Wnon-virtual-dtor -c ../../../cache/%s.cpp -o ../../../cache/%s.o` |
38 » LINK = `../../experimental/webtry/safec++ -m64 -lstdc++ -lm -o ../../../inout/%s -Wl,--start-group ../../../cache/%s.o obj/experimental/webtry /webtry.main.o obj/gyp/libflags.a libskia_images.a libskia_core.a libskia_effect s.a obj/gyp/libjpeg.a obj/gyp/libetc1.a obj/gyp/libwebp_dec.a obj/gyp/libwebp_de mux.a obj/gyp/libwebp_dsp.a obj/gyp/libwebp_enc.a obj/gyp/libwebp_utils.a libski a_utils.a libskia_opts.a libskia_opts_ssse3.a libskia_ports.a libskia_sfnt.a -Wl ,--end-group -lpng -lz -lgif -lpthread -lfontconfig -ldl -lfreetype` | 40 » LINK = `../../experimental/webtry/safec++ -m64 -lstdc++ -lm -o ../../../inout/%s -Wl,--start-group ../../../cache/%s.o obj/experimental/webtry /webtry.main.o obj/gyp/libflags.a libskia_images.a libskia_core.a libskia_effect s.a obj/gyp/libjpeg.a obj/gyp/libetc1.a obj/gyp/libSkKTX.a obj/gyp/libwebp_dec.a obj/gyp/libwebp_demux.a obj/gyp/libwebp_dsp.a obj/gyp/libwebp_enc.a obj/gyp/lib webp_utils.a libskia_utils.a libskia_opts.a libskia_opts_ssse3.a libskia_ports.a libskia_sfnt.a -Wl,--end-group -lpng -lz -lgif -lpthread -lfontconfig -ldl -lfr eetype` |
39 | 41 |
40 DEFAULT_SAMPLE = `void draw(SkCanvas* canvas) { | 42 DEFAULT_SAMPLE = `void draw(SkCanvas* canvas) { |
41 SkPaint p; | 43 SkPaint p; |
42 p.setColor(SK_ColorRED); | 44 p.setColor(SK_ColorRED); |
43 p.setAntiAlias(true); | 45 p.setAntiAlias(true); |
44 p.setStyle(SkPaint::kStroke_Style); | 46 p.setStyle(SkPaint::kStroke_Style); |
45 p.setStrokeWidth(10); | 47 p.setStrokeWidth(10); |
46 | 48 |
47 canvas->drawLine(20, 20, 100, 100, p); | 49 canvas->drawLine(20, 20, 100, 100, p); |
48 }` | 50 }` |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
105 "butterfly", "bush", "dew", "dust", "field", "fire", "flower", " firefly", | 107 "butterfly", "bush", "dew", "dust", "field", "fire", "flower", " firefly", |
106 "feather", "grass", "haze", "mountain", "night", "pond", "darkne ss", | 108 "feather", "grass", "haze", "mountain", "night", "pond", "darkne ss", |
107 "snowflake", "silence", "sound", "sky", "shape", "surf", "thunde r", | 109 "snowflake", "silence", "sound", "sky", "shape", "surf", "thunde r", |
108 "violet", "water", "wildflower", "wave", "water", "resonance", " sun", | 110 "violet", "water", "wildflower", "wave", "water", "resonance", " sun", |
109 "wood", "dream", "cherry", "tree", "fog", "frost", "voice", "pap er", | 111 "wood", "dream", "cherry", "tree", "fog", "frost", "voice", "pap er", |
110 "frog", "smoke", "star", | 112 "frog", "smoke", "star", |
111 } | 113 } |
112 | 114 |
113 gitHash = "" | 115 gitHash = "" |
114 gitInfo = "" | 116 gitInfo = "" |
117 | |
118 requestsCounter = metrics.NewRegisteredCounter("requests", metrics.Defau ltRegistry) | |
115 ) | 119 ) |
116 | 120 |
117 // flags | 121 // flags |
118 var ( | 122 var ( |
119 useChroot = flag.Bool("use_chroot", false, "Run the compiled code in the schroot jail.") | 123 useChroot = flag.Bool("use_chroot", false, "Run the compiled code in the schroot jail.") |
120 port = flag.String("port", ":8000", "HTTP service address (e.g., ': 8000')") | 124 port = flag.String("port", ":8000", "HTTP service address (e.g., ': 8000')") |
121 ) | 125 ) |
122 | 126 |
123 // lineNumbers adds #line numbering to the user's code. | 127 // lineNumbers adds #line numbering to the user's code. |
124 func LineNumbers(c string) string { | 128 func LineNumbers(c string) string { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
273 // Ping the database to keep the connection fresh. | 277 // Ping the database to keep the connection fresh. |
274 go func() { | 278 go func() { |
275 c := time.Tick(1 * time.Minute) | 279 c := time.Tick(1 * time.Minute) |
276 for _ = range c { | 280 for _ = range c { |
277 if err := db.Ping(); err != nil { | 281 if err := db.Ping(); err != nil { |
278 log.Printf("ERROR: Database failed to respond: % q\n", err) | 282 log.Printf("ERROR: Database failed to respond: % q\n", err) |
279 } | 283 } |
280 } | 284 } |
281 }() | 285 }() |
282 | 286 |
287 metrics.RegisterRuntimeMemStats(metrics.DefaultRegistry) | |
288 go metrics.CaptureRuntimeMemStats(metrics.DefaultRegistry, 1*time.Minute ) | |
289 | |
290 // Start reporting metrics. | |
291 // TODO(jcgregorio) We need a centrialized config server for storing thi ngs | |
mtklein
2014/06/06 02:50:50
Is there any sort of public GNS/BNS/Chubby in GCE
jcgregorio
2014/06/06 12:50:45
Turns out we can fetch files from Git via Gitiles,
| |
292 // like the IP address of the Graphite monitor. | |
293 addr, _ := net.ResolveTCPAddr("tcp", "10.240.159.195:2003") | |
294 go metrics.Graphite(metrics.DefaultRegistry, 1*time.Minute, "webtry", ad dr) | |
295 | |
283 writeOutAllSourceImages() | 296 writeOutAllSourceImages() |
284 } | 297 } |
285 | 298 |
286 func writeOutAllSourceImages() { | 299 func writeOutAllSourceImages() { |
287 // Pull all the source images from the db and write them out to inout. | 300 // Pull all the source images from the db and write them out to inout. |
288 rows, err := db.Query("SELECT id, image, create_ts FROM source_images OR DER BY create_ts DESC") | 301 rows, err := db.Query("SELECT id, image, create_ts FROM source_images OR DER BY create_ts DESC") |
289 | 302 |
290 if err != nil { | 303 if err != nil { |
291 log.Printf("ERROR: Failed to open connection to SQL server: %q\n ", err) | 304 log.Printf("ERROR: Failed to open connection to SQL server: %q\n ", err) |
292 panic(err) | 305 panic(err) |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
726 | 739 |
727 func cleanCompileOutput(s, hash string) string { | 740 func cleanCompileOutput(s, hash string) string { |
728 old := "../../../cache/" + hash + ".cpp:" | 741 old := "../../../cache/" + hash + ".cpp:" |
729 log.Printf("INFO: replacing %q\n", old) | 742 log.Printf("INFO: replacing %q\n", old) |
730 return strings.Replace(s, old, "usercode.cpp:", -1) | 743 return strings.Replace(s, old, "usercode.cpp:", -1) |
731 } | 744 } |
732 | 745 |
733 // mainHandler handles the GET and POST of the main page. | 746 // mainHandler handles the GET and POST of the main page. |
734 func mainHandler(w http.ResponseWriter, r *http.Request) { | 747 func mainHandler(w http.ResponseWriter, r *http.Request) { |
735 log.Printf("Main Handler: %q\n", r.URL.Path) | 748 log.Printf("Main Handler: %q\n", r.URL.Path) |
749 requestsCounter.Inc(1) | |
736 if r.Method == "GET" { | 750 if r.Method == "GET" { |
737 code := DEFAULT_SAMPLE | 751 code := DEFAULT_SAMPLE |
738 source := 0 | 752 source := 0 |
739 match := directLink.FindStringSubmatch(r.URL.Path) | 753 match := directLink.FindStringSubmatch(r.URL.Path) |
740 var hash string | 754 var hash string |
741 if len(match) == 2 && r.URL.Path != "/" { | 755 if len(match) == 2 && r.URL.Path != "/" { |
742 hash = match[1] | 756 hash = match[1] |
743 if db == nil { | 757 if db == nil { |
744 http.NotFound(w, r) | 758 http.NotFound(w, r) |
745 return | 759 return |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
849 http.HandleFunc("/sources/", autogzip.HandleFunc(sourcesHandler)) | 863 http.HandleFunc("/sources/", autogzip.HandleFunc(sourcesHandler)) |
850 | 864 |
851 // Resources are served directly | 865 // Resources are served directly |
852 // TODO add support for caching/etags/gzip | 866 // TODO add support for caching/etags/gzip |
853 http.Handle("/res/", autogzip.Handle(http.FileServer(http.Dir("./")))) | 867 http.Handle("/res/", autogzip.Handle(http.FileServer(http.Dir("./")))) |
854 | 868 |
855 // TODO Break out /c/ as it's own handler. | 869 // TODO Break out /c/ as it's own handler. |
856 http.HandleFunc("/", autogzip.HandleFunc(mainHandler)) | 870 http.HandleFunc("/", autogzip.HandleFunc(mainHandler)) |
857 log.Fatal(http.ListenAndServe(*port, nil)) | 871 log.Fatal(http.ListenAndServe(*port, nil)) |
858 } | 872 } |
OLD | NEW |