LINUX.ORG.RU

Сообщения olegd

 

Перейти на открывающий или закрывающий тег

Пример. Редактирую XML. Или HTML. Ставлю курсор на тег <div>. Нажимаю клавишу (или комбинацию), попадаю на соответствующий ему </div>. Нажимаю другую (или даже ту же) – перехожу на соответствующий ему <div>.

Или даже лучше. Ставлю курсор между <div> и </div>, внутри которых нет других парных тегов, нажимаю и прыгаю на тег, начинающий или кончающий текущий блок.

Какие редакторы так умеют? Пока нашёл только первую половину желаемого в vim matchit по %. (И не заработало.)

 , ,

olegd ()

Что такое свёртка?

Определение свёртки через интеграл знаю. Коммутативность, ассоциативность, линейность – знаю. Что она чередуется с умножением при преобразованиях Фурье, знаю. Но чего-то для полного понимания не хватает. Что-то ускользает на грани осознания.

Как бы вы описали, что такое свёртка, и для чего она нужна, в 2-3 словах?

 

olegd ()

Интуитивный интерфейс

https://github.com/grafana/grafana/issues/14629#issuecomment-548380370

Ловушка для админов-самоучек, тренирующихся на локалхосте. При создании дэшборда в поле URL серым шрифтом вписывается адрес слушаемого сервера по умолчанию. Но если попытаться сохранить без изменений, выдаёт ошибку Bag Gateway. Все параметры верны, но ошибка, хоть ты тресни.

Решение: в это же поле нужно руками вбить этот же URL, ярко-белым шрифтом. Потому что серый текст – это только подсказка, он не считается.

P.S. Для непонявших: «интуитивный» в саркастическом смысле.

 ,

olegd ()

Какая разница между Graylog и Elastic Stack?

Чем различаются с точки зрения пользователя Graylog и Elastic Stack? Что удобнее? Что в каких случаях стоит внедрять?

 

olegd ()

Зачем нужны keystore и truststore? На примере Apache ActiveMQ.

Какая разница между keystore и truststore? Keystore хранит на сервере сертификаты и ключи, которыми сервер шифрует то, что раздаёт? А truststore хранит информацию, каким чужим сертификатам можно доверять, когда сервер заходит на другие сервера как клиент? Но с точки зрения keytool принципиальной разницы нет, формат одинаков?

В дистрибутиве Apache ActiveMQ имеется 4 таких файла: broker.ks, broker.ts, client.ks, client.ts. broker.ks используется сервером, если включены доступ по SSL к REST, веб-интерфейсу, STOMP, WebSockets и т.п.? client.ts используется клиентскими программами на Java? А для чего нужны 2 остальных? SSL/TLS предусматривает вариант, когда клиент даёт серверу свой сертификат, и тот его принимает или не принимает?

P.S. Ещё вопрос туда же. Сертификат выдан на *.domain.ru. Я делаю как в https://wavemotiondigital.com/2014/03/07/convert-your-wildcard-ssl-to-jks-java-keystore-format/:

openssl pkcs12 -export -name my.domain.ru -in ca_bundle.pem -inkey domain.ru.key -out keystore.p12
keytool -importkeystore -destkeystore broker.ks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias my.domain.ru

и всё нормально работает для https://my.domain.ru. Но когда я добавляю те же сертификаты под другим алиасом:

openssl pkcs12 -export -name my.subnet.domain.ru -in ca_bundle.pem -inkey domain.ru.key -out keystore2.p12
keytool -importkeystore -destkeystore broker.ks -srckeystore keystore2.p12 -srcstoretype pkcs12 -alias my.subnet.domain.ru

на https://my.subnet.domain.ru Хром ругается. Как сделать, чтобы работало для обоих доменов?

 , , , ,

olegd ()

Расширения сертификатов

Есть ли какие-либо писанные правила, в файлах с какими расширениями распространяют сертификаты для цифровых подписей? Пока нагуглил, что для самого распространённого PEM обычно используют *.cer, *.cert, *.crt, *.ca-bundle и *.key, а для виндового PFX – *.pfx, *.p7b и *.p7s. Но всё это на уровне сложившихся практик. RFC листал, но не нашёл сведения всего воедино.

(Причина вопроса – столкнулся сегодня с проблемой, что user-friendly GUI неспособно работать с файлами, если автор не знал, что бывают такие расширения. Автор, естественно, спросил «а как правильно?»)

