pgsql: функция генерации пароля

Задача: сбросить у всех пользователей пароль

Решение: воспользуемся функцией генерации пароля:

DECLARE
   vPassword text;
   chars text;
BEGIN
   vPassword := ''; 
   chars := 
'@#$%*abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  WHILE((select COALESCE(substring(vPassword from '.*[a-z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[A-Z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[0-9]+.*'),'')) = '') LOOP
  vPassword := '';
   FOR i IN 1..12 LOOP
     vPassword := vPassword || SUBSTRING(chars, ceil(random()*LENGTH(chars))::integer, 1);
  END LOOP;
   END LOOP;
   return vPassword;
END;

Доступ к другой БД 1С через V83.COMConnector

Задача: перенести содержимое регистра из одной БД в другую.

Решение: одним из способов (помимо обработки ВыгрузкаЗагрузкаДанныхXML.epf) является прямая загрузка через COM подключение. Вышло примерно так:

// соединяемся с БД	
		V8=Новый COMОбъект("V83.COMConnector");
		Попытка
			База=V8.Connect("Srvr=""fserferfw""; Ref=""ewrfwe""; Usr=""werfwerfwe""; Pwd=""werfwerfwer"";")
		Исключение
			сообщить("Чтото пошло не так..");
		КонецПопытки;
	
	// делаем выборку из нашего регистра
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 10
		|	ОчередьРаботыСВотцапСрезПоследних.Телефон КАК Телефон,
		|	ОчередьРаботыСВотцапСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
		|	ОчередьРаботыСВотцапСрезПоследних.ЛицевойСчет.Код КАК ЛицевойСчетКод,
		|	ОчередьРаботыСВотцапСрезПоследних.Период КАК Период,
		|	ОчередьРаботыСВотцапСрезПоследних.Сообщение КАК Сообщение,
		|	ОчередьРаботыСВотцапСрезПоследних.ДатаОбработки КАК ДатаОбработки
		|ИЗ
		|	РегистрСведений.ОчередьРаботыСВотцап.СрезПоследних КАК ОчередьРаботыСВотцапСрезПоследних
		|ГДЕ
		|	ОчередьРаботыСВотцапСрезПоследних.Результат = &Результат";	
	Запрос.УстановитьПараметр("Результат", перечисления.ГринРезультатЗапроса.Успешно);	
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл							
			МенеджерЗаписи =База.РегистрыСведений.ОчередьРаботыСВотцап.СоздатьМенеджерЗаписи();			
			МенеджерЗаписи.ЛицевойСчет = База.справочники.vscЛицевыеСчета.НайтиПоКоду(ВыборкаДетальныеЗаписи.ЛицевойСчетКод);
			МенеджерЗаписи.Телефон = ВыборкаДетальныеЗаписи.Телефон;
			МенеджерЗаписи.Действие =  База.перечисления.ГринДействияСВотцап.ПроверкаНаличияВотцап;
			МенеджерЗаписи.Результат=  База.перечисления.ГринРезультатЗапроса.Успешно;
			МенеджерЗаписи.ДатаОбработки=ВыборкаДетальныеЗаписи.ДатаОбработки;
			МенеджерЗаписи.Период=ВыборкаДетальныеЗаписи.Период;
			МенеджерЗаписи.Статус= База.перечисления.СтатусОчередиВотцап.Обработан;
			МенеджерЗаписи.Записать();  		
		
	КонецЦикла;

Python: из объекта в JSON

Если применять json.dumps с объектом, то можно словить ошибку сериализации объекта. Для обхода этого можно применить следующий способ:

def serialize(obj):    
    return obj.__dict__
loc=json.dumps(loc, default=serialize)

В этом случае, если штатный сериализатор «не справляется», то ему будет передана «подсказка» о типе

UBUNTU: настройка ротации логов

В Ubuntu за ротацию логов отвечает утилита logrotate. Обычно она уже установлена в «базе».

Для настройки используется каталог /etc/logrotate.d В этой папке необходимо добавить файл вида:

/home/user/ocpp_servers/*.log {
        weekly
        missingok
        rotate 90
        compress
        delaycompress
        notifempty
        create 755 root adm
        sharedscripts
}

Собственно просто указываем файлы которые нуждаются в «ротации», и внутри скобок — что делать с ними.

  • rotate — указывает сколько старых логов нужно хранить, в параметрах передается количество;
  • create — указывает, что необходимо создать пустой лог файл после перемещения старого;
  • dateext — добавляет дату ротации перед заголовком старого лога;
  • compress — указывает, что лог необходимо сжимать;
  • delaycompress — не сжимать последний и предпоследний журнал;
  • extension — сохранять оригинальный лог файл после ротации, если у него указанное расширение;
  • mail — отправлять Email после завершения ротации;
  • maxage — выполнять ротацию журналов, если они старше, чем указано;
  • missingok — не выдавать ошибки, если лог файла не существует;
  • olddir — перемещать старые логи в отдельную папку;
  • postrotate/endscript — выполнить произвольные команды после ротации;
  • start — номер, с которого будет начата нумерация старых логов;
  • size — размер лога, когда он будет перемещен;
  • hourly — каждый час;
  • daily — каждый день;
  • weekly — каждую неделю;
  • monthly — каждый месяц;
  • yearly — каждый год.

Тестирование получившейся конфигурации:

logrotate -d /etc/logrotate.d/ocpp

1C: нормализация номера сотового телефона

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

Функция ПроверитьКорректностьТелефона(телефона) экспорт
	телефон=телефона;
	answer=Новый Структура("error,result,errortxt,code",false,"","",0);
	телефон=СтрЗаменить(телефон," ","");
	телефон=СтрЗаменить(телефон,"(","");
	телефон=СтрЗаменить(телефон,")","");
	телефон=СтрЗаменить(телефон,"-","");
	телефон=СтрЗаменить(телефон,"+","");
	если СтрДлина(телефон)=10 тогда телефон="7"+телефон;конецесли;	
	если СтрДлина(телефон)=11 тогда 
		если Лев(телефон, 1)="8" тогда
			телефон=Сред(телефон,2);
			телефон="7"+телефон;
		конецесли;	
	конецесли;	
	если СтрДлина(телефон)<>11 тогда
		answer.error=true;
		answer.errortxt="Не верный номер телефона";
		answer.code=501;
	конецесли;	
	
	answer.result=телефон;
	возврат answer;
конецфункции

На выходе: answer.error true/false. Если false, то в answer.result — нормализованый номер телефона

1 61 62 63 64 65 299