¿Cómo escribo un AppleScript que se vuelve a conectar automáticamente a Wi-Fi?

A veces necesito descargar archivos muy grandes de Internet usando torrents (estoy usando Transmission) y el Wi-Fi siempre se cae. Compré varios enrutadores y módems y ninguno funciona. He tenido este problema por un tiempo (~10 años, con Windows y Mac).

Ahora decidí aprender un poco y escribir un AppleScript que se vuelve a conectar automáticamente:

repeat
if (do shell script "curl --connect-timeout 1 <WIFI_IP>") = "curl: (7) couldn't connect to host" then
    do shell script "networksetup -setairportpower AirPort off"
    do shell script "networksetup -setairportpower AirPort on"
    do shell script "networksetup -setairportnetwork en1 <ROUTER_NAME> <ROUTER_PASS>"
end if
end repeat

la parte after thenfunciona, se desconecta del wifi y lo vuelve a conectar, pero el problema es de la ifparte, porque no se como detectar cuando el torrente rompe la conexion wifi. ¿Cómo debería hacer esto?

Además, una repetición con un intervalo estaría muy bien, algo así como: repeat every 10 seconds.

Agregaría un retraso como delay 300justo antes del repeat endpara evitar que el script busque constantemente una conexión. 300 segundos tendrían que revisar cada 5 minutos.

Respuestas (2)

Aquí hay un controlador simple de Appplescript que escribí hace un tiempo para resolver este problema exacto. Hace ping al servidor OpenDNS (ambos por redundancia) para verificar si la conexión a Internet está activa. Devuelve verdadero en caso de éxito, falso en caso de error. Simplemente cópielo en su secuencia de comandos y llámelo como:

set connected to checkInternetConnection

Luego puede poner lo que quiera hacer en una declaración if como:

if connected then
    -- Do stuff here
end if

El manejador:

on checkInternetConnection()
    -- Ping the primary OpenDNS server.
    try
        set pingResult1 to do shell script "ping -c 1 208.67.222.222"
    on error
        set pingResult1 to ""
    end try

    -- Check the results returned and return true or false.
    set p to number of paragraphs in pingResult1
    if p < 5 then
        -- Ping another Open DNS server for redundancy.
        try
            set pingResult2 to do shell script "ping -c 1 208.67.220.2220"
        on error
            set pingResult2 to ""
        end try

        set p to number of paragraphs in pingResult2
        if p < 5 then return false
    else
        return true
    end if
end checkInternetConnection
devuelve un errorCan’t make «handler checkInternetConnection» into type boolean

En casa, mantengo un script de perl llamado ping-random-server. Cada vez que sospecho que hay un problema de red, lo ejecuto. ping también es una opción para usted. Ejecute un comando ping con un número limitado de pings contra una dirección IP o nombre de host que se sabe que responde al ping, y tome medidas si el ping arroja una pérdida de paquetes del 100 %.

En cuanto a cómo encajar esto en su applescript, intente

if (hacer script de shell "ping -c 10 www.whitehouse.gov | grep transmitido") = "10 paquetes transmitidos, 0 paquetes recibidos, 100.0% pérdida de paquetes"

No he probado esto más que ejecutando los comandos ping en la Terminal y examinando la salida.