Заранее спасибо.

 

olegd ()

Сравнить XML

Требуется написать скрипт (на внутрикорпоративном скриптовом языке) для сравнения 2 файлов данных в формате XML и вывода списка различий. Есть API для работы с XML, где есть функции GetRootElement, GetFirstChild, GetNextSibling, GetFirstChildByName, GetNextSiblingByName, GetParent, GetElementTag, GetAttributesCount, GetAttributeByName, GetAttributeByIndex и т.д.

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

Вопрос: как лучше сравнивать?

Я сделал следующее.
Для сравнения атрибутов в паре элементов:

  • перебрать все атрибуты в 1-м теге, для каждого искать совпадающие во 2-м теге;
  • перебрать все атрибуты во 2-м теге, проверить, что каждый есть в 1-м.

Для проверки равенства пары элементов из 2 файлов:

  • сравнить тег;
  • сравнить атрибуты;
  • составить 2 списка детей;
  • сравнить число детей;
  • рекурсивно сравнивать каждого из детей из 1-го файла с каждым из детей из 2-го файла, отмечая в списках совпадающих; исключать из дальнейшего сравнения тех, для кого нашлась пара.

Для сравнения файлов:

  • взять корневые элементы и рекурсивно сравнить.

Как-то оптимизировать можно?

Ответ: Сканировать файл (обход дерева в глубину или ширину), собрать все возможные пути (xpath) в список, сортировать, сравнить. При этом атрибуты каждого узла также сортируются и добавляются в соответствующее место пути. Код сократился почти втрое.

 

olegd ()

JSON и экранирование символов

При знакомстве с JSON возник вопрос: как регламентируется экранирование прямой косой черты /? Если я правильно понимаю спецификации на https://www.json.org/json-en.html, экранировать обязательно: \/. Но все примеры на том же сайте – https://json.org/example.html – не экранируют. Есть ли какое-то правило, когда экранировать, когда – нет?

 

olegd ()

Какие нестандартные названия вам встречались?

«Огнелис», «Громоптиц», «Жирнолис», «Аутглюк» широко известны и неинтересны.

Сейчас переутомлённый настройкой почты админ порадовал меня названием «Птицелис».

А какие нестандартные названия встречались вам? И не только Thunderbird и Firefox.

 , ,

olegd ()

Извлечь из стринга пары ключ-значение

Скрипт на Groovy вызывает внешнюю функцию, которая берёт с сервера набор данных в виде пар ключ-значение и возвращает их скрипту в виде такого многострочного стринга:

{
  "TEST_NAME" : "test1",
  "SUCCESS" : "False"
}

Как из неё проще всего извлечь данные? Пока нужно только проверить условие SUCCESS = True, но в дальнейшем может понадобиться что-то более сложное. В идеале требуется простой способ превратить такой стринг в Map, не требующий внешних библиотек. Парсить регулярными выражениями? Или есть более простые способы?

Если интересны подробности, это потребовалось для взаимодействия Дженкинса с ActiveMQ. Груви начал изучать только вчера. Так как скрипты выполняются с кучей ограничений, не думаю, что позволит импортировать groovy.json.JsonBuilder/JsonSlurper.

Ответ: позволил :)

import groovy.json.JsonSlurper

node {
    stage('Start process') {
        sendCIMessage failOnError: true, 
            messageContent: '', 
            messageProperties: '', 
            messageType: 'Custom', 
            overrides: [], 
            providerName: 'Sender'
    }
    stage('Get answer') {
            def messageContent = 
                waitForCIMessage checks: [], 
                    providerName: 'Receiver', 
                    selector: 'TEST_NAME = test1'
                    timeout: 1
            echo messageContent
            def jsonSlurper = new JsonSlurper()
            def map = jsonSlurper.parseText( messageContent )
            if (map.SUCCESS == 'True')
                print 'succeeded'
            else if (map.SUCCESS == 'False')
                print 'failed'
            else 
                print 'wrong answer'            
    }
}

 ,

olegd ()

Отключить ANSI при выводе логов Докера

По ходу работы Дженкинс запускает docker logs. В логе в вывод программы в произвольных местах добавляется куча мусора наподобие

