135 lines
4.5 KiB
Diff
135 lines
4.5 KiB
Diff
--- ./cobbler/cobblerd.py 2010-07-28 17:48:48.000000000 +0200
|
|
+++ ./cobbler/cobblerd.py 2012-01-26 11:26:05.000000000 +0100
|
|
@@ -25,6 +25,7 @@ import socket
|
|
import time
|
|
import os
|
|
import SimpleXMLRPCServer
|
|
+import SocketServer
|
|
import glob
|
|
from utils import _
|
|
import xmlrpclib
|
|
@@ -104,7 +105,27 @@ def log(logger,msg):
|
|
def do_xmlrpc_rw(bootapi,settings,port):
|
|
|
|
xinterface = remote.ProxiedXMLRPCInterface(bootapi,remote.CobblerXMLRPCInterface)
|
|
- server = remote.CobblerXMLRPCServer(('127.0.0.1', port))
|
|
+
|
|
+ bound = False
|
|
+ for res in socket.getaddrinfo('localhost', port, socket.AF_UNSPEC,
|
|
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
|
|
+ (af, sa) = (res[0], res[4])
|
|
+ try:
|
|
+ SocketServer.TCPServer.address_family = af
|
|
+ server = remote.CobblerXMLRPCServer((sa[0], sa[1]))
|
|
+ except Exception, msg:
|
|
+ if af == socket.AF_INET:
|
|
+ message = "Could not bind to %s:%s: %s" % (sa[0], sa[1], msg)
|
|
+ elif af == socket.AF_INET6:
|
|
+ message = "Could not bind to [%s]:%s: %s" % (sa[0], sa[1], msg)
|
|
+ xinterface.logger.debug(message)
|
|
+ else:
|
|
+ bound = True
|
|
+ break
|
|
+
|
|
+ if not bound:
|
|
+ raise socket.error("Could not bind to localhost")
|
|
+
|
|
server.logRequests = 0 # don't print stuff
|
|
xinterface.logger.debug("XMLRPC running on %s" % port)
|
|
server.register_instance(xinterface)
|
|
--- ./cobbler/modules/authn_spacewalk.py 2010-07-28 17:48:48.000000000 +0200
|
|
+++ ./cobbler/modules/authn_spacewalk.py 2012-01-26 11:26:05.000000000 +0100
|
|
@@ -77,7 +77,7 @@ def authenticate(api_handle,username,pas
|
|
if server == "xmlrpc.rhn.redhat.com":
|
|
return False # emergency fail, don't bother RHN!
|
|
|
|
- spacewalk_url = "https://%s/rpc/api" % server
|
|
+ spacewalk_url = "http://%s/rpc/api" % server
|
|
|
|
client = xmlrpclib.Server(spacewalk_url, verbose=0)
|
|
|
|
--- ./cobbler/utils.py 2012-01-26 11:26:05.000000000 +0100
|
|
+++ ./cobbler/utils.py 2012-01-26 11:28:22.000000000 +0100
|
|
@@ -1862,6 +1862,30 @@ def get_shared_secret():
|
|
return -1
|
|
return str(data).strip()
|
|
|
|
+def get_localhost_addr(port):
|
|
+ (sock, sa, af) = (None, None, None)
|
|
+ for res in socket.getaddrinfo('localhost', port, socket.AF_UNSPEC, socket.SOCK_STREAM):
|
|
+ af, socktype, proto, canonname, sa = res
|
|
+ try:
|
|
+ sock = socket.socket(af, socktype, proto)
|
|
+ except socket.error:
|
|
+ sock = None
|
|
+ continue
|
|
+
|
|
+ try:
|
|
+ sock.connect((sa[0], sa[1]))
|
|
+ except socket.error:
|
|
+ sock.close()
|
|
+ sock = None
|
|
+ continue
|
|
+ break
|
|
+
|
|
+ if sock is None:
|
|
+ return (None, None)
|
|
+
|
|
+ sock.close()
|
|
+ return (sa[0], af)
|
|
+
|
|
def local_get_cobbler_api_url():
|
|
# Load server and http port
|
|
try:
|
|
@@ -1882,7 +1906,18 @@ def local_get_cobbler_xmlrpc_url():
|
|
except:
|
|
traceback.print_exc()
|
|
raise CX("/etc/cobbler/settings is not a valid YAML file")
|
|
- return "http://%s:%s" % ("127.0.0.1",data.get("xmlrpc_port","25151"))
|
|
+ port = data.get("xmlrpc_port","25151")
|
|
+ addr = get_localhost_addr(port)
|
|
+
|
|
+ if addr[1] == socket.AF_INET:
|
|
+ return "http://%s:%s" % (addr[0], port)
|
|
+ if addr[1] == socket.AF_INET6:
|
|
+ return "http://[%s]:%s" % (addr[0], port)
|
|
+
|
|
+ if os.path.exists('/proc/net/if_inet6'):
|
|
+ return "http://[::1]:%s" % port
|
|
+ else:
|
|
+ return "http://127.0.0.1:%s" % port
|
|
|
|
def strip_none(data, omit_none=False):
|
|
"""
|
|
--- ./scripts/services.py 2010-07-28 17:48:48.000000000 +0200
|
|
+++ ./scripts/services.py 2012-01-26 11:26:05.000000000 +0100
|
|
@@ -78,7 +78,7 @@ def handler(req):
|
|
# instantiate a CobblerWeb object
|
|
cw = CobblerSvc(
|
|
apache = apache,
|
|
- server = "http://127.0.0.1:%s" % remote_port
|
|
+ server = utils.local_get_cobbler_xmlrpc_url()
|
|
)
|
|
|
|
# check for a valid path/mode
|
|
--- ./scripts/services.wsgi 2010-10-07 20:12:03.000000000 +0200
|
|
+++ ./scripts/services.wsgi 2012-01-26 11:26:05.000000000 +0100
|
|
@@ -23,6 +23,7 @@ import yaml
|
|
import os
|
|
|
|
from cobbler.services import CobblerSvc
|
|
+import cobbler.utils as utils
|
|
|
|
def application(environ, start_response):
|
|
|
|
@@ -64,7 +65,7 @@ def application(environ, start_response)
|
|
remote_port = ydata.get("xmlrpc_port",25151)
|
|
|
|
# instantiate a CobblerWeb object
|
|
- cw = CobblerSvc(server = "http://127.0.0.1:%s" % remote_port)
|
|
+ cw = CobblerSvc(server = utils.local_get_cobbler_xmlrpc_url())
|
|
|
|
# check for a valid path/mode
|
|
# handle invalid paths gracefully
|
|
|