RSS
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 20
[>] Re: Yacy
im.1406
Difrex(lenina,103) — vit01
2014-06-06 18:56:30


Работает http://itmag.es/O87D :D

>А на чём ты свой клиент написал?
На perl/Plack. Пока не до конца. Потом на гитхаб все залью под WTFPL :)

[>] Re: Yep. I'm here.
im.1406
Difrex(lenina,103) — Romero Yakovlev
2014-06-06 23:16:53


Ага, вроде, как меня.
А еще я не знаю от куда еще можно пуллить кроме как с 51t и четвертого кольца.

[>] Re: день тишины
im.1406
Difrex(lenina,103) — spline
2014-06-06 23:44:28


Хм, а мне тоже тебе писать или Romero Yakovlev пересылал тебе письмо мое?

Ладно перешлю.

[>] Re: статистика
im.1406
Difrex(lenina,103) — Romero Yakovlev
2014-06-07 00:11:08


ААА. Мой парсер превратил эту мессагу во что-то жуткое :(.
Знаки равно - это зло! =)

[>] Пишем плагин для Sensu
python.15
Difrex(mira, 14) — All
2015-10-13 13:47:54


Думал, куда бы перетащить эту статью -- в linux.14 или в python.15. Решил остановиться на питоне.

Итак:

Будем писать на питоне.

Нам потребуется пакет sensu-plugin-python. Ставим его. У меня он опакечен, вам же предстоит это делать самому. Взять его можно на гитхабе: https://github.com/sensu/sensu-plugin-python.git.

*Пишем проверку*

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from sensu_plugin import SensuPluginCheck
from os import listdir
from os.path import isfile,join
 
class CoolCheck(SensuPluginCheck):
  def setup(self):
    self.parser.add_argument(
      '-w',
      '--warning',
      required=True,
      type=int,
      help='Integer warning level to output'
    )
    self.parser.add_argument(
      '-c',
      '--critical',
      required=True,
      type=int,
      help='Integer critical level to output'
    )
    self.parser.add_argument(
      '-d',
      '--directory',
      required=True,
      type=str,
      help='Path to directory'
    )
 
 
  def run(self):
    self.check_name('my_cool_check')
 
    dir = self.options.directory
 
    onlyfiles = [ f for f in listdir(dir) if isfile( join(dir, f) ) ]
    size = len(onlyfiles)
 
    if size < self.options.warning:
      self.ok() # Exit code 0
    elif size >= self.options.warning and size < self.options.critical:
      self.warning('Files count ' + str(size)) # Exit code 1
    elif size >= self.options.critical:
      self.critical('Files count ' + str(size)) # Exit code 2
    else:
      self.unknown('Unknown error')
 
if __name__ == "__main__":
  f = CoolCheck()

SensuPluginCheck уже предоставляет нам парсер командной строки по-этому нет необходимости использовать python-argparse или что-то еще подобное.

Функция *setup()* из класса *CoolCheck()* выполняется первой при запуске программы. В ней мы как раз задаем аргументы, какие будет принимать наша проверка.

В Функции *run()* уже выполняется сама проверка. Мы проверяем количество файлов в указанной директории, сравниваем с пороговыми значениями и выходим с соответствующим кодом выхода и сообщением.

*Метрики*

Адаптируем код проверки под метрику и вынесем код подсчета количества файлов в отдельную функцию.
cool.py:
from os import listdir
from os.path import isfile,join
def files_count(dir):
    onlyfiles = [ f for f in listdir(dir) if isfile( join(dir, f) ) ]
    size = len(onlyfiles)
     
    return size

И сам плагин метрики.
cool_metric.py:
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from sensu_plugin import SensuPluginMetricGraphite
from cool import files_count
 
class CoolMetricGraphite(SensuPluginMetricGraphite):
    def setup(self):
      self.parser.add_argument(
        '-s',
        '--schema',
        required=True,
        type=str,
        help='Graphite schema'
      )
       
      self.parser.add_argument(
        '-d',
        '--directory',
        required=True,
        type=str,
        help='Path to directory'
      )
  
 
    def run(self):     
        size = files_count(self.options.directory)
        self.output(self.options.schema, size)
        self.ok()
 
 
