func ioWorker() { var err error for { select { case task := <-io_task_chan: if task.method == IO_TASK_M_READ { if args, ok := task.args.(*readfile_t); ok { args.data, err = ioutil.ReadFile(args.filename) task.done <- err } } else if task.method == IO_TASK_M_WRITE { //filename must not exist if args, ok := task.args.(*g.File); ok { baseDir := file.Dir(args.Filename) if err = file.InsureDir(baseDir); err != nil { task.done <- err } task.done <- writeFile(args.Filename, args.Body, 0644) } } else if task.method == IO_TASK_M_FLUSH { if args, ok := task.args.(*flushfile_t); ok { task.done <- flushrrd(args.filename, args.items) } } else if task.method == IO_TASK_M_FETCH { if args, ok := task.args.(*fetch_t); ok { args.data, err = fetch(args.filename, args.cf, args.start, args.end, args.step) task.done <- err } } } } }
// flush to disk from memory // 最新的数据在列表的最后面 // TODO fix me, filename fmt from item[0], it's hard to keep consistent func Flush(filename string, items []*cmodel.GraphItem) error { if items == nil || len(items) == 0 { return errors.New("empty items") } lock := L.GetLock(filename) lock.Lock() defer lock.Unlock() if !g.IsRrdFileExist(filename) { baseDir := file.Dir(filename) err := file.InsureDir(baseDir) if err != nil { return err } err = create(filename, items[0]) if err != nil { return err } } return update(filename, items) }
func configPluginRoutes() { http.HandleFunc("/plugin/update", func(w http.ResponseWriter, r *http.Request) { if !g.Config().Plugin.Enabled { w.Write([]byte("plugin not enabled")) return } dir := g.Config().Plugin.Dir parentDir := file.Dir(dir) file.InsureDir(parentDir) if file.IsExist(dir) { // git pull cmd := exec.Command("git", "pull") cmd.Dir = dir err := cmd.Run() if err != nil { w.Write([]byte(fmt.Sprintf("git pull in dir:%s fail. error: %s", dir, err))) return } } else { // git clone cmd := exec.Command("git", "clone", g.Config().Plugin.Git, file.Basename(dir)) cmd.Dir = parentDir err := cmd.Run() if err != nil { w.Write([]byte(fmt.Sprintf("git clone in dir:%s fail. error: %s", parentDir, err))) return } } w.Write([]byte("success")) }) http.HandleFunc("/plugin/reset", func(w http.ResponseWriter, r *http.Request) { if !g.Config().Plugin.Enabled { w.Write([]byte("plugin not enabled")) return } dir := g.Config().Plugin.Dir if file.IsExist(dir) { cmd := exec.Command("git", "reset", "--hard") cmd.Dir = dir err := cmd.Run() if err != nil { w.Write([]byte(fmt.Sprintf("git reset --hard in dir:%s fail. error: %s", dir, err))) return } } w.Write([]byte("success")) }) http.HandleFunc("/plugins", func(w http.ResponseWriter, r *http.Request) { //TODO: not thread safe RenderDataJson(w, plugins.Plugins) }) }
// flush to disk from memory // 最新的数据在列表的最后面 // TODO fix me, filename fmt from item[0], it's hard to keep consistent func flushrrd(filename string, items []*cmodel.GraphItem) error { if items == nil || len(items) == 0 { return errors.New("empty items") } if !g.IsRrdFileExist(filename) { baseDir := file.Dir(filename) err := file.InsureDir(baseDir) if err != nil { return err } err = create(filename, items[0]) if err != nil { return err } } return update(filename, items) }