22 дек. 2016 г.

Time Machine server on Linux

Появилась задача: резервировать данные рабочего MacbookPro. У Mac OS существует штатный инструмент для создания резервных копий - Time Machine, который для своей работы требует или внешний диск, подключаемый непосредственно к компьютеру, или устройство от Apple - Time Capsule. Есть и третий вариант, файловый ресурс на linux-сервере, доступный по протоколу AFP.
В случае внешнего HDD его придется отдать под задачу резервного копирования полностью: он будет отформатирован в соответствующем виде. Time Capsule стоит некоторых денег. Для реализации linux-версии нужно какое-то количество времени.
Итак, для доступа к сетевым файловым ресурсам у Apple есть свой протокол - Apple Filling Protocol (AFP), свободная реализация которого называется Netatalk. В текущем стабильном (и предыдущем стабильном) релизе Debian его нет, поэтому придется взять исходники с сайта и собрать. Если предполагается частая (или многочисленная) установка, то впоследствии можно сделать deb-пакет самостоятельно, например, с помощью checkinstall.
Сам процесс установки и настройки довольно прост:
- получаем и распаковываем архив с исходниками
root@mytmserver # wget -O netatalk-3.1.10.tar.bz2 -c "http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.10.tar.bz2?download"
root@mytmserver # tar -xjvf ./netatalk-3.1.10.tar.bz2
root@mytmserver # cd netatalk-3.1.10/
- доустанавливаем необходимые пакеты (средства сборки и заголовки)
root@mytmserver # apt update && apt install build-essential libgcrypt11-dev libdb-dev libacl1-dev
- конфигурируем и собираем (список параметров сборки можно посмотреть с помощью ./configure --help)
root@mytmserver # ./configure --prefix=/usr --sysconfdir=/etc/ --with-init-style=debian-systemd --with-cnid-dbd-backend --with-acls --enable-debug
root@mytmserver # make && make install
- запускаем и ставим в автозагрузку демона
root@mytmserver # systemctl start netatalk.service
root@mytmserver # systemctl status netatalk.service
root@mytmserver # systemctl enable netatalk.service 
- перезапускаем avahi (для автообнаружения макосью)
root@mytmserver # systemctl restart avahi-daemon.service 
В логах видим примерно следующее:
root@mytmserver # journalctl -u netatalk.service
дек 22 07:56:29 mytmserver systemd[1]: Starting Netatalk AFP fileserver for Macintosh clients...
дек 22 07:56:29 mytmserver systemd[1]: Started Netatalk AFP fileserver for Macintosh clients.
дек 22 07:56:30 mytmserver netatalk[1281]: Netatalk AFP server starting
дек 22 07:56:30 mytmserver netatalk[1281]: Registered with Zeroconf
дек 22 07:56:31 mytmserver afpd[1321]: Netatalk AFP/TCP listening on 192.168.1.100:548
дек 22 07:56:31 mytmserver cnid_metad[1322]: CNID Server listening on localhost:4700
Служба работает и готова принимать соединения.
Базовая настройка для целей резервного копирования:
 - добавить общие папки внутри домашних директорий существующих в системе пользователей:
/etc/afp.conf:
 [Homes]
 basedir regex = /home
- или создать отдельную папку, ограничив к ней доступ нужным пользователям
/etc/afp.conf:
[myTMserver Folder]
 path = /data/raid1-media/timemachine
 time machine = yes
 valid users = delayer
Далее перезапустить службу netatalk.
Со стороны Mac OS нужно включить возможность работы с "нелегальными" Time Machine серверами. Для этого в консоли (iterm2, terminal):
$ defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1
В Finder проверяем доступ: 
- Command + K 
- Адрес сервера: afp://192.168.1.100
- учетные данные пользователя delayer

Если каталог по сети доступен и аутентификация пройдена, можно идти  в Системные настройки - Time Machine - Выбрать диск... В окне должен быть доступен созданный ресурс. Добавляем, при необходимости снова аутентифицируемся. Далее служба будет создавать копии автоматически.

