Починка. Автозапуск не включался ни в одной версии, а защита правил,
добавленная в неопубликованную 0.1.1, запирала движок от его же файлов.
Обновиться стоит всем, кто ставил 0.1.0.
Автозапуск не включался вовсе
Если приложение стоит в папке с пробелом в имени — то есть в Program Files, куда его и ставит установщик, — задание в Планировщике не
создавалось никогда.
schtasks /TR принимает программу и её аргументы одной строкой, поэтому
путь приходилось брать в кавычки внутри аргумента. Windows PowerShell
5.1, передавая такой аргумент программе, кавычки внутри не экранирует: до
schtasks доезжали два аргумента — C:\Program и остаток. Снаружи это
выглядело так: мелькнуло окно PowerShell, переключатель сам вернулся
в «выключено», объяснений нет. На машине разработчика, где приложение
лежит в папке без пробела, всё работало.
Теперь задание создаётся из XML, где путь и аргументы — разные элементы,
и склеивать нечего. Заодно ушли ещё два тихих отказа: Планировщик по
умолчанию останавливает такое задание через трое суток работы и не
запускает его на батарее — для сторожа, который должен работать всегда,
это значит, что на ноутбуке без розетки блокировки просто не включались бы.
Код возврата schtasks теперь проверяется. Отклонённый UAC и «Планировщик
не принял задание» — разные события, и оба доходят до человека текстом,
а не отскоком переключателя.
Жёсткий сценарий нельзя было снять никогда
Прямое следствие предыдущего, и куда заметнее его.
Права на защищённую папку guard расставлялись до создания задания.
Отказ schtasks оставлял на машине закрытую папку без движка
с повышением — единственного, кто имеет право в неё писать. Дальше движок
не мог сохранить теневую копию, молча, и следующий такт читал с диска
«запроса на снятие не было» и ставил отметку заново. Отсчёт до снятия
вечно начинался с пятнадцати минут: цифры шли вниз секунду-две
и возвращались к началу. То есть жёсткий сценарий не снимался вообще
никогда, сколько ни жди.
Отметка о запросе теперь держится ещё и в памяти движка, так что отсчёт
идёт, даже если записать её не удалось. Подделать её снаружи нельзя — её
ставит сам движок по своим часам. Права на guard ставятся только после
того, как задания созданы; если создать не удалось, папка открывается
обратно.
Там же молча терялся расход за сутки — дневные лимиты обнулялись при
каждом запуске приложения. Об отказе записи теперь пишется в журнал,
и окно показывает предупреждение вместе с тем, что делать.
Отказы, о которых никто не узнавал
- Файл с меткой порядка байтов разбирался как битый, а битый файл каждый
читающий молча заменял значениями по умолчанию — то естьconfig.json,
однажды сохранённый редактором с меткой, выглядел как «все сценарии
выключились сами». - Импорт, экспорт, пауза и «запросить снятие» показывают причину отказа.
Раньше исключение пропадало в никуда, и кнопка выглядела неработающей —
особенно обидно на «запросить снятие»: диалог закрывался как при успехе,
а правда выяснялась через пятнадцать минут. - Версия в подвале настроек берётся из
package.json, а не вписана руками. rust-versionприведён к правде: заявлено было 1.77, код требует 1.82.
Установка
Скачайте FocusLock_0.1.2_x64-setup.exe и запустите. Установщик не
подписан, поэтому SmartScreen предложит подумать — «Подробнее» →
«Выполнить в любом случае».
После установки один раз включите «Запускать при входе в Windows»
в настройках: это создаёт задания в Планировщике и заодно чинит права на
папке данных, если предыдущая попытка оставила их закрытыми.
Подробности и то, что менялось раньше, — в
CHANGELOG.md.