mirror of
https://github.com/ClusterCockpit/cc-metric-collector.git
synced 2025-10-21 13:25:07 +02:00
enable sudo support
This commit is contained in:
committed by
Thomas Gruber
parent
3e19c47ae4
commit
d6499935a4
@@ -46,10 +46,12 @@ type GpfsCollector struct {
|
|||||||
config struct {
|
config struct {
|
||||||
Mmpmon string `json:"mmpmon_path,omitempty"`
|
Mmpmon string `json:"mmpmon_path,omitempty"`
|
||||||
ExcludeFilesystem []string `json:"exclude_filesystem,omitempty"`
|
ExcludeFilesystem []string `json:"exclude_filesystem,omitempty"`
|
||||||
|
Sudo bool `json:"use_sudo,omitempty"`
|
||||||
SendBandwidths bool `json:"send_bandwidths"`
|
SendBandwidths bool `json:"send_bandwidths"`
|
||||||
SendTotalValues bool `json:"send_total_values"`
|
SendTotalValues bool `json:"send_total_values"`
|
||||||
SendDerivedValues bool `json:"send_derived_values"`
|
SendDerivedValues bool `json:"send_derived_values"`
|
||||||
}
|
}
|
||||||
|
sudoCmd string
|
||||||
skipFS map[string]struct{}
|
skipFS map[string]struct{}
|
||||||
lastTimestamp time.Time // Store time stamp of last tick to derive bandwidths
|
lastTimestamp time.Time // Store time stamp of last tick to derive bandwidths
|
||||||
lastState map[string]GpfsCollectorLastState
|
lastState map[string]GpfsCollectorLastState
|
||||||
@@ -92,18 +94,30 @@ func (m *GpfsCollector) Init(config json.RawMessage) error {
|
|||||||
m.lastState = make(map[string]GpfsCollectorLastState)
|
m.lastState = make(map[string]GpfsCollectorLastState)
|
||||||
|
|
||||||
// GPFS / IBM Spectrum Scale file system statistics can only be queried by user root
|
// GPFS / IBM Spectrum Scale file system statistics can only be queried by user root
|
||||||
user, err := user.Current()
|
if !m.config.Sudo {
|
||||||
if err != nil {
|
user, err := user.Current()
|
||||||
return fmt.Errorf("failed to get current user: %v", err)
|
if err != nil {
|
||||||
}
|
cclog.ComponentError(m.name, "Failed to get current user:", err.Error())
|
||||||
if user.Uid != "0" {
|
return err
|
||||||
return fmt.Errorf("GPFS file system statistics can only be queried by user root")
|
}
|
||||||
|
if user.Uid != "0" {
|
||||||
|
cclog.ComponentError(m.name, "GPFS file system statistics can only be queried by user root")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p, err := exec.LookPath("sudo")
|
||||||
|
if err != nil {
|
||||||
|
cclog.ComponentError(m.name, "Cannot find 'sudo'")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m.sudoCmd = p
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if mmpmon is in executable search path
|
// Check if mmpmon is in executable search path
|
||||||
p, err := exec.LookPath(m.config.Mmpmon)
|
p, err := exec.LookPath(m.config.Mmpmon)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to find mmpmon binary '%s': %v", m.config.Mmpmon, err)
|
cclog.ComponentError(m.name, "failed to find mmpmon binary '%s': %v", m.config.Mmpmon, err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
m.config.Mmpmon = p
|
m.config.Mmpmon = p
|
||||||
|
|
||||||
@@ -128,7 +142,13 @@ func (m *GpfsCollector) Read(interval time.Duration, output chan lp.CCMessage) {
|
|||||||
// -p: generate output that can be parsed
|
// -p: generate output that can be parsed
|
||||||
// -s: suppress the prompt on input
|
// -s: suppress the prompt on input
|
||||||
// fs_io_s: Displays I/O statistics per mounted file system
|
// fs_io_s: Displays I/O statistics per mounted file system
|
||||||
cmd := exec.Command(m.config.Mmpmon, "-p", "-s")
|
var cmd *exec.Cmd
|
||||||
|
if m.config.Sudo {
|
||||||
|
cmd = exec.Command(m.sudoCmd, m.config.Mmpmon, "-p", "-s")
|
||||||
|
} else {
|
||||||
|
cmd = exec.Command(m.config.Mmpmon, "-p", "-s")
|
||||||
|
}
|
||||||
|
|
||||||
cmd.Stdin = strings.NewReader("once fs_io_s\n")
|
cmd.Stdin = strings.NewReader("once fs_io_s\n")
|
||||||
cmdStdout := new(bytes.Buffer)
|
cmdStdout := new(bytes.Buffer)
|
||||||
cmdStderr := new(bytes.Buffer)
|
cmdStderr := new(bytes.Buffer)
|
||||||
|
Reference in New Issue
Block a user