Загрузка данных
/bin/sh <<'TB_WEB'
date -u
/usr/sbin/sysctl net.inet.tcp.tso
tb_before=$(/usr/sbin/netstat -an -p tcp | awk '/194[.]186[.]63[.]/ && /ESTABLISHED/ {print $4, $5}')
[ -n "$tb_before" ] || { echo 'Stop: corporate VPN TCP connection not found.'; exit 1; }
echo 'Current corporate connection:'
printf '%s\n' "$tb_before"
echo 'Primary DNS resolver:'
/usr/sbin/scutil --dns | awk '
/^resolver #1$/ {active=1; next}
active && /^resolver #/ {exit}
active && /^[[:space:]]*(nameserver\[[0-9]+\]|port)[[:space:]]*:/ {print}
'
for tb_host in my.vk.team www.google.com; do
echo "Direct HTTPS: $tb_host"
/usr/bin/curl -q -4 --noproxy '*' --connect-timeout 5 --max-time 12 \
--silent --show-error --output /dev/null \
--write-out 'ip=%{remote_ip} http=%{http_code} bytes=%{size_download} dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total}\n' \
"https://$tb_host/"
done
echo 'Configured PAC download and rule evaluation (25-second limit):'
/usr/bin/perl -e 'alarm 25; exec @ARGV' /usr/bin/osascript -l JavaScript <<'TB_PAC'
ObjC.import('Foundation');
ObjC.import('CFNetwork');
function cf(value) { return ObjC.deepUnwrap(ObjC.castRefToObject(value)); }
function choice(pac, host) {
var start = Date.now();
var url = $.CFURLCreateWithString(null, $('https://' + host + '/'), null);
var entries = cf($.CFNetworkCopyProxiesForAutoConfigurationScript($(pac), url, null));
if (!Array.isArray(entries)) { console.log('PAC ' + host + ': evaluation failed'); return; }
var labels = entries.map(function (entry) {
if (entry.kCFProxyTypeKey === 'kCFProxyTypeNone') return 'DIRECT';
var name = entry.kCFProxyHostNameKey, port = entry.kCFProxyPortNumberKey;
var type = String(entry.kCFProxyTypeKey || '').replace(/^kCFProxyType/, '');
if (!/^(HTTP|HTTPS|SOCKS)$/.test(type) || typeof name !== 'string' ||
!/^[A-Za-z0-9._:\[\]-]+$/.test(name) || !Number.isInteger(port) || port < 1 || port > 65535)
return 'unhandled proxy entry';
return type + ' proxy ' + name + ':' + port;
});
console.log('PAC ' + host + ': ' + labels.join(' then ') + ' (' + (Date.now() - start) + ' ms)');
}
function run() {
var settings = cf($.CFNetworkCopySystemProxySettings());
if (!settings || Number(settings.ProxyAutoConfigEnable) !== 1) {
console.log('No enabled primary PAC setting found; no fetch.'); return;
}
var address = settings.ProxyAutoConfigURLString;
if (typeof address !== 'string' || !/^https?:\/\//i.test(address) || /[\x00-\x20\x7f]/.test(address)) {
console.log('PAC URL format not handled; no fetch.'); return;
}
console.log('PAC host: ' + ObjC.unwrap($.NSURL.URLWithString($(address)).host) + ' (path/query omitted)');
var task = $.NSTask.alloc.init, input = $.NSPipe.pipe, output = $.NSPipe.pipe;
task.launchPath = '/usr/bin/curl';
task.arguments = $(['-q', '-4', '--noproxy', '*', '--connect-timeout', '5', '--max-time', '8',
'--max-filesize', '1048576', '--silent', '--output', '-', '--config', '-', '--write-out',
'\n__TB_PAC_METRICS__ %{http_code} %{time_namelookup} %{time_connect} %{time_total}\n']);
task.standardInput = input; task.standardOutput = output;
task.standardError = $.NSFileHandle.fileHandleWithNullDevice;
task.launch;
var config = 'url = "' + address.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"\n';
input.fileHandleForWriting.writeData($(config).dataUsingEncoding($.NSUTF8StringEncoding));
input.fileHandleForWriting.closeFile;
var data = output.fileHandleForReading.readDataToEndOfFile;
task.waitUntilExit;
var result = ObjC.unwrap($.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding));
var metrics = typeof result === 'string' && result.match(/\n__TB_PAC_METRICS__ (\d{3}) ([0-9.]+) ([0-9.]+) ([0-9.]+)\n$/);
console.log('PAC curl_exit=' + task.terminationStatus);
if (!metrics) { console.log('PAC metadata unavailable; contents omitted.'); return; }
console.log('PAC HTTP=' + metrics[1] + ' dns=' + metrics[2] + ' tcp=' + metrics[3] + ' total=' + metrics[4]);
if (task.terminationStatus !== 0 || metrics[1] !== '200') return;
var pac = result.slice(0, metrics.index);
choice(pac, 'my.vk.team'); choice(pac, 'www.google.com');
}
TB_PAC
tb_after=$(/usr/sbin/netstat -an -p tcp | awk '/194[.]186[.]63[.]/ && /ESTABLISHED/ {print $4, $5}')
if [ "$tb_after" = "$tb_before" ]; then
echo 'Corporate TCP connection unchanged.'
else
echo 'Corporate TCP connection changed; comparisons are limited.'
fi
date -u
TB_WEB