Compare commits

...

12 Commits

Author SHA1 Message Date
Tiger Wang
0bb138e39e add API for checking casaos-* service status (#852)
Signed-off-by: Tiger Wang <tigerwang@outlook.com>
2023-01-30 17:01:47 -05:00
link
e8db1767e5 Update CHANGELOG.md
Signed-off-by: link <a624669980@163.com>
2023-01-19 21:42:10 +08:00
link
6b01263252 Update CHANGELOG.md
Signed-off-by: link <a624669980@163.com>
2023-01-19 10:16:55 +08:00
Tiger Wang
b2a4fafdb4 add race detection for tests 2023-01-17 12:49:49 -05:00
Tiger Wang
fcfb48d88e enable code coverage (#825) 2023-01-16 17:58:25 -05:00
link
86380d912d Allow specific special characters (#823) 2023-01-16 14:10:39 +08:00
link
9123974811 Update CHANGELOG.md
Signed-off-by: link <a624669980@163.com>
2023-01-09 18:08:47 +08:00
link
be50579544 add update type (#812) 2023-01-09 15:16:04 +08:00
link
91bb0cba6f Update CHANGELOG.md
Signed-off-by: link <a624669980@163.com>
2023-01-08 15:33:48 +08:00
link
b9946db854 repair the error of version number display after successful update (#805) 2023-01-05 15:16:54 +08:00
老竭力
9eb650b444 Add download triage for download migration-tool (#793)
Co-authored-by: Tiger Wang <tigerwang@outlook.com>
2023-01-05 10:47:44 +08:00
Tiger Wang
84f17b4c4b add upx as part of building step to shrink the size of binary files (#797) 2022-12-29 18:24:36 -05:00
28 changed files with 997 additions and 1016 deletions

22
.github/workflows/codecov.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: Collect Code Coverage
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Run coverage
run: go test -race -failfast -coverprofile=coverage.txt -covermode=atomic -v ./...
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3

View File

@@ -17,7 +17,7 @@ jobs:
run: | run: |
sudo apt update sudo apt update
sudo apt-get --no-install-recommends --yes install \ sudo apt-get --no-install-recommends --yes install \
libc6-dev-amd64-cross \ upx libc6-dev-amd64-cross \
gcc-aarch64-linux-gnu libc6-dev-arm64-cross \ gcc-aarch64-linux-gnu libc6-dev-arm64-cross \
gcc-arm-linux-gnueabihf libc6-dev-armhf-cross gcc-arm-linux-gnueabihf libc6-dev-armhf-cross
- -

View File

@@ -6,7 +6,7 @@ before:
- go generate - go generate
- go run github.com/google/go-licenses@latest check . --disallowed_types=restricted - go run github.com/google/go-licenses@latest check . --disallowed_types=restricted
- go mod tidy - go mod tidy
- go test -v ./... - go test -race -v ./...
builds: builds:
- id: casaos-amd64 - id: casaos-amd64
@@ -25,9 +25,6 @@ builds:
- linux - linux
goarch: goarch:
- amd64 - amd64
hooks:
post:
- find build/sysroot -type f | xargs -L 1 realpath --relative-to=build/sysroot > build/sysroot.manifest
- id: casaos-arm64 - id: casaos-arm64
binary: build/sysroot/usr/bin/casaos binary: build/sysroot/usr/bin/casaos
env: env:
@@ -44,9 +41,6 @@ builds:
- linux - linux
goarch: goarch:
- arm64 - arm64
hooks:
post:
- find build/sysroot -type f | xargs -L 1 realpath --relative-to=build/sysroot > build/sysroot.manifest
- id: casaos-arm-7 - id: casaos-arm-7
binary: build/sysroot/usr/bin/casaos binary: build/sysroot/usr/bin/casaos
env: env:
@@ -65,9 +59,6 @@ builds:
- arm - arm
goarm: goarm:
- "7" - "7"
hooks:
post:
- find build/sysroot -type f | xargs -L 1 realpath --relative-to=build/sysroot > build/sysroot.manifest
- id: casaos-migration-tool-amd64 - id: casaos-migration-tool-amd64
binary: build/sysroot/usr/bin/casaos-migration-tool binary: build/sysroot/usr/bin/casaos-migration-tool
main: ./cmd/migration-tool main: ./cmd/migration-tool

View File

@@ -6,14 +6,19 @@ before:
- go generate - go generate
- go run github.com/google/go-licenses@latest check . --disallowed_types=restricted - go run github.com/google/go-licenses@latest check . --disallowed_types=restricted
- go mod tidy - go mod tidy
- go test -v ./... - go test -race -v ./...
builds: builds:
- id: casaos-amd64 - id: casaos-amd64
binary: build/sysroot/usr/bin/casaos binary: build/sysroot/usr/bin/casaos
hooks:
post:
- upx --best --lzma -v --no-progress "{{ .Path }}"
env: env:
- CC=x86_64-linux-gnu-gcc - CC=x86_64-linux-gnu-gcc
ldflags: ldflags:
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
- -s - -s
- -w - -w
- -extldflags "-static" - -extldflags "-static"
@@ -25,14 +30,16 @@ builds:
- linux - linux
goarch: goarch:
- amd64 - amd64
hooks:
post:
- find build/sysroot -type f | xargs -L 1 realpath --relative-to=build/sysroot > build/sysroot.manifest
- id: casaos-arm64 - id: casaos-arm64
binary: build/sysroot/usr/bin/casaos binary: build/sysroot/usr/bin/casaos
hooks:
post:
- upx --best --lzma -v --no-progress "{{ .Path }}"
env: env:
- CC=aarch64-linux-gnu-gcc - CC=aarch64-linux-gnu-gcc
ldflags: ldflags:
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
- -s - -s
- -w - -w
- -extldflags "-static" - -extldflags "-static"
@@ -44,14 +51,16 @@ builds:
- linux - linux
goarch: goarch:
- arm64 - arm64
hooks:
post:
- find build/sysroot -type f | xargs -L 1 realpath --relative-to=build/sysroot > build/sysroot.manifest
- id: casaos-arm-7 - id: casaos-arm-7
binary: build/sysroot/usr/bin/casaos binary: build/sysroot/usr/bin/casaos
hooks:
post:
- upx --best --lzma -v --no-progress "{{ .Path }}"
env: env:
- CC=arm-linux-gnueabihf-gcc - CC=arm-linux-gnueabihf-gcc
ldflags: ldflags:
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
- -s - -s
- -w - -w
- -extldflags "-static" - -extldflags "-static"
@@ -65,15 +74,17 @@ builds:
- arm - arm
goarm: goarm:
- "7" - "7"
hooks:
post:
- find build/sysroot -type f | xargs -L 1 realpath --relative-to=build/sysroot > build/sysroot.manifest
- id: casaos-migration-tool-amd64 - id: casaos-migration-tool-amd64
binary: build/sysroot/usr/bin/casaos-migration-tool binary: build/sysroot/usr/bin/casaos-migration-tool
hooks:
post:
- upx --best --lzma -v --no-progress "{{ .Path }}"
main: ./cmd/migration-tool main: ./cmd/migration-tool
env: env:
- CC=x86_64-linux-gnu-gcc - CC=x86_64-linux-gnu-gcc
ldflags: ldflags:
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
- -s - -s
- -w - -w
- -extldflags "-static" - -extldflags "-static"
@@ -87,10 +98,15 @@ builds:
- amd64 - amd64
- id: casaos-migration-tool-arm64 - id: casaos-migration-tool-arm64
binary: build/sysroot/usr/bin/casaos-migration-tool binary: build/sysroot/usr/bin/casaos-migration-tool
hooks:
post:
- upx --best --lzma -v --no-progress "{{ .Path }}"
main: ./cmd/migration-tool main: ./cmd/migration-tool
env: env:
- CC=aarch64-linux-gnu-gcc - CC=aarch64-linux-gnu-gcc
ldflags: ldflags:
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
- -s - -s
- -w - -w
- -extldflags "-static" - -extldflags "-static"
@@ -104,10 +120,15 @@ builds:
- arm64 - arm64
- id: casaos-migration-tool-arm-7 - id: casaos-migration-tool-arm-7
binary: build/sysroot/usr/bin/casaos-migration-tool binary: build/sysroot/usr/bin/casaos-migration-tool
hooks:
post:
- upx --best --lzma -v --no-progress "{{ .Path }}"
main: ./cmd/migration-tool main: ./cmd/migration-tool
env: env:
- CC=arm-linux-gnueabihf-gcc - CC=arm-linux-gnueabihf-gcc
ldflags: ldflags:
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
- -s - -s
- -w - -w
- -extldflags "-static" - -extldflags "-static"

View File

@@ -16,6 +16,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Security ### Security
## [0.4.1] - 2023-1-19
### Added
- [Disk] Added disk merging feature in storage management (beta) that allows for multiple disks to be merged into a single storage space
- [System] Added option for startpage.com search engine
- [APP] Added app cloning feature in the app's context menu.
### Changed
- [APP] Improved app installation process, including display of the installation process, checks for successful installation, and prompts
- [System] Binary sizes are 40%~60% smaller (thanks to upx)
- [App] Optimization of install and update for certain country.
- [All] Lots of bug fixes
## [0.4.0] - 2022-12-13 ## [0.4.0] - 2022-12-13
### Added ### Added

View File

@@ -28,6 +28,9 @@
<a href="https://github.com/IceWhaleTech/CasaOS/issues" target="_blank"> <a href="https://github.com/IceWhaleTech/CasaOS/issues" target="_blank">
<img alt="CasaOS Issues" src="https://img.shields.io/github/issues/IceWhaleTech/CasaOS?color=162453&style=flat-square&label=Issues" /> <img alt="CasaOS Issues" src="https://img.shields.io/github/issues/IceWhaleTech/CasaOS?color=162453&style=flat-square&label=Issues" />
</a> </a>
<a href="https://codecov.io/gh/IceWhaleTech/CasaOS" >
<img src="https://codecov.io/gh/IceWhaleTech/CasaOS/branch/main/graph/badge.svg?token=l9uMKGlkxM"/>
</a>
<a href="https://github.com/IceWhaleTech/CasaOS/stargazers" target="_blank"> <a href="https://github.com/IceWhaleTech/CasaOS/stargazers" target="_blank">
<img alt="CasaOS Stargazers" src="https://img.shields.io/github/stars/IceWhaleTech/CasaOS?color=162453&style=flat-square&label=Stars" /> <img alt="CasaOS Stargazers" src="https://img.shields.io/github/stars/IceWhaleTech/CasaOS?color=162453&style=flat-square&label=Stars" />
</a> </a>

101
api/casaos/openapi.yaml Normal file
View File

@@ -0,0 +1,101 @@
openapi: 3.0.3
info:
title: CasaOS API
version: v2
description: |
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/IceWhaleTech/logo/main/casaos/casaos_banner_dark_night_800px.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/IceWhaleTech/logo/main/casaos/casaos_banner_twilight_blue_800px.png">
<img alt="CasaOS" src="https://raw.githubusercontent.com/IceWhaleTech/logo/main/casaos/casaos_banner_twilight_blue_800px.png">
</picture>
CasaOS API provides miscellaneous methods for different scenarios.
For issues and discussions, please visit the [GitHub repository](https://github.com/IceWhaleTech/CasaOS) or join [our Discord](https://discord.gg/knqAbbBbeX).
servers:
- url: /v2/casaos
tags:
- name: Health methods
description: |-
(TODO)
x-tagGroups:
- name: Methods
tags:
- Health methods
security:
- access_token: []
paths:
/health/services:
get:
tags:
- Health methods
summary: Get service status
description: |-
Get running status of each `casaos-*` service.
operationId: getHealthServices
responses:
"200":
$ref: "#/components/responses/GetHealthServicesOK"
"500":
$ref: "#/components/responses/ResponseInternalServerError"
components:
securitySchemes:
access_token:
type: apiKey
in: header
name: Authorization
responses:
ResponseOK:
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/BaseResponse"
ResponseInternalServerError:
description: Internal Server Error
content:
application/json:
schema:
$ref: "#/components/schemas/BaseResponse"
GetHealthServicesOK:
description: OK
content:
application/json:
schema:
allOf:
- $ref: "#/components/schemas/BaseResponse"
- properties:
data:
$ref: "#/components/schemas/HealthServices"
schemas:
BaseResponse:
properties:
message:
readOnly: true
description: message returned by server side if there is any
type: string
example: ""
HealthServices:
properties:
running:
type: array
items:
type: string
example: "casaos-gateway.service"
not_running:
type: array
items:
type: string
example: "casaos.service"

24
api/index.html Normal file
View File

@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>CasaOS | Developers</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
<style>
body {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<redoc spec-url='casaos/openapi.yaml' expandResponses='all' jsonSampleExpandLevel='all'></redoc>
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
</body>
</html>

View File

@@ -56,6 +56,22 @@ __is_migration_needed() {
__is_version_gt "${version2}" "${version1}" __is_version_gt "${version2}" "${version1}"
} }
__get_download_domain(){
local region
# Use ipconfig.io/country and https://ifconfig.io/country_code to get the country code
region=$(curl --connect-timeout 2 -s ipconfig.io/country || echo "")
if [ "${region}" = "" ]; then
region=$(curl --connect-timeout 2 -s https://ifconfig.io/country_code || echo "")
fi
if [[ "${region}" = "China" ]] || [[ "${region}" = "CN" ]]; then
echo "https://casaos.oss-cn-shanghai.aliyuncs.com/"
else
echo "https://github.com/"
fi
}
DOWNLOAD_DOMAIN=$(__get_download_domain)
BUILD_PATH=$(dirname "${BASH_SOURCE[0]}")/../../.. BUILD_PATH=$(dirname "${BASH_SOURCE[0]}")/../../..
SOURCE_ROOT=${BUILD_PATH}/sysroot SOURCE_ROOT=${BUILD_PATH}/sysroot
@@ -71,7 +87,7 @@ CURRENT_BIN_FILE=${CURRENT_BIN_PATH}/${APP_NAME}
CURRENT_BIN_FILE_LEGACY=$(realpath -e ${CURRENT_BIN_PATH_LEGACY}/${APP_NAME} || which ${APP_NAME} || echo CURRENT_BIN_FILE_LEGACY_NOT_FOUND) CURRENT_BIN_FILE_LEGACY=$(realpath -e ${CURRENT_BIN_PATH_LEGACY}/${APP_NAME} || which ${APP_NAME} || echo CURRENT_BIN_FILE_LEGACY_NOT_FOUND)
SOURCE_VERSION="$(${SOURCE_BIN_FILE} -v)" SOURCE_VERSION="$(${SOURCE_BIN_FILE} -v)"
CURRENT_VERSION="$(${CURRENT_BIN_FILE} -v || ${CURRENT_BIN_FILE_LEGACY} -v || (stat "${CURRENT_BIN_FILE_LEGACY}" > /dev/null && echo LEGACY_WITHOUT_VERSION) || echo CURRENT_VERSION_NOT_FOUND)" CURRENT_VERSION="$(${CURRENT_BIN_FILE} -v || ${CURRENT_BIN_FILE_LEGACY} -v || (stat "${CURRENT_BIN_FILE_LEGACY}" >/dev/null && echo LEGACY_WITHOUT_VERSION) || echo CURRENT_VERSION_NOT_FOUND)"
__info_done "CURRENT_VERSION: ${CURRENT_VERSION}" __info_done "CURRENT_VERSION: ${CURRENT_VERSION}"
__info_done "SOURCE_VERSION: ${SOURCE_VERSION}" __info_done "SOURCE_VERSION: ${SOURCE_VERSION}"
@@ -86,16 +102,16 @@ fi
ARCH="unknown" ARCH="unknown"
case $(uname -m) in case $(uname -m) in
x86_64) x86_64)
ARCH="amd64" ARCH="amd64"
;; ;;
aarch64) aarch64)
ARCH="arm64" ARCH="arm64"
;; ;;
armv7l) armv7l)
ARCH="arm-7" ARCH="arm-7"
;; ;;
*) *)
__error "Unsupported architecture" __error "Unsupported architecture"
;; ;;
esac esac
@@ -134,7 +150,7 @@ while read -r VERSION_PAIR; do
if [ "${CURRENT_VERSION_FOUND}" = "true" ]; then if [ "${CURRENT_VERSION_FOUND}" = "true" ]; then
MIGRATION_PATH+=("${URL// /}") MIGRATION_PATH+=("${URL// /}")
fi fi
done < "${MIGRATION_LIST_FILE}" done <"${MIGRATION_LIST_FILE}"
if [ ${#MIGRATION_PATH[@]} -eq 0 ]; then if [ ${#MIGRATION_PATH[@]} -eq 0 ]; then
__warning "No migration path found from ${CURRENT_VERSION} to ${SOURCE_VERSION}" __warning "No migration path found from ${CURRENT_VERSION} to ${SOURCE_VERSION}"
@@ -143,7 +159,8 @@ fi
pushd "${MIGRATION_SERVICE_DIR}" pushd "${MIGRATION_SERVICE_DIR}"
{ for URL in "${MIGRATION_PATH[@]}"; do {
for URL in "${MIGRATION_PATH[@]}"; do
MIGRATION_TOOL_FILE=$(basename "${URL}") MIGRATION_TOOL_FILE=$(basename "${URL}")
if [ -f "${MIGRATION_TOOL_FILE}" ]; then if [ -f "${MIGRATION_TOOL_FILE}" ]; then

View File

@@ -1,3 +1,3 @@
LEGACY_WITHOUT_VERSION https://github.com/IceWhaleTech/CasaOS/releases/download/v0.3.6/linux-${ARCH}-casaos-migration-tool-v0.3.6.tar.gz LEGACY_WITHOUT_VERSION ${DOWNLOAD_DOMAIN}IceWhaleTech/CasaOS/releases/download/v0.3.6/linux-${ARCH}-casaos-migration-tool-v0.3.6.tar.gz
v0.3.5 https://github.com/IceWhaleTech/CasaOS/releases/download/v0.3.6/linux-${ARCH}-casaos-migration-tool-v0.3.6.tar.gz v0.3.5 ${DOWNLOAD_DOMAIN}IceWhaleTech/CasaOS/releases/download/v0.3.6/linux-${ARCH}-casaos-migration-tool-v0.3.6.tar.gz
v0.3.5.1 https://github.com/IceWhaleTech/CasaOS/releases/download/v0.3.6/linux-${ARCH}-casaos-migration-tool-v0.3.6.tar.gz v0.3.5.1 ${DOWNLOAD_DOMAIN}IceWhaleTech/CasaOS/releases/download/v0.3.6/linux-${ARCH}-casaos-migration-tool-v0.3.6.tar.gz

View File

@@ -1,5 +1,5 @@
[Unit] [Unit]
After=casaos-gateway.service After=casaos-message-bus.service
ConditionFileNotEmpty=/etc/casaos/casaos.conf ConditionFileNotEmpty=/etc/casaos/casaos.conf
Description=CasaOS Main Service Description=CasaOS Main Service

View File

@@ -370,19 +370,6 @@ MountCIFS(){
$sudo_cmd mount -t cifs -o username=$1,password=$6,port=$4 //$2/$3 $5 $sudo_cmd mount -t cifs -o username=$1,password=$6,port=$4 //$2/$3 $5
} }
# $1:service name
CheckServiceStatus(){
rs="`systemctl status $1 |grep -E 'Active|PID'`"
#echo "$rs"
run="`echo "$rs" |grep -B 2 'running'`"
fai="`echo "$rs" |grep -E -B 2 'failed|inactive|dead'`"
if [ "$run" == "" ]
then
echo "failed"
else
echo "running"
fi
}
UDEVILUmount(){ UDEVILUmount(){
$sudo_cmd udevil umount -f $1 $sudo_cmd udevil umount -f $1
} }

View File

@@ -17,10 +17,10 @@ import (
interfaces "github.com/IceWhaleTech/CasaOS-Common" interfaces "github.com/IceWhaleTech/CasaOS-Common"
"github.com/IceWhaleTech/CasaOS-Common/utils/systemctl" "github.com/IceWhaleTech/CasaOS-Common/utils/systemctl"
"github.com/IceWhaleTech/CasaOS-Gateway/common"
"github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/config"
"github.com/IceWhaleTech/CasaOS/pkg/sqlite" "github.com/IceWhaleTech/CasaOS/pkg/sqlite"
"github.com/IceWhaleTech/CasaOS/service" "github.com/IceWhaleTech/CasaOS/service"
"github.com/IceWhaleTech/CasaOS/types"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -29,40 +29,35 @@ const (
) )
var ( var (
commit = "private build"
date = "private build"
_logger *Logger _logger *Logger
sqliteDB *gorm.DB sqliteDB *gorm.DB
)
var (
configFlag = "" configFlag = ""
dbFlag = "" dbFlag = ""
) )
func init() { func init() {
config.InitSetup(configFlag)
if len(dbFlag) == 0 {
dbFlag = config.AppInfo.DBPath + "/db"
}
sqliteDB = sqlite.GetDb(dbFlag)
// gredis.GetRedisConn(config.RedisInfo),
service.MyService = service.NewService(sqliteDB, "", nil)
}
func main() {
versionFlag := flag.Bool("v", false, "version") versionFlag := flag.Bool("v", false, "version")
debugFlag := flag.Bool("d", true, "debug") debugFlag := flag.Bool("d", true, "debug")
forceFlag := flag.Bool("f", true, "force") forceFlag := flag.Bool("f", true, "force")
flag.Parse() flag.Parse()
_logger = NewLogger()
if *versionFlag { if *versionFlag {
fmt.Println(common.Version) fmt.Println("v" + types.CURRENTVERSION)
os.Exit(0) os.Exit(0)
} }
println("git commit:", commit)
println("build date:", date)
_logger = NewLogger()
if os.Getuid() != 0 { if os.Getuid() != 0 {
_logger.Info("Root privileges are required to run this program.")
os.Exit(1) os.Exit(1)
} }
@@ -82,6 +77,19 @@ func main() {
} }
} }
config.InitSetup(configFlag)
if len(dbFlag) == 0 {
dbFlag = config.AppInfo.DBPath + "/db"
}
sqliteDB = sqlite.GetDb(dbFlag)
// gredis.GetRedisConn(config.RedisInfo),
service.MyService = service.NewService(sqliteDB, "", nil)
}
func main() {
migrationTools := []interfaces.MigrationTool{ migrationTools := []interfaces.MigrationTool{
// nothing to migrate from last version // nothing to migrate from last version
} }

View File

@@ -55,6 +55,6 @@ func (u *migrationTool) PostMigrate() error {
return nil return nil
} }
func NewMigrationToolFor_036() interfaces.MigrationTool { func NewMigrationDummy() interfaces.MigrationTool {
return &migrationTool{} return &migrationTool{}
} }

191
codegen/casaos_api.go Normal file
View File

@@ -0,0 +1,191 @@
// Package codegen provides primitives to interact with the openapi HTTP API.
//
// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT.
package codegen
import (
"bytes"
"compress/gzip"
"encoding/base64"
"fmt"
"net/url"
"path"
"strings"
"github.com/getkin/kin-openapi/openapi3"
"github.com/labstack/echo/v4"
)
const (
Access_tokenScopes = "access_token.Scopes"
)
// BaseResponse defines model for BaseResponse.
type BaseResponse struct {
// Message message returned by server side if there is any
Message *string `json:"message,omitempty"`
}
// HealthServices defines model for HealthServices.
type HealthServices struct {
NotRunning *[]string `json:"not_running,omitempty"`
Running *[]string `json:"running,omitempty"`
}
// GetHealthServicesOK defines model for GetHealthServicesOK.
type GetHealthServicesOK struct {
Data *HealthServices `json:"data,omitempty"`
// Message message returned by server side if there is any
Message *string `json:"message,omitempty"`
}
// ResponseInternalServerError defines model for ResponseInternalServerError.
type ResponseInternalServerError = BaseResponse
// ServerInterface represents all server handlers.
type ServerInterface interface {
// Get service status
// (GET /health/services)
GetHealthServices(ctx echo.Context) error
}
// ServerInterfaceWrapper converts echo contexts to parameters.
type ServerInterfaceWrapper struct {
Handler ServerInterface
}
// GetHealthServices converts echo context to params.
func (w *ServerInterfaceWrapper) GetHealthServices(ctx echo.Context) error {
var err error
ctx.Set(Access_tokenScopes, []string{""})
// Invoke the callback with all the unmarshalled arguments
err = w.Handler.GetHealthServices(ctx)
return err
}
// This is a simple interface which specifies echo.Route addition functions which
// are present on both echo.Echo and echo.Group, since we want to allow using
// either of them for path registration
type EchoRouter interface {
CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
}
// RegisterHandlers adds each server route to the EchoRouter.
func RegisterHandlers(router EchoRouter, si ServerInterface) {
RegisterHandlersWithBaseURL(router, si, "")
}
// Registers handlers, and prepends BaseURL to the paths, so that the paths
// can be served under a prefix.
func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) {
wrapper := ServerInterfaceWrapper{
Handler: si,
}
router.GET(baseURL+"/health/services", wrapper.GetHealthServices)
}
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
"H4sIAAAAAAAC/7xVUW/jNgz+KwK3h3Zw46DFgMHAPfR2W68ohgzrARvQBDlGZmxdbUkj5bRZ4f8+yHIv",
"S7IV3YDdUyKR/L6PNEk9gXatd5ZsECiegEm8s0LD4YrCe8Im1LfEG6NJZjfxWjsbyIb4F71vjMZgnM0/",
"ibPxTnRNLQ7Wppmtobh7gq+Z1lDAV/mOLU9+kr9FoV9GWuizJ/DsPHEwSUSJYQB7CWJfJfR9v+j7PoOS",
"RLPxUR4UMLuBPoNnqmsbiC02MYr4B2bH/yq516d0rOSZWyVyldij34gQCfZAisOytCSC1WDYxx4Niil0",
"bKlUq62SRCOmJGXWKtTEpIwotFvIgB6x9Q1BAZABE5Yz22yhCNxRBmHro0UCG1ulXA6qfSTNurDkztoY",
"UDyBCdQO9zsejYJOJpIg4Ijl8wUy4zaeX4N3VmGgB9y+HndIR0h3bML2NpY+ZYBak8gyuHsavrqJha0J",
"S2LIwGIbMS67UDs2fwwNsuNCb25omypl7Nodf6F5N51eaG906JiGA82tUkolg7iONamWSoNv5nDimdbE",
"cqZd4/hsaBAqVIl8fzoHJayFwps51CF4KfKc8WFSmVB3q06Ix3aeaNfm15p+rbGhD6TrvHGVy1s0Nk/F",
"G3+WK7SWeBnhl9ZUdVh+N536x4m31Rz+q9gmAv2PasODGSiWq6ajlwWbtlLYRAnfo+DsNon68oqSmvyg",
"C+Y2qVKXP18rz25jShLVGtHUNGjJdaJaCrUrRa0dq9Ks18RkgxJNFtk4mUSUHx0rI9JRnPFSlUZ0J2Kc",
"lUz5hlBIbYyYEFeBursy4X23UkzeiQmOt4uT52qkShynn2SeKsfqkzNW3bmO1Tsj2nG5iy7TxaSq8nv7",
"++Vq9XZFv51O5sO4mDDM7i5hyGBDLGlINudxXJ0ni95AAReT6eQCMvAY6mFG83pYQ7n8ZQ9VFI7H7YqC",
"GteHkoChE+XWilDX6uO4OL75qEaYCQykPAz1dZnCDxZetv9Knk+n//QefPbL/+4p7TP49jWxL71YwwLr",
"2hZ5O6Y6JjKmGguNlUBxN67t5/aBxd7yG17p/bV3t+gX0SGSyWDvuIEC8s352OwQHUb4w6qffJi9m53u",
"tuUBe4x8PAtYXbHrfAIYPX8aXV5Qvuj/DAAA//9MfhiluAgAAA==",
}
// GetSwagger returns the content of the embedded swagger specification file
// or error if failed to decode
func decodeSpec() ([]byte, error) {
zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, ""))
if err != nil {
return nil, fmt.Errorf("error base64 decoding spec: %s", err)
}
zr, err := gzip.NewReader(bytes.NewReader(zipped))
if err != nil {
return nil, fmt.Errorf("error decompressing spec: %s", err)
}
var buf bytes.Buffer
_, err = buf.ReadFrom(zr)
if err != nil {
return nil, fmt.Errorf("error decompressing spec: %s", err)
}
return buf.Bytes(), nil
}
var rawSpec = decodeSpecCached()
// a naive cached of a decoded swagger spec
func decodeSpecCached() func() ([]byte, error) {
data, err := decodeSpec()
return func() ([]byte, error) {
return data, err
}
}
// Constructs a synthetic filesystem for resolving external references when loading openapi specifications.
func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) {
var res = make(map[string]func() ([]byte, error))
if len(pathToFile) > 0 {
res[pathToFile] = rawSpec
}
return res
}
// GetSwagger returns the Swagger specification corresponding to the generated code
// in this file. The external references of Swagger specification are resolved.
// The logic of resolving external references is tightly connected to "import-mapping" feature.
// Externally referenced files must be embedded in the corresponding golang packages.
// Urls can be supported but this task was out of the scope.
func GetSwagger() (swagger *openapi3.T, err error) {
var resolvePath = PathToRawSpec("")
loader := openapi3.NewLoader()
loader.IsExternalRefsAllowed = true
loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) {
var pathToFile = url.String()
pathToFile = path.Clean(pathToFile)
getSpec, ok := resolvePath[pathToFile]
if !ok {
err1 := fmt.Errorf("path not found: %s", pathToFile)
return nil, err1
}
return getSpec()
}
var specData []byte
specData, err = rawSpec()
if err != nil {
return
}
swagger, err = loader.LoadFromData(specData)
if err != nil {
return
}
return
}