25 нояб. 2016 г.

w32tm tip

Комп с виндой в домене, но потерял настройки синхронизации времени. Быстро вернуть к жизни и ресинхронизировать время можно так:
w32tm /config /syncfromflags:domhier /update
Если домена нет, а точное время нужно, можно обойтись такой командой (требуется перезапуск службы w32time):
w32tm /config /syncfromflags:manual /manualpeerlist:”0.ru.pool.ntp.org, 1.ru.pool.ntp.org, 2.ru.pool.ntp.org”

20 нояб. 2016 г.

VMWare View client + USB

При работе с клиентом для подключения к корпоративной структуре VDI, которая реализована на базе VMWare Horizon, подключение к удаленному рабочему столу происходит посредством клиента VMWare View.
В случае работы с Linux-клиентом возникла проблема с работоспособностью bluetooth-гарнитуры, которая выражалась в пропадании устройства. Недолгие поиски выявили корень зла во включенном по умолчанию пробросе всех доступных usb-устройств (за исключением разве что устройств ввода) внутрь удаленной виртуалки. 
Куцые настройки в GUI не дают никакх возможностей для конфигурации, поэтому пришлось искать конфигурационные файлы. В этом сильно помогла официальная документация по клиенту, вот эта.
Кому лень искать, вышеуказанная проблема лечится следующей строчкой в /etc/vmware/config:
 viewusb.ExcludeAllDevices = "true"
Как можно догадаться из названия параметра, из пробрасываемых исключаются все найденные устройства. Если все же нужно получить на удаленной системе какие-то конкретные девайсы, можно пользоваться как указанием "семейств" устройств, так и явным указанием VID/PID: 
viewusb.IncludeFamily = "audio"
viewusb.IncludeVidPid = "Vid-0461_Pid-0010;Vid-0461_Pid-4d20"
Операциями по взаимодействию с USB-устройствами хоста занимается vmware-view-usbd, которую, полагаю, лучше перезапустить после изменения конфигурационных файлов.
root@inspire-hv:/home/delayer# systemctl status vmware-view-USBD.service
● vmware-view-USBD.service - LSB: This services starts and stops the View USBD.
   Loaded: loaded (/etc/init.d/vmware-view-USBD; generated; vendor preset: enabled)
   Active: active (running) since Вс 2016-11-20 15:38:01 MSK; 3h 56min ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/vmware-view-USBD.service
           └─1109 /usr/bin/vmware-view-usbd
Также в документе написано, что, кроме глобального конфига, параметры можно переопределять на уровне каждого пользователя, в файле ~/.vmware/config. Однако у меня изменения там не подхватывались. Но так как пользователь в моей домашней системе один, то необходимости в мультиклиентской конфигурации нет.

UPD:
В MacOS механика та же, но реализовано малость удобнее (как и много там =) ):
$ sudo defaults write com.vmware.viewusb ExcludeAllDevices true
$ sudo defaults read com.vmware.viewusb
{
    ExcludeAllDevices = true;
}



16 нояб. 2016 г.

Debian certificate add

Задача: добавить в Debian корневой и промежуточный сертификаты, выпущенные корпоративным CA. 
Сертификаты прилетели в бинарном формате DER с расширением .cer, кушать который стандартная утилита обновления списка сертификатов (update-ca-certificates) отказалась (ROOT.cer does not contain a certificate or CRL: skipping).
Решение довольно простое: конвертировать в понятный для утилиты формат PEM
$ openssl x509 -inform der -in certificate.cer -out certificate.pem
После этого копируем полученные сертификаты в /usr/local/share/ca-certificates и запускаем обновление:
~$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
Adding debian:Issuing_CA01.pem
Adding debian:ROOT_CA.pem
done.
done.
Подсмотрено тут.

6 окт. 2016 г.

