Por que un gancho de OpenVPN non atopa o ficheiro xunto ao seu script
As rutas relativas nun gancho resólvense contra o proceso, non contra o script. Ancóraas con __file__ e despois comproba o espazo de nomes e a identidade antes dos permisos.
Os ganchos que se executan sen erro e aínda así informan dun ficheiro que falta adoitan mirar no lugar equivocado, non fallan na súa tarefa. As rutas relativas dun script resólvense contra o directorio de traballo do proceso, e un servizo arrinca cun directorio de traballo que vostede non escolleu. O ficheiro xunto ao script e o ficheiro que abre o proceso só son o mesmo cando algo os ancóra. Esa fenda explica boa parte dos fallos de gancho que se len mal como problemas de permisos.
Comproba a ruta antes que os permisos, porque un erro de permisos sobre o ficheiro equivocado segue sendo o ficheiro equivocado.
Unha ruta relativa resólvese contra o proceso, non contra o ficheiro
Cando un script chama a open("policy.json"), o núcleo resolve o nome contra o directorio de traballo actual do proceso. Nada da localización do propio script participa nesa busca. OpenVPN inicia os ganchos desde un directorio que el mesmo escolle, e a opción cd pode cambialo, así que un script probado a man desde o seu propio cartafol compórtase distinto cando o executa o daemon. A proba manual pasa, a execución do servizo falla e a liña de rexistro só menciona o nome que falta.
Python expón a localización do script como __file__, e iso é o que fai posible a ancoraxe. Path(__file__).resolve().parent / "policy.json" constrúe unha ruta a partir do ficheiro en lugar do proceso. Esa única liña elimina a dependencia do directorio de traballo sen cambiar nada dos privilexios.
Ancora a ruta a propósito e despois comproba que fai resolve
resolve() segue as ligazóns simbólicas, así que unha instalación que liga o gancho no seu sitio ancórase no destino da ligazón, non no directorio que contén a ligazón. Iso adoita ser o que se quere para un despregamento versionado, e é incorrecto para unha disposición que espera datos xunto á ligazón simbólica. Decida cal das dúas cousas significa o despregamento e escriba o código en consecuencia, en lugar de descubrir a diferenza en produción. Path(__file__).parent sen resolve() conserva o directorio propio da ligazón.
Se os datos pertencen á instancia e non ao programa, tome unha ruta absoluta da configuración. Codificar unha localización fixa ata o gancho a unha soa disposición de host.
Percorra catro fronteiras en orde
Empece polo directorio de traballo: compare o WorkingDirectory, a opción cd de OpenVPN e calquera envoltorio que cambie de directorio antes do exec. Despois confirme a localización resolta, porque un ficheiro cun nome parecido noutro despregamento pode responder á busca e ocultar o erro. Logo vén a vista do sistema de ficheiros: un chroot ou un espazo de nomes de montaxe do servizo poden facer que unha ruta absoluta do host simplemente non exista. Ao final, a identidade de acceso, que é unha cuestión aparte da visibilidade.
ProtectHome e PrivateTmp ocultan localizacións distintas, e ningunha das dúas aparece nunha listaxe de directorio tomada do host. Unha ruta que existe para root nunha shell pode ser invisible dentro do espazo de nomes da unidade, e por iso probar o mesmo comando fóra do servizo demostra tan pouco.
Corrixa a busca sen ampliar o servizo
Ancorar a ruta só resolve a primeira fronteira. Non expón un directorio que o servizo oculta nin concede a unha conta sen privilexios acceso a un ficheiro só para root. Subir script-security cambia que scripts executará OpenVPN; non ten efecto sobre onde se resolve un nome relativo. Cambiar o directorio de traballo de todo o servizo é máis amplo que o problema, porque calquera outra ruta relativa de certificado, rexistro ou auxiliar móvese con el.
Escolla a corrección estreita: unha ruta determinista no script, un valor de configuración explícito para os datos da instancia e unha propiedade de ficheiros que coincida coa conta coa que o gancho se executa realmente.
Rexistre probas que nomeen a fronteira
Un informe de fallo útil contén tres cousas: a ruta exacta que o gancho intentou, a contorna que a produciu e que fronteira se negou. Imprima a ruta resolta e a excepción sen verter o contido do ficheiro. Ese trío separa unha ancoraxe equivocada dunha montaxe oculta e dunha denegación de permisos, que son tres correccións distintas.
A afirmación de que root pode ler o ficheiro desde un terminal responde a unha desas preguntas e a ningunha das outras. Probe desde a propia contorna do servizo.