←[2J←[?25l←[m←[H

(символ 0x1b заменил стрелкой, чтобы движок ЛОРа не ругался)
Гугл находит множество жалоб на подобное несколько лет назад и ключи командной строки, отключающие ANSI-форматирование. Но в современных версиях они не работают. Даже исходников, куда добавляли возможность отключать эскейп-пследовательности по ссылкам из багов нет.

Нашёл упоминания, что вывод идёт через библиотеку Logrus, которая автоматически определяет, когда следует красиво форматировать, когда нет. Но в моём случае (извращения с Вайном) что-то не срабатывает.

Как принудительно отключить добавления эскейп-последовательностей?

P.S. Проверил /var/log/containers/. По умолчанию лог хранится в виде файла JSON, в котором нет никакого форматирования Esc-последовательностями. Они добавляются только при выводе через docker logs.

P.P.S. После обновления Дженкинса и плагинов мусор в логи добавлять перестало. Надеюсь, надолго.

 ,

olegd ()

Jenkins и Samba

Понадобилось грузить файлы из Дженкинса на виндовый файловый сервер. Нашёлся специальный плагин для этого: https://plugins.jenkins.io/publish-over-cifs Но при попытке проверить соединение появляется непонятная ошибка:

ERROR: Exception when publishing, exception message [Exception when testing config. URL [smb://172.30.0.58/share/], Message: [Failed to connect: 0.0.0.0<00>/172.30.0.58]]

Поискав, обнаружил обсуждение от 2017 года – https://groups.google.com/forum/#!topic/jenkinsci-users/O-DH2XUBRt8 – где говорится, что плагин использует библиотеку jCIFS, которая не понимает новый диалект и требует даунгрейдить SMB до версии 1, уязвимой к WannaCry. Но скоро её заменят на SMBJ.

Поискав в исходниках – https://github.com/jenkinsci/publish-over-cifs-plugin – нашёл упоминания jCIFS в 7 местах, и ни одного SMBJ.

По-прежнему, глухо? Средствами Дженкинса не реализуемо?

 , ,

olegd ()

svn diff для непоследовательных коммитов

Я хочу увидеть, что изменилось в файлах в результате нескольких коммитов. Для одного коммита достатчно команды:

svn diff -r 1201:1202 svn.test.com/svn/big_project/little_subproject/ --diff-cmd meld

или

svn diff -c 1202 svn.test.com/svn/big_project/little_subproject/ --diff-cmd meld

Но если задать несколько ревизий с -c или несколько пар с -r, получаю ошибку:

svn: E205000: Multiple revision arguments encountered; can't specify -c twice, or both -c and -r

Вариант вида svn diff -r 1201:1212 не устраивает – между 1202 и 1212 коммитили много, и интересующие строки затеряются.

Существует ли простой общепринятый способ посмотреть изменения сразу нескольких коммитов? Пока не придумал ничего лучше, чем вручную собирать список изменённых файлов, делать для каждого дифф для каждой ревизии, применять их к новейшей ревизии и сравнивать.

 ,

olegd ()

Перезагрузили — перестали ресолвиться имена

Есть кластер Kubernetes, на котором запущен kube-state-metrics. Его слушает Metricbeat, который всё отправляет в ElasticSearch. Всё было настроено по мануалу: https://www.elastic.co/guide/en/beats/metricbeat/7.3/running-on-kubernetes.html
https://github.com/kubernetes/kube-state-metrics
https://raw.githubusercontent.com/elastic/beats/7.3/deploy/kubernetes/metricbeat-kubernetes.yaml
После нескольких перезагрузок сбор данных перестал работать. Логи метрикбита, слушающего kube-state-metrics, показывают кучу однотипных предупреждений и ошибок:

# kubectl -n kube-system logs metricbeat-655fb5c85f-4zxqp 
...
2019-11-07T11:24:41.356Z        ERROR   [kubernetes.state_deployment]   state_deployment/state_deployment.go:98 error making http request: Get http://kube-state-metrics:8080/metrics: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
2019-11-07T11:24:41.357Z        WARN    transport/tcp.go:53     DNS lookup failure "kube-state-metrics": lookup kube-state-metrics on 10.96.0.10:53: read udp 172.30.200.5:36826->10.96.0.10:53: i/o timeout
...

(На всякий случай: metricbeat 7.4.* не использую из-за ошибок с правами, а образа для 7.5 пока нет.)

Сам kube-state-metrics работает, вроде, нормально:

# kubectl -n kube-system logs kube-state-metrics-5458dddb44-nkzgt
I1107 10:19:08.608278       1 main.go:86] Using default collectors
I1107 10:19:08.608328       1 main.go:98] Using all namespace
I1107 10:19:08.608338       1 main.go:139] metric white-blacklisting: blacklisting the following items:
W1107 10:19:08.608371       1 client_config.go:541] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I1107 10:19:08.609575       1 main.go:184] Testing communication with server
I1107 10:19:08.615311       1 main.go:189] Running with Kubernetes cluster version: v1.14. git version: v1.14.3. git tree state: clean. commit: 5e53fd6bc17c0dec8434817e69b04a25d8ae0ff0. platform: linux/amd64
I1107 10:19:08.615644       1 main.go:191] Communication with server successful
I1107 10:19:08.615739       1 main.go:225] Starting metrics server: 0.0.0.0:8080
I1107 10:19:08.615901       1 metrics_handler.go:96] Autosharding disabled
I1107 10:19:08.616285       1 builder.go:144] Active collectors: certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,horizontalpodautoscalers,ingresses,jobs,limitranges,namespaces,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,secrets,services,statefulsets,storageclasses
I1107 10:19:08.616887       1 main.go:200] Starting kube-state-metrics self metrics server: 0.0.0.0:8081