if __name__ == "__main__":
     f = CoolMetricGraphite()

Попробуем запустить:
chmod +x cool_metric.py
./cool_metric.py -s `hostname -f`.tmp.files -d /tmp
example.com.tmp.files    2    1442480739

Все отлично! Осталось только опакетить(не забывай только добавлять в зависимость sensu-plugin-python), привезти пакет на нужные хосты и написать конфиг Sensu и повесить графитовый хандлер
{
  "checks": {
    "cool_metrics": {
      "type": "metric",
      "handler": "graphite",
      "command": "/etc/sensu/plugins/other/cool.py -s \"`hostname -f`.tmp.files\" -d /tmp",
      "interval": 60,
      "subscribers": [
        "cool_hosts"
      ]
    }
  }
}

Аналогично делаем для проверки.



Как видно – все очень просто. Если использовать код ниже по тексту, как шаблон, то при написании плагина можно сосредоточиться только на том, что нужно проверять и не думать о том, как распарсить командную строку, какой код выхода использовать, и.т.д.

sensu-plugin-python реально упрощает жизнь.

В следующий раз будем писать хандлер.

[>] Re: rsa и все все все
python.15
Difrex(mira, 14) — Roman Yakovlev
2015-09-14 16:33:31


Дергай gpg. У GPG стандартизированный API и он есть везде.

[>] Пишем хандлер для Sensu
python.15
Difrex(mira, 14) — All
2016-01-28 16:53:28


Как и обещал, будем разбирать процесс создания хандлера.

В терминологии Sensu хандлер – это тот же плагин, только вызывающийся по определенным событиям.

Рассмотрим ситуацию, когда нам надо запускать хандлер на события OK и CRITICAL. Пример конфигурации:
{
  "checks": {
    "cpu": {
      "handlers": ["email"],
      "command": "/etc/sensu/plugins/system/check-cpu.rb",
      "interval": 60,
      "subscribers": [
        "base"
      ]
    }
  }
}

Проверка запускается раз в 60 секунд.
{
    "handlers": {
        "email": {
            "type": "pipe",
            "command": "/etc/sensu/handlers/notification/mailer.pl",
                "severities": ["critical", "ok"]
        }
    }
}
При наступлении события смены состояния чека ok<->critical выхлоп проверки в формате JSON отправится на STDIN программе mailer.pl.

Как же выглядит выхлоп? А вот так:
$VAR1 = {
          'check' => {
                       'status' => 2,
                       'handlers' => [
                                       'test'
                                     ],
                       'subscribers' => [
                                          'test'
                                        ],
                       'interval' => 60,
                       'history' => [
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '2',
                                      '2',
                                      '2',
                                      '2'
                                    ],
                       'issued' => 1442576325,
                       'executed' => 1442576325,
                       'total_state_change' => 5,
                       'duration' => '0.086',
                       'name' => 'test_check',
                       'command' => '/etc/sensu/plugins/files/check-checksums.rb -f /tmp/testfile -h e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
                       'output' => 'Checksum CRITICAL: /tmp/testfile does not match
'
                     },
          'action' => 'create',
          'client' => {
                        'timestamp' => 1442576321,
                        'address' => 'graphite.bingo-boom.ru',
                        'name' => 'graphite.bingo-boom.ru',
                        'version' => '0.20.0',
                        'subscriptions' => [
                                             'hp',
                                             'base',
                                             'uchiwa',
                                             'test',
                                             'dizard_snmp'
                                           ]
                      },
          'id' => '0139b1f9-db4c-4a2b-8124-a2c9b076e40d',
          'occurrences' => 4
        };
Теперь мы можем взять этот JSON и преобразовать его в объект. В python это будет выглядеть примерно так:
import ast
import fileinput

json = ''

for line in fileinput.input():
    json  += line

# Get dictionary from string
def get_dict(json):
        out_dict = ast.literal_eval(json)
    
        return out_dict


check_message_dict = get_dict(json)


Теперь, когда у нас есть с структурированной информацией о проверке, я думаю, понятно, что делать дальше.

Код из нашего продакшена – мылохандлера(немного устаревший код) https://github.com/Difrex/sensu/blob/master/handlers/mailer.pl

