Per què un ganxo d’OpenVPN no troba el fitxer al costat del seu script
Les rutes relatives en un ganxo es resolen contra el procés, no contra l’script. Fixeu-les amb __file__, i després comproveu l’espai de noms i la identitat abans dels permisos.
Els ganxos que s’executen sense error i tot i així informen d’un fitxer que falta normalment miren al lloc equivocat, no fallen en la seva feina. Les rutes relatives en un script es resolen contra el directori de treball del procés, i un servei s’inicia amb un directori de treball que no heu triat. El fitxer al costat de l’script i el fitxer que obre el procés només són la mateixa cosa quan alguna cosa els fixa. Aquest buit explica bona part de les fallades de ganxo que es llegeixen malament com a problemes de permisos.
Comproveu la ruta abans dels permisos, perquè un error de permisos sobre el fitxer equivocat continua sent el fitxer equivocat.
Una ruta relativa es resol contra el procés, no contra el fitxer
Quan un script crida open("policy.json"), el nucli resol el nom contra el directori de treball actual del procés. Res de la ubicació de l’script no participa en aquesta cerca. OpenVPN inicia els ganxos des d’un directori que tria ell mateix, i l’opció cd pot canviar-lo, així que un script provat a mà des de la seva pròpia carpeta es comporta diferent quan el dimoni l’executa. La prova manual passa, l’execució del servei falla, i la línia del registre només esmenta el nom que falta.
Python exposa la ubicació de l’script com a __file__, i això és el que fa possible l’ancoratge. Path(__file__).resolve().parent / "policy.json" construeix una ruta a partir del fitxer en lloc del procés. Aquesta sola línia elimina la dependència del directori de treball sense canviar res dels privilegis.
Ancoreu la ruta deliberadament i després comproveu què fa resolve
resolve() segueix els enllaços simbòlics, així que una instal·lació que enllaça el ganxo al seu lloc s’ancora a l’objectiu de l’enllaç, no al directori que conté l’enllaç. Normalment és el que voleu per a un desplegament versionat, i és incorrecte per a una disposició que espera dades al costat de l’enllaç simbòlic. Decidiu quin dels dos vol dir el desplegament i escriviu el codi en conseqüència, en lloc de descobrir la diferència en producció. Path(__file__).parent sense resolve() conserva el directori propi de l’enllaç.
Si les dades pertanyen a la instància i no al programa, preneu una ruta absoluta de la configuració. Codificar una ubicació fixa lliga el ganxo a una sola disposició d’amfitrió.
Recorreu quatre fronteres en ordre
Comenceu pel directori de treball: compareu el WorkingDirectory, l’opció cd d’OpenVPN i qualsevol embolcall que canviï de directori abans de l’exec. Després confirmeu la ubicació resolta, perquè un fitxer amb un nom semblant en un altre desplegament pot respondre a la cerca i amagar l’error. Ve després la visió del sistema de fitxers: un chroot o un espai de noms de muntatge del servei poden fer que una ruta absoluta de l’amfitrió simplement no hi sigui. Finalment, la identitat d’accés, que és una qüestió separada de la visibilitat.
ProtectHome i PrivateTmp amaguen ubicacions diferents, i cap de les dues no apareix en un llistat de directori pres de l’amfitrió. Una ruta que existeix per a root en una shell pot ser invisible dins de l’espai de noms de la unitat, i per això provar la mateixa ordre fora del servei demostra tan poc.
Corregiu la cerca sense ampliar el servei
Ancorar la ruta només resol la primera frontera. No exposa un directori que el servei amaga, i no atorga a un compte sense privilegis accés a un fitxer només per a root. Apujar script-security canvia quins scripts executarà OpenVPN; no té cap efecte sobre on es resol un nom relatiu. Canviar el directori de treball de tot el servei és més ampli que el problema, perquè qualsevol altra ruta relativa de certificat, registre o auxiliar es mou amb ell.
Preferiu la correcció estreta: una ruta determinista a l’script, un valor de configuració explícit per a les dades de la instància i una propietat de fitxers que coincideixi amb el compte sota el qual el ganxo s’executa realment.
Registreu proves que anomenin la frontera
Un informe d’error útil conté tres coses: la ruta exacta que el ganxo ha intentat, l’entorn que l’ha produïda i quina frontera ha rebutjat. Imprimiu la ruta resolta i l’excepció sense abocar el contingut del fitxer. Aquest triple separa un ancoratge equivocat d’un muntatge amagat i d’una denegació de permisos, que són tres correccions diferents.
L’afirmació que root pot llegir el fitxer des d’un terminal respon una d’aquelles preguntes i cap de les altres. Proveu-ho des del context propi del servei.