18 февраля 2017

Что такое обратный выкуп акций (buyback)

Обратный выкуп акций или бай-бэк, (от англ. buy back – обратный выкуп) — это процесс покупки собственных акций корпорацией-эмитентом.

Чаще всего такая процедура является предпосылкой избытка денежных средств у предприятия. В то же время байбэк может быть использован, чтобы не допустить снижение рыночных котировок эмитента на бирже. После уменьшения числа акций, находящихся в обороте, логичным следствием является увеличение размера прибыли на 1 ценную бумагу.

Читать далее
30 января 2017

Работа со строками в Delphi 10

Для работы со строками в последних версиях Delphi разработчикам доступно большое количество функций, помимо которых ещё есть помощники для работы со строками, такие как TStringHelper, TStringBuilder и TRegEx. Во всём этом разнообразии бывает сложно найти нужную функцию. Я попытался разобраться, что есть в Delphi 10.1 Berlin для работы со строками и как этим всем пользоваться.

Итак, прежде чем начнём разбираться с функциями, замечу, что начиная с Delphi XE3, появился помощник TStringHelper, и теперь работать со строками можно как с записями. Т.е., если вы определили переменную со строкой (на картинке снизу – это myStr), то вы можете поставить точку и посмотреть, какие функции доступны. Это очень удобно.

Читать далее
15 января 2017

Delphi. Немного об использовании string в CASE

Каждый разработчик для улучшения понимания кода программы, пытается повысить её читабельность. Один из вариантов это сделать — использовать оператор case при тестировании значения переменной. Но, к сожалению, в Delphi этот оператор умеет работать не со всеми типами переменных. Например, он не будет работать со строками. А что делать, если всё-таки нужно проверять переменную типа string оператором case? Давайте рассмотрим один из вариантов, как это можно сделать.

Тема сама по себе старая и известная, но, почему-то, она поднимается вновь и вновь. Кажется, достаточно открыть документацию к Delphi и увидеть, что там написано английским по «белому»:

Читать далее
23 декабря 2016

Логирование в systemd

Введение

Одним из значимых преимуществ systemd является его возможность работы с логами процессов и системы в целом. При использовании остальных инструментов, отличных от systemd, логи обычно сильно децентрализованы, разбросаны по разным демонам, что затрудняет управление ими. Система, собирающая логи, и управляющая ими называется журналом.
Журнал представлен демоном journald, который собирает сообщения ядра, сервисов, процессов и т.д. Мы же разберёмся, как работать с journalctl, позволяющим управлять записями, сохранёнными в журнале.
Логи, собранные в systemd, сохраняются централизованно — в двоичном формате, что сильно упрощает их обработку. Например, можно выбирать произвольные форматы вывода логов, в зависимости от текущих потребностей (например, JSON).
Журнал systemd может использоваться вместе с системной реализацией журнала, либо вообще заменить его.

Читать далее
12 декабря 2016

Введение в systemd. Сервисы, юниты

Введение

В последнее время многие дистрибутивы Linux перешли на systemd с других демонов инициализации (например, upstart). Systemd является гибким и быстрым инструментом для управления сервером с момента загрузки.

В данном руководстве мы рассмотрим наиболее важные команды для управления сервером с systemd.

Читать далее
3 ноября 2016

Программирование на языке PowerShell

Технология Windows PowerShell позволяет не только выполнять команды администрирования, но и полноценно программировать алгоритмы на языке PowerShell. Для этого в языке PowerShell существуют атрибуты, присущие всем современным языкам программирования такие как: переменные, условия, циклы, массивы, обработка ошибок и все это можно использовать для написания сложных сценариев администрирования.

Язык PowerShell – это объектно-ориентированный скриптовой язык программирования, который является частью технологии Windows PowerShell. Синтаксис всех программных конструкций языка PowerShell схож с синтаксисом СИ подобных языков.

Читать далее
12 октября 2016

Основы Windows PowerShell

В данной статье мы рассмотрим такую технологию от компании Microsoft как Windows PowerShell, мы поговорим о том, что такое PowerShell, что такое командлеты и конвейер, как писать сценарии и модули, а также затронем другие не менее важные и полезные возможности Windows PowerShell.

Что способствовало появлению Windows PowerShell?

До появления PowerShell существовали (и существуют) следующие инструменты для автоматизации и администрирования сервисов: командная строка Windows и Windows Script Host. Но у этих технологий есть недостатки.

Читать далее
11 августа 2016

