private String chooseSuitableNetworkSetup(String osVersion, String osArch, String... files) {
        // DGF we don't technically need to know osArch, but according to comments in SRC-13,
        // sometimes Tiger on PPC looks different from Tiger on Intel, so we'll leave it in, 
        // just in case
        
        Set<String> candidates = new HashSet<String>();
        for (String file : files) {
            if (file.startsWith("networksetup-")) {
                candidates.add(file);
            }
        }
        if (candidates.isEmpty()) {
            log.debug("No networksetup candidates found");
            return null;
        }
        if (candidates.size() == 1) {
            log.debug("One networksetup candidate found");
            return candidates.iterator().next();
        }
        log.debug("Multiple networksetup candidates found: " + candidates);
        // uh-oh.  There's no 'networksetup' and more than one 'networksetup-*'
        // we'll have to take a guess!
        String[] versionParts = osVersion.split("\\.");
        if (versionParts.length < 2) {
            log.debug("OS version seems to be invalid: " + osVersion);
            return null;
        }
        if (!"10".equals(versionParts[0])) {
            log.debug("OS version doesn't seem to be 10.*: " + osVersion);
            return null;
        }
        CodeName codeName;
        try {
            codeName = CodeName.minorVersion(versionParts[1]);
            String possibleCandidate = "networksetup-"+codeName.name().toLowerCase();
            if (candidates.contains(possibleCandidate)) {
                log.debug("This seems to be " + codeName + ", so we'll use " + possibleCandidate);
                return possibleCandidate;
            }
            log.debug("This seems to be " + codeName + ", but there's no " + possibleCandidate);
        } catch (IllegalArgumentException e) {
            log.debug("Couldn't find code name for OS version " + osVersion);
            return null;
        }
        // DGF when we know there's multiple candidates, but none of them match, should we just pick one?
        return null;
    }