blob: f79991fd9a45a8724d5840cde23a56e958cb52ce (
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import os
import re
import socket
import Bcfg2.Server.Admin
class Tidy(Bcfg2.Server.Admin.Mode):
__shorthelp__ = "Clean up useless files in the repo"
__longhelp__ = __shorthelp__ + "\n\nbcfg2-admin tidy [-f] [-I]\n"
__usage__ = ("bcfg2-admin tidy [options]\n\n"
" %-25s%s\n"
" %-25s%s\n" %
("-f",
"force",
"-I",
"interactive"))
def __init__(self, cfile):
Bcfg2.Server.Admin.Mode.__init__(self, cfile)
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[:]:
# py3k compatibility
try:
answer = raw_input("Unlink file %s? [yN] " % name)
except NameError:
answer = 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+)$')
to_remove = []
good = []
bad = []
# clean up unresolvable hosts in SSHbase
for name in os.listdir("%s/SSHbase" % (self.get_repo_path())):
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" % (self.get_repo_path())):
if not hostmatcher.match(name):
to_remove.append("%s/SSHbase/%s" % (self.get_repo_path(),
name))
else:
if hostmatcher.match(name).group(1) in bad:
to_remove.append("%s/SSHbase/%s" %
(self.get_repo_path(), name))
# clean up file~
# clean up files without parsable names in Cfg
return to_remove
|