Некоторые картинки не загружаются из РФ и РК, используйте VPN.

суббота, 31 декабря 2022 г.

"- Если вы возьметесь лечить больного и он умрет, вы будете казнены!
- А если он выздоровеет?
- В таком случае вы также будете казнены!
- Не велика разница?
- В случае смерти больного карается невежество, в случае выздоровления - дерзость. В обоих случаях вас ждет виселица."

пятница, 30 декабря 2022 г.

Nginx условие в конфигурационном файле

Делал мониторинг nginx zabbix`ом и тут возникла проблема, сайт перенаправляет всех на https, а проверку не надо перенаправлять, как же сделать так, чтобы перенаправление работало не всегда?

server{
    listen          80;
    server_name     site.pro www.site.pro *.site.pro;
    # Enable php-fpm status page (for ZABBIX PHP-FPm HTTP)
    location ~ ^/(status|ping)$ {
        access_log off;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
    }
    # Enable php-fpm status page (for ZABBIX PHP-FPm HTTP) END
    # ADD conditional block
    if ($request_uri !~* "^/(status|ping)$") {
        return 301  https://$host$request_uri;
    }
}

~* - равно регулярке без учета регистр
!~* - не равно регулярке без учета регистр
= - равно правой части
!= - не равно правой части

Во всех условиях, кроме регулярок, использовать знак доллара ($) нельзя, он будет интерпретирован как переменная. Ну или экранируем

Подробнее

четверг, 29 декабря 2022 г.

 Порой снится всякая дичь, иногда занимательно и интересно, особенно если предположить что сон - это наша жизнь в другой вселенной (теория мульти вселенных). Сегодня что именно снилось не помню, но в какой-то момент вспыхнул кадр из сна - женская рука покровительственно лежит на плече сидящего человека... может не покровительственно, а ...смирение (?)... нет... нет слов... как-будто говоря - "смотри, я ..." ... и опять нет слов, чтобы описать. Лиц я не вижу, но как-будто знаю кто это (АМ). Но главное в этой руке - на безымянном пальце обручальное кольцо, классическое, без выкрутасов, над ним вытатуирована точка, а под ним символ бесконечности. В остаточных ощущениях от вспышки картинки чувствуется ответ на вопрос - что значит эта комбинация, но в этой вселенной я так и не понял значения. Также стоит отметить, что это была левая рука, что не характерно для рожденных в России.



"Учился всему понемногу, а потому, как это обычно бывает в таких случаях, не знал ничего!"

вторник, 27 декабря 2022 г.

 

Омлет с овощами

Windows Port forwarding силами ОС

Появилась задача - перебросить пакеты с порта на VPN интерфейсе сервера на другой VPN интерфейс, при этом на сервере работает RRAS. Силами RRAS не получилось, так интерфейс "внутренний" не имеет такой возможности, а вот netsh portproxy справился на ура:

netsh interface portproxy add v4tov4 listenaddress=10.10.10.2 listenport=6604 connectaddress=192.168.80.1 connectport=6604

А вот так можно удалить проброс:

netsh interface portproxy delete v4tov4 listenaddress=10.10.10.2 listenport=6604

А вот так можно проверить список пробросов:

netsh interface portproxy show all

Контроль:

netstat -ano | findstr :6604

Обязательно должна быть включена служба IP Helper:

sc query iphlpsvc

Отметил, что после перезагрузки правило остается, но не работает (порт не слушается). Может быть это связано с тем, что интерфейс, а соответственно и маршрут, появляются позже. В следующий раз проверю, может достаточно перезагрузить службу, тогда накинем отложенный шедуллер, а может вообще if up для службы OpenVPN бахнем

Источник

Второй источник

Так, перезапуск службы iphlpsvc восстанавливает прослушивание, надо подумать, что с ней делать.

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



А теперь самое веселое, эта плюшка не нужна, если SMART карта поддерживается определенными криптопровайдерами, тогда можно использовать SMART карту сразу на RDP сервере

Версия 5.0.12600 - не сертифицирована, поэтому я использовал вариант с донастройкой и у меня реально заработало О_О

воскресенье, 25 декабря 2022 г.

Mikrotik script подготовка конфигурационного файла OVPN

У pfSense есть забавная штука - экспорт конфигурации OpenVPN, такой штуки нет на Mikrotik. Я бы мог использовать pfSense или openSense, но они мне не нравятся, а в некоторых случаях сложны для настройки. Так как в одном из проектов мне волей-неволей придется создавать новых пользователей openVPN, я решил максимально автоматизировать процесс экспорта конфигурации и описал скрипт. Скрипт:

  1. запрашивает необходимые данные
  2. создает пользователя
  3. создает и подписывает сертификат
  4. создает структуру папок
  5. создает все необходимые файлы в этой структуре
  6. экспортирует сертификат
  7. формирует и выгружает файл конфигурации
Остается только нажать на каталог правой клавишей - сохранить, скопировать конфиг и структуру каталогов в каталог openVPN (в зависимости от типа либо config, либо config-auto (требуется установка службы))
Да, сам сервер уже должен быть настроен! По-умолчанию в качестве адреса сервера openVPN берется Identity устройства. 

Запись из июля 2023 года, скрипт формирует структуру каталогов из-за ограничения переменной в 4096 байта, но я случайно нашел обходной вариант, который позволяет слить файлы в один большой - самый последний пример.

суббота, 24 декабря 2022 г.

Mikrotik script Ввод от пользователя

 Порой есть задача - запросить данные от пользователя, оказывается в Mikrotik такое тоже возможно. Описал простенькую функцию с параметрами:

  • QstUser - Текст вопроса
  • VarName - Имя переменной куда будет помещено введенное значение
  • DefaultValue - Значение по-умолчанию (на случай пустого ввода)
  • LenValue - Минимальная длина ввода (например pass-phrase для экспорта сертификата не может быть меньше 8 символов)
# Example:
# :global UserName ""
# $PromtInput QstUser="\r\nInsert new username" VarName="UserName" DefaultValue=UserX LenValue=4
:local PromtInput do={
	:local readinput do={:return}
	if ($LenValue>0) do={
		:set $QstUser ("$QstUser. Minimum length $LenValue simbols")
	}
	if ([:len $DefaultValue]>0) do={
		:set $QstUser ("$QstUser. \r\n(default - $DefaultValue)")
	}
	:put ("$QstUser:")
	:local UserPromt [$readinput]
	if ([:len $UserPromt]>0) do={
		[:parse "global $VarName;:set $VarName $UserPromt"]
		if (($LenValue>0) and [:len $UserPromt]<$LenValue) do={
			:error message="You entered only $[:len $UserPromt] symbols instead of $LenValue minimum required. Stop program"
		}
	} else={
		if  ([:len $DefaultValue]>0) do={
			[:parse "global $VarName;:set $VarName $DefaultValue"]
		} else={
			:error message="You didn't enter anything. Stop program"
		}
	}
}

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

"Жаркое с говядкой"

 

"Ешь, не то я вышвырну тебя за дверь, вместе с твоей негодницей!"

Урсус - очень интересный персонаж...

 На фоне мальчика 99,9% людей - нелюди, и я в том числе...

"Похлебка из рыбы"
"Похлебка для рыбы" - поправил его доктор


пятница, 23 декабря 2022 г.

 Человек стремится идти по модели упрощения во всем, в работе, в отдыхе, в домашних делах и в искусстве. Вот и Гюго здесь и в "Отверженные" уделяет много времени отсылкам и описаниям. Меня самого иногда заносит, но сколько строк ушло на описание подвешенного на цепи мертвеца. А начало меня сначала отправило не пойми куда и я засомневался в художественности произведения, но здесь еще большую роль сыграл тот факт, что 36 часов сна ни в одном глазу, а умиротворение и безделье только усугубили притяжение в царство Морфея


В какой-то момент 1С сообщила: "Братан, твой ключ в тыкву превратится лишь бить начнут куранты". Я был сильно удивлен, ибо ключ до февраля с хвостиком, проверил, оказывается и вправду, они только до 01 (пысы, постановление о продлении было 19 декабря). Копаясь на разных сайтах узнал что в Байконуре есть налоговая РФ, где можно сделать ЭЦП на ИП или ООО. Также там есть представительство контура, где можно купить токен с отметкой ФСТЭК. Собственно встал вопрос о посещении сего города. Но попасть туда можно только по пропуску, поэтому забил. Это было не то в октябре, не то в ноябре. А в конце ноября нашлись люди, которые могут сделать пропуск туристический, связался и таки заказал и ключ и пропуск. 
Тут я долго сидел и думал, как совершить эту поездку: на машине, на поезде, на самолете. В итоге поезд выиграл. Купил билеты на сайте КТЖ (выезд 15, прибытие 16, убытие 16го, прибытие обратно 17/12). Все вроде гладко, но нет. В билетах время убытия указано по времени Астаны (ЧП +4), я в Атырау (ЧП +6), а Байконур в ЧП +6. Почему в билетах указано левое время, без пометок? В итоге я опоздал на поезд на час.

Расстроился, и пошел домой. Заказал новые билеты и тут опять ничего про ЧП не сказано! Заказал на 21 убытие и 23 возврат. Билеты надо подобрать так, чтобы приехать утром, а уехать этим же днем.

четверг, 22 декабря 2022 г.

 Мда, развязка неожиданная, или ожидаемая??, Но конец вызвал у меня дежавю, не то я видел конкретно это, не то что-то похожее...

понедельник, 19 декабря 2022 г.

Mikrotik script обход параметров функции

 Предположим ситуация - необходимо обработать N слов, каждое слово является позиционным параметром некоей функции, сколько слов может быть на входе мы не знаем, но предполагаем что не больше 10. Каким образом обработать параметры? Сначала я подумал о преобразовании текста в код в цикле и обработки его при помощи :parse или :execut как предлагает доблестный rextended:

:global variablename "test"

# Create a global variable using the name inside "variablename" and set the value (or update the value if is already defined)
[:parse ":global $variablename \"REX1\""]
# after "parse" the variable exist and can be displayed
:put $test

# Set a value of variable with name defined inside "variablename" (or simply apply previous "parse" command)
[:parse "global $variablename;:set $variablename \"REX2\""]
:put $test

# For read the value, of a variable with name defined inside "variablename", and put it inside another global or local declared variable:
:global testx [[:parse ":global $variablename; :return \$$variablename"]]
:put $testx

# For read the value, of a variable with name defined inside "variablename", simply for put the value on terminal:
:put [[:parse ":global $variablename; :return \$$variablename"]]

Но, в случае с позиционными параметрами, вариант не прокатил, чет думал-думал (внутренний диалог):

"Вот бы знать сколько их там, в bash то мы знаем"
"Да какая разница сколько их там, все равно цикл с формированием имени переменной не использовать"
"Тогда забей и юзай условной блок с :return"
"Нет, это решение громоздкое и не красивое!....Эврика!, рекурсия со сдвигом параметров!"

Mikrotik script Создать каталог

 Решил я описать скрипт по логике которого, нужно было раскидывать файлы по папкам, и тут выясняется что нельзя взять и создать каталог О_О.

В интернетах предлагают такой вариант

/tool fetch dst-path=MyPath/xxx url="http://127.0.0.1/"

Или такой

/tool fetch dst-path=MyPath/xxx url="http://google.com/"

Но у меня не работает такое, в такой вариант прокатил

/tool fetch dst-path=MyPath/xxx url="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"

Чтобы файл не скачивался, вместо xxx ставим точку

/tool fetch dst-path=MyPath/. url="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"

Поддиректории через слеш

/tool fetch dst-path=MyPath/subFolder/. url="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"

Но такой вариант мне не нравится из-за ненадежности источника скачивания, и я нашел вариант через SMB

/ip smb shares add name=test directory=MyPath
/ip smb shares remove [/ip smb shares find where name=test]

Т.о. для создания структуры, можно описать таким образом

пятница, 16 декабря 2022 г.

Bash Console Script Фигурные скобки

"А так можно было?" - подумал я увидя такую конструкцию:

user@server:~$ mv /etc/postfix/{canonical,sender_relay,sasl_passwd} /etc/postfix/private/

Или так (переимновать без ввода полного пути)

user@server:~$ mv /etc/postfix/main.cnf{,.back}

Или так (создать копию без повторного ввода всего пути)

user@server:~$ cp /etc/postfix/main.cnf{,.back}
user@server:~$ ls /etc/postfix/main*
/etc/postfix/main.cf  /etc/postfix/main.cf.back  /etc/postfix/main.cf.db  /etc/postfix/main.cf.proto  /etc/postfix/main.cf.proto.db  /etc/postfix/main.cf.save

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

user@server:~$ ls ~/test
folder_1 folder_2 file_1 file_2 file_1_bak file_2_bak

user@server:~$ cp ~/test/file_1 ~/test/file_1_bak /new_folder
user@server:~$ ls /new_folder
file_1 file_1_bak

user@server:~$ rm /new_folder/*
user@server:~$ cp ~/test/file_1* /new_folder
user@server:~$ ls /new_folder
file_1 file_1_bak

user@server:~$ rm /new_folder/*
user@server:~$ cp ~/test/file_{1,1_bak} /new_folder
user@server:~$ ls /new_folder
file_1 file_1_bak

user@server:~$ rm /new_folder/*
user@server:~$ cp ~/test/file_1{,_bak} /new_folder
user@server:~$ ls /new_folder
file_1 file_1_bak

суббота, 10 декабря 2022 г.

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

Картины: Жан Беро

 


 Есть пословица - "Встречают по одежке, провожают по уму". Отбросим первую часть и посмотрим на вторую не с точки зрения встречи объекта с кем-то, а с точки зрения представления объекту кем то чего либо. Я имею ввиду то, кто первым преподнес то или иное объекту. Предполагаю что произведений описывающих скоротечность времени тьма-тьмущая*, но именно Мюссо представил эту мысль в этом свете, может быть не первым, но наиболее красочно. Я думал тяжелее будет знакомится с "Ты будешь там", но именно "Здесь и сейчас" в конце меня удивила и перевернула сознание, учитывая что ничего сверхъестественного произведение не предлагает*

Можно сказать что автор реабилитирован...

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

_______________________
*тьма-тьмущая - что-то около без счета....
*тут идет сравнение с другими авторами, представляющими другую реальность (Хайнлайн, Вебер, Маккефри, Хаксли, Оруэлл, Замятин, Стругацкие и другие)

Mikrotik script ssh not execute

Дорабатывая старый проект я столкнулся с проблемой в топике. Нужно было отправить wol не только с нашего роутера, но и с роутера в другом широковещательном сегменте сети. Скрипт успешно отрабатывал после мытарств, но напрочь отказывался работать при запуске из блока on up профиля ppp. В итоге виновник был найден - разрешения, из-за этого мне пришлось напичкать скрипт выводами в лог (обновленный вариант выложил в старый пост) и описать функцию логирования. Что странно, на моменте тестирования скрипт выполнялся со всеми включенными разрешениями и под пользователем с полными правами, на обоих аппаратах, все равно пришлось установить галку "don't require permissions" в настройках скрипта!

Mikrotik script простенькая функция логирования

 Задача банальна - писать в лог тогда. когда мне это удобно + писать в вывод (на случай ручного запуска скрипта). Первый вариант был в другом скрипте, в новой старой задаче мне понадобилась эта штука, но пришлось доработать.

# Func loging. For debug. Error write forever, other only of WriteLog =>0 (0 1 2 - level logging), setup up of global var
# $TYPE - topics (error,info)
# $LEVEL - level logging
# 	0 only error
#	1 main
#	2 all
# $MESSAGE - text message
# Example
# 	$Logging MESSAGE=("My text") TYPE="info"  LEVEL=2
# for use in func use global context and declared WriteLog
# Exmaple
# :global WriteLog
# $Logging MESSAGE=("My text $codeExit") TYPE="info"  LEVEL=2

:global WriteLog

:global Logging do={
	:global WriteLog
	:local TextMessage ("PlugUser => ".$MESSAGE)	
	:if ($LEVEL<=$WriteLog) do={
		:if ($TYPE="info") do={ :log info message=($TextMessage) }
		:if ($TYPE="error") do={ :log error message=($TextMessage) }
	}
	:put $TextMessage
}

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

Mikrotik script ssh command log variable

 Вот такая странная тема. Мне нужно было передать 2 команды в ssh-exec со значениями из переменных. Собственно с первой командой проблем не было, а вторая либо не выполнялась, либо писала пустоту в лог (команда логирования). Собственно весь фокус в экранировании при использовании синтаксиса :log info message=("")

/system ssh-exec user=adm address=10.21.0.1 command=("tool wol mac=$macAddr interface=bridge1_LAN; :log info message=(\"$RemoteMessage\")")

Как видим, у нас 2 переменных - $macAddr и $RemoteMessage в двух командах, и оно прекрасно выполняется

/system ssh-exec user=vint address=10.21.0.1 command=("tool wol mac=$macAddr interface=bridge1_LAN; :log info message=(\"Send magic packet on mac:$macAddr, for user $patern\")")

Такой вариант тоже прокатывает, но сложнее читать без правильной подсветки

/system ssh-exec user=vint address=10.21.0.1 command=("tool wol mac=$macAddr interface=bridge1_LAN; :log info message=(Send magic packet on mac:$macAddr, for user $patern)")

А вот без кавычек не сработает, вернет пустоту

пятница, 9 декабря 2022 г.

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

четверг, 8 декабря 2022 г.

" - Зайди к нам, мне нужна голова Нептуна - говорит О.

Я в непонятках - что зачем ... Прихожу, при этом со мной идут мой старый сотрудник и новый, а заходим мы не в то привычное помещение (квартира), а в двухэтажный дом. Надо заметить что О - руководитель и владелец фирмы по бух сопровождению.

- Какая голова Нептуна?
- Мы тут с девочками днем бухгалтерию, а ночами делаем гипсовые головы. Мне нужна голова Нептуна, будем снимать слепок с твоей головы
- Но я не похож на Нептуна
- Ничего, нам подойдет"

Самое забавное в этом сне то, что проснувшись я увидел сообщение от О, а она давно не писала...

понедельник, 5 декабря 2022 г.

Гийом Мюссо Здесь и сейчас, последняя из рекомендованных, для закрытия вопроса с данным автором

Keepass клик по URL - открытие Winbox

 В Keepass можно настроить открытие той или иной программы по клику на URL, и передать в программу параметрами некоторые данные. Мне захотелось настроить это дело для WinBox. сам Winbox имеет порядковые параметры:

winbox64.exe ADDRESS USERNAME PASSWORD

Как видим, ничего сложного в открытии программы с предопределенными параметрами, теперь добавим это дело в настройки KeePass:


cmd://"%PROGRAMFILES%\Winbox\winbox64.exe" {BASE:RMVSCM} {USERNAME} {PASSWORD}

Предполагается что сам Winbox (x64) находится по пути "\Program Files\Winbox\" и назывется winbox64.exe

Все, теперь в поле URL пишем winbox:\\address и оно будет работать

Есть косяки, но это лучшее из всех трех произведений...

воскресенье, 4 декабря 2022 г.

 

Картошечка и соте из овощей. Соте просто бомба, даже вторую порцию навернул

"Еще один писатель, которого забудут через пять лет", ха, интересно, автор про себя писал?

"он не должен вмешиваться в прошлое"

Да, ёлки, уже его появление изменило ход событий! Если бы он не появился в прошлом, то младший он не сделал бы всего того что сделал, и не приехал бы к Илене с решением завести ребенка!

Илена погибла 30 лет назад, а Энжи 20 лет, значит это не дочь Илены (не считая вариантов заморозки яйцеклеток и суррогатного материнства)

Интересно, а Элиот понимает, что даже взмах крыла бабочки может лишить его дочери?

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

суббота, 3 декабря 2022 г.

 Любая жизнь является ценной и значимой, и не важно кто это младенец, старик или собака. Да можно утрировать и напомнить про очень маленьких существ, которых давим не обращая на них внимания, поэтому здесь ремарка - в меру своих сил и возможностей. Герой - врач и бросает собаку, которой навредил, а его подруга ветеринар??? Да как они вообще вместе уже 10 лет?

 За 12000 тенге заменили масло и фильтр.

 Чую что эта пойдет не так просто

 Гийом Мюссо Ты будешь там

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

четверг, 1 декабря 2022 г.

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

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

Get-Acl -filter * -path * | where {(($_.access.IdentityReference -like "TSVR01\фрукты (все)") -or ($_.access.IdentityReference -like "TSVR01\sklad2")) -and ($_.access.FileSystemRights -like "FullControl") -and ($_.access.AccessControlType -like "Allow")} | ft -Property Path

Рекурсии нет, проверки всех групп также нет

Bash script аналог удаления файлов видеорегистратора

Удаление N старых файлов если объем занятого пространства на диске больше n

#!/bin/bash
# проверка наличия другого запущенного экземпляра
nameScript=$(basename "$0")
if [ "$(pgrep -c "$nameScript")" -gt 1 ]
then
	echo  "Script is run"
	exit
fi
# переменные, можно переделать в параметры
# каталог из которого удаляем файлы
directory=/home/tmk/testrm
# диск у которого проверяем объем
disk=/dev/sda
# глубина поиска файлов в каталоге (избавляемся от рекурсии)
depth=1
# количество файлов к удалению за один проход
amount=10
# лимит занятого простратнства (триггер)
MaxLimit="70"

# вариант IF EXIST, если перети не удалось, значит каталог или не существует или доступа туда нет, и выходим
cd "$directory" || exit
# Пока занятоно места больше $MaxLimit, удаляем старые данные в папке.
while [ "$(df -m | grep $disk | awk '{print $5}' | sed 's/%//g'))" -lt "$MaxLimit" ] 
do
# Если в каталоге, при необъходимой глубине, нет файлов, то на выход
	if [ "$(find "$directory" -type f -maxdepth $depth | head -n $amount)" != "" ]
	then
		# Ищем в той самой папке файлы, выводим с датой, сортируем по дате и удаляем первые в списке (самые старые) по $amount штук
        # т.к. перевод строки = \n, то использовать -0 для xargs не имеет смысла
		find "$directory" -maxdepth $depth -type f -printf "%T@ %p\n" | sort -n | cut -d" " -f2- | sed 's/ /\\ /g' | head -n $amount | xargs rm
	else
		echo "Free space is low, but directory is empty" 
		break
	fi
done


Bash script проверить наличие другого экземпляра и выйти

Самопроверка скрипта на наличие в процессах

#!/bin/bash
nameScript=$(basename "$0")
if [ "$(pgrep -c "$nameScript")" -gt 1 ]
then
	echo  "Script is run"
	exit
fi

Или (случайно нашел в интернетах 12/04/2024)

#!/bin/bash
instances=`lsof -t "$0" | wc -l`
if (( $instances > 1 )); then exit 1; fi

Вариант для mikrotik

среда, 30 ноября 2022 г.

Сказать что машинка здесь и была, а потом прикинуться раненным оленем???

Не знаю почему, если бы я оказался в такой ситуации, то сразу бы задался вопросом зачем весь этот фарс???

Автор, слабенько

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

вторник, 29 ноября 2022 г.

Mikrotik Типа Jump server

 Для доступа к конечному оборудованию (сервер ssh/rdp/https, сетевое оборудование и т.д. )использую как VPN так и белые списки (iptables and etc). Т.к. гарантировать работу сразу нескольких туннелей представляется сложным, я вынужден, в некоторых случаях (выход с неразрешенного ip), подключаться к конечной точке через промежуточную, подключенную через VPN. Порой хоуп получается тройной или даже четверной вложенности. По сути это получается что-то типа ssh-jump-server. Это очень неудобно для вариантов RDP или же банального веб интерфейса. 

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

Мне тут предложили использовать SSO и keykloak, но мне показалось что это не то что надо, плюс очень громоздко.

Картины: Анри Эжен Огюстен Ле Сиданэ

 



воскресенье, 27 ноября 2022 г.

Zabbix как мы заббикс переодевали

Неожиданно захотелось воспользоваться новым функционалом Zabbix, но как выяснилось обновить 4.4 до 6.2 не так просто. Для начала надо обновить операционную систему (у нас Ubuntu 16.04LTS), потом обновить сервер Zabbix. Попытка сделать это наскоком 16.04 = > 22.04 и 4.4 = > 6.2 провалилась и мы потеряли на этом около 7 часов. На самом деле это была вторая попытка, первая провалилась на этапе обновления операционной системы...

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

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

 За 6000 тенге (меньше 1000 рублей) мне поменяли колеса (с установкой резины на диски). В Питере с меня за это брали от 1500 и выше. 

Кто-то как-то сказал, что нормальный объем багажника должен вмещать в себя комплект резины для этой машины

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


И второй момент - болгаркой разрезать цепь наручников????, да с этой цепью справятся бокорезы!, уж не говоря о болторезе.


Дальше придирка к переводу, суффикс "ш"/"их" (докторша, врачиха, кассирша и пр) в современном значении женщина указанной профессии, но оно прямо смердит уничижительной формой, принижая представителя профессии до третьесортного разряда! Если исходить из того, что запись была подтверждена по почте, то отношения между врачом и пациентом не холодные, а значит применение "врачиха" неприемлемо.

Гийом Мюссо Сентрал парк

Это попытка реабилитировать автора после провала с "Девушка из Бруклина", тем более, что я уже давно в план поставил 4 произведения данного автора...

суббота, 26 ноября 2022 г.

Оладьи из кабачков

 

"Как Анна попала на склад?", это же в глаза бросается. Ее туда привез Марк, внимание вопрос - почему Марк, как бывший следователь, не пошел выяснять кто, как и зачем нашел Анну?

Собственно, как по мне, не очень удачная сказка...

Быть может это наказание за то, что я не сторонник прочтения краткого описания книги...

Владелец крови в комаре был занесен в базу в 2002 году, почему прогон по базе в 2005 не выявил ничего?

пятница, 25 ноября 2022 г.

 Понятно для чего скрытие того, что ты жертва...

 Мда, водить мы не умеем, но машину с места сдвинули, ладно, но как, черт побери, она включила задний ход!?!??

Это напоминает мою жалкую попытку написать что то типа того же


Сегодня махнул до Каракалпакстана с визарана целью (504 км туда и 504 км обратно). Я даже встал в 5.20, и выехал в 6.09

Выехал я с кабелем USB-C to USB-C для телефона, телефон заряжен на половину, и тут я понимаю, что воткнуть зарядку некуда! А телефон жрет как не в себя. Пришлось отключить все лишнее, потом аудиокнигу, потом и вовсе все отключить. На первой и второй заправке я забыл купить кабель. Целый час ехал в тишине без навигатора. И вот спустя 400 км я купил таки кабель, но до границы 90 км и телефон успел зарядится только до 20%. Останавливался (кроме заправок) один раз - 25 минут спал и снова в путь.


Вид не меняется



А вот холмик напомнил мне узбекскую халву

Пограничников забавило мое имя, из 6 человек четверо или пятеро переспрашивали и смаковали его. Без втыкания в телефон было сложновато. В общем прошел без проблем, правда дистанция это не про Казахстан или Узбекистан!

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

Обратно проехал без остановок на сон, чет не клонило. Зато водители бесили страшно. Я еду 70 (по спидометру, факт около 65), потому что ограничение 70, какой-то чудак на букву м прижимается, моргает фарами и под знак "обгон запрещен" обгоняет! Тут заканчивается ограничение скорости и запрет обгона, а он все равно тащится 75! Я смотрю воткнуть запрещенную оптику (в РФ такие запрещены), прижаться, слепить и моргать (читай - добивать) вместо обгона с поворотником и дистанцией, тут в порядке вещей. Я еще на выезде из города отметил одного чудака, который прижался и требовал его пропустить, чтобы через 300 метров повернуть направо. 

Прибыл в 22.55

У автора явно проблемы с нитью

Почему Марк и Рафаэль не задались вопросом - как Анна попала на этот склад? Если бы человек имел ключи, он бы не выламывал дверь напролом.

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

Почему все это всплыло спустя столько времени?

Почему Анна пыталась скрыться, она что то знала!

  Опять детектив!

Ох, как интересно, а можно мне тоже плинтус, за которым можно спрятать почти поллимона евро средними купюрами!

 "распорядок дня определяла работа..."

Гийом Мюссо - Девушка из Бруклина

От произведения "Острие Бритвы" Моэма я получил реально удовольствие, появилось много новых интересных мыслей. От Театра же, я ничего нового не получил. К мысли о театральности я пришел как-то возвращаясь с работы в первом меде больше десяти лет. А в общем, хотел было сказать о Джулии, а точнее о большинстве женщин и их странных поступках, но автор переложил мои мысли в одну фразу:

- Ну и ведьма ты!

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

понедельник, 21 ноября 2022 г.

 Сбегал в ЦОН и прошел квест по получению ЭЦП и личного кабинета на егов. А там был паспорт вакцинации. Вообще день был плодотворный - я наконец получил комплект зимней резины из СПб, лекарства и кой-чего по мелочи. Обе доставки опоздали на неделю!

"- Что Вы делаете?

она сидела на полу в окружении фотографий

- Смотрю сны...."

воскресенье, 20 ноября 2022 г.

Мда....
 

 Сомерсет Моэм Театр

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

суббота, 19 ноября 2022 г.

Highlightjs добавляем перевод строки

Ну не красиво было - скроллы даже для однострочных вставок. В blogger в настройках Тема - Изменить HTML, добавляем стиль для pre:
pre {
	white-space:pre-wrap !important
}

Но у нее свои косяки, изначально просто некрасиво, а со стандартным "крутым" стилем вообще не видно, т.к. цвета что мой фон. Для себя сделал такой стиль:

MSerror Litemanager белое окно


Описание проблемы:

  • При подключении к серверу, превью - белый квадрат
  • Клик по превью не разворачивает подключение
Дополнительные наблюдения:
  • Проявляется на ПК при отключении от внешнего монитора, куда ранее выводилось данное подключение
  • Переустановка не помогает (ни сервер, ни клиент) или помогает, но не надолго

MSerror RDP не пробрасывается буфер обмена

 Описание проблемы:

  • Буфер обмена между RDP сервером и клиентом не синхронизируется
  • Буфер обмена работает по отдельности на сервере и клиенте
  • В настройках подключения разрешена передача горячих клавиш (на случай использования)
  • В настройках подключения включена передача буфера обмена
Дополнительные наблюдения:
  • Сеанс RDP активен давно
  • Проблема решается выходом (не отключением сеанса) и повторным входом
  • Процесс rdpclip.exe пользователя потребляет много больше (>20Мб), в сравнении с другими пользователями удаленного рабочего стола (~5 Мб)
Решение проблемы:
Собственно решений два - либо перезайти нормально или перезапустить процесс rdpclip.exe у пользователя с проблемой. 
taskkill /F /FI "USERNAME eq %username%" /IM rdpclip.exe && ping -n 5 127.0.0.1 >null && rdpclip.exe
Также может помочь перезапуск explorer.exe

 "физический труд излечивает от умственного переутомления"

 "брось в реку камень и вот ты уже чуть изменил вселенную"

 "Вы глубоко религиозный человек не верующий в Бога. Бог Вас разыщет..."

четверг, 17 ноября 2022 г.

MSError Синхронизация времени в домене

Так, собственно моя история борьбы с этой штукой

Проблема возникла давно (года три назад), время расходилось на некоторых ПК аж на час, при этом kerberos ничуть не смущался и спокойно пускал куда надо. Когда начал лечение, делал по различным инструкциям при помощи GPO, программ NetTime, пытался указать насильно сервер обновления времени (роутер) и т.д. Понятно что некоторые варианты прокатывали, но под одной из статей я увидел гневный коммент пользователя, который сетовал на горе-админов, у которых руки из жопы и они настраивают время при помощи GPO. Распространение времени должно работать из коробки силами контроллера домена, единственная задача админа - настроить DC с ролью FSMO - PDC на получение времени снаружи.

MSError Не удалось запросить журнал событий DFS Replication на сервере

Банальная ошибка, решается также банально - проверь настройки брандмауэра:
Eng: Remote Event Log Management (RPC) и Remote Event Log Management (RPC-EPMAP)
Rus: Удаленное управление журналом событий (RPC) и Удаленное управление журналом событий (RPC-EPMAP)

В принципе оно не обязательно, т.к. запрашивает только лог, но я иногда смотрю журнал событий другого ПК через оснастку "Управление компьютером", поэтому в групповой политике FireWall добавил данные правила (предопределенные "Удаленное управление журналом")

MSError Некоторые подразделения (OU) в этом домене не защищены от случайного удаления.

Алерт ясен как божий день, но не ясно как определить проблемные OU и установить им автоматически параметр в Истину. Собственно для ручного варианта включаем дополнительные параметры и смотрим в свойствах OU


Для автоматического варианта (выполняется на контроллере домена через PowerShell)

получил справку о прохождении вакцинации, сказали сходить в ЦОН получить QR???

среда, 16 ноября 2022 г.

 "Друг-мошенник в первую очередь мошенник, а потом уже друг"

Можно описать и так, оно короче и уже нацелено, но я бы сказал немного по другому - человек в первую очередь человек, и чтобы он ни делал, он делает это в первую очередь для себя и не важно насколько он бескорыстен в тот или иной момент, ибо бескорыстие, также как и бездействие - действие, тоже корысть

вторник, 15 ноября 2022 г.

MSError Пробрасываются только принтеры Microsoft

Решения здесь нету, сказ лишь о том, что верить пользователям нельзя, и проверять все нужно лично.

Говорит работало - принтер в RDP сеансе, да вроде я и сам видел...

Уточним:

  • клиент - Windows 7 x64
  • сервер Windows server 2019
  • принтер HP M125rnw (USB)
  • политика сначала EasyPrint, потом дрова
  • не пробрасывается на сервер
Собственно, если не обращать внимания на "раньше работало", решается установкой драйвера версии идентичной на клиенте (иногда и язык должен быть такой же). Что я благополучно сделал и отрапортовал об этом пользователю. 
- Не печатает с сервера - пишет на следующий день
- Вчера же работало
- Нет, я просто не стала писать сразу
- Но я же проверял - ага, проверял он, я просто отправил и увидел что ничего нигде не зависло

Т.о. подведем итог:
  • принтер работает локально
  • принтер пробрасывается на сервер
  • задание передается с сервера на клиент и уходит на принтер (задание не зависает в очереди)
  • принтер не печатает удаленно
Далее я решил использовать универсальный драйвер, который, по какой-то причине отсутствовал на страничке принтера на сайте производителя. Попробовал 3 разных принтера и на обоих получил интересный результат:
  • принтер не работает локально
  • задание улетает на принтер
  • принтер пробрасывается
  • принтер не работает удаленно
  • задание передается с сервера на клиента и уходит на принтер
Также были проверены: версия NetFramework >3.5, RDC version >6.1, настройки подключения
Дальше я решил проверить, а не в сервере ли проблема (хостер божился что нововведений не было). Открыл подключение с другого ПК с ОС Windows 10, и результат был такой же, пробросились только принтеры MS и те, драйвера которых, были установлены на сервере. Проверка еще на двух машинах дала ту же картину. Проверка  с больного клиента на другом сервере, того же хостера дала ту же картину, плюс пробросились принтеры с установленными драйверами.

В итоге отправил запрос хостеру на включение EasyPrint, ибо моих правей недостаточно.

Хостер включил EasyPrint, принтер установился с драйвером EasyPrint и работает

MSError Ошибка 80244019 на клиентах WSUS

 Сдох WSUS на базе WinSrv 2008R2, решили передать роль новому WinSrv2019.

Установил, изменил запись DNS, чтобы имя сервера обновлений передаваемое через GPO не менять. Клиенты в консоли появляться не стали, пробовал выполнять сброс wuauclt /resetauthorization и wuauclt /detectnow, ноль внимания, при этом на всех ПК при попытке запустить поиск выскакивает ошибка 80244019. Начал копать:

  • проверил что реестре сервер указан правильно (HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate)
  • проверил что имя резолвится, указывал не полное имя без домена
  • Поменял имя в записях DNS и в настройках GPO (с wsus на wsus2)
  • Проверил настройку WSUS что тачки падают в группы сразу (консоль WSUS - параметры -компьютеры- использовать на компьютерах групповую политику или параметры реестра)
  • Проверил в GPO куда складываются компьютеры (Разрешить клиенту присоединение к целевой группе)
  • открыл лог на стороне клиента и увидел забавную строчку:
    WARNING: DownloadFileInternal failed for http://wsus2/selfupdate/wuident.cab: error 0x80190194
Собственно тут пошел проверять и действительно, браузер возвращает 404. Поясню, я не переделывал с нуля, поэтому не обратил внимание на отсутствие порта в "Указать размещение службы  обновлений Майкрософт в интрасети". Проверил что файл скачивается с портом 8530, исправил политику и поиск запустился и тачки начали появляться в консоли WSUS


Далее примитивный скрипт обновления политик и перезапуска регистрации на сервере WSUS, не без изъянов, но в моем случае его достаточно, чтобы по быстрому увидеть изменения в консоли WSUS

Сайт 1С упал, успел вчера скачать.

Платформа X64 8.3.20.2180 (windows64full_8_3_20_2180)

Aladdin monitor

Надоело каждый раз искать

 Aladdin monitor HASP (Аладдин Монитор, Аладин монитор)

Напоминаю: Монитор не покажет ключи, если хоть одна лицензия не выдана!!!!

понедельник, 14 ноября 2022 г.

Чип проверили, добавили витаминок приживания для, сказали за справкой сегодня не ходи, завтра ходи, а лучше послезавтра. Также медсестра поделилась воспоминаниями о погоде в Атырау когда она ходила в школу, год то был 72 второй 20го столетия:

- Плюнешь и долетает сосулька

Где то я уже слышал о таком методе определения температуры, что то около -40.... Сейчас же, если верить тырнетам температура зимой не опускается ниже -5 градусов...

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

А некоторые утро встречали так:


К середине дня палатку разобрали и увезли.

воскресенье, 13 ноября 2022 г.

 Сомерсет Моэм "Острие бритвы"


Легкий вечерний дождик....

Excel нельзя использовать относительные ссылки для цветовых шкал

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

По сути дела сама фича (цветовая шкала Excel) работает по принципу - значение ячейки (не важно сколько их в диапазоне, работает над каждой) в пределах диапазона соответствует рассчитываемому значению самим форматированием, а значение для диапазона считается  как МАКС(Выделенного диапазона):




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

А задачу надо решать, а как?

Типа картоха айдахо


Проспал 15 часов...

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


Решил постирать тапки, даже на балконе с открытым окном спустя 18 часов они мокрые, батареи чуть теплые, поэтому сушим над плитой...


Сегодня авария где-то на линии, поэтому бесят электролинию. А она, походу, связана с водой - горячей почти нету...

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

суббота, 12 ноября 2022 г.

1СОшибка -2147221164(0x80040154): Класс не зарегистрирован

 Частая ошибка, решаемая банальной регистрацией comcntr.dll, но оказывается есть частные случаи, именно с таким я и столкнулся. Имеется сервер 2019, разработчик под учеткой с правами обычного пользователя получил такую ошибку. Что было предпринято:

  1. первое решение
    1. регистрация библиотеки требуемой версии платформы
  2. второе решение
    1. удалена регистрация библиотек других платформ (regsvr32.exe -u)
    2. зарегистрирована еще раз нужная
  3. третье решение
    1. удалены все платформы
    2. установлена требуемая по новой
    3. зарегистрирована библиотека
    4. перезагружен сервер
"Человек был не собственником планеты, а всего ее управителем, которому однажды придется отвечать за свое управление"

пятница, 11 ноября 2022 г.

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

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

 "Гавно, с теологической точки зрения, проблема более сложная, нежели зло..." какое интересное умозаключение....

четверг, 10 ноября 2022 г.

Zabbix боремся с автопереводом единиц измерения

 Сделал я себе триггер на изменение скорости порта и вот что он прислал мне:


Выясняется, что заббикс сам переводит Kilo=>Mega=>Giga=>Tera..., но блин, мне коммутатор отдает в мегабитах! И тут есть два варианта:
  1. Привести мегабиты в биты
  2. Добавить единицу измерения в черный список (include/func.inc.php)

Zabbix Шаблон D-Link SNMP discovery

 После этого квеста задался вопросом, а могу ли я при помощи заббикса отслеживать состояние порта на коммутаторах D-LINK? Оказывается могу, и опять при помощи SNMP. Нашел на узле элементы с OID 1.3.6.1.2.1.2.2.1.8 (ifOperStatus), создал триггер (1-UP,2-DOWN)
......
сижу
....
жду
....
ничего не происходит
.....
Понимаю что где-то косяк, поясняю у гугла, а он говорит что это значение говорит о потери сигнала, как будто кабель выдернули, а ты хочешь фиксировать именно отключение.

среда, 9 ноября 2022 г.

"Я все понимаю, я знаю чего ты хочешь, я все устроил. Просто взойдешь на вершину Петршин...
....
- Это точно Ваше желание?
- Да, это мое желание - сказала Тереза
- Не каждый готов умереть, поэтому мы должны быть уверены что это Ваше желание
- Да, это мое желание - произнесла Тереза
....
- Нет, это не мое желание - произнесла Тереза
- Тогда мы не можем этого сделать"

......

понедельник, 7 ноября 2022 г.

Mikrotik script как скрипт управления D-Link`ом по SNMP писали

