Commit f6fdeffe by Őry Máté

Merge branch 'release-13.03.2' into releases

parents 0d188bd6 d9588334
...@@ -5,7 +5,7 @@ jsfiles += one/static/script/util.min.js ...@@ -5,7 +5,7 @@ jsfiles += one/static/script/util.min.js
jsfiles += one/static/script/store.min.js jsfiles += one/static/script/store.min.js
cssfiles += one/static/style/style.css cssfiles += one/static/style/style.css
default: migrate generatestatic collectstatic mo restart default: migrate generatestatic collectstatic mo setbranch restart
pulldef: pull default pulldef: pull default
pull: pull:
...@@ -23,6 +23,10 @@ generatestatic: $(jsfiles) $(cssfiles) ...@@ -23,6 +23,10 @@ generatestatic: $(jsfiles) $(cssfiles)
collectstatic: collectstatic:
./manage.py collectstatic --noinput ./manage.py collectstatic --noinput
setbranch:
sed -i cloud/local_settings.py -e '/RELEASE=/d' || true
echo "RELEASE='`git rev-parse --abbrev-ref HEAD`'" >>cloud/local_settings.py
mo: mo:
for i in */locale/*/*/*.po; do echo -ne "$$i:\t"; msgfmt --statistics $$i;done for i in */locale/*/*/*.po; do echo -ne "$$i:\t"; msgfmt --statistics $$i;done
for i in */; do cd $$i; ls locale &>/dev/null && ../manage.py compilemessages || true; cd ..; done for i in */; do cd $$i; ls locale &>/dev/null && ../manage.py compilemessages || true; cd ..; done
......
from cloud.settings import DEBUG from cloud.settings import DEBUG, STAT_DEBUG, RELEASE
from django.core.cache import cache
import subprocess
import json
def process_debug(req): def process_debug(req):
return {'DEBUG': DEBUG} return {'DEBUG': DEBUG}
def process_stat(req):
if STAT_DEBUG:
stat = {
'CPU': {
'USED_CPU': 10,
'ALLOC_CPU': 20,
'FREE_CPU': 70
},
'MEM': {
'USED_MEM': 567,
'ALLOC_MEM': 371,
'FREE_MEM': 2048-567-371
}
}
else:
stat = cache.get('cloud_stat')
return {
'STAT_DEBUG': STAT_DEBUG,
'cloud_stat': stat,
}
def process_release(req):
return {
'release': RELEASE,
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
DEBUG = True DEBUG = True
TEMPLATE_DEBUG = DEBUG TEMPLATE_DEBUG = DEBUG
STAT_DEBUG = True
ADMINS = ( ADMINS = (
('IK', 'cloud@cloud.ik.bme.hu'), ('IK', 'cloud@cloud.ik.bme.hu'),
...@@ -119,6 +120,8 @@ TEMPLATE_CONTEXT_PROCESSORS = ( ...@@ -119,6 +120,8 @@ TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.tz', 'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages', 'django.contrib.messages.context_processors.messages',
'cloud.context_processors.process_debug', 'cloud.context_processors.process_debug',
'cloud.context_processors.process_stat',
'cloud.context_processors.process_release',
) )
TEMPLATE_DIRS = ( TEMPLATE_DIRS = (
...@@ -200,8 +203,17 @@ CELERY_ROUTES = { ...@@ -200,8 +203,17 @@ CELERY_ROUTES = {
'firewall.tasks.reload_blacklist_task': {'queue': 'firewall'}, 'firewall.tasks.reload_blacklist_task': {'queue': 'firewall'},
'firewall.tasks.Periodic': {'queue': 'local'}, 'firewall.tasks.Periodic': {'queue': 'local'},
'one.tasks.SendMailTask': {'queue': 'local'}, 'one.tasks.SendMailTask': {'queue': 'local'},
'one.tasks.UpdateInstanceStateTask': {'queue': 'local'}
} }
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
store_settings = { store_settings = {
"basic_auth": "True", "basic_auth": "True",
"verify_ssl": "False", "verify_ssl": "False",
...@@ -225,6 +237,7 @@ firewall_settings = { ...@@ -225,6 +237,7 @@ firewall_settings = {
EMAIL_HOST='152.66.243.92' # giccero ipv4 EMAIL_HOST='152.66.243.92' # giccero ipv4
CLOUD_URL='https://cloud.ik.bme.hu/' CLOUD_URL='https://cloud.ik.bme.hu/'
RELEASE='master'
try: try:
from cloud.local_settings import * from cloud.local_settings import *
......
{% extends "base.html" %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% block content %}
<div class="irasmu">
<h2>Változtatások listája</h2>
<section>
<p>Az IK Cloud fejlesztése kéthetes ciklusokban történik, az rendes kiadások élesítése
páros heteken csütörtök este zajlik. Alább foglaljuk össze az egyes
kiadások főbb, a felhasználók által is látható változtatásait.</p>
</section>
<a id="master"></a>
<section>
<h3 id="release-13.03.2"><a href="#13.03.2">13.03.2 (2013. március 21.)</a></h3>
<ul>
<li>Súgó.</li>
<li>Változáslista.</li>
<li>Reszponzív és folyékony elrendezés.</li>
<li>Statikus oldalak új külalakja.</li>
<li>Gyorsabb oldalbetöltés.</li>
<li>Statisztika a cluster állapotáról.</li>
</ul>
</section>
<section>
<h3 id="release-13.03.1"><a href="#13.03.1">13.03.1 (2013. március 7.)</a></h3>
<ul>
<li>Határidős felfüggesztés élesítve.</li>
<li>Csatlakozási adatoknál IP cím helyett DNS név jelenik meg.</li>
<li>Ha a portált IPV6-on érik el, a csatlakozási adatoknál egyedi DNS név és publikus port jelenik meg.</li>
<li>Legújabb fájloktól vissza lehet lépni az összeshez.</li>
<li>Bemutató képernyő elérhető bejelentkezve is.</li>
<li>Megosztás adatai szerkeszthetőek.</li>
<li>Sablon adatai szerkeszthetőek.</li>
<li>Lábléc; impresszum, szabályzat, támogatás oldalak.</li>
<li>Megosztásnál is látszik a géptípus.</li>
<li>Dobozok rejthetőek.</li>
<li>Sablon mentésének menete gördülékenyebb.</li>
<li>Jelszómegjelenítés javítva.</li>
<li>Fájlok rendezése működik.</li>
<li>Segítség-dobozok bővítve.</li>
<li>Szebb HTTP hibaüzenetek.</li>
<li>Kulcs hozzáadásának visszaigazolása.</li>
<li>Sablonok állapotának helyes kijelzése.</li>
<li>Minimalizált js és css kód.</li>
</ul>
</section>
<section>
<h3 id="release-13.02.2"><a href="#13.02.2">13.02.2 (2013. február 21.)</a></h3>
<ul>
<li>Felhasználói kvóták megvalósítása.</li>
<li>Publikus kulcsok kezelése.</li>
<li>További részletek gombok.</li>
<li>Saját csoportok rejthetőek.</li>
<li>Segítség-dobozok a legtöbb helyre.</li>
<li>Csoporttulajdonosok kezelése, több adat megjelenítése.</li>
<li>VM átnevezhető.</li>
</ul>
</section>
</div>
{% endblock %}
...@@ -2,12 +2,268 @@ ...@@ -2,12 +2,268 @@
{% load i18n %} {% load i18n %}
{% load staticfiles %} {% load staticfiles %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% block content %} {% block content %}
<div class="irasmu"> <div class="irasmu">
<p>A súgó elkészültéig kérjük szíves türelmüket.</p> <h2>Bevezető</h2>
<p>Addig is ajánljuk figyelmükbe a rendszer <a href="/info/">rövid ismertetőjét</a>, a használat módját részletező <a href="/sites/policy/">szabályzatot</a>, valamint a felület számos pontján megjelenő <img src="{% static "icons/information-frame.png" %}" alt="Súgó" /> ikonnal jelölt információdobozokat.</p> <section id="s-1">
<p>Amennyiben kérdése maradt, örömmel segítünk a <a href="/sites/support/">támogatás</a> oldalon leírt elérhetőségeinken.</p> <nav style="float: right; padding: 1em;">
<ul>
<li><a href="#s-1">Bevezető</a><ul>
<li><a href="#s-1-1">A webes felület elérése</a></li>
<li><a href="#s-1-2">Összefoglaló oldal</a></li>
</ul></li>
<li><a href="#s-2">Virtuális gépek</a><ul>
<li><a href="#s-2-1">Virtuális gép indítása</a></li>
<li><a href="#s-2-2">Csatlakozás a géphez</a></li>
<li><a href="#s-2-3">Hálózati beállítások</a></li>
</ul></li>
<li><a href="#s-3">Sablonok</a><ul>
<li><a href="#s-3-1">Sablonok létrehozása</a></li>
<li><a href="#s-3-2">Sablonok megosztása</a></li>
</ul></li>
<li><a href="#s-4">Csoportok</a><ul>
<li><a href="#s-4-1">Csoportok létrehozása</a></li>
</ul></li>
<li><a href="#s-5">Adattár</a><ul>
<li><a href="#s-5-1">Kulcsok kezelése</a></li>
</ul></li>
</ul>
</nav>
<p>
Az IK Cloud a BME IK és IIT együttműködésében, a VIK támogatásával létrejött rendszer, amelyben az IIT oktatói és hallgatói szükség szerint vehetnek igénybe virtuális erőforrásokat.
</p>
<p>
A súgón kívül ajánljuk figyelmükbe a rendszer <a href="/info/">rövid ismertetőjét</a>, a használat feltételeit részletező <a href="/sites/policy/">szabályzatot</a>, valamint a felület számos pontján megjelenő <img src="{% static "icons/information-frame.png" %}" alt="Súgó" /> ikonnal jelölt információdobozokat.
</p>
<p>
Amennyiben kérdése maradt, örömmel segítünk a <a href="/sites/support/">támogatás</a> oldalon leírt elérhetőségeinken.
</p>
<div class="clear"></div>
</section>
<section id="s-1-1">
<h3>A webes felület elérése</h3>
<p>
A rendszer a <a href="https://cloud.ik.bme.hu/"><tt>https://cloud.ik.bme.hu/</tt></a> címen érhető el.
Az új látogatót egy ismertető felület fogadja, ahol a <em>Próbálja ki most!</em> vagy a <em>Bejelentkezés</em> hivatkozásra kattintva a BME EduID bejelentkezőoldalára jut.
</p>
<p>
Az EduID belépéshez egy számazonosítót és az ehhez tartozó jelszót kell használni.
Amennyiben nem rendelkezik ilyennel, az <a href="https://login.bme.hu/admin/"><em>ezen az oldalon</em></a> hivatkozásra kattintva a neptunos azonosítókkal belépve állíthatja be EduID azonosítóját.
A sikeres bejelentkezés után az összefoglaló oldalra jut.
</p>
</section>
<section id="s-1-2">
<h3>Összefoglaló oldal</h3>
<p>
Az összefoglaló oldalon gyors áttekintést kaphat a cloudban található erőforrásairól.
A <em>virtuális gépek</em> dobozban a futó és felfüggesztett virtuális gépek,
az <em>adattár</em> dobozban a központi adattárban található fájlok találhatóak.
</p>
<p class="teacher">
A megfelelő jogosultsággal rendelkező felhasználók számára a <em>sablonok</em> dobozban jelennek meg a saját sablonok,
a <em>saját csoportok</em> dobozban pedig azok a csoportok, melyeknek tulajdonosa.
</p>
<p>
Az egyes dobozokban megjelennek az aktív elemek, amelyekre az egeret húzva láthatóvá válnak a legfontosabb vezérlőgombok is.
A csíkra kattintva lenyílik egy összefoglaló az erőforrás legfontosabb adatairól.
A <em>további részletek</em>re kattintva az adott erőforrás oldalára juthat.
</p>
</section>
<h2 id="s-2">Virtuális gépek</h2>
<section id="s-2-1">
<h3>Virtuális gép indítása</h3>
<p>
Virtuális gépek indításához kattintson az <em>
<img src="{% static "icons/computer--plus.png" %}" alt="{% trans "Launch new machine" %}" />
új gép indítása</em> gombra.
A megjelenő ablakban válasszon ki egy megosztott sablont, és kattintson az indítás gombra.
</p>
<p>
A gép indítása azonnal megkezdődik, a folyamat az operációs rendszer teljes betöltéséig jellemzően egy percig tart.
Ezidő alatt a gép oldalán figyelheti az állapotát, amely automatikusan frissül.
</p>
</section>
<section id="s-2-2">
<h3>Csatlakozás a géphez</h3>
<p>
A virtuális gépekhez az adott operációs rendszerben szokásos módon lehet csatlakozni:
Windowshoz távoli asztal protokollon (RDP), Linuxhoz SSH-n.
Linux rendszerekhez is van lehetőség a grafikus bejelentkezésre, ehhez a NoMachine megoldását választottuk.
</p>
<p>
A gépek használatba vételét a tanszéki géptermekben telepített laborkliens kényelmessé teszi, itt a <em>
<img src="{% static "icons/plug.png" %}" alt="{% trans "Connect" %}" />
csatlakozás</em> gombra kattintva elindul a megfelelő kliensprogram.
</p>
<p>
A rendszer távoli használata esetén a megfelelő kliensprogram használata és beállítása a felhasználóra hárul.
</p>
<h4>Windowsról</h4>
<p>
Windows kliens használata esetén windowsos gépekhez való csatlakozásra a beépített <em>távoli asztal (mstsc)</em> alkalmazást,
parancssoros Linux géphez a <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">PuTTY</a>-ot,
grafikus linuxos bejelentkezéshez pedig az <a href="http://www.nomachine.com/download.php">NX Client for Windows</a> alkalmazást ajánljuk.
</p>
<h4>Más rendszerekről</h4>
<p>
Linux vagy OSX kliens használata esetén windowsos gépekhez való csatlakozásra a <a href="http://remmina.sourceforge.net/">Remmina</a>,
parancssoros Linux géphez a beépített OpenSSH kliens,
grafikus linuxos bejelentkezéshez pedig az <a href="http://www.nomachine.com/download.php">NX Client for Linux/Mac</a> alkalmazást ajánljuk.
</p>
<p>
Távoli bejelentkezés esetén a gép indításakor megjelenő oldalon a <em>belépési adatok</em> dobozban, vagy a <em>virtuális gépek</em> listán a <img src="{% static "icons/plug.png" %}" alt="{% trans "Connect" %}" /> gombra kattintva megjelennek a kapcsolódáshoz szükséges adatok.
</p>
</section>
<section id="s-2-3">
<h3>Hálózati beállítások</h3>
<p>
A rendszerben futó gépek a sablontól függő hálózatba kerülnek.
Ez általában azt jelenti, hogy publikus IPv6-os és privát IPv4-es címet kapnak.
Mivel a privát címeket közvetlenül csak a belső hálózatból lehet elérni, ezért hálózati címfordítással lehetővé tesszük TCP és UDP portok elérését.
A tűzfalat a gép oldalán a <em>portok kezelése</em> dobozban lehet beállítani.
</p>
<p>
IPv6-on közvetlenül, az eredeti portszámra kapcsolódva lehet elérni az így beállított portokat, azonban csak azokat, amelyekre fordítási szabály van beállítva.
</p>
<p>
A gépek távoli elérését is így oldjuk meg: a gép indításakor a szükséges portokat (Windows: 3389/tcp, Linux: 22/tcp) automatikusan kiforgatjuk.
Ennek megfelelően a portál IPv6-ról való elérése esetén a gép saját DNS nevét és az eredeti portszámot, míg IPv4-es megtekintése esetén a tűzfal erre szolgáló címét és a kiosztott külső portot jelenítjük meg a <em>belépési adatok</em> dobozban.
</p>
</section>
<h2 id="s-3">Sablonok</h2>
<section class="teacher">
<p>
A megfelelő jogosultsággal rendelkező felhasználóknak lehetősége van sablonok létrehozására.
Így csoportjaival olyan előkészített rendszert oszthat meg, amelyen már minden szükséges szoftver telepítve és konfigurálva van.
Ezzel időt és fáradságot takaríthat meg a projektmunka vagy a laborfoglalkozás, házi feladat készítése során.
</p>
</section>
<section id="s-3-1" class="teacher">
<h3>Sablonok létrehozása</h3>
<p>
Sablon létrehozásához az összefoglaló oldalon lévő <em>sablonok</em> doboz <em>
<img src="{% static "icons/document--plus.png" %}" alt="{% trans "New template" %}" />
új sablon</em> gombjára kattintva megnyílik egy varázsló.
</p>
<p class="figure figure-small">
<img src="{% static "help/template-wizard-1.png" %}" alt="Az új sablon varázsló 1." />
<img src="{% static "help/template-wizard-2.png" %}" alt="Az új sablon varázsló 2." />
</p>
<p>
A varázsló első lépéseként válassza ki a kiindulási sablont, amelyet személyre kíván szabni, majd kattintson a <em>tovább</em> gombra.
Ezután válassszon nevet, méretet és leírást az új sablonnak.
Végül a <em>mesterpéldány indítása</em> gombra kattintva elindul egy példánya a kiválasztott kiindulási rendszernek, amelyen elvégezheti a beállításokat.
</p>
<p class="figure figure-small">
<img src="{% static "help/template-wizard-3.png" %}" alt="Az új sablon varázsló 3." />
</p>
<p>
Az elindult géphez a <a href="#s-2-2">többi géphez hasonló módon</a> lehet kapcsolódni.
Végezze el a szükséges módosításokat, majd kattintson a <em>mentés</em> gombra.
A rendszer leállítja a gépet, majd elmenti a lemezképet.
</p>
</section>
<section id="s-3-2" class="teacher">
<p class="figure figure-small" style="float: right">
<img src="{% static "help/share-wizard.png" %}" alt="Az új megosztás varázsló" />
</p>
<h3>Sablonok megosztása</h3>
<p>
A sablonokat csoportok tagjaival lehet megosztani.
</p>
<p>
A megosztás megszabja a sablon példányainak <a href="#TODO">lejárati idejét</a>, valamint a <a href="#TODO">futtatható példányok számát</a> is.
</p>
<p>Egy sablon megosztásához:
<div><ol>
<li>Navigáljon egy csoport részletező oldalára a <em>saját csoportok</em> dobozról.</li>
<li>A részletező oldalon válasszon egy sablont.</li>
<li>Kattintson a <em>
<img src="{% static "icons/user-share.png" %}" alt="{% trans "Share" %}" />
megosztás</em> gombra.</li>
<li>Változtassa meg szükség szerint a beállításokat.</li>
</ol></div>
<div class="clear"></div>
</section>
<h2 id="s-4">Csoportok</h2>
<section class="teacher">
<p>
A csoportok hallgatók halmazai, melyek segítségével együtt lehet kezelni a sablonok megosztását és a kvóták kezelését.
</p>
<p>
Sablonokat hozhat létre kézzel, tetszés szerint (például önállólabor-csoportok vagy kutatási munkák számára), vagy használhatja a Neptun tanulmányi rendszerben rögzített tárgyfelvételek és oktatók alapján automatikusan alakuló csoportokat.
</p>
</section>
<section id="s-4-1" class="teacher">
<h3>Csoportok létrehozása</h3>
<p>
Új csoport létrehozásához kattintson az összefoglaló oldal <em>saját csoportok</em> dobozában az <em>
<img src="{% static "icons/user--plus.png" %}" alt="{% trans "Create new group" %}" />
új csoport létrehozása</em> gombra.
</p>
<p>
A megjelenő varázsló értelemszerű kitöltésével a csoport létrejön, és a részletező oldalára kerül.
</p>
<p>
A csoport részletező oldalán lehetősége van tagok és tulajdonosok fölvételére, tagok törlésére, valamint <a href="#s-3-2">sablonok megosztására</a>.
</p>
</section>
<h2 id="s-5">Adattár</h2>
<section>
<p>
Az adattár segítségével kényelmessé válik a fájlok tárolása és mozgatása.
Személyes adattárját számos módon elérheti.
</p>
<h4>A portálról</h4>
<p class="desc">
A saját gépén lévő fájlok feltöltésére, valamint a munka során készített fájlok letöltésére a legegyszerűbb módszer a webes felület használata.
Az összefoglaló oldalon megjelenő <em>adattár</em> dobozban megtalálja az összes fájlját, valamint az oldalra drag and drop módszerrel húzott fájlok automatikusan feltöltődnek, a <em>
<img src="{% static "icons/download-cloud.png" %}" alt="{% trans "Download" %}" />
letöltés</em> gombra kattintva pedig tetszőleges fájlokat vagy mappákat tölthet le – utóbbit ZIP archívumban.
</p>
<h4>A virtuális gépekről</h4>
<p class="desc">
Minden virtuális gépen automatikusan csatolásra kerül a személyes adattár. Windowsos gépeken a Z: meghajtón, Linux alatt pedig a <em>~/sshfs/</em> katalógusban érhetőek el a fájlok.
Ugyanez igaz a tanszéki gépteremben telepített Ubuntu rendszerre.
</p>
<h4>SFTP-n</h4>
<p class="desc">
Az adattár távolról is elérhető SFTP protokollon.
Ezt számos kliensprogram támogatja, ilyen a
<a href="http://winscp.net/eng/index.php">WinSCP</a> és a
<a href="http://code.google.com/p/win-sshfs/">win-sshfs</a>.
Az SFTP kapcsolódáshoz privát kulcs használata szükséges.
</p>
</section>
<section id="s-5-1">
<h3>Kulcsok kezelése</h3>
<p>
A SFTP protokollon való eléréshez publikus kulcsát regisztrálni kell a portálon.
Ehhez kattintson az <em>adattár</em> doboz <em>kulcsok kezelése</em> gombjára.
Az így megnyíló kezelőfelületen a <em>nyilvános kulcs hozzáadása</em> pontot választva másolja be a publikus kulcsot OpenSSH formátumban, majd kattintson a <em>mentés</em> gombra. (Az OpenSSH kulcsformátum utolsó része egy megjegyzés, amely alapján a kulcsot a későbbiekben azonosítani tudja.)
</p>
<p>
Amennyiben privát kulcsa kompromittálódott, vagy nem kívánja a továbbiakban használni, a <em>kulcsok kezelése</em> gombra kattintva megjelenő listában törölheti az érvényes kulcsok közül.
</p>
<p>
Amennyiben egy virtuális gépe került idegen kézbe, az adattárhoz való hozzáférése is kitudódhatott.
Ebben az esetben használhatja a <em>kulcsok újragenerálása</em> lehetőséget, amely a virtuális gépeken korábban használt kulcsot érvényteleníti.
A már elindított virtuális gépek ezután nem érhetik el az adattárat.
</p>
</section>
<!--
<section id="s-">
<h3></h3>
<p>
</p>
</section>
-->
</div> </div>
{% endblock %} {% endblock %}
...@@ -5,10 +5,15 @@ ...@@ -5,10 +5,15 @@
{% block content %} {% block content %}
<div class="irasmu"> <div class="irasmu">
<h2>Impresszum</h2>
<section>
<p>Az IK Cloud a BME IK és IIT együttműködésében, a VIK támogatásával létrejött rendszer, amelyben az IIT oktatói és hallgatói szükség szerint vehetnek igénybe virtuális erőforrásokat. <p>Az IK Cloud a BME IK és IIT együttműködésében, a VIK támogatásával létrejött rendszer, amelyben az IIT oktatói és hallgatói szükség szerint vehetnek igénybe virtuális erőforrásokat.
</p> </p>
</section>
<section>
<p>Az oldal üzemeltetője a BME Közigazgatási Informatikai Központ.</p> <p>Az oldal üzemeltetője a BME Közigazgatási Informatikai Központ.</p>
<p>A rendszer fejlesztésében részt vettek: <p>A rendszer fejlesztésében részt vettek:
Bach Dániel, Bach Dániel,
Dányi Bence, Dányi Bence,
Dudás Ádám, Dudás Ádám,
...@@ -17,6 +22,7 @@ ...@@ -17,6 +22,7 @@
dr. Szeberényi Imre.</p> dr. Szeberényi Imre.</p>
<p>A rendszer HP hardveren, Ubuntu operációs rendszeren, KVM virtualizációval, Open vSwitch virtuális hálózaton, libvirt köztes réteggel, OpenNebula cloud menedzserrel, Django alapú webportállal működik.</p> <p>A rendszer HP hardveren, Ubuntu operációs rendszeren, KVM virtualizációval, Open vSwitch virtuális hálózaton, libvirt köztes réteggel, OpenNebula cloud menedzserrel, Django alapú webportállal működik.</p>
<p>Some icons by <a href="http://p.yusukekamiyamane.com/">Yusuke Kamiyamane</a>. Licensed under a <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>.</p> <p>Some icons by <a href="http://p.yusukekamiyamane.com/">Yusuke Kamiyamane</a>. Licensed under a <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>.</p>
</section>
</div> </div>
{% endblock %} {% endblock %}
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
{% block content %} {% block content %}
<div class="irasmu"> <div class="irasmu">
<h2>Felhasználási feltételek</h2>
<section>
<p>Az IK Cloud a BME IK és IIT együttműködésében, a VIK támogatásával létrejött rendszer, amelyben az IIT oktatói és hallgatói szükség szerint vehetnek igénybe <strong>virtuális erőforrásokat</strong>.</p> <p>Az IK Cloud a BME IK és IIT együttműködésében, a VIK támogatásával létrejött rendszer, amelyben az IIT oktatói és hallgatói szükség szerint vehetnek igénybe <strong>virtuális erőforrásokat</strong>.</p>
<p>Az IIT géptermeiben telepített kliensszoftver segítségével az oktató által előkészített és kiajánlott <strong>virtuális környezetet a hallgató</strong> a számára megszabott <strong>kvóta keretein belül</strong> igény szerint indíthatja.</p> <p>Az IIT géptermeiben telepített kliensszoftver segítségével az oktató által előkészített és kiajánlott <strong>virtuális környezetet a hallgató</strong> a számára megszabott <strong>kvóta keretein belül</strong> igény szerint indíthatja.</p>
...@@ -14,11 +16,15 @@ ...@@ -14,11 +16,15 @@
<p>Lehetőség van a gépteremben elkezdett munka otthoni folytatására is a korábban elindított környezetben. A rendszer segítségével az otthoni feladatot végző hallgató is elkerülheti az összetett szoftverkörnyezet telepítésével járó kellemetlenségeket, figyelmét a szakmai munkára irányíthatja.</p> <p>Lehetőség van a gépteremben elkezdett munka otthoni folytatására is a korábban elindított környezetben. A rendszer segítségével az otthoni feladatot végző hallgató is elkerülheti az összetett szoftverkörnyezet telepítésével járó kellemetlenségeket, figyelmét a szakmai munkára irányíthatja.</p>
<p>A rendszer segítséget nyújt önálló labor, szakdolgozat, diplomaterv vagy tdk-munka készítésénél is: a munkához szükséges virtuális gépeket az önkiszolgáló rendszeren keresztül azonnal használatba lehet venni.</p> <p>A rendszer segítséget nyújt önálló labor, szakdolgozat, diplomaterv vagy tdk-munka készítésénél is: a munkához szükséges virtuális gépeket az önkiszolgáló rendszeren keresztül azonnal használatba lehet venni.</p>
</section>
<section>
<p>Az elindított virtuális gépekre az adott operációs rendszeren szokásos módon lehet távolról csatlakozni: Windows esetén RDP (távoli asztal), Linux esetén SSH, vagy grafikusan NoMachine NX segítségével. A kapcsolódást a géptermekben telepített kliensszoftver még kényelmesebbé teszi.</p> <p>Az elindított virtuális gépekre az adott operációs rendszeren szokásos módon lehet távolról csatlakozni: Windows esetén RDP (távoli asztal), Linux esetén SSH, vagy grafikusan NoMachine NX segítségével. A kapcsolódást a géptermekben telepített kliensszoftver még kényelmesebbé teszi.</p>
<p>Az elindított gépeken a <strong>felhasználói adattár</strong> automatikusan csatolásra kerül. Minden munkát itt érdemes végezni, mivel az a gép leállítása után is elérhető marad.</p> <p>Az elindított gépeken a <strong>felhasználói adattár</strong> automatikusan csatolásra kerül. Minden munkát itt érdemes végezni, mivel az a gép leállítása után is elérhető marad.</p>
</section>
<section>
<p>A felhasználók a rendszert jelen önkiszolgáló felületen keresztül érhetik el, amelybe az egyetemi címtárszolgáltatás (eduID) segítségével léphetnek be. A továbblépéssel elfogadják a következőekben összefoglalt <strong>felhasználási feltételeket</strong>.</p> <p>A felhasználók a rendszert jelen önkiszolgáló felületen keresztül érhetik el, amelybe az egyetemi címtárszolgáltatás (eduID) segítségével léphetnek be. A továbblépéssel elfogadják a következőekben összefoglalt <strong>felhasználási feltételeket</strong>.</p>
<ul> <ul>
<li>A rendszer <strong>nem használható</strong> semmilyen jogszabályba, vagy <a href="http://net.bme.hu/regula/">egyetemi</a> <strong>szabályzatba ütköző tevékenységre</strong>.</li> <li>A rendszer <strong>nem használható</strong> semmilyen jogszabályba, vagy <a href="http://net.bme.hu/regula/">egyetemi</a> <strong>szabályzatba ütköző tevékenységre</strong>.</li>
...@@ -29,6 +35,7 @@ ...@@ -29,6 +35,7 @@
<li>A rendszert üzemeltető BME IK lehetőségeihez mérten mindent megtesz a szolgáltatásbiztos üzemért, az egyetemi infrastruktúra sajátosságai miatt előforduló üzemszünetekre azonban számítani kell. A BME IK az üzemeltetés kapcsán a folyamatos üzem sérüléséért vagy adatvesztésért <strong>minden felelősséget kizár</strong>. Ezeknek megfelelően szükség esetén a biztonsági mentés és a magas rendelkezésre állású környezet kialakítása a felhasználóra hárul.</li> <li>A rendszert üzemeltető BME IK lehetőségeihez mérten mindent megtesz a szolgáltatásbiztos üzemért, az egyetemi infrastruktúra sajátosságai miatt előforduló üzemszünetekre azonban számítani kell. A BME IK az üzemeltetés kapcsán a folyamatos üzem sérüléséért vagy adatvesztésért <strong>minden felelősséget kizár</strong>. Ezeknek megfelelően szükség esetén a biztonsági mentés és a magas rendelkezésre állású környezet kialakítása a felhasználóra hárul.</li>
</ul> </ul>
<p>A szabályok betartása közös érdekünk. Reméljük, hogy a rendszerünk használata megkönnyíti munkájukat, melyhez sok sikert kívánunk!</p> <p>A szabályok betartása közös érdekünk. Reméljük, hogy a rendszerünk használata megkönnyíti munkájukat, melyhez sok sikert kívánunk!</p>
</section>
</div> </div>
{% endblock %} {% endblock %}
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
{% block content %} {% block content %}
<div class="irasmu"> <div class="irasmu">
<h2>Támogatás</h2>
<section>
<p>A rendszer használatával kapcsolatos kérdéseket, általános észrevételeket a <tt>cloud <em>(kukac)</em> <p>A rendszer használatával kapcsolatos kérdéseket, általános észrevételeket a <tt>cloud <em>(kukac)</em>
ik.bme.hu</tt> e-mail címen várjuk. ik.bme.hu</tt> e-mail címen várjuk.
Ugyancsak örömmel fogadjuk a rendszer használatával kapcsolatos beszámolókat.</p> Ugyancsak örömmel fogadjuk a rendszer használatával kapcsolatos beszámolókat.</p>
...@@ -12,5 +14,7 @@ ...@@ -12,5 +14,7 @@
<a href="https://giccero.cloud.ik.bme.hu/trac/cloud/newticket" rel="nofollow"> <a href="https://giccero.cloud.ik.bme.hu/trac/cloud/newticket" rel="nofollow">
hibajegy felvételével</a> jelezze. hibajegy felvételével</a> jelezze.
</p> </p>
</section>
</div> </div>
{% endblock %} {% endblock %}
#!/usr/bin/env python
from celery import Celery, task
import subprocess
import time, re
import socket
import sys
BROKER_URL = 'amqp://nyuszi:teszt@localhost:5672/django'
try:
from local_settings import *
except:
pass
CELERY_CREATE_MISSING_QUEUES=True
celery = Celery('tasks', broker=BROKER_URL)
def main(argv):
celery.send_task('one.tasks.UpdateInstanceStateTask', [ int(sys.argv[1]),
], queue='local')
if __name__ == "__main__":
main(sys.argv)
...@@ -5,8 +5,16 @@ echo "En vagyok a $0 !" ...@@ -5,8 +5,16 @@ echo "En vagyok a $0 !"
arr=( $((echo 'ibase=16' ; ifconfig eth0 | awk '/HWaddr/ {print $5}' | tr ':a-z' '\nA-Z') | bc ) ) arr=( $((echo 'ibase=16' ; ifconfig eth0 | awk '/HWaddr/ {print $5}' | tr ':a-z' '\nA-Z') | bc ) )
ipv4="${arr[2]}.${arr[3]}.${arr[4]}.${arr[5]}" ipv4="${arr[2]}.${arr[3]}.${arr[4]}.${arr[5]}"
gw4="${arr[2]}.${arr[3]}.255.254" gw4="${arr[2]}.${arr[3]}.255.254"
net4="255.255.0.0"
ipv6="2001:738:2001:4031:${arr[3]}:${arr[4]}:${arr[5]}:0" ipv6="2001:738:2001:4031:${arr[3]}:${arr[4]}:${arr[5]}:0"
gw6="2001:738:2001:4031:${arr[3]}:255:254:0" gw6="2001:738:2001:4031:${arr[3]}:255:254:0"
net6="80"
if [ "${arr[2]}" == "152" ]; then
gw4="${arr[2]}.${arr[3]}.243.126"
net4="255.255.255.192"
gw6="2001:738:2001:4031:66:243:126:0"
fi
echo ok "$ipv4 $ipv6 $gw4 $gw6" echo ok "$ipv4 $ipv6 $gw4 $gw6"
...@@ -20,12 +28,12 @@ iface lo inet loopback ...@@ -20,12 +28,12 @@ iface lo inet loopback
auto eth0 auto eth0
iface eth0 inet static iface eth0 inet static
address $ipv4 address $ipv4
netmask 255.255.0.0 netmask $net4
gateway $gw4 gateway $gw4
dns-nameservers 152.66.243.60 dns-nameservers 152.66.243.60
iface eth0 inet6 static iface eth0 inet6 static
address $ipv6 address $ipv6
netmask 80 netmask $net6
gateway $gw6 gateway $gw6
EOF EOF
...@@ -46,10 +54,10 @@ DNS1="152.66.243.60" ...@@ -46,10 +54,10 @@ DNS1="152.66.243.60"
PEERDNS="yes" PEERDNS="yes"
IPADDR="$ipv4" IPADDR="$ipv4"
NETMASK="255.255.0.0" NETMASK="$net4"
GATEWAY=$gw4 GATEWAY=$gw4
IPV6ADDR="$ipv6/80" IPV6ADDR="$ipv6/$net6"
IPV6_DEFAULTGW="$gw6" IPV6_DEFAULTGW="$gw6"
EOF EOF
......
...@@ -6,12 +6,13 @@ do ...@@ -6,12 +6,13 @@ do
sudo stop $i || true sudo stop $i || true
done done
sudo apt-get install rabbitmq-server gettext sudo apt-get install rabbitmq-server gettext memcached
sudo rabbitmqctl delete_user guest || true sudo rabbitmqctl delete_user guest || true
sudo rabbitmqctl add_user nyuszi teszt || true sudo rabbitmqctl add_user nyuszi teszt || true
sudo rabbitmqctl add_vhost django || true sudo rabbitmqctl add_vhost django || true
sudo rabbitmqctl set_permissions -p django nyuszi '.*' '.*' '.*' || true sudo rabbitmqctl set_permissions -p django nyuszi '.*' '.*' '.*' || true
sudo pip install python-memcached
sudo cp /opt/webadmin/cloud/miscellaneous/devenv/boot_url.py /opt/ sudo cp /opt/webadmin/cloud/miscellaneous/devenv/boot_url.py /opt/
......
#!/bin/bash
# install xml.vim
mkdir -p ~/.vim/{ftplugin,indent}
cd ~/.vim
wget 'http://www.vim.org/scripts/download_script.php?src_id=16073' -O ftplugin/xml.vim
echo 'let b:did_indent = 1' > indent/xml.vim
for i in docbk xsl html xhtml
do
ln -s xml.vim ftplugin/$i.vim
echo 'let b:did_indent = 1' > indent/$i.vim
done
\documentclass[12pt,a4paper]{article}
\title{Harnessing Wasted Computing Power for Scientific Computing}
\author{S\'andor Guba, M\'at\'e \H{O}ry and Imre Szeber\'enyi\\
Budapest University of Technology and Economics, %\\
%Magyar Tud\'osok k\"or\'utja 2, H-1117 Budapest,
Hungary}
\date{\empty}
\begin{document}
\maketitle
Nowadays more and more general purpose workstations installed in a student
laboratory have built in multi-core CPU and graphics card providing significant
computing power. In most cases the utilization of these resources is low, and
limited to lecture hours. The concept of utility computing plays an important
role in nowadays technological development. As part of utility computing, cloud
computing offers greater flexibility and responsiveness to ICT users at lower
cost.
In  this paper, we introduce a cloud management system which enables the
simultaneous use of both dedicated resources and opportunistic environment. All
the free workstations (powered or not) are automatically added to a resource
pool, and can be used like ordinary cloud resources. Researchers can launch
various virtualized software appliances. Our solution leverages the advantages
of HTCondor and OpenNebula systems.
Modern graphics processing units (GPUs) with many-core architectures have
emerged as general-purpose parallel computing platforms that can dramatically
accelerate  scientific applications used for various simulations. Our business
model harnesses computing power of GPUs as well, using the needed amount of
unused machines. This makes the infrastructure flexible and power efficient.
Our pilot infrastructure consist of a high performance cluster and 28
workstations with dual-core CPUs and dedicated graphics cards. Altogether we
can use 10,752 CUDA cores through the network.
\end{document}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="arch.svg.2013_03_16_15_07_35.0.2.svg"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-22.959131"
inkscape:cy="751.8032"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1364"
inkscape:window-height="749"
inkscape:window-x="0"
inkscape:window-y="17"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
orientation="-0.70710678,0.70710678"
position="0.5,716.5"
id="guide3524" />
<sodipodi:guide
orientation="0.70710678,0.70710678"
position="227.5,673.5"
id="guide3526" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="1. réteg"
inkscape:groupmode="layer"
id="layer1">
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3575"
style="fill:none;stroke:#ffff00;stroke-width:0.49851683;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(0.64348983,-3.7565901,3.7565901,0.64348983,-329.36385,745.82088)" />
<path
transform="matrix(1.5701332,3.6885219,3.6885219,-1.5701332,-461.05784,-167.49813)"
sodipodi:type="arc"
style="fill:none;stroke:#ffff00;stroke-width:0.47395673;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3588"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:type="arc"
style="fill:none;stroke:#003366;stroke-width:0.67295331;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3562"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
transform="matrix(-0.62861196,2.7525075,-2.7525075,-0.62861196,424.93767,-110.28257)" />
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:type="arc"
style="opacity:0.1;fill:#eec73e;fill-opacity:1;stroke:#003366;stroke-width:1.53900003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3503"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="118.39488"
sodipodi:ry="118.39488"
d="m 266.89488,86.862183 a 118.39488,118.39488 0 1 1 -236.789762,0 118.39488,118.39488 0 1 1 236.789762,0 z"
transform="matrix(0.29589859,1.1985833,1.1985833,-0.29589859,-55.552506,91.57496)" />
<path
transform="matrix(2.6384034,0,0,2.6384034,296.33723,-76.10009)"
sodipodi:type="arc"
style="fill:#98fc66;fill-opacity:1;stroke:#003366;stroke-width:0.72013247;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3309"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 128.25,51.788154 a 40.5,40.5 0 0 1 40.5,1e-6 L 148.5,86.862183 z"
sodipodi:start="4.1887902"
sodipodi:end="5.2359878" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
x="-500"
y="90.362183"
id="text3003"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3005"
x="-500"
y="90.362183" /></text>
<flowRoot
xml:space="preserve"
id="flowRoot3007"
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:TitilliumTitle20;font-style:normal;font-weight:300;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:TitilliumTitle20 Light;font-stretch:normal;font-variant:normal"><flowRegion
id="flowRegion3009"><rect
id="rect3011"
width="215"
height="193"
x="-191"
y="123.36218" /></flowRegion><flowPara
id="flowPara3013" /></flowRoot> <text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumTitle20;-inkscape-font-specification:TitilliumTitle20 Light"
x="-260.08865"
y="123.72603"
id="text3025"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3027"
x="-260.08865"
y="123.72603"
style="font-size:20px">Python</tspan></text>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumTitle20;-inkscape-font-specification:TitilliumTitle20 Light"
x="-27.31016"
y="553.54175"
id="text3073"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3075"
x="-27.31016"
y="553.54175"
style="font-size:20px">OpenFlow</tspan></text>
<rect
style="fill:#aaccee;fill-opacity:1;stroke:none"
id="rect2985"
width="400"
height="300"
x="462.05585"
y="147.2655"
ry="10"
rx="10" />
<rect
ry="10"
rx="10"
y="224.22183"
x="524.75195"
height="23.535534"
width="103.92537"
id="rect3135"
style="fill:#ffffff;fill-opacity:1;stroke:#003366" />
<text
sodipodi:linespacing="125%"
id="text3029"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:transform-center-x="0.77156604"
inkscape:transform-center-y="-87.550871"
transform="translate(-305.61879,-73.937558)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><textPath
xlink:href="#path3105"
id="textPath3108"><tspan
id="tspan3031"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">Django</tspan></textPath></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3125"
width="118.28074"
height="23.53553"
x="473.9794"
y="285.96805"
rx="10"
ry="10" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3157"
width="95.653282"
height="23.535534"
x="-382.23566"
y="594.3302"
rx="10"
ry="10"
transform="matrix(0,-1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="-377.53323"
y="613.20801"
id="text3045"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan3047"
x="-377.53323"
y="613.20801"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">CondorHT</tspan></text>
<rect
ry="10"
rx="10"
y="312.56583"
x="522.96362"
height="23.535534"
width="68.783226"
id="rect3123"
style="fill:#ffffff;fill-opacity:1;stroke:#003366" />
<text
sodipodi:linespacing="125%"
id="text3049"
y="331.43359"
x="532.36395"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="331.43359"
x="532.36395"
id="tspan3051"
sodipodi:role="line">libvirt</tspan></text>
<rect
ry="10"
rx="10"
y="337.15509"
x="522.48718"
height="23.535534"
width="54.641087"
id="rect3159"
style="fill:#ffffff;fill-opacity:1;stroke:#003366" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="529.78992"
y="355.92285"
id="text3053"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3055"
x="529.78992"
y="355.92285"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">KVM</tspan></text>
<rect
ry="10"
rx="10"
y="524.86932"
x="-421.75073"
height="23.535534"
width="55.348198"
id="rect3139"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
transform="matrix(0,-1,1,0,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3141"
width="53.933983"
height="23.535534"
x="-421.00943"
y="552.68011"
rx="10"
ry="10"
transform="matrix(0,-1,1,0,0,0)" />
<rect
ry="10"
rx="10"
y="554.40509"
x="-498.47458"
height="23.535534"
width="70.904533"
id="rect3143"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
transform="matrix(0,-1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="-488.52621"
y="573.1629"
id="text3065"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan3067"
x="-488.52621"
y="573.1629"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">CUDA</tspan></text>
<rect
ry="10"
rx="10"
y="491.69034"
x="-443.15839"
height="23.535534"
width="127.47309"
id="rect3127"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
transform="matrix(0,-1,1,0,0,0)" />
<text
sodipodi:linespacing="125%"
id="text3069"
y="-95.902969"
x="-432.26517"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="-95.902969"
x="-432.26517"
id="tspan3071"
sodipodi:role="line">Open vSwitch</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3145"
width="68.076118"
height="23.535534"
x="635.73944"
y="338.97281"
rx="10"
ry="10" />
<text
sodipodi:linespacing="125%"
id="text3077"
y="464.9064"
x="-39.318756"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="464.9064"
x="-39.318756"
id="tspan3079"
sodipodi:role="line">QCOW</tspan></text>
<rect
ry="10"
rx="10"
y="338.39584"
x="709.5022"
height="23.53554"
width="52.51984"
id="rect3151"
style="fill:#ffffff;fill-opacity:1;stroke:#003366" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="34.75946"
y="465.61945"
id="text3081"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3083"
x="34.75946"
y="465.61945"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">LVM</tspan></text>
<rect
ry="10"
rx="10"
y="366.65564"
x="638.09924"
height="23.535534"
width="55.348198"
id="rect3147"
style="fill:#ffffff;fill-opacity:1;stroke:#003366" />
<text
sodipodi:linespacing="125%"
id="text3085"
y="493.91925"
x="-34.664795"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="493.91925"
x="-34.664795"
id="tspan3087"
sodipodi:role="line">NFS</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3129"
width="126.4314"
height="24.535534"
x="639.87427"
y="396.68478"
rx="10"
ry="10" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="-22.625824"
y="524.1084"
id="text3089"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3091"
x="-22.625824"
y="524.1084"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">InfiniBand</tspan></text>
<rect
ry="10"
rx="10"
y="787.98724"
x="-251.5313"
height="23.535534"
width="82.925362"
id="rect2993"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
transform="matrix(0,-1,1,0,0,0)" />
<text
sodipodi:linespacing="125%"
id="text3093"
y="-168.04498"
x="-350.60846"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="-168.04498"
x="-350.60846"
sodipodi:role="line"
id="tspan3109">Netfilter</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3153"
width="82.925362"
height="23.535534"
x="-251.5313"
y="814.52277"
rx="10"
ry="10"
transform="matrix(0,-1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="-345.77847"
y="-143.70947"
id="text3097"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3099"
x="-345.77847"
y="-143.70947"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">tinydns</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3121"
width="93.531967"
height="23.535534"
x="-251.5313"
y="761.45166"
rx="10"
ry="10"
transform="matrix(0,-1,1,0,0,0)" />
<text
sodipodi:linespacing="125%"
id="text3101"
y="-114.25905"
x="-201.36554"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="-114.25905"
x="-201.36554"
id="tspan3103"
sodipodi:role="line">Dnsmasq</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3149"
width="70.197296"
height="23.535534"
x="695.56238"
y="367.8338"
rx="10"
ry="10" />
<text
sodipodi:linespacing="125%"
id="text3105"
y="495.07742"
x="27.707764"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="495.07742"
x="27.707764"
id="tspan3107"
sodipodi:role="line">iSCSI</tspan></text>
<rect
ry="10"
rx="10"
y="256.96805"
x="506.9794"
height="23.53553"
width="81.280739"
id="rect3276"
style="fill:#ffffff;fill-opacity:1;stroke:#003366" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="527.51776"
y="273.73581"
id="text3278"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3280"
x="527.51776"
y="273.73581"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">OCCI</tspan></text>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="-138.59293"
y="128.88074"
id="text3112"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3114"
x="-138.59293"
y="128.88074" /></text>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="-304"
y="239.36218"
id="text3142"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3144"
x="-304"
y="239.36218">networking</tspan></text>
<text
sodipodi:linespacing="125%"
id="text3146"
y="476.81802"
x="108"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
y="476.81802"
x="108"
id="tspan3148"
sodipodi:role="line">storage</tspan></text>
<text
transform="matrix(0.82322794,0.56771099,-0.56771099,0.82322794,91.68181,-166.26247)"
inkscape:transform-center-y="-72.190452"
inkscape:transform-center-x="-38.782436"
sodipodi:linespacing="125%"
id="text3162"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><textPath
id="textPath3164"
xlink:href="#path3292"
style="font-weight:bold">libvirt</textPath></text>
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="text3179"
sodipodi:linespacing="125%"
inkscape:transform-center-x="-38.782436"
inkscape:transform-center-y="-72.190452"
transform="matrix(0.82322794,0.56771099,-0.56771099,0.82322794,25.00414,-172.26426)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><textPath
style="font-weight:bold"
xlink:href="#path3292"
id="textPath3181">kvm</textPath></text>
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="text3187"
sodipodi:linespacing="125%"
inkscape:transform-center-x="-38.782436"
inkscape:transform-center-y="-72.190452"
transform="matrix(0.82322794,0.56771099,-0.56771099,0.82322794,223.12903,-13.635057)"><textPath
style="font-weight:bold"
xlink:href="#path3292"
id="textPath3189" /></text>
<text
sodipodi:linespacing="125%"
id="text3061"
y="30.891037"
x="107.64305"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
y="30.891037"
x="107.64305"
id="tspan3063"
sodipodi:role="line">VT-d</tspan></text>
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="text3191"
sodipodi:linespacing="125%"
inkscape:transform-center-x="-38.782436"
inkscape:transform-center-y="-72.190452"
transform="matrix(0.82322794,0.56771099,-0.56771099,0.82322794,199.68181,-226.26247)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><textPath
style="font-weight:bold"
xlink:href="#path3292"
id="textPath3193">HTCondor</textPath></text>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
x="-12.837537"
y="88.802063"
id="text3195"
sodipodi:linespacing="125%"
transform="matrix(0.56708663,0.82365815,-0.82365815,0.56708663,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><tspan
sodipodi:role="line"
id="tspan3197"
x="-12.837537"
y="88.802063"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">CUDA</tspan></text>
<path
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3238"
style="fill:#003366;fill-opacity:1;stroke:#003366;stroke-width:0.76191127;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(-0.73806068,2.3820051,2.3820051,0.73806068,-4.8041455,-173.97514)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3210"
style="opacity:0.1;fill:#003366;fill-opacity:1;stroke:#003366;stroke-width:0.85499996;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(-1.1871526,-1.8785474,1.8785474,-1.1871526,105.61742,625.94513)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="matrix(4.132293,0,0,4.132293,-521.1455,-115.0778)"
sodipodi:type="arc"
style="fill:#003366;fill-opacity:1;stroke:#003366;stroke-width:0.45979312;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3150"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)"
sodipodi:type="arc"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3132"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="M 189,86.862183 A 40.5,40.5 0 0 1 131.38396,123.56765 L 148.5,86.862183 z"
sodipodi:start="0"
sodipodi:end="2.0071286"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)"
sodipodi:type="arc"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3430"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.517963"
sodipodi:ry="40.517963"
d="M 189.01796,86.862183 A 40.517963,40.517963 0 0 1 144.76155,127.20731 L 148.5,86.862183 z"
sodipodi:start="0"
sodipodi:end="1.6631942"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:end="1.4741804"
sodipodi:start="0"
d="M 189.01796,86.862183 A 40.517963,40.517963 0 0 1 152.40859,127.19118 L 148.5,86.862183 z"
sodipodi:ry="40.517963"
sodipodi:rx="40.517963"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3446"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)"
sodipodi:type="arc"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3452"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.517963"
sodipodi:ry="40.517963"
d="M 189.01796,86.862183 A 40.517963,40.517963 0 0 1 152.83858,127.14719 L 148.5,86.862183 z"
sodipodi:start="0"
sodipodi:end="1.4635127"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)"
sodipodi:type="arc"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3428"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 137.55176,125.85431 a 40.5,40.5 0 0 1 -6.3095,-2.35307 L 148.5,86.862183 z"
sodipodi:start="1.8445288"
sodipodi:end="2.0109926"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
d="M 128.25,121.93621 A 40.5,40.5 0 0 1 125.27015,53.686526 L 148.5,86.862183 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3134"
style="fill:#ffff99;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)"
sodipodi:start="2.0943951"
sodipodi:end="4.1015237"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:end="0.90791653"
sodipodi:start="0"
d="M 183.21429,86.862183 A 34.714287,34.714287 0 0 1 169.8628,114.22479 L 148.5,86.862183 z"
sodipodi:ry="34.714287"
sodipodi:rx="34.714287"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3426"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)" />
<path
sodipodi:type="arc"
style="opacity:0.1;fill:#eec73e;fill-opacity:1;stroke:#003366;stroke-width:1.25121951;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3128"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
transform="matrix(-1.5185185,0,0,1.5185185,318,111.96035)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
sodipodi:type="arc"
style="fill:#eec73e;fill-opacity:1;stroke:#003366;stroke-width:1.57088006;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3292"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
transform="matrix(-0.73337337,-0.96181362,0.96181362,-0.73337337,117.86071,450.39391)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
style="fill:none;stroke:none"
d="m 63.931925,164.86937 c 43.626515,-15.77772 91.783175,6.79821 107.560895,50.42473 15.77771,43.62652 -6.79821,91.78318 -50.42473,107.5609 C 77.44156,338.63271 29.284905,316.05678 13.507191,272.43026 -2.2705227,228.80374 20.305397,180.64708 63.931925,164.86937 z"
id="path3105"
inkscape:connector-curvature="0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
d="M 101.99324,116.32472 C 76.546217,116.36932 20.156751,150.4825 -0.78122293,192.72721 L 92.5,243.875 l 98.34375,40.09375 c 6.71151,-18.08233 19.80687,-28.15336 29.65625,-51.3125 L 242.4375,230.75 c -1.91539,-21.89294 -8.60546,-43.09273 -19.59375,-62.125 -27.92274,-48.3636 -68.74469,-52.39166 -120.85051,-52.30028 z"
id="path3136"
sodipodi:nodetypes="scccccss"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="matrix(2.6295998,0,0,2.6295998,-297.99557,15.449403)"
sodipodi:type="arc"
style="fill:#aaccee;fill-opacity:1;stroke:#003366;stroke-width:0.7225433;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3199"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
inkscape:transform-center-x="-4.0352443"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="matrix(1.2839507,0,0,1.271605,-96.66667,135.4078)"
sodipodi:type="arc"
style="fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:1.48697376;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3298"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="M 189,86.862183 A 40.5,40.5 0 1 1 117.86592,60.370613"
sodipodi:start="0"
sodipodi:end="3.8546018"
sodipodi:open="true"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:end="1.4608094"
sodipodi:start="0.90588138"
d="m 173.49927,118.74858 a 40.517967,40.517967 0 0 1 -20.5518,8.38674 L 148.5,86.862183 z"
sodipodi:ry="40.517967"
sodipodi:rx="40.517967"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3495"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-459.33334,-78.921978)"
sodipodi:type="arc"
style="fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:0.51129568;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3444"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="34.714287"
sodipodi:ry="34.714287"
d="m 169.91844,114.18126 a 34.714287,34.714287 0 0 1 -17.60802,7.18545 L 148.5,86.862183 z"
sodipodi:start="0.90588138"
sodipodi:end="1.4608094"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
style="fill:#003366;fill-opacity:1;stroke:#003366;stroke-width:1.9000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
d="M 91.25 157.875 C 34.226598 157.875 -12 201.63916 -12 255.625 C -12 260.0259 -11.688946 264.34688 -11.09375 268.59375 C 0.21430708 314.74849 42.485411 349.27586 93.21875 350.34375 C 93.354234 350.34285 93.489637 350.34515 93.625 350.34375 C 132.63112 349.93946 166.59371 328.57515 184.8125 296.96875 C 184.82897 296.93542 184.85857 296.90835 184.875 296.875 C 191.04736 284.34712 194.5 270.36269 194.5 255.625 C 194.5 201.63916 148.27341 157.875 91.25 157.875 z "
id="path3201"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3294"
style="fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:1.07622373;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(-0.72762529,-1.6085123,1.6085123,-0.72762529,60.83346,545.92938)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
sodipodi:linespacing="125%"
id="text3041"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
transform="matrix(0.99970601,-0.02424632,0.02424632,0.99970601,-3.8173792,2.0756822)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3210"
id="textPath3212"><tspan
id="tspan3043"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
dx="10.5">OpenNebula</tspan></textPath></text>
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="text3033"
sodipodi:linespacing="125%"
inkscape:transform-center-x="0.37728737"
inkscape:transform-center-y="-50.660877"
transform="matrix(0.99369837,0.11208727,-0.11208727,0.99369837,27.945665,-13.270438)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3292"
id="textPath3116"><tspan
style="font-weight:bold"
id="tspan3120">Celery</tspan></textPath></text>
<path
transform="matrix(1.2345679,0,0,1.2345679,-90.833336,136.62492)"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3118"
style="fill:#eec73e;fill-opacity:1;stroke:#003366;stroke-width:1.53900003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
sodipodi:linespacing="100%"
id="text3037"
style="font-size:19px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3515"
startOffset="50%"
id="textPath3517"><tspan
dy="0 0 0 0 0 0 0"
id="tspan3296"
style="font-size:19px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;text-anchor:middle;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">RabbitMQ</tspan></textPath></text>
<text
inkscape:transform-center-x="-1.5296205"
sodipodi:linespacing="125%"
id="text3122"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
xml:space="preserve"
inkscape:transform-center-y="19.979687"
transform="translate(300.9346,6.2071068)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><textPath
xlink:href="#path3128"
id="textPath3130"
style="font-size:18px"
dx="11">distributed task queue</textPath></text>
<path
id="path3215"
d="M 88.204663,95.907012 C 62.757635,95.951641 49.443105,114.65542 25.82367,128.2921 l 12.220143,18.68715 c 56.271714,-29.85238 102.087677,-6.88553 128.549737,3.60323 26.46205,10.48877 45.61859,25.44394 54.91534,80.89347 L 242.4375,230.75 C 240.52211,208.85706 233.83204,187.65727 222.84375,168.625 194.92101,120.2614 140.31049,95.815629 88.204663,95.907012 z"
style="fill:#ffffff;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="scczccss"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
inkscape:connector-curvature="0"
style="fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
d="M 92.09375,93.34375 C 66.646722,93.388379 40.869435,99.894563 17.25,113.53125 l 10.302697,17.08579 c 18.998936,-10.99607 41.06319,-17.3125 64.59375,-17.3125 67.527063,0 123.280143,53.27043 128.978553,119.32046 l 21.3125,-1.875 c -1.91539,-21.89294 -8.60546,-43.09273 -19.59375,-62.125 -27.92274,-48.3636 -78.64418,-75.372633 -130.75,-75.28125 z"
id="path3174"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
sodipodi:nodetypes="sccsccss" />
<path
transform="matrix(3.7312659,0,0,3.7312659,-461.59299,-80.243719)"
style="fill:none;stroke:#003366;stroke-width:0.50921059;stroke-miterlimit:4;stroke-dashoffset:0"
d="m 151.69664,127.23583 c -22.29775,1.76546 -41.80483,-14.87926 -43.57029,-37.17701 -1.76545,-22.29775 14.87926,-41.804832 37.17701,-43.570286 6.75335,-0.534705 13.53294,0.633184 19.7181,3.396746 l -2.34994,5.258626"
id="path3547"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csscc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#015a01;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
id="text3217"
sodipodi:linespacing="125%"
transform="matrix(0.98887574,0.14874396,-0.14874396,0.98887574,36.842448,-35.9897)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
inkscape:transform-center-x="20.113291"
inkscape:transform-center-y="-118.16099"><textPath
id="textPath3219"
xlink:href="#path3210"
style="font-size:19px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#015a01;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">KVM</textPath></text>
<text
transform="matrix(0.17256398,0.98499831,-0.98499831,0.17256398,334.53716,102.09909)"
sodipodi:linespacing="125%"
id="text3223"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#015a01;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:transform-center-x="-102.18218"
inkscape:transform-center-y="-51.009457"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3210"
id="textPath3225"><tspan
id="tspan3227"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#015a01;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light">libvirt</tspan></textPath></text>
<path
transform="matrix(-1.0841391,2.204492,2.204492,1.0841391,62.007667,-177.67557)"
sodipodi:type="arc"
style="opacity:0;fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:0.77341002000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3392"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
id="text3394"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3392"
id="textPath3398"><tspan
style="font-size:30px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;fill:#ffffff;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold"
id="tspan3396"
dx="1.4142134">CIRCLE</tspan></textPath></text>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#980101;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="-329.23999"
y="169.45934"
id="text3432"
sodipodi:linespacing="125%"
transform="matrix(0.32266286,-0.94651396,0.94651396,0.32266286,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><tspan
sodipodi:role="line"
x="-329.23999"
y="169.45934"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L;fill:#980101"
id="tspan3436">SMB</tspan></text>
<text
transform="matrix(0.20261113,-0.97925928,0.97925928,0.20261113,0,0)"
sodipodi:linespacing="125%"
id="text3440"
y="149.3541"
x="-348.85327"
style="font-size:38.21019362999999913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#980101;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><tspan
id="tspan3442"
style="font-size:19.10509681999999998px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L;fill:#980101"
y="149.3541"
x="-348.85327"
sodipodi:role="line">SFTP</tspan></text>
<text
xml:space="preserve"
style="font-size:38.21019362999999913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#980101;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="-370.16513"
y="107.08025"
id="text3448"
sodipodi:linespacing="125%"
transform="matrix(0.01924015,-0.99981489,0.99981489,0.01924015,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><tspan
sodipodi:role="line"
x="-370.16513"
y="107.08025"
style="font-size:19.10509681999999998px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L;fill:#980101"
id="tspan3450">WEB</tspan></text>
<text
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:transform-center-y="-50.660877"
inkscape:transform-center-x="0.37728737"
sodipodi:linespacing="125%"
id="text3454"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#980101;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
xml:space="preserve"><textPath
xlink:href="#path3464"
id="textPath3470"><tspan
id="tspan3458"
style="font-weight:bold;fill:#980101"
dx="-4.24264">LVM</tspan></textPath></text>
<path
style="opacity:0;fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:1.89999998000000003;stroke-miterlimit:4;stroke-dashoffset:0"
d="m 125.58656,364.42906 c 28.77579,-8.16369 53.82029,-26.07346 70.84837,-50.66486"
id="path3464"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
inkscape:transform-center-x="-70.632065"
inkscape:transform-center-y="98.769975"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#980101;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="text3473"
sodipodi:linespacing="125%"
inkscape:transform-center-x="-97.650821"
inkscape:transform-center-y="65.385"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
transform="matrix(0.84808922,-0.52985344,0.52985344,0.84808922,-115.15947,86.056735)"><textPath
id="textPath3475"
xlink:href="#path3464"><tspan
style="font-weight:bold;fill:#980101"
id="tspan3477"
dx="-1.7677672">QCOW</tspan></textPath></text>
<path
inkscape:transform-center-y="44.466657"
inkscape:transform-center-x="-108.56353"
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3479"
d="m 184.44313,328.58263 c 20.07888,-22.1705 31.82929,-50.62949 33.24079,-80.50758"
style="opacity:0;fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:1.89999998000000003;stroke-miterlimit:4;stroke-dashoffset:0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#980101;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="text3487"
sodipodi:linespacing="125%"
inkscape:transform-center-x="-1.5797689"
inkscape:transform-center-y="-50.705679"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3503"
id="textPath3506"><tspan
style="font-weight:bold;fill:#980101"
id="tspan3491"
dx="1.0606601">iSCSI</tspan></textPath></text>
<path
inkscape:transform-center-y="98.769975"
inkscape:transform-center-x="-70.632065"
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3493"
d="m 127.00077,387.05648 c 28.77579,-8.16369 53.82029,-26.07346 70.84837,-50.66486"
style="opacity:0;fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dashoffset:0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:transform-center-y="70.938638"
inkscape:transform-center-x="-115.63696"
sodipodi:linespacing="125%"
id="text3497"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#980101;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
xml:space="preserve"><textPath
xlink:href="#path3503"
id="textPath3510"><tspan
id="tspan3501"
style="font-weight:bold;fill:#980101"
dx="74.953384">NFS over IB</tspan></textPath></text>
<path
sodipodi:type="arc"
style="opacity:0;fill:#980101;fill-opacity:1;stroke:#ffffff;stroke-width:1.89999998000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="path3515"
sodipodi:cx="92.5"
sodipodi:cy="243.86218"
sodipodi:rx="29"
sodipodi:ry="29"
d="m 121.5,243.86218 a 29,29 0 1 1 -58,0 29,29 0 1 1 58,0 z"
transform="matrix(-0.01061887,0.99994362,-0.99994362,-0.01061887,337.33068,153.95694)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
sodipodi:type="arc"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#003366;stroke-width:1.89999998000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="path3520"
sodipodi:cx="92.5"
sodipodi:cy="243.86218"
sodipodi:rx="10.000001"
sodipodi:ry="10.000001"
d="m 102.5,243.86218 a 10.000001,10.000001 0 1 1 -20.000001,0 10.000001,10.000001 0 1 1 20.000001,0 z"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#015a01;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
id="text3057"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3524"
id="textPath3536"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold;fill:#015a01;fill-opacity:1"
id="tspan3059"
dx="2 0 0 0 0 0 0 0 0 0 0 7.5">VT-x/AMD-V IOMMU+CUDA</tspan></textPath></text>
<path
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:type="arc"
style="fill:none;stroke:none;stroke-width:0.58075160000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3524"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 a 40.5,40.5 0 1 1 -81,0 40.5,40.5 0 1 1 81,0 z"
transform="matrix(-1.5029938,-2.9059467,2.9059467,-1.5029938,63.277693,805.94859)" />
<text
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:linespacing="125%"
id="text3550"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#015a01;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
xml:space="preserve"
inkscape:transform-center-x="110.47503"
inkscape:transform-center-y="3.8880154"
transform="matrix(-0.49541966,-0.86865376,0.86865376,-0.49541966,-75.005485,444.52677)"><textPath
id="textPath3552"
xlink:href="#path3524"><tspan
id="tspan3554"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;fill:#015a01;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold">Netfilter dnsmasq Open</tspan></textPath></text>
<text
inkscape:transform-center-y="3.8880154"
inkscape:transform-center-x="110.47503"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#015a01;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
id="text3556"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
transform="translate(1.5,-1)"><textPath
xlink:href="#path3562"
id="textPath3565"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;fill:#015a01;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold"
id="tspan3560"
dx="22.627419 0 0 0 0 0 0 0 0 0 0 1.4142135"> iptables tinydns vSwitch</tspan></textPath></text>
<path
transform="matrix(-0.71022656,3.1098739,-3.1098739,-0.71022656,468.09906,-156.26226)"
d="M 187.35849,98.27567 A 40.5,40.5 0 0 1 148.04236,127.3596"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path3568"
style="fill:none;stroke:#003366;stroke-width:0.59562188;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
sodipodi:start="0.28568475"
sodipodi:end="1.5820964"
sodipodi:open="true" />
<path
transform="matrix(-0.71022656,3.1098739,-3.1098739,-0.71022656,468.09906,-156.26226)"
style="fill:none;stroke:#003366;stroke-width:0.59562188;stroke-miterlimit:4;stroke-dashoffset:0"
d="m 148.08079,120.43357 -0.094,13.72532"
id="path3570"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3573"
d="M -5.8550661,286.3402 -46.722319,302.04979"
style="fill:none;stroke:#003366;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dashoffset:0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
id="text3138"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
xlink:href="#path3575"
id="textPath3577"><tspan
style="-inkscape-font-specification:TitilliumText25L;font-family:TitilliumText25L;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:16px;fill:#ffffff;fill-opacity:1"
id="tspan3140">virtualization</tspan></textPath></text>
<text
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:linespacing="125%"
id="text3582"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
xml:space="preserve"
inkscape:transform-center-x="156.27315"
inkscape:transform-center-y="11.085366"
transform="matrix(-0.47669194,-0.87907042,0.87907042,-0.47669194,-77.778024,441.42333)"><textPath
id="textPath3584"
xlink:href="#path3575"><tspan
id="tspan3586"
style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">networking</tspan></textPath></text>
<text
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
sodipodi:linespacing="125%"
id="text3590"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
xml:space="preserve"><textPath
xlink:href="#path3588"
id="textPath3597"><tspan
id="tspan3594"
style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">storage</tspan></textPath></text>
</g>
</svg>
% LLNCS DOCUMENT CLASS -- version 2.17 (12-Jul-2010)
% Springer Verlag LaTeX2e support for Lecture Notes in Computer Science
%
%%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{llncs}[2010/07/12 v2.17
^^J LaTeX document class for Lecture Notes in Computer Science]
% Options
\let\if@envcntreset\iffalse
\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue}
\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y}
\DeclareOption{oribibl}{\let\oribibl=Y}
\let\if@custvec\iftrue
\DeclareOption{orivec}{\let\if@custvec\iffalse}
\let\if@envcntsame\iffalse
\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue}
\let\if@envcntsect\iffalse
\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue}
\let\if@runhead\iffalse
\DeclareOption{runningheads}{\let\if@runhead\iftrue}
\let\if@openright\iftrue
\let\if@openbib\iffalse
\DeclareOption{openbib}{\let\if@openbib\iftrue}
% languages
\let\switcht@@therlang\relax
\def\ds@deutsch{\def\switcht@@therlang{\switcht@deutsch}}
\def\ds@francais{\def\switcht@@therlang{\switcht@francais}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass[twoside]{article}
\RequirePackage{multicol} % needed for the list of participants, index
\RequirePackage{aliascnt}
\setlength{\textwidth}{12.2cm}
\setlength{\textheight}{19.3cm}
\renewcommand\@pnumwidth{2em}
\renewcommand\@tocrmarg{3.5em}
%
\def\@dottedtocline#1#2#3#4#5{%
\ifnum #1>\c@tocdepth \else
\vskip \z@ \@plus.2\p@
{\leftskip #2\relax \rightskip \@tocrmarg \advance\rightskip by 0pt plus 2cm
\parfillskip -\rightskip \pretolerance=10000
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax
\advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
{#4}\nobreak
\leaders\hbox{$\m@th
\mkern \@dotsep mu\hbox{.}\mkern \@dotsep
mu$}\hfill
\nobreak
\hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
\par}%
\fi}
%
\def\switcht@albion{%
\def\abstractname{Abstract.}
\def\ackname{Acknowledgement.}
\def\andname{and}
\def\lastandname{\unskip, and}
\def\appendixname{Appendix}
\def\chaptername{Chapter}
\def\claimname{Claim}
\def\conjecturename{Conjecture}
\def\contentsname{Table of Contents}
\def\corollaryname{Corollary}
\def\definitionname{Definition}
\def\examplename{Example}
\def\exercisename{Exercise}
\def\figurename{Fig.}
\def\keywordname{{\bf Keywords:}}
\def\indexname{Index}
\def\lemmaname{Lemma}
\def\contriblistname{List of Contributors}
\def\listfigurename{List of Figures}
\def\listtablename{List of Tables}
\def\mailname{{\it Correspondence to\/}:}
\def\noteaddname{Note added in proof}
\def\notename{Note}
\def\partname{Part}
\def\problemname{Problem}
\def\proofname{Proof}
\def\propertyname{Property}
\def\propositionname{Proposition}
\def\questionname{Question}
\def\remarkname{Remark}
\def\seename{see}
\def\solutionname{Solution}
\def\subclassname{{\it Subject Classifications\/}:}
\def\tablename{Table}
\def\theoremname{Theorem}}
\switcht@albion
% Names of theorem like environments are already defined
% but must be translated if another language is chosen
%
% French section
\def\switcht@francais{%\typeout{On parle francais.}%
\def\abstractname{R\'esum\'e.}%
\def\ackname{Remerciements.}%
\def\andname{et}%
\def\lastandname{ et}%
\def\appendixname{Appendice}
\def\chaptername{Chapitre}%
\def\claimname{Pr\'etention}%
\def\conjecturename{Hypoth\`ese}%
\def\contentsname{Table des mati\`eres}%
\def\corollaryname{Corollaire}%
\def\definitionname{D\'efinition}%
\def\examplename{Exemple}%
\def\exercisename{Exercice}%
\def\figurename{Fig.}%
\def\keywordname{{\bf Mots-cl\'e:}}
\def\indexname{Index}
\def\lemmaname{Lemme}%
\def\contriblistname{Liste des contributeurs}
\def\listfigurename{Liste des figures}%
\def\listtablename{Liste des tables}%
\def\mailname{{\it Correspondence to\/}:}
\def\noteaddname{Note ajout\'ee \`a l'\'epreuve}%
\def\notename{Remarque}%
\def\partname{Partie}%
\def\problemname{Probl\`eme}%
\def\proofname{Preuve}%
\def\propertyname{Caract\'eristique}%
%\def\propositionname{Proposition}%
\def\questionname{Question}%
\def\remarkname{Remarque}%
\def\seename{voir}
\def\solutionname{Solution}%
\def\subclassname{{\it Subject Classifications\/}:}
\def\tablename{Tableau}%
\def\theoremname{Th\'eor\`eme}%
}
%
% German section
\def\switcht@deutsch{%\typeout{Man spricht deutsch.}%
\def\abstractname{Zusammenfassung.}%
\def\ackname{Danksagung.}%
\def\andname{und}%
\def\lastandname{ und}%
\def\appendixname{Anhang}%
\def\chaptername{Kapitel}%
\def\claimname{Behauptung}%
\def\conjecturename{Hypothese}%
\def\contentsname{Inhaltsverzeichnis}%
\def\corollaryname{Korollar}%
%\def\definitionname{Definition}%
\def\examplename{Beispiel}%
\def\exercisename{\"Ubung}%
\def\figurename{Abb.}%
\def\keywordname{{\bf Schl\"usselw\"orter:}}
\def\indexname{Index}
%\def\lemmaname{Lemma}%
\def\contriblistname{Mitarbeiter}
\def\listfigurename{Abbildungsverzeichnis}%
\def\listtablename{Tabellenverzeichnis}%
\def\mailname{{\it Correspondence to\/}:}
\def\noteaddname{Nachtrag}%
\def\notename{Anmerkung}%
\def\partname{Teil}%
%\def\problemname{Problem}%
\def\proofname{Beweis}%
\def\propertyname{Eigenschaft}%
%\def\propositionname{Proposition}%
\def\questionname{Frage}%
\def\remarkname{Anmerkung}%
\def\seename{siehe}
\def\solutionname{L\"osung}%
\def\subclassname{{\it Subject Classifications\/}:}
\def\tablename{Tabelle}%
%\def\theoremname{Theorem}%
}
% Ragged bottom for the actual page
\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil
\global\let\@textbottom\relax}}
\renewcommand\small{%
\@setfontsize\small\@ixpt{11}%
\abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
\abovedisplayshortskip \z@ \@plus2\p@
\belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
\def\@listi{\leftmargin\leftmargini
\parsep 0\p@ \@plus1\p@ \@minus\p@
\topsep 8\p@ \@plus2\p@ \@minus4\p@
\itemsep0\p@}%
\belowdisplayskip \abovedisplayskip
}
\frenchspacing
\widowpenalty=10000
\clubpenalty=10000
\setlength\oddsidemargin {63\p@}
\setlength\evensidemargin {63\p@}
\setlength\marginparwidth {90\p@}
\setlength\headsep {16\p@}
\setlength\footnotesep{7.7\p@}
\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@}
\setlength\intextsep {8mm\@plus 2\p@ \@minus 2\p@}
\setcounter{secnumdepth}{2}
\newcounter {chapter}
\renewcommand\thechapter {\@arabic\c@chapter}
\newif\if@mainmatter \@mainmattertrue
\newcommand\frontmatter{\cleardoublepage
\@mainmatterfalse\pagenumbering{Roman}}
\newcommand\mainmatter{\cleardoublepage
\@mainmattertrue\pagenumbering{arabic}}
\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi
\@mainmatterfalse}
\renewcommand\part{\cleardoublepage
\thispagestyle{empty}%
\if@twocolumn
\onecolumn
\@tempswatrue
\else
\@tempswafalse
\fi
\null\vfil
\secdef\@part\@spart}
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax
\refstepcounter{part}%
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}%
\fi
\markboth{}{}%
{\centering
\interlinepenalty \@M
\normalfont
\ifnum \c@secnumdepth >-2\relax
\huge\bfseries \partname~\thepart
\par
\vskip 20\p@
\fi
\Huge \bfseries #2\par}%
\@endpart}
\def\@spart#1{%
{\centering
\interlinepenalty \@M
\normalfont
\Huge \bfseries #1\par}%
\@endpart}
\def\@endpart{\vfil\newpage
\if@twoside
\null
\thispagestyle{empty}%
\newpage
\fi
\if@tempswa
\twocolumn
\fi}
\newcommand\chapter{\clearpage
\thispagestyle{empty}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
\def\@makechapterhead#1{%
% \vspace*{50\p@}%
{\centering
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\large\bfseries \@chapapp{} \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\Large \bfseries #1\par\nobreak
\vskip 40\p@
}}
\def\@schapter#1{\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}
\def\@makeschapterhead#1{%
% \vspace*{50\p@}%
{\centering
\normalfont
\interlinepenalty\@M
\Large \bfseries #1\par\nobreak
\vskip 40\p@
}}
\renewcommand\section{\@startsection{section}{1}{\z@}%
{-18\p@ \@plus -4\p@ \@minus -4\p@}%
{12\p@ \@plus 4\p@ \@minus 4\p@}%
{\normalfont\large\bfseries\boldmath
\rightskip=\z@ \@plus 8em\pretolerance=10000 }}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-18\p@ \@plus -4\p@ \@minus -4\p@}%
{8\p@ \@plus 4\p@ \@minus 4\p@}%
{\normalfont\normalsize\bfseries\boldmath
\rightskip=\z@ \@plus 8em\pretolerance=10000 }}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-18\p@ \@plus -4\p@ \@minus -4\p@}%
{-0.5em \@plus -0.22em \@minus -0.1em}%
{\normalfont\normalsize\bfseries\boldmath}}
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{-12\p@ \@plus -4\p@ \@minus -4\p@}%
{-0.5em \@plus -0.22em \@minus -0.1em}%
{\normalfont\normalsize\itshape}}
\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use
\string\subparagraph\space with this class}\vskip0.5cm
You should not use \verb|\subparagraph| with this class.\vskip0.5cm}
\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00}
\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01}
\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02}
\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03}
\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04}
\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05}
\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06}
\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07}
\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08}
\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09}
\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A}
\let\footnotesize\small
\if@custvec
\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
{\mbox{\boldmath$\textstyle#1$}}
{\mbox{\boldmath$\scriptstyle#1$}}
{\mbox{\boldmath$\scriptscriptstyle#1$}}}
\fi
\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}}
\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil
\penalty50\hskip1em\null\nobreak\hfil\squareforqed
\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}
\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip
\halign{\hfil
$\displaystyle##$\hfil\cr\gets\cr\to\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets
\cr\to\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets
\cr\to\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
\gets\cr\to\cr}}}}}
\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr
\noalign{\vskip1.2pt}=\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr
\noalign{\vskip1pt}=\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
<\cr
\noalign{\vskip0.9pt}=\cr}}}}}
\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr
\noalign{\vskip1.2pt}=\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr
\noalign{\vskip1pt}=\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
>\cr
\noalign{\vskip0.9pt}=\cr}}}}}
\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip
\halign{\hfil
$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr
>\cr\noalign{\vskip-1pt}<\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr
>\cr\noalign{\vskip-0.8pt}<\cr}}}
{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
>\cr\noalign{\vskip-0.3pt}<\cr}}}}}
\def\bbbr{{\rm I\!R}} %reelle Zahlen
\def\bbbm{{\rm I\!M}}
\def\bbbn{{\rm I\!N}} %natuerliche Zahlen
\def\bbbf{{\rm I\!F}}
\def\bbbh{{\rm I\!H}}
\def\bbbk{{\rm I\!K}}
\def\bbbp{{\rm I\!P}}
\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l}
{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}}
\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox
to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox
to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox
to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox
to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}}
\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
Q$}\hbox{\raise
0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise
0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise
0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise
0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}}
\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox
to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox
to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox
to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}}
\def\bbbs{{\mathchoice
{\setbox0=\hbox{$\displaystyle \rm S$}\hbox{\raise0.5\ht0\hbox
to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
{\setbox0=\hbox{$\textstyle \rm S$}\hbox{\raise0.5\ht0\hbox
to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptstyle \rm S$}\hbox{\raise0.5\ht0\hbox
to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}}
{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox
to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}}
\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}}
{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}}
\let\ts\,
\setlength\leftmargini {17\p@}
\setlength\leftmargin {\leftmargini}
\setlength\leftmarginii {\leftmargini}
\setlength\leftmarginiii {\leftmargini}
\setlength\leftmarginiv {\leftmargini}
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\def\@listI{\leftmargin\leftmargini
\parsep 0\p@ \@plus1\p@ \@minus\p@
\topsep 8\p@ \@plus2\p@ \@minus4\p@
\itemsep0\p@}
\let\@listi\@listI
\@listi
\def\@listii {\leftmargin\leftmarginii
\labelwidth\leftmarginii
\advance\labelwidth-\labelsep
\topsep 0\p@ \@plus2\p@ \@minus\p@}
\def\@listiii{\leftmargin\leftmarginiii
\labelwidth\leftmarginiii
\advance\labelwidth-\labelsep
\topsep 0\p@ \@plus\p@\@minus\p@
\parsep \z@
\partopsep \p@ \@plus\z@ \@minus\p@}
\renewcommand\labelitemi{\normalfont\bfseries --}
\renewcommand\labelitemii{$\m@th\bullet$}
\setlength\arraycolsep{1.4\p@}
\setlength\tabcolsep{1.4\p@}
\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}%
{{\contentsname}}}
\def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}}
\def\lastand{\ifnum\value{auco}=2\relax
\unskip{} \andname\
\else
\unskip \lastandname\
\fi}%
\def\and{\stepcounter{@auth}\relax
\ifnum\value{@auth}=\value{auco}%
\lastand
\else
\unskip,
\fi}%
\@starttoc{toc}\if@restonecol\twocolumn\fi}
\def\l@part#1#2{\addpenalty{\@secpenalty}%
\addvspace{2em plus\p@}% % space above part line
\begingroup
\parindent \z@
\rightskip \z@ plus 5em
\hrule\vskip5pt
\large % same size as for a contribution heading
\bfseries\boldmath % set line in boldface
\leavevmode % TeX command to enter horizontal mode.
#1\par
\vskip5pt
\hrule
\vskip1pt
\nobreak % Never break after part entry
\endgroup}
\def\@dotsep{2}
\let\phantomsection=\relax
\def\hyperhrefextend{\ifx\hyper@anchor\@undefined\else
{}\fi}
\def\addnumcontentsmark#1#2#3{%
\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline
{\thechapter}#3}{\thepage}\hyperhrefextend}}%
\def\addcontentsmark#1#2#3{%
\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}}%
\def\addcontentsmarkwop#1#2#3{%
\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}}%
\def\@adcmk[#1]{\ifcase #1 \or
\def\@gtempa{\addnumcontentsmark}%
\or \def\@gtempa{\addcontentsmark}%
\or \def\@gtempa{\addcontentsmarkwop}%
\fi\@gtempa{toc}{chapter}%
}
\def\addtocmark{%
\phantomsection
\@ifnextchar[{\@adcmk}{\@adcmk[3]}%
}
\def\l@chapter#1#2{\addpenalty{-\@highpenalty}
\vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup
\parindent \z@ \rightskip \@tocrmarg
\advance\rightskip by 0pt plus 2cm
\parfillskip -\rightskip \pretolerance=10000
\leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
{\large\bfseries\boldmath#1}\ifx0#2\hfil\null
\else
\nobreak
\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
\@dotsep mu$}\hfill
\nobreak\hbox to\@pnumwidth{\hss #2}%
\fi\par
\penalty\@highpenalty \endgroup}
\def\l@title#1#2{\addpenalty{-\@highpenalty}
\addvspace{8pt plus 1pt}
\@tempdima \z@
\begingroup
\parindent \z@ \rightskip \@tocrmarg
\advance\rightskip by 0pt plus 2cm
\parfillskip -\rightskip \pretolerance=10000
\leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
#1\nobreak
\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
\@dotsep mu$}\hfill
\nobreak\hbox to\@pnumwidth{\hss #2}\par
\penalty\@highpenalty \endgroup}
\def\l@author#1#2{\addpenalty{\@highpenalty}
\@tempdima=15\p@ %\z@
\begingroup
\parindent \z@ \rightskip \@tocrmarg
\advance\rightskip by 0pt plus 2cm
\pretolerance=10000
\leavevmode \advance\leftskip\@tempdima %\hskip -\leftskip
\textit{#1}\par
\penalty\@highpenalty \endgroup}
\setcounter{tocdepth}{0}
\newdimen\tocchpnum
\newdimen\tocsecnum
\newdimen\tocsectotal
\newdimen\tocsubsecnum
\newdimen\tocsubsectotal
\newdimen\tocsubsubsecnum
\newdimen\tocsubsubsectotal
\newdimen\tocparanum
\newdimen\tocparatotal
\newdimen\tocsubparanum
\tocchpnum=\z@ % no chapter numbers
\tocsecnum=15\p@ % section 88. plus 2.222pt
\tocsubsecnum=23\p@ % subsection 88.8 plus 2.222pt
\tocsubsubsecnum=27\p@ % subsubsection 88.8.8 plus 1.444pt
\tocparanum=35\p@ % paragraph 88.8.8.8 plus 1.666pt
\tocsubparanum=43\p@ % subparagraph 88.8.8.8.8 plus 1.888pt
\def\calctocindent{%
\tocsectotal=\tocchpnum
\advance\tocsectotal by\tocsecnum
\tocsubsectotal=\tocsectotal
\advance\tocsubsectotal by\tocsubsecnum
\tocsubsubsectotal=\tocsubsectotal
\advance\tocsubsubsectotal by\tocsubsubsecnum
\tocparatotal=\tocsubsubsectotal
\advance\tocparatotal by\tocparanum}
\calctocindent
\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}}
\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}}
\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}}
\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}}
\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}}
\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
\fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}}
\@starttoc{lof}\if@restonecol\twocolumn\fi}
\def\l@figure{\@dottedtocline{1}{0em}{1.5em}}
\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
\fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}}
\@starttoc{lot}\if@restonecol\twocolumn\fi}
\let\l@table\l@figure
\renewcommand\listoffigures{%
\section*{\listfigurename
\@mkboth{\listfigurename}{\listfigurename}}%
\@starttoc{lof}%
}
\renewcommand\listoftables{%
\section*{\listtablename
\@mkboth{\listtablename}{\listtablename}}%
\@starttoc{lot}%
}
\ifx\oribibl\undefined
\ifx\citeauthoryear\undefined
\renewenvironment{thebibliography}[1]
{\section*{\refname}
\def\@biblabel##1{##1.}
\small
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\if@openbib
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
\fi
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
\if@openbib
\renewcommand\newblock{\par}%
\else
\renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
\fi
\sloppy\clubpenalty4000\widowpenalty4000%
\sfcode`\.=\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw
{\let\protect\noexpand\immediate
\write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
\newcount\@tempcntc
\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
\@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do
{\@ifundefined
{b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries
?}\@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
{\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}%
\ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne
\@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}%
\else
\advance\@tempcntb\@ne
\ifnum\@tempcntb=\@tempcntc
\else\advance\@tempcntb\m@ne\@citeo
\@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}}
\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else
\@citea\def\@citea{,\,\hskip\z@skip}%
\ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else
{\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else
\def\@citea{--}\fi
\advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi}
\else
\renewenvironment{thebibliography}[1]
{\section*{\refname}
\small
\list{}%
{\settowidth\labelwidth{}%
\leftmargin\parindent
\itemindent=-\parindent
\labelsep=\z@
\if@openbib
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
\fi
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{}}%
\if@openbib
\renewcommand\newblock{\par}%
\else
\renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
\fi
\sloppy\clubpenalty4000\widowpenalty4000%
\sfcode`\.=\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
\def\@cite#1{#1}%
\def\@lbibitem[#1]#2{\item[]\if@filesw
{\def\protect##1{\string ##1\space}\immediate
\write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
\fi
\else
\@cons\@openbib@code{\noexpand\small}
\fi
\def\idxquad{\hskip 10\p@}% space that divides entry from number
\def\@idxitem{\par\hangindent 10\p@}
\def\subitem{\par\setbox0=\hbox{--\enspace}% second order
\noindent\hangindent\wd0\box0}% index entry
\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third
\noindent\hangindent\wd0\box0}% order index entry
\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax}
\renewenvironment{theindex}
{\@mkboth{\indexname}{\indexname}%
\thispagestyle{empty}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\par
\def\,{\relax\ifmmode\mskip\thinmuskip
\else\hskip0.2em\ignorespaces\fi}%
\normalfont\small
\begin{multicols}{2}[\@makeschapterhead{\indexname}]%
}
{\end{multicols}}
\renewcommand\footnoterule{%
\kern-3\p@
\hrule\@width 2truecm
\kern2.6\p@}
\newdimen\fnindent
\fnindent1em
\long\def\@makefntext#1{%
\parindent \fnindent%
\leftskip \fnindent%
\noindent
\llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1}
\long\def\@makecaption#1#2{%
\small
\vskip\abovecaptionskip
\sbox\@tempboxa{{\bfseries #1.} #2}%
\ifdim \wd\@tempboxa >\hsize
{\bfseries #1.} #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\def\fps@figure{htbp}
\def\fnum@figure{\figurename\thinspace\thefigure}
\def \@floatboxreset {%
\reset@font
\small
\@setnobreak
\@setminipage
}
\def\fps@table{htbp}
\def\fnum@table{\tablename~\thetable}
\renewenvironment{table}
{\setlength\abovecaptionskip{0\p@}%
\setlength\belowcaptionskip{10\p@}%
\@float{table}}
{\end@float}
\renewenvironment{table*}
{\setlength\abovecaptionskip{0\p@}%
\setlength\belowcaptionskip{10\p@}%
\@dblfloat{table}}
{\end@dblfloat}
\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
ext@#1\endcsname}{#1}{\protect\numberline{\csname
the#1\endcsname}{\ignorespaces #2}}\begingroup
\@parboxrestore
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
% LaTeX does not provide a command to enter the authors institute
% addresses. The \institute command is defined here.
\newcounter{@inst}
\newcounter{@auth}
\newcounter{auco}
\newdimen\instindent
\newbox\authrun
\newtoks\authorrunning
\newtoks\tocauthor
\newbox\titrun
\newtoks\titlerunning
\newtoks\toctitle
\def\clearheadinfo{\gdef\@author{No Author Given}%
\gdef\@title{No Title Given}%
\gdef\@subtitle{}%
\gdef\@institute{No Institute Given}%
\gdef\@thanks{}%
\global\titlerunning={}\global\authorrunning={}%
\global\toctitle={}\global\tocauthor={}}
\def\institute#1{\gdef\@institute{#1}}
\def\institutename{\par
\begingroup
\parskip=\z@
\parindent=\z@
\setcounter{@inst}{1}%
\def\and{\par\stepcounter{@inst}%
\noindent$^{\the@inst}$\enspace\ignorespaces}%
\setbox0=\vbox{\def\thanks##1{}\@institute}%
\ifnum\c@@inst=1\relax
\gdef\fnnstart{0}%
\else
\xdef\fnnstart{\c@@inst}%
\setcounter{@inst}{1}%
\noindent$^{\the@inst}$\enspace
\fi
\ignorespaces
\@institute\par
\endgroup}
\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or
{\star\star\star}\or \dagger\or \ddagger\or
\mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
\or \ddagger\ddagger \else\@ctrerr\fi}}
\def\inst#1{\unskip$^{#1}$}
\def\fnmsep{\unskip$^,$}
\def\email#1{{\tt#1}}
\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}%
\@ifpackageloaded{babel}{%
\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}%
\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}%
\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}%
}{\switcht@@therlang}%
\providecommand{\keywords}[1]{\par\addvspace\baselineskip
\noindent\keywordname\enspace\ignorespaces#1}%
}
\def\homedir{\~{ }}
\def\subtitle#1{\gdef\@subtitle{#1}}
\clearheadinfo
%
%%% to avoid hyperref warnings
\providecommand*{\toclevel@author}{999}
%%% to make title-entry parent of section-entries
\providecommand*{\toclevel@title}{0}
%
\renewcommand\maketitle{\newpage
\phantomsection
\refstepcounter{chapter}%
\stepcounter{section}%
\setcounter{section}{0}%
\setcounter{subsection}{0}%
\setcounter{figure}{0}
\setcounter{table}{0}
\setcounter{equation}{0}
\setcounter{footnote}{0}%
\begingroup
\parindent=\z@
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{empty}\@thanks
%
\def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}%
\def\thanks##1{\unskip{}}\def\fnmsep{\unskip}%
\instindent=\hsize
\advance\instindent by-\headlineindent
\if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else
\addcontentsline{toc}{title}{\the\toctitle}\fi
\if@runhead
\if!\the\titlerunning!\else
\edef\@title{\the\titlerunning}%
\fi
\global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}%
\ifdim\wd\titrun>\instindent
\typeout{Title too long for running head. Please supply}%
\typeout{a shorter form with \string\titlerunning\space prior to
\string\maketitle}%
\global\setbox\titrun=\hbox{\small\rm
Title Suppressed Due to Excessive Length}%
\fi
\xdef\@title{\copy\titrun}%
\fi
%
\if!\the\tocauthor!\relax
{\def\and{\noexpand\protect\noexpand\and}%
\protected@xdef\toc@uthor{\@author}}%
\else
\def\\{\noexpand\protect\noexpand\newline}%
\protected@xdef\scratch{\the\tocauthor}%
\protected@xdef\toc@uthor{\scratch}%
\fi
\addtocontents{toc}{\noexpand\protect\noexpand\authcount{\the\c@auco}}%
\addcontentsline{toc}{author}{\toc@uthor}%
\if@runhead
\if!\the\authorrunning!
\value{@inst}=\value{@auth}%
\setcounter{@auth}{1}%
\else
\edef\@author{\the\authorrunning}%
\fi
\global\setbox\authrun=\hbox{\small\unboldmath\@author\unskip}%
\ifdim\wd\authrun>\instindent
\typeout{Names of authors too long for running head. Please supply}%
\typeout{a shorter form with \string\authorrunning\space prior to
\string\maketitle}%
\global\setbox\authrun=\hbox{\small\rm
Authors Suppressed Due to Excessive Length}%
\fi
\xdef\@author{\copy\authrun}%
\markboth{\@author}{\@title}%
\fi
\endgroup
\setcounter{footnote}{\fnnstart}%
\clearheadinfo}
%
\def\@maketitle{\newpage
\markboth{}{}%
\def\lastand{\ifnum\value{@inst}=2\relax
\unskip{} \andname\
\else
\unskip \lastandname\
\fi}%
\def\and{\stepcounter{@auth}\relax
\ifnum\value{@auth}=\value{@inst}%
\lastand
\else
\unskip,
\fi}%
\begin{center}%
\let\newline\\
{\Large \bfseries\boldmath
\pretolerance=10000
\@title \par}\vskip .8cm
\if!\@subtitle!\else {\large \bfseries\boldmath
\vskip -.65cm
\pretolerance=10000
\@subtitle \par}\vskip .8cm\fi
\setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}%
\def\thanks##1{}\@author}%
\global\value{@inst}=\value{@auth}%
\global\value{auco}=\value{@auth}%
\setcounter{@auth}{1}%
{\lineskip .5em
\noindent\ignorespaces
\@author\vskip.35cm}
{\small\institutename}
\end{center}%
}
% definition of the "\spnewtheorem" command.
%
% Usage:
%
% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font}
% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font}
% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font}
%
% New is "cap_font" and "body_font". It stands for
% fontdefinition of the caption and the text itself.
%
% "\spnewtheorem*" gives a theorem without number.
%
% A defined spnewthoerem environment is used as described
% by Lamport.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@thmcountersep{}
\def\@thmcounterend{.}
\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}}
% definition of \spnewtheorem with number
\def\@spnthm#1#2{%
\@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}}
\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}}
\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}\@addtoreset{#1}{#3}%
\expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
\csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}%
\expandafter\xdef\csname #1name\endcsname{#2}%
\global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
\global\@namedef{end#1}{\@endtheorem}}}
\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}%
\expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
\expandafter\xdef\csname #1name\endcsname{#2}%
\global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}%
\global\@namedef{end#1}{\@endtheorem}}}
\def\@spothm#1[#2]#3#4#5{%
\@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}%
{\expandafter\@ifdefinable\csname #1\endcsname
{\newaliascnt{#1}{#2}%
\expandafter\xdef\csname #1name\endcsname{#3}%
\global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
\global\@namedef{end#1}{\@endtheorem}}}}
\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@
\refstepcounter{#1}%
\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}}
\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}%
\ignorespaces}
\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname
the#1\endcsname}{#5}{#3}{#4}\ignorespaces}
\def\@spbegintheorem#1#2#3#4{\trivlist
\item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4}
\def\@spopargbegintheorem#1#2#3#4#5{\trivlist
\item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5}
% definition of \spnewtheorem* without number
\def\@sthm#1#2{\@Ynthm{#1}{#2}}
\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
{\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}%
\expandafter\xdef\csname #1name\endcsname{#2}%
\global\@namedef{end#1}{\@endtheorem}}}
\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@
\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}}
\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces}
\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1}
{#4}{#2}{#3}\ignorespaces}
\def\@Begintheorem#1#2#3{#3\trivlist
\item[\hskip\labelsep{#2#1\@thmcounterend}]}
\def\@Opargbegintheorem#1#2#3#4{#4\trivlist
\item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }}
\if@envcntsect
\def\@thmcountersep{.}
\spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape}
\else
\spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape}
\if@envcntreset
\@addtoreset{theorem}{section}
\else
\@addtoreset{theorem}{chapter}
\fi
\fi
%definition of divers theorem environments
\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily}
\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily}
\if@envcntsame % alle Umgebungen wie Theorem.
\def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}}
\else % alle Umgebungen mit eigenem Zaehler
\if@envcntsect % mit section numeriert
\def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}}
\else % nicht mit section numeriert
\if@envcntreset
\def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
\@addtoreset{#1}{section}}
\else
\def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
\@addtoreset{#1}{chapter}}%
\fi
\fi
\fi
\spn@wtheorem{case}{Case}{\itshape}{\rmfamily}
\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily}
\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape}
\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape}
\spn@wtheorem{example}{Example}{\itshape}{\rmfamily}
\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily}
\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape}
\spn@wtheorem{note}{Note}{\itshape}{\rmfamily}
\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily}
\spn@wtheorem{property}{Property}{\itshape}{\rmfamily}
\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape}
\spn@wtheorem{question}{Question}{\itshape}{\rmfamily}
\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily}
\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily}
\def\@takefromreset#1#2{%
\def\@tempa{#1}%
\let\@tempd\@elt
\def\@elt##1{%
\def\@tempb{##1}%
\ifx\@tempa\@tempb\else
\@addtoreset{##1}{#2}%
\fi}%
\expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname
\expandafter\def\csname cl@#2\endcsname{}%
\@tempc
\let\@elt\@tempd}
\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist
\item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5}
\def\@Opargbegintheorem##1##2##3##4{##4\trivlist
\item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}
}
\renewenvironment{abstract}{%
\list{}{\advance\topsep by0.35cm\relax\small
\leftmargin=1cm
\labelwidth=\z@
\listparindent=\z@
\itemindent\listparindent
\rightmargin\leftmargin}\item[\hskip\labelsep
\bfseries\abstractname]}
{\endlist}
\newdimen\headlineindent % dimension for space between
\headlineindent=1.166cm % number and text of headings.
\def\ps@headings{\let\@mkboth\@gobbletwo
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
\leftmark\hfil}
\def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}%
\llap{\thepage}}
\def\chaptermark##1{}%
\def\sectionmark##1{}%
\def\subsectionmark##1{}}
\def\ps@titlepage{\let\@mkboth\@gobbletwo
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
\hfil}
\def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}%
\llap{\thepage}}
\def\chaptermark##1{}%
\def\sectionmark##1{}%
\def\subsectionmark##1{}}
\if@runhead\ps@headings\else
\ps@empty\fi
\setlength\arraycolsep{1.4\p@}
\setlength\tabcolsep{1.4\p@}
\endinput
%end of file llncs.cls
% This is LLNCS.DEM the demonstration file of
% the LaTeX macro package from Springer-Verlag
% for Lecture Notes in Computer Science,
% version 2.4 for LaTeX2e as of 16. April 2010
%
\documentclass{llncs}
%
\usepackage{makeidx} % allows for indexgeneration
%
\begin{document}
%
\mainmatter % start of the contributions
%
\title{Harnessing Wasted Computing Power for
Scientific Computing}
%
%
\author{S\'andor Guba \and M\'at\'e \H{O}ry \and Imre Szeber\'enyi}
%
\authorrunning{Ivar Ekeland et al.} % abbreviated author list (for running head)
%
%%%% list of authors for the TOC (use if author list has to be modified)
%\tocauthor{Ivar Ekeland, Roger Temam, Jeffrey Dean, David Grove,
%Craig Chambers, Kim B. Bruce, and Elisa Bertino}
%
\institute{Budapest University of Technology and Economics, Hungary,\\
\email{\{guba.sandor,orymate,szebi\}@iit.bme.hu}
}
\maketitle % typeset the title of the contribution
\begin{abstract}
Nowadays more and more general purpose workstations installed in a student
laboratory have built in multi-core CPU and graphics card providing significant
computing power. In most cases the utilization of these resources is low, and
limited to lecture hours. The concept of utility computing plays an important
role in nowadays technological development. As part of utility computing, cloud
computing offers greater flexibility and responsiveness to ICT users at lower
cost.
In  this paper, we introduce a cloud management system which enables the
simultaneous use of both dedicated resources and opportunistic environment. All
the free workstations (powered or not) are automatically added to a resource
pool, and can be used like ordinary cloud resources. Researchers can launch
various virtualized software appliances. Our solution leverages the advantages
of HTCondor and OpenNebula systems.
Modern graphics processing units (GPUs) with many-core architectures have
emerged as general-purpose parallel computing platforms that can dramatically
accelerate  scientific applications used for various simulations. Our business
model harnesses computing power of GPUs as well, using the needed amount of
unused machines. This makes the infrastructure flexible and power efficient.
Our pilot infrastructure consist of a high performance cluster and 28
workstations with dual-core CPUs and dedicated graphics cards. Altogether we
can use 10,752 CUDA cores through the network.
% felére kell rövidíteni kb.
\keywords{education cloud, grid computing, GPGPU}
\end{abstract}
%
\section{Fixed-Period Problems: The Sublinear Case}
%
With this chapter, the preliminaries are over, and we begin the search
for periodic solutions to Hamiltonian systems. All this will be done in
the convex case; that is, we shall study the boundary-value problem
\begin{eqnarray*}
\dot{x}&=&JH' (t,x)\\
x(0) &=& x(T)
\end{eqnarray*}
with $H(t,\cdot)$ a convex function of $x$, going to $+\infty$ when
$\left\|x\right\| \to \infty$.
%
\subsection{Autonomous Systems}
%
In this section, we will consider the case when the Hamiltonian $H(x)$
is autonomous. For the sake of simplicity, we shall also assume that it
is $C^{1}$.
We shall first consider the question of nontriviality, within the
general framework of
$\left(A_{\infty},B_{\infty}\right)$-subquadratic Hamiltonians. In
the second subsection, we shall look into the special case when $H$ is
$\left(0,b_{\infty}\right)$-subquadratic,
and we shall try to derive additional information.
%
\subsubsection{The General Case: Nontriviality.}
%
We assume that $H$ is
$\left(A_{\infty},B_{\infty}\right)$-sub\-qua\-dra\-tic at infinity,
for some constant symmetric matrices $A_{\infty}$ and $B_{\infty}$,
with $B_{\infty}-A_{\infty}$ positive definite. Set:
\begin{eqnarray}
\gamma :&=&{\rm smallest\ eigenvalue\ of}\ \ B_{\infty} - A_{\infty} \\
\lambda : &=& {\rm largest\ negative\ eigenvalue\ of}\ \
J \frac{d}{dt} +A_{\infty}\ .
\end{eqnarray}
Theorem~\ref{ghou:pre} tells us that if $\lambda +\gamma < 0$, the
boundary-value problem:
\begin{equation}
\begin{array}{rcl}
\dot{x}&=&JH' (x)\\
x(0)&=&x (T)
\end{array}
\end{equation}
has at least one solution
$\overline{x}$, which is found by minimizing the dual
action functional:
\begin{equation}
\psi (u) = \int_{o}^{T} \left[\frac{1}{2}
\left(\Lambda_{o}^{-1} u,u\right) + N^{\ast} (-u)\right] dt
\end{equation}
on the range of $\Lambda$, which is a subspace $R (\Lambda)_{L}^{2}$
with finite codimension. Here
\begin{equation}
N(x) := H(x) - \frac{1}{2} \left(A_{\infty} x,x\right)
\end{equation}
is a convex function, and
\begin{equation}
N(x) \le \frac{1}{2}
\left(\left(B_{\infty} - A_{\infty}\right) x,x\right)
+ c\ \ \ \forall x\ .
\end{equation}
%
\begin{proposition}
Assume $H'(0)=0$ and $ H(0)=0$. Set:
\begin{equation}
\delta := \liminf_{x\to 0} 2 N (x) \left\|x\right\|^{-2}\ .
\label{eq:one}
\end{equation}
If $\gamma < - \lambda < \delta$,
the solution $\overline{u}$ is non-zero:
\begin{equation}
\overline{x} (t) \ne 0\ \ \ \forall t\ .
\end{equation}
\end{proposition}
%
\begin{proof}
Condition (\ref{eq:one}) means that, for every
$\delta ' > \delta$, there is some $\varepsilon > 0$ such that
\begin{equation}
\left\|x\right\| \le \varepsilon \Rightarrow N (x) \le
\frac{\delta '}{2} \left\|x\right\|^{2}\ .
\end{equation}
It is an exercise in convex analysis, into which we shall not go, to
show that this implies that there is an $\eta > 0$ such that
\begin{equation}
f\left\|x\right\| \le \eta
\Rightarrow N^{\ast} (y) \le \frac{1}{2\delta '}
\left\|y\right\|^{2}\ .
\label{eq:two}
\end{equation}
\begin{figure}
\vspace{2.5cm}
\caption{This is the caption of the figure displaying a white eagle and
a white horse on a snow field}
\end{figure}
Since $u_{1}$ is a smooth function, we will have
$\left\|hu_{1}\right\|_\infty \le \eta$
for $h$ small enough, and inequality (\ref{eq:two}) will hold,
yielding thereby:
\begin{equation}
\psi (hu_{1}) \le \frac{h^{2}}{2}
\frac{1}{\lambda} \left\|u_{1} \right\|_{2}^{2} + \frac{h^{2}}{2}
\frac{1}{\delta '} \left\|u_{1}\right\|^{2}\ .
\end{equation}
If we choose $\delta '$ close enough to $\delta$, the quantity
$\left(\frac{1}{\lambda} + \frac{1}{\delta '}\right)$
will be negative, and we end up with
\begin{equation}
\psi (hu_{1}) < 0\ \ \ \ \ {\rm for}\ \ h\ne 0\ \ {\rm small}\ .
\end{equation}
On the other hand, we check directly that $\psi (0) = 0$. This shows
that 0 cannot be a minimizer of $\psi$, not even a local one.
So $\overline{u} \ne 0$ and
$\overline{u} \ne \Lambda_{o}^{-1} (0) = 0$. \qed
\end{proof}
%
\begin{corollary}
Assume $H$ is $C^{2}$ and
$\left(a_{\infty},b_{\infty}\right)$-subquadratic at infinity. Let
$\xi_{1},\allowbreak\dots,\allowbreak\xi_{N}$ be the
equilibria, that is, the solutions of $H' (\xi ) = 0$.
Denote by $\omega_{k}$
the smallest eigenvalue of $H'' \left(\xi_{k}\right)$, and set:
\begin{equation}
\omega : = {\rm Min\,} \left\{\omega_{1},\dots,\omega_{k}\right\}\ .
\end{equation}
If:
\begin{equation}
\frac{T}{2\pi} b_{\infty} <
- E \left[- \frac{T}{2\pi}a_{\infty}\right] <
\frac{T}{2\pi}\omega
\label{eq:three}
\end{equation}
then minimization of $\psi$ yields a non-constant $T$-periodic solution
$\overline{x}$.
\end{corollary}
%
We recall once more that by the integer part $E [\alpha ]$ of
$\alpha \in \bbbr$, we mean the $a\in \bbbz$
such that $a< \alpha \le a+1$. For instance,
if we take $a_{\infty} = 0$, Corollary 2 tells
us that $\overline{x}$ exists and is
non-constant provided that:
\begin{equation}
\frac{T}{2\pi} b_{\infty} < 1 < \frac{T}{2\pi}
\end{equation}
or
\begin{equation}
T\in \left(\frac{2\pi}{\omega},\frac{2\pi}{b_{\infty}}\right)\ .
\label{eq:four}
\end{equation}
%
\begin{proof}
The spectrum of $\Lambda$ is $\frac{2\pi}{T} \bbbz +a_{\infty}$. The
largest negative eigenvalue $\lambda$ is given by
$\frac{2\pi}{T}k_{o} +a_{\infty}$,
where
\begin{equation}
\frac{2\pi}{T}k_{o} + a_{\infty} < 0
\le \frac{2\pi}{T} (k_{o} +1) + a_{\infty}\ .
\end{equation}
Hence:
\begin{equation}
k_{o} = E \left[- \frac{T}{2\pi} a_{\infty}\right] \ .
\end{equation}
The condition $\gamma < -\lambda < \delta$ now becomes:
\begin{equation}
b_{\infty} - a_{\infty} <
- \frac{2\pi}{T} k_{o} -a_{\infty} < \omega -a_{\infty}
\end{equation}
which is precisely condition (\ref{eq:three}).\qed
\end{proof}
%
\begin{lemma}
Assume that $H$ is $C^{2}$ on $\bbbr^{2n} \setminus \{ 0\}$ and
that $H'' (x)$ is non-de\-gen\-er\-ate for any $x\ne 0$. Then any local
minimizer $\widetilde{x}$ of $\psi$ has minimal period $T$.
\end{lemma}
%
\begin{proof}
We know that $\widetilde{x}$, or
$\widetilde{x} + \xi$ for some constant $\xi
\in \bbbr^{2n}$, is a $T$-periodic solution of the Hamiltonian system:
\begin{equation}
\dot{x} = JH' (x)\ .
\end{equation}
There is no loss of generality in taking $\xi = 0$. So
$\psi (x) \ge \psi (\widetilde{x} )$
for all $\widetilde{x}$ in some neighbourhood of $x$ in
$W^{1,2} \left(\bbbr / T\bbbz ; \bbbr^{2n}\right)$.
But this index is precisely the index
$i_{T} (\widetilde{x} )$ of the $T$-periodic
solution $\widetilde{x}$ over the interval
$(0,T)$, as defined in Sect.~2.6. So
\begin{equation}
i_{T} (\widetilde{x} ) = 0\ .
\label{eq:five}
\end{equation}
Now if $\widetilde{x}$ has a lower period, $T/k$ say,
we would have, by Corollary 31:
\begin{equation}
i_{T} (\widetilde{x} ) =
i_{kT/k}(\widetilde{x} ) \ge
ki_{T/k} (\widetilde{x} ) + k-1 \ge k-1 \ge 1\ .
\end{equation}
This would contradict (\ref{eq:five}), and thus cannot happen.\qed
\end{proof}
%
\paragraph{Notes and Comments.}
The results in this section are a
refined version of \cite{clar:eke};
the minimality result of Proposition
14 was the first of its kind.
To understand the nontriviality conditions, such as the one in formula
(\ref{eq:four}), one may think of a one-parameter family
$x_{T}$, $T\in \left(2\pi\omega^{-1}, 2\pi b_{\infty}^{-1}\right)$
of periodic solutions, $x_{T} (0) = x_{T} (T)$,
with $x_{T}$ going away to infinity when $T\to 2\pi \omega^{-1}$,
which is the period of the linearized system at 0.
\begin{table}
\caption{This is the example table taken out of {\it The
\TeX{}book,} p.\,246}
\begin{center}
\begin{tabular}{r@{\quad}rl}
\hline
\multicolumn{1}{l}{\rule{0pt}{12pt}
Year}&\multicolumn{2}{l}{World population}\\[2pt]
\hline\rule{0pt}{12pt}
8000 B.C. & 5,000,000& \\
50 A.D. & 200,000,000& \\
1650 A.D. & 500,000,000& \\
1945 A.D. & 2,300,000,000& \\
1980 A.D. & 4,400,000,000& \\[2pt]
\hline
\end{tabular}
\end{center}
\end{table}
%
\begin{theorem} [Ghoussoub-Preiss]\label{ghou:pre}
Assume $H(t,x)$ is
$(0,\varepsilon )$-subquadratic at
infinity for all $\varepsilon > 0$, and $T$-periodic in $t$
\begin{equation}
H (t,\cdot )\ \ \ \ \ {\rm is\ convex}\ \ \forall t
\end{equation}
\begin{equation}
H (\cdot ,x)\ \ \ \ \ {\rm is}\ \ T{\rm -periodic}\ \ \forall x
\end{equation}
\begin{equation}
H (t,x)\ge n\left(\left\|x\right\|\right)\ \ \ \ \
{\rm with}\ \ n (s)s^{-1}\to \infty\ \ {\rm as}\ \ s\to \infty
\end{equation}
\begin{equation}
\forall \varepsilon > 0\ ,\ \ \ \exists c\ :\
H(t,x) \le \frac{\varepsilon}{2}\left\|x\right\|^{2} + c\ .
\end{equation}
Assume also that $H$ is $C^{2}$, and $H'' (t,x)$ is positive definite
everywhere. Then there is a sequence $x_{k}$, $k\in \bbbn$, of
$kT$-periodic solutions of the system
\begin{equation}
\dot{x} = JH' (t,x)
\end{equation}
such that, for every $k\in \bbbn$, there is some $p_{o}\in\bbbn$ with:
\begin{equation}
p\ge p_{o}\Rightarrow x_{pk} \ne x_{k}\ .
\end{equation}
\qed
\end{theorem}
%
\begin{example} [{{\rm External forcing}}]
Consider the system:
\begin{equation}
\dot{x} = JH' (x) + f(t)
\end{equation}
where the Hamiltonian $H$ is
$\left(0,b_{\infty}\right)$-subquadratic, and the
forcing term is a distribution on the circle:
\begin{equation}
f = \frac{d}{dt} F + f_{o}\ \ \ \ \
{\rm with}\ \ F\in L^{2} \left(\bbbr / T\bbbz; \bbbr^{2n}\right)\ ,
\end{equation}
where $f_{o} : = T^{-1}\int_{o}^{T} f (t) dt$. For instance,
\begin{equation}
f (t) = \sum_{k\in \bbbn} \delta_{k} \xi\ ,
\end{equation}
where $\delta_{k}$ is the Dirac mass at $t= k$ and
$\xi \in \bbbr^{2n}$ is a
constant, fits the prescription. This means that the system
$\dot{x} = JH' (x)$ is being excited by a
series of identical shocks at interval $T$.
\end{example}
%
\begin{definition}
Let $A_{\infty} (t)$ and $B_{\infty} (t)$ be symmetric
operators in $\bbbr^{2n}$, depending continuously on
$t\in [0,T]$, such that
$A_{\infty} (t) \le B_{\infty} (t)$ for all $t$.
A Borelian function
$H: [0,T]\times \bbbr^{2n} \to \bbbr$
is called
$\left(A_{\infty} ,B_{\infty}\right)$-{\it subquadratic at infinity}
if there exists a function $N(t,x)$ such that:
\begin{equation}
H (t,x) = \frac{1}{2} \left(A_{\infty} (t) x,x\right) + N(t,x)
\end{equation}
\begin{equation}
\forall t\ ,\ \ \ N(t,x)\ \ \ \ \
{\rm is\ convex\ with\ respect\ to}\ \ x
\end{equation}
\begin{equation}
N(t,x) \ge n\left(\left\|x\right\|\right)\ \ \ \ \
{\rm with}\ \ n(s)s^{-1}\to +\infty\ \ {\rm as}\ \ s\to +\infty
\end{equation}
\begin{equation}
\exists c\in \bbbr\ :\ \ \ H (t,x) \le
\frac{1}{2} \left(B_{\infty} (t) x,x\right) + c\ \ \ \forall x\ .
\end{equation}
If $A_{\infty} (t) = a_{\infty} I$ and
$B_{\infty} (t) = b_{\infty} I$, with
$a_{\infty} \le b_{\infty} \in \bbbr$,
we shall say that $H$ is
$\left(a_{\infty},b_{\infty}\right)$-subquadratic
at infinity. As an example, the function
$\left\|x\right\|^{\alpha}$, with
$1\le \alpha < 2$, is $(0,\varepsilon )$-subquadratic at infinity
for every $\varepsilon > 0$. Similarly, the Hamiltonian
\begin{equation}
H (t,x) = \frac{1}{2} k \left\|k\right\|^{2} +\left\|x\right\|^{\alpha}
\end{equation}
is $(k,k+\varepsilon )$-subquadratic for every $\varepsilon > 0$.
Note that, if $k<0$, it is not convex.
\end{definition}
%
\paragraph{Notes and Comments.}
The first results on subharmonics were
obtained by Rabinowitz in \cite{rab}, who showed the existence of
infinitely many subharmonics both in the subquadratic and superquadratic
case, with suitable growth conditions on $H'$. Again the duality
approach enabled Clarke and Ekeland in \cite{clar:eke:2} to treat the
same problem in the convex-subquadratic case, with growth conditions on
$H$ only.
Recently, Michalek and Tarantello (see \cite{mich:tar} and \cite{tar})
have obtained lower bound on the number of subharmonics of period $kT$,
based on symmetry considerations and on pinching estimates, as in
Sect.~5.2 of this article.
%
% ---- Bibliography ----
%
\begin{thebibliography}{5}
%
\bibitem {clar:eke}
Clarke, F., Ekeland, I.:
Nonlinear oscillations and
boundary-value problems for Hamiltonian systems.
Arch. Rat. Mech. Anal. 78, 315--333 (1982)
\bibitem {clar:eke:2}
Clarke, F., Ekeland, I.:
Solutions p\'{e}riodiques, du
p\'{e}riode donn\'{e}e, des \'{e}quations hamiltoniennes.
Note CRAS Paris 287, 1013--1015 (1978)
\bibitem {mich:tar}
Michalek, R., Tarantello, G.:
Subharmonic solutions with prescribed minimal
period for nonautonomous Hamiltonian systems.
J. Diff. Eq. 72, 28--55 (1988)
\bibitem {tar}
Tarantello, G.:
Subharmonic solutions for Hamiltonian
systems via a $\bbbz_{p}$ pseudoindex theory.
Annali di Matematica Pura (to appear)
\bibitem {rab}
Rabinowitz, P.:
On subharmonic solutions of a Hamiltonian system.
Comm. Pure Appl. Math. 33, 609--633 (1980)
\end{thebibliography}
\end{document}
% clmomu01.ind
%-----------------------------------------------------------------------
% CLMoMu01 1.0: LaTeX style files for books
% Sample index file for User's guide
% (c) Springer-Verlag HD
%-----------------------------------------------------------------------
\begin{theindex}
\item Absorption\idxquad 327
\item Absorption of radiation \idxquad 289--292,\, 299,\,300
\item Actinides \idxquad 244
\item Aharonov-Bohm effect\idxquad 142--146
\item Angular momentum\idxquad 101--112
\subitem algebraic treatment\idxquad 391--396
\item Angular momentum addition\idxquad 185--193
\item Angular momentum commutation relations\idxquad 101
\item Angular momentum quantization\idxquad 9--10,\,104--106
\item Angular momentum states\idxquad 107,\,321,\,391--396
\item Antiquark\idxquad 83
\item $\alpha$-rays\idxquad 101--103
\item Atomic theory\idxquad 8--10,\,219--249,\,327
\item Average value\newline ({\it see also\/} Expectation value)
15--16,\,25,\,34,\,37,\,357
\indexspace
\item Baker-Hausdorff formula\idxquad 23
\item Balmer formula\idxquad 8
\item Balmer series\idxquad 125
\item Baryon\idxquad 220,\,224
\item Basis\idxquad 98
\item Basis system\idxquad 164,\,376
\item Bell inequality\idxquad 379--381,\,382
\item Bessel functions\idxquad 201,\,313,\,337
\subitem spherical\idxquad 304--306,\, 309,\, 313--314,\,322
\item Bound state\idxquad 73--74,\,78--79,\,116--118,\,202,\, 267,\,
273,\,306,\,348,\,351
\item Boundary conditions\idxquad 59,\, 70
\item Bra\idxquad 159
\item Breit-Wigner formula\idxquad 80,\,84,\,332
\item Brillouin-Wigner perturbation theory\idxquad 203
\indexspace
\item Cathode rays\idxquad 8
\item Causality\idxquad 357--359
\item Center-of-mass frame\idxquad 232,\,274,\,338
\item Central potential\idxquad 113--135,\,303--314
\item Centrifugal potential\idxquad 115--116,\,323
\item Characteristic function\idxquad 33
\item Clebsch-Gordan coefficients\idxquad 191--193
\item Cold emission\idxquad 88
\item Combination principle, Ritz's\idxquad 124
\item Commutation relations\idxquad 27,\,44,\,353,\,391
\item Commutator\idxquad 21--22,\,27,\,44,\,344
\item Compatibility of measurements\idxquad 99
\item Complete orthonormal set\idxquad 31,\,40,\,160,\,360
\item Complete orthonormal system, {\it see}\newline
Complete orthonormal set
\item Complete set of observables, {\it see\/} Complete
set of operators
\indexspace
\item Eigenfunction\idxquad 34,\,46,\,344--346
\subitem radial\idxquad 321
\subsubitem calculation\idxquad 322--324
\item EPR argument\idxquad 377--378
\item Exchange term\idxquad 228,\,231,\,237,\,241,\,268,\,272
\indexspace
\item $f$-sum rule\idxquad 302
\item Fermi energy\idxquad 223
\indexspace
\item H$^+_2$ molecule\idxquad 26
\item Half-life\idxquad 65
\item Holzwarth energies\idxquad 68
\end{theindex}
from one.models import *
from django_extensions.management.jobs import QuarterHourlyJob
from django.core.cache import cache
import json
class Job(QuarterHourlyJob):
help = "Update statistics from OpenNebula."
def execute(self):
stat = json.loads(subprocess.check_output(['/opt/webadmin/cloud/miscellaneous/stat/stat_wrap.sh']))
cache.set('cloud_stat', stat)
...@@ -7,8 +7,8 @@ msgid "" ...@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-07 18:16+0100\n" "POT-Creation-Date: 2013-03-22 10:43+0100\n"
"PO-Revision-Date: 2013-03-07 17:40+0100\n" "PO-Revision-Date: 2013-03-22 10:46+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Hungarian <cloud@ik.bme.hu>\n" "Language-Team: Hungarian <cloud@ik.bme.hu>\n"
"Language: hu\n" "Language: hu\n"
...@@ -18,7 +18,7 @@ msgstr "" ...@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Lokalize 1.4\n" "X-Generator: Lokalize 1.4\n"
#: admin.py:11 models.py:318 models.py:365 #: admin.py:11 models.py:319 models.py:366
msgid "owner" msgid "owner"
msgstr "tulajdonos" msgstr "tulajdonos"
...@@ -47,64 +47,64 @@ msgstr "VM felfüggesztése" ...@@ -47,64 +47,64 @@ msgstr "VM felfüggesztése"
msgid "Resume VM" msgid "Resume VM"
msgstr "VM folytatása" msgstr "VM folytatása"
#: models.py:36 #: models.py:37
msgid "user" msgid "user"
msgstr "felhasználó" msgstr "felhasználó"
#: models.py:39 #: models.py:40
msgid "Samba password" msgid "Samba password"
msgstr "Samba jelszó" msgstr "Samba jelszó"
#: models.py:40 #: models.py:41
msgid "Generated password for accessing store from Windows." msgid "Generated password for accessing store from Windows."
msgstr "Generált jelszó az adattár eléréséhez Windows alól." msgstr "Generált jelszó az adattár eléréséhez Windows alól."
#: models.py:42 #: models.py:43
msgid "SSH key (public)" msgid "SSH key (public)"
msgstr "SSH kulcs (nyilvános)" msgstr "SSH kulcs (nyilvános)"
#: models.py:44 #: models.py:45
msgid "Generated SSH public key for accessing store from Linux." msgid "Generated SSH public key for accessing store from Linux."
msgstr "Generált SSH publikus kulcs az adattár eléréséhez Linux alól." msgstr "Generált SSH publikus kulcs az adattár eléréséhez Linux alól."
#: models.py:46 #: models.py:47
msgid "SSH key (private)" msgid "SSH key (private)"
msgstr "SSH kulcs (magán)" msgstr "SSH kulcs (magán)"
#: models.py:47 #: models.py:48
msgid "Generated SSH private key for accessing store from Linux." msgid "Generated SSH private key for accessing store from Linux."
msgstr "Generált SSH privát kulcs az adattár eléréséhez Linux alól." msgstr "Generált SSH privát kulcs az adattár eléréséhez Linux alól."
#: models.py:49 #: models.py:50
msgid "share quota" msgid "share quota"
msgstr "megosztó kvóta" msgstr "megosztó kvóta"
#: models.py:51 #: models.py:52
msgid "instance quota" msgid "instance quota"
msgstr "példány kvóta" msgstr "példány kvóta"
#: models.py:53 #: models.py:54
msgid "disk quota" msgid "disk quota"
msgstr "lemezkvóta" msgstr "lemezkvóta"
#: models.py:54 #: models.py:55
msgid "Disk quota in mebibytes." msgid "Disk quota in mebibytes."
msgstr "Lemezkvóta mebibyte-okban." msgstr "Lemezkvóta mebibyte-okban."
#: models.py:128 #: models.py:129
#, python-format #, python-format
msgid "OpenSSH key type %s is not supported." msgid "OpenSSH key type %s is not supported."
msgstr "A következő OpenSSH kulcstípus nincs támogatva: %s." msgstr "A következő OpenSSH kulcstípus nincs támogatva: %s."
#: models.py:138 #: models.py:139
msgid "Invalid OpenSSH public key." msgid "Invalid OpenSSH public key."
msgstr "Érvénytelen OpenSSH nyilvános kulcs." msgstr "Érvénytelen OpenSSH nyilvános kulcs."
#: models.py:143 #: models.py:144
msgid "SSH key" msgid "SSH key"
msgstr "SSH kulcs" msgstr "SSH kulcs"
#: models.py:144 #: models.py:145
msgid "" msgid ""
"<a href=\"/info/ssh/\">SSH public key in OpenSSH format</a> used for shell " "<a href=\"/info/ssh/\">SSH public key in OpenSSH format</a> used for shell "
"and store login (2048+ bit RSA preferred). Example: <code>ssh-rsa AAAAB..." "and store login (2048+ bit RSA preferred). Example: <code>ssh-rsa AAAAB..."
...@@ -114,294 +114,294 @@ msgstr "" ...@@ -114,294 +114,294 @@ msgstr ""
"bejelentkezéshez – ajánlás: 2048+ bites RSA. Példa: <code><code>ssh-rsa\n" "bejelentkezéshez – ajánlás: 2048+ bites RSA. Példa: <code><code>ssh-rsa\n"
"AAAAB...QtQ== jozsi</a>." "AAAAB...QtQ== jozsi</a>."
#: models.py:154 #: models.py:155
msgid "unnamed" msgid "unnamed"
msgstr "névtelen" msgstr "névtelen"
#: models.py:158 #: models.py:159
msgid "init" msgid "init"
msgstr "új" msgstr "új"
#: models.py:158 #: models.py:159
msgid "perparing" msgid "perparing"
msgstr "előkészítés" msgstr "előkészítés"
#: models.py:159 models.py:304 #: models.py:160 models.py:305
msgid "saving" msgid "saving"
msgstr "mentés" msgstr "mentés"
#: models.py:159 models.py:305 #: models.py:160 models.py:306
msgid "ready" msgid "ready"
msgstr "kész" msgstr "kész"
#: models.py:161 #: models.py:162
msgid "lab" msgid "lab"
msgstr "labor" msgstr "labor"
#: models.py:163 #: models.py:164
msgid "For lab or homework with short lifetime." msgid "For lab or homework with short lifetime."
msgstr "Géptermi vagy otthoni feladatokhoz (rövid élettartam)." msgstr "Géptermi vagy otthoni feladatokhoz (rövid élettartam)."
#: models.py:164 #: models.py:165
msgid "project" msgid "project"
msgstr "projekt" msgstr "projekt"
#: models.py:166 #: models.py:167
msgid "For project work." msgid "For project work."
msgstr "Projektmunkához." msgstr "Projektmunkához."
#: models.py:167 #: models.py:168
msgid "server" msgid "server"
msgstr "szerver" msgstr "szerver"
#: models.py:169 #: models.py:170
msgid "For long-term server use." msgid "For long-term server use."
msgstr "Hosszú távú, szerver-felhasználáshoz." msgstr "Hosszú távú, szerver-felhasználáshoz."
#: models.py:175 models.py:218 models.py:253 models.py:292 models.py:309 #: models.py:176 models.py:219 models.py:254 models.py:293 models.py:310
#: models.py:360 #: models.py:361
msgid "name" msgid "name"
msgstr "név" msgstr "név"
#: models.py:176 models.py:326 #: models.py:177 models.py:327
msgid "description" msgid "description"
msgstr "leírás" msgstr "leírás"
#: models.py:180 models.py:321 models.py:368 #: models.py:181 models.py:322 models.py:369
msgid "created at" msgid "created at"
msgstr "létrehozás ideje" msgstr "létrehozás ideje"
#: models.py:182 #: models.py:183
msgid "instance limit" msgid "instance limit"
msgstr "példánykorlát" msgstr "példánykorlát"
#: models.py:183 #: models.py:184
msgid "Maximal count of instances launchable for this share." msgid "Maximal count of instances launchable for this share."
msgstr "A megosztás alapján futtatható példányok maximális száma." msgstr "A megosztás alapján futtatható példányok maximális száma."
#: models.py:185 #: models.py:186
msgid "per user limit" msgid "per user limit"
msgstr "felhasználónkénti korlát" msgstr "felhasználónkénti korlát"
#: models.py:186 #: models.py:187
msgid "Maximal count of instances launchable by a single user." msgid "Maximal count of instances launchable by a single user."
msgstr "Egy felhasználó által indítható példányok száma." msgstr "Egy felhasználó által indítható példányok száma."
#: models.py:254 #: models.py:255
msgid "NAT" msgid "NAT"
msgstr "NAT" msgstr "NAT"
#: models.py:255 #: models.py:256
msgid "If network address translation is done." msgid "If network address translation is done."
msgstr "Hálózati címfordítás történik-e." msgstr "Hálózati címfordítás történik-e."
#: models.py:256 models.py:324 #: models.py:257 models.py:325
msgid "public" msgid "public"
msgstr "publikus" msgstr "publikus"
#: models.py:257 #: models.py:258
msgid "If internet gateway is available." msgid "If internet gateway is available."
msgstr "Van-e elérheti internetes útválasztás." msgstr "Van-e elérheti internetes útválasztás."
#: models.py:293 #: models.py:294
msgid "CPU cores." msgid "CPU cores."
msgstr "CPU magok száma." msgstr "CPU magok száma."
#: models.py:294 #: models.py:295
msgid "Mebibytes of memory." msgid "Mebibytes of memory."
msgstr "Memória mérete mebibyte-ban." msgstr "Memória mérete mebibyte-ban."
#: models.py:295 #: models.py:296
msgid "credits" msgid "credits"
msgstr "kredit" msgstr "kredit"
#: models.py:296 #: models.py:297
msgid "Price of instance." msgid "Price of instance."
msgstr "Példány értéke." msgstr "Példány értéke."
#: models.py:304 #: models.py:305
msgid "new" msgid "new"
msgstr "új" msgstr "új"
#: models.py:312 #: models.py:313
msgid "access method" msgid "access method"
msgstr "elérési mód" msgstr "elérési mód"
#: models.py:313 #: models.py:314
msgid "disk" msgid "disk"
msgstr "lemez" msgstr "lemez"
#: models.py:315 #: models.py:316
msgid "instance type" msgid "instance type"
msgstr "példánytípus" msgstr "példánytípus"
#: models.py:316 #: models.py:317
msgid "network" msgid "network"
msgstr "hálózat" msgstr "hálózat"
#: models.py:325 #: models.py:326
msgid "If other users can derive templates of this one." msgid "If other users can derive templates of this one."
msgstr "Más felhasználók készíthetnek-e ez alapján új sablonokat." msgstr "Más felhasználók készíthetnek-e ez alapján új sablonokat."
#: models.py:327 #: models.py:328
msgid "operating system" msgid "operating system"
msgstr "operációs rendszer" msgstr "operációs rendszer"
#: models.py:328 #: models.py:329
#, python-format #, python-format
msgid "Name of operating system in format like \"%s\"." msgid "Name of operating system in format like \"%s\"."
msgstr "Operációs rendszer neve a következő formában: „%s”." msgstr "Operációs rendszer neve a következő formában: „%s”."
#: models.py:332 models.py:363 #: models.py:333 models.py:364
msgid "template" msgid "template"
msgstr "sablon" msgstr "sablon"
#: models.py:333 #: models.py:334
msgid "templates" msgid "templates"
msgstr "sablonok" msgstr "sablonok"
#: models.py:362 #: models.py:363
msgid "IP address" msgid "IP address"
msgstr "IP cím" msgstr "IP cím"
#: models.py:370 #: models.py:371
msgid "deployable" msgid "deployable"
msgstr "beküldhető" msgstr "beküldhető"
#: models.py:371 #: models.py:372
msgid "pending" msgid "pending"
msgstr "várakozó" msgstr "várakozó"
#: models.py:372 #: models.py:373
msgid "done" msgid "done"
msgstr "kész" msgstr "kész"
#: models.py:373 #: models.py:374
msgid "active" msgid "active"
msgstr "aktív" msgstr "aktív"
#: models.py:374 #: models.py:375
msgid "unknown" msgid "unknown"
msgstr "ismeretlen" msgstr "ismeretlen"
#: models.py:375 #: models.py:376
msgid "suspended" msgid "suspended"
msgstr "felfüggesztett" msgstr "felfüggesztett"
#: models.py:376 #: models.py:377
msgid "failed" msgid "failed"
msgstr "hiba" msgstr "hiba"
#: models.py:379 #: models.py:380
msgid "active since" msgid "active since"
msgstr "aktívvá válás ideje" msgstr "aktívvá válás ideje"
#: models.py:380 #: models.py:381
msgid "Time stamp of successful boot report." msgid "Time stamp of successful boot report."
msgstr "A sikeres indulás jelentésének időpontja." msgstr "A sikeres indulás jelentésének időpontja."
#: models.py:382 #: models.py:383
msgid "host in firewall" msgid "host in firewall"
msgstr "gép a tűzfalban" msgstr "gép a tűzfalban"
#: models.py:383 #: models.py:384
msgid "password" msgid "password"
msgstr "jelszó" msgstr "jelszó"
#: models.py:384 #: models.py:385
msgid "Original password of instance" msgid "Original password of instance"
msgstr "A példány eredeti jelszava." msgstr "A példány eredeti jelszava."
#: models.py:386 #: models.py:387
msgid "OpenNebula ID" msgid "OpenNebula ID"
msgstr "OpenNebula ID" msgstr "OpenNebula ID"
#: models.py:388 #: models.py:389
msgid "share" msgid "share"
msgstr "megosztás" msgstr "megosztás"
#: models.py:390 templates/box/vm/entry.html:58 #: models.py:391 templates/box/vm/entry.html:58
msgid "time of suspend" msgid "time of suspend"
msgstr "felfüggesztés ideje" msgstr "felfüggesztés ideje"
#: models.py:392 templates/box/vm/entry.html:68 #: models.py:393 templates/box/vm/entry.html:68
msgid "time of delete" msgid "time of delete"
msgstr "törlés ideje" msgstr "törlés ideje"
#: models.py:396 #: models.py:397
msgid "instance" msgid "instance"
msgstr "példány" msgstr "példány"
#: models.py:397 #: models.py:398
msgid "instances" msgid "instances"
msgstr "példányok" msgstr "példányok"
#: models.py:416 #: models.py:417
msgid "None" msgid "None"
msgstr "Nincs" msgstr "Nincs"
#: views.py:84 #: views.py:82
msgid "Invalid template ID." msgid "Invalid template ID."
msgstr "Nincs ilyen sablon." msgstr "Nincs ilyen sablon."
#: views.py:87 #: views.py:85
msgid "There are running instances of this template." msgid "There are running instances of this template."
msgstr "A sablonnak még vannak futó példányai." msgstr "A sablonnak még vannak futó példányai."
#: views.py:89 #: views.py:87
msgid "Template is still shared." msgid "Template is still shared."
msgstr "A sablon még meg van osztva." msgstr "A sablon még meg van osztva."
#: views.py:91 #: views.py:89
msgid "You don't have permission to delete this template." msgid "You don't have permission to delete this template."
msgstr "Nincs joga törölni a sablont." msgstr "Nincs joga törölni a sablont."
#: views.py:94 #: views.py:92
msgid "Template successfully deleted." msgid "Template successfully deleted."
msgstr "A sablon törlése sikeres." msgstr "A sablon törlése sikeres."
#: views.py:96 #: views.py:94
msgid "Unexpected error happened." msgid "Unexpected error happened."
msgstr "Váratlan hiba történt." msgstr "Váratlan hiba történt."
#: views.py:114 #: views.py:112
msgid "Could not get Virtual Machine credentials." msgid "Could not get Virtual Machine credentials."
msgstr "Nem találhatóak a virutális gép adatai." msgstr "Nem találhatóak a virutális gép adatai."
#: views.py:115 views.py:531 #: views.py:113 views.py:532
msgid "Failed to power off virtual machine." msgid "Failed to power off virtual machine."
msgstr "A virtuális gép kikapcsolása sikertelen." msgstr "A virtuális gép kikapcsolása sikertelen."
#: views.py:164 views.py:211 #: views.py:162 views.py:209
msgid "You do not have any free share quota." msgid "You do not have any free share quota."
msgstr "Nincs szabad kvótája." msgstr "Nincs szabad kvótája."
#: views.py:198 views.py:232 #: views.py:196 views.py:230
msgid "You do not have enough free share quota." msgid "You do not have enough free share quota."
msgstr "Nincs elég szabad kvótája." msgstr "Nincs elég szabad kvótája."
#: views.py:203 #: views.py:201
#, python-format #, python-format
msgid "Successfully shared %s." msgid "Successfully shared %s."
msgstr "„%s” megosztása sikeres." msgstr "„%s” megosztása sikeres."
#: views.py:241 #: views.py:239
#, python-format #, python-format
msgid "Successfully edited share %s." msgid "Successfully edited share %s."
msgstr "„%s” megosztás szerkesztése sikeres." msgstr "„%s” megosztás szerkesztése sikeres."
#: views.py:253 #: views.py:251
msgid "Template is being saved..." msgid "Template is being saved..."
msgstr "A sablon mentése folyamatban van…" msgstr "A sablon mentése folyamatban van…"
#: views.py:284 #: views.py:282
msgid "" msgid ""
"You do not have any free quota. You can not launch this until you stop an " "You do not have any free quota. You can not launch this until you stop an "
"other instance." "other instance."
msgstr "" msgstr ""
"Nincs szabad kvótája. Addig nem tud gépet indítani, amíg le nem állít egyet." "Nincs szabad kvótája. Addig nem tud gépet indítani, amíg le nem állít egyet."
#: views.py:288 #: views.py:286
msgid "" msgid ""
"The share does not have any free quota. You can not launch this until " "The share does not have any free quota. You can not launch this until "
"someone stops an instance." "someone stops an instance."
...@@ -409,7 +409,7 @@ msgstr "" ...@@ -409,7 +409,7 @@ msgstr ""
"Ennek a megosztásnak elfogyott a kvótája. Nem tudja addig elindítani, amíg\n" "Ennek a megosztásnak elfogyott a kvótája. Nem tudja addig elindítani, amíg\n"
"valaki le nem állít egy példányt." "valaki le nem állít egy példányt."
#: views.py:291 #: views.py:289
msgid "" msgid ""
"You do not have any free quota for this share. You can not launch this until " "You do not have any free quota for this share. You can not launch this until "
"you stop an other instance." "you stop an other instance."
...@@ -417,15 +417,15 @@ msgstr "" ...@@ -417,15 +417,15 @@ msgstr ""
"Nincs szabad kvótája ehhez a megosztáshoz. Nem tudja addig elindítani, amíg\n" "Nincs szabad kvótája ehhez a megosztáshoz. Nem tudja addig elindítani, amíg\n"
"nem állít le egy másik példányt." "nem állít le egy másik példányt."
#: views.py:294 #: views.py:292
msgid "You are not a member of the share group." msgid "You are not a member of the share group."
msgstr "Nem tagja a megosztás csoportjának." msgstr "Nem tagja a megosztás csoportjának."
#: views.py:315 #: views.py:313
msgid "Can not create template." msgid "Can not create template."
msgstr "Sablon létrehozása sikertelen." msgstr "Sablon létrehozása sikertelen."
#: views.py:320 #: views.py:318
msgid "" msgid ""
"You have no permission to try this instance without a share. Launch a new " "You have no permission to try this instance without a share. Launch a new "
"instance through a share." "instance through a share."
...@@ -433,101 +433,101 @@ msgstr "" ...@@ -433,101 +433,101 @@ msgstr ""
"Nincs joga a sablon kipróbálására megosztás nélkül. Próbálja egy megosztáson " "Nincs joga a sablon kipróbálására megosztás nélkül. Próbálja egy megosztáson "
"keresztül." "keresztül."
#: views.py:335 #: views.py:333
msgid "Failed to create virtual machine." msgid "Failed to create virtual machine."
msgstr "A virtuális gép indítása sikertelen." msgstr "A virtuális gép indítása sikertelen."
#: views.py:425 #: views.py:421
msgid "Port number is in a restricted domain (22000 to 24000)." msgid "Port number is in a restricted domain (22000 to 24000)."
msgstr "A megadott port foglalt tartományba esik (22000-től 24000-ig)." msgstr "A megadott port foglalt tartományba esik (22000-től 24000-ig)."
#: views.py:432 #: views.py:428
#, python-format #, python-format
msgid "Port %d successfully added." msgid "Port %d successfully added."
msgstr "%d számú port hozzáadása sikeres." msgstr "%d számú port hozzáadása sikeres."
#: views.py:434 #: views.py:430
msgid "Adding port failed." msgid "Adding port failed."
msgstr "Port hozzáadása sikertelen." msgstr "Port hozzáadása sikertelen."
#: views.py:450 #: views.py:446
#, python-format #, python-format
msgid "Port %s successfully removed." msgid "Port %s successfully removed."
msgstr "%s számú port eltávolítása sikeres." msgstr "%s számú port eltávolítása sikeres."
#: views.py:452 #: views.py:448
msgid "Removing port failed." msgid "Removing port failed."
msgstr "Port eltávolítása sikertelen." msgstr "Port eltávolítása sikertelen."
#: views.py:462 #: views.py:458
msgid "Virtual machine is successfully deleted." msgid "Virtual machine is successfully deleted."
msgstr "A virtuális gép törlése sikeres." msgstr "A virtuális gép törlése sikeres."
#: views.py:464 #: views.py:460
msgid "Failed to delete virtual machine." msgid "Failed to delete virtual machine."
msgstr "A virtuális gép törlése sikertelen." msgstr "A virtuális gép törlése sikertelen."
#: views.py:486 #: views.py:482
msgid "There are machines running of this share." msgid "There are machines running of this share."
msgstr "A sablonnak még vannak futó példányai." msgstr "A sablonnak még vannak futó példányai."
#: views.py:489 #: views.py:485
msgid "Share is successfully removed." msgid "Share is successfully removed."
msgstr "Megosztás eltávolítása sikeres." msgstr "Megosztás eltávolítása sikeres."
#: views.py:491 #: views.py:487
msgid "Failed to remove share." msgid "Failed to remove share."
msgstr "Megosztás törlése sikertelen." msgstr "Megosztás törlése sikertelen."
#: views.py:499 #: views.py:495
msgid "Virtual machine is successfully stopped." msgid "Virtual machine is successfully stopped."
msgstr "A virtuális gép sikeresen leállt." msgstr "A virtuális gép sikeresen leállt."
#: views.py:501 #: views.py:497
msgid "Failed to stop virtual machine." msgid "Failed to stop virtual machine."
msgstr "A virtuális gép leállítása sikertelen." msgstr "A virtuális gép leállítása sikertelen."
#: views.py:509 #: views.py:506
msgid "Virtual machine is successfully resumed." msgid "Virtual machine is successfully resumed."
msgstr "A virtuális gép sikeresen folytatva." msgstr "A virtuális gép sikeresen folytatva."
#: views.py:511 #: views.py:508
msgid "Failed to resume virtual machine." msgid "Failed to resume virtual machine."
msgstr "A virtuális gép visszatöltése sikertelen." msgstr "A virtuális gép visszatöltése sikertelen."
#: views.py:519 #: views.py:520
msgid "Virtual machine is successfully renewed." msgid "Virtual machine is successfully renewed."
msgstr "A virtuális gép sikeresen meghosszabbítva." msgstr "A virtuális gép sikeresen meghosszabbítva."
#: views.py:521 #: views.py:522
msgid "Failed to renew virtual machine." msgid "Failed to renew virtual machine."
msgstr "A virtuális gép meghosszabbítása sikertelen." msgstr "A virtuális gép meghosszabbítása sikertelen."
#: views.py:529 #: views.py:530
msgid "Virtual machine is successfully powered off." msgid "Virtual machine is successfully powered off."
msgstr "A virtuális gép kikapcsolása sikeres." msgstr "A virtuális gép kikapcsolása sikeres."
#: views.py:539 #: views.py:540
msgid "Virtual machine is successfully restarted." msgid "Virtual machine is successfully restarted."
msgstr "A virtuális gép újraindítása sikeres." msgstr "A virtuális gép újraindítása sikeres."
#: views.py:541 #: views.py:542
msgid "Failed to restart virtual machine." msgid "Failed to restart virtual machine."
msgstr "A virtuális gép újraindítása sikertelen." msgstr "A virtuális gép újraindítása sikertelen."
#: views.py:559 #: views.py:560
msgid "Failed to add public key." msgid "Failed to add public key."
msgstr "Nyilvános kulcs hozzáadása sikertelen." msgstr "Nyilvános kulcs hozzáadása sikertelen."
#: views.py:561 #: views.py:562
msgid "Public key successfully added." msgid "Public key successfully added."
msgstr "Nyilvános kulcs hozzáadása sikeres." msgstr "Nyilvános kulcs hozzáadása sikeres."
#: views.py:572 #: views.py:573
msgid "Failed to delete public key" msgid "Failed to delete public key"
msgstr "Nyilvános kulcs törlése sikertelen." msgstr "Nyilvános kulcs törlése sikertelen."
#: views.py:584 #: views.py:585
msgid "Failed to reset keys" msgid "Failed to reset keys"
msgstr "Kulcsok újragenerálása" msgstr "Kulcsok újragenerálása"
...@@ -543,40 +543,44 @@ msgstr "A kért oldal nem található. Nincs itt semmi látnivaló." ...@@ -543,40 +543,44 @@ msgstr "A kért oldal nem található. Nincs itt semmi látnivaló."
msgid "Internal Server Error... Please leave the server alone..." msgid "Internal Server Error... Please leave the server alone..."
msgstr "Kiszolgálóoldali hiba. A manóba!" msgstr "Kiszolgálóoldali hiba. A manóba!"
#: templates/base.html:35 #: templates/base.html:39
msgid "Logged in:" msgid "Logged in:"
msgstr "Bejelentkezve:" msgstr "Bejelentkezve:"
#: templates/base.html:36 #: templates/base.html:40
msgid "Logout" msgid "Logout"
msgstr "Kijelentkezés" msgstr "Kijelentkezés"
#: templates/base.html:38 #: templates/base.html:42
msgid "Admin" msgid "Admin"
msgstr "Admin" msgstr "Admin"
#: templates/base.html:41 #: templates/base.html:45
msgid "Login" msgid "Login"
msgstr "Bejelentkezés" msgstr "Bejelentkezés"
#: templates/base.html:73 #: templates/base.html:79
msgid "Legal notice" msgid "Legal notice"
msgstr "Impresszum" msgstr "Impresszum"
#: templates/base.html:74 #: templates/base.html:80
msgid "Policy" msgid "Policy"
msgstr "Szabályzat" msgstr "Szabályzat"
#: templates/base.html:75 templates/show.html:114 #: templates/base.html:81 templates/show.html:123
#: templates/vm-credentials.html:12 templates/box/file/box.html:14 #: templates/vm-credentials.html:13 templates/box/file/box.html:14
#: templates/box/template/box.html:15 templates/box/vm/box.html:15 #: templates/box/template/box.html:15 templates/box/vm/box.html:15
msgid "Help" msgid "Help"
msgstr "Súgó" msgstr "Súgó"
#: templates/base.html:76 #: templates/base.html:82
msgid "Support" msgid "Support"
msgstr "Támogatás" msgstr "Támogatás"
#: templates/base.html:83
msgid "Change log"
msgstr "Változásnapló"
#: templates/edit-share.html:7 #: templates/edit-share.html:7
#, python-format #, python-format
msgid "Editing share: %(t)s" msgid "Editing share: %(t)s"
...@@ -631,7 +635,7 @@ msgid "Cancel" ...@@ -631,7 +635,7 @@ msgid "Cancel"
msgstr "Mégsem" msgstr "Mégsem"
#: templates/edit-share.html:62 templates/edit-template-flow.html:49 #: templates/edit-share.html:62 templates/edit-template-flow.html:49
#: templates/show.html:49 templates/box/file/box.html:112 #: templates/show.html:51 templates/box/file/box.html:112
msgid "Save" msgid "Save"
msgstr "Mentés" msgstr "Mentés"
...@@ -675,8 +679,8 @@ msgstr "Csoport" ...@@ -675,8 +679,8 @@ msgstr "Csoport"
#: templates/new-share.html:86 templates/box/template/box.html:71 #: templates/new-share.html:86 templates/box/template/box.html:71
#: templates/box/template/box.html.py:72 #: templates/box/template/box.html.py:72
#: templates/box/template/summary.html:60 #: templates/box/template/summary.html:57
#: templates/box/template/summary.html:61 templates/box/vm/entry.html:34 #: templates/box/template/summary.html:58 templates/box/vm/entry.html:34
msgid "Share" msgid "Share"
msgstr "Megosztás" msgstr "Megosztás"
...@@ -714,105 +718,110 @@ msgstr "Tovább &raquo;" ...@@ -714,105 +718,110 @@ msgstr "Tovább &raquo;"
msgid "Launch master instance" msgid "Launch master instance"
msgstr "Mesterpéldány indítása" msgstr "Mesterpéldány indítása"
#: templates/show.html:43 #: templates/show.html:45
msgid "This is a master image for your new template." msgid "This is a master image for your new template."
msgstr "Ez egy mestergép az új sablonhoz." msgstr "Ez egy mestergép az új sablonhoz."
#: templates/show.html:54 #: templates/show.html:56
msgid "Connect to the machine." msgid "Connect to the machine."
msgstr "Csatlakozzon a géphez." msgstr "Csatlakozzon a géphez."
#: templates/show.html:56 #: templates/show.html:58
msgid "Do all the needed installation/customization." msgid "Do all the needed installation/customization."
msgstr "Végezze el a szükséges telepítést, testreszabást." msgstr "Végezze el a szükséges telepítést, testreszabást."
#: templates/show.html:59 #: templates/show.html:61
msgid "Log off (keep the machine running)." msgid "Log off (keep the machine running)."
msgstr "Jelentkezzen ki (a gépet NE állítsa le)." msgstr "Jelentkezzen ki (a gépet NE állítsa le)."
#: templates/show.html:62 #: templates/show.html:64
msgid "Click on the \"save\" button on the right." msgid "Click on the \"save\" button on the right."
msgstr "Kattintson jobboldalt a „mentés” gombra." msgstr "Kattintson jobboldalt a „mentés” gombra."
#: templates/show.html:65 #: templates/show.html:67
msgid "The machine will be shut down and its disk saved." msgid "The machine will be shut down and its disk saved."
msgstr "A gép leáll, lemeze mentésre kerül." msgstr "A gép leáll, lemeze mentésre kerül."
#: templates/show.html:68 #: templates/show.html:70
msgid "You can share the template with your groups." msgid "You can share the template with your groups."
msgstr "Megoszthatja a sablont csoportjaival." msgstr "Megoszthatja a sablont csoportjaival."
#: templates/show.html:80 #: templates/show.html:82 templates/show.html.py:101
msgid "Starting..." msgid "Starting..."
msgstr "Indítás…" msgstr "Indítás…"
#: templates/show.html:85 #: templates/show.html:87
msgid "Saving..." msgid "Saving..."
msgstr "Mentés…" msgstr "Mentés…"
#: templates/show.html:91 #: templates/show.html:93
msgid "Running" msgid "Running"
msgstr "Fut" msgstr "Fut"
#: templates/show.html:95 #: templates/show.html:98
msgid "Stopping..."
msgstr "Felfüggesztés…"
#: templates/show.html:103
msgid "Stopped" msgid "Stopped"
msgstr "Leállítva" msgstr "Leállítva"
#: templates/show.html:98 #: templates/show.html:106
msgid "Deleted" msgid "Deleted"
msgstr "Törölve" msgstr "Törölve"
#: templates/show.html:101 #: templates/show.html:109
msgid "Unexpected error occured" msgid "Unexpected error occured"
msgstr "Váratlan hiba történt" msgstr "Váratlan hiba történt"
#: templates/show.html:106 #: templates/show.html:114
msgid "Login credentials" msgid "Login credentials"
msgstr "Belépési adatok" msgstr "Belépési adatok"
#: templates/show.html:117 #: templates/show.html:126
msgid "" msgid ""
"This is a list about the network ports\n" "This is a list about the network ports\n"
" forwarded to the public internet." " forwarded to the public internet."
msgstr "Ez a nyilvános internet felé továbbított hálózati portok listája." msgstr "Ez a nyilvános internet felé továbbított hálózati portok listája."
#: templates/show.html:119 #: templates/show.html:128
msgid "" msgid ""
"You can access the given private port of\n" "You can access the given private port of\n"
" the VM trough the public address of the network.\n" " the VM trough the public address of the network.\n"
" " " "
msgstr "" msgstr ""
"A VM megadott belső portját elérheti a hálózat külső címén keresztül.\n" "A VM megadott belső portját elérheti a hálózat külső címén keresztül.\n"
" " " "
#: templates/show.html:122 #: templates/show.html:131
msgid "" msgid ""
"On the IPV6 network you can access the\n" "On the IPV6 network you can access the\n"
" listed private ports direcly using the VM's global IPV6\n" " listed private ports direcly using the VM's global "
" address (connections to other ports are dropped).\n" "IPV6\n"
" " " address (connections to other ports are dropped).\n"
" "
msgstr "" msgstr ""
"Az IPV6 hálózaton a megadott belső portokat közvetlenül érheti el a VM\n" "Az IPV6 hálózaton a megadott belső portokat közvetlenül érheti el a VM\n"
"globális IPV6 címén (a többi portra érkező kapcsolatokat eldobjuk).\n" "globális IPV6 címén (a többi portra érkező kapcsolatokat eldobjuk).\n"
" " " "
#: templates/show.html:128 #: templates/show.html:138
msgid "Port administration" msgid "Port administration"
msgstr "Portok kezelése" msgstr "Portok kezelése"
#: templates/show.html:134 templates/vm-credentials.html:7 #: templates/show.html:144 templates/vm-credentials.html:7
msgid "Protocol" msgid "Protocol"
msgstr "Protokoll" msgstr "Protokoll"
#: templates/show.html:135 #: templates/show.html:145
msgid "Public port" msgid "Public port"
msgstr "Külső port" msgstr "Külső port"
#: templates/show.html:136 #: templates/show.html:146
msgid "Private port" msgid "Private port"
msgstr "Belső port" msgstr "Belső port"
#: templates/show.html:144 templates/box/template/box.html:91 #: templates/show.html:154 templates/box/template/box.html:91
#: templates/box/template/summary.html:24 templates/box/vm/summary.html:40 #: templates/box/template/summary.html:24 templates/box/vm/summary.html:40
#: templates/box/vm/summary.html.py:41 templates/box/vm/summary.html:50 #: templates/box/vm/summary.html.py:41 templates/box/vm/summary.html:50
#: templates/box/vm/summary.html.py:51 templates/box/vm/summary.html:57 #: templates/box/vm/summary.html.py:51 templates/box/vm/summary.html:57
...@@ -821,62 +830,62 @@ msgstr "Belső port" ...@@ -821,62 +830,62 @@ msgstr "Belső port"
msgid "Delete" msgid "Delete"
msgstr "Törlés" msgstr "Törlés"
#: templates/show.html:164 #: templates/show.html:174
msgid "Add" msgid "Add"
msgstr "Hozzáadás" msgstr "Hozzáadás"
#: templates/vm-credentials.html:16 #: templates/vm-credentials.html:17
msgid "" msgid ""
"You can access Linux machines through\n" "You can access Linux machines through\n"
" the SSH protocol (we recommend\n" " the SSH protocol (we recommend\n"
" <a href=\"http://www.chiark.greenend.org.uk/" " <a href=\"http://www.chiark.greenend.org.uk/"
"~sgtatham/putty/\">\n" "~sgtatham/putty/\">\n"
" PuTTY</a> for Windows and OpenSSH for all other " " PuTTY</a> for Windows and OpenSSH for all "
"systems).\n" "other systems).\n"
" " " "
msgstr "" msgstr ""
"A Linux gépeket az SSH protokollon érheti el. Windowshoz a <a href=\"http://" "A Linux gépeket az SSH protokollon érheti el. Windowshoz a <a href=\"http://"
"www.chiark.greenend.org.uk/~sgtatham/putty/\">PuTTY</a>-ot, minden más\n" "www.chiark.greenend.org.uk/~sgtatham/putty/\">PuTTY</a>-ot, minden más\n"
"rendszerhez az OpenSSH klienst ajánljuk.\n" "rendszerhez az OpenSSH klienst ajánljuk.\n"
" " " "
#: templates/vm-credentials.html:22 #: templates/vm-credentials.html:23
msgid "" msgid ""
"Graphical log in is also supported with\n" "Graphical log in is also supported with\n"
" the <a href=\"http://www.nomachine.com/download.php" " the <a href=\"http://www.nomachine.com/download."
"\">\n" "php\">\n"
" NoMachine NX Client</a> application." " NoMachine NX Client</a> application."
msgstr "" msgstr ""
"Grafikus bejelentkezés a <a href=\"http://www.nomachine.com/download.php\">\n" "Grafikus bejelentkezés a <a href=\"http://www.nomachine.com/download.php\">\n"
"NoMachine NX Client</a> alkalmazással lehetséges." "NoMachine NX Client</a> alkalmazással lehetséges."
#: templates/vm-credentials.html:27 #: templates/vm-credentials.html:28
msgid "" msgid ""
"You can access Windows machines through\n" "You can access Windows machines through\n"
" the remote desktop protocol." " the remote desktop protocol."
msgstr "A Windows gépeket a távoli asztal protokollon érheti el." msgstr "A Windows gépeket a távoli asztal protokollon érheti el."
#: templates/vm-credentials.html:29 #: templates/vm-credentials.html:30
msgid "" msgid ""
"We recommend the built-in remote desktop\n" "We recommend the built-in remote desktop\n"
" client for Windows and Remmina for Linux." " client for Windows and Remmina for Linux."
msgstr "" msgstr ""
"Windowshoz a beépített távoli asztali kapcsolat alkalmazást, Linuxhoz a\n" "Windowshoz a beépített távoli asztali kapcsolat alkalmazást, Linuxhoz a\n"
"Remminát ajánljuk." "Remminát ajánljuk."
#: templates/vm-credentials.html:38 #: templates/vm-credentials.html:40
msgid "IP" msgid "IP"
msgstr "IP" msgstr "IP"
#: templates/vm-credentials.html:42 #: templates/vm-credentials.html:44
msgid "Port" msgid "Port"
msgstr "Port" msgstr "Port"
#: templates/vm-credentials.html:46 #: templates/vm-credentials.html:48
msgid "Username" msgid "Username"
msgstr "Felhasználónév" msgstr "Felhasználónév"
#: templates/vm-credentials.html:50 #: templates/vm-credentials.html:52
msgid "Password" msgid "Password"
msgstr "Jelszó" msgstr "Jelszó"
...@@ -904,7 +913,7 @@ msgid "" ...@@ -904,7 +913,7 @@ msgid ""
" drive, and on Linux ones as ~/sshfs." " drive, and on Linux ones as ~/sshfs."
msgstr "" msgstr ""
"A windowsos gépeken a Z: meghajtóra, Linuxon a ~/sshfs katalógusba\n" "A windowsos gépeken a Z: meghajtóra, Linuxon a ~/sshfs katalógusba\n"
"vancsatolva." "van csatolva."
#: templates/box/file/box.html:23 #: templates/box/file/box.html:23
msgid "" msgid ""
...@@ -912,7 +921,7 @@ msgid "" ...@@ -912,7 +921,7 @@ msgid ""
" you can see this folder also as ~/sshfs." " you can see this folder also as ~/sshfs."
msgstr "" msgstr ""
"Ha a laborgépekre bejelentkezik (jelenleg csak Ubuntu alatt), akkor\n" "Ha a laborgépekre bejelentkezik (jelenleg csak Ubuntu alatt), akkor\n"
"afájlokat szintén a ~/sshfs katalógusban találja." "a fájlokat szintén a ~/sshfs katalógusban találja."
#: templates/box/file/box.html:25 #: templates/box/file/box.html:25
#, python-format #, python-format
...@@ -923,7 +932,7 @@ msgid "" ...@@ -923,7 +932,7 @@ msgid ""
" public key bellow." " public key bellow."
msgstr "" msgstr ""
"SFTP klienst (pl. WinSCP) is használhat a %(serv)s címre csatlakozva.\n" "SFTP klienst (pl. WinSCP) is használhat a %(serv)s címre csatlakozva.\n"
"Ehhezalább tudja nyilvános kulcsát regisztrálni." "Ehhez alább tudja nyilvános kulcsát regisztrálni."
#: templates/box/file/box.html:31 templates/box/template/box.html:26 #: templates/box/file/box.html:31 templates/box/template/box.html:26
#: templates/box/vm/box.html:26 #: templates/box/vm/box.html:26
...@@ -1022,8 +1031,8 @@ msgstr "letöltés" ...@@ -1022,8 +1031,8 @@ msgstr "letöltés"
msgid "Last modification" msgid "Last modification"
msgstr "Utolsó módosítás" msgstr "Utolsó módosítás"
#: templates/box/key/entry.html:19 templates/box/template/summary.html:64 #: templates/box/key/entry.html:19 templates/box/template/summary.html:61
#: templates/box/template/summary.html:65 #: templates/box/template/summary.html:62
msgid "Remove" msgid "Remove"
msgstr "Törlés" msgstr "Törlés"
...@@ -1062,6 +1071,7 @@ msgstr "" ...@@ -1062,6 +1071,7 @@ msgstr ""
"Hozzon létre egyet, és ossza meg hallgatóival. Vagy használjon egy közöset." "Hozzon létre egyet, és ossza meg hallgatóival. Vagy használjon egy közöset."
#: templates/box/template/box.html:68 templates/box/template/summary.html:54 #: templates/box/template/box.html:68 templates/box/template/summary.html:54
#: templates/box/vm/entry.html:30
msgid "Try" msgid "Try"
msgstr "Kipróbálás" msgstr "Kipróbálás"
...@@ -1072,8 +1082,6 @@ msgstr "Indítás" ...@@ -1072,8 +1082,6 @@ msgstr "Indítás"
#: templates/box/template/box.html:88 templates/box/template/summary.html:21 #: templates/box/template/box.html:88 templates/box/template/summary.html:21
#: templates/box/template/summary.html:50 #: templates/box/template/summary.html:50
#: templates/box/template/summary.html:51 #: templates/box/template/summary.html:51
#: templates/box/template/summary.html:57
#: templates/box/template/summary.html:58
msgid "Edit" msgid "Edit"
msgstr "Szerkesztés" msgstr "Szerkesztés"
......
...@@ -6,7 +6,7 @@ msgid "" ...@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-07 18:16+0100\n" "POT-Creation-Date: 2013-03-22 10:43+0100\n"
"PO-Revision-Date: 2013-03-07 17:02+0100\n" "PO-Revision-Date: 2013-03-07 17:02+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Hungarian <cloud@ik.bme.hu>\n" "Language-Team: Hungarian <cloud@ik.bme.hu>\n"
...@@ -17,18 +17,17 @@ msgstr "" ...@@ -17,18 +17,17 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Lokalize 1.4\n" "X-Generator: Lokalize 1.4\n"
#: static/script/cloud.js:24 static/script/cloud.min.js:1 #: static/script/cloud.js:24
msgid "Are you sure deleting key?" msgid "Are you sure deleting key?"
msgstr "Biztosan törli a kulcsot?" msgstr "Biztosan törli a kulcsot?"
#: static/script/cloud.js:24 static/script/cloud.js.c:296 #: static/script/cloud.js:24 static/script/cloud.js.c:301
#: static/script/cloud.js:370 static/script/cloud.js.c:623 #: static/script/cloud.js:373 static/script/cloud.js.c:600
#: static/script/cloud.min.js:1 static/script/store.js:288 #: static/script/store.js:288
#: static/script/store.min.js:1
msgid "Delete" msgid "Delete"
msgstr "Törlés" msgstr "Törlés"
#: static/script/cloud.js:36 static/script/cloud.min.js:1 #: static/script/cloud.js:36
msgid "" msgid ""
"Are you sure about reseting store credentials?<br /> You will lose your " "Are you sure about reseting store credentials?<br /> You will lose your "
"access to your store account on your existing virtual machines!" "access to your store account on your existing virtual machines!"
...@@ -36,96 +35,92 @@ msgstr "" ...@@ -36,96 +35,92 @@ msgstr ""
"Biztosan újragenerálja az adattár-kulcsait?<br /> El fogja veszteni az " "Biztosan újragenerálja az adattár-kulcsait?<br /> El fogja veszteni az "
"adattár-hozzáférést a már futó virtuális gépekből!" "adattár-hozzáférést a már futó virtuális gépekből!"
#: static/script/cloud.js:36 static/script/cloud.min.js:1 #: static/script/cloud.js:36
msgid "Reset" msgid "Reset"
msgstr "Újragenerálás" msgstr "Újragenerálás"
#: static/script/cloud.js:75 static/script/cloud.min.js:1 #: static/script/cloud.js:76 static/script/store.js:323
#: static/script/store.js:323 static/script/store.min.js:1
msgid "Rename" msgid "Rename"
msgstr "Átnevezés" msgstr "Átnevezés"
#: static/script/cloud.js:271 static/script/cloud.min.js:1 #: static/script/cloud.js:276 static/script/store.js:288
#: static/script/store.js:288 static/script/store.min.js:1
msgid "Cancel" msgid "Cancel"
msgstr "Mégsem" msgstr "Mégsem"
#: static/script/cloud.js:285 static/script/cloud.min.js:1 #: static/script/cloud.js:290
#, c-format #, c-format
msgid "Are you sure stopping %s?" msgid "Are you sure stopping %s?"
msgstr "Biztosan felfüggeszti a következőt: %s?" msgstr "Biztosan felfüggeszti a következőt: %s?"
#: static/script/cloud.js:286 static/script/cloud.min.js:1 #: static/script/cloud.js:291
msgid "Stop" msgid "Stop"
msgstr "Felfüggesztés" msgstr "Felfüggesztés"
#: static/script/cloud.js:295 static/script/cloud.min.js:1 #: static/script/cloud.js:300
#, c-format #, c-format
msgid "Are you sure deleting %s?" msgid "Are you sure deleting %s?"
msgstr "Biztosan törli a következőt: %s?" msgstr "Biztosan törli a következőt: %s?"
#: static/script/cloud.js:305 static/script/cloud.min.js:1 #: static/script/cloud.js:310
#, c-format #, c-format
msgid "Are you sure restarting %s?" msgid "Are you sure restarting %s?"
msgstr "Biztosan újraindítja a következőt: %s?" msgstr "Biztosan újraindítja a következőt: %s?"
#: static/script/cloud.js:306 static/script/cloud.min.js:1 #: static/script/cloud.js:311
msgid "Restart" msgid "Restart"
msgstr "Újraindítás" msgstr "Újraindítás"
#: static/script/cloud.js:369 static/script/cloud.min.js:1 #: static/script/cloud.js:372
#, c-format #, c-format
msgid "Are you sure deleting this %s template?" msgid "Are you sure deleting this %s template?"
msgstr "Biztosan törli a következő sablont: %s?" msgstr "Biztosan törli a következő sablont: %s?"
#: static/script/cloud.js:547 static/script/cloud.js.c:550 #: static/script/cloud.js:551 static/script/cloud.js.c:554
#: static/script/cloud.min.js:1
msgid "Add owner" msgid "Add owner"
msgstr "Tulajdonos hozzáadása" msgstr "Tulajdonos hozzáadása"
#: static/script/cloud.js:550 static/script/cloud.min.js:1 #: static/script/cloud.js:554
msgid "Unknown" msgid "Unknown"
msgstr "Ismeretlen" msgstr "Ismeretlen"
#: static/script/cloud.js:623 static/script/cloud.min.js:1 #: static/script/cloud.js:600
#, c-format #, c-format
msgid "Are you sure deleting <strong>%s</strong>" msgid "Are you sure deleting <strong>%s</strong>"
msgstr "Törli a következő fájlt: <strong>%s</strong>" msgstr "Törli a következő fájlt: <strong>%s</strong>"
#: static/script/store.js:52 static/script/store.js.c:61 #: static/script/store.js:52 static/script/store.js.c:61
#: static/script/store.js:70 static/script/store.js.c:220 #: static/script/store.js:70 static/script/store.js.c:220
#: static/script/store.js:282 static/script/store.min.js:1 #: static/script/store.js:282
msgid "file" msgid "file"
msgstr "fájl" msgstr "fájl"
#: static/script/store.js:125 static/script/store.min.js:1 #: static/script/store.js:125
msgid "Toplist" msgid "Toplist"
msgstr "Legújabb fájlok" msgstr "Legújabb fájlok"
#: static/script/store.js:127 static/script/store.min.js:1 #: static/script/store.js:127
msgid "Back to the root folder" msgid "Back to the root folder"
msgstr "Vissza a gyökérmappába" msgstr "Vissza a gyökérmappába"
#: static/script/store.js:283 static/script/store.min.js:1 #: static/script/store.js:283
#, c-format #, c-format
msgid "You are removing the file <strong>%s</strong>." msgid "You are removing the file <strong>%s</strong>."
msgstr "Törli a következő fájlt: <strong>%s</strong>." msgstr "Törli a következő fájlt: <strong>%s</strong>."
#: static/script/store.js:285 static/script/store.min.js:1 #: static/script/store.js:285
#, c-format #, c-format
msgid "You are removing the folder <strong>%s</strong> (and its content)." msgid "You are removing the folder <strong>%s</strong> (and its content)."
msgstr "Törli a következő könyvtárat és tartalmát: <strong>%s</strong>." msgstr "Törli a következő könyvtárat és tartalmát: <strong>%s</strong>."
#: static/script/store.js:288 static/script/store.min.js:1 #: static/script/store.js:288
msgid "Are you sure?" msgid "Are you sure?"
msgstr "Biztos benne?" msgstr "Biztos benne?"
#: static/script/store.js:446 static/script/store.js.c:448 #: static/script/store.js:446 static/script/store.js.c:448
#: static/script/store.min.js:1
msgid "Upload" msgid "Upload"
msgstr "Feltöltés" msgstr "Feltöltés"
#: static/script/store.js:448 static/script/store.min.js:1 #: static/script/store.js:448
msgid "done, processing..." msgid "done, processing..."
msgstr "kész, feldolgozás..." msgstr "kész, feldolgozás..."
......
...@@ -18,6 +18,7 @@ from firewall.models import Host, Rule, Vlan, Record ...@@ -18,6 +18,7 @@ from firewall.models import Host, Rule, Vlan, Record
from school.models import Person, Group from school.models import Person, Group
from store.api import StoreApi from store.api import StoreApi
from .util import keygen from .util import keygen
from cloud.settings import CLOUD_URL
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
pwgen = User.objects.make_random_password pwgen = User.objects.make_random_password
...@@ -487,7 +488,8 @@ class Instance(models.Model): ...@@ -487,7 +488,8 @@ class Instance(models.Model):
"""Submit a new instance to OpenNebula.""" """Submit a new instance to OpenNebula."""
from django.template.defaultfilters import escape from django.template.defaultfilters import escape
out = "" out = ""
inst = Instance(pw=pwgen(), template=template, owner=owner, share=share) inst = Instance(pw=pwgen(), template=template, owner=owner,
share=share, state='PENDING')
inst.save() inst.save()
hostname = u"cloud-%d" % (inst.id, ) hostname = u"cloud-%d" % (inst.id, )
with tempfile.NamedTemporaryFile(delete=False) as f: with tempfile.NamedTemporaryFile(delete=False) as f:
...@@ -529,7 +531,7 @@ class Instance(models.Model): ...@@ -529,7 +531,7 @@ class Instance(models.Model):
"smbpw": escape(details.smb_password), "smbpw": escape(details.smb_password),
"sshkey": escape(details.ssh_private_key), "sshkey": escape(details.ssh_private_key),
"neptun": escape(owner.username), "neptun": escape(owner.username),
"booturl": "https://cloud.ik.bme.hu/b/%s/" % token, "booturl": "%sb/%s/" % ( CLOUD_URL, token ),
"extra": extra} "extra": extra}
f.write(tpl) f.write(tpl)
f.close() f.close()
...@@ -551,7 +553,6 @@ class Instance(models.Model): ...@@ -551,7 +553,6 @@ class Instance(models.Model):
{'neptun': owner.username, 'template': template.name, {'neptun': owner.username, 'template': template.name,
'id': inst.one_id}) 'id': inst.one_id})
inst.save() inst.save()
inst.update_state()
host = Host(vlan=Vlan.objects.get(name=template.network.name), host = Host(vlan=Vlan.objects.get(name=template.network.name),
owner=owner) owner=owner)
host.hostname = hostname host.hostname = hostname
...@@ -618,17 +619,23 @@ class Instance(models.Model): ...@@ -618,17 +619,23 @@ class Instance(models.Model):
def _change_state(self, new_state): def _change_state(self, new_state):
"""Change host state in OpenNebula.""" """Change host state in OpenNebula."""
self._update_vm("<STATE>" + new_state + "</STATE>") self._update_vm("<STATE>" + new_state + "</STATE>")
self.waiting = True
self.save()
def stop(self): def stop(self):
self._change_state("STOPPED") self._change_state("STOPPED")
self.waiting = True
self.save()
def resume(self): def resume(self):
self._change_state("RESUME") self._change_state("RESUME")
def poweroff(self): def poweroff(self):
self._change_state("POWEROFF") self._change_state("POWEROFF")
def restart(self): def restart(self):
self._change_state("RESET") self._change_state("RESET")
self.waiting = False
self.save()
def renew(self, which='both'): def renew(self, which='both'):
if which in ['suspend', 'both']: if which in ['suspend', 'both']:
self.time_of_suspend = self.share.get_type()['suspendx'] self.time_of_suspend = self.share.get_type()['suspendx']
...@@ -637,12 +644,12 @@ class Instance(models.Model): ...@@ -637,12 +644,12 @@ class Instance(models.Model):
if not (which in ['suspend', 'delete', 'both']): if not (which in ['suspend', 'delete', 'both']):
raise ValueError('No such expiration type.') raise ValueError('No such expiration type.')
self.save() self.save()
def save_as(self): def save_as(self):
"""Save image and shut down.""" """Save image and shut down."""
imgname = "template-%d-%d" % (self.template.id, self.id) imgname = "template-%d-%d" % (self.template.id, self.id)
self._update_vm('<DISK id="0"><SAVE_AS name="%s"/></DISK>' % imgname) self._update_vm('<DISK id="0"><SAVE_AS name="%s"/></DISK>' % imgname)
self._change_state("SHUTDOWN") self._change_state("SHUTDOWN")
self.waiting = True
self.save() self.save()
t = self.template t = self.template
t.state = 'SAVING' t.state = 'SAVING'
......
...@@ -15,7 +15,7 @@ $(function() { ...@@ -15,7 +15,7 @@ $(function() {
$('.delete-template').click(function(e) { $('.delete-template').click(function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
delete_template_confirm($(this).data('id'), $(this).data('name')); delete_template_confirm($(this).data('url'), $(this).data('id'), $(this).data('name'));
}); });
$('.delete-key').click(function(e) { $('.delete-key').click(function(e) {
var id = $(this).data('id'); var id = $(this).data('id');
...@@ -25,7 +25,7 @@ $(function() { ...@@ -25,7 +25,7 @@ $(function() {
$.ajax({ $.ajax({
'type': 'POST', 'type': 'POST',
'data': 'id=' + id, 'data': 'id=' + id,
'url': '/ajax/key/delete/', 'url': $(this).data('url'),
'success': function() { 'success': function() {
$('#key-' + id).slideUp(700); $('#key-' + id).slideUp(700);
} }
...@@ -36,7 +36,7 @@ $(function() { ...@@ -36,7 +36,7 @@ $(function() {
vm_confirm_popup(gettext('Are you sure about reseting store credentials?<br /> You will lose your access to your store account on your existing virtual machines!'), gettext('Reset'), function() { vm_confirm_popup(gettext('Are you sure about reseting store credentials?<br /> You will lose your access to your store account on your existing virtual machines!'), gettext('Reset'), function() {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/ajax/key/reset/', url: $(this).data('url'),
success: function() { success: function() {
window.location.reload(); window.location.reload();
} }
...@@ -63,6 +63,7 @@ $(function() { ...@@ -63,6 +63,7 @@ $(function() {
var oldName = $(this).data('name'); var oldName = $(this).data('name');
var content = $('#vm-' + id + '-name').html(); var content = $('#vm-' + id + '-name').html();
var self=this; var self=this;
var url = $(this).data('url');
$(this).unbind('click').click(function(e){ $(this).unbind('click').click(function(e){
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
...@@ -72,7 +73,7 @@ $(function() { ...@@ -72,7 +73,7 @@ $(function() {
}) })
$('#vm-' + id + '-name-details').hide(); $('#vm-' + id + '-name-details').hide();
$('#vm-' + id + '-name').html('<input type="text" value="' + oldName + '" />\ $('#vm-' + id + '-name').html('<input type="text" value="' + oldName + '" />\
<input type="submit" value="' + gettext('Rename') + '" />'); <input type="submit" value="' + gettext('Rename') + '" data-url="'+url+'"/>');
$('#vm-' + id + '-name').find('input[type="text"]').click(function(f) { $('#vm-' + id + '-name').find('input[type="text"]').click(function(f) {
f.preventDefault(); f.preventDefault();
f.stopPropagation(); f.stopPropagation();
...@@ -85,7 +86,7 @@ $(function() { ...@@ -85,7 +86,7 @@ $(function() {
type: 'POST', type: 'POST',
data: 'name=' + newName, data: 'name=' + newName,
dataType: 'json', dataType: 'json',
url: '/ajax/vm/rename/' + id + '/', url: $(this).data('url'),
success: function(data) { success: function(data) {
$('#vm-' + id + '-name-details').removeAttr('style'); $('#vm-' + id + '-name-details').removeAttr('style');
$('#vm-' + id + '-name').text(data.name); $('#vm-' + id + '-name').text(data.name);
...@@ -97,7 +98,7 @@ $(function() { ...@@ -97,7 +98,7 @@ $(function() {
$('.try-template').click(function(e) { $('.try-template').click(function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
new_vm($(this).data('id')); new_vm($(this).data('url'));
}); });
$('.stop-vm').click(function(e) { $('.stop-vm').click(function(e) {
e.preventDefault(); e.preventDefault();
...@@ -135,7 +136,7 @@ $(function() { ...@@ -135,7 +136,7 @@ $(function() {
$('#modal-container .entry .summary').click(toggleDetails); $('#modal-container .entry .summary').click(toggleDetails);
}); });
$('#new-template-button').click(function() { $('#new-template-button').click(function() {
$.get('/ajax/templateWizard', function(data) { $.get($(this).data('url'), function(data) {
$('#modal-container').html(data); $('#modal-container').html(data);
}) })
$('#modal').show(); $('#modal').show();
...@@ -146,7 +147,7 @@ $(function() { ...@@ -146,7 +147,7 @@ $(function() {
var id=$(this).data('id'); var id=$(this).data('id');
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: '/ajax/templateEditWizard/'+id+'/', url: $(this).data('url'),
success: function(data){ success: function(data){
$('#modal').show(); $('#modal').show();
$('#modal-container').html(data); $('#modal-container').html(data);
...@@ -192,7 +193,11 @@ $(function() { ...@@ -192,7 +193,11 @@ $(function() {
$('#modal-container').html(content); $('#modal-container').html(content);
$('#shadow').click(function() { $('#shadow').click(function() {
$('#new-group-wizard').html(content); $('#new-group-wizard').html(content);
}) });
$('#modal .prev').click(function() {
$('#modal').hide();
$('#new-group-wizard').html(content);
});
function updateSummary() { function updateSummary() {
$('#new-group-summary-name').html($('#new-group-name').val()); $('#new-group-summary-name').html($('#new-group-name').val());
...@@ -210,8 +215,8 @@ $(function() { ...@@ -210,8 +215,8 @@ $(function() {
if ($(this).attr('type') == 'password') { if ($(this).attr('type') == 'password') {
$(this).attr('type', 'text'); $(this).attr('type', 'text');
$(this).addClass('shown'); $(this).addClass('shown');
this.select();
} else if (this.selectionStart - this.selectionEnd == 0) { } else if (this.selectionStart - this.selectionEnd == 0) {
$(this).attr('type', 'password'); $(this).attr('type', 'password');
$(this).removeClass('shown'); $(this).removeClass('shown');
} }
...@@ -235,7 +240,7 @@ $(function() { ...@@ -235,7 +240,7 @@ $(function() {
e.stopPropagation(); e.stopPropagation();
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: '/ajax/shareEdit/' + $(this).data('id') + '/', url: $(this).data('url'),
success: function(data) { success: function(data) {
$('#modal').show(); $('#modal').show();
$('#modal-container').html(data); $('#modal-container').html(data);
...@@ -349,13 +354,11 @@ $(function() { ...@@ -349,13 +354,11 @@ $(function() {
* New VM * New VM
*/ */
function new_vm(template_id) { function new_vm(url) {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/ajax/vm/new/' + template_id + '/', url: url,
success: function(data, b, xhrRequest) { success: function(data, b, xhrRequest) {
window.location.href = '/'; //xhrRequest.getResponseHeader("Location");
//alert(xhrRequest.getResponseHeader("Location"));
window.location.href = xhrRequest.getResponseHeader("Location"); window.location.href = xhrRequest.getResponseHeader("Location");
} }
}) })
...@@ -365,7 +368,7 @@ $(function() { ...@@ -365,7 +368,7 @@ $(function() {
* Template delete * Template delete
*/ */
function delete_template_confirm(id, name) { function delete_template_confirm(url, id, name) {
confirm_message = interpolate(gettext("Are you sure deleting this %s template?"), ["<strong>" + name + "</strong>"]) confirm_message = interpolate(gettext("Are you sure deleting this %s template?"), ["<strong>" + name + "</strong>"])
vm_confirm_popup(confirm_message, gettext("Delete"), function() { vm_confirm_popup(confirm_message, gettext("Delete"), function() {
delete_template(id) delete_template(id)
...@@ -375,10 +378,10 @@ $(function() { ...@@ -375,10 +378,10 @@ $(function() {
* Template delete * Template delete
*/ */
function delete_template(id) { function delete_template(url, id) {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/ajax/template/delete/', url: url,
data: 'id=' + id, data: 'id=' + id,
dataType: 'json', dataType: 'json',
statusCode: { statusCode: {
...@@ -508,7 +511,7 @@ $(function() { ...@@ -508,7 +511,7 @@ $(function() {
var neptun = $(this).prev().val(); var neptun = $(this).prev().val();
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/ajax/group/' + $(this).data('id') + '/add/', url: $(this).data('url'),
data: 'neptun=' + neptun, data: 'neptun=' + neptun,
dataType: 'json', dataType: 'json',
success: function(data) { success: function(data) {
...@@ -530,13 +533,14 @@ $(function() { ...@@ -530,13 +533,14 @@ $(function() {
var timer; var timer;
return function(e) { return function(e) {
var val = $(this).val().split(' ')[0]; var val = $(this).val().split(' ')[0];
var that = this;
clearTimeout(timer); clearTimeout(timer);
timer = setTimeout(function() { timer = setTimeout(function() {
if (val.length < 1) return; if (val.length < 1) return;
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
data: 'q=' + val, data: 'q=' + val,
url: '/ajax/group/autocomplete/', url: $(that).data('url'),
dataType: 'json', dataType: 'json',
success: function(data) { success: function(data) {
console.log(data); console.log(data);
...@@ -571,21 +575,6 @@ $(function() { ...@@ -571,21 +575,6 @@ $(function() {
e.stopPropagation(); e.stopPropagation();
} }
}()); }());
$('#new-owner-form input[type=submit]').click(function() {
var neptun = $(this).prev().val();
$.ajax({
type: 'POST',
url: '/ajax/group/' + $(this).data('id') + '/add/',
data: 'neptun=' + neptun,
dataType: 'json',
success: function(data) {
window.location.reload();
}
}).error(function(data) {
//TODO: fancy modal alert
alert(JSON.parse(data.responseText).status);
})
});
$('#group-members .remove').click(function(e) { $('#group-members .remove').click(function(e) {
e.preventDefault(); e.preventDefault();
...@@ -593,37 +582,25 @@ $(function() { ...@@ -593,37 +582,25 @@ $(function() {
var neptun = $(this).data('neptun'); var neptun = $(this).data('neptun');
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/ajax/group/' + $(this).data('gid') + '/remove/', url: $(this).data('url'),
data: 'neptun=' + neptun, data: 'neptun=' + neptun,
success: function(data) { success: function(data) {
$('#member-' + neptun).slideUp(700); $('#member-' + neptun).slideUp(700);
} }
}); });
}); });
/*$('#group-owners .remove').click(function(e) {
e.preventDefault();
e.stopPropagation();
var neptun = $(this).data('neptun');
$.ajax({
type: 'POST',
url: '/ajax/group/' + $(this).data('gid') + '/remove/',
data: 'neptun=' + neptun,
success: function(data) {
$('#member-' + neptun).slideUp(700);
}
});
});*/
$('#groups .delete').click(function(e) { $('#groups .delete').click(function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
var gid = $(this).data('id'); var gid = $(this).data('id');
var name = $(this).data('name'); var name = $(this).data('name');
var url = $(this).data('url');
vm_confirm_popup( vm_confirm_popup(
interpolate( interpolate(
gettext('Are you sure deleting <strong>%s</strong>'), [name]), gettext('Delete'), function() { gettext('Are you sure deleting <strong>%s</strong>'), [name]), gettext('Delete'), function() {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/ajax/group/delete/', url: url,
data: 'gid=' + gid, data: 'gid=' + gid,
success: function() { success: function() {
$('#group-' + gid).slideUp(700); $('#group-' + gid).slideUp(700);
......
...@@ -12,12 +12,12 @@ body ...@@ -12,12 +12,12 @@ body
background-position:80px 0; background-position:80px 0;
margin:0; margin:0;
padding:0; padding:0;
overflow: scroll; overflow-y: scroll;
} }
#content #content
{ {
width:970px; width:80%;
text-align:left; text-align:left;
margin:0 auto; margin:0 auto;
padding-bottom: 100px; padding-bottom: 100px;
...@@ -62,6 +62,9 @@ body ...@@ -62,6 +62,9 @@ body
color: #aaa; color: #aaa;
} }
} }
img {
max-width: 100%;
}
} }
.big { .big {
font-size: 2em; font-size: 2em;
...@@ -287,6 +290,7 @@ body > footer { ...@@ -287,6 +290,7 @@ body > footer {
box-shadow:0 0 30px rgba(0,0,0,0.4); box-shadow:0 0 30px rgba(0,0,0,0.4);
margin:0; margin:0;
background-color: white; background-color: white;
height: 30px;
} }
#http-error { #http-error {
...@@ -299,6 +303,138 @@ body > footer { ...@@ -299,6 +303,138 @@ body > footer {
padding: 20px; padding: 20px;
} }
.irasmu p { .irasmu {
margin-top: 20px; line-height: 1.8em;
section {
border-radius: 4px;
border: 1px solid #888;
background: #ccc;
box-shadow: 0 0 20px rgba(0,0,0,0.2);
padding: 20px;
margin: 10px;
&.teacher {
border-left: 3px solid #0b4599;
}
}
p {
margin-bottom: 10px;
&:last-child {
margin-bottom: 0px;
}
&.desc {
margin-left: 2em;
}
}
p.teacher {
background: #ddd;
padding: 20px;
border-left-width: 3px;
border-left-style: solid;
border-left-color: #0b4599;
}
p.teacher + p.teacher {
margin-top: 0;
padding-top: 0;
}
h4 {
margin: 0;
padding: 0;
font-size: 1em;
float: left;
}
h4:after {
content: " ♦ ";
}
h4 + p {
margin-top: 0;
}
h2 {
background-color:#000;
background-image:url(/static/image/hexabar.png);
background-position: right center;
background-repeat:no-repeat;
color:#eee;
font-size:1.5em;
border-radius: 4px;
border: 1px solid #888;
box-shadow: 0 0 20px rgba(0,0,0,0.2);
padding: 10px;
margin: 10px;
margin-bottom: 0;
border-bottom-style: none;
}
h2 + section {
border-radius: 0 0 4px 4px;
border-top-style: none;
margin-top: 0;
}
p.figure {
text-align: center;
&.figure-small img {
height: 200px;
transition: 1s 300ms;
-webkit-transition: 1s 300ms;
-moz-transition: 1s 300ms;
-o-transition: 1s 300ms;
-ms-transition: 1s 300ms;
transform-origin: center center;
-webkit-transform-origin: center center;
-moz-transform-origin: center center;
-ms-transform-origin: center center;
-o-transform-origin: center center;
&:hover {
height: 390px;
}
}
}
ol, ul {
margin-left: 1em;
}
nav {
background: #ddd;
padding: 10px;
border-left-width: 3px;
border-left-style: solid;
border-left-color: #ff6;
line-height: 1.2em;
li {
list-style-type: none;
ul li {
list-style-type: square;
margin-left: 1em;
}
}
}
em {
white-space: nowrap;
}
strong {
background-image: url(/static/image/hilite.png);
background-repeat: repeat;
font-style: normal;
font-weight: normal;
padding: 0 .4em;
margin-bottom: 2px;
}
}
@media (max-width: 900px) {
#content {
width: 100%;
}
.boxes {
width: 100% !important;
}
#modal-container{
width: 90%;
left: 0 !important;
margin-left: 2% !important;
}
.contentblock {
margin:5px;
}
body {
font-size: 1.1em;
}
} }
.boxes { .boxes {
width:480px; width:50%;
float:left; float:left;
} }
...@@ -300,7 +300,6 @@ ...@@ -300,7 +300,6 @@
} }
.value { .value {
float: right; float: right;
width: 200px;
text-align: right; text-align: right;
} }
.description { .description {
...@@ -309,7 +308,7 @@ ...@@ -309,7 +308,7 @@
.value { .value {
font-size: 0.8em; font-size: 0.8em;
word-spacing: 3px; word-spacing: 3px;
width: 350px; max-width: 200px;
} }
} }
} }
...@@ -317,7 +316,7 @@ ...@@ -317,7 +316,7 @@
background-image: url(/static/icons/computer--plus.png); background-image: url(/static/icons/computer--plus.png);
} }
} }
#new-share .type-summary, .share-type .value { #modal, #new-share .type-summary, .share-type .value {
&.type-summary { &.type-summary {
font-size: .8em; font-size: .8em;
text-align: right; text-align: right;
...@@ -630,11 +629,12 @@ table { ...@@ -630,11 +629,12 @@ table {
.boxhelp { .boxhelp {
position: relative; position: relative;
font-weight: normal;
.boxhelp-box { .boxhelp-box {
color:#000; color:#000;
position: absolute; position: absolute;
left: -100px;
width: 500px; width: 500px;
max-width: 100%;
z-index: 1000000; z-index: 1000000;
font-size: .7em; font-size: .7em;
background-color: #ffc; background-color: #ffc;
...@@ -643,6 +643,7 @@ table { ...@@ -643,6 +643,7 @@ table {
box-shadow:0 0 30px rgba(0,0,0,0.3); box-shadow:0 0 30px rgba(0,0,0,0.3);
margin:20px; margin:20px;
display: none; display: none;
font-size: 14px;
} }
.help:hover .boxhelp-box { .help:hover .boxhelp-box {
display: block; display: block;
......
...@@ -4,6 +4,11 @@ ...@@ -4,6 +4,11 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
z-index: 999; z-index: 999;
p,dl
{
margin:0;
padding:5px;
}
} }
#shadow{ #shadow{
position: fixed; position: fixed;
...@@ -27,7 +32,6 @@ ...@@ -27,7 +32,6 @@
max-height: 60%; max-height: 60%;
overflow: auto; overflow: auto;
.container{ .container{
max-height: 400px;
overflow: auto; overflow: auto;
border-radius: 2px; border-radius: 2px;
border: 1px solid #888; border: 1px solid #888;
......
...@@ -5,6 +5,7 @@ import os ...@@ -5,6 +5,7 @@ import os
import sys import sys
import time import time
from django.core.mail import send_mail from django.core.mail import send_mail
from one.models import Instance
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -12,3 +13,17 @@ class SendMailTask(Task): ...@@ -12,3 +13,17 @@ class SendMailTask(Task):
def run(self, to, subject, msg, sender=u'noreply@cloud.ik.bme.hu'): def run(self, to, subject, msg, sender=u'noreply@cloud.ik.bme.hu'):
send_mail(subject, msg, sender, [ to ], fail_silently=False) send_mail(subject, msg, sender, [ to ], fail_silently=False)
logger.info("[django][one][tasks.py] %s->%s [%s]" % (sender, to, subject) ) logger.info("[django][one][tasks.py] %s->%s [%s]" % (sender, to, subject) )
class UpdateInstanceStateTask(Task):
def run(self, one_id):
print one_id
try:
inst = Instance.objects.get(one_id=one_id)
except:
print 'nincs ilyen'
return
inst.update_state()
inst.waiting = False
inst.save()
print inst.state
<!DOCTYPE html> <!DOCTYPE html>
{% load i18n %} {% load i18n %}
{% load l10n %}
{% load staticfiles %} {% load staticfiles %}
{% get_current_language as lang %} {% get_current_language as lang %}
<html lang="{{lang}}"> <html lang="{{lang}}">
...@@ -12,9 +13,11 @@ ...@@ -12,9 +13,11 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="{% static "script/jquery.min.js" %}"></script> <script src="{% static "script/jquery.min.js" %}"></script>
<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script> <script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript"> <script type="text/javascript">
{% if DEBUG %}window.localStorage.removeItem('https://cloud.ik.bme.hu/static/style/style.less:timestamp');{% endif %} {% if DEBUG %}window.localStorage.removeItem('https://cloud.ik.bme.hu/static/style/style.less:timestamp');{% endif %}
var current_user={{user.id}}; var current_user={{user.id}};
google.load('visualization', '1.0', {'packages':['corechart']});
</script> </script>
{% if DEBUG %}<script src="{% static "script/less.min.js" %}"></script>{% endif %} {% if DEBUG %}<script src="{% static "script/less.min.js" %}"></script>{% endif %}
<script src="{% static "script/knockout.min.js" %}"></script> <script src="{% static "script/knockout.min.js" %}"></script>
...@@ -26,6 +29,7 @@ ...@@ -26,6 +29,7 @@
{% endif %} {% endif %}
{{ form.media }} {{ form.media }}
{% block js %}{% endblock %} {% block js %}{% endblock %}
<meta name="viewport" content="target-densitydpi=device-dpi, initial-scale=1.0" />
</head> </head>
<body> <body>
<div id="header"> <div id="header">
...@@ -70,16 +74,74 @@ ...@@ -70,16 +74,74 @@
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<footer> <footer>
<a href="/sites/legal/">{% trans "Legal notice" %}</a> | <div>
<a href="/sites/policy/">{% trans "Policy" %}</a> | <div style="float: left" id="chart_cpu_div"></div>
<a href="/sites/help/">{% trans "Help" %}</a> | <a href="/sites/legal/">{% trans "Legal notice" %}</a> |
<a href="/sites/support/">{% trans "Support" %}</a> <a href="/sites/policy/">{% trans "Policy" %}</a> |
<a href="/sites/help/">{% trans "Help" %}</a> |
<a href="/sites/support/">{% trans "Support" %}</a> |
<a href="/sites/changelog/#{{release}}" title="{% trans "Change log" %}">{{release}}</a>
<div style="float: right" id="chart_mem_div"></div>
</div>
{% if cloud_stat %}
<script type="text/javascript">
google.setOnLoadCallback(drawChart);
function drawChart() {
var data_cpu = new google.visualization.DataTable();
data_cpu.addColumn('string', 'Topping');
data_cpu.addColumn('number', 'Used');
data_cpu.addColumn('number', 'Allocated');
data_cpu.addColumn('number', 'Free');
data_cpu.addRows([
['CPU',
{{cloud_stat.CPU.USED_CPU}},
{{cloud_stat.CPU.ALLOC_CPU}},
{{cloud_stat.CPU.FREE_CPU}},]
]);
var cpu_options = {
'width':400,
'height':20,
isStacked: true,
enableInteractivity: false,
colors: ['red', 'orange', 'blue']
};
var data_mem = new google.visualization.DataTable();
data_mem.addColumn('string', 'Topping');
data_mem.addColumn('number', 'Used');
data_mem.addColumn('number', 'Allocated');
data_mem.addColumn('number', 'Free');
data_mem.addRows([
['RAM',
{{cloud_stat.MEM.USED_MEM|unlocalize}},
{{cloud_stat.MEM.ALLOC_MEM|unlocalize}},
{{cloud_stat.MEM.FREE_MEM|unlocalize}},]
]);
var mem_options = {
'width':400,
'height':20,
isStacked: true,
enableInteractivity: false,
colors: ['red', 'orange', 'blue'],
hAxis : {
viewWindowMode: 'explicit',
viewWindow: {
min: 0,
max: {{cloud_stat.MEM.USED_MEM|unlocalize}}+{{cloud_stat.MEM.ALLOC_MEM|unlocalize}}+{{cloud_stat.MEM.FREE_MEM|unlocalize}}
}
},
};
var chart = new google.visualization.BarChart(document.getElementById('chart_cpu_div'));
chart.draw(data_cpu, cpu_options);
var chart = new google.visualization.BarChart(document.getElementById('chart_mem_div'));
chart.draw(data_mem, mem_options);
}
</script>
{% endif %}
</footer> </footer>
<div id="modal" style="display: none"> <div id="modal" style="display: none">
<div id="shadow"></div> <div id="shadow"></div>
<div id="modal-container"> <div id="modal-container"></div>
</div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var _gaq = _gaq || []; var _gaq = _gaq || [];
......
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
</div> </div>
</li> </li>
<li class="entry small-row key" style="display: none"> <li class="entry small-row key" style="display: none">
<div class="summary" id="reset-key"> <div class="summary" id="reset-key" data-url="{% url one.views.key_ajax_reset %}">
<div class="name">{% trans "Reset key" %}</div> <div class="name">{% trans "Reset key" %}</div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
{{key}} {{key}}
</div> </div>
<div class="actions"> <div class="actions">
<a href="#" class="remove delete-key" data-id="{{key.id}}"> <a href="#" class="remove delete-key" data-url="{% url one.views.key_ajax_delete %}" data-id="{{key.id}}">
<img src="{% static "icons/minus-circle.png" %}" alt="{% trans 'Remove' %}" /> <img src="{% static "icons/minus-circle.png" %}" alt="{% trans 'Remove' %}" />
</a> </a>
</div> </div>
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
</div> </div>
{% endif %} {% endif %}
{% if not group %} {% if not group %}
<li id="new-template-button" class="entry new small-row"> <li id="new-template-button" class="entry new small-row" data-url="{% url one.views.ajax_template_wizard %}">
<div class="summary"> <div class="summary">
<div class="name">Új Sablon</div> <div class="name">Új Sablon</div>
<div class="clear"></div> <div class="clear"></div>
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
<div class="status">{{t.state}}</div> <div class="status">{{t.state}}</div>
<div class="actions"> <div class="actions">
{% if t.state == 'READY' %} {% if t.state == 'READY' %}
<a href="#" class="try-template-button" data-id="{{t.id}}" title="{% trans "Try" %}"> <a href="#" class="try-template-button" data-url="{% url new_vm_from_template template=t.id %}" title="{% trans "Try" %}">
<img src="{% static "icons/control.png" %}" alt="{% trans "Start" %}"/> <img src="{% static "icons/control.png" %}" alt="{% trans "Start" %}"/>
</a> </a>
<a href="#" class="template-share" data-id="{{t.id}}" data-gid="{{group.id}}" title="{% trans "Share" %}"> <a href="#" class="template-share" data-id="{{t.id}}" data-gid="{{group.id}}" title="{% trans "Share" %}">
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<form action="{% url one.views.vm_unshare i.id %}" method="post"> <form action="{% url one.views.vm_unshare i.id %}" method="post">
<span title="{{i.name}}">{{i.name|truncatechars:20}}</span> <span title="{{i.name}}">{{i.name|truncatechars:20}}</span>
({{i.get_running}}/{{i.instance_limit}}) {{i.type}} ({{i.get_running}}/{{i.instance_limit}}) {{i.type}}
<a href="#" class="edit" data-id="{{i.id}}"> <a href="#" class="edit" data-url="{% url ajax_share_edit_wizard id=i.id %}">
<img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" title="{% trans "Edit" %}" /> <img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" title="{% trans "Edit" %}" />
</a> </a>
{% csrf_token %} {% csrf_token %}
...@@ -47,21 +47,18 @@ ...@@ -47,21 +47,18 @@
{% endblock status %} {% endblock status %}
{% block actions %} {% block actions %}
<a href="#" class="edit-template" data-id="{{ t.id }}" title="{% trans "Edit" %}"> <a href="#" class="edit-template" title="{% trans "Edit" %}" data-url="{% url one.views.ajax_template_edit_wizard id=t.id %}">
<img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" /> <img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" />
</a> </a>
{% if t.state == 'READY' %} {% if t.state == 'READY' %}
<a href="#" class="try-template" data-id="{{t.id}}" title="{% trans "Try" %}"> <a href="#" class="try-template" data-url="{% url one.views.vm_new_ajax template=t.id %}" title="{% trans "Try" %}">
<img src="{% static "icons/control.png" %}" alt="{% trans "Start" %}"/> <img src="{% static "icons/control.png" %}" alt="{% trans "Start" %}"/>
</a> </a>
<!--<a href="#" title="{% trans "Edit" %}">
<img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" />
</a>-->
<a href="#" class="template-share" data-id="{{t.id}}" data-gid="{{group.id}}" title="{% trans "Share" %}"> <a href="#" class="template-share" data-id="{{t.id}}" data-gid="{{group.id}}" title="{% trans "Share" %}">
<img src="{% static "icons/user-share.png" %}" alt="{% trans "Share" %}" /> <img src="{% static "icons/user-share.png" %}" alt="{% trans "Share" %}" />
</a> </a>
{% endif %} {% endif %}
<a href="#" class="delete-template" data-id="{{ t.id }}" data-name="{{ t.name }}" title="{% trans "Remove" %}"> <a href="#" class="delete-template" data-url="{% url one.views.ajax_template_delete %}" data-id="{{ t.id }}" data-name="{{ t.name }}" title="{% trans "Remove" %}">
<img src="{% static "icons/minus-circle.png" %}" alt="{% trans "Remove" %}" /> <img src="{% static "icons/minus-circle.png" %}" alt="{% trans "Remove" %}" />
</a> </a>
{% endblock actions %} {% endblock actions %}
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
{% endblock status %} {% endblock status %}
{% block actions %} {% block actions %}
<a href="#" class="rename-vm" data-name="{{ vm.name }}" data-id="{{ vm.id }}" title="{% trans "Edit name" %}"> <a href="#" class="rename-vm" data-name="{{ vm.name }}" data-id="{{ vm.id }}" title="{% trans "Edit name" %}" data-url="{% url one.views.vm_ajax_rename iid=vm.id %}">
<img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit name" %}" /> <img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit name" %}" />
</a> </a>
{% if vm.waiting %} {% if vm.waiting %}
......
...@@ -4,15 +4,17 @@ ...@@ -4,15 +4,17 @@
{% block js %} {% block js %}
<script type="text/javascript"> <script type="text/javascript">
{% if booting or state != 'ACTIVE' %} {% if booting or state == 'PENDING' or i.waiting %}
var timer=setInterval(function(){ var timer=setInterval(function(){
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
dataType: 'json', dataType: 'json',
url: '{% url one.views.vm_ajax_instance_status id %}', url: '{% url one.views.vm_ajax_instance_status id %}',
success: function(data){ success: function(data){
if (!data.booting && data.state == 'ACTIVE'){ if (!data.waiting && !data.booting && data.state != 'PENDING'){
window.location.reload(); window.location.reload();
} else if (!data.waiting) {
// window.location.reload();
} }
} }
}); });
...@@ -84,14 +86,20 @@ ...@@ -84,14 +86,20 @@
<img src="{% static "image/load.gif" %}" /> <img src="{% static "image/load.gif" %}" />
{% trans "Saving..." %} {% trans "Saving..." %}
</p> </p>
{% elif state == "ACTIVE" and not booting %} {% elif state == "ACTIVE" and not booting and not i.waiting %}
<p id="connect" style="display:block; font-size:25px; line-height:2em;text-align:center;"> <p id="connect" style="display:block; font-size:25px; line-height:2em;text-align:center;">
<a href="{{uri}}" class="button" onclick="return connectbutton();"> <a href="{{uri}}" class="button" onclick="return connectbutton();">
<img src="{% static "image/load.gif" %}" id="connecting" style="display:none;" /> <img src="{% static "image/load.gif" %}" id="connecting" style="display:none;" />
{% trans "Running" %} {% trans "Running" %}
</a> </a>
</p> </p>
{% elif state == "STOPPED" %} {% elif state == "ACTIVE" and not booting and i.waiting %}
<p style="display:block; font-size:25px; line-height:2em;text-align:center;">
{% trans "Stopping..." %}
</p>
{% elif state == "STOPPED" and i.waiting %}
<p style="font-size:25px; line-height:2em;text-align:center;">{% trans "Starting..." %}</p>
{% elif state == "STOPPED"%}
<p style="font-size:25px; line-height:2em;text-align:center;">{% trans "Stopped" %}</p> <p style="font-size:25px; line-height:2em;text-align:center;">{% trans "Stopped" %}</p>
{% endif %} {% endif %}
{% if state == "DONE" %} {% if state == "DONE" %}
......
{% load l10n %} {% load l10n %}
<html> <html>
<head> <head>
<!--Load the AJAX API--> <script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript">
<script type="text/javascript"> google.load('visualization', '1.0', {'packages':['corechart']});
google.setOnLoadCallback(drawChart);
// Load the Visualization API and the piechart package. function drawChart() {
google.load('visualization', '1.0', {'packages':['corechart']}); var data_cpu = new google.visualization.DataTable();
data_cpu.addColumn('string', 'Topping');
// Set a callback to run when the Google Visualization API is loaded. data_cpu.addColumn('number', 'Free');
google.setOnLoadCallback(drawChart); data_cpu.addColumn('number', 'Allocated');
data_cpu.addColumn('number', 'Used');
// Callback that creates and populates a data table, data_cpu.addRows([
// instantiates the pie chart, passes in the data and ['CPU %', {{STAT.CPU.FREE_CPU}},{{STAT.CPU.ALLOC_CPU}},{{STAT.CPU.USED_CPU}}],
// draws it. ]);
function drawChart() { var cpu_options = {
'title':'Cloud CPU usage percent (100/CPU)',
// Create the data table. 'width':900,
var data_cpu = new google.visualization.DataTable(); 'height':50,
data_cpu.addColumn('string', 'Topping'); isStacked: true
data_cpu.addColumn('number', 'Slices'); };
data_cpu.addRows([ var data_mem = new google.visualization.DataTable();
['Free CPU', {{STAT.CPU.FREE_CPU}}], data_mem.addColumn('string', 'Topping');
['Allocated CPU', {{STAT.CPU.ALLOC_CPU}}], data_mem.addColumn('number', 'Slices');
['Used CPU', {{STAT.CPU.USED_CPU}}], data_mem.addRows([
]); ['Free Memory', {{STAT.MEM.FREE_MEM|unlocalize}}],
['Allocated Memory', {{STAT.MEM.ALLOC_MEM|unlocalize}}],
// Set chart options ['Used Memory', {{STAT.MEM.USED_MEM|unlocalize}}],
var cpu_options = {'title':'Cloud CPU usage percent (100/CPU)', ]);
'width':400, var mem_options = {
'height':300, 'title':'Cloud Memory usage in {{STAT.DIMENSION}}',
slices: {0: {color: 'blue'}, 1:{color: 'orange'}, 'width':400,
2:{color: 'red'}} 'height':300,
}; slices: {
0: {color: 'blue'},
var data_mem = new google.visualization.DataTable(); 1:{color: 'orange'},
data_mem.addColumn('string', 'Topping'); 2:{color: 'red'}
data_mem.addColumn('number', 'Slices'); },
data_mem.addRows([ };
['Free Memory', {{STAT.MEM.FREE_MEM|unlocalize}}], var chart = new google.visualization.BarChart(document.getElementById('chart_cpu_div'));
['Allocated Memory', {{STAT.MEM.ALLOC_MEM|unlocalize}}], chart.draw(data_cpu, cpu_options);
['Used Memory', {{STAT.MEM.USED_MEM|unlocalize}}], var chart = new google.visualization.PieChart(document.getElementById('chart_mem_div'));
]); chart.draw(data_mem, mem_options);
}
// Set chart options </script>
var mem_options = {'title':'Cloud Memory usage in {{STAT.DIMENSION}}', </head>
'width':400, <body>
'height':300, <div>Running VMs: {{STAT.VMS}}</div>
slices: {0: {color: 'blue'}, 1:{color: 'orange'}, <div id="chart_cpu_div"></div>
2:{color: 'red'}} <div id="chart_mem_div"></div>
}; </body>
// Instantiate and draw our chart, passing in some options.
var chart = new
google.visualization.PieChart(document.getElementById('chart_cpu_div'));
chart.draw(data_cpu, cpu_options);
var chart = new
google.visualization.PieChart(document.getElementById('chart_mem_div'));
chart.draw(data_mem, mem_options);
}
</script>
</head>
<body>
<!--Div that will hold the pie chart-->
<div>Running VMs: {{STAT.VMS}}</div>
<div id="chart_cpu_div"></div>
<div id="chart_mem_div"></div>
</body>
</html> </html>
...@@ -32,8 +32,6 @@ logger = logging.getLogger(__name__) ...@@ -32,8 +32,6 @@ logger = logging.getLogger(__name__)
def _list_instances(request): def _list_instances(request):
instances = Instance.objects.exclude(state='DONE').filter(owner=request.user) instances = Instance.objects.exclude(state='DONE').filter(owner=request.user)
for i in instances:
i.update_state()
instances = instances.exclude(state='DONE') instances = instances.exclude(state='DONE')
return instances return instances
...@@ -335,6 +333,7 @@ def vm_new(request, template=None, share=None, redir=True): ...@@ -335,6 +333,7 @@ def vm_new(request, template=None, share=None, redir=True):
messages.error(request, _('Failed to create virtual machine.')) messages.error(request, _('Failed to create virtual machine.'))
inst = None inst = None
if inst: if inst:
inst.waiting = True
inst.time_of_suspend = time_of_suspend inst.time_of_suspend = time_of_suspend
inst.time_of_delete = time_of_delete inst.time_of_delete = time_of_delete
inst.save() inst.save()
...@@ -356,9 +355,6 @@ vm_list = login_required(VmListView.as_view()) ...@@ -356,9 +355,6 @@ vm_list = login_required(VmListView.as_view())
@login_required @login_required
def vm_show(request, iid): def vm_show(request, iid):
inst = get_object_or_404(Instance, id=iid, owner=request.user) inst = get_object_or_404(Instance, id=iid, owner=request.user)
inst.update_state()
if inst.template.state == "SAVING":
inst.check_if_is_save_as_done()
try: try:
ports = inst.firewall_host.list_ports() ports = inst.firewall_host.list_ports()
except: except:
...@@ -388,10 +384,10 @@ def vm_show(request, iid): ...@@ -388,10 +384,10 @@ def vm_show(request, iid):
@login_required @login_required
def vm_ajax_instance_status(request, iid): def vm_ajax_instance_status(request, iid):
inst = get_object_or_404(Instance, id=iid, owner=request.user) inst = get_object_or_404(Instance, id=iid, owner=request.user)
inst.update_state()
return HttpResponse(json.dumps({ return HttpResponse(json.dumps({
'booting': not inst.active_since, 'booting': not inst.active_since,
'state': inst.state, 'state': inst.state,
'waiting': inst.waiting,
'template': { 'template': {
'state': inst.template.state 'state': inst.template.state
}})) }}))
...@@ -612,7 +608,7 @@ def stat(request): ...@@ -612,7 +608,7 @@ def stat(request):
))) )))
def sites(request, site): def sites(request, site):
if site in [ "legal", "policy", "help", "support" ]: if site in [ "legal", "policy", "help", "support", "changelog", ]:
return render_to_response("sites/%s.html" % site, RequestContext(request, {})) return render_to_response("sites/%s.html" % site, RequestContext(request, {}))
else: else:
return redirect(home) return redirect(home)
......
...@@ -6,7 +6,7 @@ msgid "" ...@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-07 18:16+0100\n" "POT-Creation-Date: 2013-03-22 10:43+0100\n"
"PO-Revision-Date: 2013-03-07 17:48+0100\n" "PO-Revision-Date: 2013-03-07 17:48+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: American English <cloud@ik.bme.hu>\n" "Language-Team: American English <cloud@ik.bme.hu>\n"
...@@ -17,112 +17,108 @@ msgstr "" ...@@ -17,112 +17,108 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Lokalize 1.4\n" "X-Generator: Lokalize 1.4\n"
#: models.py:12 #: models.py:13
msgid "Hungarian" msgid "Hungarian"
msgstr "Magyar" msgstr "Magyar"
#: models.py:12 #: models.py:13
msgid "English" msgid "English"
msgstr "Angol" msgstr "Angol"
#: models.py:28 #: models.py:46
msgid "language" msgid "language"
msgstr "nyelv" msgstr "nyelv"
#: models.py:30 #: models.py:48
msgid "code" msgid "code"
msgstr "kód" msgstr "kód"
#: models.py:53 #: models.py:73
#, python-format #, python-format
msgid "%(first)s %(last)s" msgid "%(first)s %(last)s"
msgstr "%(last)s %(first)s" msgstr "%(last)s %(first)s"
#: models.py:59 #: models.py:82
msgid "person" msgid "person"
msgstr "személy" msgstr "személy"
#: models.py:60 #: models.py:83
msgid "persons" msgid "persons"
msgstr "személyek" msgstr "személyek"
#: models.py:64 #: models.py:87
msgid "course code" msgid "course code"
msgstr "tárgykód" msgstr "tárgykód"
#: models.py:66 models.py:68 models.py:120 models.py:146 #: models.py:89 models.py:91 models.py:143 models.py:169
msgid "name" msgid "name"
msgstr "név" msgstr "név"
#: models.py:70 #: models.py:93
msgid "default group" msgid "default group"
msgstr "alapértelmezett csoport" msgstr "alapértelmezett csoport"
#: models.py:71 #: models.py:94
msgid "New users will automatically get to this group." msgid "New users will be automatically assigned to this group."
msgstr "Az új hallgatók automatikusan ebbe a csoportba kerülnek." msgstr "Az új hallgatók automatikusan ebbe a csoportba kerülnek."
#: models.py:73 models.py:115 models.py:149 models.py:162 #: models.py:96 models.py:138 models.py:175 models.py:189
msgid "owners" msgid "owners"
msgstr "tulajdonosok" msgstr "tulajdonosok"
#: models.py:76 models.py:147 #: models.py:99 models.py:171
msgid "course" msgid "course"
msgstr "tárgy" msgstr "tárgy"
#: models.py:77 #: models.py:100
msgid "courses" msgid "courses"
msgstr "tárgyak" msgstr "tárgyak"
#: models.py:83 #: models.py:106
#, python-format #, python-format
msgid "%s (auto)" msgid "%s (auto)"
msgstr "%s (auto)" msgstr "%s (auto)"
#: models.py:108 #: models.py:131
msgid "short name" msgid "short name"
msgstr "rövid név" msgstr "rövid név"
#: models.py:114 #: models.py:137 models.py:188
msgid "(none)" msgid "(none)"
msgstr "(nincs)" msgstr "(nincs)"
#: models.py:121 #: models.py:144
msgid "start" msgid "start"
msgstr "kezdet" msgstr "kezdet"
#: models.py:122 #: models.py:145
msgid "end" msgid "end"
msgstr "vége" msgstr "vége"
#: models.py:125 models.py:148 #: models.py:148 models.py:173
msgid "semester" msgid "semester"
msgstr "félév" msgstr "félév"
#: models.py:126 #: models.py:149
msgid "semesters" msgid "semesters"
msgstr "félévek" msgstr "félévek"
#: models.py:139 #: models.py:162
msgid "There is no current semester." msgid "There is no current semester."
msgstr "Nincs aktuális félév." msgstr "Nincs aktuális félév."
#: models.py:150 #: models.py:177
msgid "members" msgid "members"
msgstr "tagok" msgstr "tagok"
#: models.py:154 #: models.py:181
msgid "group" msgid "group"
msgstr "csoport" msgstr "csoport"
#: models.py:155 #: models.py:182
msgid "groups" msgid "groups"
msgstr "csoportok" msgstr "csoportok"
#: models.py:161
msgid "n/a"
msgstr "n/a"
#: views.py:41 #: views.py:41
msgid "EduID is not available." msgid "EduID is not available."
msgstr "Az EduID nem elérhető." msgstr "Az EduID nem elérhető."
...@@ -147,15 +143,15 @@ msgstr "„%s” tárgy oktatóihoz felvéve." ...@@ -147,15 +143,15 @@ msgstr "„%s” tárgy oktatóihoz felvéve."
msgid "Failed to add course \"%s\" ownership." msgid "Failed to add course \"%s\" ownership."
msgstr "„%s” tárgy oktatóihoz felvétel sikertelen." msgstr "„%s” tárgy oktatóihoz felvétel sikertelen."
#: views.py:148 #: views.py:150
msgid "Could not found Person object." msgid "Could not found Person object."
msgstr "Nem található Személy objektum." msgstr "Nem található Személy objektum."
#: views.py:187 #: views.py:189
msgid "Invalid NEPTUN code found." msgid "Invalid NEPTUN code found."
msgstr "Érvénytelen Neptun-kód." msgstr "Érvénytelen Neptun-kód."
#: views.py:208 views.py:223 views.py:262 #: views.py:210 views.py:225 views.py:264
msgid "Invalid NEPTUN code" msgid "Invalid NEPTUN code"
msgstr "Érvénytelen Neptun-kód" msgstr "Érvénytelen Neptun-kód"
...@@ -320,6 +316,9 @@ msgstr "Felhasználó hozzáadása" ...@@ -320,6 +316,9 @@ msgstr "Felhasználó hozzáadása"
msgid "User NEPTUN code" msgid "User NEPTUN code"
msgstr "Felhasználó Neptun-kódja" msgstr "Felhasználó Neptun-kódja"
#~ msgid "n/a"
#~ msgstr "n/a"
#~ msgid "Templates are customized versions of the base images." #~ msgid "Templates are customized versions of the base images."
#~ msgstr "A sablonok alaprendszerek testre szabott változatai." #~ msgstr "A sablonok alaprendszerek testre szabott változatai."
......
...@@ -6,34 +6,56 @@ from django.core.exceptions import ValidationError ...@@ -6,34 +6,56 @@ from django.core.exceptions import ValidationError
from datetime import datetime from datetime import datetime
from django.conf import settings from django.conf import settings
import one.models import one.models
import logging
LANGUAGE_CODE = settings.LANGUAGE_CODE LANGUAGE_CODE = settings.LANGUAGE_CODE
LANGUAGE_CHOICES = (('hu', _('Hungarian')), ('en', _('English'))) LANGUAGE_CHOICES = (('hu', _('Hungarian')), ('en', _('English')))
logger = logging.getLogger(__name__)
def create_user_profile(sender, instance, created, **kwargs): def create_user_profile(sender, instance, created, **kwargs):
"""
User creation hook.
Ensure that the specified user has an associated profile.
@param sender: The model class.
@type instance: User
@param instance: The user to create a profile for (if necessary).
@type created: Boolean
@param created: True if a new record was created.
"""
if created: if created:
try: try:
p = Person.objects.get(code=instance.username) p = Person.objects.get(code=instance.username)
except Exception: except Person.DoesNotExist:
p = Person.objects.create(code=instance.username) p = Person.objects.create(code=instance.username)
except: except Exception as e:
logger.warning("Couldn't create profile for user: %(username)s"
"\nReason: %(exception)s",
{"username": instance.username,
"exception": e})
return return
p.code = instance.username p.clean()
p.save() p.save()
post_save.connect(create_user_profile, sender=User) post_save.connect(create_user_profile, sender=User)
class Person(models.Model): class Person(models.Model):
user = models.ForeignKey(User, null=True, blank=True, unique=True) user = models.ForeignKey(User, null=True, blank=True, unique=True)
language = models.CharField(verbose_name=_('language'), blank=False, max_length=10, language = models.CharField(verbose_name=_('language'), blank=False,
choices=LANGUAGE_CHOICES, default=LANGUAGE_CODE) max_length=10, choices=LANGUAGE_CHOICES, default=LANGUAGE_CODE)
code = models.CharField(_('code'), max_length=30, unique=True) code = models.CharField(_('code'), max_length=30, unique=True)
def get_owned_shares(self): def get_owned_shares(self):
return one.models.Share.objects.filter(group__in=self.owned_groups.all()) """Get the shares of the groups which the person owns."""
return one.models.Share.objects.filter(
group__in=self.owned_groups.all())
def get_shares(self): def get_shares(self):
return one.models.Share.objects.filter(group__in=self.course_groups.all()) """Get the shares of the groups which the person is a member of."""
return one.models.Share.objects.filter(
group__in=self.course_groups.all())
def short_name(self): def short_name(self):
if self.user: if self.user:
...@@ -45,15 +67,16 @@ class Person(models.Model): ...@@ -45,15 +67,16 @@ class Person(models.Model):
return self.code return self.code
def __unicode__(self): def __unicode__(self):
u = self.user if self.user:
if not u: if self.user.last_name and self.user.first_name:
return self.code # TRANSLATORS: full name format used in enumerations
if u.last_name and u.first_name: return _("%(first)s %(last)s") % {
# TRANSLATORS: full name format used in enumerations 'first': self.user.first_name,
return _("%(first)s %(last)s") % {'first': u.first_name, 'last': self.user.last_name}
'last': u.last_name} else:
return self.user.username
else: else:
return u.username return self.code
class Meta: class Meta:
verbose_name = _('person') verbose_name = _('person')
...@@ -68,7 +91,7 @@ class Course(models.Model): ...@@ -68,7 +91,7 @@ class Course(models.Model):
verbose_name=_('name')) verbose_name=_('name'))
default_group = models.ForeignKey('Group', null=True, blank=True, default_group = models.ForeignKey('Group', null=True, blank=True,
related_name='default_group_of', verbose_name=_('default group'), related_name='default_group_of', verbose_name=_('default group'),
help_text=_('New users will automatically get to this group.')) help_text=_('New users will be automatically assigned to this group.'))
owners = models.ManyToManyField(Person, blank=True, null=True, owners = models.ManyToManyField(Person, blank=True, null=True,
verbose_name=_('owners')) verbose_name=_('owners'))
...@@ -144,10 +167,14 @@ class Semester(models.Model): ...@@ -144,10 +167,14 @@ class Semester(models.Model):
class Group(models.Model): class Group(models.Model):
name = models.CharField(max_length=80, verbose_name=_('name')) name = models.CharField(max_length=80, verbose_name=_('name'))
course = models.ForeignKey('Course', null=True, blank=True, verbose_name=_('course')) course = models.ForeignKey('Course', null=True, blank=True,
semester = models.ForeignKey('Semester', null=False, blank=False, verbose_name=_('semester')) verbose_name=_('course'))
owners = models.ManyToManyField(Person, blank=True, null=True, related_name='owned_groups', verbose_name=_('owners')) semester = models.ForeignKey('Semester', null=False, blank=False,
members = models.ManyToManyField(Person, blank=True, null=True, related_name='course_groups', verbose_name=_('members')) verbose_name=_('semester'))
owners = models.ManyToManyField(Person, blank=True, null=True,
related_name='owned_groups', verbose_name=_('owners'))
members = models.ManyToManyField(Person, blank=True, null=True,
related_name='course_groups', verbose_name=_('members'))
class Meta: class Meta:
unique_together = (('name', 'course', 'semester', ), ) unique_together = (('name', 'course', 'semester', ), )
...@@ -155,10 +182,10 @@ class Group(models.Model): ...@@ -155,10 +182,10 @@ class Group(models.Model):
verbose_name_plural = _('groups') verbose_name_plural = _('groups')
def owner_list(self): def owner_list(self):
if self.owners: if self.owners and self.owners.count() > 0:
return ", ".join([p.short_name() for p in self.owners.all()]) return ", ".join([p.short_name() for p in self.owners.all()])
else: else:
return _("n/a") return _("(none)")
owner_list.verbose_name = _('owners') owner_list.verbose_name = _('owners')
def member_count(self): def member_count(self):
...@@ -172,4 +199,4 @@ class Group(models.Model): ...@@ -172,4 +199,4 @@ class Group(models.Model):
@models.permalink @models.permalink
def get_absolute_url(self): def get_absolute_url(self):
return ('group_show', None, {'gid':self.id}) return ('group_show', None, {'gid': self.id})
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<small class="details">(<a href="{{ group.get_absolute_url }}">{% trans "More details" %}</a>)</small> <small class="details">(<a href="{{ group.get_absolute_url }}">{% trans "More details" %}</a>)</small>
</div> </div>
<div class="actions"> <div class="actions">
<a href="#" class="delete" data-id="{{group.id}}" data-name="{{group.name}}"> <a href="#" class="delete" data-url="{% url school.views.group_ajax_delete %}" data-id="{{group.id}}" data-name="{{group.name}}">
<img src="{% static "icons/minus-circle.png" %}" alt="{% trans "Delete" %}" title="{% trans "Delete" %}" /> <img src="{% static "icons/minus-circle.png" %}" alt="{% trans "Delete" %}" title="{% trans "Delete" %}" />
</a> </a>
<a href="#" class="hide-group" data-id="{{group.id}}"> <a href="#" class="hide-group" data-id="{{group.id}}">
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<div class="name">{% trans "Add user" %}</div> <div class="name">{% trans "Add user" %}</div>
<div id="new-member-form"> <div id="new-member-form">
<input type="text" placeholder="{% trans "User NEPTUN code" %}" /> <input type="text" placeholder="{% trans "User NEPTUN code" %}" />
<input type="submit" value="{% trans "Add user" %}" data-id="{{group.id}}"/> <input type="submit" value="{% trans "Add user" %}" data-url="{% url school.views.group_ajax_add_new_member gid=group.id %}"/>
</div> </div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
{% endif %} {% endif %}
</div> </div>
<div class="actions"> <div class="actions">
<a href="#" class="remove" data-gid="{{group.id}}" data-neptun="{{member.code}}"> <a href="#" class="remove" data-url="{% url school.views.group_ajax_remove_member gid=group.id %}" data-neptun="{{member.code}}">
<img src="{% static "icons/minus-circle.png" %}" alt="{% trans 'Remove' %}" /> <img src="{% static "icons/minus-circle.png" %}" alt="{% trans 'Remove' %}" />
</a> </a>
</div> </div>
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
</div> </div>
<div class="details" id="new-owner-form"> <div class="details" id="new-owner-form">
<div class="container"> <div class="container">
<input type="text" placeholder="{% trans "Owner name/NEPTUN" %}" /> <input type="text" placeholder="{% trans "Owner name/NEPTUN" %}" data-url="{% url school.views.group_ajax_owner_autocomplete %}"/>
<div id="new-owner-autocomplete"></div> <div id="new-owner-autocomplete"></div>
</div> </div>
</div> </div>
......
""" from django.test import TestCase
This file demonstrates writing tests using the unittest module. These will pass from models import create_user_profile, Person
when you run "manage.py test".
Replace this with more appropriate tests for your application. class MockUser:
""" username = "testuser"
from django.test import TestCase class CreateUserProfileTestCase(TestCase):
def setUp(self):
self.user = MockUser()
for p in Person.objects.all():
p.delete()
def test_new_profile(self):
"""Test profile creation functionality for new user."""
create_user_profile(self.user.__class__, self.user, True)
self.assertEqual(Person.objects.filter(
code=self.user.username).count(), 1)
def test_existing_profile(self):
"""Test profile creation functionality when it already exists."""
Person.objects.create(code=self.user.username)
create_user_profile(self.user.__class__, self.user, True)
self.assertEqual(Person.objects.filter(
code=self.user.username).count(), 1)
class PersonTestCase(TestCase):
def setUp(self):
self.testperson = Person.objects.create(code='testperson')
def test_language_code_in_choices(self):
"""Test whether the default value for language is a valid choice."""
# TODO
language_field = self.testperson._meta.get_field('language')
choice_codes = [code for (code, _) in language_field.choices]
self.assertIn(language_field.default, choice_codes)
def test_get_owned_shares(self):
# TODO
self.testperson.get_owned_shares()
def test_get_shares(self):
# TODO
self.testperson.get_shares()
def test_short_name(self):
# TODO
self.testperson.short_name()
class SimpleTest(TestCase): def test_unicode(self):
def test_basic_addition(self): # TODO
""" self.testperson.__unicode__()
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment