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('Ymd 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 i_pom NUMBER; BEGIN select count(idspravce) into i_pom from spravci where not smazano is null; return i_pom; END;
•
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, '^[azAZ09\.\_\%\+\]+@[azA Z09\.\]+\.[azAZ]{2,6}$') then raise_application_error(20004, 'Email neobsahuje validní emailovou adresu!'); end if; end;
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.