158 lines
4.8 KiB
Go
158 lines
4.8 KiB
Go
/*
|
|
* @Author: LinkLeong link@icewhale.org
|
|
* @Date: 2022-07-26 11:21:14
|
|
* @LastEditors: LinkLeong
|
|
* @LastEditTime: 2022-08-18 11:16:25
|
|
* @FilePath: /CasaOS/service/shares.go
|
|
* @Description:
|
|
* @Website: https://www.casaos.io
|
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
|
*/
|
|
package service
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
|
command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command"
|
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
|
"github.com/IceWhaleTech/CasaOS/service/model"
|
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type SharesService interface {
|
|
GetSharesList() (shares []model2.SharesDBModel)
|
|
GetSharesByPath(path string) (shares []model2.SharesDBModel)
|
|
GetSharesByName(name string) (shares []model2.SharesDBModel)
|
|
CreateShare(share model2.SharesDBModel)
|
|
DeleteShare(id string)
|
|
UpdateConfigFile()
|
|
InitSambaConfig()
|
|
DeleteShareByPath(path string)
|
|
}
|
|
|
|
type sharesStruct struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func (s *sharesStruct) DeleteShareByPath(path string) {
|
|
s.db.Where("path LIKE ?", path+"%").Delete(&model.SharesDBModel{})
|
|
s.UpdateConfigFile()
|
|
}
|
|
|
|
func (s *sharesStruct) GetSharesByName(name string) (shares []model2.SharesDBModel) {
|
|
s.db.Select("anonymous,path,id").Where("name = ?", name).Find(&shares)
|
|
|
|
return
|
|
}
|
|
func (s *sharesStruct) GetSharesByPath(path string) (shares []model2.SharesDBModel) {
|
|
s.db.Select("anonymous,path,id").Where("path = ?", path).Find(&shares)
|
|
return
|
|
}
|
|
func (s *sharesStruct) GetSharesList() (shares []model2.SharesDBModel) {
|
|
s.db.Select("anonymous,path,id").Find(&shares)
|
|
return
|
|
}
|
|
func (s *sharesStruct) CreateShare(share model2.SharesDBModel) {
|
|
s.db.Create(&share)
|
|
s.InitSambaConfig()
|
|
s.UpdateConfigFile()
|
|
}
|
|
func (s *sharesStruct) DeleteShare(id string) {
|
|
s.db.Where("id= ?", id).Delete(&model.SharesDBModel{})
|
|
s.UpdateConfigFile()
|
|
}
|
|
|
|
func (s *sharesStruct) UpdateConfigFile() {
|
|
shares := []model2.SharesDBModel{}
|
|
s.db.Select("anonymous,path").Find(&shares)
|
|
//generated config file
|
|
var configStr = ""
|
|
for _, share := range shares {
|
|
dirName := filepath.Base(share.Path)
|
|
configStr += `
|
|
[` + dirName + `]
|
|
comment = CasaOS share ` + dirName + `
|
|
public = Yes
|
|
path = ` + share.Path + `
|
|
browseable = Yes
|
|
read only = No
|
|
guest ok = Yes
|
|
create mask = 0777
|
|
directory mask = 0777
|
|
force user = root
|
|
|
|
`
|
|
}
|
|
//write config file
|
|
file.WriteToPath([]byte(configStr), "/etc/samba", "smb.casa.conf")
|
|
//restart samba
|
|
command2.ExecResultStrArray("source " + config.AppInfo.ShellPath + "/helper.sh ;RestartSMBD")
|
|
|
|
}
|
|
func (s *sharesStruct) InitSambaConfig() {
|
|
if file.Exists("/etc/samba/smb.conf") {
|
|
str := file.ReadLine(1, "/etc/samba/smb.conf")
|
|
if strings.Contains(str, "# Copyright (c) 2021-2022 CasaOS Inc. All rights reserved.") {
|
|
return
|
|
}
|
|
file.MoveFile("/etc/samba/smb.conf", "/etc/samba/smb.conf.bak")
|
|
var smbConf = ""
|
|
smbConf += `# Copyright (c) 2021-2022 CasaOS Inc. All rights reserved.
|
|
#
|
|
#
|
|
# ______ _______
|
|
# ( __ \ ( ___ )
|
|
# | ( \ ) | ( ) |
|
|
# | | ) | | | | |
|
|
# | | | | | | | |
|
|
# | | ) | | | | |
|
|
# | (__/ ) | (___) |
|
|
# (______/ (_______)
|
|
#
|
|
# _ _______ _________
|
|
# ( ( /| ( ___ ) \__ __/
|
|
# | \ ( | | ( ) | ) (
|
|
# | \ | | | | | | | |
|
|
# | (\ \) | | | | | | |
|
|
# | | \ | | | | | | |
|
|
# | ) \ | | (___) | | |
|
|
# |/ )_) (_______) )_(
|
|
#
|
|
# _______ _______ ______ _________ _______
|
|
# ( ) ( ___ ) ( __ \ \__ __/ ( ____ \ |\ /|
|
|
# | () () | | ( ) | | ( \ ) ) ( | ( \/ ( \ / )
|
|
# | || || | | | | | | | ) | | | | (__ \ (_) /
|
|
# | |(_)| | | | | | | | | | | | | __) \ /
|
|
# | | | | | | | | | | ) | | | | ( ) (
|
|
# | ) ( | | (___) | | (__/ ) ___) (___ | ) | |
|
|
# |/ \| (_______) (______/ \_______/ |/ \_/
|
|
#
|
|
#
|
|
# IMPORTANT: CasaOS will not provide technical support for any issues
|
|
# caused by unauthorized modification to the configuration.
|
|
|
|
[global]
|
|
## fruit settings
|
|
min protocol = SMB2
|
|
ea support = yes
|
|
## vfs objects = fruit streams_xattr
|
|
fruit:metadata = stream
|
|
fruit:model = Macmini
|
|
fruit:veto_appledouble = no
|
|
fruit:posix_rename = yes
|
|
fruit:zero_file_id = yes
|
|
fruit:wipe_intentionally_left_blank_rfork = yes
|
|
fruit:delete_empty_adfiles = yes
|
|
map to guest = bad user
|
|
include=/etc/samba/smb.casa.conf`
|
|
file.WriteToPath([]byte(smbConf), "/etc/samba", "smb.conf")
|
|
}
|
|
|
|
}
|
|
|
|
func NewSharesService(db *gorm.DB) SharesService {
|
|
return &sharesStruct{db: db}
|
|
}
|