Projekt bazy uniwersalnego dashboarda
Transkrypt
Projekt bazy uniwersalnego dashboarda
Projekt bazy uniwersalnego dashboarda Stanisław Klekot, nr indeksu 126398 3 marca 2013 1 Opis wycinka rzeczywistości DashWiki to w założeniu aplikacja typu wiki dla administratorów. Od tradycyjnych silników różni się tym, że potrafi pobierać dane użyte do wypełnienia strony z zewnętrznych źródeł, takich jak system monitoringu czy system zbierania danych o wydajności i rysowania wykresów. Łączenie się z zewnętrznymi systemami realizowane jest za pomocą makr użytych w treści strony. DashWiki ma służyć przede wszystkim za panel kontrolny („dashboard”), na którym są zebrane najważniejsze informacje o bieżącym stanie sieci, serwerów czy aplikacji i z którego da się łatwo dostać do paneli z danymi szczegółowymi (które mogą być kolejnymi stronami wiki albo zewnętrznymi webaplikacjami). Użytkownik Żeby móc wyedytować stronę użytkownik musi się zalogować, więc DashWiki powinno znać nazwę tego użytkownika (reg008). Użytkownik ma już login dla innych systemów i typowo jest to niedługi ciąg znaków (do 64 znaków; ogr015). Oczywiście login jest unikalny (ogr014). Typowa funkcja skrótu zwraca 128 do 256 bitów, co w systemie szesnastkowym powinno się dać zapisać za pomocą 64 cyfr — hasz hasła może mieć zatem do 64 znaków (ogr016). Strona wiki Strona ma pewną nazwę (unikalną; reg001) i zawartość, która mówi, jaki tekst i jak sformatowany należy wyświetlić w przeglądarce. Nazwy stron w DashWiki nie odbiegają od tradycyjnych silników, stosowana jest konwencja „CamelCase” z użyciem liter, cyfr i podkreślnika, możliwe jest też użycie w nazwie slasha (dla zbudowania hierarchii stron); nazwa strony powinna mieć od 2 do 128 znaków (ogr002). Oczywiście dwie różne strony nie mogą mieć tej samej nazwy (ogr001). Zawartość strony jest tekstem bez specjalnych ograniczeń oprócz użytego języka formatowania (ogr003). Ze względu na koszt parsowania i przetwarzania języka formatowania strona jest jeszcze opatrzona skrótem (haszem) treści, który może być użyty jako identyfikator dla gotowego kodu HTML w cache’u. Skrót jest ciągiem znaków o długości do 64 znaków (ogr004). Strona domowa Użytkownik może mieć ustawioną stronę startową, która wyświetla się mu po zalogowaniu (reg009). Jeśli nie ma ustawionej takiej strony, wyświetla się domyślna. Strona startowa, jeśli jest ustawiona (reg011), musi być prawidłową nazwą strony (ogr017, ogr017). To użytkownik wybiera swoją stronę startową, więc nie każda strona będzie czyjąś startową (reg010), a niektóre strony będą startowymi dla wielu użytkowników (reg012). Treść strony — makra W treści strony można używać makr. Każde z makr jest identyfikowane jednoznacznie przez nazwę (reg022 ogr025), która jest niepustym ciągiem do 64 znaków (ogr026). Makro w użyciu przypomina funkcję z języków programowania: ma listę przyjmowanych argumentów w postaci ciągu słów oddzielonych przecinkami (do 256 znaków; ogr027) i typ zwracanych danych (jedno słowo do 64 znaków; ogr028, reg029, reg031). Zwracany typ służy do ustalenia w jaki sposób traktować użycie makra: „lista” powoduje, że zostanie wygenerowany zestaw wierszy w tabeli, po jednym wierszu dla każdego elementu z wyniku; „grafika” wstawia w miejscu makra obraz PNG/GIF/JPEG (w typowym przypadku będzie to wykres zmian pewnej wartości w czasie), „stan” to krótki tekst opisujący bieżącą sytuację usługi czy hosta (przykładowo „działa”, „wyłączony”, „nie wiadomo”) i tak dalej. Zwracany typ jest identyfikowany przez nazwę (reg028). 1 Makro jest elementem, którego użycie powoduje komunikację z innymi systemami, więc potrzebne są informacje na temat celu komunikacji (URL, para host+port albo analogiczne, opisane przez ciąg do 256 znaków; ogr030). Do komunikacji z celem makro używa jednego z kilku protokołów, jak XML-RPC, SOAP czy zwykłe żądanie HTTP GET (reg023). Nazwa protokołu jest ciągiem do 64 znaków (ogr029). Każde makro musi skądś pobierać dane, więc musi mieć zdefiniowany dokładnie jeden protokół (reg024, reg026). Makro jest sparametryzowane po to, żeby mogło żądać od zewnętrznego systemu danych na temat różnych obiektów. Żeby to uzyskać makro musi przekazać w żądaniu parametry. Opis tych parametrów jest ciągiem do 256 znaków (ogr031). Makra są definiowane przez użytkownika, a obsługiwane przez DashWiki protokoły i typy zwaracanych danych są zdefiniowane przez samą aplikację, może więc istnieć protokół albo typ danych, który nie jest używany przez żadne makro (reg025, reg030), może też istnieć protokół albo typ danych używany przez wiele makr (reg027, reg032). Historia edycji stron Każda strona ma swoją historię edycji. Dane historyczne mają podobną strukturę do zwykłych stron (nazwa, zawartość i skrót o takich samych typach; ogr005, ogr006, ogr007), rozszerzoną o dodatkowe informacje: czas utworzenia (data z godziną; ogr008), kolejny numer zwany rewizją (liczba całkowita 32-bitowa większa od 0; ogr009) i autora (reg013). Autorem musi być jeden użytkownik (ogr010, reg015), ta informacja ma zatem tę samą formę. Użytkownik mógł nie utworzyć żadnej strony (reg014), mógł również utworzyć wiele stron (reg016). Strona wiki musi mieć odpowiadającą jej historię — odpowiednia strona w historii ma tę samą nazwę (reg004), przy czym najnowsza (o najwyższej rewizji) strona w historii o tej nazwie musi mieć taką samą zawartość i taki sam hasz, jak strona (reg006, reg007). Strona w historii nie musi mieć odpowiadającej jej strony, jeśli strona o tej nazwie została usunięta (reg005). Rekord odpowiadający usunięciu strony będzie w takim przypadku zawierał NULL w zawartości i w haszu. Nie mogą istnieć w historii dwie wersje tej samej strony, które mają tę samą rewizję albo ten sam czas utworzenia (ogr012, ogr013, reg002, reg003). Sesja HTTP Użytkownik musi być zalogowany żeby móc edytować strony. Do ustalenia które żądanie HTTP jest od zalogowanego użytkownika służy sesja. Każda sesja ma unikalny identyfikator, losowy ciąg znaków o długości do 64 znaków (reg017, ogr019, ogr020). Sesja może być przypisana do użytkownika (reg020, ogr021 i ogr022, bo właściciel musi mieć ten sam format), ale nie musi, gdy dotyczy niezalogowanego odwiedzającego (reg018). Użytkownik nie musi być zalogowany do DashWiki, więc może nie mieć żadnej sesji (reg019), może też być zalogowany wielokrotnie na różnych stanowiskach (reg021). Sesja ma czas wygaśnięcia podany w formie daty z godziną (ogr023). Sesja przenosi informację o stanie aplikacji między żądaniami HTTP. Ta informacja (zmienne sesyjne) jest zbiorem zmiennych zserializowanym do formatu JSON. Nie ma specjalnych ograniczeń na wielkość tego środowiska (ogr024). 2 2 2.1 Reguły funkcjonowania i ograniczenia dziedzinowe Reguły funkcjonowania oznaczenie reg001 reg002 reg003 reg004 reg005 reg006 reg007 reg008 reg009 reg010 reg011 reg012 reg013 reg014 reg015 reg016 reg017 reg018 reg019 reg020 reg021 reg022 reg023 reg024 reg025 reg026 reg027 reg028 reg029 reg030 reg031 reg032 definicja strona jest identyfikowanym przez nazwę opisem dashboarda strona w historii jest identyfikowaną przez nazwę i datę utworzenia wersją strony strona w historii alternatywnie jest identyfikowana przez nazwę i rewizję strona musi mieć odpowiadającą jej stronę w historii o tej samej nazwie strona w historii nie musi odpowiadać żadnej stronie strona ma jedną odpowiadającą jej stronę w historii strona w historii odpowiada najwyżej jednej stronie użytkownik jest zalogowaną do aplikacji osobą mogącą edytować strony; identyfikowany jest przez nazwę użytkownik może mieć zdefiniowaną stronę domową strona nie musi być stroną domową użytkownika użytkownik ma najwyżej jedną stronę domową strona może być stroną domową wielu użytkowników strona w historii musi mieć użytkownika jako autora użytkownik nie musi być autorem żadnej strony w historii strona w historii ma jednego użytkownika jako autora użytkownik może być autorem wielu stron w historii sesja to zbiór zmiennych w aplikacji identyfikowany przez identyfikator sesji sesja może dotyczyć użytkownika użytkownik może nie mieć żadnej sesji sesja dotyczy najwyżej jednego użytkownika użytkownik może mieć wiele sesji makro to identyfikowana przez nazwę funkcja, której można użyć w opisie dashboarda protokół to identyfikowany przez nazwę sposób komunikacji z zewnętrznymi aplikacjami (używany przez makro) makro musi mieć zdefiniowany protokół protokół nie musi być używany przez żadne makro makro ma zdefiniowany jeden protokół protokół może być używany przez wiele makr typ danych to identyfikowany przez nazwę rodzaj danych zwracany przez makro makro musi mieć zdefiniowany zwracany typ danych typ danych nie musi być zwracany przez żadne makro makro zwraca jeden typ danych typ danych może być zwracany przez wiele makr Tabela 1: Lista reguł funkcjonowania opisanego wycinka rzeczywistości 2.2 Ograniczenia dziedzinowe oznaczenie ogr001 ogr002 ogr003 ogr004 ogr005 definicja nazwa strony jest unikalna nazwa strony jest ciągiem od 2 do 128 znaków, składającym się z liter, cyfr, podkreślenia i slasha, zaczynającym się od wielkiej litery zawartość strony jest tekstem dowolnej długości skrót zawartości strony jest ciągiem od 0 do 64 znaków nazwa strony w historii jest ciągiem od 2 do 128 znaków, składającym się z liter, cyfr, podkreślenia i slasha, zaczynającym się od wielkiej litery 3 oznaczenie ogr006 ogr007 ogr008 ogr009 ogr010 ogr011 ogr012 ogr013 ogr014 ogr015 ogr016 ogr017 ogr018 ogr019 ogr020 ogr021 ogr022 ogr023 ogr024 ogr025 ogr026 ogr027 ogr028 ogr029 ogr030 ogr031 definicja zawartość strony w historii jest tekstem dowolnej długości skrót zawartości strony w historii jest ciągiem od 0 do 64 znaków czas utworzenia strony w historii jest datą z godziną rewizja strony w historii jest liczbą całkowitą z zakresu [1, 232 − 1] autor strony w historii jest użytkownikiem nazwa autora strony w historii jest ciągiem od 0 do 64 znaków strona w historii ma unikalną parę nazwa + rewizja strona w historii ma unikalną parę nazwa + czas utworzenia nazwa użytkownika jest unikalna nazwa użytkownika jest ciągiem od 0 do 64 znaków hasz hasła użytkownika jest ciągiem od 0 do 64 znaków strona startowa użytkownika odpowiada nazwie strony wiki strona startowa użytkownika jest ciągiem od 0 do 128 znaków identyfikator sesji jest unikalny identyfikator sesji jest ciągiem od 0 do 64 znaków odwiedzający, do którego należy sesja, jest użytkownikiem nazwa odwiedzającego, do którego należy sesja, jest od 0 do 64 znaków czas wygaśnięcia sesji jest datą z godziną zestaw zmiennych sesyjnych sesji jest tekstem dowolnej długości nazwa makra jest unikalna nazwa makra jest ciągiem od 1 do 64 znaków przyjmowane parametry makra są opisane ciągiem od 0 do 256 znaków typ danych zwracany przez makro jest ciągiem od 0 do 64 znaków protokół używany przez makro jest ciągiem od 0 do 64 znaków cel makra jest ciągiem od 0 do 256 znaków parametry dla celu makra są opisane ciągiem od 0 do 256 znaków Tabela 2: Lista ograniczeń dziedzinowych w opisanym wycinku rzeczywistości 3 Definicje predykatowe encji oznaczenie enc001 enc002 enc003 enc004 enc005 enc006 enc007 definicja Page(page name, content, hash) HistoryPage(hist page name, hist content, hist hash, creation time, revision) User(user name, password hash) Session(session id, expiry time, variables) Macro(macro name, destination, input args, output args) Protocol(protocol) ResultType(result type) Tabela 3: Definicje encji w bazie 4 4 Definicje predykatowe związków między encjami oznaczenie zwi001 zwi002 zwi003 zwi004 zwi005 zwi006 definicja HasHomePage(User(0..*) : Page(0..1)) IsAuthor(HistoryPage(0..*) : User(1..1)) IsSessionFor(Session(0..*) : User(0..1)) UsesProtocol(Macro(0..*) : Protocol(1..1)) ReturnsType(Macro(0..*) : ResultType(1..1)) HasHistory(Page(0..*) : HistoryPage(1..1)) Tabela 4: Definicje relacji w bazie 5 Diagram związków encji Diagram ER dla DashWiki 5 6 Definicje relacji oznaczenie rel001 rel002 rel003 rel004 rel005 rel006 rel007 definicja Pages(page name, content, hash, #(hist page name,creation time)) HistoryPages(hist page name, hist content, hist hash, creation time, revision, #user name) Users(user name, password hash, #page name) Sessions(session id, expiry time, variables, #user name) Macros(macro name, destination, input args, output args, #protocol, #result type) Protocols(protocol) ResultTypes(result type) Tabela 5: Definicje relacji między encjami 7 Opisy relacji 7.1 rel001 Pages pochodzenie relacji enc001 Page(page name, content, hash) wykorzystywane związki zwi006 HasHistory(Page(0..*) : HistoryPage(1..1)) atrybut page name content hash hist page name creation time dziedzina łańcuch(128) tekst łańcuch(64) łańcuch(128) czas ograniczenie PK, /^[A-Z][A-Za-z0-9_/]+$/ NOT NULL NOT NULL ograniczenia tablicowe • FK(hist page name, creation time) HistoryPage — zwi006 6 uwagi reg001, ogr001, ogr002 ogr003 ogr004 zwi006 zwi006 7.2 rel002 HistoryPages pochodzenie relacji enc002 HistoryPage(hist page name, hist content, hist hash, creation time, revision) wykorzystywane związki zwi002 IsAuthor(HistoryPage(0..*) : User(1..1)) atrybut hist page name hist content hist hash creation time revision author dziedzina łańcuch(128) tekst łańcuch(64) czas liczba(9) łańcuch(64) ograniczenie NOT NULL, /^[A-Z][A-Za-z0-9_/]+$/ NOT NULL NOT NULL FK Users uwagi ogr005, ogr006 ogr007 ogr008, ogr009, ogr010, ograniczenia tablicowe • PK(hist page name, creation time) — reg002 • UNIQUE(hist page name, revision) — reg003 7.3 rel003 Users pochodzenie relacji enc003 User(user name, password hash) wykorzystywane związki zwi001 HasHomePage(User(0..*) : Page(0..1)) atrybut user name password hash home page dziedzina łańcuch(64) łańcuch(64) łańcuch(128) ograniczenie PK FK Pages ograniczenia tablicowe brak 7 uwagi ogr014, ogr015, reg008 ogr016 ogr017, ogr018, zwi001 reg002, reg003 reg002 reg003 ogr011, zwi002 7.4 rel004 Sessions pochodzenie relacji enc004 Session(session id, expiry time, variables) wykorzystywane związki zwi003 IsSessionFor(Session(0..*) : User(0..1)) atrybut session id expiry time variables user name dziedzina łańcuch(64) czas tekst łańcuch(64) ograniczenie PK FK Users uwagi reg017, ogr019, ogr020 ogr023 ogr024 ogr021, ogr022, zwi003 ograniczenia tablicowe brak 7.5 rel005 Macros pochodzenie relacji enc005 Macro(macro name, destination, input args, output args) wykorzystywane związki zwi004 UsesProtocol(Macro(0..*) : Protocol(1..1)) zwi005 ReturnsType(Macro(0..*) : ResultType(1..1)) atrybut macro name destination input args output args protocol result type dziedzina łańcuch(64) łańcuch(256) łańcuch(256) łańcuch(256) łańcuch(64) łańcuch(64) ograniczenie PK, length > 0 NOT NULL, FK Protocols NOT NULL, FK ResultTypes ograniczenia tablicowe brak 8 uwagi reg022, ogr025, ogr026 ogr030 ogr027 ogr031 ogr029, zwi004 ogr028, zwi005 7.6 rel006 Protocols pochodzenie relacji enc006 Protocol(protocol) wykorzystywane związki brak atrybut protocol dziedzina łańcuch(64) ograniczenie PK uwagi reg023, ogr029 ograniczenia tablicowe brak 7.7 rel007 ResultTypes pochodzenie relacji enc007 ResultType(result type) wykorzystywane związki brak atrybut result type dziedzina łańcuch(64) ograniczenie PK ograniczenia tablicowe brak 9 uwagi reg028, ogr028