Mój Alfred – VNC
Jeśli łączycie się z wieloma komputerami korzystając z VNC, a do tego posiadacie Alfreda 2 z PowerPackiem, to zrobiłem coś dla Was.
Workflow, który stworzyłem pozwala na łatwe dodawanie, usuwanie oraz łączenie się z wieloma komputerami przy użyciu systemowej aplikacji Współdzielenie ekranu. Wszystkich zainteresowanych zapraszam do zapoznania się z działaniem i budową tego workflow.
VNC
Jak to działa:
- Dodawanie komputerów:
- w oknie Alfreda należy wpisać vnc setup oraz nazwę maszyny i jej numer IP z opcjonalnym podaniem portu, według schematu: Nazwa-numer_IP:port (np. Dom–192.168.1.103:5901)
- Łączenie się z komputerem:
- w oknie Alfreda należy wpisać vnc
- spośród listy wybrać nazwę konkretnej maszyny
- zostanie otwarta aplikacja Współdzielenie ekranu, która połączy nas z wybranym komputerem
- Usuwanie komputerów:
- w oknie Alfreda należy wpisać vnc delete
- spośród listy wybrać, która maszyna ma być usunięta
Co najważniejsze, nie trzeba pamiętać komend do dodawania lub usuwania komputerów, ponieważ pokażą się po wpisaniu w oknie Alfreda słowa vnc.
Przejdźmy teraz do budowy workflow.
Dodawanie komputerów
Wejście
Elementem wejściowym jest Keyword vnc setup, po którym podaje się nazwę komputera oraz jego adres IP z opcjonalnym podaniem portu według schematu:
Nazwa komputera-adres_IP:port
Na przykład:
Dom–192.168.1.104:5901
Ważne jest rozdzielenie nazwy i adresu IP myślnikiem, inaczej workflow nie będzie prawidłowo działał z podanym komputerem.
Wyjście
Na wyjściu mamy dwa elementy: skrypt i powiadomienie.
Skrypt wygląda następująco:
echo "{query}" >> ./addresses.txt
Jest to prosty zabieg dodający podaną na wejściu nazwę i adres komputera na końcu pliku tekstowego o nazwie addresses.txt
.
Powiadomienie wyświetla po prostu informację o dodaniu nazwy i adresu IP nowego komputera.
Usuwanie komputerów
Wejście
Elementem wejściowym jest Filter script. Po wpisaniu w oknie Alfreda słów vnc delete wykonany zostanie poniższy skrypt:
echo '<?xml version="1.0"?><items>'
while read line
do
echo '<item uid="vnc" arg="'$line'">
<title>'${line%-*}'</title>
<subtitle>Delete this machine</subtitle>
<icon>icon.png</icon>
</item>'
done < ./addresses.txt
echo '</items>'
Poniżej objaśnienie kodu:
echo '<?xml version="1.0"?><items>’``echo '</items>’
– to początek i koniec składni XML, która odpowiedzialna jest za wyświetlenie poszczególnych komputerów do usunięcia;while read line
do
done < ./addresses.txt
– jest to prosta pętla, która automatycznie wyświetli wszystkie zapisane w plikuaddresses.txt
komputery. Każda linijka jest przypisywana do zmiennejline
;echo '<item uid="vnc" arg="'$line'">
</item>
– elementitem
do wyświetlenia poszczególnych komputerów. Opcjaarg
to inaczej argument przekazywany dalej. Jest nim zmienna$line
, czyli cała linijka, w której zapisana jest nazwa komputera i jego adres IP w plikuaddresses.txt
;<title>'${line%-*}'</title>
– elementtitle
wyświetla nazwę komputera. Jest to możliwe dzięki${line%-*}
, które „wycina” wszystko, co znajduje się po myślniku (jak pamiętacie, między podawaną nazwą komputera a adresem IP trzeba było taki myślnik wstawić, teraz już wiadomo, dlaczego);<subtitle>Delete this machine</subtitle>
– element<subtitle>
wyświetlaDelete this machine
pod nazwą każdego komputera;<icon>icon.png</icon>
– element<icon>
odpowiedzialny jest za wyświetlenie konkretnej ikony.
Wyjście
Na wyjściu mamy dwa elementy: skrypt i powiadomienie.
Skrypt wygląda następująco:
awk '!/^{query}/' ./addresses.txt > tmp;mv tmp ./addresses.txt
Polega na usunięciu tekstu {query}
, który był podany na wejściu jako argument z pliku addresses.txt
poprzez tymczasowe zapisanie nowej zawartości do tmp
i zamianę nazwy tmp
na addresses.txt
, czyli podmienienie pliku.
Powiadomienie informuje o usunięciu danego komputera.
Łączenie się z komputerami
Wejście
Elementem wejściowym jest Filter script. Po wpisaniu w oknie Alfreda słów vnc wykonany zostanie poniższy skrypt:
echo '<?xml version="1.0"?><items>'
while read line
do
echo '<item uid="vnc" arg="'${line#*-}'">
<title>'${line%-*}'</title>
<subtitle>Connect with this machine</subtitle>
<icon>icon.png</icon>
</item>'
done < ./addresses.txt
echo '</items>'
Poniżej objaśnienie kodu:
echo '<?xml version="1.0"?><items>’
echo ’’` – to początek i koniec składni XML, która odpowiedzialna jest za wyświetlenie poszczególnych komputerów do usunięcia;while read line
do
done < ./addresses.txt
– jest to prosta pętla, która automatycznie wyświetli wszystkie zapisane w plikuaddresses.txt
komputery. Każda linijka jest przypisywana do zmiennejline
;echo '<item uid="vnc" arg="'${line#*-}'">
</item>
– elementitem
do wyświetlenia poszczególnych komputerów. Opcjaarg
to argument, którym jest${line#*-}
, czyli zawartość pojedynczej linijki plikuaddresses.txt
z „wyciętym” tekstem znajdującym się przed myślnikiem, co jak nietrudno się domyśleć da nam sam adres IP z ewentualnym portem, które będą przekazane do wyjścia;<title>'${line%-*}'</title>
– elementtitle
wyświetla nazwę komputera. Jest to możliwe dzięki${line%-*}
, które „wycina” wszystko, co znajduje się po myślniku (jak pamiętacie, między podawaną nazwą komputera a adresem IP trzeba było taki myślnik wstawić, teraz już wiadomo, dlaczego);<subtitle>Connect with this machine</subtitle>
– element<subtitle>
wyświetlaConnect with this machine
pod nazwą każdego komputera;<icon>icon.png</icon>
– element<icon>
odpowiedzialny jest za wyświetlenie konkretnej ikony.
Wyjście
Elementem wyjścia jest poniższy skrypt:
open vnc://{query}
Korzysta on z możliwości uruchomienia aplikacji przyjmującej adresy vnc://
, czyli Współdzielenie ekranu. Otrzymuje ona {query}
, czyli otrzymany na wejściu adres IP z ewentualnym portem. Efektem jest nawiązanie połączenia z wybranym komputerem.
Jak do tej pory jest to chyba pierwszy workflow, z którego jestem bardzo dumny (jako osoba nie zajmująca się programowaniem musiałem się nieźle naszukać, jak to wszystko rozwiązać). Jeśli macie jakieś sugestie, w jaki sposób usprawnić ten workflow albo czego mu brakuje, to szczerze zachęcam do udzielenia komentarzy.