Диагностика kube-dns, как описано в мануале: # for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done показывает ошибки сутки назад, но свежих ошибок нет.

Адреса coredns 10.244.0.13 и 10.244.0.10.

Что означает lookup kube-state-metrics on 10.96.0.10:53: read udp 172.30.200.5:36826->10.96.0.10:53: i/o timeout ?

172.30.200.5 — адрес ноды, на которой работают Metricbeat и kube-state-metrics. Куда и зачем он лезет? Ищет DNS там, где его нет?

Ответ: причина глюков — неверная информация в /run/flannel/subnet.env После восстановления старого файла, всё заработало.

 , ,

olegd ()

Как быстрее превратить текст в таблицу?

Есть таблица в текстовом файле, отформатированная пробелами. (~1000 строк и ~1000 столбцов.) Нужно превратить её в 2-мерный список. Сделал при помощи split() и splitlines(). Возник вопрос: как быстрее применить split() к результату splitlines()?

Можно заменять каждую строку на получаемый из неё список.

Можно создать пустой список и добавлять новые строки в него методом append().

Можно создать новый список через списковое включение (или как правильно называть list comprehension).

Ниже подсказали 4-й способ через map и lambda.

Решил померить:

#!/usr/bin/python3
from sys import argv
import time

replace, append, combine = 0.0, 0.0, 0.0

cycles = 20

for fil in argv[1:]:
    ar = open( fil, 'rt' ).read()

    for lcv in range(cycles):
        lines = ar.splitlines()
        t0 = time.perf_counter()
        for line in range(len(lines)):
            lines[line] = lines[line].split();
        t1 = time.perf_counter()
        replace += t1-t0
    
        lines = ar.splitlines()
        t0 = time.perf_counter()
        lines2 = []
        for line in range(len(lines)):
            lines2.append( lines[line].split() );
        t1 = time.perf_counter()
        append += t1-t0
    
        #lines = ar.splitlines()
        t0 = time.perf_counter()
        lines2 = [ l.split() for l in lines ]
        t1 = time.perf_counter()
        combine += t1-t0

        #lines = ar.splitlines()
        t0 = time.perf_counter()
        lines2 = [*map(lambda x: x.split(), lines), ]
        t1 = time.perf_counter()
        lamb += t1-t0

    print( 'replace, append, combine, lambda :', 
        replace/cycles, append/cycles, combine/cycles, lamb/cycles,
        '100', append/replace*100, combine/replace*100, lamb/cycles*100 )

Результат неожиданный. При малом числе циклов 1-й способ на 5% медленнее 2-го и на 20% быстрее 3-го. При большом — 1-й на 10-15% быстрее и 2-го и 3-го. (4-й способ — между 1-м и 3-м, +10% на 1 цикле, +5% на 100.) Почему так происходит?

P.S. Вопрос не как радикально ускорить, а почему они так различаются и почему многократное повторение так меняет результат.

 

olegd ()

SQLite beat существует?

Как грузить в ElasticSearch данные из логов в SQLite? Только LogStash с плагином? Поискал в сети — жалуются, что ест много памяти и глючит плагин sqlite. А там сервера такие, что их filebeat вешал, если слишком часто директории сканировал.

