Browse Source

Added smb toggle

aroz 1 year ago
parent
commit
a7a1ebf2c8

+ 41 - 0
mod/fileservers/servers/samba/handlers.go

@@ -7,6 +7,47 @@ import (
 	"imuslab.com/arozos/mod/utils"
 )
 
+// Get current samba service status
+func (s *ShareManager) SmbdStates(w http.ResponseWriter, r *http.Request) {
+	set, err := utils.PostPara(r, "set")
+	if err != nil {
+		//return the current smbd states
+		smbdRunning, err := IsSmbdRunning()
+		if err != nil {
+			utils.SendErrorResponse(w, err.Error())
+			return
+		}
+
+		js, _ := json.Marshal(smbdRunning)
+		utils.SendJSONResponse(w, string(js))
+		return
+	} else if set == "enable" {
+		//Set smbd to enable
+		err = SetSmbdEnableState(true)
+		if err != nil {
+			utils.SendErrorResponse(w, err.Error())
+			return
+		}
+
+		utils.SendOK(w)
+		return
+	} else if set == "disable" {
+		//Set smbd to disable
+		err = SetSmbdEnableState(false)
+		if err != nil {
+			utils.SendErrorResponse(w, err.Error())
+			return
+		}
+
+		utils.SendOK(w)
+		return
+	}
+
+	utils.SendErrorResponse(w, "not support set state: "+set+". Only support enable /disable")
+	return
+
+}
+
 // List all the samba shares
 func (s *ShareManager) ListSambaShares(w http.ResponseWriter, r *http.Request) {
 	shares, err := s.ReadSambaShares()

+ 60 - 0
mod/fileservers/servers/samba/smbd.go

@@ -0,0 +1,60 @@
+package samba
+
+import (
+	"fmt"
+	"os/exec"
+)
+
+// IsSmbdRunning checks if smbd is running on the current Linux host
+func IsSmbdRunning() (bool, error) {
+	cmd := exec.Command("systemctl", "is-active", "--quiet", "smbd")
+	err := cmd.Run()
+	if err != nil {
+		// If the command returns a non-zero exit code, smbd is not running
+		if exitErr, ok := err.(*exec.ExitError); ok {
+			return exitErr.ExitCode() == 0, nil
+		}
+		return false, fmt.Errorf("failed to check smbd status: %v", err)
+	}
+	// If the command returns a zero exit code, smbd is running
+	return true, nil
+}
+
+// SetSmbdEnableState enables or disables smbd via systemctl
+func SetSmbdEnableState(enable bool) error {
+	var cmd *exec.Cmd
+	if enable {
+		//Enable smbd
+		cmd = exec.Command("sudo", "systemctl", "enable", "smbd")
+
+		err := cmd.Run()
+		if err != nil {
+			return fmt.Errorf("failed to start smbd: %v", err)
+		}
+
+		//Start smbd now
+		cmd = exec.Command("sudo", "systemctl", "start", "smbd")
+
+		err = cmd.Run()
+		if err != nil {
+			return fmt.Errorf("failed to set smbd enable state: %v", err)
+		}
+	} else {
+		//Stop smbd
+		cmd = exec.Command("sudo", "systemctl", "stop", "smbd")
+		err := cmd.Run()
+		if err != nil {
+			return fmt.Errorf("failed to stop smbd: %v", err)
+		}
+		cmd = exec.Command("sudo", "systemctl", "disable", "smbd")
+
+		//Disable service
+		err = cmd.Run()
+		if err != nil {
+			return fmt.Errorf("failed to set smbd enable state: %v", err)
+		}
+
+	}
+
+	return nil
+}

+ 1 - 0
network.go

@@ -372,6 +372,7 @@ func FileServerInit() {
 	adminRouter.HandleFunc("/system/storage/ftp/passivemode", FTPManager.HandleFTPPassiveModeSettings)
 
 	//Samba Shares
+	adminRouter.HandleFunc("/system/storage/samba/status", SambaShareManager.SmbdStates)
 	adminRouter.HandleFunc("/system/storage/samba/list", SambaShareManager.ListSambaShares)
 	adminRouter.HandleFunc("/system/storage/samba/add", SambaShareManager.AddSambaShare)
 	adminRouter.HandleFunc("/system/storage/samba/remove", SambaShareManager.DelSambaShare)

+ 4 - 1
web/SystemAO/disk/raid/index.html

@@ -852,7 +852,10 @@
                         //Reload all RAID volumes
                         raidManager = {};
                         initRAIDVolList();
-                        msgbox("Force RAID Assemble Completed");
+                        if (data != false){
+                            msgbox("Force RAID Assemble Completed");
+                        }
+                        
                     }, 300);
                 }
                 

+ 48 - 1
web/SystemAO/disk/samba.html

@@ -1,3 +1,10 @@
+<h3>Enable Samba Service</h3>
+<p>Change current systemctl state of smbd (start / stop).</p>
+<div class="ui toggle checkbox">
+    <input type="checkbox" id="enablesmbd">
+    <label>Enable smbd (Samba Sharing Service)</label>
+</div>
+
 <h3>Samba Share Lists</h3>
 <p>A list of SMB shares currently written into smb.conf</p>
 <div id="sharelist">
@@ -8,7 +15,7 @@
 <p>Create a new SMB share folder from local disk</p>
 <script>
 
-     function initShareListTable(){
+    function initShareListTable(){
         $.get("../../system/storage/samba/list", function(data){
             if (data.error){
                 msgbox(data.error, false);
@@ -18,6 +25,46 @@
         });
      }
      initShareListTable();
+
+     function initSmbdState(){
+        $.get("../../system/storage/samba/status", function(data){
+            if (data.error != undefined){
+                //Error when loading smbd status
+                msgbox(data.error, false);
+                $("#enablesmbd").parent().addClass('disabled');
+            }else{
+                if (data == true){
+                    $("#enablesmbd").parent().checkbox("set checked");
+                }else{
+                    $("#enablesmbd").parent().checkbox("set unchecked");
+                }
+
+                //Bind checkbox event
+                $("#enablesmbd").on("change", function(data){
+                    let isChecked = $("#enablesmbd")[0].checked;
+                    $.ajax({
+                        url: "../../system/storage/samba/status",
+                        data: {
+                            set: isChecked?"enable":"disable"
+                        },
+                        method: "POST",
+                        success: function(data){
+                            if (data.error != undefined){
+                                msgbox(data.error, false);
+                                $("#enablesmbd").off("change");
+                                initSmbdState();
+                            }else{
+                                msgbox(`SMB Sharing ${isChecked?"enabled":"disabled"}`);
+                            }
+                        }
+                    })
+                })
+            }
+        })
+     }
+     initSmbdState();
+
+
      function generateTable(data) {
             // Start the table
             let table = `