Česká kontrarozvědka FDTO (Fakt Děsně Tajná Organizace) má podezření, že v jejích řadách působí krtek a služba tak byla kompromitována. Obsah některých přísně tajných digitálních dokumentů byl nejenže vyzrazen tajným službám cizích mocností, ale zřejmě i modifikován, což způsobilo chaos v organizaci některých tajných operací a částečně tak paralyzovalo fungování celé kontrarozvědky. V zájmu národní bezpečnosti je zapotřebí krtka urychleně najít a polapit. Hledání však musí být maximálně diskrétní, aby krtek netušil, že se okolo něj utahuje smyčka.
Protože zavedení nových oficiálních bezpečnostních opatření při práci s utajovanými digitálními dokumenty by mohlo být podezřelé a krtka vyplašit, rozhodlo se vedení kontrarozvědky, že bude potřeba tato bezpečností opatření zavést utajeně. Tedy tak, aby si nikdo (kromě nejužšího vedení a Vás) nebyl vědom toho, že nějaká nová opatření vešla v platnost.
Vzhledem k Vaší léty prověřené loajalitě a bezchybné pracovní historii v IT jednotce kontrarozvědky jste byli pro tuto tajnou misi vybráni právě Vy. Vaším úkolem je vytvořit skript, který bude prezentován jako nový interní nástroj pro zvýšení efektivity při práci s elektronickými dokumenty, zatímco skrytě bude použit pro tajné zaznamenávání (tzv. logging) a ohlašování informací o tom, se kterými dokumenty (a kdy) daný uživatel pracoval.
Citlivé dokumenty jsou v kontrarozvědce zásadně uchovávány na serverech a přístup k nim probíhá vzdáleně pomocí příslušných nástrojů. Skript mole
(Makes One’s Life Easier) tedy bude fungovat jako tzv. wrapper nad textovými editory, což znamená, že textový editor bude spouštěn skrze skript mole
. Skript si bude pamatovat, které soubory byly v jakém adresáři prostřednictvím skriptu mole
editovány. Jednotlivé soubory je zároveň možné přiřazovat do skupin pro jednodušší filtrování při práci s velkým množstvím souborů. Pokud bude skript spuštěn bez parametrů, vybere skript soubor, který má být editován.
JMÉNO
mole
– wrapper pro efektivní použití textového editoru s možností automatického výběru nejčastěji či posledně modifikovaného souboru.
POUŽITÍ
mole -h
mole [-g GROUP] FILE
mole [-m] [FILTERS] [DIRECTORY]
mole list [FILTERS] [DIRECTORY]
mole secret-log [-b DATE] [-a DATE] [DIRECTORY1 [DIRECTORY2 [...]]]
-
-h
– Vypíše nápovědu k použití skriptu (volbasecret-log
by neměla být v nápovědě uvedena; nechceme krtka upozornit, že sbíráme informace). -
mole [-g GROUP] FILE
– Zadaný soubor bude otevřen.- Pokud byl zadán přepínač
-g
, dané otevření souboru bude zároveň přiřazeno do skupiny s názvemGROUP
.GROUP
může být název jak existující, tak nové skupiny.
- Pokud byl zadán přepínač
-
mole [-m] [FILTERS] [DIRECTORY]
– PokudDIRECTORY
odpovídá existujícímu adresáři, skript z daného adresáře vybere soubor, který má být otevřen.- Pokud nebyl zadán adresář, předpokládá se aktuální adresář.
- Pokud bylo v daném adresáři editováno skriptem více souborů, vybere se soubor, který byl pomocí skriptu otevřen (editován) jako poslední.
- Pokud byl zadán argument
-m
, tak skript vybere soubor, který byl pomocí skriptu otevřen (editován) nejčastěji.- Pokud bude při použití přepínače
-m
nalezeno více souborů se stejným maximálním počtem otevření, můžemole
vybrat kterýkoliv z nich.
- Pokud bude při použití přepínače
- Výběr souboru může být dále ovlivněn zadanými filtry
FILTERS
. - Pokud nebyl v daném adresáři otevřen (editován) ještě žádný soubor, případně žádný soubor nevyhovuje zadaným filtrům, jedná se o chybu.
-
mole list [FILTERS] [DIRECTORY]
– Skript zobrazí seznam souborů, které byly v daném adresáři otevřeny (editovány) pomocí skriptu.-
Pokud nebyl zadán adresář, předpokládá se aktuální adresář.
-
Seznam souborů může být filtrován pomocí
FILTERS
. -
Seznam souborů bude lexikograficky seřazen a každý soubor bude uveden na samostatném řádku.
-
Každý řádek bude mít formát
FILENAME:<INDENT>GROUP_1,GROUP_2,...
, kdeFILENAME
je jméno souboru (i s jeho případnými příponami),<INDENT>
je počet mezer potřebných k zarovnání aGROUP_*
jsou názvy skupin, u kterých je soubor evidován.- Seznam skupin bude lexikograficky seřazen.
- Pokud budou skupiny upřesněny pomocí přepínače
-g
(viz sekce FILTRY), uvažujte při výpisu souborů a skupin pouze záznamy patřící do těchto skupin. - Pokud soubor nepatří do žádné skupiny, bude namísto seznamu skupin vypsán pouze znak
-
. - Minimální počet mezer použitých k zarovnání (
INDENT
) je jedna. Každý řádek bude zarovnán tak, aby seznam skupin začínal na stejné pozici. Tedy např:
FILE1: grp1,grp2 FILE10: grp1,grp3 FILE: -
-
-
mole secret-log [-b DATE] [-a DATE] [DIRECTORY1 [DIRECTORY2 [...]]]
– Skript za účelem dopadení krtka vytvoří tajný komprimovaný log s informacemi o souborech otevřených (editovaných) skrze skriptmole
.- Pokud byly zadány adresáře, tajný log bude obsahovat záznamy o otevřených (editovaných) souborech pouze z těchto adresářů. Neexistující adresáře nebo adresáře bez záznamů budou ignorovány.
- Pokud nebyl zadán žádný adresář, tajný log bude obsahovat záznamy ze všech evidovaných adresářů.
- Otevřené (editované) soubory, které mají být v tajném logu zaznamenány, je možné dále omezit pomocí filtrů
-a
a-b
(viz níže).
FILTERS
může být kombinace následujících filtrů (každý může být uveden maximálně jednou):
[-g GROUP1[,GROUP2[,...]]]
– Specifikace skupin. Soubor bude uvažován (pro potřeby otevření nebo výpisu) pouze tehdy, pokud jeho spuštění spadá alespoň do jedné z těchto skupin.[-a DATE]
- Záznamy o otevřených (editovaných) souborech před tímto datem nebudou uvažovány.[-b DATE]
- Záznamy o otevřených (editovaných) souborech po tomto datu nebudou uvažovány.- Argument
DATE
je ve formátuYYYY-MM-DD
.
- Skript si pamatuje informace o svém spouštění v souboru, který je dán proměnnou
MOLE_RC
. Formát souboru není specifikován.- Pokud není proměnná nastavena, jedná se o chybu.
- Pokud soubor na cestě dané proměnnou
MOLE_RC
neexistuje, soubor bude vytvořen včetně cesty k danému souboru (pokud i ta neexistuje).
- Skript spouští editor, který je nastaven v proměnné
EDITOR
. Pokud není proměnnáEDITOR
nastavená, respektuje proměnnouVISUAL
. Pokud ani ta není nastavená, použije se příkazvi
.
- Tajný log vygenerovaný pomocí příkazu
secret-log
bude uložen v adresáři.mole
umístěném v domovském adresáři (tedy např./home/$USER/.mole/
). Název souboru bude ve formátulog_USER_DATETIME.bz2
, kdeUSER
odpovídá jménu aktuálního uživatele aDATETIME
odpovídá datu a času vytvoření tajného logu.- Tajný log bude obsahovat záznamy o všech známých manipulacích (tedy otevření skrze skript
mole
) s vybranými soubory, případně dále omezených na daný časový úsek pomocí přepínačů-a
,-b
, nebo jejich kombinací. - Formát záznamů v logu bude
FILEPATH;DATETIME_1;DATETIME_2;...
, kdeFILEPATH
je reálná cesta k souboru,DATETIME_N
je datum a čas chronologickyN
-tého známého otevření souboru buď napříč celou známou historií, nebo v daném časovém úseku.
- Záznamy v tajném logu budou seřazeny lexikograficky podle hodnoty
FILEPATH
.
- Tajný log bude obsahovat záznamy o všech známých manipulacích (tedy otevření skrze skript
- Formát hodnot
DATETIME
aDATETIME_N
jeYYYY-MM-DD_HH-mm-ss
. - Tajný log komprimujte pomocí utility
bzip2
.
- Můžete předpokládat, že nebude zadána skupina se jménem
-
a že názvy skupin nebudou obsahovat znak čárky - Můžete předpokládat, že názvy souborů (ani jejich cesty) nebudou obsahovat znaky středníku nebo dvojtečky.
- Skript nebere v potaz otevření nebo editace, které byly provedeny mimo skript
mole
. - Stejně tak pro příkaz
mole [-m] [FILTERS] [DIRECTORY]
skript nebere v potaz soubory, se kterými dříve počítal a které jsou nyní smazané (u ostatních příkazů není potřeba kontrolovat existenci souboru). Například, pokud byl posledně editovaný soubor smazán, volánímole
otevře předposledně editovaný soubor, pokud byl i ten smazán, bude otevřen předpředposledně editovaný soubor, atp. UPDATED 6.3. - Při rozhodování relativní cesty adresáře je doporučené používat reálnou cestu (realpath). Důvod např.:
- Skript vrací úspěch v případě úspěšné operace nebo v případě úspěšné editace. Pokud editor vrátí chybu, skript vrátí stejný chybový návratový kód. Interní chyba skriptu bude doprovázena chybovým hlášením.
- Skript by měl mít v celém běhu nastaveno
POSIXLY_CORRECT=yes
. - Skript by měl běžet na všech běžných shellech (dash, ksh, bash). Můžete použít GNU rozšíření pro
sed
čiawk
. Jazyk Perl nebo Python povolen není. - Skript by měl ošetřit i chybový případ, že na daném stroji utilita
realpath
není dostupná (např. ukončením programu s chybovým kódem). - UPOZORNĚNÍ: některé servery, např.
merlin.fit.vutbr.cz
, mají symlink/bin/sh -> bash
. Ověřte si proto, že skript skutečně testujete daným shellem. Doporučujeme ověřit správnou funkčnost pomocí virtuálního stroje níže. - Skript musí běžet na běžně dostupných OS GNU/Linux, BSD a MacOS. Studentům je k dispozici virtuální stroj, na kterém lze ověřit správnou funkčnost projektu, s obrazem ke stažení zde: http://www.fit.vutbr.cz/~lengal/public/trusty.ova (pro VirtualBox, login:
trusty
/ heslo:trusty
). - Skript nesmí používat dočasné soubory. Povoleny jsou však dočasné soubory nepřímo tvořené jinými příkazy (např. příkazem
sed -i
). SouborMOLE_RC
ani tajné log soubory nejsou v tomto případě chápány jako dočasné soubory. - Není potřeba řešit možnost souběhu několika instancí skriptu, v takovém případě je chování nedefinované.
- Implementuje u příkazů
mole [-m] [FILTERS] [DIRECTORY]
,list
asecret-log
nový přepínač-r
(recursive), který způsobí, žemole
bude hledat vyhovující záznamy o otevření (editaci) souborů i mezi záznamy, které se vztahují ke vnořeným adresářům vzhledem kDIRECTORY
(resp. aktuálnímu adresáři, pokud nebylDIRECTORY
zadán).- Tedy například příkaz
mole list ~/proj1
by na výstup vypsal jak soubormain.c
, tak soubor.git/config
za předpokladu, že má v loguMOLE_RC
uloženy záznamy o otevření souborů~/proj1/main.c
a~/proj1/.git/config
.
- Tedy například příkaz
- Implementujte u příkazů
mole [-m] [FILTERS] [DIRECTORY]
alist
nový přepínač-d
(default), který způsobí, žemole
bude pracovat pouze se záznamy spuštění (editace) souborů bez specifikované skupiny.- Tedy např. při použití příkazu
mole -d ~
bude ignorován záznam o spuštěnímole -g bash ~/.bashrc
. - Přepínač
-d
bude výlučný s přepínačem-g
, tedy v rámci jednoho spuštěnímole
nemohou být zadány oba přepínače zároveň.
- Tedy např. při použití příkazu
- Implementace přepínačů
-d
a-r
je nepovinná; korektní implementace může vynahradit jiné bodové ztráty.
Odevzdávejte pouze skript mole
(nebalte ho do žádného archivu) do IS VUT.
- Dobrá dekompozice problému na podproblémy Vám může značně ulehčit práci a předejít chybám.
- Naučte se dobře používat funkce v shellu.
- Následující utility Vám mohou při řešení projektu velmi pomoci:
Následující příklady předpokládají, že skript mole
je dostupný v jedné z cest v proměnné PATH
.
- Editace různých souborů:
$ export MOLE_RC=$HOME/.config/molerc
$ date
Thu Feb 16 01:37:14 PM CET 2023
$ mole ~/.ssh/config
$ mole -g bash ~/.bashrc
$ mole ~/.local/bin/mole
$ mole -g bash ~/.bashrc # (D)
$ mole ~/.indent.pro
$ mole ~/.viminfo
$ date
Mon Feb 20 07:21:09 PM CET 2023
$ mole -g bash ~/.bash_history
$ mole -g git ~/.gitconfig
$ mole -g bash ~/.bash_profile # (C)
$ mole -g git ~/proj1/.git/info/exclude
$ mole ~/.ssh/known_hosts # (A)
$ mole -g git ~/proj1/.git/config
$ mole -g git ~/proj1/.git/COMMIT_EDITMSG
$ mole ~/proj1/.git/COMMIT_EDITMSG
$ mole -g git ~/proj1/.git/config # (F)
$ mole -g project ~/proj1/main.c
$ mole -g project ~/proj1/struct.c
$ mole -g project ~/proj1/struct.h
$ mole -g project_readme ~/proj1/README.md
$ date
Fri Feb 24 03:52:34 PM CET 2023
$ mole -g git2 ~/.gitconfig
$ mole ~/proj1/main.c
$ mole ~/.bashrc # (E)
$ mole ~/.indent.pro
$ mole ~/.vimrc # (B)
- Opětovná editace:
$ cd ~/.ssh
$ mole
... # spustí se editace souboru ~/.ssh/known_hosts (odpovídá řádku A)
$ mole ~
... # spustí se editace souboru ~/.vimrc (odpovídá řádku B)
$ mole -g bash ~
... # spustí se editace souboru ~/.bash_profile (odpovídá řádku C)
$ mole -g bash -b 2023-02-20 ~
... # spustí se editace souboru ~/.bashrc (odpovídá řádku D)
$ cd
$ mole -m
... # spustí se editace souboru ~/.bashrc (odpovídá řádku E)
$ mole -m -g git ~/proj1/.git
... # spustí se editace souboru ~/proj1/.git/config (odpovídá řádku F; ve skupině git byl daný soubor editován jako jediný dvakrát, zbytek souborů jednou)
$ mole -m -g tst
... # ! chyba, nebyl nalezen žádný soubor k otevření
$ mole -a 2023-02-16 -b 2023-02-20
... # ! chyba, nebyl nalezen žádný soubor k otevření
- Zobrazení seznamu editovaných souborů (OPRAVENO 11.3.):
$ mole list $HOME
.bash_history: bash
.bash_profile: bash
.bashrc: bash
.gitconfig: git,git2
.indent.pro: -
.viminfo: -
.vimrc: -
$ mole list -g bash $HOME
.bash_history: bash
.bash_profile: bash
.bashrc: bash
$ mole list -g project,project_readme ~/proj1
main.c: project
README.md: project_readme
struct.c: project
struct.h: project
$ mole list -b 2023-02-20 $HOME
.bashrc: bash
.indent.pro: -
.viminfo: -
$ mole list -a 2023-02-23 $HOME
.bashrc: -
.gitconfig: git2
.indent.pro: -
.vimrc: -
$ mole list -a 2023-02-16 -b 2023-02-24 -g bash $HOME
.bash_history: bash
.bash_profile: bash
$ mole list -a 2023-02-20 -b 2023-02-24 $HOME
$ mole list -g grp1,grp2 $HOME
- Vytvoření tajného logu:
$ date
Fri Feb 24 04:13:58 PM CET 2023
$ mole secret-log
$ bunzip2 -k --stdout /home/trusty/.mole/log_trusty_2023-02-24_16-14-01.bz2
/home/trusty/.bash_history;2023-02-20_19-21-13
/home/trusty/.bash_profile;2023-02-20_19-21-38
/home/trusty/.bashrc;2023-02-16_13-37-31;2023-02-16_13-38-02;2023-02-24_15-53-05
/home/trusty/.gitconfig;2023-02-20_19-21-22;2023-02-24_15-52-39
/home/trusty/.indent.pro;2023-02-16_13-38-34;2023-02-24_15-53-18
/home/trusty/.local/bin/mole;2023-02-16_13-37-46
/home/trusty/proj1/.git/COMMIT_EDITMSG;2023-02-20_19-25-12;2023-02-20_19-25-18
/home/trusty/proj1/.git/config;2023-02-20_19-24-59;2023-02-20_19-25-27
/home/trusty/proj1/.git/info/exclude;2023-02-20_19-22-04
/home/trusty/proj1/main.c;2023-02-20_19-25-51;2023-02-24_15-52-48
/home/trusty/proj1/README.md;2023-02-20_19-26-36
/home/trusty/proj1/struct.c;2023-02-20_19-26-03
/home/trusty/proj1/struct.h;2023-02-20_19-26-18
/home/trusty/.ssh/config;2023-02-16_13-37-19
/home/trusty/.ssh/known_hosts;2023-02-20_19-22-48
/home/trusty/.viminfo;2023-02-16_13-38-53
/home/trusty/.vimrc;2023-02-24_15-54-04
$ date
Fri Feb 24 04:15:13 PM CET 2023
$ mole secret-log -b 2023-02-22 ~/proj1 ~/.ssh
$ bunzip2 -k --stdout /home/trusty/.mole/log_trusty_2023-02-24_16-15-22.bz2
/home/trusty/proj1/main.c;2023-02-20_19-25-51
/home/trusty/proj1/README.md;2023-02-20_19-26-36
/home/trusty/proj1/struct.c;2023-02-20_19-26-03
/home/trusty/proj1/struct.h;2023-02-20_19-26-18
/home/trusty/.ssh/config;2023-02-16_13-37-19
/home/trusty/.ssh/known_hosts;2023-02-20_19-22-48
- Použití nepovinného přepínače
-r
:
$ date
Sat Feb 25 09:00:04 AM CET 2023
$ mole list -r -b 2023-02-24 ~/proj1
.git/COMMIT_EDITMSG: git
.git/config: git
.git/info/exclude: git
main.c: project
README.md: project_readme
struct.c: project
struct.h: project
$ mole -m -r -b 2023-02-24 ~/proj1
... # spustí se editace souboru ~/proj1/.git/COMMIT_EDITMSG nebo ~/proj1/.git/config
$ mole -r -m -g git -b 2023-02-24 ~/proj1
... # spustí se editace souboru ~/proj1/.git/config
- Použití nepovinného přepínače
-d
:
$ date
Sat Feb 25 09:08:10 AM CET 2023
$ mole list -d -b 2023-02-20 $HOME
.indent.pro: -
.viminfo: -
$ mole list -a 2023-02-23 -d $HOME
.bashrc: -
.indent.pro: -
.viminfo: -
$ mole -m -d -b 2023-02-20 ~
... # spustí se editace souboru ~/.indent.pro nebo ~/.viminfo
$ mole -m -d -g bash -b 2023-02-20 ~
... # ! chyba, přepínače -d a -g jsou výlučné