ocserv DTLS error

Попался на глаза довольно интересный на первый взгляд продукт - Openconnect VPN Server, который реализует SSL VPN (по образу и подобию решения от Cisco и совместимый с их клиентом AnyConnect). Для Debian он доступен в репозитории (на момент написания - в testing). Если дистрибутив на нестабильный обновлять нет желания или возможности, можно подключить testing только для установки ocserv:
root@vpn:~# cat /etc/apt/preferences.d/testing
Package: *
Pin: release a=testing
Pin-Priority: 50
Соответственно, установка будет выглядеть как
root@vpn:~# apt-get install -t testing ocserv
Базовая конфигурация довольно подробно описана в документации (есть и примеры, и сам конфиг-файл хорошо самодокументирован).
Я же хотел отметить следующее...
Собранный для Debian пакет ocserv идет с предустановленными unit-файлами для systemd, который в стабильном jessie теперь есть из коробки. И возникла вот какая проблема: при запуске через systemd сервер запускается и работает корректно, без ошибок, однако после установления соединения от клиента (находящегося в этой же подсети, с отключенными фаерволами), в логах при любом обмене данными появляются сообщения
bind UDP to [::]:443: Invalid argument
connect UDP socket from [::ffff:128.128.128.128]:62862: Network is unreachable
Со стороны клиента это выглядит как сообщение о невозможности установить DTLS соединение. Сам туннель работает, трафик ходит, однако, выходит, udp-метаданные или работают вовсе, или не защищены.
Исследования выявили, что при запуске без участия systemd, например
root@vpn:~# ocserv  -f -d 10 --config /etc/ocserv/ocserv.conf
Соединение устанавливается и ошибок с DTLS нет. Также было замечено, что в случае запуска через systemd сам ocserv не слушает 443 порт, а этим вместо него занимается systemd.
Оказалось, что (это мои предположения, которые могут быть далеки от истины) systemd запускает сокет, через который уже запускается и работает сам процесс worker от ocserv. То есть у нас есть ocserv.socket и ocserv.service, связанные друг с другом. При ручном запуске этого не происходит (хотя сам сокет, как и описано в конфиге, создается и, полагаю, используется), а netstat -nlp показывает слушаемый порт:
root@vpn:~# netstat -nlp | grep ocserv
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      547/ocserv-main
udp        0      0 0.0.0.0:443             0.0.0.0:*                           547/ocserv-main
unix  2      [ ACC ]     STREAM     LISTENING     14164    547/ocserv-main     /var/run/occtl.socket
unix  2      [ ACC ]     STREAM     LISTENING     14174    822/ocserv-sm       /var/run/ocserv-socket.547
Таким образом, проблема локализуется где-то во взаимодействии systemd и ocserv.service через ocserv.socket
Текущая версия пакета:
root@vpn:~# apt-cache policy ocservocserv:Установлен: 0.11.4-1+b1Кандидат: 0.11.4-1+b1Таблица версий:*** 0.11.4-1+b1 0500 http://mirror.yandex.ru/debian/ testing/main amd64 Packages100 /var/lib/dpkg/status
Предлагаемый workaround:

Отключаем запуск сокета через systemd вовсе:
root@vpn:~# systemctl mask ocserv.socket
Комментируем зависимость службы от юнита сокета:
root@vpn:~# cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv.service
root@vpn:~# sed -i s/Also=ocserv.socket/#Also=ocserv.socket/ /etc/systemd/system/ocserv.service
root@vpn:~# systemctl daemon-reload
Наблюдаем после перезапуска:
root@vpn:~# journalctl -n -u ocserv.service | grep 443
окт 06 11:24:13 vpn ocserv[547]: listening (TCP) on 0.0.0.0:443...
окт 06 11:24:13 vpn ocserv[547]: listening (UDP) on 0.0.0.0:443...
После этого в моем случае проблема перестала воспроизводиться.