[>] Списки в функциях питона
python.15
Difrex(mira, 14) — All
2017-08-14 18:28:39


Зацените

import random


def get_port():
    port = random.randrange(33000, 37000, 1)
    return port


def check_list(port_list=[], count=0):
    if count == 0:
        print(port_list)

    port = get_port()

    if port in port_list:
        return "%s: %s in %s" % (count, port, len(port_list))
    else:
        count += 1
        port_list.append(port)
        return check_list(port_list, count)


print(check_list())
print(check_list())
print(check_list())

Наверное, для гуру питона поведение будет знакомо, но для меня такое поведение было полной неожиданностью :(

[>] Re: Slackware x86 RIP
lor-opennet.15
Difrex(mira, 14) — Новостной_робот
2015-03-27 15:53:46


Ну и правильно

[>] Re: Slackware x86 RIP
lor-opennet.15
Difrex(mira, 14) — vit01
2015-03-30 14:02:00


>А компы-то остались и до сих пор работают...
Это какая-то древность. Пусть на debian переходят =)

[>] Re: Slackware x86 RIP
lor-opennet.15
Difrex(mira, 14) — vit01
2015-03-30 15:42:06


>У меня дома (и не только дома) все компы на x86.
Хм, а почему так?

[>] Re: Объявлена дата релиза Debian 8.0 «Jessie»
lor-opennet.15
Difrex(mira, 14) — Новостной_робот
2015-04-01 10:18:52


Крутотенючка!

Теперь можно потихоньку, за годик, обновить парк серверов. А новые уже прямо на Jessie ставить.

[>] Re: Yandex.Root 2015: олимпиада для системных администраторов
lor-opennet.15
Difrex(mira, 14) — Новостной_робот
2015-04-02 10:32:35


Зарегил тиму.
Будем участвовать, наверное, с коллегами :)

[>] Re: Cyanogen объявляет о стратегическом соглашении с Microsoft
lor-opennet.15
Difrex(mira, 14) — vit01
2015-04-20 10:21:17


Я вот вообще больше не хочу телефон на андроиде брать.
Следующий будет либо на Sailfish, либо на убунте если телефоны с ней наконец-то появятся.

[>] Re: Cyanogen объявляет о стратегическом соглашении с Microsoft
lor-opennet.15
Difrex(mira, 14) — vit01
2015-04-20 14:18:17


Так там, вроде, гнутая обвязка+wayland+pulseaudio+systemd и проприетарная оболочка

Так-то андроид тоже нифига не свободный. Дрова закрытые

[>] Re: Cyanogen объявляет о стратегическом соглашении с Microsoft
lor-opennet.15
Difrex(mira, 14) — vit01
2015-04-20 15:33:29


>но, так или иначе, чистая AOSP-прошивка будет в любом случае лучше всякой гадости от Apple, Microsoft и Google
Ну да.

Просто сам андроид меня достал своими тормозами и глюками.

[>] Re: Демонстрация работы KDE Plasma поверх Wayland
lor-opennet.15
Difrex(mira, 14) — Новостной_робот
2015-06-15 15:33:37


Вот это прикольно. КДЕшникам понравится.

Когда можно будет тайловые ВМ пускать(не знаю как, в i3 точно не будут добавлять поддержку), то обязательно буду вейленд пробовать.

[>] Re: Десятый Всероссийский Слет Системных Администраторов
lor-opennet.15
Difrex(mira, 14) — Новостной_робот
2015-07-20 18:11:35


Думаю сгонять в этом году

[>] Re: Google представила Android 6.0 Marshmallow
lor-opennet.15
Difrex(mira, 14) — Новостной_робот
2015-08-19 17:15:30


Андроид 6.0 Проскурняк
https://i.imgur.com/tvRXjXZ.png

[>] Re: В ближайшее время Википедия может быть заблокирована в России
lor-opennet.15
Difrex(mira, 14) — vit01
2015-08-25 12:50:26


Я себе давно сделал локальную копию педивикии.

Хм, а давайте в сеть притянем статьи русской вики?
Минимальная версия весит всего около гига.

+ когда поиск доведу до нормального состояния, то можно будет искать по эхе.

[>] Re: ii-ссылки (Тест)
idec.talks
Difrex(tavern,23) — vit01
2018-08-13 10:31:53