На всякий случай: sqlbeat опрашивает сервера и не умеет читать файлы sqlite.

 

olegd ()

Нулевой автономер не обсуждали?

https://www.wired.com/story/null-license-plate-landed-one-hacker-ticket-hell/

Американец зарегистрировал автомобильный номер «NULL» в надежде, что процессинг проглючит и ему не смогут выписывать штрафы. Получилось наоборот — ему стали приходить штрафы за все нарушения, по которым в базе не было номера автомобиля.

Утверждает, что наштрафовали на 12 тысяч долларов. Хотя Wired подозревает его в преувеличении.

 ,

olegd ()

Как отключить PayPass?

Получил новую зарплатную карту в ПСБ. Обнаружил метку PayPass. Не хочу, чтобы в толпе с неё снимали деньги, поэтому потребовал карту без возможности бесконтакного снятия денег. От 3 разных сотрудников получил ответ, что больше такие не выпускаются, и заблокировать снятие через PayPass в их банке не могут.

По утверждениям 3 разных сотрудников банка, услугу ограничения снимаемой без пина суммы банк не предоставляет. Рекомендованный способ — держать деньги на другом счету и перед каждым платежом переводить деньги на карту через интернет-банк.

Поэтому вопрос: как вывести эту фичу из строя, не повредив магнитную ленту и чип? Просверлить антенну? Что-то ещё?

 , ,

olegd ()

Затык в туториале kubernetes — не виден прокси

Помогите!

Пытаюсь повторить действия из интерактивного туториала https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-inte... на своей ВМ. На подключении к запущеному контейнеру получаю отлуп.

Minikube и kubectl уже установлены.

$ minikube status
host: Stopped
kubelet:
apiserver:
kubectl:
$ minikube start
* minikube v1.2.0 on linux (amd64)
* Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
* Configuring environment for Kubernetes v1.15.0 on Docker 18.09.6
* Pulling images ...
* Launching Kubernetes ...
* Verifying: apiserver proxy etcd scheduler controller dns
* Done! kubectl is now configured to use "minikube"
$ kubectl get pods -o wide
No resources found.
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/kubernetes-bootcamp created
$ kubectl get pods -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-7b75749df7-55qd7   1/1     Running   0          27s   172.17.0.6   minikube   <none>           <none>
$ kubectl get deployments -o wide
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS            IMAGES                                         SELECTOR
kubernetes-bootcamp   1/1     1            1           41s   kubernetes-bootcamp   gcr.io/google-samples/kubernetes-bootcamp:v1   run=kubernetes-bootcamp
$ export POD_NAME=`kubectl get pods -o go-template --template '{{range.items}}{{.metadata.name}}{{"\n"}}{{end}}'`
$ echo $POD_NAME
kubernetes-bootcamp-7b75749df7-55qd7

В другом шелле запускаю прокси:

$ kubectl proxy
Starting to serve on 127.0.0.1:8001
В первом шелле пытаюсь подключиться:
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
Error: 'dial tcp 172.17.0.6:80: connect: connection refused'
Trying to reach: 'http://172.17.0.6/'

Что ещё нужно сделать?

Дистрибутив Debian 10 (amd64).

P.S. Не связано ли это с тем, что контейнер пытается работать через 443 порт, а не 80-й?

P.P.S. Хотя

kubectl exec $POD_NAME curl localhost:8080
отрабатывает правильно.

P.P.P.S. На всякий случай: через expose deployment приложение доступно:

$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port=8080
service/kubernetes-bootcamp exposed
$ export NODE_PORT=`kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}'`
$ echo $NODE_PORT
30156
$ curl `minikube ip`:$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7b75749df7-55qd7 | v=1
Но вопрос причины отказа через прокси по-прежнему стоит.

 

olegd ()

Увидеть ВМ внутри ВМ

На хостовой машине стоит ОС Windows. В ней запущен VMware Player с Debian 9. Под Дебианом установлен Kubernetes. Он создаёт виртуальную машину VirtualBox, и открывает её как 192.168.99.100:32123.

Что нужно сделать, чтобы эту 192.168.99.100:32123 было видно в браузере, запущеном в хостовой Windows? iptables и netstat в Дебиане не установлены.

Сгодятся ссылки на документацию и правильное словосочетание для гугления.

 , , ,

olegd ()

RSS подписка на новые темы