129 lines
3.7 KiB
Python
129 lines
3.7 KiB
Python
import getopt
|
|
import grp
|
|
import os
|
|
import pwd
|
|
import subprocess
|
|
import sys
|
|
|
|
"""
|
|
we need to run the program as non-root because Liquidsoap refuses to run as root.
|
|
It is possible to run change the effective user id (seteuid) before calling Liquidsoap
|
|
but this introduces other problems (fake root user is not part of audio group after calling seteuid)
|
|
"""
|
|
if os.geteuid() == 0:
|
|
print "Please run this program as non-root"
|
|
sys.exit(1)
|
|
|
|
|
|
def printUsage():
|
|
print "airtime-test-stream [-v] [-o icecast | shoutcast ] [-H hostname] [-P port] [-u username] [-p password] [-m mount]"
|
|
print " Where: "
|
|
print " -v verbose mode"
|
|
print " -o stream server type (default: icecast)"
|
|
print " -H hostname (default: localhost) "
|
|
print " -P port (default: 8000) "
|
|
print " -u user (default: source) "
|
|
print " -p password (default: hackme) "
|
|
print " -m mount (default: test) "
|
|
print " -h show help menu"
|
|
|
|
|
|
def find_liquidsoap_binary():
|
|
"""
|
|
With libretime 3.0 we are no longer depending upon the airtime-liquidsoap binary
|
|
but use a generic install of liquidsoap. This takes care of checking if it is on the
|
|
path and will lead to an error otherwise.
|
|
"""
|
|
|
|
rv = subprocess.call("which liquidsoap > /dev/null", shell=True)
|
|
if rv == 0:
|
|
return "liquidsoap"
|
|
|
|
return None
|
|
|
|
|
|
optlist, args = getopt.getopt(sys.argv[1:], "hvo:H:P:u:p:m:")
|
|
stream_types = set(["shoutcast", "icecast"])
|
|
|
|
verbose = False
|
|
stream_type = "icecast"
|
|
|
|
host = "localhost"
|
|
port = 8000
|
|
user = "source"
|
|
password = "hackme"
|
|
mount = "test"
|
|
|
|
for o, a in optlist:
|
|
if "-v" == o:
|
|
verbose = True
|
|
if "-o" == o:
|
|
if a.lower() in stream_types:
|
|
stream_type = a.lower()
|
|
else:
|
|
print "Unknown stream type\n"
|
|
printUsage()
|
|
sys.exit(1)
|
|
if "-h" == o:
|
|
printUsage()
|
|
sys.exit(0)
|
|
if "-H" == o:
|
|
host = a
|
|
if "-P" == o:
|
|
port = a
|
|
if "-u" == o:
|
|
user = a
|
|
if "-p" == o:
|
|
password = a
|
|
if "-m" == o:
|
|
mount = a
|
|
|
|
try:
|
|
|
|
print "Protocol: %s " % stream_type
|
|
print "Host: %s" % host
|
|
print "Port: %s" % port
|
|
print "User: %s" % user
|
|
print "Password: %s" % password
|
|
if stream_type == "icecast":
|
|
print "Mount: %s\n" % mount
|
|
|
|
url = "http://%s:%s/%s" % (host, port, mount)
|
|
print "Outputting to %s streaming server. You should be able to hear a monotonous tone on '%s'. Press ctrl-c to quit." % (
|
|
stream_type,
|
|
url,
|
|
)
|
|
|
|
liquidsoap_exe = find_liquidsoap_binary()
|
|
if liquidsoap_exe is None:
|
|
raise Exception("Liquidsoap not found!")
|
|
|
|
if stream_type == "icecast":
|
|
command = (
|
|
'%s \'output.icecast(%%vorbis, host = "%s", port = %s, user= "%s", password = "%s", mount="%s", sine())\''
|
|
% (liquidsoap_exe, host, port, user, password, mount)
|
|
)
|
|
else:
|
|
command = (
|
|
'%s \'output.shoutcast(%%mp3, host="%s", port = %s, user= "%s", password = "%s", sine())\''
|
|
% (liquidsoap_exe, host, port, user, password)
|
|
)
|
|
|
|
if not verbose:
|
|
command += ' 2>/dev/null | grep "failed"'
|
|
else:
|
|
print command
|
|
|
|
# print command
|
|
rv = subprocess.call(command, shell=True)
|
|
|
|
# if we reach this point, it means that our subprocess exited without the user
|
|
# doing a keyboard interrupt. This means there was a problem outputting to the
|
|
# stream server. Print appropriate message.
|
|
print "There was an error with your stream configuration. Please review your configuration " + "and run this program again. Use the -h option for help"
|
|
|
|
except KeyboardInterrupt, ki:
|
|
print "\nExiting"
|
|
except Exception, e:
|
|
raise
|