Есть у меня сервер, с воткнутым в него свистком, который принимал смс. По крону смски проверялись и выполнялись определенные операции при поступлении управляющих кодов. Последнее время модем начал глючить, да и баланс уже год не показывает и сервер состарился, а тут еще и wAP LTE освободился. Я точно знаю что можно с него (аппарат на базе R11e-LTE) читать  и отправлять SMS, и даже USSD запросы.

 "но никто не дал им инструкций как поступать, когда на них будет направлен объектив фотоаппарата"
теперь инструкции есть....

Mikrotik Script Error: cannot substract nothing from string

 Сижу туплю, что за ошибка, ведь в консоли этот фокус прокатил. Добавил:

:put [:typeof $MyVar]

получил, как и ожидал, ответ:

array

- так что ты тогда хочешь?! - негодовал я

В итоге увидел случайно, что я не дописал извлечение элемента массива, я написал так:

:put ($MyVar-"exit-code")

а надо:

:put ($MyVar->"exit-code")

Глаз на столько замылился, что спустя 100+ таких конструкций, перестал замечать

 Кундера Милан Невыносимая легкость бытия

воскресенье, 6 ноября 2022 г.

Mikrotik script проверить наличие другого экземпляра и вызвать исключение

 На bash мы можем заглянуть в диспетчер задач (ps) и найти процесс нашей программы, прежде чем ее запускать (здесь рассматривал). На Mikrotik же такого нету, приходится извращаться. Зачем это надо?, если один из экземпляров программы по какой то причине зависнет, а еще он использует глобальные переменные, то мы можем получить неожиданный результат, поэтому лучше избегать таких коллизий. 

