From c2a99c9ed9a3546de0ce598d5988b5b15dc8dc37 Mon Sep 17 00:00:00 2001 From: Jondy Zhao <jondy.zhao@gmail.com> Date: Wed, 27 Mar 2013 23:22:00 +0800 Subject: [PATCH] Add support for cygwin. --- slapos/format.py | 21 +++++++++++++++++---- slapos/grid/slapgrid.py | 2 +- slapos/grid/utils.py | 2 ++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/slapos/format.py b/slapos/format.py index 879052d23..befabb12c 100644 --- a/slapos/format.py +++ b/slapos/format.py @@ -523,10 +523,11 @@ class User(object): # XXX: This method shall be no-op in case if all is correctly setup # This method shall check if all is correctly done # This method shall not reset groups, just add them + grpname = 'grp_' + self.name if sys.platform == 'cygwin' else self.name try: - grp.getgrnam(self.name) + grp.getgrnam(grpname) except KeyError: - callAndRead(['groupadd', self.name]) + callAndRead(['groupadd', grpname]) user_parameter_list = ['-d', self.path, '-g', self.name, '-s', '/bin/false'] @@ -697,6 +698,9 @@ class Interface(object): except KeyError: raise ValueError("%s must have at least one IPv6 address assigned" % \ interface_name) + if sys.platform == 'cygwin': + for q in address_list: + q.setdefault('netmask', 'FFFF:FFFF:FFFF:FFFF::') # XXX: Missing implementation of Unique Local IPv6 Unicast Addresses as # defined in http://www.rfc-editor.org/rfc/rfc4193.txt # XXX: XXX: XXX: IT IS DISALLOWED TO IMPLEMENT link-local addresses as @@ -811,7 +815,8 @@ class Interface(object): def addIPv4LocalAddress(self, addr=None): """Adds local IPv4 address in ipv4_local_network""" - netmask = '255.255.255.255' + netmask = '255.255.255.254' if sys.platform == 'cygwin' \ + else '255.255.255.255' local_address_list = self.getIPv4LocalAddressList() if addr is None: return self._generateRandomIPv4Address(netmask) @@ -1140,7 +1145,7 @@ class Config(object): except ValueError: pass except OSError: - missing_binary_list.append(b) + missing_binary_list.append(b[0]) if missing_binary_list: raise UsageError('Some required binaries are missing or not ' 'functional: %s' % (','.join(missing_binary_list), )) @@ -1326,6 +1331,14 @@ def tracing_monkeypatch(config): def main(*args): "Run default configuration." + if sys.platform in ('cygwin',): + callAndRead = lambda args, flag=True : args.insert(0, '/bin/sh') \ + or real_callAndRead(args, flag) + f = netifaces.ifaddresses + netifaces.ifaddresses = lambda s,f=f:reduce( \ + lambda x,y:[x.__setitem__(k,v + x.get(k,[])) for k,v in y.iteritems()] and x, \ + filter(None, [f(i) for i in netifaces.interfaces() if i.startswith(s)]),{}) + # Parse arguments usage = "usage: %s [options] CONFIGURATION_FILE" % sys.argv[0] options, configuration_file_path = Parser(usage=usage).check_args(args) diff --git a/slapos/grid/slapgrid.py b/slapos/grid/slapgrid.py index 8d5980cca..861cc2260 100644 --- a/slapos/grid/slapgrid.py +++ b/slapos/grid/slapgrid.py @@ -679,7 +679,7 @@ class Slapgrid(object): process_handler = subprocess.Popen(command, preexec_fn=lambda: dropPrivileges(uid, gid), cwd=cwd, - env={}, **kw) + env=None if sys.platform == 'cygwin' else {}, **kw) process_handler.stdin.flush() process_handler.stdin.close() process_handler.stdin = None diff --git a/slapos/grid/utils.py b/slapos/grid/utils.py index b88dbe704..604103d45 100644 --- a/slapos/grid/utils.py +++ b/slapos/grid/utils.py @@ -95,6 +95,8 @@ class SlapPopen(subprocess.Popen): """ def __init__(self, *args, **kwargs): kwargs.update(stdin=subprocess.PIPE) + if sys.platform == 'cygwin' and kwargs.get('env') == {}: + kwargs['env'] = None subprocess.Popen.__init__(self, *args, **kwargs) self.stdin.flush() self.stdin.close() -- 2.30.9