LINUX.ORG.RU

Сообщения 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 ()

Haproxy не запускается при загрузке сервера

Тестовая система из пяти виртуальных машин. На 192.168.56.147 Debian x86_64 GNU/Linux, на котором Haproxy слушает порт 7100.

После загрузки у службы haproxy статус failed. Но если запустить её командой «sudo systemctl start haproxy service», всё работает. Journalctl после загрузки пишет:

$ sudo journalctl | grep -i haproxy
Jun 26 16:00:43 debian systemd[1]: Starting HAProxy Load Balancer...
Jun 26 16:00:43 debian systemd[1]: Started HAProxy Load Balancer.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[293]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Jun 26 16:00:43 debian haproxy-systemd-wrapper[293]: Note: setting global.maxconn to 2000.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[293]: [ALERT] 176/160043 (296) : Starting frontend localnodes: cannot bind socket [192.168.56.147:7100]
Jun 26 16:00:43 debian haproxy-systemd-wrapper[293]: haproxy-systemd-wrapper: exit, haproxy RC=1
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Main process exited, code=exited, status=1/FAILURE
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Unit entered failed state.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Failed with result 'exit-code'.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Service hold-off time over, scheduling restart.
Jun 26 16:00:43 debian systemd[1]: Stopped HAProxy Load Balancer.
Jun 26 16:00:43 debian systemd[1]: Starting HAProxy Load Balancer...
Jun 26 16:00:43 debian systemd[1]: Started HAProxy Load Balancer.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[319]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Jun 26 16:00:43 debian haproxy-systemd-wrapper[319]: Note: setting global.maxconn to 2000.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[319]: [ALERT] 176/160043 (322) : Starting frontend localnodes: cannot bind socket [192.168.56.147:7100]
Jun 26 16:00:43 debian haproxy-systemd-wrapper[319]: haproxy-systemd-wrapper: exit, haproxy RC=1
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Main process exited, code=exited, status=1/FAILURE
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Unit entered failed state.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Failed with result 'exit-code'.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Service hold-off time over, scheduling restart.
Jun 26 16:00:43 debian systemd[1]: Stopped HAProxy Load Balancer.
Jun 26 16:00:43 debian systemd[1]: Starting HAProxy Load Balancer...
Jun 26 16:00:43 debian systemd[1]: Started HAProxy Load Balancer.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[352]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Jun 26 16:00:43 debian haproxy-systemd-wrapper[352]: Note: setting global.maxconn to 2000.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[352]: [ALERT] 176/160043 (355) : Starting frontend localnodes: cannot bind socket [192.168.56.147:7100]
Jun 26 16:00:43 debian haproxy-systemd-wrapper[352]: haproxy-systemd-wrapper: exit, haproxy RC=1
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Main process exited, code=exited, status=1/FAILURE
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Unit entered failed state.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Failed with result 'exit-code'.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Service hold-off time over, scheduling restart.
Jun 26 16:00:43 debian systemd[1]: Stopped HAProxy Load Balancer.
Jun 26 16:00:43 debian systemd[1]: Starting HAProxy Load Balancer...
Jun 26 16:00:43 debian systemd[1]: Started HAProxy Load Balancer.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[388]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Jun 26 16:00:43 debian haproxy-systemd-wrapper[388]: Note: setting global.maxconn to 2000.
Jun 26 16:00:43 debian haproxy-systemd-wrapper[388]: [ALERT] 176/160043 (391) : Starting frontend localnodes: cannot bind socket [192.168.56.147:7100]
Jun 26 16:00:43 debian haproxy-systemd-wrapper[388]: haproxy-systemd-wrapper: exit, haproxy RC=1
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Main process exited, code=exited, status=1/FAILURE
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Unit entered failed state.
Jun 26 16:00:43 debian systemd[1]: haproxy.service: Failed with result 'exit-code'.
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Service hold-off time over, scheduling restart.
Jun 26 16:00:44 debian systemd[1]: Stopped HAProxy Load Balancer.
Jun 26 16:00:44 debian systemd[1]: Starting HAProxy Load Balancer...
Jun 26 16:00:44 debian systemd[1]: Started HAProxy Load Balancer.
Jun 26 16:00:44 debian haproxy-systemd-wrapper[434]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Jun 26 16:00:44 debian haproxy-systemd-wrapper[434]: Note: setting global.maxconn to 2000.
Jun 26 16:00:44 debian haproxy-systemd-wrapper[434]: [ALERT] 176/160044 (435) : Starting frontend localnodes: cannot bind socket [192.168.56.147:7100]
Jun 26 16:00:44 debian haproxy-systemd-wrapper[434]: haproxy-systemd-wrapper: exit, haproxy RC=1
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Main process exited, code=exited, status=1/FAILURE
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Unit entered failed state.
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Failed with result 'exit-code'.
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Service hold-off time over, scheduling restart.
Jun 26 16:00:44 debian systemd[1]: Stopped HAProxy Load Balancer.
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Start request repeated too quickly.
Jun 26 16:00:44 debian systemd[1]: Failed to start HAProxy Load Balancer.
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Unit entered failed state.
Jun 26 16:00:44 debian systemd[1]: haproxy.service: Failed with result 'exit-code'.

