Me meto en esto un poco tarde, pero he leído las ganas que tienes de aprender AppleScript y similares, así que pensé que te gustaría ver un enfoque de tu problema que se resuelve puramente con AppleScript.
El problema, tal y como lo planteas, es la necesidad de determinar si un host remoto es alcanzable, lo que supongo que es un medio para determinar si tu máquina tiene o no acceso a Internet. En su ejemplo, usted ha establecido esto por ping
'ing google.com
.
En lugar de hacer ping a un host, basta con ver si su nombre de host se resuelve.
La jerga técnica: A nombre del anfitrión es la forma canónica y legible de un host remoto (como "google.com"), pero para poder conectarse a él, primero debe transformarse (resolverse) en una dirección IP (como 142.250.187.195), que proporciona a una máquina la ubicación del host en Internet. Esto se denomina resolución de nombres de host o resolución de nombres de dominio y es realizado por un servidor de nombres de dominio .
Si un nombre de host remoto se resuelve con éxito, entonces tiene acceso a Internet, y muy probablemente, su script puede seguir adelante. El beneficio de este método comparado con un ping
es que el ping depende de que el host remoto esté en funcionamiento y conectado a Internet (por supuesto, Google probablemente no se ha desconectado desde los años 90); y requiere que el host al que se le hace el ping elija responder al ping (no está obligado a hacerlo). La resolución de DNS se producirá independientemente de que el host responda o no, y es una acción necesaria que debe producirse para que tu máquina pueda acceder a Internet. Si falla, entonces es probable que no puedas acceder a ningún sitio web, lo que en tu caso parece una prueba razonable para determinar si alguna de tus conexiones ethernet está activa.
De todos modos, aquí está el manejador de AppleScript:
on hostIsReachable at address as {record, text}
tell (the address as {URL, anything}) to if ¬
(string != its class) then tell ¬
the host to set the address to ¬
the DNS form
tell ("mailto:" & the address) as URL to tell ¬
host & {dotted decimal form:stop} ¬
to its dotted decimal form != stop
end hostIsReachable
Puedes pegar esto al principio o al final de tu script donde puede que ya tengas otros manejadores al acecho. El manejador puede ser invocado siempre que necesites usarlo así:
hostIsReachable at "https://www.google.com" --> true
o:
hostIsReachable at "google.com" --> true
o:
hostIsReachable at "google" --> true
Devuelve true
si el nombre de host o la URL que ha suministrado es uno que se espera que se resuelva y tiene una conexión a Internet activa para que la resolución tenga lugar; devuelve false
de lo contrario. Entonces, esto:
hostIsReachable at "asdfghjkl.com" --> false
devolverá false
porque ese nombre de dominio no está registrado en Internet. Además, el uso de una dirección IP siempre devolverá true
Lo cual tiene sentido si se tiene en cuenta que la naturaleza de la prueba es determinar si obtenemos una dirección IP de vuelta después de alimentar algunos datos - si esos datos ya son una dirección IP, entonces no hay mucho que resolver.
Puede incluir esta prueba en un bucle de sondeo:
repeat 20 times -- 20 × 0.5-second delays = 10 seconds
set connected to hostIsReachable at "google.com"
if connected then exit repeat
delay 0.5 -- (in seconds)
end repeat
if not connected then error "Timeout waiting for connection."
.
.
.
(* rest of your script *)