2
0
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:
耗子
2024-09-19 01:17:29 +08:00
committed by GitHub
parent d029e6c58e
commit dded5e26aa
23 changed files with 580 additions and 362 deletions

View File

@@ -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,
}
}

View File

@@ -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)
}

View File

@@ -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
View 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
}

View File

@@ -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)