LINUX.ORG.RU

Сообщения olegd

 

Логи WINE

Форум — General

Пишет ли Вайн логи куда-нибудь помимо консоли (stdout или stderr)? Виндовые программы при серьёзных ошибках могут создавать «Windows NT Events», которые потом видны в «Event Viewer». А где видно эти события в Вайне? Только в консоли, из которой запускается?

 

olegd
()

WINE и повышение привилегий

Форум — General

Некоторые виндовые программы требуются права админа для определённых операций и выводят диалог, в котором требуется нажать кнопку с символом Windows для подтверждения повышения привилегий (и иногда ввести логин-пароль админа). Такая фича появилась в Висте. Имхо, так гораздо лучше, чем постоянно работать под админом. Чаще всего это встречается в инсталляторах.

Но как объяснить такой программе, запускаемой под Вайном, что она уже имеет нужные права? Потому что у меня всё падает при попытке вывести этот диалог. Гугление по «wine elevate privileges», «wine elevate permissions» и подобному даёт только настоятельные рекомендации не запускать Вайн ни под рутом, ни под sudo. Всё правильно, но не то.

Существует ли способ обойти этот диалог?

Проблема оказалась в привязке к IE. Диалог не выводится.

 

olegd
()

Сетевой путь к заданному файлу

Форум — General

Имеется смонтированная сетевая директория. Samba или NFS. Существует ли простой как basename способ получить путь к файлу или директории в ней относительно сервера? (Помимо парсить скриптом вывод mount и сравнивать с заданным путём и $PWD.)

Пример:

$ mount | grep samba
//192.192.192.100/Data on /home/user1/samba type cifs (rw,relatime,vers=2.1,cache=strict,username= . . .
$ show_true_path ~/samba/user1/storage/
//192.192.192.100/Data/user1/storage/

Что-нибудь такое есть?

 , ,

olegd
()

Аналог «file version» из portable executable

Форум — Talks

У виндовых исполнимых файлов и библиотек в формате Portable Executable есть куча метаданных, например «file version». Существуют ли подобные записи для формата ELF?

Нашёл упоминания какого-то BuildID, но это хеш, который не позволяет по номеру оценить старшинство версий, и ссылки битые.

Кто-нибудь заморачивался хранить в исполнимом файле номер версии? Если да, можно ссылку на стандарт?

 ,

olegd
()

Неинформативное сообщение об ошибке

Форум — Talks

Пытаюсь на свежеустановленной Убунте 20.04 смонтровать виндовую шару. Получилось как здесь:

sudo mount -t cifs -o username=user //192.168.0.106/shared /home/user/point
mount: /home/user/point: cannot mount //192.168.0.106/shared read-only.

Угадайте, в чём была проблема?

Ответ: не установлен пакет cifs-utils.

 , ,

olegd
()

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

Форум — General

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

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

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

 , ,

olegd
()

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

Форум — Talks

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

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

 

olegd
()

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

Форум — Talks

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

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

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

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

 ,

olegd
()

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

Форум — Talks

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

 

olegd
()

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

Форум — Admin

Какая разница между 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
()

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

Форум — Admin

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

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

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

 

olegd
()

Сравнить XML

Форум — Development

Требуется написать скрипт (на внутрикорпоративном скриптовом языке) для сравнения 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 и экранирование символов

Форум — Development

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

 

olegd
()

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

Форум — Talks

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

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

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

 , ,

olegd
()

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

Форум — Development

Скрипт на 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 при выводе логов Докера

Форум — Admin

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

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

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

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

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

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

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

 ,

olegd
()

Jenkins и Samba

Форум — Admin

Понадобилось грузить файлы из Дженкинса на виндовый файловый сервер. Нашёлся специальный плагин для этого: 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 для непоследовательных коммитов

Форум — General

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

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
()

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

Форум — Admin

Есть кластер 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
()

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

Форум — Development

Есть таблица в текстовом файле, отформатированная пробелами. (~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
()

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