func main() { // Create our Gotcha application var app = gotcha.Create(Asset) // Set the logger output pattern log.Logger().Appender().SetLayout(layout.Pattern("[%d] [%p] %m")) log.Logger().SetLevel(log.Stol("TRACE")) // Get the router r := app.Router // Create some routes r.Get("/", example) r.Post("/", examplepost) r.Get("/foo", example2) r.Get("/bar", example3) r.Get("/stream", streamed) r.Get("/err", err) // Serve static content (but really use a CDN) r.Get("/images/(?P<file>.*)", r.Static("assets/images/{{file}}")) r.Get("/css/(?P<file>.*)", r.Static("assets/css/{{file}}")) // Listen to some events app.On(events.BeforeHandler, func(session *http.Session, next func()) { n := 0 c, ok := session.Request.Cookies["test"] if ok { n, _ = strconv.Atoi(c.Value) } session.Stash["test"] = n log.Printf("Got BeforeHandler event! n = %d", n) next() }) app.On(events.AfterHandler, func(session *http.Session, next func()) { n := session.Stash["test"].(int) + 1 session.Response.Cookies.Set(&nethttp.Cookie{ Name: "test", Value: strconv.Itoa(n), }) log.Println("Got AfterHandler event!") next() }) app.On(events.AfterResponse, func(session *http.Session, next func()) { log.Println("Got AfterResponse event!") next() }) // Start our application app.Start() <-make(chan int) }
func main() { // Create our Gotcha application var app = gotcha.Create(Asset) // Get the router r := app.Router // Create some routes r.Get("/", welcome) // Serve static content (but really use a CDN) r.Get("/images/(?P<file>.*)", r.Static("assets/images/{{file}}")) r.Get("/css/(?P<file>.*)", r.Static("assets/css/{{file}}")) // Start our application app.Start() <-make(chan int) }
func main() { log.Logger().SetAppender(NewAppender()) global := "websysd.json" flag.StringVar(&global, "global", global, "global environment configuration") workspaces := make([]string, 0) flag.Var((*AppendSliceValue)(&workspaces), "workspace", "websysd workspace file (can be specified multiple times), defaults to './workspace.json'") // Create our Gotcha application var app = gotcha.Create(Asset) if len(workspaces) == 0 { workspaces = append(workspaces, "./workspace.json") } LoadConfig(global, workspaces) GlobalWorkspace = NewWorkspace(GlobalConfigWorkspace.Name, GlobalConfigWorkspace.Environment, make(map[string]map[string][]string), GlobalConfigWorkspace.InheritEnvironment) for fn, args := range GlobalConfigWorkspace.Functions { log.Info("=> Creating global function: %s", fn) GlobalWorkspace.Functions[fn] = &Function{ Name: fn, Args: args.Args, Command: args.Command, Executor: args.Executor, } } if GlobalWorkspace.InheritEnvironment { log.Info("=> Inheriting process environment into global workspace") for _, k := range os.Environ() { p := strings.SplitN(k, "=", 2) if strings.TrimSpace(p[0]) == "" { log.Warn("Skipping empty environment key") continue } log.Info(" %s = %s", p[0], p[1]) // TODO variable subst for current env vars if _, ok := GlobalWorkspace.Environment[p[0]]; !ok { GlobalWorkspace.Environment[p[0]] = p[1] } } } for _, ws := range ConfigWorkspaces { log.Info("=> Creating workspace: %s", ws.Name) var workspace *Workspace if wks, ok := Workspaces[ws.Name]; ok { log.Warn("Workspace %s already exists, merging tasks and environment") workspace = wks } else { workspace = NewWorkspace(ws.Name, ws.Environment, ws.Columns, ws.InheritEnvironment) Workspaces[ws.Name] = workspace } workspace.IsLocked = ws.IsLocked if workspace.InheritEnvironment && !GlobalWorkspace.InheritEnvironment { log.Info("=> Inheriting process environment into workspace") for _, k := range os.Environ() { p := strings.SplitN(k, "=", 2) if strings.TrimSpace(p[0]) == "" { log.Warn("Skipping empty environment key") continue } log.Info(" %s = %s", p[0], p[1]) // TODO variable subst for current env vars if _, ok := workspace.Environment[p[0]]; !ok { workspace.Environment[p[0]] = p[1] } } } for fn, args := range ws.Functions { log.Info("=> Creating workspace function: %s", fn) workspace.Functions[fn] = &Function{ Name: fn, Args: args.Args, Command: args.Command, Executor: args.Executor, } } for _, t := range ws.Tasks { log.Info("=> Creating task: %s", t.Name) if _, ok := workspace.Tasks[t.Name]; ok { log.Warn("Task %s already exists, overwriting") } env := make(map[string]string) for k, v := range GlobalWorkspace.Environment { env[k] = v } for k, v := range ws.Environment { env[k] = v } for k, v := range t.Environment { env[k] = v } task := NewTask(workspace, t.Name, t.Executor, t.Command, env, t.Service, t.Stdout, t.Stderr, t.Metadata, t.Pwd) workspace.Tasks[t.Name] = task } } // Get the router r := app.Router // Create some routes r.Get("/", list_workspaces) r.Get("/favicon.ico", r.Static("assets/favicon.ico")) r.Get("/log", show_log) r.Get("/workspace/(?P<workspace>[^/]+)", list_tasks) // Serve static content (but really use a CDN) r.Get("/images/(?P<file>.*)", r.Static("assets/images/{{file}}")) r.Get("/css/(?P<file>.*)", r.Static("assets/css/{{file}}")) r.Post("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/start", startTask) r.Post("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/stop", stopTask) r.Post("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/enable", enableServiceTask) r.Post("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/disable", disableServiceTask) r.Get("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)", taskHistory) r.Get("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/run/(?P<run>\\d+)", taskRun) r.Get("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/run/(?P<run>\\d+)/stdout", taskRunStdout) r.Get("/workspace/(?P<workspace>[^/]+)/task/(?P<task>[^/]+)/run/(?P<run>\\d+)/stderr", taskRunStderr) // Start our application app.Start() defer func() { for _, ws := range Workspaces { for _, t := range ws.Tasks { if t.ActiveTask != nil && t.ActiveTask.Cmd != nil && t.ActiveTask.Cmd.Process != nil { t.ActiveTask.Cmd.Process.Kill() } } } }() <-make(chan int) }
func main() { app.Create(nil).Start().Router.Get("/", func(s *http.Session) { s.Response.WriteText("Gotcha!") }) <-make(chan int) }