mirror of https://github.com/cloudreve/Cloudreve
90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
package migrator
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/cloudreve/Cloudreve/v4/application/migrator/model"
|
|
"github.com/cloudreve/Cloudreve/v4/ent/node"
|
|
"github.com/cloudreve/Cloudreve/v4/inventory/types"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/boolset"
|
|
)
|
|
|
|
func (m *Migrator) migrateNode() error {
|
|
m.l.Info("Migrating nodes...")
|
|
|
|
var nodes []model.Node
|
|
if err := model.DB.Find(&nodes).Error; err != nil {
|
|
return fmt.Errorf("failed to list v3 nodes: %w", err)
|
|
}
|
|
|
|
for _, n := range nodes {
|
|
nodeType := node.TypeSlave
|
|
nodeStatus := node.StatusSuspended
|
|
if n.Type == model.MasterNodeType {
|
|
nodeType = node.TypeMaster
|
|
}
|
|
if n.Status == model.NodeActive {
|
|
nodeStatus = node.StatusActive
|
|
}
|
|
|
|
cap := &boolset.BooleanSet{}
|
|
settings := &types.NodeSetting{
|
|
Provider: types.DownloaderProviderAria2,
|
|
}
|
|
|
|
if n.Aria2Enabled {
|
|
boolset.Sets(map[types.NodeCapability]bool{
|
|
types.NodeCapabilityRemoteDownload: true,
|
|
}, cap)
|
|
|
|
aria2Options := &model.Aria2Option{}
|
|
if err := json.Unmarshal([]byte(n.Aria2Options), aria2Options); err != nil {
|
|
return fmt.Errorf("failed to unmarshal aria2 options: %w", err)
|
|
}
|
|
|
|
downloaderOptions := map[string]any{}
|
|
if aria2Options.Options != "" {
|
|
if err := json.Unmarshal([]byte(aria2Options.Options), &downloaderOptions); err != nil {
|
|
return fmt.Errorf("failed to unmarshal aria2 options: %w", err)
|
|
}
|
|
}
|
|
|
|
settings.Aria2Setting = &types.Aria2Setting{
|
|
Server: aria2Options.Server,
|
|
Token: aria2Options.Token,
|
|
Options: downloaderOptions,
|
|
TempPath: aria2Options.TempPath,
|
|
}
|
|
}
|
|
|
|
if n.Type == model.MasterNodeType {
|
|
boolset.Sets(map[types.NodeCapability]bool{
|
|
types.NodeCapabilityExtractArchive: true,
|
|
types.NodeCapabilityCreateArchive: true,
|
|
}, cap)
|
|
}
|
|
|
|
stm := m.v4client.Node.Create().
|
|
SetRawID(int(n.ID)).
|
|
SetCreatedAt(formatTime(n.CreatedAt)).
|
|
SetUpdatedAt(formatTime(n.UpdatedAt)).
|
|
SetName(n.Name).
|
|
SetType(nodeType).
|
|
SetStatus(nodeStatus).
|
|
SetServer(n.Server).
|
|
SetSlaveKey(n.SlaveKey).
|
|
SetCapabilities(cap).
|
|
SetSettings(settings).
|
|
SetWeight(n.Rank)
|
|
|
|
if err := stm.Exec(context.Background()); err != nil {
|
|
return fmt.Errorf("failed to create node %q: %w", n.Name, err)
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
}
|