|
@@ -16,13 +16,91 @@ import (
|
|
|
|
|
|
*/
|
|
|
|
|
|
-type SambaConfigEditor struct {
|
|
|
+type ShareManager struct {
|
|
|
SambaConfigPath string
|
|
|
}
|
|
|
|
|
|
+type ShareConfig struct {
|
|
|
+ Name string
|
|
|
+ Path string
|
|
|
+ ValidUsers []string
|
|
|
+ ReadOnly bool
|
|
|
+ Browseable bool
|
|
|
+ GuestOk bool
|
|
|
+}
|
|
|
+
|
|
|
+func NewSambaShareManager() *ShareManager {
|
|
|
+ return &ShareManager{
|
|
|
+ SambaConfigPath: "/etc/samba/smb.conf",
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// ReadSambaShares reads the smb.conf file and extracts all existing shares
|
|
|
+func (s *ShareManager) ReadSambaShares() ([]ShareConfig, error) {
|
|
|
+ file, err := os.Open(s.SambaConfigPath)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer file.Close()
|
|
|
+
|
|
|
+ var shares []ShareConfig
|
|
|
+ var currentShare *ShareConfig
|
|
|
+
|
|
|
+ scanner := bufio.NewScanner(file)
|
|
|
+ for scanner.Scan() {
|
|
|
+ line := strings.TrimSpace(scanner.Text())
|
|
|
+
|
|
|
+ // Check for section headers
|
|
|
+ if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
|
|
|
+ if currentShare != nil {
|
|
|
+ shares = append(shares, *currentShare)
|
|
|
+ }
|
|
|
+ currentShare = &ShareConfig{
|
|
|
+ Name: strings.Trim(line, "[]"),
|
|
|
+ }
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check if we are currently processing a share section
|
|
|
+ if currentShare != nil {
|
|
|
+ tokens := strings.SplitN(line, "=", 2)
|
|
|
+ if len(tokens) != 2 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ key := strings.TrimSpace(tokens[0])
|
|
|
+ value := strings.TrimSpace(tokens[1])
|
|
|
+
|
|
|
+ switch key {
|
|
|
+ case "path":
|
|
|
+ currentShare.Path = value
|
|
|
+ case "valid users":
|
|
|
+ currentShare.ValidUsers = strings.Fields(value)
|
|
|
+ case "read only":
|
|
|
+ currentShare.ReadOnly = (value == "yes")
|
|
|
+ case "browseable":
|
|
|
+ currentShare.Browseable = (value == "yes")
|
|
|
+ case "guest ok":
|
|
|
+ currentShare.GuestOk = (value == "yes")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add the last share if there is one
|
|
|
+ if currentShare != nil {
|
|
|
+ shares = append(shares, *currentShare)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check for scanner errors
|
|
|
+ if err := scanner.Err(); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return shares, nil
|
|
|
+}
|
|
|
+
|
|
|
// AppendSambaShareConfig appends the Samba share configuration to smb.conf
|
|
|
-func (s *SambaConfigEditor) AppendSambaShareConfig(config string) error {
|
|
|
- file, err := os.OpenFile("/etc/samba/smb.conf", os.O_APPEND|os.O_WRONLY, 0644)
|
|
|
+func (s *ShareManager) AppendSambaShareConfig(config string) error {
|
|
|
+ file, err := os.OpenFile(s.SambaConfigPath, os.O_APPEND|os.O_WRONLY, 0644)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -36,9 +114,9 @@ func (s *SambaConfigEditor) AppendSambaShareConfig(config string) error {
|
|
|
}
|
|
|
|
|
|
// RemoveSambaShareConfig removes the Samba share configuration from smb.conf
|
|
|
-func (s *SambaConfigEditor) RemoveSambaShareConfig(shareName string) error {
|
|
|
+func (s *ShareManager) RemoveSambaShareConfig(shareName string) error {
|
|
|
// Open the smb.conf file for reading
|
|
|
- file, err := os.Open("/etc/samba/smb.conf")
|
|
|
+ file, err := os.Open(s.SambaConfigPath)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|