Настраиваем стек ELK для централизованного хранения журналов Сергей Яремчук $ sudo apt-get install apt-transport-https $ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - $ echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list $ sudo apt-get update && sudo apt-get install filebeat $ sudo systemctl enable filebeat filebeat.prospectors: - type: log paths: - /var/log/messages - /var/log/*.log include_lines: ['^ERR', '^WARN'] exclude_lines: ['^OK'] - input_type: log paths: - /var/log/nginx/error.log fields: log_type: nginx_error output: logstash: hosts: ['logstash.host:5044'] output: logstash: hosts: ['logstash.host:5044'] tls: certificate_authorities: ['/etc/ssl/logstash/log.crt'] ssl: enabled: true verification_mode: none supported_protocols: [TLSv1.0, TLSv1.1, TLSv1.2] logging: files: rotateeverybytes: 10485760 $ filebeat.sh -configtest -e $ sudo systemctl start filebeat $ sudo systemctl status filebeat $ curl -XPUT 'http://localhost:9200/_template/filebeat' -d@/etc/filebeat/filebeat.template.json {"acknowledged":true} $ sudo apt install logstash $ sudo systemctl enable logstash $ /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }' pipeline.batch.size: 125 pipeline.batch.delay: 5 $ /usr/share/logstash/bin/logstash-plugin list $ /usr/share/logstash/bin/logstash-plugin list --group input $ /usr/share/logstash/bin/logstash-plugin update $ /usr/share/logstash/bin/logstash-plugin install logstash-input-http --no-verify $ sudo nano /etc/logstash/conf.d/01-input.conf input { input { beats { port => 5044 ssl => true ssl_certificate => "/etc/ssl/logstash/logstash.crt" ssl_key => "/etc/ssl/logstash/logstash.key" } } input { file { path => "/var/log/nginx/*.log" } } $ sudo nano /etc/logstash/conf.d/02-output.conf output { elasticsearch { hosts => ["localhost:9200"] } } $ sudo nano /etc/logstash/conf.d/03-nginx-error.conf filter { if [type] == "nginx_error" { grok { match => { "message" => "(?%{YEAR}[./] %{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage},\ client: %{IP:client}, server: \$domain, request: \"%{WORD:method} %{URIPATH:path}\"" } } } } patterns_dir => ["./patterns"] $ sudo service logstash restart $ tail -f /var/log/logstash/logstash-plain.log $ sudo apt install elasticsearch $ sudo systemctl enable elasticsearch $ sudo systemctl start elasticsearch $ curl localhost:9200 { "name" : "XBzHrYa", "cluster_name" : "elasticsearch", "cluster_uuid" : "48m0tuBHR0Cas8AI0iYupA", "version" : { "number" : "5.6.6", "build_hash" : "7d99d36", "build_date" : "2018-01-09T23:55:47.880Z", "build_snapshot" : false, "lucene_version" : "6.6.1" }, "tagline" : "You Know, for Search" } $ sudo nano /etc/elasticsearch/elasticsearch.yml #network.host: 192.168.1.2 #http.port: 9200 $ curl 'localhost:9200/_cat/indices?v' $ curl -XDELETE 'localhost:9200/filebeat-2018.01.01?pretty' $ apt install elasticsearch-curator $ sudo vi /etc/curator/delete_indices.yml --- actions: 1: action: delete_indices description: >- Delete indices older than 90 days (based on index name), for logstash- and filebeat- prefixed indices. options: ignore_empty_list: True timeout_override: continue_if_exception: False disable_action: False filters: - filtertype: pattern kind: regex value: '^(logstash-|filebeat-).*$' exclude: - filtertype: age source: name direction: older timestring: '%Y.%m.%d' unit: days unit_count: 90 exclude: 0 1 * * * /usr/bin/curator --config /etc/curator/curator.yml /etc/curator/delete_indices.yml 2>/tmp/cron_errors/curator_indices.cron_err $ sudo apt-get install kibana $ sudo systemctl enable kibana $ sudo systemctl start kibana ----------------------------------------------------------------------------------------- Инфраструктура открытых ключей в Windows Server 2016. Часть 1. Предварительный этап Леонид Шапиро [PolicyStatementExtension] Policies=InternalPolicy [InternalPolicy] OID=1.2.3.4.1455.67.89.5 Notice="Legal Policy Statement" URL=http://pki.nwtraders.msft/PKI/cps.txt [EnhancedKeyUsageExtension] OID = 1.3.6.1.5.5.7.3.2 ; Client Authentication OID = 1.3.6.1.5.5.7.3.1 ; Server Authentication OID = 1.3.6.1.5.5.7.3.4 ; Secure Email [BasicConstraintsExtension] Pathlength=1 [BasicConstraintsExtension] Pathlength=0 certsrv_server [Version] Signature="$Windows NT$" [PolicyStatementExtension] Policies=InternalPolicy [InternalPolicy] OID=1.2.3.4.1455.67.89.5 Notice="Legal Policy Statement" URL=http://pki.nwtraders.msft/PKI/cps.txt [BasicConstraintsExtension] Pathlength=1 [certsrv_server] RenewalKeyLength=4096 RenewalValidityPeriodUnits=20 RenewalValidityPeriod=Years CRLPeriodUnits=26 CRLPeriod=Weeks CRLOverlapUnits=2 CRLOverlapPeriod=Weeks CRLDeltaPeriodUnits=0 CRLDeltaPeriod=Hours LoadDefaultTemplates=0 AlternateSignatureAlgorithm=1 [Version] Signature="$Windows NT$" [PolicyStatementExtension] Policies=InternalPolicy [InternalPolicy] OID=1.2.3.4.1455.67.89.5 URL=http://pki.nwtraders.msft/PKI/cps.txt [certsrv_server] RenewalKeyLength=2048 RenewalValidityPeriodUnits=5 RenewalValidityPeriod=Years CRLPeriodUnits=1 CRLPeriod=Weeks CRLOverlapUnits=1 CRLOverlapPeriod=Days CRLDeltaPeriodUnits=1 CRLDeltaPeriod=Days LoadDefaultTemplates=0 AlternateSignatureAlgorithm=1 ----------------------------------------------------------------------------------------- Работа с MS SharePoint 2016 Часть 3. Поиск файлов Сергей Болдин
ПОИСК
Поиск документов
и
медиа файлов
Перейти
#sideNavBox {display: none;} #suiteBarTop {display: none !important;} Листинг 1. Скрытие панели для пользователей ----------------------------------------------------------------------------------------- Добавляем в веб-проект аналитику и интеллект на базе Apache Spark Александр Календарев bin/pyspar spark-class org.apache.spark.deploy.master.Master val textFile = sc.textFile("/home/data/in.txt") val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("/home/data/out.txt") ----------------------------------------------------------------------------------------- Извлечение информации из HTML-страниц средствами PHP Игорь Орещенков $P = strpos ($S, $C); $L = strlen ($S); $P = 0; while ($P < $L and $S{$P} != $C): $P++; endwhile; $P = $P < $L? $P: FALSE; if ($l === FALSE): $l = strlen ($s); endif; Array ( [pos] => позиция начала тега [len] => длина тега [name] => имя тега (соответствует одному из элементов массива, переданного в качестве параметра $tags) [attr] => ассоциативный массив атрибутов тега в виде: Array ( [имя атрибута] => [значение атрибута] . . . ) ) $tagb = iaFindTagOneOf ($p, $html, 'div'); $tage = iaFindTagOneOf ($tagb, $html, '/div'); Листинг. Текст функции ExtractInfo (), извлекающей новостииз ленты на сайте function ExtractInfo (&$html) { $info = array (); $tags = array ( 'span' => array ('SPAN', 'span'), '/span' => array ('/SPAN’, '/span'), 'p' => array ('P', 'p'), '/p' => array ('/P’, '/p') ); $tage = FALSE; /* «Прыжок» к содержимому ленты новостей. */ $p = strpos ($html, '///Main Content///'); /* Цикл извлечения новостных блоков. */ $i = 0; do { /* Поиск заголовка новости. */ $tagb = iaFindTagOneOf $p, $html,$tags['span']); $tage = iaFindTagOneOf ($tagb, $html, $tags['/span']); /* Обработка заголовка новости. */ if (iaFoundTagAttr ($tagb, 'class') == 'blockTitle'): $s = iaFoundElementContent ($html, $tagb, $tage); if ($s !== FALSE): $s = trim (strip_tags ($s)); $info[] = "Title $i: [$s]"; endif; /* Поиск текста новости. */ $tagb = iaFindTagOneOf ($tage, $html, $tags['p']); $tage = iaFindTagOneOf ($tage, $html, $tags['/p']); /* Обработка текста новости. */ if ($tage !== FALSE): $s = iaFoundElementContent ($html, $tagb, $tage); if ($s !== FALSE): $s = trim (strip_tags ($s)); $info[] = "Content $i: [$s]"; endif; endif; endif; /* Определение позиции для продолжения разбора. */ $p = iaFoundTagAfterPos ($tage); $i++; } while ($p !== FALSE and $i < 10); return $info; } ----------------------------------------------------------------------------------------- Простейший рекурсивный алгоритм с возвратом и эвристикой в 1С на примере задачи о ходе коня Кирилл Ткаченко Перем N, NN; Перем dy, dx; Перем Доска; Перем КодСимволаA; Перем ЛучшийВесНач; Процедура Инициализация() Перем y, x; N = 8; NN = N * N; КодСимволаA = КодСимвола("a"); dy = Новый Массив(); dy.Добавить(2); dy.Добавить(1); dy.Добавить(-1); dy.Добавить(-2); dy.Добавить(-2); dy.Добавить(-1); dy.Добавить(1); dy.Добавить(2); dx = Новый Массив(); dx.Добавить(1); dx.Добавить(2); dx.Добавить(2); dx.Добавить(1); dx.Добавить(-1); dx.Добавить(-2); dx.Добавить(-2); dx.Добавить(-1); ЛучшийВесНач = (dy.Количество() + 1) * (dy.Количество() + 1); Доска = Новый Массив(N, N); Для y = 0 По N - 1 Цикл Для x = 0 По N - 1 Цикл Доска[y][x] = 0; КонецЦикла; КонецЦикла; КонецПроцедуры Процедура ПечатьДоски() Перем Рез; Перем y, x; Рез = ""; y = N - 1; Пока y >= 0 Цикл Рез = Рез + Строка(y + 1) + " "; Для x = 0 По N - 1 Цикл Рез = Рез + Прав(" " + Строка(Доска[y][x]), 4); КонецЦикла; Рез = Рез + "" ""; y = y - 1; КонецЦикла; Рез = Рез + " "; Для x = 0 По N - 1 Цикл Рез = Рез + " " + Символ(КодСимвола("a") + x); КонецЦикла; Сообщить(Рез); КонецПроцедуры Функция МожноХодить(y, x) Возврат (0 <= y) И (y < N) И (0 <= x) И (x < N) И (Доска[y][x] = 0); КонецФункции Функция ЛучшийХод(y, x) Перем ЛучшееНапр, ЛучшийВес; Перем Напр, Напр2, Вес; Перем ny, nx; ЛучшееНапр = -1; ЛучшийВес = ЛучшийВесНач; Для Напр = 0 По dy.Количество() - 1 Цикл ny = y + dy[Напр]; nx = x + dx[Напр]; Если МожноХодить(ny, nx) Тогда Вес = 0; Для Напр2 = 0 По dy. Количество() - 1 Цикл Если МожноХодить(ny + dy[Напр2], nx + dx[Напр2]) Тогда Вес = Вес + 1; КонецЕсли; КонецЦикла; Если Вес < ЛучшийВес Тогда ЛучшееНапр = Напр; ЛучшийВес = Вес; КонецЕсли; КонецЕсли; КонецЦикла; Возврат ЛучшееНапр; КонецФункции Функция Решить(Шаг, y, x) Перем Напр; Перем ny, nx; Если Шаг > NN Тогда Возврат Истина; КонецЕсли; Напр = ЛучшийХод(y, x); ny = y + dy[Напр]; nx = x + dx[Напр]; Если МожноХодить(ny, nx) Тогда Доска[ny][nx] = Шаг; Если Решить(Шаг + 1, ny, nx) Тогда Возврат Истина; Иначе Доска[ny][nx] = 0; КонецЕсли; КонецЕсли; Возврат Ложь; КонецФункции Процедура Главная() Инициализация(); Доска[0][0] = 1; Если Решить(2, 0, 0) Тогда ПечатьДоски(); Иначе Сообщить("Нет решений."); КонецЕсли; КонецПроцедуры Главная(); ----------------------------------------------------------------------------------------- Proxmox и OpenVPN Резервирование и безопасность виртуальной инфраструктуры Леонид Носов, Андрей Волков # /etc/init.d/drbd start # drbdadm create-md r0 # drbdadm up r0 # drbdadm -- --overwrite-data-of-peer primary r0 # drbdadm status # /etc/init.d/o2cb start # /etc/init.d/o2cb online # mount -t ocfs2 /dev/drbd0 /mnt # drbdadm primary r0 ----------------------------------------------------------------------------------------- Разработка системы электронного документооборота деканата Данила Шариков, Павел Поваляев def gen_spisok_dolgnikov(self, js, predmet, group, gen_date, type_pred, prepod, group_): gen_date = int((datetime(int(gen_date[2]), int(gen_date[1]), int(gen_date[0]), 0, 0) - datetime(1970, 1, 1)).total_seconds()) for y in xrange(0, len(js)): dolg_flag = False fio = js[y][u'ФИО'] if self.spisochnyi.check_student (fio_student = fio, group = group_): self.tryez['1'] = js[y][u'Оценки']['1'][u'Оценка'] self.tryez['2'] = js[y][u'Оценки']['2'][u'Оценка'] self.tryez['3'] = js[y][u'Оценки']['3'] [u'Оценка'] for z in xrange(1, 4): grade = js[y][u'Оценки'][str(z)][u'Оценка'] if grade in self.dolg and not grade == 'empty' or grade == 'empty' and z == 1 and not js[y][u'Оценки'][str(z)] [u'Дата'] == 'empty': try: dolg_date = js[y][u'Оценки'][str(z)] v[u'Дата'].split('.') dolg_date = int((datetime(int(dolg_date[2]), int(dolg_date[1]), int(dolg_date[0]), 0, 0) - datetime(1970, 1, 1)).total_seconds()) except: print predmet print group print str(js[y][u'Оценки'][str(z)][u'Дата']) if dolg_date <= gen_date: if not self.kaf[group] in self.js_dolgs[u'Должники']: self.js_dolgs[u'Должники'] [self.kaf[group]] = copy.deepcopy(json.loads(u'{}')) if not group in self.js_dolgs[u'Должники'] [self.kaf[group]]: self.js_dolgs[u'Должники'] [self.kaf[group]][group] = copy.deepcopy(json.loads(u'{}')) if not fio in self.js_dolgs[u'Должники'] [self.kaf[group]][group]: self.js_dolgs[u'Должники'] [self.kaf[group]][group][fio] = copy.deepcopy(json.loads(u'[]')) if dolg_flag == True: del self.js_dolgs[u'Должники'] [self.kaf [group]][group][fio][index] self.js_dolgs[u'Должники'][self.kaf[group]] [group][fio].append(copy.deepcopy(self.dolgs_part)) index = len(self.js_dolgs[u'Должники'][self.kaf[group]][group][fio]) - 1 self.js_dolgs[u'Должники'][self.kaf[group]][group][fio][index][u'Преподаватель'] = prepod self.js_dolgs[u'Должники'][self.kaf[group]][group][fio][index][u'Предмет'] = predmet self.js_dolgs[u'Должники'][self.kaf[group]][group][fio] [index][u'Тип'] = type_pred self.js_dolgs[u'Должники'][self.kaf[group]][group][fio][index][u'Попытки'] = copy.deepcopy(self.tryez) if self.tryez['1'] == '2' and self.tryez['2'] == '2' and self.tryez['3'] == '2': if fio not in self.js_dolgs[u'three_two']: self.js_dolgs[u'three_two'].append (fio) self.js_dolgs[u'Должники'][self.kaf[group]][group][fio] ↵ [index][u'group_id'] = js[y]['group_id'] if grade == u'н/я': self.js_dolgs[u'Должники'][self.kaf[group]][group][fio][index][u'Не явился'] = True dolg_flag = True else: dolg_flag = False else: if dolg_flag == True and not grade == 'empty': try: try_date = js[y][u'Оценки'][str(z)][u'Дата'].split('.') except: print u'Ошибка в дате!' print group print predmet print js[y][u'ФИО'], js[y][u'Оценки'][str(z)][u'Дата'] try: try_date = int((datetime(int(try_date[2]), int(try_date[1]), int(try_date[0]), 0, 0) - datetime(1970, 1, 1)). total_seconds()) except: print u'Ошибка в дате!' print group print predmet print js[y][u'ФИО'], js[y][u'Оценки'][str(z)][u'Дата'] #raw_input() if try_date <= gen_date: del self.js_dolgs [u'Должники'][self.kaf[group]][group][fio][index] if len(self.js_dolgs[u'Должники'][self.kaf[group]][group][fio]) == 0: del self.js_dolgs[u'Должники'][self.kaf[group]][group][fio] def grade_submit(self, js, group, prepod, period, predmet, file_path, group_id): type_p = {u'зачет' : u' з', u'экзамен' : u' э', u'дифф. зачет' : u' дз', u'курсовой проект' : u' кп', u'курсовая работа' : u' кр'} grade = {u'зач' : u'Зачтено', u'н/д' : u'Не аттестован', u'н/я' : u'Не явился', u'н/а' : u'Не аттестован', u'незач' :u'Не аттестован', u'2' : u'Неудовлетворительно', u'3' : u'Удовлетворительно', u'4' : u'Хорошо', u'5' : u'Отлично'} months = {u'01' : u'Январь', u'02' : u'Февраль', u'03' : u'Март', u'04' : u'Апрель', u'05' : u'Май', u'06' : u'Июнь', u'07' : u'Июль', u'08' : u'Август', u'09' : u'Сентябрь', u'10' : u'Октябрь', u'11' : u'Ноябрь', u'12' : u'Декабрь'} day = {'01' : '1', '02' : '2', '03' : '3', '04' : '4', '05' : '5', '06': '6', '07' : '7', '08' : '8', '09' : '9'} driver = webdriver.Firefox() print u'\nГруппа:', group print u'Предмет:', predmet print u'Преподаватель:', prepod try: driver.get('http://lms.mai.ru') driver.find_element_by_name('username') .send_keys('login') driver.find_element_by_name('password') .send_keys('password') driver.find_element_by_name('password').submit() driver.get('http://lms.mai.ru/blocks/iis/ index.php?m=conduit&a=grades') Select(driver.find_element_by_id('menufgroup_id')) .select_by_value(self.groups[group]) Select(driver.find_element_by_id('menufperiod_id')). select_by_visible_text(period) predmets = {} submitted = [] soup = BeautifulSoup(driver.page_source) selects = soup.findAll('select') for option in selects[5].findAll('option'): p = option.text[option.text.find(' ') + 3 : option.text.find('(') - 1] if u'\u2014' in p: p = p[p.find(' ') + 3:] predmets.setdefault(p + type_p[option.text[:option.text.find(u'\u2014') - 1]], option.get('value')) type_predmet = type_p[option.text[:option.text.find(u'\u2014') - 1]] else: predmets.setdefault(p + type_p[option.text[:option.text.find(' ')]], option.get('value')) type_predmet = type_p[option.text[:option.text.find(u'\u2014') - 1]] Select(driver.find_element_by_id('id_subject_id')) .select_by_value(predmets[predmet]) driver.find_element_by_id('id_load').submit() type_predmet = predmet[len(predmet) - 3:] soup = BeautifulSoup(driver.page_source) tables = soup.findAll('table')[0].findAll('tr') fio_list = [] ----------------------------------------------------------------------------------------- Как уложить ранец и рюкзак? Кирилл Ткаченко Листинг 1. Реализация на школьном алгоритическом языке алг Ранец нач цел таб вес[1:5], ценность[1:5] цел таб ДП[0:5, 0:10] цел номер_предмета, вместимость вес[1] := 1; вес[2] := 2 вес[3] := 3; вес[4] := 4 вес[5] := 5 ценность[1] := 4; ценность[2] := 5 ценность[3] := 6; ценность[4] := 7 ценность[5] := 8 ДП[0, 0] := 0 нц для номер_предмета от 1 до 5 ДП[номер_предмета, 0] := 0 кц нц для вместимость от 1 до 10 ДП[0, вместимость] := 0 кц нц для номер_предмета от 1 до 5 нц для вместимость от 1 до 10 ДП[номер_предмета, вместимость] := ДП[номер_предмета - 1, вместимость] если вес[номер_предмета] <= вместимость то если ДП[номер_предмета - 1, вместимость - вес[номер_предмета]] + ценность[номер_предмета] > ДП[номер_предмета - 1, вместимость] то ДП[номер_предмета, вместимость] := ДП[номер_предмета - 1, вместимость - вес[номер_предмета]] + ценность[номер_предмета] все все кц кц вывод "Максимум: ", ДП[5, 10] вывод ". Предметы:" вместимость := 10 нц для номер_предмета от 5 до 1 шаг -1 если ДП[номер_предмета, вместимость] <> ДП[номер_предмета - 1, вместимость] то вывод " ", номер_предмета вместимость := вместимость - вес[номер_предмета] все кц кон Листинг 2. Протокол отладки вес[1]=1; вес[2]=2 вес[3]=3; вес[4]=4 вес[5]=5 ценность[1]=4; ценность[2]=5 ценность[3]=6; ценность[4]=7 ценность[5]=8 ДП[0,0]=0 номер_предмета=5 ДП[5,0]=0 вместимость=10 ДП[0,10]=0 номер_предмета=5 вместимость=10 ДП[5,10]=22 да нет ДП[4,10]=22 вместимость=10 номер_предмета=1 да вместимость=0 ----------------------------------------------------------------------------------------- Что должен знать и уметь системный администратор. Часть 2. Больше нюансов Сергей Болдин @echo off set MYSTRING="%1" :nextVar for /F "tokens=1* delims=:" %%a in ("%MYSTRING%") do ( set %%a set MYSTRING=%%b ) if defined MYSTRING goto nextVar start C:\sshadm\PUTTY.exe %IP% , [HKEY_CLASSES_ROOT\sshadm] @="URL:sshadm" "URL Protocol"="" "URL Protocol"="" [HKEY_CLASSES_ROOT\sshadm\shell] @="open" [HKEY_CLASSES_ROOT\sshadm\shell\open] [HKEY_CLASSES_ROOT\sshadm\shell\open\command] @="\"c:\\\\sshadm\\start.bat\" \"%1\"" , -----------------------------------------------------------------------------------------