122
go.mod
View File

@@ -1,37 +1,121 @@
module github.com/IceWhaleTech/CasaOS module github.com/IceWhaleTech/CasaOS
go 1.16 go 1.19
require ( require (
github.com/Curtis-Milo/nat-type-identifier-go v0.0.0-20220215191915-18d42168c63d github.com/Curtis-Milo/nat-type-identifier-go v0.0.0-20220215191915-18d42168c63d
github.com/IceWhaleTech/CasaOS-Common v0.4.1-alpha2 github.com/IceWhaleTech/CasaOS-Common v0.4.2-alpha1
github.com/IceWhaleTech/CasaOS-Gateway v0.3.6 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e github.com/deepmap/oapi-codegen v1.12.4
github.com/disintegration/imaging v1.6.2 github.com/disintegration/imaging v1.6.2
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b github.com/dsoprea/go-exif/v3 v3.0.0-20221012082141-d21ac8e2de85
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect github.com/getkin/kin-openapi v0.113.0
github.com/gin-contrib/gzip v0.0.6 github.com/gin-contrib/gzip v0.0.6
github.com/gin-gonic/gin v1.8.1 github.com/gin-gonic/gin v1.8.2
github.com/glebarez/sqlite v1.5.0 github.com/glebarez/sqlite v1.6.0
github.com/go-ini/ini v1.62.0 github.com/go-ini/ini v1.67.0
github.com/golang/mock v1.6.0 github.com/golang/mock v1.6.0
github.com/gomodule/redigo v1.8.5 github.com/gomodule/redigo v1.8.9
github.com/google/go-github/v36 v36.0.0 github.com/google/go-github/v36 v36.0.0
github.com/googollee/go-socket.io v1.6.2 github.com/googollee/go-socket.io v1.6.2
github.com/gorilla/websocket v1.5.0 github.com/gorilla/websocket v1.5.0
github.com/hirochachacha/go-smb2 v1.1.0 github.com/hirochachacha/go-smb2 v1.1.0
github.com/labstack/echo/v4 v4.10.0
github.com/mholt/archiver/v3 v3.5.1 github.com/mholt/archiver/v3 v3.5.1
github.com/patrickmn/go-cache v2.1.0+incompatible github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/robfig/cron v1.2.0 github.com/robfig/cron v1.2.0
github.com/satori/go.uuid v1.2.0 github.com/satori/go.uuid v1.2.0
github.com/shirou/gopsutil/v3 v3.22.7 github.com/shirou/gopsutil/v3 v3.22.11
github.com/smartystreets/assertions v1.2.0 // indirect github.com/stretchr/testify v1.8.1
github.com/smartystreets/goconvey v1.6.4 // indirect github.com/tidwall/gjson v1.14.4
github.com/stretchr/testify v1.8.0 go.uber.org/zap v1.24.0
github.com/tidwall/gjson v1.10.2 golang.org/x/crypto v0.4.0
go.uber.org/zap v1.21.0 golang.org/x/oauth2 v0.3.0
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 gorm.io/gorm v1.24.2
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
gorm.io/gorm v1.24.0
gotest.tools v2.2.0+incompatible gotest.tools v2.2.0+incompatible
) )
require (
github.com/andybalholm/brotli v1.0.1 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect
github.com/geoffgarside/ber v1.1.0 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/glebarez/go-sqlite v1.20.0 // indirect
github.com/go-errors/errors v1.4.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/swag v0.21.1 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/goccy/go-json v0.9.11 // indirect
github.com/godbus/dbus/v5 v5.0.4 // indirect
github.com/gofrs/uuid v4.0.0+incompatible // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/go-querystring v1.0.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/invopop/yaml v0.1.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.15.13 // indirect
github.com/klauspost/pgzip v1.2.5 // indirect
github.com/labstack/gommon v0.4.0 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/mattn/go-sqlite3 v1.14.15 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/nwaples/rardecode v1.1.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/perimeterx/marshmallow v1.1.4 // indirect
github.com/pierrec/lz4/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.11 // indirect
github.com/tklauser/numcpus v0.6.0 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
github.com/ulikunitz/xz v0.5.9 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect
golang.org/x/net v0.4.0 // indirect
golang.org/x/sys v0.3.0 // indirect
golang.org/x/text v0.5.0 // indirect
golang.org/x/time v0.2.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.21.5 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.4.0 // indirect
modernc.org/sqlite v1.20.0 // indirect
)

