Как я пишу утилиты
Меня несколько раз спрашивали.. Ты типа все время говоришь, что не разработчик, "но, черт возьми, Холмс, как?!" (с)
Сейчас расскажу.
Возьмем для примера тулзу по проверке скачивания обновлений, которую делаю в настоящий момент. По свежим мозгам, так сказать.
Идея написать отдельную программу или функцию для Кваса появилась после того, как выяснил, с какого именно адреса скачиваются обновления. Всегда с одного и того же.
Но от идеи до хотя бы слегка рабочего прототипа - как до горизонта....
Начинаю думать. Адрес у меня есть, его надо проверять. А чем? Вполне подходят wget или curl.
Wget у меня в составе пакета вспомогательных утилит к Квасу, так что... Хотя, проверку надо же делать на шлеме, значит нужен wget под Android.
Поиски удались и нашелся порт этой замечательной утилиты для Android. Теперь другая задача - как его запустить?
На шлеме, разумеется... Что-ж, придется слегка влезть в Линукс. Не то, чтобы я этого жаждал... но кто меня спрашивает?
Только вот чтобы запустить wget, сначала надо скопировать его в шлем, и также скрипт для запуска и т.д. А скрипт, конечно же башевский, sh, в которых совсем ни бум-бум. Ой-ё... зачем я в это ввязался.
Ладно, в Гугле пока не банят, уже хорошо. Итак, делаем wget запускаемым через chmod +x, а копируем через adb с компа, мы же утилиту на компе запускать будем, вот пусть она и трудится батником.
Стало быть, ваяем на cmd процедурку, которая отправит на шлем все что нужно, в том числе скрипт, который будет запускать wget с нужными параметрами.
Пишем, проверяем. Не работает конечно же. Чего ему надо? А, сертификат. И где я его возьму?... Изучаем ман к wget. О, есть параметр --no-check-certificate, отлично. Опять проверяем. Ура, работает! Всего со второго раза. Где-то подвох, не иначе.... И даже errorlevel от wget можно использовать, просто подарок! Шикарно, errorlevel 8 - битый линк,
errorlevel 4 - нет файла, errorlevel 134 - HTTPS 200 OK, то что надо. Ох, не к добру это. Пробуем, все хорошо как-будто. Ладно, куча текста с информацией, которую выдает нам wget, не нужна совершенно, отключаем ее параметром -q, то бишь quite. Смотрим на результат. Перестало работать. Да ё-моё... Какого лешего?...
...ломание головы ... Не, ну это даже не подвох, это подстава. Почему, если нет ошибок, errorlevel без параметра q - 134, а с параметром - 0?... Главное, зачем?
Ладно, восьмая кружка кофе очень даже способствует. Заработало. Пока что.
Блин, а параметры-то меняются... ссылка, которую будет проверять wget, разная, их несколько. Значит нужен цикл. Цикл на sh, вы спятили? Точнее, я спятил.
Впрочем, пока еще не, а значит цикл создаем на cmd, который будет запускать подпрограмму отправки всех файлов на шлем, выполнять только что отправленный скрипт, затем удалять этот скрипт и закидывать такой же, но с другими параметрами, после чего выполнять его снова. А это значит, что скрипт придется формировать на ходу, в том же цикле, до отправки на шлем.
Гуд, такое уже проходил, не проблема. Итак, проверяем прототип. Хм, работает. И даже показывает, что все ссылки доступны... Вообще все. КАК - ВСЕ?!.. А ну-ка проверим ссылку https://occccuuuuuulluuuussssses.com. Errorlevel - 0, все супер, сайт доступен. Что за?..... Нихрена не понимаю.
.... два часа беганий по потолку кипящим чайником с паром из ушей ....
Епрст! Это же цикл, а давай попробуем setlocal enabledelayedexpansion. Завелось. Ура! Теперь надо понять, что с этим делать. В том смысле, что мы и без этой программки значем, что нифига недоступно и все такое. Или доступно, но это тоже сразу видно. Значит - не ура? Ну знаете....
:_CheckUpdatesAccess
echo off
set linkUpdates=https://securecdn.oculus.com/binaries/download/?id=
set toolname=wget
set shscriptname=wgt.sh
@adb push %toolname% /data/local/tmp/ 1>nul
@adb shell chmod +x /data/local/tmp/%toolname%
for /f "tokens=*" %%a in (on.txt) do (
@echo /data/local/tmp/wget -q --no-check-certificate --spider %linkUpdates%%%a >%shscriptname%
@adb shell rm /data/local/tmp/%shscriptname% 1>nul 2>nul
@adb push %shscriptname% /data/local/tmp/ 1>nul
@adb shell dos2unix /data/local/tmp/%shscriptname%
@adb shell sh /data/local/tmp/%shscriptname%
if !errorlevel!==0 call :_CheckUpdatesAccessGood && exit /b
)
echo ============================================================
echo ^| +++ Обновления недостпны, переключаем DNS сервер +++ ^|
echo ============================================================
echo.
echo ------
del /q %shscriptname%
exit /b
Семнадцатая кружка кофе как бальзам. В голове слегка прояснилось.... "список DNS....". Гениально!
Но придется внедрять еще один цикл. А предыдущий делать вложенным. Так.... Работаем. Рукава я и не рассучивал. Цикл по смене ДНС у меня уже есть, чуть подшаманить и готово.
:_dnschangeonly @setlocal enableextensions enabledelayedexpansion @if not exist %cd%\dnslist.txt call :_createfile adb shell settings put global private_dns_mode hostname @for /f "tokens=1,2 delims= " %%a in (%cd%\dnslist.txt) do ( set dnsnumber=%%a set dnsname=%%b adb shell settings put global private_dns_specifier !dnsname! @echo. @echo --------------------------------------------------------------- @echo = Включен DNS сервер: [ !dnsname! ] @echo --- @echo Осталось серверов: [ !dnsnumber! ] @echo --------------------------------------------------------------- @echo. @echo = Wi-Fi шлема настраивается на новый сервер, ожидание 5 секунд... adb shell "svc wifi disable" timeout 2 >nul adb shell "svc wifi enable" timeout 5 /NOBREAK >nul call :_CheckIPaddress call :_CheckUpdatesAccess @echo. call :_dnscontinues )
Ого, даже работает, перебирает чего-то там себе. Но глючно перебирает. Серверы обновлений недоступны при любом DNS. Такого просто быть не может, я не хочу чтоб так было. Зря что-ли впаял в Квас пачку DNS серверов, аж 81 штуку?!.. Ну уж нет. Думаю.... опять думаю... еще думаю. Может задержку надо поставить, секунд пять, вдруг не успевает переключиться на другой DNS.... упс, не помогло.
О, а ведь можно надеть шлем посмотреть что там и как. И я даже знаю, как прям на него отправить ссылку в браузер. Ссылка открыывается. А прога пишет - недоступен. Явно какое-то противоречие. А сейчас-то чего ему не так?... Ладно, запустим Квас, посмотрим, он меня никогда не подводил, может и на этот раз.... ой, а где айпишник шлема? Почему прочерки вместо него? Возможно требуется рестартануть вайфай после смены DNS?... Но я на Квасе тестировал смену и перебор DNS, и без рестарта работало. Ок, хуже не будет.
Мда, хуже не стало, но и лучше тоже. Что-ж, раз пошла такая пьянка, влепим еще одну задержку после рестарта, традиционные пять секунд.
Тридцать шестая... или это уже сорок третья?.. кружка кофе и третья пачка Хитса немного отодвигают в сторону мысли на тему "я идиот и бестолочь, дебил и бездарь, в дворниках самое место". Гуд, у нас есть отличная команда echo, вот пусть и покажет, что там с айпишником. Ага, пока есть. Хм, а теперь пропал. А как же рестарт вайфая? Очень странно.
Пробуем снова.... нет айпишника, вот прям совсем нету, причем сразу..... Надеваю шлем....
(Слово удалено системой), да он спит!!!! Точнее, спал. Я тут весь потолок истоптал, а шлем дрыхнет в самый ответственный момент. И вырубает вайфай, разумеется. Что-ж, уже проще, будем бороться с ним
кнопкой Питание. Вот уж от нее он никуда не денется, мертвого разбудит.
Работает, но... Жмакать кнопку Питание конечно не запрещается сколько угодно раз, но хорошо бы только в моменты чрезвычайной необходимости, когда шлем подносит руку или чего у него там к рубильнику вайфая.
И вот тут засада... С этой проблемой боролся долго и безуспешно, но сейчас немного другая ситуация. Может прокатит?...
Да где же она, эта команда... Среди сотен тестовых батников и стольких же текстовых файлов найти... о, вот она, даже каталог Power есть, с батником нужным.
Так, пробуем, добавим ветвление на эту команду, когда вайфай потухнет, а также поставим маячок echo, который покажет, когда она сработала и запускаем.
Ух ты! Вау!... Оно работает. Даже не верится, вот ведь.
Остался сущий пустяк: прогнать программу раз пятьдесят на обоих шлемах, написать русские буковки множества сообщений, какой сервер проверяется, доступны обновления или нет, и так далее. Убрать все лишнее, проверить все подпрограммы и их вызовы, на нужном ли они месте, еще раз прогнать раз двадцать. Сбпрсить шлемы до заводских, прогнать на первоначальной настройке. Словом, процентов 70% от написания и отладки непосредственно кода.
Всё просто, не правда ли?
p.s. Не стал расписывать здесь разные дополнительные моменты поиска решений: можно ли вообще что-то запустить на шлеме, а если так, из какого каталога, какие adb команды отключают и включают вайфай, а также пробуждают шлем от спячки, как прописать DNS в шлем через тот же adb и так далее... Это я нашел ранее.
p.p.s Полагаю, тут многовато непонятных терминов, уж простите мне это, но без них никак не обойтись.
1 Комментарий
Рекомендуемые комментарии
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти