LINUX.ORG.RU

Сообщения vitalyisaev2

 

Go: особенности работы рантайма во время вызова дорогих syscall

 ,

Всем привет. Буду благодарен, если кто-то сможет прояснить, как именно ведёт себя рантайм Go при выполнении медленных сисколлов. Представим, что есть приложение, которое выполняет интенсивную работу с ФС (создаёт, пишет, синкает файлы). По очевидным причинам вызов syscall.Fsync достаточно дорогой: на какое-то время вызывающая горутина будет заблокирована. Вопрос в том, продолжат ли остальные горутины работать? Или любое переключение в контекст ядра останавливает весь рантайм?

Иными словами, имеет ли смысл применять многопоточность для ввода на диск? Пример:

package main

import (
	"log"
	"os"
	"sync"
)

var data = []byte("Some big data")

func worker(filenameChan chan string, wg *sync.WaitGroup) {
	defer wg.Done()
	for {
		filename, ok := <-filenameChan
		if !ok {
			return
		}

		f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY, os.FileMode(0644))
		if err != nil {
			log.Fatal(err)
			continue
		}

		if _, err := f.Write(data); err != nil {
			log.Fatal(err)
			continue
		}

		if err := f.Sync(); err != nil {
			log.Fatal(err)
			continue
		}

		if err := f.Close(); err != nil {
			log.Fatal(err)
		}
	}
}

func main() {

	// Launch workers
	filenameChan := make(chan string)
	wg := &sync.WaitGroup{}
	for i := 0; i < 2; i++ {
		wg.Add(1)
		go worker(filenameChan, wg)
	}

	// Send tasks to workers
	filenames := []string{
		"1.txt",
		"2.txt",
		"3.txt",
		"4.txt",
		"5.txt",
	}
	for i := range filenames {
		filenameChan <- filenames[i]
	}
	close(filenameChan)

	wg.Wait()
}

Спасибо всем за помощь.

vitalyisaev2
()

nslookup ресолвит хост, а ping - нет

 ,

Всем привет. Я пытался настроить локалхост (Ubuntu 14.10) на работу с одним из сервисов оркестрации, работающих по протоколу DNS (в моём случае это Consul на 10.241.232.14:8600). Для этого добавил в уже имеющийся dnsmasq дополнительную настройку, после чего перезапустил сервис:

$ cat /etc/dnsmasq.d/10-consul 
server=/service.search.km./10.241.232.14#8600

Пытаюсь подсоединиться к jenkins-deb-builder.service.search.km - это сервис, который ресолвится DNS'ом, установленным на Consul. В результате столкнулся с неожиданной ситуацией, когда dns работает:

$ host jenkins-deb-builder.service.search.km
jenkins-deb-builder.service.search.km is an alias for mailtest-4.dev.search.km.

$ nslookup jenkins-deb-builder.service.search.km
Server:		127.0.0.1
Address:	127.0.0.1#53

jenkins-deb-builder.service.search.km	canonical name = mailtest-4.dev.search.km.

$ dig @localhost jenkins-deb-builder.service.search.km

; <<>> DiG 9.9.5-4.3ubuntu0.2-Ubuntu <<>> @localhost jenkins-deb-builder.service.search.km
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32618
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;jenkins-deb-builder.service.search.km. IN A

;; ANSWER SECTION:
jenkins-deb-builder.service.search.km. 0 IN CNAME mailtest-4.dev.search.km.

;; Query time: 25 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jun 23 19:49:45 MSK 2015
;; MSG SIZE  rcvd: 130

А пинг и вообще любые другие сетевые обращения - нет:

$ ping jenkins-deb-builder.service.search.km
ping: unknown host jenkins-deb-builder.service.search.km

$ curl http://jenkins-deb-builder.service.search.km:8082
curl: (6) Could not resolve host: jenkins-deb-builder.service.search.km

Ниже привожу свои конфиги (nsswitch немного исправлял, поскольку гугл указывал на возможные проблемы с avahi):

$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search int.pv.km srv.pv.km dev.ix.km search.km ix.km srv.search.km

$ cat /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

# hosts:          files mdns4_minimal [NOTFOUND=return] dns
hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Для пущей полноты картины - фрагмент трассировки пинга, где видно, что он почему-то пишет в дескриптор неполное имя хоста...

$ strace ping jenkins-deb-builder.service.consul 
...
stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=239, ...}) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\364\25\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 52, MSG_NOSIGNAL, NULL, 0) = 52
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [127])               = 0
recvfrom(3, "\364\25\201\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 127
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\220P\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [112])               = 0
recvfrom(3, "\220P\205\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 112
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\354\274\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [118])               = 0
recvfrom(3, "\354\274\205\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 118
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\211\222\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [112])               = 0
recvfrom(3, "\211\222\205\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 112
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\2077\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [112])               = 0
recvfrom(3, "\2077\205\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 112
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\257b\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 58, MSG_NOSIGNAL, NULL, 0) = 58
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [108])               = 0
recvfrom(3, "\257b\205\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 108
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "L5\1\0\0\1\0\0\0\0\0\0\23jenkins-deb-builder"..., 66, MSG_NOSIGNAL, NULL, 0) = 66
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [116])               = 0
recvfrom(3, "L5\205\203\0\1\0\0\0\1\0\0\23jenkins-deb-builder"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 116
close(3)                                = 0
write(2, "ping: unknown host jenkins-deb-b"..., 54ping: unknown host jenkins-deb-builder.service.consul
) = 54
exit_group(2)                           = ?
+++ exited with 2 +++

Я не могу понять, как вообще устроен ping, как он ресолвит имена? Nscd на машине не установлен. Если кто может что подсказать, буду благодарен.

vitalyisaev2
()

Архитектура веб-приложения - фронтенда к системе сборки

 , , ,

Я занимался ИБ, машинным обучением и немного бэкенд-разработкой, неплохо знаю Python, а вот в Javascript знания нулевые. Сейчас пришла задача из новой для меня области - сделать полноценный веб-интерфейс к самописной системе сборки (в состав системы входят репозитории с исходниками и бинарными пакетами, lxc контейнеры и другие элементы).

Сайт должен сочетать функции управления и мониторинга. На нём, как минимум, должны быть:

  • кнопка запуска сборки;
  • некоторый элемент интерфейса, отражающий этап процесса (текстовое окно с логами, прогресс бар, индикатор состояния);

Особенность процесса сборки пакетов и контейнеров - длительность вплоть до 10-20 минут, запуск и ветвление подпроцессов, частые изменения состояний (создать контейнер -> git clone -> установка зависимостей -> make -> создать пакет -> создать контейнер).

Хотел бы спросить у знатоков, как пишутся такие приложения? Какие функции надо переложить на фронтенд? Как хранить в бэкенде и передавать в браузер информацию об изменении состояния процессов. Какие выбрать фреймворки (c бэкендом всё ясно - Django или Flask), особенно в JS? Спасибо...

vitalyisaev2
()

Можно ли одновременно использовать планки RAM разных производителей

Докупил для домашнего компьютера (Fedora 20, ядро 3.16.2, материнская плата Gigabyte GA-H77-D3H) оперативную память: старая была Kingston HyperX KHX16C9B1BK2/8X 2х4 Гб, а новая - Corsair Vengeance CMZ16GX3M2A1600C10R 2х8 Гб.

Поскольку плата поддерживает до 32Гб в 4 слота, хотелось бы оставить и то, и другое. Формально основные характеристики у обоих изделий одинаковые - частота 1600 Мгц. Однако терзают смутные сомнения, можно ли их держать вместе? После покупки сделал бенчмарк памяти pmbw, особой разницы не увидел, кроме того, что Corsair в тестах по latency обгоняет Kingston где-то на 10%.

Результаты тестов:

Спасибо.

vitalyisaev2
()

Fedora 20 перестала загружаться

 

Внезапно на десктопе перестала загружаться Fedora 20 (ядро 3.16.2-200). Нормально грузится до момента появления окна логина, но в последний момент мониторы неожиданно переходят в спящий режим. В этом состоянии система продолжает работать, но зайти на неё нельзя никак - не работают комбинации Ctrl+Alt+F? для вызова виртуальной консоли и не работает ssh (спрашивает пароль, печатает сообщение о последнем логине и зависает).

Вчера произвел апгрейд компа, после которого ВСЕ РАБОТАЛО (как минимум две успешные загрузки):

  • Поменял оперативную память на CORSAIR Vengeance CMZ16GX3M2A1600C10R DDR3-2x 8Гб 1600 (материнская плата GIGABYTE GA-H77-D3H);
  • Поставил второй монитор;
  • Беспроводная клавиатура Genius;

В безопасном режиме консоль загружается. Подскажите, как диагностировать проблему? Спасибо

vitalyisaev2
()

Как организовать тестирование и сборку ПО

 

Всем привет. Прошу совета по организации процесса тестирования и сборки пакетов для небольшого клиент-серверного приложения на Python.

У нас небольшая группа (3 человека), параллельно разрабатываются 3-4 ветки. Разработка и тестирование организована на виртуалках в системе oVirt, дистрибутив - производный от RHEL 6. Репозиторий кода организован на Git в Redmine, репозиторий пакетов - ftp-сервер на одной из машин.

Процесс разработки организован следующим образом:

  • Разработчик вносит изменения в код;
  • Собирает локально на своей машине пакет со своей веткой и обновляет репозиторий пакетов;
  • Откатывает тестовые ВМ до «чистых» снепшотов и перезагружает их;
  • Устанавливает на соответствующие ВМ клиентский и серверный пакеты;
    yum clean all
    yum install <package>-<ver>-<release>.<branch>.noarch.rpm
    
  • Запускает программы;
  • На ВМ заранее клонирован репозиторий с кодом, поэтому, если возникают ошибки, разработчик-тестер делает:
    cd ~/<проект>
    git fetch origin
    git checkout <нужная ветка>
    cd /usr/lib/python2.6/site-packages/<проект>
    rm -rf <проблемный модуль>.py*
    ln -s ~/<проект>/<проблемный модуль>
    vim ~/<проект>/<проблемный модуль>
    
  • Начинает редактировать исходники на тестовой машине и снова всё перепроверять, если ошибка найдена - коммитить;

Так повторяется до 4-5 раз в день, в зависимости от фазы цикла (написание кода или отладка кода). На каждую итерацию тратится до 15 минут - накладные расходы.

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

vitalyisaev2
()

Выбор структуры данных для матрицы принятия решений

 , ,

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

В частности, в программу подаются строки, которые сопоставляются с регулярными выражениями, в случае совпадения строки с регулярным выражением вызывается функция. В линейном случае (одного аргумента - паттерна boost::regex) напрашивается структура типа key-value, например так:

typedef std::map<boost::regex, boost::function<void(void)> > regex_callback;

void SuOpenedCallback()
{
}

void SuClosedCallback()
{
}


int main(int argc, char** argv)
{
    //Регулярные выражения для сопоставления
    boost::regex su_opened  ("some_regexp_1"); 
    boost::regex su_closed  ("some_regexp_2"); 

    //Структура данных, хранящая коллбеки
    regex_callback resolver = boost::assign::map_list_of
        (su_opened, boost::bind(&SuOpenedCallback))
        (su_closed, boost::bind(&SuClosedCallback));

    std::string line("some_part_of_/var/log/secure");
    boost::smatch result; 
    
    BOOST_FOREACH(const auto& pair, resolver)
    {
        if(boost::regex_match(line, result, pair.first)
        {
             pair.second();
             break;
        } 
    } 
}

Мой вопрос относительно случая, когда аргументов будет много (не только один boost::regex):

  • Существует ли в С++ типовое решение для структуры типа multiple_keys-value и как там осуществляется перебор ключей? Или же надо писать свой класс, состоящий из нескольких аргументов, и подставлять его в key?
  • Есть ли вообще какие-то шаблоны для такой «многофакторной» матрицы решений?

Благодарю.

vitalyisaev2
()

Как не дать пользователю запускать свои программы?

 ,

Я изучил соответствующий раздел FAQ, однако возникает ряд вопросов.

В частности, что делать, когда пользователь подключает флешку? У меня в RHEL 6 почему-то все файлы, находящиеся на флешке (FAТ), имеют бит на исполнение. Причем монтирование флешки осуществляется не в $HOME. Как монтировать внешние носители с noexec по умолчанию?

И таких тупиков проглядывается довольно много.

В идеале хотелось бы задать в ОС список разрешённых для пользователя программ (иксы, офис, браузер, м.б. что-то ещё), а всё остальное запретить по умолчанию. Возможно ли это? Например, средствами SELinux? Спасибо

vitalyisaev2
()

Не могу зайти из Москвы на американский правительственный сайт

 ,

Для диссертации нужно скачать американские статистические сборники с сайта http://censtats.census.gov/. Но почему-то из Москвы на сайт не могу попасть, хотя точно знаю, что из Финляндии он в данный момент доступен (друзья только что проверяли).

Трассировка прекращается на сервере 129.250.8.158, который принадлежит компании NTT America (видимо, это крупнейший американский провайдер) и расположен в штате Колорадо:

traceroute to 148.129.75.154 (148.129.75.154), 30 hops max, 60 byte packets
 1  192.168.0.1 (192.168.0.1)  1.094 ms  1.355 ms  2.375 ms
 2  inside.yaol.ru (10.10.173.1)  10.554 ms  10.908 ms  11.093 ms
 3  inside.yaol.ru (172.17.17.75)  11.023 ms  10.528 ms  11.084 ms
 4  inside.yaol.ru (94.158.162.1)  11.235 ms  11.193 ms  11.328 ms
 5  yaol-uni-lgw.cen.medi-a.ru (77.246.97.9)  11.471 ms  12.285 ms  11.366 ms
 6  ae6-290.RT.M9.MSK.RU.retn.net (87.245.255.109)  12.391 ms  3.674 ms  11.328 ms
 7  * ae6-3.RT.IRX.FKT.DE.retn.net (87.245.233.198)  55.612 ms  57.298 ms
 8  213.198.77.213 (213.198.77.213)  57.675 ms  59.552 ms  59.668 ms
 9  * * ae-5.r21.frnkge03.de.bb.gin.ntt.net (129.250.4.162)  62.284 ms
10  ae-3.r23.nycmny01.us.bb.gin.ntt.net (129.250.3.180)  146.943 ms  147.020 ms *
11  ae-13.r05.nycmny01.us.bb.gin.ntt.net (129.250.4.166)  152.661 ms ae-1.r05.nycmny01.us.bb.gin.ntt.net (129.250.4.69)  147.317 ms  155.068 ms
12  ae-0.centurylink.nycmny01.us.bb.gin.ntt.net (129.250.8.158)  144.404 ms  162.644 ms  143.947 ms
13  * * *
14  * * *
15  * * *

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

vitalyisaev2
()

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

 , , ,

Всем привет... мучают два вопроса, по которым Гугл сходу не дал ответа.

1. Существует ли в RHEL дистрибутивах нормальный инструмент для определения пакетов, в которых нуждается бинарник? yum-builddeps требует src.rpm, а у меня есть только скомпилированный и слинкованный из проекта на моей (разработчика) машине исполняемый файл;

2. Как я могу узнать, какие библиотеки требуются для компиляции проекта? В первую очередь, я имею ввиду *-devel.rpm.

Всё это нужно мне, чтобы заполнить Required и BuildRequired поля в spec.

Для первой проблемы написал скрипт, построенный на парсинге команд ldd и rpm -q --whatprovides. По второй проблеме - непонятно.

Может, есть какие-то цивилизованные инструменты? Спасибо

vitalyisaev2
()

Газета.ру: «Вирус скорости»(с)

http://www.gazeta.ru/auto/2014/01/13_a_5845877.shtml

По данным «Газеты.Ru», ни одна из установленных в Подмосковье камер ГИБДД «Стрелка-СТ» не работает. Более 100 комплексов вывел из строя загадочный вирус, парализовавший работу всей системы в ночь с 9 на 10 января.

...

«После углубленной диагностики термостатированных компьютеров комплекса «Стрелка-СТ» было установлено:

— в результате намеренного взлома системы была повреждена файловая система блоков обработки и управления комплексов «Стрелка-СТ», что делает невозможным запуск операционной системы Windows XP и специализированного программного обеспечения комплексов;

— повреждены системные журналы операционной системы; на системном диске С:

— найден инородный вредоносный пакетный файл 222.bat, настроенный для автоматического изменения пароля операционной системы и запуска исполняемого файла 1.exe;

— изменены пароли на доступ в операционную систему с правами администратора.

Причиной неработоспособности комплексов является умышленный взлом операционной системы неизвестными лицами».

vitalyisaev2
()

Проблемы c clvmd при разворачивании RHEV Cluster

 , ,

Настраиваем HA-LVM Failover (CLVM). Успешно проходим все стадии:


1. vgchange -cy RHEVMVolGroup

2. lvmconf --enable-cluster

3. dracut...

4. reboot

Однако служба clvmd не стартует:

5. service clvmd restart

Вот что сыпется в /var/log/messages:

clvmd could not connect to cluster manager
Can't open cluster manager socket: No such file or directory

Команда strace -f clvmd показывает, что служба не может подцепить какие-то сокеты:

connect(.../var/run/cman_client...) (No such file or directory)
corosync.ipc (Connection refused)

Наконец, pvs выдаёт следующее:

connect () failed on local socket:
internal cluster lockage initialization failed

Никто с подобным не сталкивался? Спасибо

vitalyisaev2
()

Централизованный сбор логов auditd + RPC

 , , ,

Привет, ЛОР. Посоветуйте, как можно было бы спроектировать приложение для сети из 10 - 100 АРМ с ОС Linux, которое собирало бы логи auditd с машин и кидало их на один сервер?

Проблема в том, что логов этих очень много. Правило будет что-то вроде:

auditctl -a exit,always -F arch=b64 -S open -S execve -S fchmodat -S fchownat -S exit -S exit_group 
В стандартной конфигурации auditd набегает около 100 Мб логов в час или около 1Гб за рабочий день.

Поэтому нужно сделать:

1. Клиентскую часть, которая будет парсить логи и вытаскивать из них нужную информацию (приблизительно около 25% от исходного объёма лога);

2. Серверную часть, которая способна держать такую нагрузку с указанного количества машин;

3. SSL-шифрование;

4. Элементарный RPC, подразумевающий определённую реакцию сервера на приход тех или иных событий из локальных логов, в том числе - возможность ответа сервера клиенту по такому же каналу.

Требование заказчика - только С или С++. Вопрос - какие существует подходы для разработки таких программ? Может быть, есть что-то готовое? Если нет, то какие применяются обычно либы/фреймфорки? Какой выбрать протокол сообщений? (protobuf пробовал, не подходит)

Спасибо

vitalyisaev2
()

Astra Linux Special Edition - выпилены интерпретируемые языки? языки с JIT-компиляцией?

 , ,

Смутило следующее сообщение на сайте сабжа:

Обновленная система ALD (Astra Linux Directory) более не использует сценариев на языке Perl. Реализована модульная расширяемая архитектура на языке C++, предоставляющая программный интерфейс для разработки потребителями для своих расширений.

Получается, что в лицензированной ФСБ версии системы нет интерпретируемых языков? На сайте не упоминается bash, Python и Java. Perl выпилили из службы каталогов. Если кто-то с ней работал, скажите, это так или нет?

vitalyisaev2
()

Как добавить скрипт в initramfs RedHat 6.4?

 , ,

Возможно, я косноязычно выражусь, но мне надо заставить auditd работать во время загрузки ОС RedHat, чтобы понять, какие вообще файлы используются системой в процессы загрузки Здесь - обсуждение вопроса

Мне посоветовали на уровне initramfs выполнить следующую команду:

auditctl -a exit,always -S open,openat,creat,execve

И вот я распаковал файл /boot/initramfs-2.6.32-358.el6.x86_64.img (кстати, здесь же рядом - какой-то /boot/initrd-2.6.32-358.el6.x86_64kdump.img - какой из них именно используется для загрузки?). На выходе получил папку с некоей файловой системой, в корне лежит shell файл init. Куда именно мне можно добавить приведённую выше строчку? Спасибо.

vitalyisaev2
()

Две версии библиотек qt на одной системе

Уважаемые коллеги, как заставить библиотеки qt двух разных версий (4.6 и 4.8) ужиться на одной ОС?

Мы вынуждены использовать RHEL 6.4. По умолчанию с ним идёт Qt 4.6.2. Необходимо поставить на него софт, слинкованный с Qt 4.8.x. Проблема в том, что софт проприетарный, ставится из пакетов. Исходников для него, чтобы попытаться скомпилироваться с 4.6.2, нет. Соответственно нет возможности изучить вопрос о совместимости этого софта и старой библиотеки.

Если сделать objdump любого бинарника, использующего Qt, то в разделе Dynamic Section будут записи библиотек без указания версий... Типа:

...
NEEDED     libQtGui.so.4
...

Поэтому, я так понимаю, разведение одноименных библиотек с разными версиями по разным папкам не поможет? Это были мысли вслух Спасибо...

vitalyisaev2
()

Как узнать username или uid по IP удалённого хоста?

 , ,

Здравствуйте.

У нас сеть состоит из множества тонких клиентов с файловой системой read only. Пользователи работают на виртуальных машинах. Аутентификация двойная - сначала на тонком клиенте, затем в системе виртуализации. IP статические. ОС - RHEL 6.4. Задача - отображать IP тонких клиентов в username залогинившегося пользователя и наоборот. И периодически обновлять матрицу соответствия.

Есть некоторые идеи...

1. Попытаться заставить терминальный сервер (раздаёт образы ОС и поддерживает DHCP) вести логи с указанием username/uid. Написать демон, который будет отслеживать обновление лога и обновлять матрицу.

2. Смонтировать образ OC так, чтобы на все клиенты ушёл один и тот же публичный ключ, затем опять же написать демон, который будет заходит по SSH на все клиенты и там вызывать who.

3. Периодически опрашивать клиенты по SNMP. Якобы версия SNMPv3 позволяет запросить username (или это не тот username? :)

Как обычно, хотелось бы выбрать наименее трудоёмкий путь. Из языков лучше Python, менее предпочтительны C++, bash. Спасибо.

vitalyisaev2
()

gtk_message_dialog: некорректное закрытие

Здравствуйте! Ниже приведён фрагмент кода, выводящего окошко gtk_message_dialog:

#include <gtk/gtk.h>

int main(int argc, char** argv)
{
  gtk_init(&argc, &argv);

  GtkWidget* dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, 
                                     GTK_MESSAGE_ERROR, 
                                     GTK_BUTTONS_CLOSE, 
                                     "Error loading file", NULL);
  g_signal_connect(dialog, "response", G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(GTK_WIDGET(dialog));

  gtk_main();
  gtk_widget_destroy(dialog);

  return 0;
}

Вышедшее окно корректно закрывается по нажатию на кнопку CLOSE, но при нажатии на крестик в верхнем углу выдаёт ошибку:

Gtk-CRITICAL **: gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)' failed
Ошибка не исчезает при попытке повесить ещё один обработчик типа
g_signal_connect(dialog, "destroy", G_CALLBACK(gtk_main_quit), NULL);

Как сделать корректное закрытие по крестику?

vitalyisaev2
()