Cómo automatizar launchctl / reiniciar un demonio

En OSX 10.10, creé un archivo plist en /Library/LaunchDaemons/ para iniciar una conexión OpenVPN. Sin embargo, encontré problemas de DNS al pasar de una interfaz de Internet a otra (como WiFi a la red LAN) y pensé que necesitaba reiniciar mi demonio OpenVPN con launchctl para solucionarlo.

Pero con este método necesito ir a una consola, escribir un comando monstruoso de launchctl con sudo y, por supuesto, escribir mi contraseña de administrador.

¿Se puede automatizar este proceso de escritura?

Editar

Gracias por la respuesta general de @bmike que abrirá nuevos horizontes y @Graham Miln, aunque no me gusta AppleScript, pero como @Mark solicitó, aquí está mi .plistarchivo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>net.openvpnd</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/openvpn</string>
        <string>/a/path/to/file.ext</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>SuccessfullExit</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/Library/Logs/ovpnerr.log</string>
    <key>StandardOutPath</key>
    <string>/Library/Logs/ovpn.log</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/usr/sbin:/another/path</string>
    </dict>
</dict>
</plist>
Como el daemon se ejecuta como root, deberá ejecutarse como root; una solución simple coloca el comando largo en un alias de script de shell. Sin embargo, en este caso, creo que el demonio solo debe ejecutarse según sea necesario para que se reinicie solo cuando sea necesario, por lo que necesitamos ver su plist para sugerir cuál debería ser.
He respondido al general: "qué opciones de automatización existen". No dude en hacer una pregunta de seguimiento con los detalles específicos que @mark ha mencionado si necesita ayuda para permitir que Launchd maneje el inicio / parada por usted sistemáticamente.
Huele a problema XY . Mejor arregle su configuración de OpenVPN config/DNS.
Hola, @klanomath, estoy totalmente de acuerdo, pero ahora tengo curiosidad sobre las formas de reiniciar un demonio raíz sin privilegios de administrador. También estoy entusiasmado por conocer formas de resolver mi problema X, ¿podría escribir una respuesta aquí o debería hacer otra pregunta?

Respuestas (2)

Puede automatizar este proceso usando el script do shell de AppleScript... con el comando de privilegios de administrador.

do shell script "command" user name "username" password "pass" with administrator privileges

El AppleScript se puede guardar como una aplicación y ejecutar según sea necesario.

Para evitar la necesidad de incrustar credenciales de administrador en AppleScript, omita los parámetros user namey password. Sin estos parámetros, se le pedirá que ingrese sus credenciales cada vez.

Para evitar la necesidad de autenticarse cada vez, y al mismo tiempo evitar las credenciales incrustadas, puede investigar el almacenamiento de las credenciales en su llavero local y agregar su aplicación AppleScript a la lista de control de acceso a través de Keychain Access.app.

Lo primero que hay que automatizar es usar un alias de shell o escribir un script de shell/Python para reducir la escritura. Si elige una secuencia de comandos, puede agregarla al sudoersarchivo para que la contraseña de administrador no sea necesaria para esa secuencia de comandos.

El siguiente sería algo como fastscripts o aplicaciones LaunchBar para usar una tecla de acceso directo para activar su secuencia de comandos. Las herramientas de automatización de Apple también funcionarían. Hay docenas de formas de mejorar o automatizar esto, pero las herramientas tienen una curva de aprendizaje para usarlas correctamente.