Ошибка с блоками кода: 403 Forbidden

Недавно я взялся за управление сервером Discourse, и возникло несколько проблем.

  1. У меня возникают постоянные проблемы при создании или редактировании поста с блоками кода. При попытке создать или отредактировать пост с блоком кода
(access node)$ spack list openfoam@2306
...
Variants:
    Name [Default]            When    Allowed values    Description
    ======================    ====    ==============    ==================================================

    build_system [generic]    --      generic           Build systems supported by the package
    int64 [off]               --      on, off           With 64-bit labels
    kahip [off]               --      on, off           With kahip decomposition
    knl [off]                 --      on, off           Use KNL compiler settings
    metis [off]               --      on, off           With metis decomposition
    mgridgen [off]            --      on, off           With mgridgen support
    paraview [off]            --      on, off           Build paraview plugins and runtime post-processing
    precision [dp]            --      sp, dp, spdp      Precision option
    scotch [on]               --      on, off           With scotch/ptscotch decomposition
    source [on]               --      on, off           Install library/application sources and tutorials
    vtk [off]                 --      on, off           With VTK runTimePostProcessing
    zoltan [off]              --      on, off           With zoltan renumbering
...

я получаю ошибку 403 Forbidden.

  1. Markdown не поддерживает подсветку кода: добавление любой спецификации синтаксиса приводит к ошибке 403 Forbidden.

  2. Встроенные фрагменты кода также вызывают ошибку 403 Forbidden в некоторых, но не во всех местах, в зависимости от расположения относительно других блоков кода.

Установленная версия — 3.1.1 ( 0612f0d5b6 ).

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

Пример поста: Compiling OpenFOAM with Spack - 📚 Knowledge nuggets - HPC discourse

Ожидаемый результат:

При установке OpenFOAM от OpenCFD с помощью Spack возникают некоторые проблемы.

Была настроена среда для управления пакетами с помощью Spack в соответствии с инструкциями из руководства UL HPC. Кратко: для пакетов SPACK были определены следующие зависимости,

(access node)$ cat << EOF >> $SPACK_ROOT/etc/spack/packages.yaml
packages:
    slurm:
        externals:
        - spec: slurm@22.05.5
          prefix: /usr
        buildable: False
    libevent:
        externals:
        - spec: libevent@2.1.8
          prefix: /usr
        buildable: False
    pmix:
        externals:
        - spec: pmix@4.2.3 
          prefix: /usr
        buildable: False
    hwloc:
        externals:
        - spec: hwloc@2.2.0
          prefix: /usr
        buildable: False
EOF

а также следующие опции для каталогов кэша сборки,

(access)$ cat << EOF >> $SPACK_ROOT/etc/spack/config.yaml
config:
    build_stage:
        - /dev/shm/$user/spack-stage
EOF 

чтобы ускорить компиляцию, используя файловую систему ramdisk. Перед установкой OpenFOAM была установлена желаемая версия Open MPI с помощью системного компилятора:

(compute node)$ spack install -j openmpi@4.0.5 +pmi schedulers=slurm ^pmix@4.2.3 ^hwloc@2.2.0

Дистрибутив OpenFOAM также устанавливается с помощью системного компилятора. Доступные компоненты OpenFOAM:

(access node)$ spack list openfoam@2306
...
Variants:
    Name [Default]            When    Allowed values    Description
    ======================    ====    ==============    ==================================================

    build_system [generic]    --      generic           Build systems supported by the package
    int64 [off]               --      on, off           With 64-bit labels
    kahip [off]               --      on, off           With kahip decomposition
    knl [off]                 --      on, off           Use KNL compiler settings
    metis [off]               --      on, off           With metis decomposition
    mgridgen [off]            --      on, off           With mgridgen support
    paraview [off]            --      on, off           Build paraview plugins and runtime post-processing
    precision [dp]            --      sp, dp, spdp      Precision option
    scotch [on]               --      on, off           With scotch/ptscotch decomposition
    source [on]               --      on, off           Install library/application sources and tutorials
    vtk [off]                 --      on, off           With VTK runTimePostProcessing
    zoltan [off]              --      on, off           With zoltan renumbering
...

OpenFOAM устанавливается со всеми доступными партиционерами (metis, scotch, zoltan, kahip) и компонентами генератора многогранной сетки (mgridgen, раздел 6.3.1.4 документации) с помощью команды:

