Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 32 additions & 16 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ package main

import (
"context"
_ "embed"
_ "embed" // Required for //go:embed directives to work
"flag"
"fmt"
"net"
"net/http"
"os"
"path/filepath"
"time"

Expand Down Expand Up @@ -55,38 +56,45 @@ var (
versionFlag = flag.Bool("v", false, "version")
)

var initError error

func init() {
flag.Parse()
if *versionFlag {
fmt.Println("v" + common.VERSION)
return
}

println("git commit:", commit)
println("build date:", date)
logger.Info("starting CasaOS", zap.String("commit", commit), zap.String("date", date))

config.InitSetup(*configFlag, _confSample)
if err := config.InitSetup(*configFlag, _confSample); err != nil {
initError = fmt.Errorf("failed to initialize config: %w", err)
return
}

logger.LogInit(config.AppInfo.LogPath, config.AppInfo.LogSaveName, config.AppInfo.LogFileExt)
if len(*dbFlag) == 0 {
*dbFlag = config.AppInfo.DBPath + "/db"
}

sqliteDB = sqlite.GetDb(*dbFlag)
// gredis.GetRedisConn(config.RedisInfo),
var err error
sqliteDB, err = sqlite.GetDb(*dbFlag)
if err != nil {
initError = fmt.Errorf("failed to initialize database: %w", err)
return
}

service.MyService = service.NewService(sqliteDB, config.CommonInfo.RuntimePath)
service.MyService, err = service.NewService(sqliteDB, config.CommonInfo.RuntimePath)
if err != nil {
initError = fmt.Errorf("failed to initialize services: %w", err)
return
}

service.Cache = cache.Init()

service.GetCPUThermalZone()

route.InitFunction()

//service.MyService.System().GenreateSystemEntry()
///
//service.MountLists = make(map[string]*mountlib.MountPoint)
//configfile.Install()
}

// @title casaOS API
Expand All @@ -104,6 +112,12 @@ func main() {
if *versionFlag {
return
}

if initError != nil {
logger.Error("initialization failed", zap.Error(initError))
os.Exit(1)
}

v1Router := route.InitV1Router()

v2Router := route.InitV2Router()
Expand All @@ -128,7 +142,8 @@ func main() {

listener, err := net.Listen("tcp", net.JoinHostPort(LOCALHOST, "0"))
if err != nil {
panic(err)
logger.Error("failed to create listener", zap.Error(err))
os.Exit(1)
}
routers := []string{
"/v1/sys",
Expand All @@ -155,8 +170,8 @@ func main() {
Target: "http://" + listener.Addr().String(),
})
if err != nil {
fmt.Println("err", err)
panic(err)
logger.Error("failed to create route", zap.Error(err), zap.String("path", apiPath))
os.Exit(1)
}
}

Expand Down Expand Up @@ -224,6 +239,7 @@ func main() {
// defer service.MyService.Storage().UnmountAllStorage()
err = s.Serve(listener) // not using http.serve() to fix G114: Use of net/http serve function that has no support for setting timeouts (see https://github.com/securego/gosec)
if err != nil {
panic(err)
logger.Error("server stopped", zap.Error(err))
os.Exit(1)
}
}
60 changes: 32 additions & 28 deletions pkg/config/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ package config

import (
"fmt"
"log"
"os"
"path/filepath"

Expand Down Expand Up @@ -43,49 +42,54 @@ var (
ConfigFilePath string
)

// 初始化设置,获取系统的部分信息。
func InitSetup(config string, sample string) {
// InitSetup initializes settings and retrieves part of the system information.
func InitSetup(config, sample string) error {
ConfigFilePath = CasaOSConfigFilePath
if len(config) > 0 {
ConfigFilePath = config
}

// create default config file if not exist
if _, err := os.Stat(ConfigFilePath); os.IsNotExist(err) {
fmt.Println("config file not exist, create it")
// create config file
file, err := os.Create(ConfigFilePath)
if err != nil {
panic(err)
}
// Atomically create config file if it doesn't exist (O_EXCL prevents race condition)
file, err := os.OpenFile(ConfigFilePath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644)
if err == nil {
// File was created, write default config
defer file.Close()

// write default config
_, err = file.WriteString(sample)
if err != nil {
panic(err)
if _, err = file.WriteString(sample); err != nil {
return fmt.Errorf("failed to write default config: %w", err)
}
} else if !os.IsExist(err) {
// Error other than "file exists"
return fmt.Errorf("failed to create config file: %w", err)
}

var err error

// 读取文件
Cfg, err = ini.Load(ConfigFilePath)
if err != nil {
panic(err)
return fmt.Errorf("failed to load config file: %w", err)
}

if err := mapTo("app", AppInfo); err != nil {
return err
}
if err := mapTo("server", ServerInfo); err != nil {
return err
}
if err := mapTo("system", SystemConfigInfo); err != nil {
return err
}
if err := mapTo("file", FileSettingInfo); err != nil {
return err
}
if err := mapTo("common", CommonInfo); err != nil {
return err
}

mapTo("app", AppInfo)
mapTo("server", ServerInfo)
mapTo("system", SystemConfigInfo)
mapTo("file", FileSettingInfo)
mapTo("common", CommonInfo)
return nil
}

// 映射
func mapTo(section string, v interface{}) {
func mapTo(section string, v interface{}) error {
err := Cfg.Section(section).MapTo(v)
if err != nil {
log.Fatalf("Cfg.MapTo %s err: %v", section, err)
return fmt.Errorf("failed to map config section %s: %w", section, err)
}
return nil
}
27 changes: 17 additions & 10 deletions pkg/sqlite/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,44 +11,51 @@
package sqlite

import (
"fmt"
"errors"
"time"

"github.com/IceWhaleTech/CasaOS-Common/utils/logger"
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
model2 "github.com/IceWhaleTech/CasaOS/service/model"
"github.com/glebarez/sqlite"
"go.uber.org/zap"
"gorm.io/gorm"
)

var gdb *gorm.DB

func GetDb(dbPath string) *gorm.DB {
var ErrDatabaseConnection = errors.New("failed to connect to sqlite database")

func GetDb(dbPath string) (*gorm.DB, error) {
if gdb != nil {
return gdb
return gdb, nil
}
// Refer https://github.com/go-sql-driver/mysql#dsn-data-source-name
// dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", m.User, m.PWD, m.IP, m.Port, m.DBName)
// db, err := gorm.Open(mysql2.Open(dsn), &gorm.Config{})

file.IsNotExistMkDir(dbPath)
db, err := gorm.Open(sqlite.Open(dbPath+"/casaOS.db"), &gorm.Config{})
if err != nil {
panic("sqlite connect error")
logger.Error("sqlite connect error", zap.Error(err), zap.String("path", dbPath))
return nil, ErrDatabaseConnection
}

c, _ := db.DB()
c, err := db.DB()
if err != nil {
logger.Error("failed to get underlying sql.DB", zap.Error(err))
return nil, err
}
c.SetMaxIdleConns(10)
c.SetMaxOpenConns(1)
c.SetConnMaxIdleTime(time.Second * 1000)
gdb = db

err = db.AutoMigrate(&model2.AppNotify{}, model2.SharesDBModel{}, model2.ConnectionsDBModel{}, model2.PeerDriveDBModel{})
if err != nil {
fmt.Println(err)
logger.Error("failed to auto-migrate database models", zap.Error(err))
}

db.Exec("DROP TABLE IF EXISTS o_application")
db.Exec("DROP TABLE IF EXISTS o_friend")
db.Exec("DROP TABLE IF EXISTS o_person_download")
db.Exec("DROP TABLE IF EXISTS o_person_down_record")
return db
return db, nil
}
Loading