7 июл. 2016 г.

Установка СУБД Oracle 11g без графики

Как многие, возможно, в курсе, инсталлятору СУБД Oracle вынь да положь иксы для работы. Если нет возможности (или желания) подключать монитор к серверу, ставить xorg в виртуалку или развлекаться с xhost и иже с ним, можно использовать режим silent-установки, который не проверяет переменную $DISPLAY и, как следствие, не падает на взлете. В дистрибутиве идет шаблонный db_install.rsp, расположенный в database/response. Он худо-бедно документирован, но с некоторыми параметрами вопросы были, пришлось искать по форумам. Посему оставлю здесь заполненный реальными данными файл, с которого установка прошла без ошибок:

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=ORACLE64
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/11g/oraInventory
SELECTED_LANGUAGES=en,ru
ORACLE_HOME=/u01/app/11g/product/11.2.0/dbhome_1
ORACLE_BASE=/u01/app/11g
oracle.install.db.InstallEdition=SE
oracle.install.db.EEOptionsSelection=false
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.oraolap:11.2.0.4.0,oracle.rdbms.dm:11.2.0
.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac:11.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=
oracle.install.db.CLUSTER_NODES=
oracle.install.db.isRACOneInstall=
oracle.install.db.racOneServiceName=
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=
oracle.install.db.config.starterdb.SID=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=false
oracle.install.db.config.starterdb.memoryLimit=10240
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=true
oracle.install.db.config.starterdb.password.ALL=
oracle.install.db.config.starterdb.password.SYS=SYS0
oracle.install.db.config.starterdb.password.SYSTEM=SYSTEM0
oracle.install.db.config.starterdb.password.SYSMAN=SYSMAN0
oracle.install.db.config.starterdb.password.DBSNMP=DBSNMP0
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGE
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=/u01/app/11g/oradata
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=/u01/app/11g/orabackup
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=
DECLINE_SECURITY_UPDATES=
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=
COLLECTOR_SUPPORTHUB_URL=
oracle.installer.autoupdates.option=SKIP_UPDATES
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
Чтобы не выполнять довольно большой список предварительных настроек, можно установить пакет oracle-rdbms-server-11gR2-preinstall, который выставит все нужные параметры среды в нужные значения.
Запуск установки (полный путь к rsp-файлу обязателен) :
oracle@oracle64 ~]$ ./runInstaller -silent -responseFile /u01/distr_new/database/response/db_install.rsp


16 июн. 2016 г.

HP Scan Utility goes to wrong M425 MFP device

В локалке конторы находится с десяток сетевых МФУ HP Pro m425 MFP. В комплекте драйверов идет утилита сканирования HP Scan, позволяющая обращаться к сканеру, подключенному любым доступным способом. Каких-то отдельных настроек она не имеет и пользуется тем, что было сконфигурировано при установке пакета драйверов.
Иногда такая схема забавно сбоит: напечатать на подключенное по сети МФУ пользователь может, а сканирование выдает пустой белый лист, причем механизмы сканера остаются неподвижны. Дело оказывается в том, что по неведомым причинам HP Scan путается в доступных по сети МФУ и подключается к сканеру другого, который к этому компьютеру не подключен и не настроен. Таким образом с точки зрения HP Scan все работает (и это мнение разделяет HP Print & Scan Doctor), а у пользователя в лучшем случае белый лист, в худшем - левый документ =). А у администратора сразу две жалобы - на неработающее МФУ из одного кабинета и на зажившие своей жизнью МФУ из другого, совсем необязательно соседнего.
Изучение проблемы привело к ветке реестра: 
HKEY_USERS\S-1-5-19\Software\Hewlett-Packard\DigitalImaging\NetworkScanners\
В ней находятся раздел (или разделы, если устройств несколько), названный по MAC-адресу сетевого интерфейса МФУ, а внутри есть параметр IpAddress, определяющий соответствующий IP. Логически все верно, MAC неизменен, а IP может меняться довольно часто, поэтому ПО должно уметь обновлять данные соответственно информации из ARP-таблицы.
Однако в моем случае по каким-то причинам это соответствие оказалось нарушеным: параметр IpAddress был неверен. Его изменение на актуальное значение решило вышеописанную проблему.

