// appConfig keeps on trying to fetch the extra config from the app handler. If // it doesn't succed after an hour has passed, the program exits. func appConfig() (*config, error) { configURL := os.Getenv("CAMLI_APP_CONFIG_URL") if configURL == "" { return nil, fmt.Errorf("Publisher application needs a CAMLI_APP_CONFIG_URL env var") } cl, err := app.Client() if err != nil { return nil, fmt.Errorf("could not get a client to fetch extra config: %v", err) } conf := &config{} pause := time.Second giveupTime := time.Now().Add(time.Hour) for { err := cl.GetJSON(configURL, conf) if err == nil { break } if time.Now().After(giveupTime) { logger.Fatalf("Giving up on starting: could not get app config at %v: %v", configURL, err) } logger.Printf("could not get app config at %v: %v. Will retry in a while.", configURL, err) time.Sleep(pause) pause *= 2 } return conf, nil }
func appConfig() *config { configURL := os.Getenv("CAMLI_APP_CONFIG_URL") if configURL == "" { log.Fatalf("Hello application needs a CAMLI_APP_CONFIG_URL env var") } cl, err := app.Client() if err != nil { log.Fatalf("could not get a client to fetch extra config: %v", err) } conf := &config{} if err := cl.GetJSON(configURL, conf); err != nil { log.Fatalf("could not get app config at %v: %v", configURL, err) } return conf }
func newPublishHandler(conf *config) *publishHandler { cl, err := app.Client() if err != nil { logger.Fatalf("could not get a client for the publish handler %v", err) } if conf.RootName == "" { logger.Fatal("camliRoot not found in the app configuration") } maxResizeBytes := conf.MaxResizeBytes if maxResizeBytes == 0 { maxResizeBytes = constants.DefaultMaxResizeMem } var CSSFiles, JSDeps []string if conf.SourceRoot != "" { appRoot := filepath.Join(conf.SourceRoot, "app", "publisher") Files = &fileembed.Files{ DirFallback: appRoot, } // TODO(mpl): Can I readdir by listing with "/" on Files, even with DirFallBack? // Apparently not, but retry later. dir, err := os.Open(appRoot) if err != nil { logger.Fatal(err) } defer dir.Close() names, err := dir.Readdirnames(-1) if err != nil { logger.Fatal(err) } for _, v := range names { if strings.HasSuffix(v, ".css") { CSSFiles = append(CSSFiles, v) continue } // TODO(mpl): document or fix (use a map?) the ordering // problem: i.e. jquery.js must be sourced before // publisher.js. For now, just cheat by sorting the // slice. if strings.HasSuffix(v, ".js") { JSDeps = append(JSDeps, v) } } sort.Strings(JSDeps) } else { Files.Listable = true dir, err := Files.Open("/") if err != nil { logger.Fatal(err) } defer dir.Close() fis, err := dir.Readdir(-1) if err != nil { logger.Fatal(err) } for _, v := range fis { name := v.Name() if strings.HasSuffix(name, ".css") { CSSFiles = append(CSSFiles, name) continue } if strings.HasSuffix(name, ".js") { JSDeps = append(JSDeps, name) } } sort.Strings(JSDeps) } // TODO(mpl): add all htmls found in Files to the template if none specified? if conf.GoTemplate == "" { logger.Fatal("a go template is required in the app configuration") } goTemplate, err := goTemplate(Files, conf.GoTemplate) if err != nil { logger.Fatal(err) } var cache blobserver.Storage var thumbMeta *server.ThumbMeta if conf.CacheRoot != "" { cache, err = localdisk.New(conf.CacheRoot) if err != nil { logger.Fatalf("Could not create localdisk cache: %v", err) } thumbsCacheDir := filepath.Join(os.TempDir(), "camli-publisher-cache") if err := os.MkdirAll(thumbsCacheDir, 0700); err != nil { logger.Fatalf("Could not create cache dir %s for %v publisher: %v", thumbsCacheDir, conf.RootName, err) } kv, err := sorted.NewKeyValue(map[string]interface{}{ "type": "kv", "file": filepath.Join(thumbsCacheDir, conf.RootName+"-thumbnails.kv"), }) if err != nil { logger.Fatalf("Could not create kv for %v's thumbs cache: %v", conf.RootName, err) } thumbMeta = server.NewThumbMeta(kv) } return &publishHandler{ rootName: conf.RootName, cl: cl, resizeSem: syncutil.NewSem(maxResizeBytes), staticFiles: Files, goTemplate: goTemplate, CSSFiles: CSSFiles, JSDeps: JSDeps, describedCache: make(map[string]*search.DescribedBlob), cache: cache, thumbMeta: thumbMeta, } }