Для начала скачаем саму графану:
1link$wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.7.linux-amd64.tar.gz
2link$tar -zxvf grafana-enterprise-9.4.7.linux-amd64.tar.gz
Для генерации лицензии, нам потребуется python3 и jwcrypto:
1link$apt install python3 python3-pip
2link$pip install jwcrypto
Теперь запустим следующий скрипт genkey.py:
1linkimport re
2linkimport os.path
3linkimport time
4linkfrom jwcrypto import jwk
5linkfrom jwcrypto import jwt
6linkfrom jwcrypto.common import json_encode
7link
8linkgrafana_version='9.4.7'
9linkgrafana_url='http://localhost:3000/'
10link
11link# Вытащим приватный ключ из исполняемого файла графаны:
12linkwith open('grafana-{}/bin/grafana'.format(grafana_version), mode='rb') as f:
13link grafana_bin = f.read()
14link
15linkpat = re.compile(b'.*({"kty":"RSA","kid":"1"[^}]+}).*')
16link
17linkoriginal_pub_start = grafana_bin.find(b'{"kty":"RSA","kid":"1"')
18linkoriginal_pub_end = grafana_bin.find(b'}', original_pub_start) + 1
19linkoriginal_pub_json = grafana_bin[original_pub_start:original_pub_end]
20link
21link# Генерируем новый ключ
22linknew_key_filename = 'new_key.json'
23linkif (not os.path.isfile(new_key_filename)):
24link key = jwk.JWK.generate(kty='RSA', size=4096, alg='RS512', kid='1')
25link new_pub_json = '{"kty":"RSA","kid":"1","alg":"RS512","n":"' + key.n + '","e":"' + key.e + '"}'
26link # Важно что бы длина совпадала с оригиналом
27link if len(new_pub_json) == len(original_pub_json):
28link new_key_json = key.export()
29link with open(new_key_filename, 'w') as text_file:
30link text_file.write(new_key_json)
31link print('New key generated!')
32link else:
33link print('Error - key length differs')
34linkelse:
35link # Загружаем новый ключ из готового файла
36link with open(new_key_filename) as f:
37link new_key_json = f.read()
38link print('New key loaded from file')
39link
40linkkey = jwk.JWK.from_json(new_key_json)
41linknew_pub_json = ('{"kty":"RSA","kid":"1","alg":"RS512","n":"' + key.n + '","e":"' + key.e + '"}').encode()
42linkif len(new_pub_json) == len(original_pub_json):
43link print('Pub key length Ok!')
44link
45link# Нужная лицензия
46linkc = {
47link 'ver': '2.0.0',
48link 'iss': 'https://grafana.com',
49link 'sub': grafana_url,
50link 'san': [],
51link 'jti': '1337',
52link 'nbf': int(time.time()),
53link 'iat': int(time.time()),
54link 'exp': int(time.time())+10*365*24*60*60,
55link 'lexp': int(time.time())+10*365*24*60*60,
56link 'lid': '1337',
57link 'prod': [
58link 'grafana-enterprise'
59link ],
60link 'limit_by': 'role_users',
61link 'included_admins': 100,
62link 'included_viewers': 1000,
63link 'included_users': 1000,
64link 'lic_exp_warn_days': 3,
65link 'tok_exp_warn_days': 2,
66link 'update_days': 1,
67link 'company': 'acme',
68link 'slug': 'acme',
69link 'trial': False,
70link 'usage_billing': False,
71link 'max_concurrent_user_sessions': 1000,
72link 'type': 'prod'
73link}
74link
75link# Подписываем лицензию новым ключём
76linkToken = jwt.JWT(header={'alg': 'RS512', 'typ': 'JWT', 'kid': '1'},
77link claims=c)
78linkToken.make_signed_token(key)
79linktoken_text = Token.serialize()
80link# Сохраняем лицензию в файл
81linkwith open('grafana-{}/bin/license.jwt'.format(grafana_version), 'w') as text_file:
82link text_file.write(token_text)
83linkprint('License file created')
84link
85link# Заменяем публичный ключ на новый в исполняемом файле
86linkgrafana_bin = grafana_bin.replace(original_pub_json, new_pub_json)
87linkwith open('grafana-{}/bin/grafana'.format(grafana_version), mode='wb') as f:
88link f.write(grafana_bin)
89linkprint('Binary modified')
В результате работы данного скрипта создаться файл лицензии и модифицируется исполняемый файл
Создадим файл конфигурации custom.ini:
1link[server]
2linkroot_url = http://localhost:3000/
3link
4link[enterprise]
5linklicense_path = license.jwt
6linkauto_refresh_license = false
Запустим:
1link$cd grafana-9.4.7/bin/
2link$./grafana server
Откроем http://localhost:3000/admin/licensing (admin:admin), должна быть видна действующая лицензия.