Сама идея проста - проверить некоторую глобальную переменную, которую создаем после проверки, но у Mikrotik свои заморочки и приходится изгаляться:

# ищем среди глобальных переменных. ошибки здесь не будет, либо "", либо id
# в отличии от поиска через get, там и ошибки, и "не моментальное заполнение" списка,
# т.е. первый экземпляр висит уже 10  сек, а переменные через get еще отсутствуют
:if ([/system script environment find where name=RunProgram]!="") do={
	:log error ("There is another instance of the program running, exit")
	:error message="There is another instance of the program running, exit"
}
# объявляем глобальную переменную
:global RunProgram true
...
...
...
# уничтожаем переменную
:set RunProgram

Есть более изящный вариант - проверка в текущих заданиях:

:local scriptname "MyScript"
:if ([:len [/system script job find script=$scriptname]] > 0) do={
	:log error "There is another instance of the program running, exit"
    :error message="There is another instance of the program running, exit"
}


Mikrotik script странности функций и массивов

 Привык использовать функции не только для повторяющихся задач, но и для массивных кусков кода. Например мне нужно сформировать строку с OID из массива и передать ее по ssh, я конечно могу ее сформировать прямо внутри блока, но такая политика сделает код менее читабельным. И вот тут у скрипта Mikrotik возникает проблема - функции должны быть глобальными. Стараюсь по минимуму использовать глобальный контекст, но вызвать локальную функцию из локальной функции нельзя. Только глобальную. Даже с передачей в локальной переменной именованного массива (:local MyVar{"X"="Y";"Y"="Z"}) бывают проблемы. Поэтому приходится использовать глобальный контекст. Не забываем для глобального контекста внутри функции объявлять функцию/переменную в глобальном контексте (я бы назвал не объявлять, а инициализировать, она как бы есть, но функция о ней ничего не знает, но на сайте микротика написано declared).

