Univerzita Pardubice Fakulta elektrotechniky a informatiky Semestrální práce do předmětu IDAS2 Radek Fryšták st32304 / IT 2012 / 2013
Základní charakteristika Téma této smíšené semestrální práce pro předmět IDAS2 a IWWW je zaměřený na pronajímání dedikovaných herních serverů a s tím spojený webhosting. Hosting nabízí seznam předních herních titulů které si může uživatel pronajmout, pokud sám nemá prostředky nebo veřejnou IP adresu s dostatečnou konektivitou, ale přesto chce mít založený vlastní privátní nebo veřejný herní server pro své přátele s vlastní konfigurací pod svou kontrolou. Při objednávce může uživatel vybrat více her s různým počtem slotů a různou délkou pronájmu. Objednávku uživatel může dokončit jedině jako regulérně registrovaný uživatel s vyplněnými údaji které jsou nutné pro eventuální komunikaci administrátorů s klientem a fakturaci. V posledním kroku pak ještě bude mít uživatel možnost zvolit jestli chce pouze game hosting nebo bude chtít také provozovat i webhosting. Po zaplacení dostane k dispozici uživatelský panel s možností svoje servery spustit, restartovat, zastavit, nakonfigurovat nebo sledovat logy. Z pohledu databázového backendu jde o 2 skupiny tabulek. 1. Skupina: obsluhuje uživatele, jejich registraci, přihlašování a objednávku serverů 2. Skupina: obsluhuje samotné běžící hry, logy her, logy serveru správu subdomén a jiné. Oprávnění jsou v rámci systému dvojí. Uživatelé pak mají v rámci své uživatelské administrace oprávnění: guest: obyčejný návštěvník webu který si jen prohlíží stránky registrovaný: registroval se a má oprávnění dokončit objednávku her moderátor webu: registrovaný po objednávce web, nebo editor existujícího webu správce her: registrovaný po objednávce her, bez webu moderátor + správce: registrovaný po objednávce her a webu, editaci webu může delegovat Oprávnění v rámci administračního rozhraní správců jsou: správce serveru: má přístup do administrace ale v některých sekcích má omezení hlavní administrátor: plný přístup do administrace Administrační část na správu web hostingu není v databázovém modelu zahrnuta. Toto databázové schéma není úplně kompletní, je to jen jeho klon, z důvodů mohutnosti celé aplikace, která je ještě ve vývoji a je ve skutečnosti zhruba 2x větší a také kvůli databázovým možnostem Oracle, jelikož originální model je v MySQL respektive v budoucnu potažmo v MariaDB. Strategie mazání tabulek je řešena tak že po smazání záznamu v databázi se řádek fyzicky nesmaže ale pouze nastaví datum smazání, protože klíčové dotazy počítají s tím že atribut smazáno je NULL. Fyzické mazání záznamů z databáze probíhá až za pomocí Cronem spouštěného skriptu.
Fyzický model Obrázek: fyzický model databáze
Use case diagram Obrázek: diagram užití
Popis tabulek Tabulka země obsahuje země ze kterých může uživatel pocházet idzeme: unikátní identifikátor země, sekvence: seq_idzeme nazev: název země, uniq index: u_nazev_zeme Tabulka uživatelských rolí, obsahuje role kterých může uživatel nabývat idrole: unikatní identifikátor role, sekcevce: seq_idrole_uzivatele nazev: název role, uniq index: u_nazev_uzivatele_role Tabulka firem které může uživatel nabývat, předpoklad je že uživatel může vystupovat jako právnická osoba idfirma: unikátní identifikátor firmy, sekvence: seq_idfirma nazev: název firmy či právnického subjektu, uniq index: u_nazev_firma ulice: ulice firmy město: město firmy psc: PSČ firmy ico: IČO firmy dic: DIČ firmy
Tabulka registrovaných uživatelů, kteří mohou provádět plné objednávky iduzivate: unikátní identifikátor uživatele, sekvence: seq_iduzivatele login: přihlašovací jméno uživatele, uniq index: u_login_uzivatele hash: zahlašované heslo uživatele email: email uživatele, uniq index: u_email_uzivatele jmeno: reálné jméno uživatele prijmeni: reálné příjmení uživatele idrole: cizí klíč pro připojení uživatelské role, povinné avatar: profilový obrázek telefon: telefonní číslo uživatele pridano: datum a čas registrace uživatele upraveno: datum a čas upravení uživatele smazano: datum a čas smazání uživatele lastlogin: datum a čas posledního přihlášení idzeme: cizí klíč pro připojení země, povinné idfirma: cizí klíč pro připojení firmy, nepovinné Tabulka stavů objednávky, při objednávání her idstav_objednavky: unikátní identifikátor stavu, sekvence: seq_idstav_objednavy stav: název stavu objednávky, uniq index: u_stav_objednavky
Tabulka nabídky her, ze kterých má uživatel na výběr idnabidka_her: unikátní identifikátor nabídky, sekvence: seq_idnabidka_her nazev: název hry, uniq index: u_nazev_nabidka_her popis: krátký popis hry avatar: ikona hry cena: základní cena za slot, násobená počtem slotů, check: check_cena_nabidka_her minslotu: minimum slotů pro hru maxslotu: maximum slotů pro hru Tabulka objednávky her, obsahuje objednávky zadané uživatelem idobjednavka: unikátní identifikátor objednávky, sekvence: seq_idobjednavka vystaveno: datum a čas vystavení splatnost: datum a čas splatnosti potvrzeno: datum a čas potvrzení cena: celková cena vytvořené objednávky, check: check_cena_objednavka iduzivatel: cizí klíč pro připojení uživatele idstav_objednavky: cizí klíč pro připojení stavu objednávky
Tabulka možné doby pronájmu iddoba_pronajmu: unikátní identifikátor doby pronájmu, sekvence: seq_iddoba_pronajmu nazev: testový popisek doby pronájmu, uniq index: u_nazev_doba_pronajmu doba: číselná hodnota doby pronájmu, check: check_doba_doba_pronajmu sleva: nepovinná číselná sleva při delším pronájmu Tabulka pro výběr z eventuálně jiného datového centra pro hostování hry iddatacentrum: unikátní identifikátor data centra, sekvence: seq_iddatacentrum místo: název data centra, uniq index: u_misto_datacentrum Tabulka ze vztahu M:N, slouží pro projení tabulek objednávka a nabídky her, uživatel si může totiž při jedné objednávce objednat 1-N her během jedné objednávky idobjednavka: unikátní identifikátor pro připojení objednávky hry idnabidka_her: unikátní identifikátor pro připojení nabídky her slotu: vybraný počet slotů cena: vypočítaná cena za základe počtu slotů, slevy a ceny za hru iddatacentrum: cizí klíč pro připojení vybraného datacentra iddoba_pronajmu: cizí klíč pro připojení vybrané doby pronájmu
Tabulka pro shromažďování her podle typů, kvůli tomu že každá hra může běžet ve více instancích idtyphry: unikátní identifikátor typu hry, sekvence: seq_idtyp_hry nazev: název skupiny hry, uniq index: u_nazev_typhry popis: krátký popis skupiny hry zakladni_cmd: základní cmd příkaz pro spuštění hry v terminálu Tabulka s jednotlivými hrami spouštěnými na serveru idhra: unikátní identifikátor hry, sekvence: seq_idhra nazev: název samotné instance hry, uniq index: u_nazev_hry popis: krátký popisek hry port1: port hry 1 (herní) port2: port hry 2 (query/rcon) port3: port hry 3 (web admin) idtyphry: cizí klíč pro připojení typu hry pro zařazení do skupiny hry idspravce: cizí klíč pro připojení správců dané instance hry Tabulka s rolemi správců serveru idrole_spravce: unikátní identifikátor role správce, sekvence: seq_idrole_spravce nazev: název role správce, uniq index: u_nazev_role_spravce
Tabulka se správci serveru idspravce: unikátní identifikátor správce, sekvence: seq_idspravce login: přihlašovací login správce, uniq index: u_login_spravci hash: zahlašované heslo správce avatar: ikona správce pridano: datum a čas přidání upraveno: datum a čas upravy smazano: datum a čas smazání lastlogin: datum a čas posledního přihlášení idrole_spravce: cizí klíč pro připojení role správce Tabulka aktualit zobrazovaných na úvodní stránce webu idaktuality: unikátní identifikátor aktualit, sekvence: seq_idaktuality nadpis: nadpis aktuality zprava: zpráva aktuality pridano: datum a čas přidání smazano: datum a čas smazání idspravce: cizí klíč pro připojení správce, který aktualitu napsal
Tabulka skupiny textu, pro zařazení konkrétních textů do kategorií idskupina_textu: unikátní identifikátor skupiny textu, sekvence: seq_idskupina_textu nazev: název skupiny textu, uniq index: u_nazev_skupina_textu Tabulka textů které se nachází různě na stránkách, vyplňované hlavně editorem typu WYSIWYG idtexty_stranek: unikátní identifikátor textů stránek, sekvence: seq_idtexty_stranek message: text vyplnění přes WYSIWYG editor pridano: datum a čas přidání upraveno: datum a čas upravení smazano: datum a čas smazání idspravce: cizí klíč pro připojení správce který text napsal idskupina_textu: cizí klíč pro připojení skupiny textů do které text spadá
Přehled použitých dotazů Sql dotazy jsou prováděny pomocí PDO konektoru s bindováním parametrů do sql dotazu, které zabraňují útokům SQL Injection. Sql raw dotaz na autorizaci správců při přihlašování do administrace: SELECT idspravce, nazev as role, avatar FROM spravci JOIN spravci_role USING(idrole) WHERE login=? AND hash=?; Dotaz vrací řádek se správcem, v případě že jsou udaje neplatné nevrátí žádný řádek, login je předaný z formuláře a hash je vypočítaný hash kód hesla. Sql raw dotaz pro výpis správců z databáze SELECT idspravce, login, pridano, upraveno, role_spravce.nazev as role FROM spravci JOIN role_spravce USING (idrole_spravce) WHERE smazano IS NULL; Dotaz vrací všechny nesmazané správce administrace, jak již bylo řečeno v charakteristice, dotaz počítá s tím že nesmazaný správce má hodnotu atributu smazáno na NULL. Obalený sql dotaz na úpravu správce: $cont = new ContentValues; $cont >put('login', $form['login']) >put('idrole', $form['role']) >put('upraveno', date('y m d H:i:s')); $res = $db >update('spravci', $cont, 'iduser=?', $idspravce); Dotaz je obalený PHP třídou, do update je vložená třída ContentValues která obaluje hodnoty předané z formuláře a předává je metodě update která vytváří sql raw dotaz update kterému se pak bindují parametry a where podmínka.
Pohledy, procedury, funkce a triggery Pohled na výpis správců a jejich role v administraci: create or replace view vypis_spravci(idspravce, login, pridano, upraveno, role SELECT idspravce, login, pridano, upraveno, role_spravce.nazev as role FROM spravci JOIN role_spravce USING (idrole_spravce) WHERE smazano IS NULL; Procedura na úpravu loginu a role konkrétního správce: CREATE OR REPLACE PROCEDURE st32304.update_spravce(p_id NUMBER, p_login VARCHAR2, p_idrole NUMBER) BEGIN update spravci SET login=p_login, idrole_spravce=p_idrole where idspravce=p_id; END; Funkce na spočítání smazaných správců: create function smazani_spravci return NUMBER BEGIN i_pom NUMBER; select count(idspravce) into i_pom from spravci where not smazano is null; END; return i_pom;
Trigger pro kontrolu telefonu a emailu při registrovaní uživatele, triggery jsou samozřejmě i automaticky užity při sekvencích create or replace trigger validace_registrace before insert or update on uzivatele for each row begin if not regexp_like(:new.telefon, '[[:digit:]]{9,}') then raise_application_error( 20002, 'Délka telefonního čísla není nejmén ě 9 znak ů!'); end if; if not regexp_like(:new.email, '^[a za Z0 9\.\_\%\+\ ]+@[a za Z0 9\.\ ]+\.[a za Z]{2,6}$') then raise_application_error( 20004, 'Email neobsahuje validní emailovou adresu!'); end; end if;
Závěr Na závěr jen poznamenám že tento projekt je pro rámec jednoho předmětu databáze příliš obsáhlý aby zde byla popsána celá problematika do poslední drobnosti, když tento projekt má rozsah minimálně bakalářské práce. I tak zde byla popsána vetší část stěžejních vazeb pro rezervaci a pronájem serverů, práce správců a část backendu. Jak jsem již v charakteristice naznačil tento model je pouze klonem MySQL databáze protože její komplexnost Oracle databáze je naprosto nevhodná pro mé účely a práci v tomto projektu a taky z důvodů problému s licencemi a podobně, ale jelikož MySQL už bohužel také spadá pod firmu Oracle a začíná dělat vývojářům tato firma starosti s otevřeností projektu MySQL tak je možné že se do budoucna překonvertuje do databázové platformy MariaDB což je v podstatě open-source klon MySQL. Jelikož toto je veřejný projekt tak je implicitně stavěný na open-source technologiích, do které Oracle nespadá, ale jelikož PDO umožňuje alespoň experimentální podporu Oci8 knihovny tak nebyl takový problém rozšířit o možnost připojení k Oracle databázím které běží na školních serverech. Databázový konektor tvoří php PDO konektor, což je objektová třída pro přístup k různým databázím se stejným programovým API. Tuto knihovnou jsem obalil do skupiny vlastních tříd které se starají o připojování a práci s databází, tento obal má podobnou logiku a zvyklosti jako třída pro připojování SQLite3 databází na operačním systému Android.
Návrh dalšího rozvoje aplikace Jak jsem již naznačil v charakteristice tak tento model není konečný a ani ne tak úplný z důvodu neustálého vývoje a nejasností kolem dalších sekcí stránek a fungovaní některých backendových mechanizmů které zajišťují chod serveru a komunikaci s HW serveru. Tento web a databáze se vyvíjí a bude nadále vyvíjet za účelem podnikání na živnostenský list a jako veřejný projekt na internetu.