Мой телефон не смог распознать qr код. Кривой он какой-то

[>] Re: ii-ссылки (Тест)
idec.talks
Difrex(tavern,23) — vit01
2018-08-15 11:04:44


Хм, а вот открытый в idec.el qr-код я смог отсканить

// Sent from my GNU Emacs

[>] Дубликаты в idec mobile
idec.talks
Difrex(tavern,23) — All
2018-08-25 16:07:24


ii://IUBOUMk9n96nGAOH1rs3 вот это вот сообщение загрузилось три раза. И отображается с одним и тем же id три раза. Странно.

[>] Дубликаты в idec mobile
idec.talks
Difrex(tavern,23) — All
2018-08-25 19:00:42


ii://IUBOUMk9n96nGAOH1rs3 вот это вот сообщение загрузилось три раза. И отображается с одним и тем же id три раза. Странно.

[>] Re: Дубликаты в idec mobile
idec.talks
Difrex(tavern,23) — vit01
2018-08-25 23:29:02


Блин, точно. Про черепаху. Не тот msgid скопировал. Было бы круто иметь опцию в трехточечном меню для копирования msgid просматриваемого сообщения.

[>] Re: Подписи
idec.talks
Difrex(tavern,23) — Andrew Lobanov
2018-08-26 21:59:00


AL> Вот и надо для того подпись начинать как-то вычленять, об чём я и говорил в конце =)
Давайте уже выберем какой-ниубудь формат :)
А то мне поменять не сложно на самом деле, но я хочу начать работу по подготовке кода для MELPA и заморозить добавление фич.

// Sent from my GNU Emacs

[>] Re: Подписи
idec.talks
Difrex(tavern,23) — vit01
2018-08-26 23:00:31


vit01> Вот пример фидошной подписи
vit01> Это жуть и неприемлемо.
Согласен

vit01> Меня вполне устраивает формат комментариев
+1

vit01> Оба вида де-факто уже распознаются в большинстве клиентов. Всё что остаётся - это по желанию приукрасить комментарий, если он находится в конце сообщения через пустую строку

vit01> ====
vit01> Текст сообщения

vit01> # Подпись
vit01> ====

Короче, у меня так и сделано - через //.
Если так норм, то оставлю такой вариант.

// Sent from my GNU Emacs

[>] Re: Подписи
idec.talks
Difrex(tavern,23) — Andrew Lobanov
2018-08-27 21:57:05


AL> Если у меня нет подписи, то я не могу оставить комментарий в конце сообщения. Потому что с точки зрения договорённости это подпись.

AL> Может всё же использовать какой-то более другой управляющий символ?

Я за ;;;

[>] Re: Подписи
idec.talks
Difrex(tavern,23) — vit01
2018-08-28 09:38:55


AL>> Если у меня нет подписи, то я не могу оставить комментарий в конце сообщения. Потому что с точки зрения договорённости это подпись.

AL>> Может всё же использовать какой-то более другой управляющий символ?

vit01> Ну давайте тогда лисповские ;;;
vit01> Но только в самом конце. Вдруг лиспер захочет оставить комментарий в середине сообщения =)

Конечно в конце, подпись же :)

[>] Re: Подписи
idec.talks
Difrex(tavern,23) — Andrew Lobanov
2018-08-28 10:46:17


Может голосование в pipe.2032 устроим из трёх вариантов? Все же в спеку пойдет.
// Так
;;; Так
*** Или так

[>] Re: Подписи
idec.talks
Difrex(tavern,23) — Peter
2018-08-28 11:28:40


Peter> Если эстетически, то ***.
Peter> Но я не понял, ориджин будет всегда 1 строчным?
У меня в idec.el только однострочные пока.

Peter> Может вообще не надо это в стандарт. Ну как в почте, мало ли какой клиент что лепит в конце? Может не надо усложнения?
Не, ну определиться с форматом было бы хорошо. Есть же у нас договоренности про ====, например.

*** Sent from my GNU Emacs

[>] Re: Подписи в IDEC Mobile
idec.talks
Difrex(tavern,23) — Peter
2018-09-05 18:11:17


Зашибись :)

+++ Sent from IDEC mobile

