package api import ( "context" "errors" "git.misaka.ren/m1saka/dsh-web/internal/docker" "git.misaka.ren/m1saka/dsh-web/internal/store" "net/http" "net/url" "os" "path/filepath" "time" ) func (a *API) indexBackup(i store.Instance, id, kind string, schema int, size int64) error { _, err := a.s.DB.Exec("CREATE TABLE IF NOT EXISTS backups (id TEXT PRIMARY KEY, uid TEXT NOT NULL, instance_id TEXT NOT NULL, kind TEXT NOT NULL, schema INTEGER NOT NULL, size INTEGER NOT NULL, created_at INTEGER NOT NULL)") if err != nil { return err } _, err = a.s.DB.Exec("INSERT INTO backups(id,uid,instance_id,kind,schema,size,created_at) VALUES(?,?,?,?,?,?,?)", id, i.UID, i.ID, kind, schema, size, time.Now().Unix()) return err } func configChownTree(root *os.Root, name string) error { st, err := root.Lstat(name) if os.IsNotExist(err) { return nil } if err != nil { return err } if st.Mode()&os.ModeSymlink != 0 { return root.Lchown(name, 1000, 1000) } if err = root.Chown(name, 1000, 1000); err != nil { return err } if !st.IsDir() { return nil } f, err := root.Open(name) if err != nil { return err } entries, err := f.ReadDir(-1) f.Close() if err != nil { return err } for _, entry := range entries { if err = configChownTree(root, filepath.Join(name, entry.Name())); err != nil { return err } } return nil } func (a *API) configStop(ctx context.Context, id string) error { ctx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() if err := a.docker.Do(ctx, "POST", "/containers/"+url.PathEscape(id)+"/stop?t=10", nil, nil); err != nil { var apiErr *docker.APIError if !errors.As(err, &apiErr) || apiErr.StatusCode != http.StatusNotModified { return err } } c, err := a.docker.Inspect(ctx, id) if err != nil { return err } if c.State.Running || c.State.Paused || c.State.Restarting { return errors.New("runtime did not stop") } return nil } func (a *API) configRestart(i store.Instance) error { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() err := a.docker.Do(ctx, "POST", "/containers/"+url.PathEscape(i.ContainerID)+"/start", nil, nil) if err != nil { a.s.SetInstance(i.ID, "error") } return err }