VPN-кліенту патрэбна прывілеяваная дапамога для пераналадкі сеткі, і гэты факт ужываецца занадта шырока да ўсяго вакол. Скрыпту, які мантуе файлавы рэсурс, root не патрэбны, бо рэсурс належыць сеансу ўвайшоўшага карыстальніка і яго ўліковым даным. Вынясенне мантавання з прывілеяванага шляху прыбірае патрэбу ў правілах sudo, root-хуках і праўках убудаваных праграм. Застаецца невялікі applet, які застаецца адкрытым, сочыць за адным профілем і робіць адну спробу.

Чаму гэта належыць да сеансу карыстальніка

Смантаваны том — уласцівасць сеансу, які яго смантаваў. Сеанс іншага карыстальніка яго не бачыць, а мантаванне, якое належыць root, паводзіць сябе інакш, чым створанае Finder. Захаванне мантавання ў сеансе карыстальніка захоўвае гэтую семантыку.

Прывілеяваныя памочнікі існуюць для тых частак, якім яны сапраўды патрэбны: стварэнне тунэльнага інтэрфейсу, змена маршрутаў, абнаўленне рэзальвера. Мантаванне SMB-рэсурсу не належыць да гэтых частак. Стаўленне да яго як да такой часткі прымушае выбіраць паміж sudo без пароля і root-скрыптам, які выконваецца, калі нікога няма. І тое і другое — большая рызыка, чым апраўдвае праблема, а падыход праз сеанс карыстальніка цалкам пазбягае гэтага выбару.

Уласныя хукі падключэння Tunnelblick тут не замена, паколькі яны выконваюцца па-за сеансам працоўнага стала, а іх парадак адносна скрыптоў кліента не вызначаны. Апытанне стану з карыстальніцкага applet — меншы механізм з меншай колькасцю дапушчэнняў.

Спачатку дакажыце ўручную, што рэсурс працуе

Аўтаматызацыя не можа прадаставіць маршрут, дазвол або ўліковы запіс, якіх няма. Падключыце VPN уручную і адкрыйце рэсурс у Finder, перш чым пісаць любы скрыпт. Калі гэта не ўдасца, скрыпт пацерпіць няўдачу больш заблытаным чынам.

Запішыце тры значэнні, якія будзе выкарыстоўваць скрыпт: імя профілю дакладна так, як яго пералічвае Tunnelblick, URL рэсурсу і імя тома, якое Finder паказвае пасля мантавання. Імя тома важнае, бо праверка існуючага мантавання выкарыстоўвае яго, а праверка толькі па імені — зручная страхоўка, а не доказ ідэнтычнасці сервера. Выкарыстоўвайце імя, унікальнае на машыне. Затым пераканайцеся, што сервер наогул адказвае.

smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs

Першая каманда даказвае, што сервер адказвае, другая — што імя профілю развязаваецца, а трэцяя паказвае, як выглядае паспяховае мантаванне. Зафіксуйце ўсе тры, перш чым нешта аўтаматызаваць.

Прачытайце стан профілю з Tunnelblick

Tunnelblick прадастаўляе свае канфігурацыі і іх станы праз AppleScript, і гэта адзіны хук, патрэбны гэтаму праекту. Важны той стан, які паведамляецца для гэтага аднаго профілю, а не прысутнасць праграмы.

Апытанне мае наступствы, пра якія варта сказаць. Перападключэнне, карацейшае за інтэрвал, можа прайсці незаўважна, і applet зусім не бачыць пераходу. Гэта прымальна для страхоўкі мантавання і непрымальна для ўсяго, што павінна рэагаваць на кожную падзею. Калі патрэбна дакладнасць падзей, гэта няправільны механізм, а не механізм, якому патрэбны карацейшы таймер. Выбірайце інтэрвал з улікам гэтага кампрамісу.

property attempted : false

on idle
    set profileName to "Office"
    set shareURL to "smb://files.corp.example/OfficeTeam"
    set volName to "OfficeTeam"
    tell application "Tunnelblick" to set vpnState to state of first configuration whose name is profileName
    if vpnState is not "CONNECTED" then
        set attempted to false
        return 20
    end if
    tell application "Finder" to set mounted to (exists disk volName)
    if (not mounted) and (not attempted) then
        set attempted to true
        try
            mount volume shareURL
        end try
    end if
    return 20
end idle

Экспартуйце яго як праграму з магчымасцю заставацца адкрытай, затым запусціце ў сеансе ўвайшоўшага карыстальніка, а не праз sudo.

Смантуйце адзін раз, затым спыніце спробы

Сцяг спробы — гэта тое, што не дае гэтаму ператварыцца ў цыкл адгадвання ўліковых даных. Як толькі applet паспрабаваў, ён чакае змены стану падключэння, перш чым паспрабаваць зноў.

Такія паводзіны наўмысныя. Рэсурс, які адмаўляе ў мантаванні, звычайна адмаўляе з прычыны, якую паўторная спроба не выправіць, а паўторныя спробы ператвараюць адзін запыт у іх паток. Сцяг скідваецца, калі профіль выходзіць з падключанага стану, таму сапраўднае перападключэнне дае роўна адну новую спробу. Выхад і паўторны запуск applet таксама скідваюць яго, і гэта ручное перавызначэнне. Ні адзін з шляхоў не хавае збой; абодва пакідаюць яго бачным у Finder.

Скрыпт не змяшчае пароля, і так павінна застацца. Дазвольце аперацыі мантавання запытаць, а звязцы ключоў — рабіць тое, што падтрымлівае арганізацыя. Убудоўванне ўліковых даных у URL ператварае зручны скрыпт у сакрэт, які трэба ротаваць.

Што памочнік не можа

Тры абмежаванні варта запісаць побач з applet. Ён не можа выняць заняты том пасля сеткавага збою, не можа гарантаваць, што DNS і сервер гатовыя, калі стан кажа «падключана», і не рэагуе на кожнае перападключэнне.

Першае абмежаванне найважнейшае на практыцы. Рэсурс, сервер якога знікае, пакідае том, які выглядае смантаваным і блакуе доступ, а ветлівае выпраўленне — завяршыць файлавыя аперацыі і выняць яго да планавага адключэння. Другое тлумачыць большасць няўдалых першых спроб: тунэль падняты, пакуль рэзальвер яшчэ не дагнаў, таму пачакайце і потым адзін раз смантуйце ўручную для пацверджання. Трэцяе — той самы кампраміс апытання, а не памылка, якую трэба выправіць.

Для машыны без нагляду або кіраванага парку гэтая схема мае няправільную форму. Выкарыстоўвайце палітыку мантавання, якая належыць адміністратару, замест пашырэння applet працоўнага стала да прывілеяванай службы.

Падобныя артыкулы