Projet

Général

Profil

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

root / plugins / change.org / changeorg_signature_count @ a7139bca

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

1
#!/usr/bin/env python3
2
'''
3
=head1 NAME
4

    
5
Munin Plugin to grab signature count for change.org petition given its ID
6
You need a valid API key for this petition
7

    
8
=head2 CONFIGURATION
9

    
10
Example:
11

    
12
 [changeorg_signature_count]
13
 env.APIkey xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
14
 env.petitions 1727001 1727053
15

    
16
=head1 AUTHOR
17

    
18
(c) 2017 Raphaël Droz <raphael.droz+floss@gmail.com>
19

    
20
=head1 LICENSE
21

    
22
General Public Licence v3 or later
23

    
24
SPDX-License-Identifier: GPL-3.0-or-later
25

    
26
=head1 MAGIC MARKERS
27

    
28
 #%# family=auto
29
 #%# capabilities=autoconf
30

    
31
=cut
32
'''
33

    
34
from sys import argv, exit
35
import sys
36
import codecs
37
from os import environ, path, umask
38
import re
39
import urllib.request
40
import json
41

    
42
if len(argv) > 1 and argv[1] == 'autoconf':
43
    ok = True
44
    if not environ.get('APIkey') or not re.match('[a-fA-F0-9]{64}$', environ.get('APIkey')):
45
        print("no (env.APIkey not defined or bad format)")
46
        ok = False
47
    for i in environ.get("petitions"):
48
        if not re.match("[0-9]+$", i):
49
            print("no ($i isn't a valid petition ID")
50
            ok = False
51
    if ok:
52
        print("yes")
53
    exit(0)
54

    
55

    
56
petition_titles = {}
57
write_cache = False
58

    
59
if environ.get('MUNIN_PLUGSTATE'):
60
    petition_cache_names = path.join(environ['MUNIN_PLUGSTATE'], path.basename(argv[0]) + '-petition_names')
61
    try:
62
        with open(petition_cache_names, 'r') as f:
63
            petition_titles = json.load(f)
64
    except FileNotFoundError:
65
        pass
66

    
67
for i in environ.get('petitions').split():
68
    if i in petition_titles:
69
        continue
70
    # NB: user-agent's tweak is needed to avoid a 403
71
    req = urllib.request.Request("https://api.change.org/v1/petitions/{}?api_key={}&fields=title".format(i, environ.get('APIkey')),
72
                                      data=None,
73
                                      headers={ 'User-Agent': 'curl/7.38.0' })
74
    response = urllib.request.urlopen(req).read().decode('utf-8')
75
    petition_titles[i] = json.loads(response)
76
    write_cache = True
77

    
78
if environ.get('MUNIN_PLUGSTATE') and write_cache:
79
    umask(0o077)
80
    with open(petition_cache_names, 'w') as outfile:
81
        json.dump(petition_titles, outfile)
82

    
83
# equivalent of passing PYTHONIOENCODING=utf-8 to munin
84
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
85

    
86
if len(argv) > 1 and argv[1] == 'config':
87
    print('''graph_title change.org signature count
88
graph_args --base 1000 -l 0
89
graph_vlabel Signatures
90
graph_category other
91
graph_info change.org signature count
92
graph_period minute
93
''')
94

    
95
    for i in petition_titles:
96
        print('''signcount_{pid}.label {title}
97
signcount_{pid}.info Total signatures for {title}
98
signcount_{pid}.draw LINE3
99
signcount_{pid}.min 0'''.format(pid=i, title=petition_titles[i]["title"]))
100
    exit(0)
101

    
102
for i in environ.get("petitions").split():
103
    req = urllib.request.Request("https://api.change.org/v1/petitions/{}?api_key={}&fields=signature_count".format(i, environ.get('APIkey')),
104
                                      data=None,
105
                                      headers={ 'User-Agent': 'curl/7.38.0' })
106
    response = urllib.request.urlopen(req).read().decode('utf-8')
107
    print("signcount_%s.value %s" % (i, json.loads(response)["signature_count"]))