86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
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
|
|
}
|