[>] Re: Подписи в IDEC Mobile
idec.talks
Difrex(tavern,23) — Difrex
2018-09-05 18:12:37


Ой, ответил не на топ-пост.

+++ Sent from IDEC mobile

[>] Re: Подписи в IDEC Mobile
idec.talks
Difrex(tavern,23) — Andrew Lobanov
2018-09-07 18:06:07


vit01>> Зацените в новой сборке
AL> Наконец-то обновился. Всё таки шикарный клиент.
Клиент ваще огонь!

+++ Sent from IDEC mobile

[>] Re: dynamic
idec.talks
Difrex(tavern,23) — vit01
2018-11-01 20:55:46


vit01> Как раз заходил туда сегодня, чтобы глянуть статистику по эхам. Правда, чего нужно, не нашёл
vit01> Хотелось посмотреть поток сообщений в "роботизированных" эхах по дням недели в среднем за месяц, а там только для "человеческих"
Вот этого через АПИ не получишь - наружу не торчит, т.к. для статов по дням недели используется groovy,
а это потенциальная уязвимость.

vit01> Можешь пожалуйста сделать похожую страничку со статистикой для новостных эх? Ну или хотя бы подсказку дать насчёт API Elasticsearch, чтобы вытащить данные.
Сделаю страничку для роботов :)
Еще есть в планах доливать раз в неделю данные в read-only индекс и прямо вставлять iframe из кибаны,
чтобы все интерактивно было.

vit01> +++ Отправлено через IDEC Mobile
vit01> +++ GNU/Linux, Android, physics, MLP:FIM

+++ Емакс не пищит и текст не портит

[>] Re: Как взять на карандаш
idec.talks
Difrex(tavern,23) — Anotheroneuser
2018-11-04 13:13:45


Anotheroneuser> Нельзя ли мне какую-нибудь схему.. или ссылку на объяснение-для-лиц-далёких-от?
Anotheroneuser> А ещё лучше -- просто подсказку, как запоминать адреса конкретных сообщений.
Не знаю будет ли тебе удобно, но на https://dynamic.lessmore.pw есть избранное.
Щелкаешь на зведочку в правом нижнем углу сообщения и оно добавляется в твое избранное,
потом увидеть можно тут: https://dynamic.lessmore.pw/favorites

// Починил ноду(IDEC API) на динамике. Работают схемы x/c, list.txt, m, e, u/m, u/e

+++ Емакс не пищит и текст не портит

[>] Загейтуйте динамик
idec.talks
Difrex(tavern,23) — All
2018-11-04 19:26:24


Сабж. А именно эху ii.test.14. Я начинаю тестирование писанины, как через веб, так и через клиент :)

+++ картошки хватит на всех

[>] Странности IDEC Mobile
idec.talks
Difrex(tavern,23) — All
2018-11-06 12:44:46


А это норм, что IDEC Mobile в качесте нового сообщения формирует такой вот текст?
ii.test.14
All
another test
Test

Т.е. всего 3 строки в заголовке, хотя в стандарте у нас вот что:
1	echoarea	эхоконференция, в которую помещается сообщение
2	msgto	    пользователь, которому вы пишете (либо All, если обращаетесь ко всем)
3	subj	    тема сообщения
4	-	        пустая строка
5	repto	    если начинается с @Repto:, то нода проставляет тэг repto (указывает id письма, на которое отвечаем). Иначе строка относится к тексту сообщения
6 и далее msg	текст сообщения

[>] The dynamic.lessmore.pw has clients support
idec.talks
Difrex(dynamic,1) — All
2018-11-06 19:44:00


Собственно сабж. Можно читать и писать. Протестированы все основные клиенты,

исправленны все найденные(мною) баги. Попутно добавились фичи и исправления в пакет go-idec.
Исходники ноды отзеркалены на гитхаб: https://github.com/idec-net/lessmore-node
На этой или следующей неделе появится возможность постить из веб-гуйни.

Выпью пива :)

// А еще на работе зарелизили в прод сегодня систему автоматического инцидент-менеджмента

+++ Caesium/0.4 RC1

[>] Re: Загейтуйте динамик
idec.talks
Difrex(dynamic,1) — Anotheroneuser
2018-11-06 21:16:49