972
go.sum

File diff suppressed because it is too large Load Diff

58
main.go
View File

@@ -1,6 +1,9 @@
//go:generate bash -c "mkdir -p codegen && go run github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.12.4 -generate types,server,spec -package codegen api/casaos/openapi.yaml > codegen/casaos_api.go"
package main package main
import ( import (
_ "embed"
"flag" "flag"
"fmt" "fmt"
"net" "net"
@@ -11,6 +14,9 @@ import (
"github.com/IceWhaleTech/CasaOS-Common/model" "github.com/IceWhaleTech/CasaOS-Common/model"
"github.com/IceWhaleTech/CasaOS-Common/utils/constants" "github.com/IceWhaleTech/CasaOS-Common/utils/constants"
"github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS-Common/utils/logger"
util_http "github.com/IceWhaleTech/CasaOS-Common/utils/http"
"github.com/IceWhaleTech/CasaOS/pkg/cache" "github.com/IceWhaleTech/CasaOS/pkg/cache"
"github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/config"
"github.com/IceWhaleTech/CasaOS/pkg/sqlite" "github.com/IceWhaleTech/CasaOS/pkg/sqlite"
@@ -20,7 +26,6 @@ import (
"github.com/IceWhaleTech/CasaOS/service" "github.com/IceWhaleTech/CasaOS/service"
"github.com/IceWhaleTech/CasaOS/types" "github.com/IceWhaleTech/CasaOS/types"
"github.com/coreos/go-systemd/daemon" "github.com/coreos/go-systemd/daemon"
"github.com/gin-gonic/gin"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/robfig/cron" "github.com/robfig/cron"
@@ -32,6 +37,15 @@ const LOCALHOST = "127.0.0.1"
var sqliteDB *gorm.DB var sqliteDB *gorm.DB
var ( var (
commit = "private build"
date = "private build"
//go:embed api/index.html
_docHTML string
//go:embed api/casaos/openapi.yaml
_docYAML string
configFlag = flag.String("c", "", "config address") configFlag = flag.String("c", "", "config address")
dbFlag = flag.String("db", "", "db path") dbFlag = flag.String("db", "", "db path")
versionFlag = flag.Bool("v", false, "version") versionFlag = flag.Bool("v", false, "version")
@@ -43,6 +57,10 @@ func init() {
fmt.Println("v" + types.CURRENTVERSION) fmt.Println("v" + types.CURRENTVERSION)
return return
} }
println("git commit:", commit)
println("build date:", date)
config.InitSetup(*configFlag) config.InitSetup(*configFlag)
logger.LogInit(config.AppInfo.LogPath, config.AppInfo.LogSaveName, config.AppInfo.LogFileExt) logger.LogInit(config.AppInfo.LogPath, config.AppInfo.LogSaveName, config.AppInfo.LogFileExt)
@@ -77,15 +95,21 @@ func main() {
if *versionFlag { if *versionFlag {
return return
} }
// model.Setup()
// gredis.Setup()
r := route.InitRouter() v1Router := route.InitV1Router()
defer service.SocketServer.Close() defer service.SocketServer.Close()
r.GET("/v1/socketio/*any", gin.WrapH(service.SocketServer))
r.POST("/v1/socketio/*any", gin.WrapH(service.SocketServer))
// service.SyncTask(sqliteDB) v2Router := route.InitV2Router()
v2DocRouter := route.InitV2DocRouter(_docHTML, _docYAML)
mux := &util_http.HandlerMultiplexer{
HandlerMap: map[string]http.Handler{
"v1": v1Router,
"v2": v2Router,
"doc": v2DocRouter,
},
}
cron2 := cron.New() cron2 := cron.New()
// every day execution // every day execution
@@ -110,10 +134,22 @@ func main() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
routers := []string{"sys", "port", "file", "folder", "batch", "image", "samba", "notify", "socketio"} apiPaths := []string{
for _, v := range routers { "/v1/sys",
"/v1/port",
"/v1/file",
"/v1/folder",
"/v1/batch",
"/v1/image",
"/v1/samba",
"/v1/notify",
"/v1/socketio",
route.V2APIPath,
route.V2DocPath,
}
for _, apiPath := range apiPaths {
err = service.MyService.Gateway().CreateRoute(&model.Route{ err = service.MyService.Gateway().CreateRoute(&model.Route{
Path: "/v1/" + v, Path: apiPath,
Target: "http://" + listener.Addr().String(), Target: "http://" + listener.Addr().String(),
}) })
@@ -157,7 +193,7 @@ func main() {
} }
s := &http.Server{ s := &http.Server{
Handler: r, Handler: mux,
ReadHeaderTimeout: 5 * time.Second, // fix G112: Potential slowloris attack (see https://github.com/securego/gosec) ReadHeaderTimeout: 5 * time.Second, // fix G112: Potential slowloris attack (see https://github.com/securego/gosec)
} }

View File

@@ -1,25 +0,0 @@
//go:build darwin
// +build darwin
/*
* @Author: LinkLeong link@icewhale.org
* @Date: 2022-08-12 14:22:28
* @LastEditors: LinkLeong
* @LastEditTime: 2022-09-05 16:27:55
* @FilePath: /CasaOS/route/darwin.go
* @Description:
* @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved.
*/
package route
func MonitoryUSB() {
}
func SendAllHardwareStatusBySocket() {
}
func SendUSBBySocket() {
}

View File

@@ -7,12 +7,13 @@ import (
"github.com/IceWhaleTech/CasaOS-Common/utils/jwt" "github.com/IceWhaleTech/CasaOS-Common/utils/jwt"
"github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/config"
v1 "github.com/IceWhaleTech/CasaOS/route/v1" v1 "github.com/IceWhaleTech/CasaOS/route/v1"
"github.com/IceWhaleTech/CasaOS/service"
"github.com/gin-contrib/gzip" "github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
func InitRouter() *gin.Engine { func InitV1Router() *gin.Engine {
ginMode := gin.ReleaseMode ginMode := gin.ReleaseMode
if config.ServerInfo.RunMode != "" { if config.ServerInfo.RunMode != "" {
ginMode = config.ServerInfo.RunMode ginMode = config.ServerInfo.RunMode
@@ -30,23 +31,6 @@ func InitRouter() *gin.Engine {
r.Use(middleware.WriteLog()) r.Use(middleware.WriteLog())
} }
// r.StaticFS("/ui", http.FS(web.Static))
// r.GET("/", WebUIHome)
// r.StaticFS("/assets", http.Dir("./static/assets"))
// r.StaticFile("/favicon.ico", "./static/favicon.ico")
//r.GET("/", func(c *gin.Context) {
// c.Redirect(http.StatusMovedPermanently, "ui/")
//})
// r.POST("/v1/users/register", v1.PostUserRegister)
// r.POST("/v1/users/login", v1.PostUserLogin)
// r.GET("/v1/users/name", v1.GetUserAllUsername) //all/name
// r.POST("/v1/users/refresh", v1.PostUserRefreshToken)
// // No short-term modifications
// r.GET("/v1/users/image", v1.GetUserImage)
// r.GET("/v1/users/status", v1.GetUserStatus) //init/check
// r.GET("/v1/guide/check", v1.GetGuideCheck) // /v1/sys/guide_check
r.GET("/v1/sys/debug", v1.GetSystemConfigDebug) // //debug r.GET("/v1/sys/debug", v1.GetSystemConfigDebug) // //debug
r.GET("/v1/sys/version/check", v1.GetSystemCheckVersion) r.GET("/v1/sys/version/check", v1.GetSystemCheckVersion)
@@ -163,5 +147,10 @@ func InitRouter() *gin.Engine {
v1NotifyGroup.POST("/uninstall_app", v1.PostUninstallAppNotify) v1NotifyGroup.POST("/uninstall_app", v1.PostUninstallAppNotify)
} }
} }
// socketio
v1Group.GET("/socketio/*any", gin.WrapH(service.SocketServer))
v1Group.POST("/socketio/*any", gin.WrapH(service.SocketServer))
return r return r
} }

View File

@@ -12,11 +12,14 @@ package v1
import ( import (
"fmt" "fmt"
"net/http"
"os" "os"
"path/filepath" "path/filepath"
"regexp" "regexp"
"strings" "strings"
"github.com/IceWhaleTech/CasaOS-Common/utils/systemctl"
"github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/pkg/samba" "github.com/IceWhaleTech/CasaOS/pkg/samba"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
@@ -30,12 +33,14 @@ import (
// service // service
func GetSambaStatus(c *gin.Context) { func GetSambaStatus(c *gin.Context) {
status := service.MyService.System().IsServiceRunning("smbd") if status, err := systemctl.IsServiceRunning("smbd"); err != nil || !status {
c.JSON(http.StatusInternalServerError, model.Result{
if !status { Success: common_err.SERVICE_NOT_RUNNING,
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_NOT_RUNNING, Message: common_err.GetMsg(common_err.SERVICE_NOT_RUNNING)}) Message: common_err.GetMsg(common_err.SERVICE_NOT_RUNNING),
})
return return
} }
needInit := true needInit := true
if file.Exists("/etc/samba/smb.conf") { if file.Exists("/etc/samba/smb.conf") {
str := file.ReadLine(1, "/etc/samba/smb.conf") str := file.ReadLine(1, "/etc/samba/smb.conf")
@@ -87,12 +92,13 @@ func PostSambaSharesCreate(c *gin.Context) {
shareDBModel.Anonymous = true shareDBModel.Anonymous = true
shareDBModel.Path = v.Path shareDBModel.Path = v.Path
shareDBModel.Name = filepath.Base(v.Path) shareDBModel.Name = filepath.Base(v.Path)
os.Chmod(v.Path, 0777) os.Chmod(v.Path, 0o777)
service.MyService.Shares().CreateShare(shareDBModel) service.MyService.Shares().CreateShare(shareDBModel)
} }
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shares}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shares})
} }
func DeleteSambaShares(c *gin.Context) { func DeleteSambaShares(c *gin.Context) {
id := c.Param("id") id := c.Param("id")
if id == "" { if id == "" {
@@ -103,8 +109,7 @@ func DeleteSambaShares(c *gin.Context) {
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id})
} }
//client // client
func GetSambaConnectionsList(c *gin.Context) { func GetSambaConnectionsList(c *gin.Context) {
connections := service.MyService.Connections().GetConnectionsList() connections := service.MyService.Connections().GetConnectionsList()
connectionList := []model.Connections{} connectionList := []model.Connections{}
@@ -131,11 +136,11 @@ func PostSambaConnectionsCreate(c *gin.Context) {
return return
} }
if ok, _ := regexp.MatchString("^[a-zA-Z0-9]{4,30}$", connection.Password); !ok { if ok, _ := regexp.MatchString(`^[\w@#*.]{4,30}$`, connection.Password); !ok {
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CHARACTER_LIMIT, Message: common_err.GetMsg(common_err.CHARACTER_LIMIT)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CHARACTER_LIMIT, Message: common_err.GetMsg(common_err.CHARACTER_LIMIT)})
return return
} }
if ok, _ := regexp.MatchString("^[a-zA-Z0-9]{4,30}$", connection.Username); !ok { if ok, _ := regexp.MatchString(`^[\w@#*.]{4,30}$`, connection.Username); !ok {
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }

130
route/v2.go Normal file
View File

@@ -0,0 +1,130 @@
package route
import (
"net/http"
"net/url"
"strconv"
"strings"
"github.com/IceWhaleTech/CasaOS/codegen"
"github.com/IceWhaleTech/CasaOS-Common/utils/common_err"
"github.com/IceWhaleTech/CasaOS-Common/utils/jwt"
v2Route "github.com/IceWhaleTech/CasaOS/route/v2"
"github.com/deepmap/oapi-codegen/pkg/middleware"
"github.com/getkin/kin-openapi/openapi3"
"github.com/getkin/kin-openapi/openapi3filter"
"github.com/labstack/echo/v4"
echo_middleware "github.com/labstack/echo/v4/middleware"
)
var (
_swagger *openapi3.T
V2APIPath string
V2DocPath string
)
func init() {
swagger, err := codegen.GetSwagger()
if err != nil {
panic(err)
}
_swagger = swagger
u, err := url.Parse(_swagger.Servers[0].URL)
if err != nil {
panic(err)
}
V2APIPath = strings.TrimRight(u.Path, "/")
V2DocPath = "/doc" + V2APIPath
}
func InitV2Router() http.Handler {
appManagement := v2Route.NewCasaOS()
e := echo.New()
e.Use((echo_middleware.CORSWithConfig(echo_middleware.CORSConfig{
AllowOrigins: []string{"*"},
AllowMethods: []string{echo.POST, echo.GET, echo.OPTIONS, echo.PUT, echo.DELETE},
AllowHeaders: []string{echo.HeaderAuthorization, echo.HeaderContentLength, echo.HeaderXCSRFToken, echo.HeaderContentType, echo.HeaderAccessControlAllowOrigin, echo.HeaderAccessControlAllowHeaders, echo.HeaderAccessControlAllowMethods, echo.HeaderConnection, echo.HeaderOrigin, echo.HeaderXRequestedWith},
ExposeHeaders: []string{echo.HeaderContentLength, echo.HeaderAccessControlAllowOrigin, echo.HeaderAccessControlAllowHeaders},
MaxAge: 172800,
AllowCredentials: true,
})))
e.Use(echo_middleware.Gzip())
e.Use(echo_middleware.Logger())
e.Use(echo_middleware.JWTWithConfig(echo_middleware.JWTConfig{
Skipper: func(c echo.Context) bool {
return c.RealIP() == "::1" || c.RealIP() == "127.0.0.1"
},
ParseTokenFunc: func(token string, c echo.Context) (interface{}, error) {
claims, code := jwt.Validate(token)
if code != common_err.SUCCESS {
return nil, echo.ErrUnauthorized
}
c.Request().Header.Set("user_id", strconv.Itoa(claims.ID))
return claims, nil
},
TokenLookupFuncs: []echo_middleware.ValuesExtractor{
func(c echo.Context) ([]string, error) {
return []string{c.Request().Header.Get(echo.HeaderAuthorization)}, nil
},
},
}))
// e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
// return func(c echo.Context) error {
// switch c.Request().Header.Get(echo.HeaderContentType) {
// case common.MIMEApplicationYAML: // in case request contains a compose content in YAML
// return middleware.OapiRequestValidatorWithOptions(_swagger, &middleware.Options{
// Options: openapi3filter.Options{
// AuthenticationFunc: openapi3filter.NoopAuthenticationFunc,
// // ExcludeRequestBody: true,
// // ExcludeResponseBody: true,
// },
// })(next)(c)
// default:
// return middleware.OapiRequestValidatorWithOptions(_swagger, &middleware.Options{
// Options: openapi3filter.Options{
// AuthenticationFunc: openapi3filter.NoopAuthenticationFunc,
// },
// })(next)(c)
// }
// }
// })
e.Use(middleware.OapiRequestValidatorWithOptions(_swagger, &middleware.Options{
Options: openapi3filter.Options{AuthenticationFunc: openapi3filter.NoopAuthenticationFunc},
}))
codegen.RegisterHandlersWithBaseURL(e, appManagement, V2APIPath)
return e
}
func InitV2DocRouter(docHTML string, docYAML string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == V2DocPath {
if _, err := w.Write([]byte(docHTML)); err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
return
}
if r.URL.Path == V2DocPath+"/openapi.yaml" {
if _, err := w.Write([]byte(docYAML)); err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
}
})
}

26
route/v2/health.go Normal file
View File

@@ -0,0 +1,26 @@
package v2
import (
"net/http"
"github.com/IceWhaleTech/CasaOS/codegen"
"github.com/IceWhaleTech/CasaOS/service"
"github.com/labstack/echo/v4"
)
func (s *CasaOS) GetHealthServices(ctx echo.Context) error {
services, err := service.MyService.Health().Services()
if err != nil {
message := err.Error()
return ctx.JSON(http.StatusInternalServerError, codegen.ResponseInternalServerError{
Message: &message,
})
}
return ctx.JSON(http.StatusOK, codegen.GetHealthServicesOK{
Data: &codegen.HealthServices{
Running: services[true],
NotRunning: services[false],
},
})
}

11
route/v2/route.go Normal file
View File

@@ -0,0 +1,11 @@
package v2
import (
"github.com/IceWhaleTech/CasaOS/codegen"
)
type CasaOS struct{}
func NewCasaOS() codegen.ServerInterface {
return &CasaOS{}
}

39
service/health.go Normal file
View File

@@ -0,0 +1,39 @@
package service
import (
"github.com/IceWhaleTech/CasaOS-Common/utils/systemctl"
)
type HealthService interface {
Services() (map[bool]*[]string, error)
}
type service struct{}
func (s *service) Services() (map[bool]*[]string, error) {
services, err := systemctl.ListServices("casaos*")
if err != nil {
return nil, err
}
var running, notRunning []string
for _, service := range services {
if service.Running {
running = append(running, service.Name)
} else {
notRunning = append(notRunning, service.Name)
}
}
result := map[bool]*[]string{
true: &running,
false: &notRunning,
}
return result, nil
}
func NewHealthService() HealthService {
return &service{}
}

View File

@@ -22,22 +22,25 @@ import (
var Cache *cache.Cache var Cache *cache.Cache
var MyService Repository var (
var SocketServer *socketio.Server MyService Repository
SocketServer *socketio.Server
)
var ( var (
WebSocketConns []*websocket.Conn WebSocketConns []*websocket.Conn
SocketRun bool SocketRun bool
) )
type Repository interface { type Repository interface {
// User() UserService
Casa() CasaService Casa() CasaService
Notify() NotifyServer
Rely() RelyService
System() SystemService
Shares() SharesService
Connections() ConnectionsService Connections() ConnectionsService
Gateway() external.ManagementService Gateway() external.ManagementService
Health() HealthService
Notify() NotifyServer
Rely() RelyService
Shares() SharesService
System() SystemService
} }
func NewService(db *gorm.DB, RuntimePath string, socket *socketio.Server) Repository { func NewService(db *gorm.DB, RuntimePath string, socket *socketio.Server) Repository {
@@ -51,25 +54,27 @@ func NewService(db *gorm.DB, RuntimePath string, socket *socketio.Server) Reposi
} }
return &store{ return &store{
gateway: gatewayManagement,
casa: NewCasaService(), casa: NewCasaService(),
connections: NewConnectionsService(db),
gateway: gatewayManagement,
health: NewHealthService(),
notify: NewNotifyService(db), notify: NewNotifyService(db),
rely: NewRelyService(db), rely: NewRelyService(db),
system: NewSystemService(),
shares: NewSharesService(db), shares: NewSharesService(db),
connections: NewConnectionsService(db), system: NewSystemService(),
} }
} }
type store struct { type store struct {
db *gorm.DB db *gorm.DB
casa CasaService casa CasaService
notify NotifyServer
rely RelyService
system SystemService
shares SharesService
connections ConnectionsService connections ConnectionsService
gateway external.ManagementService gateway external.ManagementService
health HealthService
notify NotifyServer
rely RelyService
shares SharesService
system SystemService
} }
func (c *store) Gateway() external.ManagementService { func (c *store) Gateway() external.ManagementService {
@@ -99,3 +104,7 @@ func (c *store) Notify() NotifyServer {
func (c *store) Casa() CasaService { func (c *store) Casa() CasaService {
return c.casa return c.casa
} }
func (c *store) Health() HealthService {
return c.health
}

View File

@@ -13,12 +13,13 @@ import (
"strings" "strings"
"time" "time"
"github.com/IceWhaleTech/CasaOS-Common/utils/file"
"github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS-Common/utils/logger"
"github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/config"
command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command" command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
"github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/host" "github.com/shirou/gopsutil/v3/host"
@@ -50,7 +51,6 @@ type SystemService interface {
CreateFile(path string) (int, error) CreateFile(path string) (int, error)
RenameFile(oldF, newF string) (int, error) RenameFile(oldF, newF string) (int, error)
MkdirAll(path string) (int, error) MkdirAll(path string) (int, error)
IsServiceRunning(name string) bool
GetCPUTemperature() int GetCPUTemperature() int
GetCPUPower() map[string]string GetCPUPower() map[string]string
GetMacAddress() (string, error) GetMacAddress() (string, error)
@@ -232,6 +232,8 @@ func (c *systemService) GetNet(physics bool) []string {
} }
func (s *systemService) UpdateSystemVersion(version string) { func (s *systemService) UpdateSystemVersion(version string) {
keyName := "casa_version"
Cache.Delete(keyName)
if file.Exists(config.AppInfo.LogPath + "/upgrade.log") { if file.Exists(config.AppInfo.LogPath + "/upgrade.log") {
os.Remove(config.AppInfo.LogPath + "/upgrade.log") os.Remove(config.AppInfo.LogPath + "/upgrade.log")
} }
@@ -240,7 +242,8 @@ func (s *systemService) UpdateSystemVersion(version string) {
if len(config.ServerInfo.UpdateUrl) > 0 { if len(config.ServerInfo.UpdateUrl) > 0 {
go command2.OnlyExec("curl -fsSL " + config.ServerInfo.UpdateUrl + " | bash") go command2.OnlyExec("curl -fsSL " + config.ServerInfo.UpdateUrl + " | bash")
} else { } else {
go command2.OnlyExec("curl -fsSL https://get.casaos.io/update | bash") osRelease, _ := file.ReadOSRelease()
go command2.OnlyExec("curl -fsSL https://get.casaos.io/update?t=" + osRelease["MANUFACTURER"] + " | bash")
} }
// s.log.Error(config.AppInfo.ProjectPath + "/shell/tool.sh -r " + version) // s.log.Error(config.AppInfo.ProjectPath + "/shell/tool.sh -r " + version)
@@ -308,11 +311,6 @@ func GetDeviceAllIP() []string {
return address return address
} }
func (s *systemService) IsServiceRunning(name string) bool {
status := command2.ExecResultStr("source " + config.AppInfo.ShellPath + "/helper.sh ;CheckServiceStatus smbd")
return strings.TrimSpace(status) == "running"
}
// find thermal_zone of cpu. // find thermal_zone of cpu.
// assertions: // assertions:
// - thermal_zone "type" and "temp" are required fields // - thermal_zone "type" and "temp" are required fields
@@ -343,7 +341,7 @@ func GetCPUThermalZone() string {
} }
} }
} else { } else {
if len(name) > 0 { //proves at least one zone if len(name) > 0 { // proves at least one zone
path = stub + "0" path = stub + "0"
} else { } else {
path = "" path = ""
@@ -384,7 +382,7 @@ func (s *systemService) GetCPUPower() map[string]string {
} }
func (s *systemService) SystemReboot() error { func (s *systemService) SystemReboot() error {
//cmd := exec.Command("/bin/bash", "-c", "reboot") // cmd := exec.Command("/bin/bash", "-c", "reboot")
arg := []string{"6"} arg := []string{"6"}
cmd := exec.Command("init", arg...) cmd := exec.Command("init", arg...)
_, err := cmd.CombinedOutput() _, err := cmd.CombinedOutput()
@@ -393,6 +391,7 @@ func (s *systemService) SystemReboot() error {
} }
return nil return nil
} }
func (s *systemService) SystemShutdown() error { func (s *systemService) SystemShutdown() error {
arg := []string{"0"} arg := []string{"0"}
cmd := exec.Command("init", arg...) cmd := exec.Command("init", arg...)
@@ -404,6 +403,5 @@ func (s *systemService) SystemShutdown() error {
} }
func NewSystemService() SystemService { func NewSystemService() SystemService {
return &systemService{} return &systemService{}
} }

View File

@@ -19,6 +19,6 @@
*/ */
package types package types
const CURRENTVERSION = "0.4.1" const CURRENTVERSION = "0.4.2"
const BODY = " " const BODY = " "