Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / moinmoin / moinmoin_pages @ 26e497fc

Historique | Voir | Annoter | Télécharger (3,39 ko)

1
#!/usr/bin/env python3
2

    
3
"""
4

    
5
=head1 NAME
6

    
7
moinmoin_pages - lists the number of pages in all wikis of a MoinMoin wikifarm
8

    
9

    
10
ACL-protected pages are included.
11

    
12

    
13
=head1 CONFIGURATION
14

    
15
 [moinmoin_*]
16
 user www
17

    
18

    
19
=head1 IMPLEMENTATION NOTES
20

    
21
The plugin is quite koumbit-specific:
22

    
23
=over 4
24

    
25
=item 1. the wikifarm config is hardcoded
26

    
27
=item 2. "wikilist.py" is assumed to contain the list of wiki -> url patterns
28

    
29
=item 3. url patterns are assumed to be simple enough, that they are decodable into an url
30

    
31
=back
32

    
33
Also note that this plugin reuses code from MoinMoin/wikimacro.py's SystemInfo macro.
34

    
35
Finally, i tried using XMLRPC instead of native functions to fetch the data, but it ended up being
36
slower.  For the record, here is what the getPageList() call would have looked like:
37

    
38
 xmlrpclib.ServerProxy("http://wiki.koumbit.net/?action=xmlrpc2").getAllPages()
39

    
40
The quick benchmark I did yielded those results for the getAllPages() vs getPageList() calls:
41

    
42
 xmlrpc:         2.35 real         0.12 user         0.04 sys
43
 native:         1.44 real         1.07 user         0.35 sys
44

    
45
So the plugin is spending more time in the CPU (all time, actually), but it's doing in faster.
46
It is highly possible that the CPU time spared in XMLRPC is in fact used by the server.
47

    
48

    
49
=head1 AUTHORS
50

    
51
Copyleft 2007, The Anarcat <anarcat@koumbit.org>
52

    
53

    
54
=head1 LICENSE
55

    
56
Licensed under the GPLv2 or any later version.
57

    
58
SPDX-License-Identifier: GPL-2.0-or-later
59

    
60
=cut
61
"""
62

    
63
import os
64
from re import sub
65
import sys
66

    
67
from MoinMoin import wikiutil
68
from MoinMoin.request import RequestCLI
69

    
70
os.chdir('/export/wiki/config')
71
sys.path.insert(0, '/export/wiki/config')
72

    
73
from farmconfig import wikis  # noqa: E402
74

    
75

    
76
def _formatInReadableUnits(size):
77
    size = float(size)
78
    unit = u' Byte'
79
    if size > 9999:
80
        unit = u' KiB'
81
        size /= 1024
82
    if size > 9999:
83
        unit = u' MiB'
84
        size /= 1024
85
    if size > 9999:
86
        unit = u' GiB'
87
        size /= 1024
88
    return u"%.1f %s" % (size, unit)
89

    
90

    
91
def _getDirectorySize(path):
92
    try:
93
        dirsize = 0
94
        for root, dirs, files in os.walk(path):
95
            dirsize += sum([os.path.getsize(os.path.join(root, name)) for name in files])
96
    except EnvironmentError:
97
        dirsize = -1
98
    return dirsize
99

    
100

    
101
def main():
102
    for wiki in wikis:
103
        name = wiki[0]
104
        url = wiki[1]
105
        # XXX, hack: transform the regexp into a canonical url
106
        # we need canonical urls in the config for this to be clean
107
        # look for (foo|bar) and replace with foo
108
        url = sub(r'\(([^\|]*)(\|[^\)]*\))+', r'\1', url)
109
        # remove common regexp patterns and slap a protocol to make this a real url
110
        url = sub(r'[\^\$]|(\.\*)', '', url)
111

    
112
        request = RequestCLI(url)
113
        pagelist = request.rootpage.getPageList(user='')
114

    
115
        systemPages = [page for page in pagelist if wikiutil.isSystemPage(request, page)]
116
        print(name + '.value ' + str(len(pagelist) - len(systemPages)))
117

    
118

    
119
def config():
120
    print("""graph_title Wiki size
121
graph_vlabel Number of pages
122
graph_args --base 1000 -l 0
123
graph_scale no
124
graph_category wiki
125
graph_info The number of pages excludes system pages but includes ACL-protected pages.""")
126
    for wiki in wikis:
127
        name = wiki[0]
128
        mod = getattr(__import__(name), 'Config')
129
        print(name + '.label ' + getattr(mod, 'sitename'))
130

    
131

    
132
if __name__ == "__main__":
133
    if len(sys.argv) > 1 and sys.argv[1] == 'config':
134
        config()
135
    else:
136
        main()