summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Admin/Tidy.py
blob: 80307df80d31002ecc17bc576205ccaab129102d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import Bcfg2.Server.Admin
import re, os, socket

class Tidy(Bcfg2.Server.Admin.Mode):
    __shorthelp__ = 'bcfg2-admin tidy [-f] [-I]'
    __longhelp__ = __shorthelp__ + '\n\tClean up useless files in the repo'
    def __call__(self, args):
        Bcfg2.Server.Admin.Mode.__call__(self, args)
        badfiles = self.buildTidyList()
        if '-f' in args or '-I' in args:
            if '-I' in args:
                for name in badfiles[:]:
                    answer = raw_input("Unlink file %s? [yN] " % name)
                    if answer not in ['y', 'Y']:
                        badfiles.remove(name)
            for name in badfiles:
                try:
                    os.unlink(name)
                except IOError:
                    print "Failed to unlink %s" % name
        else:
            for name in badfiles:
                print name

    def buildTidyList(self):
        '''Clean up unused or unusable files from the repository'''
        hostmatcher = re.compile('.*\.H_(\S+)$')
        repo = self.get_repo_path()
        to_remove = []
        good = []
        bad = []

        # clean up unresolvable hosts in SSHbase
        for name in os.listdir("%s/SSHbase" % (repo)):
            if hostmatcher.match(name):
                hostname = hostmatcher.match(name).group(1)
                if hostname in good + bad:
                    continue
                try:
                    socket.gethostbyname(hostname)
                    good.append(hostname)
                except:
                    bad.append(hostname)
        for name in os.listdir("%s/SSHbase" % (repo)):
            if not hostmatcher.match(name):
                to_remove.append("%s/SSHbase/%s" % (repo, name))
            else:
                if hostmatcher.match(name).group(1) in bad:
                    to_remove.append("%s/SSHbase/%s" % (repo, name))
        # clean up file~
        # clean up files without parsable names in Cfg
        return to_remove