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 — нормализованый номер телефона

1c: Значение поля не соответствует установленному отбору при изменении запись регистра

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

uvicorn: запускается только один инстанс при любом количестве workers

Может поможет страждущим как и я. Двое суток гугла и янденкса ;(

Во время отладки скрипта на FastApi возникла ситуация, что сервис должен обращаться сам к себе, ну типа небольшая рекруссия. Соответсвенно чтоб трюк сработал, нужно чтобы было запущено несколько инстансов uvicorn одновременно. Ну ноу проблем, запускаю:

uvicorn main:app --reload --port 8000 --workers 10

И нифига. Запускается только один инстанс. И так и сяк, и гул и яндекс.

Наутро доходит попробовать убрать —reload (ну т.е. перезапускать инстанс автоматически при изменении кода — очень полезная штука во время отладки). И…..заработало! Баг?

FastApi: передача заголовка Authorization в header

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

Казалось бы, всё решается просто:

@router.get('/versions',tags=["Credentials"],responses={
        200: {
            "model": List[models.versions_info],
            "description": "Return has code",
            "headers": {"Authorization": {"description":"Token party","type":"string"}}
        }})
async def list_versions(request: Request,token: Union[str, None] = Header(alias="Authorization",default=None)): 
    print(token)
    out=[{"version": "2.1.1","url": "https://www.server.com/ocpi/2.1.1/"},{"version": "2.2","url": "https://www.server.com/ocpi/2.2/"}]
    return Response(status_code=200,content=json.dumps(out), media_type="application/json", headers={"Authorization": "Token "+config.globals['mytoken']})

Однако вместо ожидаемой передачи заголовка, curl в упор возвращает ровно ничего:

Гугл помог выяснить, что ключевое слово Authorization зарезервированно для использования в Header. На https://stackoverflow.com было подсказано и направление куда копать. А именно, использовать обертку Security:

router = APIRouter()

token_key = fastapi.security.APIKeyHeader(name="Authorization")

class Token(BaseModel):
    token: str

def get_current_token(oauth_header: str = fastapi.Security(token_key)):
    print(f"Token: {oauth_header}")
    return oauth_header


# выдаем список поддерживаемых версий
@router.get('/versions',tags=["Credentials"],responses={
        200: {
            "model": List[models.versions_info],
            "description": "Return has code",
            "headers": {"Authorization": {"description":"Токен участника для авторизации","type":"string"}}
            },
        401: {
            "description": "Unauthorized status code.",
            }
        })
async def list_versions(request: Request,token: funcs.Token = Depends(funcs.get_current_token)): # запрос на получение поддерживаемых версий ПО
    print(f"Токен:{token}")
    if token==None: return Response(status_code=401, content="Unauthorized status code.", media_type="application/text")
    out=[{"version": "2.1.1","url": "https://www.server.com/ocpi/2.1.1/"},{"version": "2.2","url": "https://www.server.com/ocpi/2.2/"}]
    return Response(status_code=200,content=json.dumps(out), media_type="application/json", headers={"Authorization": "Token "+config.globals['mytoken']})
1 64 65 66 67 68 311