Конфиг:

$ cat /etc/haproxy/haproxy.cfg
global
        debug

frontend localnodes
        bind 192.168.56.147:7100
        mode tcp
        default_backend nodes
        timeout client          1m
        acl block_1 src 192.168.56.1
        acl block_2 src 192.168.56.149

        use_backend ls1 if block_1
        use_backend ls2 if block_2

backend ls1
        mode tcp
        balance roundrobin
        server mytestweb1 192.168.56.150:7189
        timeout connect        10s
        timeout server          1m

backend ls2
        mode tcp
        balance roundrobin
        server mytestweb2 192.168.56.151:7189
        timeout connect        10s
        timeout server          1m

backend nodes
        mode tcp
        balance roundrobin
        server web01 192.168.56.150:7189
        server web02 192.168.56.151:7189
        timeout connect        10s
        timeout server          1m

После запуска вручную journalctl показывает:

Jun 26 16:11:04 debian systemd[1]: Starting HAProxy Load Balancer...
Jun 26 16:11:04 debian systemd[1]: Started HAProxy Load Balancer.
Jun 26 16:11:04 debian haproxy-systemd-wrapper[677]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Jun 26 16:11:04 debian haproxy-systemd-wrapper[677]: Note: setting global.maxconn to 2000.

В чём проблема? Почему ошибка «cannot bind socket [192.168.56.147:7100]» возникает при автозагрузке и не возникает при ручном запуске?

Ответ: Haproxy запускается до того, как машина получает адрес по DHCP. Помогло сменить адрес на 0.0.0.0:

frontend localnodes
        bind 0.0.0.0:7100

Либо можно в /etc/systemd/system/multi-user.target.wants/haproxy.service в строку After добавить network-online.target

 , ,

olegd ()

Как быстро освоить Kubernetes?

Человеку требуется срочно освоить Kubernetes. Мой вариант «сразу приступить к работе, а на каждый затык гуглить Stackoverflow» его не устраивает. Есть что-либо быстрее, чем прочитать все доки и выполнить все упражнения с https://kubernetes.io/docs/home/ ?

 

olegd ()

Zork открыли

На Гитхаб выложили исходники текстовых игр Инфокома. Язык — их собственный Лисп, с <> вместо круглых скобок. С лицензией мутно, несвободные.

https://github.com/historicalsource/moonmist

https://www.opennet.ru/opennews/art.shtml?num=50525#49

Кому не лень — можете сделать новость.

Интересно, что там в комментариях пошла дискуссия о Лиспе, вспомнили лисп в <200 строк на Си: https://carld.github.io/2017/06/20/lisp-in-less-than-200-lines-of-c.html И дошло до дилеммы: если делать транслятор лиспа просто, в нём течёт память за счёт фрагментации, но если делать правильно, тратится на порядки больше памяти, чем в принципе может утечь.

 , ,

olegd ()

linux-talks@conference.jabber.ru

Что с ней? Вход по паролю, в публичных логах знакомых ников не видно, содержимое — унылые репосты с «Медузы». Угнали?

 

olegd ()

Jabber vs Slack (vs Skype vs GoToMeeting) для чайников

Шёл разговор: хотелось бы систему для переписки наподобие Slack, но на своём сервере. Возник вопрос: умеет ли Джаббер делать то же? Чаты — есть. Поднять свой сервер — можно. А как сейчас с другими фичами?

Есть ли работоспособные веб-клиенты для Джаббера?

Как в нём с голосовой связью?

С передачей видео?

Самое главное: как долго хранятся логи чатов и есть ли поиск по ним?

И дополнительно: что такое Cisco Jabber, и связан ли он с тем Джаббером, который на XMPP?

 ,

olegd ()

Чем опасен http.server?

Если срочно нужен веб-сервер, можно запустить

python3 -m http.server 80
и он будет раздавать файлы из текущей директории. Но во всех мануалах предупреждают, что его ни в коем случае нельзя использовать в продакшене.

Вопрос: а чем он так плох? Что может при желании сделать злоумышленник с системой, на которой запущен этот сервер?

 , ,

olegd ()

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