Не работает:

:global MyVar 0

:local MyFunc do={
	:put $MyVar
}

$MyFunc

работает:

:global MyVar 0

:local MyFunc do={
	:global MyVar
    :put $MyVar
}

$MyFunc

Не работает:

:local MyFunc2 do={
	:return ($1+$2)
}

:local MyFunc do={
	:return ([$MyFunc2 $a $b])
}

:put [$MyFunc a=2 b=3]

работает:

:global MyFunc2 do={
	:return ($1+$2)
}

:local MyFunc do={
	:global MyFunc2
	:return ([$MyFunc2 $a $b])
}

:put [$MyFunc a=2 b=3]

Собственно если внимательно прочитать это, то таких проблем возникать не должно

Mikrotik script удалить все глобальные переменные

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

/system script environment clear

или

/system script environment remove *

или

:environment clear

???

приходится описывать так

:foreach var in=[/system script environment print as-value] do={
	/system script environment remove ($var->".id")
}

Mikrotik remove all global variables and function

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

# в самом начале объявляем локальную, просто чтобы видеть ее
:local pref "chksm"

# далее наша какая то программа начинается
:global chksmMyVar false
:local MyLocalVar 0
....
:global chksmTest do={
	:put "TEST"
}
....
:local chksmTestLocal do={
	:put "TEST LOCAL"
}
....
# далее наша какая то программа заканчивается