(compute node)$ spack install -j openfoam@2306 +source precision=dp +metis +scotch +zoltan +kahip +mgridgen ~knl ~int64 ~paraview ^openmpi@4.0.5 

Однако в результате установки отсутствуют несколько компонентов. Например, при выполнении ручной проверки после установки в doc/Build.md,

# Create the user "run" directory:
mkdir -p "$FOAM_RUN"
# Change to the user "run" directory:
run
# Copy tutorial
cp -r "$FOAM_TUTORIALS"/incompressible/simpleFoam/pitzDaily ./
# Run the tutorial
( cd pitzDaily && blockMesh && simpleFoam )

отсутствуют как генератор сетки blockMesh, так и решатель simpleFoam.

Оказалось, что партиционер METIS вызывает сбои при установке нескольких компонентов. Перекомпиляция только с партиционером SCOTCH,

(compute node)$  spack install openfoam@2306  +source +scotch +mgridgen precision=dp ~int64 ~kahip ~knl ~metis ~paraview ~vtk ~zoltan ^openmpi@4.0.5

решает проблему. Все компоненты решателя установлены, но несколько утилит всё ещё отсутствуют.

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

(access node)$ cat list_spack_openfoam 
#!/usr/bin/bash

set -euo pipefail

declare variant="${1}" # e.g. @2306%gcc@8.5.0 @2306+mgridgen
declare type="${2}" # solvers, utilities

find_makefile_directories() {
    local directory="${1}"

    find "${directory}" -type d | grep -E '\/Make$' || true
}

extract_executable_name() {
    local makefile_directory="${1}"

    cat "${makefile_directory}/files" | ( grep -E '^EXE[[:space:]]*=' || true ) | sed 's/^EXE[[:space:]]*=[[:space:]]*\$(FOAM_APPBIN)\///g'
}

main() {
    local variant="${1}"
    local type="${2}"

    local foam_location="$(spack location -i openfoam"${variant}")"

    local pagkage_directory=""
    local executable_name=""
    local installed=""
    local package_makefile_directory=""
    while read -r package_makefile_directory; do
        executable_name=$( extract_executable_name "${package_makefile_directory}" )
        
        if [ -n "${executable_name}" ]; then
            if [ -x "${foam_location}/platforms/linux64GccDPInt32-spack/bin/${executable_name}" ]; then
                installed="Y"
            else
                installed="N"
            fi
            package_directory="$( echo "${package_makefile_directory}" | xargs -I % dirname % )"
            
            echo "${installed} : ${executable_name} => ${package_directory#${foam_location}}"
        fi
    done < <( find_makefile_directories "${foam_location}/applications/${type}" )
}

main "${variant}" "${type}"

Простой запуск скрипта показывает, что отсутствуют следующие утилиты:

(access node)$ ./list_spack_openfoam utilities @2306 | grep -E '^N'
N : addr2line => /applications/utilities/miscellaneous/OSspecific/addr2line
N : foamyHexMeshSurfaceSimplify => /applications/utilities/mesh/generation/foamyMesh/foamyHexMeshSurfaceSimplify
N : foamyHexMeshBackgroundMesh => /applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh
N : cellSizeAndAlignmentGrid => /applications/utilities/mesh/generation/foamyMesh/cellSizeAndAlignmentGrid
N : foamToCcm => /applications/utilities/mesh/conversion/ccm/foamToCcm
N : ccmToFoam => /applications/utilities/mesh/conversion/ccm/ccmToFoam

Трудно сказать, проблемы, связанные с Markdown, обычно не приводят к ошибкам 403, а предоставляют автору обратную связь через интерфейс. Наши ошибки 403, как правило, связаны с авторизацией, например, публикацией в ограниченной категории или использованием ограниченного тега.

Я использовал ваши фрагменты текста в стандартном экземпляре Discourse, и всё работает нормально.

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

Кроме того, мы почти всегда обнаруживаем, что ошибки 403, подобные этой при попытке создать посты (особенно с блоками кода!), вызваны чрезмерно бдительным WAF, который считает блоки кода шеллкодом или атакой внедрения.

Я отмечаю, что рассматриваемый экземпляр, похоже, защищён WAF:

○ → host hpc-discourse.uni.lu
hpc-discourse.uni.lu является алиасом для fstc-waf2.uni.lu.

Таким образом, я сильно подозреваю, что ошибки 403 исходят не от Discourse, а от вашего WAF.

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