10 июн. 2016 г.

Phoenix BIOS downgrage

Иногда нужно установить более старую версию BIOS, особенно часто случается такая необходимость на ноутбуках. Пришлось давеча повозиться с одним из стареньких Dell Inspiron Mini: необходимо было уменьшить версию BIOS, а утилита для прошивки (WinFlash.exe) отказывалась это делать, аргументируя ожидаемо тем, что установленная версия новее или такая же. Так как процедура даунгрейда не поддерживается производителем, соответствующих опций в интерфейсе утилиты нет.
Однако выяснилось, что если запускать WinFlash из командной строки, ей можно передать параметр /forceit, который снимает ограничение на перепрошивку более старой версией. Ссылка выше описывает ситуацию с прошивками Dell, но полагаю, что ключи будут работать с прошивками любых вендоров, использующих Award/Phoenix BIOS и WinFlash в качестве утилиты для прошивания.

9 июн. 2016 г.

Windows 7 installation fail with unexpected error

Иногда случается, что чистая установка Windows 7 (любой редакции) завершается ошибкой вида:
Компьютер неожиданно перезагрузился или возникла непредвиденная ошибка. Невозможно продолжить установку Windows. Чтобы установить Windows нажмите кнопку «ОК» для перезагрузки компьютера, а затем перезапустите установку.
или, по-басурмански,
The computer restarted unexpectedly or encountered an unexpected error. Windows installation cannot proceed. To install Windows click OK to restart the computer and then restart the installation.
На майкрософтовских форумах есть магия, позволяющая проблему обойти:
 - жмем Shift+F10
 - запускаем regedit
 - идем в ветку HKLM/SYSTEM/SETUP/STATUS/ChildCompletion
 - меняем значение параметра setup.exe с 1 на 3
 - перезагружаемся


6 июн. 2016 г.

Windows 10 suppressing Start menu when in domain

В ряде случаев служба Windows Firewall (Брандмауэр Windows, да?) отключается средствами групповых политик, причем отключается именно сама служба, а не доменный профиль. В случае с Windows 10 это приводит к забавной проблеме - после входа в домен и перезагрузки (то есть, после применения групповых политик домена) блокируется доступ к Start Menu и Панели уведомлений. Не готов сказать, почему происходит блокировка именно этих элементов интерфейса, но факт остается фактом. 
Таким образом, workaround (а официального решения проблемы на связанных с Microsoft ресурсами найти не удалось) - вручную выставить для службы MpsSvc тип запуска - Автоматически, и состояние - Запущено. Изменять состояние профилей брандмауэра при этом не требуется, они по-прежнему могут оставаться выключенными.

24 мая 2016 г.

.screenrc

caption always "%{= 45}%{+b w}Screen: %n | %h %=%t %c"
hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<"
defutf8 on


18 мая 2016 г.

Автоматическая блокировка экрана в Windows c помощью bluetooth