Anotheroneuser> > Загейтуйте
Anotheroneuser> Как это по-русски?)) «Закрыть ворота»?
Зацени, что у нас есть https://ii-net.tk/idec-doc/?p=terminology :)

+++ Емакс не пищит и текст не портит

[>] Re: Загейтуйте динамик
idec.talks
Difrex(dynamic,1) — Anotheroneuser
2018-11-06 23:05:57


Не, сообщения могут находиьтся только в пределах эхи, но можно ответить на сообщение из другой эхи. Перекрестные ссылки, типа.

+++ картошки хватит на всех

[>] Re: Загейтуйте динамик
idec.talks
Difrex(dynamic,1) — Anotheroneuser
2018-11-06 23:10:23


Да, сеть реализует распределенную базу сообщений.
Ты, например, писал со станции syscall, а я с dynamic, а теперь
эти сообщения есть на всех узлах(наверняка).

+++ Емакс не пищит и текст не портит

[>] Лежит станция Мира
idec.talks
Difrex(tavern,23) — All
2018-11-15 11:29:57


Сабж. Ругается на базульку, а еще там передаются сырые запросы, что в теории можно использовать для инъекции.
Правда в пыхокоде сильно не копался, но скорее всего подломить можно.

Функция executeQuery вызывается довольно часто и туда педаются данные путем слияния строк, например
Строка 285 файла transports.php
$this->executeQuery("insert into `$this->tablename` values(NULL, '".$msg['id']."', ' ... '".$msg['msg']."')");

Пока не ясно можно ли использовать это без авторизации. Код валидации authstring не читал.
Но имея поинта к этому участку кода появляется доступ :).

Да, в пхп можно отключить вывод ошибок в браузер, что лучше сделать :)

// А поставьте на фетч с dynamic основные эхи. Вроде как, все работает.

[>] Re: Полнотекстовый поиск и подписи
idec.talks
Difrex(tavern,23) — vit01
2019-01-25 11:14:58


vit01> Хотя поисковой движок, запущенный для нашей базы, есть только у тебя, поэтому тут всё зависит от простоты постановки такого условия в ElasticSearch.

Мне добавить в парсер это не сложно, нужно только время выкроить

+++ картошки хватит на всех

[>] А где у нас актуальный nodegraph.svg?
idec.talks
Difrex(tavern,23) — All
2019-01-28 17:39:14


$сабж

Вот этот вот http://idec.spline-online.ml/x/file/nodegraph.svg не актуален.


// Да, по каким-то причинам сообщения с dynamic не долетают до Таверны и Клуба. Можете посмотреть в логи, что там не так?

[>] Re: А где у нас актуальный nodegraph.svg?
idec.talks
Difrex(tavern,23) — Anotheroneuser
2019-01-29 13:54:18


>Если ты скажешь как, посмотрю
Это скорее к держателям нод вопрос был =)

[>] Обновление динамика
idec.talks
Difrex(tavern,23) — All
2019-02-20 15:20:17


На dynamic.lessmore.pw появилась возможность читать треды.

Строятся по repto, у каждого поста теперь есть topicid, вида
3ee870f3-be0c-4ea4-8a6d-b6c8ecd64dac.

Если мы перейти по ссылке https://dynamic.lessmore.pw/thread/3ee870f3-be0c-4ea4-8a6d-b6c8ecd64dac, то
можно будет читать тред с сортировкой по времени от старых к новым.

Чтобы попасть в тред нужно перейти по ссылке в сабже.

У каждого поста есть якорь с msgid, так что можно добавить #8EuhW1rxWVNQAcPxuxLn и перейти к нужному сообщению.
На самом деле, id уже проставляется в ссылке, но почему-то браузер не переходит куда надо.

:)

+++ At work. idec.el/0.1

[>] Re: А где у нас актуальный nodegraph.svg?
idec.talks
Difrex(dynamic,1) — Andrew Lobanov
2019-01-29 15:49:17


AL> Актуализацией надо заниматься. У нас нет актуального нодлиста, так что пока что не могу построить актуальный граф.
AL> Скиньте актуальные сегменты нодлиста тогда.
Мой: https://dynamic.lessmore.pw/nodelist.json

+++ At work. idec.el/0.1

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 20