REDOS: обновление с 7.3 до 8.0

RedOS 8 собран на другой архитектуре, поэтому так просто обновиться не получится. А еще жадная техподдержка просит действующую лицензию на техподдержку, для получения скрипта для обновления с 7 на 8. Однако в Яндекс найдется всё (с):

#!/usr/bin/sh
# Обновляем пакеты 
dnf upgrade --refresh 
# Заменяем версию 
sudo sed -i 's/7\.3/8.0/g' /etc/yum.repos.d/* 
rm -f /etc/yum.repos.d/RedOS-kernels6.repo 
# Обновляем систему 
dnf system-upgrade download --allowerasing 
# Удаляем неиспользуемые пакеты 
dnf autoremove 
dnf system-upgrade reboot 

После перезагрузки продолжить:

#!/usr/bin/sh
rm -f /etc/yum.repos.d/*.rpmnew 
dnf upgrade --refresh

Далее у меня вылезло несколько сломанных пакетов, которые фиксил следующим образом:

  1. В папке /etc/httpd/conf.d создалось несколько «лишних» файлов конфигураций, которые система туда поместила туда во время обновления и которые мешали работе моих файлов. Их просто удалил.
  2. Перестал запускаться mc, с ошибкой: /usr/bin/mc: symbol lookup error: /usr/bin/mc: undefined symbol: g_string_free_and_steal. Лечится: dnf install glib2 —best —allowerasing затем dnf update
  3. dnf update стал ругаться на ключи GPG. Решение: в /etc/yum.repos.d в фалах проставить gpgcheck=0
  4. PHP по умолчанию откатился к 8.1.34 (уязвимый). Решение: снова собрать всё из исходников с патчем

Кроме того, появился ряд сломанных пакетов. Лечил:

dnf remove qt5-qtlocation
dnf remove qt5-qtbase
dnf update perl-libs --best --allowerasing
dnf update
dnf install libicui18n*
dnf update

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

Обновление OpenSSH на REDOS 7.3

Увы, опять наступил момент, что ОС уже не обновляется оперативно, и того гляди, вообще её снимут с поддержки, а обновления ставить нужно. Ранее уже делал описание обновления, но с тех пор инструкция чуть изменилась.

Подготавливаю необходимый инструментарий и окружение:

dnf install libtool svn expat-devel pcre pcre-devel openssl-devel -y
dnf install zlib-devel
dnf install pam-devel
dnf install libselinux-devel

Скачиваю на сайте https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/ необходимую версию sshd, распаковываем её в папку и переходим в неё:

tar -xzf openssh-10.6p1.tar.gz
cd openssh-10.6p1

Конфигурируем, cобираем, устанавливаем:

./configure --with-privsep-path=/var/lib/sshd/ --sysconfdir=/etc/ssh --with-pam --with-selinux
make
make install

Переименовываем старые бинарники, и делаем ссылки на новые:

mv /usr/sbin/ssh /usr/sbin/ssh_old
mv /usr/sbin/sshd /usr/sbin/sshd_old
ln -s /usr/local/sbin/ssh /usr/sbin/ssh
ln -s /usr/local/sbin/sshd /usr/sbin/sshd
service sshd restart
ssh -V
ssd -V

В результате получаем

PostgreSQL: возврат функцией таблицы

Задача: вызываемая функция должна вернуть таблицу.

Решение:

DROP FUNCTION get_count_np_by_ls(date,bigint,bigint,boolean); 

CREATE OR REPLACE FUNCTION public.get_count_np_by_ls(pr date, porog1 bigint, porog2 bigint, epd boolean)
 RETURNS TABLE(name character varying, cnt numeric)
 LANGUAGE plpgsql
AS $function$
	BEGIN	
       if epd=true then
		return QUERY
					select
						arname as brname,
						sum(acnt) as gcnt 
					 from (
					select * from ( 
					SELECT 
						areas.name as arname,
						count(*) as acnt
					FROM public.posting_addresses
					inner join ls_addresses on ls_addresses.ls=posting_addresses.ls and ls_addresses.address_type=1 and ls_addresses.area between 1 and 26
					inner join areas on areas.id=ls_addresses.area
					inner join ls on ls.id=posting_addresses.ls
					where 
						posting_addresses.period=pr and 
						ls.dt_cancel_epd_bill<=pr  
						group by areas.name,ls_addresses.city,ls_addresses.settler) as zx 
					where 
						zx.acnt between porog1 and porog2
					) as res
					group by brname;
		else
		return QUERY
					select
						arname as brname,
						sum(acnt) as gcnt 
					 from (
					select * from ( 
					SELECT 
						areas.name as arname,
						count(*) as acnt
					FROM public.posting_addresses
					inner join ls_addresses on ls_addresses.ls=posting_addresses.ls and ls_addresses.address_type=1 and ls_addresses.area between 1 and 26
					inner join areas on areas.id=ls_addresses.area
					inner join ls on ls.id=posting_addresses.ls
					where 
						posting_addresses.period=pr 
						group by areas.name,ls_addresses.city,ls_addresses.settler) as zx 
					where 
						zx.acnt between porog1 and porog2
					) as res
					group by brname;
		end if;
	END;	
$function$
;

Вызывается так:

SELECT * from get_count_np_by_ls('2026-05-01',1,1,true)

Внимание! Частой ошибкой является вызов select get_count_np_by_ls(‘2026-05-01’,1,1,true). В этом случае столбцы «схлопываются» в один

Linux: Запись в файл после его удаления

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

cat /dev/null > /var/log/myapp.log

Т.е. очистить файл, не меняя его дискриптора.

НСПК: Подпись сообщения из консоли Linux

Задача: подписать и отправить сообщение в НСПК посредством Linux

Решение:

1. Записываем json в файл и преобразуем его в формат base64:

echo '{"ogrn":"123","phone":"+79212349599","email":"gr@vesk.ru"}' | base64 -w 0 >for_sign.txt

2. Формируем файл подписи:

/opt/cprocsp/bin/amd64/cryptcp -sign -cadesbes -detached -thumbprint "каукаукацукацук" for_sign.txt -nostampcert

3. Формируем команду curl:

#!/usr/bin/bash
curl -X POST http://localhost:3070/v1/legal-profiles \
   -H 'Content-Type: application/json' \
   -H 'HOST:  rtptst-sandbox.nspk.ru' \
   -H 'x-sign:MIAGCSserfserNzI4WjAvBgkqhkiG9w0BCQQxIgQgqloyI8OYFTCgEgyK812e88X9zkKfq1PeWDdcc/Ay7sAwgeMGCyqGSIb3DQEJEAIvMYHTMIHQMIHNMIHKMAoGCCqFAwcBAQICBCA9jxTZxSMi6HWaxAyK3V48uIE0egiIBMqTA/s3ykB+SzCBmTCBhKSBgTB/MR0wGwYDVQQDDBRJbmZerfAAAAAAA==' \
   -d '{"ogrn":"123","phone":"+79212349599","email":"gr@vesk.ru"}'

1 2 3 … 62