# удаляем глобальные переменные
:foreach var in=[/system script environment print as-value] do={
	:local prefVar [:pick ($var->"name") 0 [:len $pref]]; 
	:if ($prefVar=$pref) do={
		/system script environment remove ($var->".id")
	}
}


суббота, 5 ноября 2022 г.

пятница, 4 ноября 2022 г.

 "Дело в том, что мир понемногу идет к концу и такие вещи больше не случаются"

"Он верил что день его смерти предопределен и вера облекала его чудесной броней"

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

Уже 40 минут в очереди, на банальное закрытие карты. Хочу закрыть новую мультивалютную карту из-за того, что ее нельзя будет потом закрыть удаленно, а офисы есть только в Казахстане.

Mikrotik script добавление в массив

Задача простая - прочитать смс, сверить номер отправителя со списком разрешенных, проверить текст сообщения и принять решение. Соответственно после обработки смс, нужно его удалить, но удалять во время обхода списка смс нельзя, т.к. массив сломается. Поэтому будем складывать id сообщений в массив, а для лога мне нужны еще номер и текст, значит будет массив из массивов размерностью 3. Добавить новый элемент в массив, что может быть легче и зачем тратить на это несколько часов?

Начнем с примеров реализации добавления в массив в консоли (скрипте) Mikrotik