Справочник командлетов Windows PowerShell

Командлетов в Windows PowerShell много поэтому сегодня я предлагаю рассмотреть небольшой список наиболее полезных и часто используемых командлетов с кратким описанием того, что они умеют. Данный справочник поможет Вам быстрей найти интересующую Вас команду Windows PowerShell и ориентирован он на начинающих системных администраторов.

Читать далее
1 июля 2016

Отслеживаем удаление файлов на PowerShell

Когда наше файловое хранилище разменяло третий терабайт, все чаще наш отдел стал получать просьбы выяснить, кто удалил важный документ или целую папку с документами. Нередко это происходит по чьему-то злому умыслу. Бэкапы — это хорошо, но страна должна знать своих героев. А молоко вдвойне вкусней, когда мы можем написать его на PowerShell.

Пока разбирался, решил записать для коллег по цеху, а потом подумал, что может пригодиться кому-то еще. Материал получился смешанный. Кто-то найдет для себя готовое решение, кому-то пригодятся несколько неочевидные методы работы с PowerShell или планировщиком задач, а кто-то проверит на быстродействие свои скрипты.

  • Во-первых, время генерации отчета за четыре часа на 2-терабайтном хранилище, с которым одновременно работает около 200 человек, составило около пяти минут. И это притом, что лишнего у нас в логи не пишется. Это меньше, чем у Deks, но больше, чем хотелось бы, потому что…
  • Во-вторых, все то же самое нужно было реализовать еще на двадцати серверах, гораздо менее производительных, чем основной.
  • В-третьих, вызывал вопросы график запуска генерации отчетов.
  • И в-четвертых, хотелось исключить себя из процесса доставки собранной информации конечным потребителям (читай: автоматизировать, чтобы мне с этим вопросом больше не звонили).

Краткий дискурс: При включенном аудите файловой системы в момент удаления файла в журнале безопасности создаются два события, с кодами 4663 и, следом, 4660. Первое записывает попытку запроса доступа на удаление, данные о пользователе и пути к удаляемому файлу, а второе — фиксирует свершившийся факт удаления. У событий есть уникальный идентификатор EventRecordID, который отличается на единицу у этих двух событий.

Ниже приведен исходный скрипт, собирающий информацию об удаленных файлах и пользователях, их удаливших.

С помощью команды Measure-Command получили следующее:

Многовато, на вторичных ФС будет дольше. Сходу очень не понравился десятиэтажный пайп, поэтому для начала я его структурировал:

Получилось уменьшить этажность пайпа и убрать перечисления Foreach, а заодно сделать код более читаемым, но большого эффекта это не дало, разница в пределах погрешности:

Пришлось немного подумать головой. Какие операции занимают больше всего времени? Можно было бы натыкать еще десяток Measure-Command, но в общем-то в данном случае и так очевидно, что больше всего времени тратится на запросы в журнал (это не самая быстрая процедура даже в MMC) и на повторяющиеся конвертации в XML (к тому же, в случае с EventRecordID это и вовсе необязательно). Попробуем сделать и то и другое по одному разу, а заодно исключить промежуточные переменные:

А вот это уже результат. Ускорение практически в два раза!

Автоматизируем

Порадовались, и хватит. Три минуты — это лучше, чем пять, но как лучше всего запускать скрипт? Раз в час? Так могут ускользнуть записи, которые появляются одновременно с запуском скрипта. Делать запрос не за час, а за 65 минут? Тогда записи могут повторяться. Да и искать потом запись о нужном файле среди тысячи логов — мутор. Писать раз в сутки? Ротация логов забудет половину. Нужно что-то более надежное. В комментариях к статье Deks кто-то говорил о приложении на дотнете, работающем в режиме службы, но это, знаете, из разряда «There are 14 competing standards»…

В планировщике заданий Windows можно создать триггер на событие в системном журнале. Вот так:

Отлично! Скрипт будет запускаться ровно в момент удаления файла, и наш журнал будет создаватья в реальном времени! Но наша радость будет неполной, если мы не сможем определить, какое событие нам нужно записать в момент запуска. Нам нужна хитрость. Их есть у нас! Недолгий гуглинг показал, что по триггеру «Событие» планировщик может передавать исполняемому файлу информацию о событии. Но делается это, мягко говоря, неочевидно. Последовательность действий такая:

  1. Создать задачу с триггером типа «Event»;
  2. Экспортировать задачу в формат XML (через консоль MMC);
  3. Добавить в ветку «EventTrigger» новую ветвь «ValueQueries» с элементами, описывающими переменные:


    где «eventRecordID» — название переменной, которую можно будет передать скрипту, а «Event/System/EventRecordID» — элемент схемы журнала Windows, с которой можно ознакомиться по ссылке внизу статьи. В данном случае это элемент с уникальным номером события.
  4. Импортировать задание обратно в планировщик.

