[agent-operator] - image bastion mode
This commit is contained in:
@@ -4,6 +4,7 @@ go 1.22.1
|
||||
|
||||
require (
|
||||
go.uber.org/zap v1.27.0
|
||||
golang.org/x/net v0.24.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
|
||||
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
|
||||
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
|
||||
@@ -2,8 +2,11 @@ package image
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"wdd.io/agent-common/logger"
|
||||
)
|
||||
|
||||
var log = logger.Log
|
||||
|
||||
var unSupported = "UN-SUPPORT-APP-NAME"
|
||||
|
||||
const CmiiHarborPrefix = "harbor.cdcyy.com.cn/cmii/"
|
||||
@@ -99,7 +102,8 @@ func ImageFullNameToGzipFileName(imageFullName string) (gzipFileName string) {
|
||||
return gzipFileName
|
||||
}
|
||||
|
||||
func ImageFullNameToTargetImageFullName(imageFullName, targetHost string) string {
|
||||
// ImageNameToTargetImageFullName 将ImageName转换为目标TargetHosts的全名称,ImageName的格式为 短名称或者长名称 均可
|
||||
func ImageNameToTargetImageFullName(imageFullName, targetHostFullName string) string {
|
||||
|
||||
if strings.HasPrefix(imageFullName, CmiiHarborPrefix) {
|
||||
imageFullName = strings.TrimPrefix(imageFullName, CmiiHarborPrefix)
|
||||
@@ -108,7 +112,7 @@ func ImageFullNameToTargetImageFullName(imageFullName, targetHost string) string
|
||||
}
|
||||
// rancher/123:v123
|
||||
if strings.HasPrefix(imageFullName, "rancher") {
|
||||
return targetHost + "/" + imageFullName
|
||||
return targetHostFullName + "/" + imageFullName
|
||||
}
|
||||
// ossr/srs:v4.0.5
|
||||
if strings.Contains(imageFullName, "/") {
|
||||
@@ -117,10 +121,25 @@ func ImageFullNameToTargetImageFullName(imageFullName, targetHost string) string
|
||||
|
||||
// srs:v4.0.5
|
||||
// cmii-uav-platform:5.4.0
|
||||
return targetHost + "/cmii/" + imageFullName
|
||||
s := targetHostFullName + "/cmii/" + imageFullName
|
||||
log.InfoF("ImageFullName: [%s] to TargetImageFullName: [%s]", imageFullName, s)
|
||||
return s
|
||||
}
|
||||
|
||||
func GzipFileNameToImageFullName(gzipFileName string) (imageFullName string) {
|
||||
if !strings.HasSuffix(gzipFileName, ".tar.gz") {
|
||||
log.ErrorF(" %s is not end with .tar.gz", gzipFileName)
|
||||
return ""
|
||||
}
|
||||
gzipFileName = strings.TrimSuffix(gzipFileName, ".tar.gz")
|
||||
|
||||
if strings.HasPrefix(gzipFileName, "docker") {
|
||||
return strings.Split(gzipFileName, "=")[1] + "/" + strings.Split(gzipFileName, "=")[2] + ":" + strings.Split(gzipFileName, "=")[3]
|
||||
}
|
||||
|
||||
if strings.HasPrefix(gzipFileName, "cmlc=cmii=") {
|
||||
return strings.Split(gzipFileName, "=")[2] + ":" + strings.Split(gzipFileName, "=")[3]
|
||||
}
|
||||
|
||||
return gzipFileName
|
||||
}
|
||||
|
||||
193
agent-common/image/ImageNameConvert_test.go
Normal file
193
agent-common/image/ImageNameConvert_test.go
Normal file
@@ -0,0 +1,193 @@
|
||||
package image
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestImageFullNameToGzipFileName(t *testing.T) {
|
||||
test := []string{
|
||||
"bitnami/redis:6.2.6-debian-10-r0",
|
||||
"simonrupf/chronyd:0.4.3",
|
||||
"harbor.cdcyy.com.cn/cmii/cmii-rtsp-operator:v4.1.0",
|
||||
"harbor.cdcyy.com.cn/cmii/ossrs/srs:v4.0.136",
|
||||
"ossrs/srs:v4.0.136",
|
||||
"mongo:5.0",
|
||||
"bitnami/minio:2023.5.4",
|
||||
"busybox:latest",
|
||||
"busybox",
|
||||
"rancher/rancher:v2.7.0",
|
||||
}
|
||||
|
||||
for _, s := range test {
|
||||
gzipFileName := ImageFullNameToGzipFileName(s)
|
||||
fmt.Println(gzipFileName)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGzipFileNameToImageFullName(t *testing.T) {
|
||||
|
||||
test := []string{
|
||||
"cmlc=cmii=cmii-admin-data=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-mqtthandler=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-admin-gateway=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-multilink=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-admin-user=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-notice=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-app-release=4.2.0-validation.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-oauth=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-live-operator=5.2.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-open-gateway=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-ai-brain=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-srs-oss-adaptor=2023-SA.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-armypeople=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-suav-platform-supervision=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-base=5.4.0.tar.gz",
|
||||
"cmlc=cmii=cmii-suav-platform-supervisionh5=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-cms-portal=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-suav-supervision=5.4.0-032501.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-detection=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-airspace=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-jiangsuwenlv=4.1.3-jiangsu-0427.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-alarm=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-logistics=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-autowaypoint=4.2.0-beta.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-media=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-brain=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-multiterminal=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-cloud-live=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-mws=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-cms=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-oms=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-data-post-process=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-open=5.5.0-0419.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-developer=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-qinghaitourism=4.1.0-21377-0508.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-device=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-security=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-emergency=5.3.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-securityh5=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-gateway=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-share=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-gis-server=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-splice=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-grid-datasource=5.2.0-24810.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-platform-threedsimulation=5.2.0-21392.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-grid-engine=5.1.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-process=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-grid-manage=5.1.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-surveillance=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-industrial-portfolio=5.5.0-041801.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-threedsimulation=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-integration=5.5.0-0419.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-tower=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-kpi-monitor=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-user=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-logger=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-waypoint=5.5.0.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-material-warehouse=5.5.0.tar.gz",
|
||||
"cmlc=cmii=srs=v5.0.195.tar.gz",
|
||||
"cmlc=cmii=cmii-uav-mission=5.5.0.tar.gz",
|
||||
}
|
||||
|
||||
test2 := []string{
|
||||
"docker=rancher=backup-restore-operator=v1.0.3.tar.gz",
|
||||
"docker=rancher=kube-api-auth = v0.1.4.tar.gz",
|
||||
"docker=rancher=calico-cni=v3.17.2.tar.gz",
|
||||
"docker=rancher=kubernetes-external-dns=v0.7.3.tar.gz",
|
||||
"docker=rancher=calico-ctl=v3.17.2.tar.gz",
|
||||
"docker=rancher=library-busybox=1.31.1.tar.gz",
|
||||
"docker=rancher=calico-kube-controllers=v3.17.2.tar.gz",
|
||||
"docker=rancher=library-busybox=1.32.1.tar.gz",
|
||||
"docker=rancher=calico-node=v3.17.2.tar.gz",
|
||||
"docker=rancher=library-nginx=1.19.2-alpine.tar.gz",
|
||||
"docker=rancher=calico-pod2daemon-flexvol=v3.17.2.tar.gz",
|
||||
"docker=rancher=library-traefik=1.7.19.tar.gz",
|
||||
"docker=rancher=cis-operator=v1.0.3.tar.gz",
|
||||
"docker=rancher=local-path-provisioner=v0.0.11.tar.gz",
|
||||
"docker=rancher=cluster-proportional-autoscaler=1.7.1.tar.gz",
|
||||
"docker=rancher=local-path-provisioner=v0.0.14.tar.gz",
|
||||
"docker=rancher=cluster-proportional-autoscaler=1.8.1.tar.gz",
|
||||
"docker=rancher=local-path-provisioner=v0.0.19.tar.gz",
|
||||
"docker=rancher=configmap-reload=v0.3.0-rancher4.tar.gz",
|
||||
"docker=rancher=log-aggregator=v0.1.7.tar.gz",
|
||||
"docker=rancher=coredns-coredns=1.8.0.tar.gz",
|
||||
"docker=rancher=metrics-server=v0.4.1.tar.gz",
|
||||
"docker=rancher=coreos-etcd=v3.4.14-rancher1.tar.gz",
|
||||
"docker=rancher=nginx-ingress-controller-defaultbackend=1.5-rancher1.tar.gz",
|
||||
"docker=rancher=coreos-flannel=v0.13.0-rancher1.tar.gz",
|
||||
"docker=rancher=nginx-ingress-controller=nginx-0.43.0-rancher1.tar.gz",
|
||||
"docker=rancher=coreos-kube-state-metrics=v1.9.7.tar.gz",
|
||||
"docker=rancher=opa-gatekeeper=v3.1.0-beta.7.tar.gz",
|
||||
"docker=rancher=coreos-prometheus-config-reloader=v0.39.0.tar.gz",
|
||||
"docker=rancher=openzipkin-zipkin=2.14.2.tar.gz",
|
||||
"docker=rancher=coreos-prometheus-operator=v0.39.0.tar.gz",
|
||||
"docker=rancher=pause=3.2.tar.gz",
|
||||
"docker=rancher=externalip-webhook=v0.1.6.tar.gz",
|
||||
"docker=rancher=plugins-docker=18.09.tar.gz",
|
||||
"docker=rancher=flannel-cni=v0.3.0-rancher6.tar.gz",
|
||||
"docker=rancher=prom-alertmanager=v0.21.0.tar.gz",
|
||||
"docker=rancher=fleet-agent=v0.3.4.tar.gz",
|
||||
"docker=rancher=prometheus-auth=v0.2.1.tar.gz",
|
||||
"docker=rancher=fleet=v0.3.4.tar.gz",
|
||||
"docker=rancher=prom-node-exporter=v1.0.1.tar.gz",
|
||||
"docker=rancher=fluentd=v0.1.24.tar.gz",
|
||||
"docker=rancher=prom-prometheus=v2.18.2.tar.gz",
|
||||
"docker=rancher=grafana-grafana=7.1.5.tar.gz",
|
||||
"docker=rancher=rancher-agent=v2.5.7.tar.gz",
|
||||
"docker=rancher=hyperkube=v1.20.4-rancher1.tar.gz",
|
||||
"docker=rancher=rancher=v2.5.7.tar.gz",
|
||||
"docker=rancher=istio-kubectl=1.5.10.tar.gz",
|
||||
"docker=rancher=rancher-webhook=v0.1.0-beta9.tar.gz",
|
||||
"docker=rancher=jimmidyson-configmap-reload=v0.3.0.tar.gz",
|
||||
"docker=rancher=rke-tools=v0.1.72.tar.gz",
|
||||
"docker=rancher=k8s-dns-dnsmasq-nanny=1.15.2.tar.gz",
|
||||
"docker=rancher=security-scan=v0.1.14.tar.gz",
|
||||
"docker=rancher=k8s-dns-kube-dns=1.15.2.tar.gz",
|
||||
"docker=rancher=security-scan=v0.2.2.tar.gz",
|
||||
"docker=rancher=k8s-dns-node-cache=1.15.13.tar.gz",
|
||||
"docker=rancher=shell=v0.1.6.tar.gz",
|
||||
"docker=rancher=k8s-dns-sidecar=1.15.2.tar.gz",
|
||||
"docker=rancher=sonobuoy-sonobuoy=v0.16.3.tar.gz",
|
||||
"docker=rancher=klipper-lb=v0.1.2.tar.gz",
|
||||
"docker=rancher=system-upgrade-controller=v0.6.2.tar.gz",
|
||||
}
|
||||
|
||||
test3 := []string{
|
||||
"docker=bitnami=bitnami-shell=10-debian-10-r140.tar.gz",
|
||||
"docker=kubernetesui=dashboard=v2.0.1.tar.gz",
|
||||
"docker=bitnami=bitnami-shell=11-debian-11-r136.tar.gz",
|
||||
"docker=kubernetesui=metrics-scraper=v1.0.4.tar.gz",
|
||||
"docker=bitnami=minio=2022.5.4.tar.gz",
|
||||
"docker=mongo=5.0.tar.gz",
|
||||
"docker=bitnami=minio=2023.5.4.tar.gz",
|
||||
"docker=nacos=nacos-server=v2.1.2-slim.tar.gz",
|
||||
"docker=bitnami=mysql=8.0.35-debian-11-r1.tar.gz",
|
||||
"docker=nginx=1.21.3.tar.gz",
|
||||
"docker=bitnami=mysql=8.1.0-debian-11-r42.tar.gz",
|
||||
"docker=ossrs=srs=v4.0.136.tar.gz",
|
||||
"docker=bitnami=rabbitmq=3.11.26-debian-11-r2.tar.gz",
|
||||
"docker=ossrs=srs=v4.0-r3.tar.gz",
|
||||
"docker=bitnami=rabbitmq=3.9.12-debian-10-r3.tar.gz",
|
||||
"docker=rabbitmq=3.9-management.tar.gz",
|
||||
"docker=bitnami=redis=6.2.14-debian-11-r1.tar.gz",
|
||||
"docker=redis=6.0.20-alpine.tar.gz",
|
||||
"docker=bitnami=redis=6.2.6-debian-10-r0.tar.gz",
|
||||
"docker=simonrupf=chronyd=0.4.3.tar.gz",
|
||||
"docker=busybox=latest.tar.gz",
|
||||
"docker=dyrnq=nfs-subdir-external-provisioner=v4.0.2.tar.gz",
|
||||
"docker=emqx=emqx=4.2.12.tar.gz",
|
||||
}
|
||||
|
||||
test = append(test, test2...)
|
||||
test = append(test, test3...)
|
||||
|
||||
for _, s := range test {
|
||||
gzipFileName := GzipFileNameToImageFullName(s)
|
||||
fmt.Println(gzipFileName)
|
||||
fullName := ImageNameToTargetImageFullName(gzipFileName, "10.250.0.100:8033")
|
||||
fmt.Println(fullName)
|
||||
fmt.Println("--------------------")
|
||||
}
|
||||
}
|
||||
112
agent-common/utils/DownloadUtils.go
Normal file
112
agent-common/utils/DownloadUtils.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"golang.org/x/net/proxy"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
)
|
||||
|
||||
func DownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog []string) {
|
||||
|
||||
log.InfoF("Downloading file: %s", downloadUrl)
|
||||
resp, err := http.Get(downloadUrl)
|
||||
if err != nil {
|
||||
return false, []string{fmt.Sprintf("Error downloading file: %v", err)}
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return false, []string{fmt.Sprintf("Unexpected status code: %d", resp.StatusCode)}
|
||||
}
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return false, []string{fmt.Sprintf("Error reading response body: %v", err)}
|
||||
}
|
||||
|
||||
err = os.WriteFile(desFile, body, 0644)
|
||||
if err != nil {
|
||||
return false, []string{fmt.Sprintf("Error writing file to disk: %v", err)}
|
||||
}
|
||||
|
||||
log.InfoF("Downloading complete: %s", downloadUrl)
|
||||
return true, []string{}
|
||||
}
|
||||
|
||||
func DownloadFileBySocks5(downloadUrl string, socksProxyUrl string, proxyUser string, proxyPass string, desFile string) (downloadOk bool, resultLog []string) {
|
||||
// 解析下载URL
|
||||
_, err := url.Parse(downloadUrl)
|
||||
if err != nil {
|
||||
resultLog = append(resultLog, "Error parsing download URL: "+err.Error())
|
||||
return false, resultLog
|
||||
}
|
||||
|
||||
// 创建文件
|
||||
out, err := os.Create(desFile)
|
||||
if err != nil {
|
||||
resultLog = append(resultLog, "Error creating file: "+err.Error())
|
||||
return false, resultLog
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
// 创建HTTP客户端
|
||||
client := &http.Client{}
|
||||
|
||||
// 如果提供了代理URL
|
||||
if socksProxyUrl != "" {
|
||||
// 解析代理URL
|
||||
parsedProxyUrl, err := url.Parse(socksProxyUrl)
|
||||
if err != nil {
|
||||
resultLog = append(resultLog, "Error parsing proxy URL: "+err.Error())
|
||||
return false, resultLog
|
||||
}
|
||||
|
||||
// 使用SOCKS5代理
|
||||
auth := &proxy.Auth{User: proxyUser, Password: proxyPass}
|
||||
dialer, err := proxy.SOCKS5("tcp", parsedProxyUrl.Host, auth, proxy.Direct)
|
||||
if err != nil {
|
||||
resultLog = append(resultLog, "Error creating SOCKS5 dialer: "+err.Error())
|
||||
return false, resultLog
|
||||
}
|
||||
|
||||
// 设置HTTP和HTTPS代理
|
||||
httpTransport := &http.Transport{
|
||||
Dial: dialer.Dial,
|
||||
}
|
||||
client.Transport = httpTransport
|
||||
}
|
||||
|
||||
// 发送HTTP GET请求
|
||||
resp, err := client.Get(downloadUrl)
|
||||
if err != nil {
|
||||
resultLog = append(resultLog, "Error making GET request: "+err.Error())
|
||||
return false, resultLog
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
// 检查HTTP响应状态码
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
resultLog = append(resultLog, "Server returned HTTP status "+resp.Status)
|
||||
return false, resultLog
|
||||
}
|
||||
|
||||
// 将HTTP响应内容写入文件
|
||||
_, err = io.Copy(out, resp.Body)
|
||||
if err != nil {
|
||||
resultLog = append(resultLog, "Error writing to file: "+err.Error())
|
||||
return false, resultLog
|
||||
}
|
||||
|
||||
// check file exists
|
||||
existAndNotNull := FileExistAndNotNull(desFile)
|
||||
if !existAndNotNull {
|
||||
return false, []string{
|
||||
"[DownloadFileBySocks5] - file not exist download error!",
|
||||
}
|
||||
}
|
||||
|
||||
return true, resultLog
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package utils
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// AppendSourceToFile 将源文件的内容添加到目标文件,使用golang标准库完成,跨平台、安全性更强
|
||||
@@ -34,6 +35,17 @@ func AppendSourceToFile(sourceFile, targetFile string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// AppendOverwriteContentToFile 向目标文件中写入一些内容,覆盖源文件
|
||||
func AppendOverwriteContentToFile(content string, targetFile string) bool {
|
||||
|
||||
err := os.Remove(targetFile)
|
||||
if err != nil {
|
||||
log.WarnF("[BasicAppendOverwriteContentToFile] - Error removing file: %s , error is %s", targetFile, err.Error())
|
||||
}
|
||||
|
||||
return AppendContentToFile(content, targetFile)
|
||||
}
|
||||
|
||||
// AppendContentToFile 向目标文件中追加写入一些内容
|
||||
func AppendContentToFile(content string, targetFile string) bool {
|
||||
|
||||
@@ -87,3 +99,64 @@ func FileExists(fileFullPath string) bool {
|
||||
_, err := os.Stat(fileFullPath)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// FileExistAndNotNull 文件不为空返回true 文件为空返回false
|
||||
func FileExistAndNotNull(filename string) bool {
|
||||
|
||||
// Check if the file exists
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
log.DebugF("文件 %s 不存在!", filename)
|
||||
return false
|
||||
}
|
||||
|
||||
// Open the file for reading
|
||||
file, err := os.Open(filename)
|
||||
defer file.Close()
|
||||
if err != nil {
|
||||
log.DebugF("文件 %s 打开有误!", filename)
|
||||
return false // Handle error according to your needs
|
||||
}
|
||||
|
||||
// Get the file size
|
||||
info, _ := file.Stat()
|
||||
size := info.Size()
|
||||
|
||||
// Check if the file is not empty
|
||||
return size > 0
|
||||
}
|
||||
|
||||
func ListAllFileInFolder(folderName string) ([]string, error) {
|
||||
files := make([]string, 0)
|
||||
err := filepath.Walk(folderName, func(path string, info os.FileInfo, err error) error {
|
||||
if !info.IsDir() {
|
||||
files = append(files, info.Name())
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func RemoveFolderComplete(folderName string) bool {
|
||||
|
||||
err := filepath.Walk(folderName,
|
||||
func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !info.IsDir() {
|
||||
return os.Remove(path)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
err = os.RemoveAll(folderName)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user