1#!/usr/bin/python
2#
3# Samba Testing Framework for Unit-testing
4#
5
6import os, string, re
7import osver
8
9def get_server_list_from_string(s):
10
11    server_list = []
12
13    # Format is a list of server:domain\username%password separated
14    # by commas.
15
16    for entry in string.split(s, ","):
17
18        # Parse entry
19
20        m = re.match("(.*):(.*)(\\\\|/)(.*)%(.*)", entry)
21        if not m:
22            raise "badly formed server list entry '%s'" % entry
23
24        server = m.group(1)
25        domain = m.group(2)
26        username = m.group(4)
27        password = m.group(5)
28
29        # Categorise servers
30
31        server_list.append({"platform": osver.os_version(server),
32                            "hostname": server,
33                            "administrator": {"username": username,
34                                              "domain": domain,
35                                              "password" : password}})
36
37    return server_list
38
39def get_server_list():
40    """Iterate through all sources of server info and append them all
41    in one big list."""
42
43    server_list = []
44
45    # The $STF_SERVERS environment variable
46
47    if os.environ.has_key("STF_SERVERS"):
48        server_list = server_list + \
49                      get_server_list_from_string(os.environ["STF_SERVERS"])
50
51    return server_list
52
53def get_server(platform = None):
54    """Return configuration information for a server.  The platform
55    argument can be a string either 'nt4' or 'nt5' for Windows NT or
56    Windows 2000 servers, or just 'nt' for Windows NT and higher."""
57
58    server_list = get_server_list()
59
60    for server in server_list:
61        if platform:
62            p = server["platform"]
63            if platform == "nt":
64                if (p == osver.PLATFORM_NT4 or p == osver.PLATFORM_NT5):
65                    return server
66            if platform == "nt4" and p == osver.PLATFORM_NT4:
67                return server
68            if platform == "nt5" and p == osver.PLATFORM_NT5:
69                return server
70        else:
71            # No filter defined, return first in list
72            return server
73
74    return None
75
76def dict_check(sample_dict, real_dict):
77    """Check that real_dict contains all the keys present in sample_dict
78    and no extras.  Also check that common keys are of them same type."""
79    tmp = real_dict.copy()
80    for key in sample_dict.keys():
81        # Check existing key and type
82        if not real_dict.has_key(key):
83            raise ValueError, "dict does not contain key '%s'" % key
84        if type(sample_dict[key]) != type(real_dict[key]):
85            raise ValueError, "dict has differing types (%s vs %s) for key " \
86                  "'%s'" % (type(sample_dict[key]), type(real_dict[key]), key)
87        # Check dictionaries recursively
88        if type(sample_dict[key]) == dict:
89            dict_check(sample_dict[key], real_dict[key])
90        # Delete visited keys from copy
91        del(tmp[key])
92    # Any keys leftover are present in the real dict but not the sample
93    if len(tmp) == 0:
94        return
95    result = "dict has extra keys: "
96    for key in tmp.keys():
97        result = result + key + " "
98    raise ValueError, result
99
100if __name__ == "__main__":
101    print get_server(platform = "nt")
102