Но мы же не хотим натыкивать все это мышкой на 20 серверах, верно? Нужно автоматизировать. К сожалению, PowerShell не всесилен, и командлет New-ScheduledTaskTrigger пока что не умеет создавать триггеры типа Event. Поэтому применим чит-код и создадим задачу через COM-объект (пока что достаточно часто приходится прибегать к COM, хотя штатные командлеты умеют все больше и больше c каждой новой версией PS):

Нужно обязательно разрешить одновременный запуск нескольких экземпляров, а также, как мне кажется, стоит запретить ручной запуск и задать лимит времени выполнения:

Создадим триггер типа 0 (Event). Далее задаем XML-запрос для получения нужных нам событий. Код XML-запроса можно получить в консоли MMC «Журнал событий», выбрав необходимые параметры и переключившись на вкладку «XML»:

Главная хитрость: указываем переменную, которую нужно передать скрипту.

Собственно, описание выполняемой команды:

И — взлетаем!

«Концепция поменялась»

Вернемся к скрипту для записи логов. Теперь нам не надо получать все события, а нужно доставать одно-единственное, да еще переданное в качестве аргумента. Для этого мы допишем заголовки, превращающие скрипт в командлет с параметрами. До кучи — сделаем возможным изменять путь к логу «на лету», авось, пригодится:

Дальше возникает нюанс: до сего момента мы получали события командлетом Get-WinEvent и фильтровали параметром -FilterHashtable. Он понимает ограниченный набор атрибутов, в который не входит EventRecordID. Поэтому фильтровать мы будем через параметр -FilterXml, мы же теперь и это умеем!

Теперь нам больше не нужно перечисление Foreach-Object, поскольку обрабатывается всего одно событие. Не два, потому что событие с кодом 4660 используется только для того, чтобы инициировать скрипт, полезной информации оно в себе не несет.
Помните, в начале я хотел, чтобы пользователи могли без моего участия узнатьзлодея? Так вот, в случае, если файл удален в папке документов какого-либо отдела — пишем лог также в корень папки отдела.

Итоговый командлет

Ну вот, кусочки нарезаны, осталось собрать все воедино и еще чуть-чуть оптимизировать. Получится как-то так:

Осталось поместить скрипт в удобное для вас место и запустить с ключом -Install.

Теперь сотрудники любого отдела могут в реальном времени видеть, кто, что и когда удалил из их каталогов. Отмечу, что я не стал рассматривать здесь права доступа к файлам логов (чтобы злодей не мог их удалить) и ротацию. Структура и права доступа к каталогам на нашем файлере тянут на отдельную статью, а ротация в какой-то степени усложнит поиск нужной строки.

https://habr.com/ru/post/238469/

30 марта 2016

Первоначальная настройка маршрутизаторов Cisco

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

Данную статью я решил посвятить ряду подобных вопросов и как результат решил назвать ее «Первоначальная настройка маршрутизаторов Cisco». Сразу хочу заметить, что мы не будем вдаваться в настройки детально, а просто пройдемся по ряду опций, что бы иметь необходимое представление по теме.

Итак, хватит лирики, давайте перейдем непосредственно к делу.

Допустим к нам в руки попал маршрутизатор cisco.

Задачи, которые мы будем выполнять:

1) Ознакомимся с интерфейсом.

2) Определим какие бывают уровни доступа.

3) Посмотрим, что такое режим конфигурации.

4) Настроим такие параметры как имя устройства, имя домена, время.

5) Зайдем в режим настройки портов устройства и зададим на них ip адреса.

6) Зададим пароль на привилегированный режим и создадим пользователя в локальной базе данных.

7) Настроим возможность удаленного подключения по telnet

8) Настроим возможность удаленного подключения по ssh 1.

Подключаемся к устройству посредством консольного кабеля и видим приблизительно следующее

Press RETURN to get started.

Жмем Enter попадаем в нашу консоль:

Что-ж, давайте попробуем посмотреть как оно работает. Нажимаем «?» и видим приблизительно следующее:


