On Dec 4, 2013, at 7:31 PM, Charles Lepple wrote:

> On Dec 4, 2013, at 3:35 PM, Roger Price wrote:
> 
>> Looking at the source code, it seems that much of what is needed is already 
>> in place, but behind "if" conditions that ensure that little or nothing gets 
>> through.  Long ago I wrote software, including a compiler, but my C 
>> programming is limited to a class exercise many many years ago, and its 
>> based on this "experience" that I'm guessing that in upssched.c function 
>> exec_cmd the code
>> 
>> snprintf(buf, sizeof(buf), "%s %s", cmdscript, cmd);
>> err = system(buf);
>> if (WIFEXITED(err)) {
>>      if (WEXITSTATUS(err)) {
>>              upslogx(LOG_INFO, "exec_cmd(%s) returned %d", buf, 
>> WEXITSTATUS(err));
>>      }
>> 
>> attempts to send a command to the operating system, possibly to execute a 
>> Bash script.  If system(buf) fails, the tests block the error message. 
>> Surely the error message is essential. An unattended box is now in an 
>> emergency situation.  After the inevitable IT failure the system should be 
>> auditable to discover what went wrong and what should be done to prevent it 
>> happening in the future.  Such an audit expects to find "exec_cmd(%s) 
>> returned %d" in the log.
> 
> Are you looking for:
> 
> * more diagnostics depending on the value of err,
> * logging of all return codes, even success
> 
> or both?

Roger,

Did you mean "If system(buf) succeeds, the tests block the success message"? 
The line just after what you quoted handles the case where WIFEXITED(err) == 0:

https://github.com/networkupstools/nut/blob/6a4729cfdf9df01e0e3a253678c43c2594dd51b0/clients/upssched.c#L86

Code like the following should log something in all cases:

err = system(buf);
if (WIFEXITED(err)) {
        if (WEXITSTATUS(err)) {
                upslogx(LOG_INFO, "exec_cmd(%s) returned %d", buf, 
WEXITSTATUS(err));
        } else {
                upslogx(LOG_DEBUG, "exec_cmd(%s) succeeded"); /* NEW */
        }
} else {
        if (WIFSIGNALED(err)) {
                upslogx(LOG_WARNING, "exec_cmd(%s) terminated with signal %d", 
buf, WTERMSIG(err));
        } else {
                upslogx(LOG_ERR, "Execute command failure: %s", buf);
        }
}

-- 
Charles Lepple
clepple@gmail




_______________________________________________
Nut-upsuser mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/nut-upsuser

Reply via email to