Первый вариант добавления в массив


[admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {"0000000000001";"0000000000002";"0000000000003"} 
[admin@mikrotik] > :put $arr
0000000000001;0000000000002;0000000000003
[admin@mikrotik] > :put ($arr->1) 
0000000000002
[admin@mikrotik] > :set $arr ($arr,"000000000000X")
[admin@mikrotik] > :put $arr
0000000000001;0000000000002;0000000000003;000000000000X
[admin@mikrotik] > :put ($arr->3)
000000000000X

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


[admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {"0000000000001";"0000000000002";"0000000000003"} 
[admin@mikrotik] > :put $arr
0000000000001;0000000000002;0000000000003
[admin@mikrotik] > :put ($arr->([:len $arr]-1)) 
0000000000003
[admin@mikrotik] > :set ($arr->([:len $arr])) "000000000000X"
[admin@mikrotik] > :put $arr
0000000000001;0000000000002;0000000000003;000000000000X
[admin@mikrotik] > :put ($arr->3)
000000000000X

Третий вариант добавления в массив - "именованный"


[admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {"one"="0000000000001";"two"="0000000000002";"three"="0000000000003"} 
[admin@mikrotik] > :put $arr
one=0000000000001;two=0000000000002;three=0000000000003
[admin@mikrotik] > :put ("$arr"->"two")
0000000000002
[admin@mikrotik] > :set ("$arr"->"four") "0000000000004"
[admin@mikrotik] > :put $arr
four=0000000000004;one=0000000000001;three=0000000000003;two=0000000000002
[admin@mikrotik] > :put ($arr->"four")
0000000000004

Четвертый вариант добавления - массив в массив из массивов (2D массив)


[admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {{"0000000000001";"0000000000002";"0000000000003"};{"0000000000011";"0000000000022";"0000000000033"};{"0000000000111";"0000000000222";"0000000000333"}} 
[admin@mikrotik] > :put ($arr->1) 
0000000000011;0000000000022;0000000000033
[admin@mikrotik] > :set $arr ($arr,{{"0000000000XXX";"0000000000ZZZ";"0000000000YYY"}})
[admin@mikrotik] > :put ($arr->3)
0000000000XXX;0000000000ZZZ;0000000000YYY
[admin@mikrotik] > :put ($arr->0)
0000000000001;0000000000002;0000000000003
[admin@mikrotik] > :put $arr 
0000000000001;0000000000002;0000000000003;0000000000011;0000000000022;0000000000033;0000000000111;0000000000222;0000000000333;0000000000XXX;0000000000ZZZ;0000000000YYY

А вот в скрипте возникает какая-то хрень, точнее вывод показывал какую-то хрень, а по факту выяснилось, что в 2х смс (но я не смог найти на телефоне) последним символом сообщения был мать его перенос строки! Да!, вот этот - "\n" символ переноса строки. Да, его видно в Winbox если поместить значение в глобальную переменную, но я грешил не на смс, а на формирование самого массива. В связи с чем пришлось искать методы обхода:


# Это функция, на входе текст, на выходе обработанный текст
:local RemoveLineBreak do={
	:local textM $1
	:local textMnew "";
	:for i from=0 to=([:len $textM] - 1) do={
	   :local char [:pick $textM $i];
       #:put ("|" . $char . "|") Вот так увидел что есть что-то лишнее еще на этапе получения текста из массива смс
	   :if ($char != "\n") do={
		   :set textMnew ($textMnew . $char);
		 };
	};
	:return $textMnew
}
#Применение, полагаем что TextSMS содержит в себе текст с переводом строки
:set TextSMS [ $RemoveLineBreak $TextSMS ]

вторник, 1 ноября 2022 г.

 "А вот розовых мы чуть оставили, чтобы у либералов вопросов не было"

 В пн с утра прямо глаз заболел, за яблоком. До вечера протерпел, утро вторника вроде не болит, встал и резко заболел. Записался к офтальмологу, осмотрела со всех сторон и сказала что ничего плохого сообщить не может. Выпейте аспирин.

К врачу днем надо было, а утром был град и шквальный ветер. Градинки напоминали крупную соль. Ветер плюс дождь оставили осадок на машине.

 а дети, как и везде, х**в понарисовали на машине.


Еще и поцарапали капот :-(

воскресенье, 30 октября 2022 г.

 Габриэль Гарсиа Маркес - "Сто лет одиночества"

"Я представляю себе..."

Прям как мои сны

 "Великий момент, спору нет, но не для глаз"

"Скулайн - горизонт (английский)", хм, какая неудачная озвучка

суббота, 29 октября 2022 г.

среда, 26 октября 2022 г.

1СЗаготовка Чтение CSV (ТонкийКлиент,ВебКлиент)

 Понадобилось использовать обработку на опубликованной базе и тут начались проблемы:

  1. Классический выбор файла здесь не работает
  2. Прочитать файл просто так не получилось
  3. Пришлось отказаться от чтения при помощи Excel (типа универсальная была)
Поэтому пришлось использовать БСП, сохранять во временный файл и читать оттуда:


&НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
    ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
    
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = "Excel CSV (*.csv)|*.csv"; 
	ДиалогВыбораФайла.МножественныйВыбор=Ложь;
	ДиалогВыбораФайла.Заголовок = "Выберите файл";
	ДиалогВыбораФайла.ПредварительныйПросмотр = Истина;
	ДиалогВыбораФайла.ИндексФильтра = 0;
    
    ПараметрыЗагрузки.Диалог = ДиалогВыбораФайла;
    
    ОповещениеЗавершенияВыбораФайла = Новый ОписаниеОповещения("ВыборФАйлаЗавершение", ЭтотОбъект);
    
    ФайловаяСистемаКлиент.ЗагрузитьФайлы(ОповещениеЗавершенияВыбораФайла, ПараметрыЗагрузки); //БСП
КонецПроцедуры
&НаКлиенте
Процедура ВыборФАйлаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	Если Результат<>Неопределено Тогда
		ИмяФайла=Результат[0].ПолноеИмя;
		АдресВХранилище=Результат[0].Хранение;
		ПрочитатьФайлCSV(АдресВХранилище);
		Элементы.Таблица.Обновить();
		ДоступностьКнопкиСоздания();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьФайлCSV(АдресВХранилище)
	Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("csv");
	Данные.Записать(ИмяПромежуточногоФайла);
	УдалитьИзВременногоХранилища(АдресВХранилище);	//очищаем временное хранилище
	
	оТаблица=Новый ТаблицаЗначений;	
	//очищаем таблицу и удаляем колонки
	Таблица.Очистить();
	оТаблица=Таблица.Выгрузить();
	
	Разделитель=";";
	ЗаголовкиИзПервойСтроки=Истина;
	
	Текст = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
	
	 //создадим колонки
	ТекСтрока = Текст.ПрочитатьСтроку();
	Если ТекСтрока <> Неопределено Тогда
		МассивЗначений = СтрРазделить(ТекСтрока, Разделитель);
		ИндексКолонки = 0;
		Для Каждого ИмяКолонки Из МассивЗначений Цикл
			ИмяКолонки = ?(ЗаголовкиИзПервойСтроки, "Кол"+ИндексКолонки, ИмяКолонки);
			оТаблица.Колонки.Добавить(ИмяКолонки);
			ИндексКолонки = ИндексКолонки + 1;
		КонецЦикла;
		Если ЗаголовкиИзПервойСтроки Тогда
			ТекСтрока = Текст.ПрочитатьСтроку();
		КонецЕсли;
	КонецЕсли;

	Пока ТекСтрока <> Неопределено Цикл // строки читаются до символа перевода строки
		НоваяСтрока = оТаблица.Добавить();
		
		МассивЗначений = СтрРазделить(ТекСтрока, Разделитель);
		ИндексКолонки = 0;
		Для Каждого ТекЗначение Из МассивЗначений Цикл
			Попытка
				ЗначениеЯчейки=Дата(ТекЗначение+":00");
			Исключение
				ЗначениеЯчейки=Число(СтрЗаменить(ТекЗначение," ",""));
			КонецПопытки;
			НоваяСтрока[ИндексКолонки] = ЗначениеЯчейки;
			ИндексКолонки = ИндексКолонки + 1;
		КонецЦикла;

		ТекСтрока = Текст.ПрочитатьСтроку();
	КонецЦикла;
		
	//Возврат Результат;
	
	Таблица.Загрузить(оТаблица);
	
	//удаляем временный файл
	Попытка
		УдалитьФайлы(ИмяПромежуточногоФайла);
	Исключение
	   ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры


Картины: Татьяна Ниловна Яблонская