mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 06:40:59 +08:00
feat: 支持远程插件 (#180)
* feat: api基本完成 * feat: 阶段性提交 * feat: 初步支持远程插件 * feat: 支持远程插件 * fix: tests
This commit is contained in:
@@ -7,12 +7,12 @@ import (
|
||||
"github.com/go-resty/resty/v2"
|
||||
"github.com/shirou/gopsutil/host"
|
||||
|
||||
"github.com/TheTNB/panel/internal/panel"
|
||||
"github.com/TheTNB/panel/pkg/copier"
|
||||
)
|
||||
|
||||
type API struct {
|
||||
client *resty.Client
|
||||
panelVersion string
|
||||
client *resty.Client
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
@@ -20,7 +20,10 @@ type Response struct {
|
||||
Data any `json:"data"`
|
||||
}
|
||||
|
||||
func NewAPI(url ...string) *API {
|
||||
func NewAPI(panelVersion string, url ...string) *API {
|
||||
if len(panelVersion) == 0 {
|
||||
panic("panel version is required")
|
||||
}
|
||||
if len(url) == 0 {
|
||||
url = append(url, "https://panel.haozi.net/api")
|
||||
}
|
||||
@@ -33,10 +36,11 @@ func NewAPI(url ...string) *API {
|
||||
client := resty.New()
|
||||
client.SetTimeout(10 * time.Second)
|
||||
client.SetBaseURL(url[0])
|
||||
client.SetHeader("User-Agent", fmt.Sprintf("rat-panel/%s %s/%s", panel.Version, hostInfo.Platform, hostInfo.PlatformVersion))
|
||||
client.SetHeader("User-Agent", fmt.Sprintf("rat-panel/%s %s/%s", panelVersion, hostInfo.Platform, hostInfo.PlatformVersion))
|
||||
|
||||
return &API{
|
||||
client: client,
|
||||
panelVersion: panelVersion,
|
||||
client: client,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,8 +4,6 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"github.com/TheTNB/panel/internal/panel"
|
||||
)
|
||||
|
||||
type APITestSuite struct {
|
||||
@@ -14,18 +12,32 @@ type APITestSuite struct {
|
||||
}
|
||||
|
||||
func TestAPITestSuite(t *testing.T) {
|
||||
panel.Version = "2.3.0"
|
||||
suite.Run(t, &APITestSuite{
|
||||
api: NewAPI(),
|
||||
api: NewAPI("2.3.0"),
|
||||
})
|
||||
}
|
||||
|
||||
func (s *APITestSuite) TestGetLatestVersion() {
|
||||
_, err := s.api.GetLatestVersion()
|
||||
_, err := s.api.LatestVersion()
|
||||
s.NoError(err)
|
||||
}
|
||||
|
||||
func (s *APITestSuite) TestGetVersionsLog() {
|
||||
_, err := s.api.GetIntermediateVersions()
|
||||
func (s *APITestSuite) TestGetIntermediateVersions() {
|
||||
_, err := s.api.IntermediateVersions()
|
||||
s.NoError(err)
|
||||
}
|
||||
|
||||
func (s *APITestSuite) TestGetApps() {
|
||||
_, err := s.api.Apps()
|
||||
s.NoError(err)
|
||||
}
|
||||
|
||||
func (s *APITestSuite) TestGetAppBySlug() {
|
||||
_, err := s.api.AppBySlug("openresty")
|
||||
s.NoError(err)
|
||||
}
|
||||
|
||||
func (s *APITestSuite) TestGetRewritesByType() {
|
||||
_, err := s.api.RewritesByType("nginx")
|
||||
s.NoError(err)
|
||||
}
|
||||
|
||||
@@ -16,17 +16,19 @@ type App struct {
|
||||
Requires []string `json:"requires"`
|
||||
Excludes []string `json:"excludes"`
|
||||
Versions []struct {
|
||||
Url string `json:"url"`
|
||||
Checksum string `json:"checksum"`
|
||||
Version string `json:"version"`
|
||||
Install string `json:"install"`
|
||||
Uninstall string `json:"uninstall"`
|
||||
Update string `json:"update"`
|
||||
PanelVersion string `json:"panel_version"`
|
||||
} `json:"versions"`
|
||||
Order int `json:"order"`
|
||||
}
|
||||
|
||||
type Apps []App
|
||||
type Apps []*App
|
||||
|
||||
// GetApps 返回所有应用
|
||||
func (r *API) GetApps() (*Apps, error) {
|
||||
// Apps 返回所有应用
|
||||
func (r *API) Apps() (*Apps, error) {
|
||||
resp, err := r.client.R().SetResult(&Response{}).Get("/apps")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -42,3 +44,21 @@ func (r *API) GetApps() (*Apps, error) {
|
||||
|
||||
return apps, nil
|
||||
}
|
||||
|
||||
// AppBySlug 根据slug返回应用
|
||||
func (r *API) AppBySlug(slug string) (*App, error) {
|
||||
resp, err := r.client.R().SetResult(&Response{}).Get(fmt.Sprintf("/apps/%s", slug))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !resp.IsSuccess() {
|
||||
return nil, fmt.Errorf("failed to get app: %s", resp.String())
|
||||
}
|
||||
|
||||
app, err := getResponseData[App](resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return app, nil
|
||||
}
|
||||
|
||||
33
pkg/api/rewrite.go
Normal file
33
pkg/api/rewrite.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Rewrite struct {
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
type Rewrites []Rewrite
|
||||
|
||||
func (r *API) RewritesByType(typ string) (*Rewrites, error) {
|
||||
resp, err := r.client.R().SetResult(&Response{}).Get(fmt.Sprintf("/rewrites/%s", typ))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !resp.IsSuccess() {
|
||||
return nil, fmt.Errorf("failed to get rewrites: %s", resp.String())
|
||||
}
|
||||
|
||||
rewrites, err := getResponseData[Rewrites](resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rewrites, nil
|
||||
}
|
||||
@@ -3,8 +3,6 @@ package api
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/TheTNB/panel/internal/panel"
|
||||
)
|
||||
|
||||
type Version struct {
|
||||
@@ -16,8 +14,8 @@ type Version struct {
|
||||
|
||||
type Versions []Version
|
||||
|
||||
// GetLatestVersion 返回最新版本
|
||||
func (r *API) GetLatestVersion() (*Version, error) {
|
||||
// LatestVersion 返回最新版本
|
||||
func (r *API) LatestVersion() (*Version, error) {
|
||||
resp, err := r.client.R().SetResult(&Response{}).Get("/versions/latest")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -34,16 +32,16 @@ func (r *API) GetLatestVersion() (*Version, error) {
|
||||
return version, nil
|
||||
}
|
||||
|
||||
// GetIntermediateVersions 返回当前版本之后的所有版本
|
||||
func (r *API) GetIntermediateVersions() (*Versions, error) {
|
||||
// IntermediateVersions 返回当前版本之后的所有版本
|
||||
func (r *API) IntermediateVersions() (*Versions, error) {
|
||||
resp, err := r.client.R().
|
||||
SetQueryParam("start", panel.Version).
|
||||
SetResult(&Response{}).Get("/versions/log")
|
||||
SetQueryParam("start", r.panelVersion).
|
||||
SetResult(&Response{}).Get("/versions/intermediate")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !resp.IsSuccess() {
|
||||
return nil, fmt.Errorf("failed to get latest version: %s", resp.String())
|
||||
return nil, fmt.Errorf("failed to get intermediate versions: %s", resp.String())
|
||||
}
|
||||
|
||||
versions, err := getResponseData[Versions](resp)
|
||||
|
||||
Reference in New Issue
Block a user