[Icecast] <on-connect> / <on-disconnect> not working

Jack Elliott that.jack.elliott at gmail.com
Thu Jul 14 20:17:04 UTC 2022


Thank you, Petr!

Yes, error.log is not very helpful. With loglevel set to 4 (debug) I 
find that the server does claim to run the commands, but there is 
nothing to indicate what the problem might be:

[2022-07-14  13:05:13] DBUG source/source_run_script Starting command /home/my_username/bin/email_onconnect.sh
[2022-07-14  13:05:13] DBUG source/source_update_settings disconnect script "/home/my_username/bin/email_ondisconnect.sh"

This with Icecast 2.4.0 -- I am waiting for some help with a question I 
have posted in this mailing list to confirm I have the right repo 
selected before I attempt upgrading Icecast. It is a running, 
in-operation service for our radio station and I don't want to break 
anything.

-- 
Jack Elliott
Director of Classical Music Programming
KPOV 88.9 FM
High Desert Community Radio
Bend, OR

On 7/14/22 09:18, Petr Pisar wrote:
> V Thu, Jul 14, 2022 at 08:16:03AM -0700, Jack Elliott napsal(a):
>> Hi,
>>
>> Icecast server 2.4.0 running on Linux.
>>
> Could you try upgrading Icecast? The latest version is 2.4.4 and there were
> some fixes in between.
>
>> I have a couple of shell scripts that send emails on connect and on
>> disconnect. From the command line they work, but when called from
>> icecast they do not.
> [...]
>> I'd like to get these functions working . . . ideas?
>>
> A problem is that Icecast does not log a failed execution of the scripts.
> Neither an exit code of the finished script.
>
> It can only log some fork errors and file permissions before executing them.
> And an attempt to execute a script is logged only if Icecast log level is set
> to debug:
>
> static void _run_script (event_exec_t *self, event_t *event) {
>      pid_t pid, external_pid;
>
>      /* do a fork twice so that the command has init as parent */
>      external_pid = fork();
>      switch (external_pid)
>      {
>          case 0:
>              switch (pid = fork ())
>              {
>                  case -1:
>                      ICECAST_LOG_ERROR("Unable to fork %s (%s)", self->executable, strerror (errno));
>                      break;
>                  case 0:  /* child */
>                      if (access(self->executable, R_OK|X_OK) != 0) {
>                          ICECAST_LOG_ERROR("Unable to run command %s (%s)", self->executable, strerror(errno));
>                          exit(1);
>                      }
>                      ICECAST_LOG_DEBUG("Starting command %s", self->executable);
>                      __setup_empty_script_environment(self, event);
>                      execv(self->executable, __setup_argv(self, event));
>                      exit(1);
>                  default: /* parent */
>                      break;
>              }
>              exit (0);
>          case -1:
>              ICECAST_LOG_ERROR("Unable to fork %s", strerror (errno));
>              break;
>          default: /* parent */
>              waitpid (external_pid, NULL, 0);
>              break;
>      }
> }
>
> You can use "strace" tool to check whether the scripts are actually executed.
> Something like "strace -fq -e execve -p PID_OF_THE_RUNNING_SERVER".
>
> The code is pretty terrible. access() does not answer whether a process can
> exucute a program. Also execv() can fail for various reasons: Different
> effective UID/GID, missing capabilities, violation of SELinux policy. And then
> there can be problems with the executed program itself, like a wrong magic
> number, unsupported architecture, a missing dynamic library, bad script
> interpreter etc.
>
> I recommend Icecast developers to remove the access() call and instead log
> errno after a failed execve. Also logging a status code of the terminated
> executable returned by waitpid() would be helpful.
>
> -- Petr
>
> _______________________________________________
> Icecast mailing list
> Icecast at xiph.org
> http://lists.xiph.org/mailman/listinfo/icecast
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.xiph.org/pipermail/icecast/attachments/20220714/d6f6883c/attachment.htm>


More information about the Icecast mailing list