Я думаю вы уже поняли что мы воспользовались подсказкой и увидили все доступные нам на данном этапе команды. Более того, давайте попробуем сделать так:

Cisco подсказывает нам какие варианты дальнейшего написание команды у нас есть. Опция действительно очень полезная, а главное, что доступна на любом этапе написания команды.

Давайте попробуем сделать еще вот так:

То есть мы можем поставить знак «?» абсолютно в любом месте и cisco предложит нам все возможные пути продолжения.

В данном случае мы видим, что за счет символа «е» cisco говорит, что есть две команды соответствующие данному критерию и показывает что это за команды.

Должен отметить, что не обязательно набирать команды целиком, т.е. что бы разлогиниться с cisco не надо набирать команду exit полностью. Достаточно будет набрать «ex». При наборе команд «не полностью» нужно понимать что у системы не должно быть выбора и можно было идентифицировать одну команду подходящую заданному критерию.

2.  Всего в системе существует 16 возможных уровней доступа от 0 до 15. Нам для понимания нужно будет только 3- privilege level 0 — режим в котором мы оказались, когда подключились к маршрутизатору- privilege level 1 — пользовательский режим, который включает в себя пользовательские команды- privilege level 15 — привелигированный режим, который включает в себя все команды.

Что бы попасть в него нужно набрать команду enable, после чего вместо «Router>» мы увидим «Router#». Знак «#» собственно и означает, что мы находимся в привилигированном режиме.

Итак получаем


3. В пункте 2 мы попали в привилигированный режим.

Теперь, если мы хоти производить на роутере какие-либо настройки нам нужно будет перейти в режим конфигурации. Для этого воспользуемся командой configure terminal, или же можно набрать сокращенно conf t


4. Теперь можно попробовать произвести ряд настроек.

Должен сказать, что прямой необходимости в настройке имени устройства, домена и времени нет. Но если это не последняя статья, которую вы читаете, вероятность того что настройка этих параметров еще пригодится очень высока. Что бы настроить имя устройства воспользуемся командой hostname

что мы можем прекрасно видеть Для настройки имени домена воспользуемся командой ip domain-name

Теперь наше доменное имя test.ru

Настройка времени чуть сложнее, т.к. состоит из настройки часового пояса и непосредственно времени. Для задания часового пояса воспользуемся командой clock timezone.

Для настройки времени необходимо выйти из режима конфигурации и воспользовать командой clock set, то есть «время установить» если перевести дословно.

Проверить наши настройки можно посредством команды show.

Так же, для вывода всей конфигурации можно воспользоваться командой show run

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

5. Давайте разберем настройки портов на маршрутизаторе и зададим ip адреса.

Порт в сетевом оборудовании cisco называется interface. Что бы вывести список доступных интерфейсов можно воспользоваться командой show interfaces. Однако вывод будет довольно объемным. Для более компактного вывода можно воспользоваться командой show ip int brief

Теперь мы можем видеть список доступных физических портов.

Предположен что порт GigabitEthernet0/0 подключен к подсети 192.168.0.0 с маской подсети 255.255.255.0, а порт GigabitEthernet0/1 подключен к подсети 192.168.1.0 с маской подсети 255.255.255.0. Соответственно мы решили задать на GigabitEthernet0/0 ip адрес 192.168.0.1, а на GigabitEthernet0/1 ip адрес 192.168.1.1.

Все это нужно  для того что бы компьютеры первой сети могли обращаться к компьютерам второй сети и наоборот. Можем приступить к конфигурации.

TEST#conf t — идем в режим конфигурации

TEST(config)#interface gigabitethernet0/0 — команда interface позволяет нам перейти в режим настройки нужного нам порта на маршрутизаторе

TEST(config-if)#ip address 192.168.0.1 255.255.255.0 — задаем ip адрес для подсети 192.168.0.0

TEST(config-if)#no shutdown — команда включения порта на маршрутизаторе

TEST(config-if)#exit — выходим из настройки порта

TEST(config)#int gi0/1 — заходим в настройки второго порта.

Название портов можно сокращать как показано в данном случае

TEST(config-if)#ip address 192.168.1.1 255.255.255.0 — задаем ip адрес для подсети 192.168.1.0

TEST(config-if)#exit

Все ip адреса настроены и связь между сетями 192.168.0.0 и 192.168.1.0 налажена.

Допустим если мы ошиблись и задали неверный ip адрес (пусть будет 192.168.0.2) или неправильно указали маску, тогда отменить изменения можно будет посредством команды «no».