Давно собирался, но вот дошли руки. 
Блокировка рабочего компьютера при отсутствии - необходимое дело, однако забыть это сделать вполне себе просто. Выставление короткого времени выпадания рабочего стола в заставку с последующим запросом пароля - вариант, но в практической жизни доставляющий больше проблем, чем пользы.
Отличная идея - автоматизировать сам триггер блокировки, а именно - осознание компьютером факта отсутствия пользователя. Одним из самых простых способов сделать это - использовать в качестве маячка любое устройство с включенным bluetooth.
Со стороны рабочей станции устанавливается практически любой bluetooth-адаптер (у меня оказался вот этот), со стороны пользователя может быть телефон, браслет, гарнитура и т.д. Первоначально в планах было "маячить" браслетом mi band, однако с "родными" драйверами, идущими в комплекте, адаптер не виделся софтом для блокировки (о нем ниже), а со стандартными драйверами от Майкрософта - браслет не определялся как видимый (есть подозрение, что стандартные драйверы не умеют Bluetooth 4 LE). С телефоном же проблем не возникло, поэтому используем его.
Таким образом, после включения и установки драйвера адаптера следует включить обнаружение на телефоне и провести стандартными средствами сопряжение устройств по bluetooth.
Далее, софт. На сегодняшний день практически единственным доступным (без денег) средством организации мониторинга доступности bluetooth-устройств в зоне видимости с выполнением действий по факту изменения этой доступности является утилита BtProx. Не обновляется с 2012 года, но пока работает без нареканий. Выглядит она так:


Всё просто: в Used Device выбирается устройство из сопряженных ранее, которое будет выступать маячком, Timeout - время задержки перед выполнением действий, Lock command - выполняемая команда (или скрипт) по факту потери связи с Used device, в нашем случае это мантра: rundll32.exe user32.dll,LockWorkStation (по сути - нажатие Win + L), Release command - аналогичное действие по факту появления устройства в зоне видимости. Далее Start - и система должна начать работу.
В случае потери связи с устройством, утилита выдает соответствующее уведомление и через несколько секунд блокирует экран.

21 мар. 2016 г.

SLIC Table viewer

Иногда требуется понять, есть ли в принесенном ноуте встроенная лицензия на Windows. Сделать это можно, посмотрев содержимое таблицы SLIC, с помощью этой утилитки.

2 февр. 2016 г.

Postgresql + SSD + namespaces

Памятка переноса отдельной базы данных в Postgres на SSD (твердотелка смонтирована в /pg_ssd):
CREATE TABLESPACE ssd_pgdata LOCATION '/pg_ssd/9.1/data';
ALTER DATABASE "mydb" set tablespace ssd_pgdata ;

19 янв. 2016 г.

W7: Проблема входа пользователя в временным профилем (основной профиль в статусе "Архивация")

Второй раз столкнулся с описанной в заголовке проблемой, поэтому оставлю ссылку на таблетку здесь.
Кратко: "в некоторых случаях" (с) при входе пользователя в систему ОС не может доступиться к локальному профилю этого пользователя, и уводит его на временный. Как следствие, теряется доступ к "родному" рабочему столу, документам, почте. Лечится сбросом пары счетчиков в реестре и переименованием ветки с локальным профилем. Ребут нужен.

13 янв. 2016 г.

proxy.pac/wpad.dat для локальных адресов.

Чтобы в следующий раз не искаться, когда будет нужно, оставлю здесь взятый отсюда скрипт для proxy.pac/wpad.dat файла, благодаря которому браузеры, получившие автоматическую настройку прокси-сервера, будут по-прежнему напрямую ходить на локальные адреса:
function FindProxyForURL(url, host)
{
    // The 1st if function tests if the URI should be by-passed…
    // Proxy By-Pass List
    if (
        // ignore RFC 1918 internal addreses
        isInNet(host, "10.0.0.0", "255.0.0.0") ||
        isInNet(host, "172.16.0.0", "255.240.0.0") ||
        isInNet(host, "192.168.0.0", "255.255.0.0") ||

        // is url is like http://server by-pass
        isPlainHostName(host) ||

        // localhost!!
        localHostOrDomainIs(host, "127.0.0.1") ||

        // by-pass internal URLS
        dnsDomainIs(host, ".mycompany.com") ||
        dnsDomainIs(host, ".mycompany.local")
        )

        // If True, tell the browser to go direct…
        return "DIRECT";

        // If False, it’s not on the by-pass then Proxy the request… if you fail to connect to the proxy, try direct.

return "PROXY 10.10.10.10:8080;DIRECT";

}