示例#1
0
        static int Main(string[] args)
        {
            var configFile = "Config.xml";

            // Arguments
            if (args.Any())
            {
                configFile = args[0];
            }

            // Initialize logging
            BasicConfigurator.Configure(new ConsoleAppender()
            {
                Layout    = new log4net.Layout.PatternLayout(@"[%logger] %level: %message%newline"),
                Threshold = Level.Debug
            });
            _log = LogManager.GetLogger("bridgeapp");

            // Configuration setup
            XDocument xdoc;

            if (!File.Exists(configFile))
            {
                _log.Error("Invalid configuration file given (file not found).");
                return(-2);
            }
            try
            {
                xdoc = XDocument.Load(configFile);
                if (xdoc.Root == null)
                {
                    _log.Error("Invalid configuration file given (could not parse file, no XML root found).");
                    return(-2);
                }
            }
            catch
            {
                _log.Error("Invalid configuration file given (could not parse file, any typos in the XML code?).");
                return(-2);
            }

            // Get ip address to work with
            var ip         = IPAddress.Any;
            var ipElements = xdoc.Root.Elements("ip").ToArray();

            if (ipElements.Any())
            {
                if (!IPAddress.TryParse(ipElements.First().Value, out ip))
                {
                    _log.Error("Invalid IP address in configuration, please check the configuration file.");
                    return(-1);
                }
                if (ipElements.Count() > 1)
                {
                    _log.Warn("Multiple ip addresses defined, using first one. Please check the configuration file as soon as possible and fix this.");
                }
            }

            // Get port to work with
            var port         = (ushort)8000;
            var portElements = xdoc.Root.Elements("port").ToArray();

            if (portElements.Any())
            {
                if (!ushort.TryParse(portElements.First().Value, out port))
                {
                    _log.Error("Invalid port in configuration, please check the configuration file.");
                    return(-1);
                }
                if (portElements.Count() > 1)
                {
                    _log.Warn("Multiple ports defined, using first one. Please check the configuration file as soon as possible and fix this.");
                }
            }

            var sb = new ShoutcastBridgeServer(ip, port);

            // Mountpoint configuration
            var mpElements = xdoc.Root.Descendants("stream").ToArray();

            if (!mpElements.Any())
            {
                _log.Error("No mountpoints/streams configured. Please define at least one in the configuration file.");
                return(-1);
            }
            foreach (var mpElement in mpElements)
            {
                var    pwAttr = mpElement.Attribute("password");
                string pw;
                if (pwAttr == null || string.IsNullOrEmpty(pw = pwAttr.Value))
                {
                    _log.Error("Mountpoint without password defined. All mountpoints need a unique password.");
                    return(-1);
                }
                if (mpElements.Count(m => m.Attribute("password").Value == pwAttr.Value) > 1)
                {
                    _log.ErrorFormat("Too many mountpoints with same password ({0}) defined. All mountpoints need a unique password.", pwAttr.Value);
                    return(-1);
                }

                ushort parsedPort;
                var    mpPortElements = mpElement.Elements("port").ToArray();
                if (!mpPortElements.Any())
                {
                    //mpElement.Add(new XElement("port", 8000));
                    //mpPortElements = mpElement.Elements("port").ToArray();
                    parsedPort = 8000;
                }
                else if (mpPortElements.Count() > 1)
                {
                    _log.WarnFormat("Too many icecast ports defined for mountpoint pw={0}, please only define one.", pw);
                    return(-1);
                }
                else if (!ushort.TryParse(mpPortElements.Single().Value, out parsedPort))
                {
                    _log.ErrorFormat("Invalid icecast port defined for mountpoint pw={0}, please define a proper port number.", pw);
                    return(-1);
                }

                var mpHostElements = mpElement.Elements("host").ToArray();
                if (!mpHostElements.Any())
                {
                    mpElement.Add(new XElement("host", IPAddress.Loopback.ToString()));
                    mpHostElements = mpElement.Elements("host").ToArray();
                }
                else if (mpHostElements.Count() > 1)
                {
                    _log.WarnFormat("Too many icecast host names defined for mountpoint pw={0}, please only define one.", pw);
                    return(-1);
                }

                var mpMountpointElements = mpElement.Elements("mountpoint").ToArray();
                if (!mpMountpointElements.Any())
                {
                    mpElement.Add(new XElement("mountpoint", "/stream"));
                    mpMountpointElements = mpElement.Elements("mountpoint").ToArray(); // yes, this is rude.
                }
                else if (mpMountpointElements.Count() > 1)
                {
                    _log.WarnFormat(
                        "Too many icecast mountpoint names defined for mountpoint pw={0}, please only define one.", pw);
                    return(-1);
                }

                var mpPasswordElements = mpElement.Elements("password").ToArray();
                if (!mpPasswordElements.Any())
                {
                    mpElement.Add(new XElement("password", "hackme"));
                    mpPasswordElements = mpElement.Elements("password").ToArray();
                }
                else if (mpPasswordElements.Count() > 1)
                {
                    _log.WarnFormat("Too many icecast passwords defined for mountpoint pw={0}, please only define one.", pw);
                    return(-1);
                }

                var mpUsernameElements = mpElement.Elements("username").ToArray();
                if (!mpUsernameElements.Any())
                {
                    mpElement.Add(new XElement("username", "source"));
                    mpUsernameElements = mpElement.Elements("username").ToArray();
                }
                else if (mpUsernameElements.Count() > 1)
                {
                    _log.WarnFormat("Too many icecast usernames defined for mountpoint pw={0}, please only define one.", pw);
                    return(-1);
                }

                sb.AddMountpoint(pw, new ShoutcastBridgeMountpoint()
                {
                    IcecastHost       = mpHostElements.Single().Value,
                    IcecastPort       = parsedPort,
                    IcecastMountpoint = mpMountpointElements.Single().Value,
                    IcecastUsername   = mpUsernameElements.Single().Value,
                    IcecastPassword   = mpPasswordElements.Single().Value
                });
            }

            _log.DebugFormat("Starting up Shoutcast bridge now.");
            sb.Start();

            return(0); // We'll never get here anyways... except on errors `-`
        }
示例#2
0
 public AdminHandler(ShoutcastBridgeServer bridgeServer)
 {
     _shoutcastBridge = bridgeServer;
 }