К примеру:

TEST(config-if)#no ip address 192.168.0.2 255.255.255.0 — данная команда снимет ip адрес 192.168.0.2 на интерфейсе.

Команда «no» применима не только к параметру ip адрес. Ей можно пользоваться для отмены и других параметров маршрутизатора.

6. Мы уже знаем как попасть в привилигированный режим, причем мы это делали без какой-либо авторизации. Предлагаю, для повышения безопасности, задать пароль на привилегированный режим. Сделать это можно посредством команды enable secret [password

]TEST#conf t — заходим в режим конфигурации

TEST(config)#enable secret 0 cisco — теперь наш пароль на привилегированный режим будет cisco.

Должен отметить, что 0 означает, что мы вводим пароль просто текстом. Если у нас есть пароль в зашифрованном виде мы можем выбрать другую опцию. Посмотреть возможные опции можно посредством enable secret ?

TEST(config)#enable secret ?
  0      Specifies an UNENCRYPTED password will follow
  4      Specifies an SHA256 ENCRYPTED secret will follow
  5      Specifies an MD5 ENCRYPTED secret will follow
  LINE   The UNENCRYPTED (cleartext) ‘enable’ secret
  level  Set exec level password

Чтож, пароль на привилегированный режим мы задали. Предлагаю создать своего собственного пользователя в системе, которого мы в дальнейшем будем использовать для подключения к устройству удаленно через telnet или ssh. Для этого дадим вот такую команду:

TEST(config)#username user1 privilege 15 secret password1

В результате ее выполнения система создаст пользователя с именем user1, паролем password1 и уровнем доступа 15 (привилегированный режим) 7. У нас есть подсети, есть пользователь в локальное базе данных. Теперь можно настроить подключение к устройству через telnet. Для этого нам нужно будет зайти в настройки line vty (виртуальная терминальная линия). Перейдем к конфигурирования и все станет ясно.

TEST#conf t — заходим в режим конфигурации

TEST(config)#line vty 0 4 — заходим в настройку терминальных линий.

На разных устройствах может быть разное количество терминальных линий. В нашем случае их 5, т.е. от 0 до 4, что отражено в команде. Количество терминальных линий говорит о количестве возможных одновременных подклюений к маршрутизатору. Когда кто-то подключается, то ему присваивается первая свободная линия vty.

TEST(config-line)#transport input telnet — мы говорим, что к нашему устройству можно подключаться удаленно посредством telnet

TEST(config-line)#login local — данная команда говорит, залогиниться по vty можно использую локальную базу данных пользователей.

Соответственно мы сможем зайти под пользователем, которого создали в пункте 6. Теперь можно подключиться к устройству удаленно посредством telnet, с какого-нибудь компьютера из ранее созданных подсетей 192.168.0.0 или 192.168.1.0 8. Использовать telnet достаточно удобно, но не безопасно, т.к. он передает логин и пароль по сети в открытом виде. Т.е. если кто-нибудь отловит нужные пакеты, то сможет увидеть пароль. Поэтому я рекомендую настраивать подключение через протокол ssh. Для этого необходимо выполнение ряда требований. Должны быть заданы параметры hostname (см. пункт 4), domain-name (см. пункт 4), так как исходя из этих параметров происходит шифрование, а так же необходимо сгенерировать пару ключей шифрования, посредством команды:

TEST(config)#crypto key generate rsa modulus 1024 — где 1024 разрядность шифрования наших ключей.

Теперь нужно разрешить подключение через ssh на наших vty линиях.

TEST(config)#line vty 0 4 — заходим в настройку терминальных линий

TEST(config-line)#transport input telnet ssh — мы говорим нашему устройству, что можно подключиться как через telnet так и через ssh. На самом деле можно указать только ssh, но тогда подключиться по telnet уже не получится.

TEST(config-line)login local — говорим маршрутизатору использовать локальную базу данных пользователей. Если вы уже давали эту команду из пункта 7, то она не обязательна. Все. Теперь можно подключиться к нашему устройству удаленно и главное безопасно посредством ssh.
В конце предлагаю сохранить все сделанные нами настройки командой write. Таким образом после перезагрузки устройства все параметры сохранятся. Если не произвести сохранение, тогда после перезагрузки устройство будет «девственно» чистым как будто на нем ничего не меняли.

TEST#write
Building configuration…
[OK]TEST#