Commit e84c01cf by Őry Máté

Merge branch 'release-13.04.1' into releases

Conflicts:
	one/locale/hu/LC_MESSAGES/django.po
	one/locale/hu/LC_MESSAGES/djangojs.po
	school/locale/hu/LC_MESSAGES/django.po
parents f6fdeffe 3c786fcb
...@@ -14,7 +14,15 @@ ...@@ -14,7 +14,15 @@
<a id="master"></a> <a id="master"></a>
<section> <section>
<h3 id="release-13.03.2"><a href="#13.03.2">13.03.2 (2013. március 21.)</a></h3> <h3 id="release-13.04.1"><a href="#release-13.04.1">13.04.1 (2013. április 4.)</a></h3>
<ul>
<li>Hálózati beállítások új felületen.</li>
<li>Rövidebb IPv6-os gépnév.</li>
<li>Hibajavítások.</li>
</ul>
</section>
<section>
<h3 id="release-13.03.2"><a href="#release-13.03.2">13.03.2 (2013. március 21.)</a></h3>
<ul> <ul>
<li>Súgó.</li> <li>Súgó.</li>
<li>Változáslista.</li> <li>Változáslista.</li>
...@@ -26,7 +34,7 @@ ...@@ -26,7 +34,7 @@
</section> </section>
<section> <section>
<h3 id="release-13.03.1"><a href="#13.03.1">13.03.1 (2013. március 7.)</a></h3> <h3 id="release-13.03.1"><a href="#release-13.03.1">13.03.1 (2013. március 7.)</a></h3>
<ul> <ul>
<li>Határidős felfüggesztés élesítve.</li> <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>Csatlakozási adatoknál IP cím helyett DNS név jelenik meg.</li>
...@@ -50,7 +58,7 @@ ...@@ -50,7 +58,7 @@
</section> </section>
<section> <section>
<h3 id="release-13.02.2"><a href="#13.02.2">13.02.2 (2013. február 21.)</a></h3> <h3 id="release-13.02.2"><a href="#release-13.02.2">13.02.2 (2013. február 21.)</a></h3>
<ul> <ul>
<li>Felhasználói kvóták megvalósítása.</li> <li>Felhasználói kvóták megvalósítása.</li>
<li>Publikus kulcsok kezelése.</li> <li>Publikus kulcsok kezelése.</li>
......
...@@ -37,7 +37,7 @@ urlpatterns = patterns('', ...@@ -37,7 +37,7 @@ urlpatterns = patterns('',
url(r'^vm/renew/(?P<which>(suspend|delete))/(?P<iid>\d+)/$', url(r'^vm/renew/(?P<which>(suspend|delete))/(?P<iid>\d+)/$',
'one.views.vm_renew', ), 'one.views.vm_renew', ),
url(r'^vm/port_add/(?P<iid>\d+)/$', 'one.views.vm_port_add', ), url(r'^vm/port_add/(?P<iid>\d+)/$', 'one.views.vm_port_add', ),
url(r'^vm/port_del/(?P<iid>\d+)/(?P<proto>tcp|udp)/(?P<public>\d+)/$', url(r'^vm/port_del/(?P<iid>\d+)/(?P<proto>tcp|udp)/(?P<private>\d+)/$',
'one.views.vm_port_del', ), 'one.views.vm_port_del', ),
url(r'^ajax/shareEdit/(?P<id>\d+)/$', 'one.views.ajax_share_edit_wizard', url(r'^ajax/shareEdit/(?P<id>\d+)/$', 'one.views.ajax_share_edit_wizard',
name='ajax_share_edit_wizard'), name='ajax_share_edit_wizard'),
......
...@@ -10,6 +10,7 @@ from django.core.validators import MinValueValidator, MaxValueValidator ...@@ -10,6 +10,7 @@ from django.core.validators import MinValueValidator, MaxValueValidator
from cloud.settings import firewall_settings as settings from cloud.settings import firewall_settings as settings
from django.db.models.signals import post_save from django.db.models.signals import post_save
import re import re
import random
class Rule(models.Model): class Rule(models.Model):
CHOICES_type = (('host', 'host'), ('firewall', 'firewall'), CHOICES_type = (('host', 'host'), ('firewall', 'firewall'),
...@@ -174,15 +175,30 @@ class Host(models.Model): ...@@ -174,15 +175,30 @@ class Host(models.Model):
def enable_net(self): def enable_net(self):
self.groups.add(Group.objects.get(name="netezhet")) self.groups.add(Group.objects.get(name="netezhet"))
def add_port(self, proto, public, private = 0): def add_port(self, proto, public=None, private=None):
proto = "tcp" if proto == "tcp" else "udp" proto = "tcp" if proto == "tcp" else "udp"
if self.shared_ip: if self.shared_ip:
used_ports = Rule.objects.filter(host__pub_ipv4=self.pub_ipv4,
nat=True, proto=proto).values_list('dport', flat=True)
if public is None:
public = random.randint(1024, 21000)
if public in used_ports:
for i in range(1024, 21000) + range(24000, 65535):
if i not in used_ports:
public = i
break
else:
raise ValidationError(_("Port %s %s is already in use.") %
(proto, public))
else:
if public < 1024: if public < 1024:
raise ValidationError(_("Only ports above 1024 can be used.")) raise ValidationError(_("Only ports above 1024 can be used."))
for host in Host.objects.filter(pub_ipv4=self.pub_ipv4): if public in used_ports:
if host.rules.filter(nat=True, proto=proto, dport=public):
raise ValidationError(_("Port %s %s is already in use.") % raise ValidationError(_("Port %s %s is already in use.") %
(proto, public)) (proto, public))
rule = Rule(direction='1', owner=self.owner, dport=public, rule = Rule(direction='1', owner=self.owner, dport=public,
proto=proto, nat=True, accept=True, r_type="host", proto=proto, nat=True, accept=True, r_type="host",
nat_dport=private, host=self, foreign_network=VlanGroup. nat_dport=private, host=self, foreign_network=VlanGroup.
...@@ -199,15 +215,58 @@ class Host(models.Model): ...@@ -199,15 +215,58 @@ class Host(models.Model):
rule.full_clean() rule.full_clean()
rule.save() rule.save()
def del_port(self, proto, public): def del_port(self, proto, private):
if self.shared_ip:
self.rules.filter(owner=self.owner, proto=proto, host=self,
nat_dport=private).delete()
else:
self.rules.filter(owner=self.owner, proto=proto, host=self, self.rules.filter(owner=self.owner, proto=proto, host=self,
dport=public).delete() dport=private).delete()
def get_hostname(self, proto):
try:
if proto == 'ipv6':
res = self.record_set.filter(type='AAAA')
elif proto == 'ipv4':
if self.shared_ip:
res = Record.objects.filter(type='A',
address=self.pub_ipv4)
else:
res = self.record_set.filter(type='A')
return unicode(res[0].get_data()['name'])
except:
raise
if self.shared_ip:
return self.pub_ipv4
else:
return self.ipv4
def list_ports(self): def list_ports(self):
return [{'proto': rule.proto, retval = []
'public': rule.dport, for rule in self.rules.filter(owner=self.owner):
'private': rule.nat_dport} for rule in private = rule.nat_dport if self.shared_ip else rule.dport
self.rules.filter(owner=self.owner)] forward = {
'proto': rule.proto,
'private': private,
}
if self.shared_ip:
public4 = rule.dport
public6 = rule.nat_dport
else:
public4 = public6 = rule.dport
if True: # ipv4
forward['ipv4'] = {
'host': self.get_hostname(proto='ipv4'),
'port': public4,
}
if self.ipv6: # ipv6
forward['ipv6'] = {
'host': self.get_hostname(proto='ipv6'),
'port': public6,
}
retval.append(forward)
return retval
def get_fqdn(self): def get_fqdn(self):
return self.hostname + u'.' + unicode(self.vlan.domain) return self.hostname + u'.' + unicode(self.vlan.domain)
......
description "IK Cloud Django Development Server"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 30 30
exec sudo -u cloud /opt/webadmin/cloud/manage.py celery worker --loglevel=info -c 1 -Q local
...@@ -183,6 +183,7 @@ class Browser: ...@@ -183,6 +183,7 @@ class Browser:
def load_committed_cb(self,web_view, frame): def load_committed_cb(self,web_view, frame):
uri = frame.get_uri() uri = frame.get_uri()
print uri
try: try:
self.webview.execute_script('document.getElementsByTagName("a")[0].target="";') self.webview.execute_script('document.getElementsByTagName("a")[0].target="";')
except: except:
...@@ -193,7 +194,7 @@ class Browser: ...@@ -193,7 +194,7 @@ class Browser:
### JS ### JS
self.post_key(self.public_key_b64) self.post_key(self.public_key_b64)
### Parse values and do mounting ### ### Parse values and do mounting ###
elif uri.startswith("https://cloud.ik.bme.hu/?"): elif uri.startswith("https://cloud.ik.bme.hu/home/?"):
if self.mounted != True: if self.mounted != True:
try: try:
uri, params = uri.split('?', 1) uri, params = uri.split('?', 1)
......
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.10.2 (http://cairographics.org)
%%CreationDate: Sun Mar 24 10:50:26 2013
%%Pages: 1
%%BoundingBox: -167 0 256 305
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%EndComments
%%BeginProlog
/cairo_eps_state save def
/dict_count countdictstack def
/op_count count 1 sub def
userdict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%!FontType1-1.1 f-0-0 1.0
11 dict begin
/FontName /f-0-0 def
/PaintType 0 def
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0] readonly def
/FontBBox {0 -217 732 722 } readonly def
/Encoding 256 array
0 1 255 {1 index exch /.notdef put} for
dup 1 /uni004F put
dup 2 /uni0070 put
dup 3 /uni0065 put
dup 4 /uni006E put
dup 5 /uni0020 put
dup 6 /uni0076 put
dup 7 /uni0053 put
dup 8 /uni0077 put
dup 9 /uni0069 put
dup 10 /uni0074 put
dup 11 /uni0063 put
dup 12 /uni0068 put
dup 13 /uni0046 put
dup 14 /uni0072 put
dup 15 /uni0061 put
dup 16 /uni006C put
dup 17 /uni0066 put
dup 18 /uni0032 put
dup 19 /uni004E put
dup 20 /uni006F put
dup 21 /uni006B put
dup 22 /uni0073 put
dup 23 /uni0048 put
dup 24 /uni0064 put
readonly def
currentdict end
currentfile eexec
f983ef0097ece636fb4a96c74d26ab84185f6dfa4a16a7a1c27bbe3f1156aea698df336d20b467
b10e7f33846656653c5ac6962759d3056cbdb3190bac614b984bf5a132dc418192443014ba63de
800d392b6fea026574bb2535fd7bb5338f35bf15a88ea328fdaa49670c7852e3d060f3c5d6b07f
2ef6d0f22646c5d18e19a2ae3ee120390f6dd96f76dcf1e127de5e9299077a00c17c0d71e36e5b
9d5ec58fceda57739a6a4214d4b79d6c48d2784b60c320323c7acddddf34db833cac0cf109f799
69d114a330d372e5c978a66acc84e3fe5557f6240856a013ffaa0199444e5c5036f775eba4a5c5
8cde66cf604b9aca2178431127b8a1ff7ed633a65c04600af5f573483112251caf37e69b8d0603
a7433caedec4b6cd5c2839290152acb74dd5effb7d57b8850958b3abdf0a4d39e16a6b07c2c1e8
3381600e1f450b8272b0341eeb3072bb916526a7cb9a82abadbfe1c8f6a2b6afc2b84a8807b1ec
be55674c4eb5ce1324eebb409d9dabf983d71890f87b46280def494d599f306285593d6f768825
516d58b0d49a558bd33e8b24d9be241990e9c144c9a3e1296e9d9bd12eefee68bcccf0a17ee096
c436f63bd52123610e4560a936ca992843e10f75614f4e1e7c56be71b5e61019eafb4911733e4c
15336b44c25b12d1203b1b01827836e41b036e77bdeae781592e15b8f444475a5db04d92071727
f8358495d966b9ad377d2c47fd7e38865b6a232d6645dbf4ae2afeafec93de7775a48590137600
946f400ef2e98905997574bd6b5fe9e978d07336dcc8125631c3077a2428beb3faed7e1f69cb0e
cd451b457d25db3f7464c91ddac3ae96263a99f242a74ccf177c75f7fcba02c3146ebe9c035d6c
a4f6d12d36999ef48f6f457eb2bb6bea3f7c136dd856ddae1f266404800225f94ab887145c1ed0
75c431a7f2afb7011ae7d14b7d065010f5285f709edd4756266c4a4c2d2021ed9831ab6a610494
66f0b71eb4d21d5fe0fc8e8be78c472bf63dade09a6893bf0c7043c25cf62a8bdcfe3474ba73a1
fec618e3a851e650eec0421d08d6d1877d475d4a86c4acc988682e2ca02a54d2f2ced6e6531e44
d4f21c3916c08b047148e29d4534683653986dc409aea6e5a14707b40d961e242102222ed4423e
da32801d9b53ffc07a5d201d20a13b3bed67fa06f94d65bbf73a003f145f814fcd6ad59de01d5e
ba550c9cb8ec4f065206147338ad76c823728cdaa15ef08ae5bcc366940ed136f05cd25ab367ea
625b2170a2c46db93c135e52833b6e87e75e5e3890d750d667d6f6c50cc14eecb3b027f1e13260
3064da993b9b536619903922b1a4d25e1764fdafa995e234eac44173eac82b0c9f3f7d9f52daa2
6ab437151991a7bc0575736182f436e51d9e2d29790366c834a8bb25d9b9ccd7dfc88b6134feca
de00289b1f7f27d9626a9436d40c7becbe1c6ebb15168d2211747771818fd33bd7c58724f475af
44360d9da68d71e044de4a4dbcd7d4784ce230b355797881b04050801d1946b4b5fb8564fccaaa
7ccbdd7de71a00a21c60b2a6e25547659b178870a5b69f805733763d3b30b95f41baa094076d6f
6cd70cf6dc484348f03297059f02a3c664f7b071d8134dc55dd2df24c017c5d1b896f8ea6ff7b6
c383e55e783ac761d72a4b16916e28a582579b1b36a2dcb49d9e302beb4e4f6450045963813c22
3bf4ef981dabc4bd35b3faa1fc1dc2e70d0a8a4b9191195d3f744876b929c6443e0e717e6d6c78
183094715c8fa012364d8d8a913c13762caa2b86e1677c63d4f4d62e06a241eb603259230c57d1
14aa231320b310e524368c1c7b950be85fee831e0d6956535c2a7c6441b5554547b615d13d1581
6f908ac3263128d401a89e2f4b80dc0a6b3945b11da17111c77618e691b8ca7de529e774349ed2
15a6f5011cc6b76cf7e35b8b94428cd60b38cd24ae388399c100b6429e998868a555e993727acb
39c8d510a2c14f9200b1df8d0f815675ea3d5ae7e307d071bb82eb723381a83d5832a5fa4e8917
fa3bb3afedf147f67d02609313345874cad1b0d20721e01641eec234059356a928ee22d2c585d5
a8dfed763c38d466d98c593d7f1ca8d7e4598397bf177a3978ab707f63ffaf974e7d185c065da8
67da19058eb194dc04feffef536b49b72b2c5c8ec1b56567339b6a543f87fa28c6f6dca0f08ec8
4a194a7517df0437225e8ea1fc5c726b04ab799ce749d5234f8bc700d8f5ee8c3c52264db504be
e28e5e370ba07600f0b48c16eeba51f12e15bfeb9a39109b0e2510545060c7d71f4c8983ade846
7481d16e8af6e1a7935bfcb519f3bb5848eece4648f1a55765b2817cd8b145206921b84cfb6624
24e8917e1f908eb4fb65c7da82872bb30d954d3bbec71c3bba66360b6242e425d26a7c661c7383
a96ba61dd1b3e85e637d93d055d1a3f87c1f2536c8d3de59e1edfb0a916ad6a392533065306560
f80bc88e49758f65d61af48efc244a16b57e7c8c12eb03c4e8b3cd06a74d88f8226b1369975f62
76618bf1ba9988dddf14c3431b485099d87c401b35bc5d12f307feb0cf426466519e6fb3e46d0b
12a1bda1126794b5eaeb79203ef9448a31a6609a2260c8c4e86ad9b508d4ab7e1e2be697bf33d0
8dd750a6bc91713e4a353121fe4f5bb6285f3dcc6a616951c1fed307cef1026470dddfdb36d0c5
c937c320f823fc456d6134142bf1675c63f675431fadd0b3cfee000cc968993ea52291ad5033d0
24ba063e611c3a5211e36c07e1951066c66e1d402189b32e552daf34c9ad87b161dbd3123bc270
a4f4681f49c91e722c091defcbfc7be71b53b26b6fee625ff7a39780b7432e4d869a19ec1b7427
9da64b323874914c4ab47b665b21184dd40eb3ceb9254fc47e726ffaaef9c5aea57dbb50a618c5
68872443aceefbb67b5d2fea44825d5094f977e0c5f2ccee6af63f4d1abee2538982c437c79bda
dd7602d2bdafa2d3a00c328fdb63b499fd1c32b85e210a37b22710938b33114de6dfc5559a3730
7ad6b71803d3730055b141e11e4a30b94adb006e613071ea00dec97c21cb0d914eec828918c143
2474bf84fe05c2e82b2b2db61d0c84ccd3bf221858864a50c501d281beda4a4587bb86a8653027
1e7bf49b40ad69d8660035f84c7c9f50230fcc5e8b2e2ff21241f38a9eedd6c1e0fe15844dc8e2
078e0969aef02cfc9943e53080903b12d3a8f9cf46986c4e62d1c8ce83d93b1a013171bd446d33
ad458c7669fa82b8508e3874bf81f9e507712b560c6f4c04f97e58d1d157ca6cf67e7ddbba13a9
b52c837e5a59d4c007e5e340b0d7919e0bfcb62e7b1640e6db2fef38e3bf2a53e91caf69ce5dc0
58810fa2cde129486c7001437bef99dceb9456752f13405f09bf48302c8fa40db8c9890cb038a3
ef7c29d54247e617f5930346984861bb8f462e706047e8590431833d60457f839a11927aa0a26c
e4754186e095c03fa260a347682e02b408ae140fc62389397410db7dda34bdb8b9551781ce222f
f93950489ce4b8973a5afe9ad2e8c9984073297d4a8d734dcf612b27d014fb19a1e4385e95fc59
66f31aad14b347fd48ba99e8207ffdabc084bc6cec2cb3a68f6ea82742bbb9f7d809530a26f498
e750cf423cbf4961bef4662bda9854375ac902cba9626db4eb362fe3b0574d5e64e7ba7e1ff553
c992cd3e3f169086355bb62c59ed675ca54893b06f8846a7ca57d4392c9eddadcad5c6e192abaa
a700d4e7385c56d2f9de3c4489ac11af7a03f010082d042b725378e59e2a7998dee93a12e21764
7ed96008a6b52e90c16604376976de7b187edceed1261f540a0be3eba806921c0b0c4b353265cc
c3ffafac813f4f8020ab4697c705c68ee1a52f65a2fc4e317470ec340000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark
%!FontType1-1.1 f-1-0 1.0
11 dict begin
/FontName /f-1-0 def
/PaintType 0 def
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0] readonly def
/FontBBox {0 -235 863 727 } readonly def
/Encoding 256 array
0 1 255 {1 index exch /.notdef put} for
dup 1 /uni0056 put
dup 2 /uni004D put
dup 3 /uni0031 put
dup 4 /uni0032 put
dup 5 /uni0057 put
dup 6 /uni006F put
dup 7 /uni0072 put
dup 8 /uni006B put
dup 9 /uni0065 put
dup 10 /uni0020 put
dup 11 /uni0070 put
dup 12 /uni0069 put
dup 13 /uni0076 put
dup 14 /uni0061 put
dup 15 /uni0074 put
dup 16 /uni006D put
dup 17 /uni002D put
dup 18 /uni006E put
dup 19 /uni0075 put
dup 20 /uni006C put
dup 21 /uni0062 put
dup 22 /uni0063 put
dup 23 /uni0073 put
dup 24 /uni0066 put
dup 25 /uni0068 put
dup 26 /uni0077 put
dup 27 /uni0067 put
readonly def
currentdict end
currentfile eexec
f983ef0097ece636fb4a96c74d26ab84185f6dfa4a16a7a1c27bbe3f1156aea698df336d20b467
b10e7f33846656653c5ac6962759d3056cbdb3190bac614b984bf5a132dc418192443014ba63de
800d392b6fea026574bb2535fd7bb5338f35bf15a88ea328fdaa49670c7852e3d060f3c5d6b07f
2ef6d0f22646c5d18e19a2ae3ee120390f6dd96f76dcf1e127de5e9299077a00c17c0d71e36e5b
9d5ec58fceda57739a6a4214d4b79d6c48d2784b60c320323c7acddddf34db833cac0cf109f799
69d114a330d372e5c978a66acc84e3fe5557f6240856a013ffaa0199444e5c5036f775eba4a5c5
8cde66cf604b9aca2178431127b8a1ff7ed633a65c04600af5f573483112251caf38b5733b65e1
ae5ed9ec42ebee256077e561ea069a72fa6ddc3792643c08a3ebdf22fefac7396401f4ef69af60
fb427726673f2a913195b4168b6da17f5c62ad9ca9234569ed4789c4938da69be46e27567df5fb
fed82edf53ce8193c8f6c52a133ff6fc1bf814ee6ff32a0a39480b1a62695ac0f349902e08b28b
30b87515ec5a046d818fba902951bdc40ce6a5dd3a66b1b7dfff5f2afd55dca5531adbcae9137d
46e3ecd4d21bc53ecc83162147486d75ed89a936a308a05a2a9104677217501b181c133376e346
0daaf5a18e4d257148779d9b6636036726b3cb8e7ba849c547b8a5cf52d9f41e192be1c279d659
6c4e350630107d9dd4ff8d8f6f4e0d844bf4229d9276b1cb66dfffc1018cce0b0fcb2fc1d0e5d3
9ca22bed275fb1e3612ac5b63e40d0d63e422bdf6ee71aaef268e1b9f2ba82c687c9766a824df4
0b2d55a13e8d867d4743c6d3877c7452636f59d55b8dc574af9d26550cf2bbdef881807a82a818
8c098e3107157ac844e6a914934db2e9659c56e8e7299024239e087ed70e3b18ea2c07fa30f063
f003357f5291a206ffe749c62d946ce8364d38ce1cb4a9538e0e955123db1a00cbe96b6fcc7011
6c8f489b02f5764d6b87891bb10430e01e152241d5ff1b2ef62efdf6d1db4266f6c3710d6fcc83
a0380bfa8374325cc0eded3e066deb024c6942485387e9168cd6a436493217ff42201c4b9fc17c
222e0944880315e05bac4f5bb918ccd6e4a340a65f82ad3377bb55f1482f1b0612a5f981d41107
cc12406a3325efa64f11512df93d3a72b2f823361fa296dee4bbd4dfc36507e1e6f60f5a9e2096
fec1a0da3be5b1f536c535168c3f2d3091cd03e726b1ea1d49c5082df09932b83331201a2e4452
d374b98820fbed50ee1dd63ccbb3418db11694598b332c5bce04ef6bc6d9c0f31f4c0dfbcbbb3f
66df05e3e5459b8933c5c4875e4b832ad010fcbb7950d45ef26a1d45a44c5087f1de96709339a4
1d9307d6fa8aa8ff83beecf39b9bfcec01eebcc9c8b24403da881a4b57f4a7f2252dd4fdaa9c8c
65ac4da459eb208bfdef142df722a33eceb88f7a7e15cad54bc8dc1bbdad102b6cdffa6fb7ea24
2bc8d86d2ee9b2b695a412f3536976fe0849a3e2bedd5507679759c14667b55278b8c601de1c21
69ee99125bbaefb70783c4543959e5324fed2629e26d96b4d44f029f4e9cd0ba43899b6d240430
4cd0f6d93e4d20d692bc2438b25096ec1171c1929c1741b62002d67c175a06818143817b062947
303ff2ec3fa02dad4981198fe6477286eb7914b7bfa386e5a243729537c1301d1b3294227a6def
73c60d90a374f5cd0a86b2889f83bff714e5aff94082faa4192063e36c60dfaf760b66c5ca0102
d2cabf56324d4a470d9855ab60fccf50838635c0af516a01d23dad80cb1eea34bdeb2f742f2fae
a4dcd7c631cc9dd905babc551c835ac7f5f9062b9cedc015445893b590dbdbd587db693ed53859
ce734fd4eef128482250d1fa86c7f5efcaf375aae07d36a2ee755a6d575be1f876e911fd31c5d6
987752e6faa8ad725cfcc84a0b6e1a9a481956770d8770971b3ff43f3000e26789555ebe49b2a7
afc30705c848cf11801cc4674c797c0aba72b0e22d08e8d93fbdb5be0b6f6e44636dabb517178c
9dfe59ce3c75e5d1e1abb56af86bc8ecd963f385681946c8c95b33ad5cc41550f15fa43a5be3a5
45fbeb4865f702c76fbf5206bd67feb1df779ecd90b000b2bbb0da204772371fdf11466f40abd9
6801a56418d2441a1a74c64e8c900abe4dea56a17a7a22e7ef632f4c73beedf3bb5281a4823586
5a4c26fa4478750315bf01428cdd7f83428c6658883e4dc25d22bf248430caa0b8efff57f71a69
23f8370ec9a7abdde13f17746b26733414221eb964e7a7ae1e73911155a4e79319a5e61e1f4739
6f4dd4246bff9133c38df45635eca056234b02f219df12278a420ebcad359ca35ec166c81ddc7d
bc0f1130409748c2241f14566c3165b430df2e686be46a783bd5e0935b9a098ac5da8bae7a80bb
8df6f0451e1557ddcbd0f3820d89e7855bcf393f57adc576f3cbe7e6c9e912b729dc47c10bfc77
fa9744c608d44c7715263dc76179282a1fcd6c705e360c0c71ad674566e61fd33ce797efafe23d
14177b64e054b313c4d01994bdf1c17dc661579a37fbf409a67769b510be7a12d24c84feee9b06
bfab2f71b46df65b83394fac039f336e15e8ee3c004081e22a127c9e31311962f32d40ae44bef2
f9ed8879ba92445c554a6e653377fb4d167a8dc798ea941dd8b3d46de19c8fa3cec568c18ddb76
27fa3be0a5a86b52f10ba88387a50d1885aa24d8020203ef294ac48e1664544fc27063c8eed829
638de0772b0918b7e6473390f0bef6649639af0523235b44c56fc612950413814114d5d942a5fc
537283cfa90832eb0661a4295c3062e220d8b218a1bf05652b8ccb66edae0e7c60ac1169c68611
7fc908e4ee0520ca8f3f16597c13b05dbb0ca7e50b05e3c63465f3304f0c0cdd9bd7e2cca23158
fec58171c620d94399ca61c0c10b23113f6a3b94c41966d6890030a64174151bda235b3e2fb439
6f7f368a138466847a130e9248992cea57226c068877f942d66fa80d02c103caeda78202b09795
a17af5a01e5da79a724731b2268b144500fa38608b4ed3838198d10d63f2c7ef3b21fe316ba2e2
4685d391512fa0b3fb18dc0ddb751d3053f7f363e150b2ae0b64d389f3c8a61b8825f121ae4f04
2f8b7ad2d45d9399dbeac6a459c3abc8d36546f4f91d6d9480e90b894b5c2ada32148e4e4b425c
96fbe9f655600b3edbc42f2c5aae0c909f4888b5c700993d0e9bb89b4a1e7ea30693848787b00e
0da2d7c6d084a75b3d61875bd158d0374a388e5858368c949bbb1a2dae9ca4da96f844d9a26209
4c1a524960a3a5e96dde86a4d91e3915de07fa3c31d87a7119b7c07aebc0784964972d941ec585
20b5f6ee7eba81aedfda62d2e348e50f6f10d1359a8df51de5268aeb6f06344bdcc0c9594fe9e9
c6f866a911e09fb0a7e7928a57d12b69b9abc8cb87a1d5de27765eb0696aafce6b58655af7175f
f9c6f10e2f376836c8c58a279e14a8f7b04196b67521376104ffe6cb13b93555a3f2a322dce5d8
e5d533388693374347c4acaf56159b724b67eb85e57c7787b69fa12358e9191c4b0db0e6107afc
47fe12eb3fac3a4a6ef73946774d8a30e65ca0ee45ac91cfaa002bf48131a637bae4e8143083ea
de945a8a231406e689a9056814c286d2a816033ff0e659b1f257576a7346b694cfa2e8e4f248cd
b9717c549f062140a660e76d624835287124609b9ddf9021b7976ee5285c64ee9558f2451b60cd
4ac52642be48a4af2c6e3ff13fc5434d0c64e22b874c1188da57894d8123fccbebef6a6aa83f8a
6563204f063d3e21293b54ebc8b2d1d4987619dbe08dd2ee3caca415d185ad0408fb6f07cc5745
9dab0011b42f33d6c2bccf30ce5283e8c2da43c732aa7f67efeb14871da8b934db317d98f96425
50cd12b5b61b904b0acfd03ba7b42870af25ac7f563843678626ac394e734e12678ca05130e081
2c23e085af0e46fbd682f72edee7cb4304151df52c76faa6573af526fccfecbbc1e345ade26ac3
b7e6c318cda32c431e6dc30791e65f6caf70b9e0730a4b0fb588cfa7b5722a06e346bf7b0070ca
fa0dd3194aa675e9a4e51949877e8f7fb576b7804178de23459060d34269530bfa0bd894cf68fe
661161aed7608b6b4a67d2741ff658616c9d8a2b10b2e34897bd11bcd1b8ad26e4c16fe8623bca
fbef473d69707ac27a0f05da69233bd2d37a3fe3a3e1afc106804a76952304e031360235e5c133
7ee4db6291eee67fcea7e0534258cc53045bfc87c177608b5b86ec87f104ab8ca98ff54b5dc936
b999b7fae912f9d17e3014b5883071cf9a1c36397a2a33080e564ad9a083e08f9782663bb113d0
4a12bbd8c8cc8ae3dd34514a65b296b2ebe0347d5532c14ac1da76fab3391d8b1dd07e616c9a05
efaec72b160000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark
%!FontType1-1.1 f-2-0 1.0
11 dict begin
/FontName /f-2-0 def
/PaintType 0 def
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0] readonly def
/FontBBox {0 0 783 718 } readonly def
/Encoding 256 array
0 1 255 {1 index exch /.notdef put} for
dup 1 /uni006E put
dup 2 /uni006B put
dup 3 /uni006D put
readonly def
currentdict end
currentfile eexec
f983ef0097ece636fb4a96c74d26ab84185f6dfa4a16a7a1c27bbe3f1156aea698df336d20b467
b10e7f33846656653c5ac6962759d3056cbdb3190bac614b984bf5a132dc418192443014ba63de
800d392b6fea026574bb2535fd7bb5338f35bf15a88ea328fdaa49670c7852e3d060f3c5d6b07f
2ef6d0f22646c5d18e19a2ae3ee120390f6dd96f76dcf1e127de5e9299077a00c17c0d71e36e5b
9d5ec58fceda57739a6a4214d4b79d6c48d2784b60c320323c7acddddf34db833cac0cf109f799
69d114a330d372e5c978a66acc84e3fe5557f6240856a013ffaa0199444e5c5036f775eba4a5c5
8cde66cf604b9aca2178431127b8a1ff7ed633a65c04600af5f573483112251ca87c5560dc92bb
34e8205b91e6fd735b4ec0f4176689808e820e598074961f6b7d313b858a002fad9cd5b7eb26be
5816d7219c0a42e3d3867b4c0c143f7d89f5a7906d9f4de81c5c3b7a6e410425cccb618988c16c
54024f707a299a545b01d0357f818f466ed9f23ab512d073f83b3caffaff61fae5190354883642
e31b7ce97eb1d208f306ad0817d1aaee5d2d915173573c7963ce9391dee269a3e703626a0fc9ba
d18f42f72c70a0bf330fe9205bb40c969c693088b66e62cbd329954b4e8eded48f9b9f4813d158
8848c14649da3cf26e32148941cb73dbdcc10ede96fd10653edae63a211c08ae22ad3d1f0d3d5c
0dd01b294bab7ff4b86e34833b24556b1518d1fc4db017476b3cf125f3aba75aee298444c91fb0
d4cdd7156fde2011e672643aa6d86b36edfcbf3754aef57a11b016167aa1ec48bc5b2ef4971874
a6ff374b94babae6fc8c55ab80ded38e8babcacd81f2f404843d76e9fbb6e26748c3c6ae0ab965
0604b75124647b0f2c5ddff371a4b25f203e05cf61dcc24e4321820b1a250eb437d7bcdc5d3413
62e72154fde11b5917144f45b17f461c93de37b26f2feedb15791f1871b71de0bd4f5b96e1db95
b3ae6c88c71050c37971976b09111a3a92e22ed89bdc7de7413ef718bf5fd140d1bb882c68de5b
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: -167 0 256 305
%%EndPageSetup
q -167 0 423 305 rectclip q
0 217.706 257 -218 re W n
0.666667 0.8 0.933333 rg
9.602 216.104 m 247.199 216.104 l 251.633 216.104 255.199 212.538
255.199 208.104 c 255.199 34.905 l 255.199 30.475 251.633 26.905
247.199 26.905 c 9.602 26.905 l 5.168 26.905 1.602 30.475 1.602 34.905
c 1.602 208.104 l 1.602 212.538 5.168 216.104 9.602 216.104 c h
9.602 216.104 m f
0.992157 0.792157 0.00392157 rg
3.2 w
0 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
199.957 119.219 m 199.957 96.879 l 165.754 96.879 l 165.754 86.277 l S Q
0.00392157 0.2 0.592157 rg
4.8 w
q 1 0 0 -1 0 217.705566 cm
104.02 79.277 m 104.02 59.676 l 56.316 59.676 l 56.316 47.277 l S Q
0.2 0.6 0 rg
3.2 w
q 1 0 0 -1 0 217.705566 cm
146.535 81.277 m 146.535 61.676 l 189.961 61.676 l 189.961 33.277 l S Q
0.992157 0.792157 0.00392157 rg
q 1 0 0 -1 0 217.705566 cm
199.957 51.879 m 199.957 68.277 l 156.703 68.277 l 156.703 78.879 l S Q
/CairoPattern {
q
Q q
0.596078 0.00392157 0.00392157 rg
0 5149.969 5150.262 -5150.258 re f
0 g
0.363 5150 m 0.363 4306.25 l 844.113 5150 l h
1715.988 5150 m 0.363 3437.5 l 0.363 2587.5 l 2562.863 5150 l h
3431.613 5150 m 0.363 1718.75 l 0.363 868.75 l 4281.613 5150 l h
5150.363 5150 m 0.363 0 l 850.363 0 l 5150.363 4300 l h
5150.363 3431.25 m 1719.113 0 l 2569.113 0 l 5150.363 2581.25 l h
5150.363 1712.5 m 3437.863 0 l 4284.738 0 l 5150.363 865.625 l h
5150.363 1712.5 m f
Q
} bind def
<< /PatternType 1
/PaintType 1
/TilingType 1
/XStep 5150 /YStep 5150
/BBox [0 0 5150 5150]
/PaintProc { CairoPattern }
>>
[ 0.008 0 0 0.008 93.477416 260.392966 ]
makepattern setpattern
4.8 w
1 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
94.402 79.277 m 94.402 67.676 l 46.98 67.676 l 46.98 47.277 l S Q
Q q
0 217.706 257 -218 re W n
0.00392157 0.2 0.592157 rg
127.531 211.569 m 123.68 201.092 l 124.375 201.592 124.66 201.917
125.457 202.12 c 125.457 137.217 l 129.605 137.217 l 129.605 202.143 l
130.395 201.944 130.723 201.596 131.406 201.092 c h
127.531 211.569 m f
0.992157 0.792157 0.00392157 rg
3.2 w
0 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
53.355 116.105 m 53.355 96.879 l 90.355 96.879 l 90.355 86.277 l S Q
0 0.2 0.4 rg
163.309 104.612 m 236.559 104.612 l 240.992 104.612 244.559 101.042
244.559 96.612 c 244.559 46.807 l 244.559 42.374 240.992 38.807 236.559
38.807 c 163.309 38.807 l 158.875 38.807 155.309 42.374 155.309 46.807
c 155.309 96.612 l 155.309 101.042 158.875 104.612 163.309 104.612 c h
163.309 104.612 m f
18.109 104.612 m 91.359 104.612 l 95.793 104.612 99.359 101.042 99.359
96.612 c 99.359 46.807 l 99.359 42.374 95.793 38.807 91.359 38.807 c
18.109 38.807 l 13.676 38.807 10.109 42.374 10.109 46.807 c 10.109
96.612 l 10.109 101.042 13.676 104.612 18.109 104.612 c h
18.109 104.612 m f
0.2 0.6 0 rg
q 1 0 0 -1 0 217.705566 cm
87.766 153.277 m 87.766 133.676 l S Q
0.933333 0.780392 0.243137 rg
q 1 0 0 -1 0 217.705566 cm
232.566 153.277 m 232.566 133.676 l S Q
0.2 0.6 0 rg
q 1 0 0 -1 0 217.705566 cm
188.148 153.277 m 188.148 133.676 l S Q
/CairoPattern {
q
Q q
0.596078 0.00392157 0.00392157 rg
0 5149.969 5150.262 -5150.258 re f
0 g
0.363 5150 m 0.363 4306.25 l 844.113 5150 l h
1715.988 5150 m 0.363 3437.5 l 0.363 2587.5 l 2562.863 5150 l h
3431.613 5150 m 0.363 1718.75 l 0.363 868.75 l 4281.613 5150 l h
5150.363 5150 m 0.363 0 l 850.363 0 l 5150.363 4300 l h
5150.363 3431.25 m 1719.113 0 l 2569.113 0 l 5150.363 2581.25 l h
5150.363 1712.5 m 3437.863 0 l 4284.738 0 l 5150.363 865.625 l h
5150.363 1712.5 m f
Q
} bind def
<< /PatternType 1
/PaintType 1
/TilingType 1
/XStep 5150 /YStep 5150
/BBox [0 0 5150 5150]
/PaintProc { CairoPattern }
>>
[ 0.008 0 0 0.008 93.477416 263.592966 ]
makepattern setpattern
3.2 w
1 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
167.332 144.879 m 167.332 132.477 l S Q
Q q
0 217.706 257 -218 re W n
/CairoPattern {
q
Q q
0.596078 0.00392157 0.00392157 rg
0 5149.969 5150.262 -5150.258 re f
0 g
0.363 5150 m 0.363 4306.25 l 844.113 5150 l h
1715.988 5150 m 0.363 3437.5 l 0.363 2587.5 l 2562.863 5150 l h
3431.613 5150 m 0.363 1718.75 l 0.363 868.75 l 4281.613 5150 l h
5150.363 5150 m 0.363 0 l 850.363 0 l 5150.363 4300 l h
5150.363 3431.25 m 1719.113 0 l 2569.113 0 l 5150.363 2581.25 l h
5150.363 1712.5 m 3437.863 0 l 4284.738 0 l 5150.363 865.625 l h
5150.363 1712.5 m f
Q
} bind def
<< /PatternType 1
/PaintType 1
/TilingType 1
/XStep 5150 /YStep 5150
/BBox [0 0 5150 5150]
/PaintProc { CairoPattern }
>>
[ 0.008 0 0 0.008 93.477416 260.392966 ]
makepattern setpattern
3.2 w
1 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
142.012 85.676 m 142.012 105.277 l 171.332 105.277 l 171.332 133.676 l S Q
Q q
0 217.706 257 -218 re W n
/CairoPattern {
q
Q q
0.596078 0.00392157 0.00392157 rg
0 5149.969 5150.262 -5150.258 re f
0 g
0.363 5150 m 0.363 4306.25 l 844.113 5150 l h
1715.988 5150 m 0.363 3437.5 l 0.363 2587.5 l 2562.863 5150 l h
3431.613 5150 m 0.363 1718.75 l 0.363 868.75 l 4281.613 5150 l h
5150.363 5150 m 0.363 0 l 850.363 0 l 5150.363 4300 l h
5150.363 3431.25 m 1719.113 0 l 2569.113 0 l 5150.363 2581.25 l h
5150.363 1712.5 m 3437.863 0 l 4284.738 0 l 5150.363 865.625 l h
5150.363 1712.5 m f
Q
} bind def
<< /PatternType 1
/PaintType 1
/TilingType 1
/XStep 5150 /YStep 5150
/BBox [0 0 5150 5150]
/PaintProc { CairoPattern }
>>
[ 0.008 0 0 0.008 93.477416 260.392966 ]
makepattern setpattern
3.2 w
1 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
110.629 85.676 m 110.629 105.277 l 85.734 105.277 l 85.734 133.676 l S Q
Q q
0 217.706 257 -218 re W n
0.933333 0.780392 0.243137 rg
3.2 w
0 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
43.348 153.277 m 43.348 133.676 l S Q
0.2 0.6 0 rg
q 1 0 0 -1 0 217.705566 cm
22.148 153.277 m 22.148 133.676 l S Q
1 g
21.379 74.338 m 22.918 74.338 l 26.922 74.338 30.148 70.772 30.148
66.338 c 30.148 50.338 l 30.148 45.909 26.922 42.338 22.918 42.338 c
21.379 42.338 l 17.371 42.338 14.148 45.909 14.148 50.338 c 14.148
66.338 l 14.148 70.772 17.371 74.338 21.379 74.338 c h
21.379 74.338 m f
0 0.2 0.4 rg
0.8 w
0 j
q 1 0 0 -1 0 217.705566 cm
21.379 143.367 m 22.918 143.367 l 26.922 143.367 30.148 146.934 30.148
151.367 c 30.148 167.367 l 30.148 171.797 26.922 175.367 22.918 175.367
c 21.379 175.367 l 17.371 175.367 14.148 171.797 14.148 167.367 c
14.148 151.367 l 14.148 146.934 17.371 143.367 21.379 143.367 c h
21.379 143.367 m S Q
1 g
42.578 74.338 m 44.117 74.338 l 48.121 74.338 51.348 70.772 51.348
66.338 c 51.348 50.338 l 51.348 45.909 48.121 42.338 44.117 42.338 c
42.578 42.338 l 38.57 42.338 35.348 45.909 35.348 50.338 c 35.348
66.338 l 35.348 70.772 38.57 74.338 42.578 74.338 c h
42.578 74.338 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
42.578 143.367 m 44.117 143.367 l 48.121 143.367 51.348 146.934 51.348
151.367 c 51.348 167.367 l 51.348 171.797 48.121 175.367 44.117 175.367
c 42.578 175.367 l 38.57 175.367 35.348 171.797 35.348 167.367 c 35.348
151.367 l 35.348 146.934 38.57 143.367 42.578 143.367 c h
42.578 143.367 m S Q
1 g
86.996 74.338 m 88.535 74.338 l 92.543 74.338 95.766 70.772 95.766
66.338 c 95.766 50.338 l 95.766 45.909 92.543 42.338 88.535 42.338 c
86.996 42.338 l 82.992 42.338 79.766 45.909 79.766 50.338 c 79.766
66.338 l 79.766 70.772 82.992 74.338 86.996 74.338 c h
86.996 74.338 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
86.996 143.367 m 88.535 143.367 l 92.543 143.367 95.766 146.934 95.766
151.367 c 95.766 167.367 l 95.766 171.797 92.543 175.367 88.535 175.367
c 86.996 175.367 l 82.992 175.367 79.766 171.797 79.766 167.367 c
79.766 151.367 l 79.766 146.934 82.992 143.367 86.996 143.367 c h
86.996 143.367 m S Q
1 1 0.6 rg
21.379 91.877 m 88.535 91.877 l 92.543 91.877 95.766 89.03 95.766
85.491 c 95.766 85.209 l 95.766 81.674 92.543 78.827 88.535 78.827 c
21.379 78.827 l 17.371 78.827 14.148 81.674 14.148 85.209 c 14.148
85.491 l 14.148 89.03 17.371 91.877 21.379 91.877 c h
21.379 91.877 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
21.379 125.828 m 88.535 125.828 l 92.543 125.828 95.766 128.676 95.766
132.215 c 95.766 132.496 l 95.766 136.031 92.543 138.879 88.535 138.879
c 21.379 138.879 l 17.371 138.879 14.148 136.031 14.148 132.496 c
14.148 132.215 l 14.148 128.676 17.371 125.828 21.379 125.828 c h
21.379 125.828 m S Q
0 g
BT
11.2 0 0 11.2 21.548527 82.190721 Tm
/f-0-0 1 Tf
[<01>1<02>-1<03>-1<04>-1<05>1<06>-1<07>1<0809>1<0a0b0c>]TJ
ET
BT
0 11.2 -11.2 0 26.044474 48.151267 Tm
/f-1-0 1 Tf
<010203>Tj
ET
BT
0 11.2 -11.2 0 47.244474 47.412058 Tm
/f-1-0 1 Tf
<010204>Tj
ET
BT
0 11.2 -11.2 0 91.663969 46.308885 Tm
/f-1-0 1 Tf
<0102>Tj
ET
BT
0 11.2 -11.2 0 91.663969 62.47451 Tm
/f-2-0 1 Tf
<01>Tj
ET
0 0.2 0.4 rg
18.59 196.053 m 102.59 196.053 l 107.023 196.053 110.59 192.487 110.59
188.053 c 110.59 173.471 l 110.59 169.038 107.023 165.471 102.59
165.471 c 18.59 165.471 l 14.16 165.471 10.59 169.038 10.59 173.471 c
10.59 188.053 l 10.59 192.487 14.16 196.053 18.59 196.053 c h
18.59 196.053 m f
q 1 0 0 -1 0 217.705566 cm
18.59 21.652 m 102.59 21.652 l 107.023 21.652 110.59 25.219 110.59
29.652 c 110.59 44.234 l 110.59 48.668 107.023 52.234 102.59 52.234 c
18.59 52.234 l 14.16 52.234 10.59 48.668 10.59 44.234 c 10.59 29.652 l
10.59 25.219 14.16 21.652 18.59 21.652 c h
18.59 21.652 m S Q
1 g
BT
12.8 0 0 12.8 38.540299 176.276316 Tm
/f-0-0 1 Tf
<0d090e03080f1010>Tj
ET
74.062 61.639 m 75.613 61.639 76.863 60.167 76.863 58.338 c 76.863
56.51 75.613 55.042 74.062 55.042 c 72.512 55.042 71.262 56.51 71.262
58.338 c 71.262 60.167 72.512 61.639 74.062 61.639 c h
74.062 61.639 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
74.062 156.066 m 75.613 156.066 76.863 157.539 76.863 159.367 c 76.863
161.195 75.613 162.664 74.062 162.664 c 72.512 162.664 71.262 161.195
71.262 159.367 c 71.262 157.539 72.512 156.066 74.062 156.066 c h
74.062 156.066 m S Q
1 g
65.555 61.639 m 67.109 61.639 68.355 60.167 68.355 58.338 c 68.355
56.51 67.109 55.042 65.555 55.042 c 64.004 55.042 62.758 56.51 62.758
58.338 c 62.758 60.167 64.004 61.639 65.555 61.639 c h
65.555 61.639 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
65.555 156.066 m 67.109 156.066 68.355 157.539 68.355 159.367 c 68.355
161.195 67.109 162.664 65.555 162.664 c 64.004 162.664 62.758 161.195
62.758 159.367 c 62.758 157.539 64.004 156.066 65.555 156.066 c h
65.555 156.066 m S Q
1 g
57.051 61.639 m 58.602 61.639 59.852 60.167 59.852 58.338 c 59.852
56.51 58.602 55.042 57.051 55.042 c 55.5 55.042 54.25 56.51 54.25
58.338 c 54.25 60.167 55.5 61.639 57.051 61.639 c h
57.051 61.639 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
57.051 156.066 m 58.602 156.066 59.852 157.539 59.852 159.367 c 59.852
161.195 58.602 162.664 57.051 162.664 c 55.5 162.664 54.25 161.195
54.25 159.367 c 54.25 157.539 55.5 156.066 57.051 156.066 c h
57.051 156.066 m S Q
1 g
166.176 74.338 m 167.715 74.338 l 171.723 74.338 174.945 70.772 174.945
66.338 c 174.945 50.338 l 174.945 45.909 171.723 42.338 167.715 42.338
c 166.176 42.338 l 162.172 42.338 158.945 45.909 158.945 50.338 c
158.945 66.338 l 158.945 70.772 162.172 74.338 166.176 74.338 c h
166.176 74.338 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
166.176 143.367 m 167.715 143.367 l 171.723 143.367 174.945 146.934
174.945 151.367 c 174.945 167.367 l 174.945 171.797 171.723 175.367
167.715 175.367 c 166.176 175.367 l 162.172 175.367 158.945 171.797
158.945 167.367 c 158.945 151.367 l 158.945 146.934 162.172 143.367
166.176 143.367 c h
166.176 143.367 m S Q
1 g
219.262 61.639 m 220.812 61.639 222.062 60.167 222.062 58.338 c 222.062
56.51 220.812 55.042 219.262 55.042 c 217.711 55.042 216.461 56.51
216.461 58.338 c 216.461 60.167 217.711 61.639 219.262 61.639 c h
219.262 61.639 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
219.262 156.066 m 220.812 156.066 222.062 157.539 222.062 159.367 c
222.062 161.195 220.812 162.664 219.262 162.664 c 217.711 162.664
216.461 161.195 216.461 159.367 c 216.461 157.539 217.711 156.066
219.262 156.066 c h
219.262 156.066 m S Q
1 g
187.379 74.338 m 188.918 74.338 l 192.922 74.338 196.148 70.772 196.148
66.338 c 196.148 50.338 l 196.148 45.909 192.922 42.338 188.918 42.338
c 187.379 42.338 l 183.371 42.338 180.148 45.909 180.148 50.338 c
180.148 66.338 l 180.148 70.772 183.371 74.338 187.379 74.338 c h
187.379 74.338 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
187.379 143.367 m 188.918 143.367 l 192.922 143.367 196.148 146.934
196.148 151.367 c 196.148 167.367 l 196.148 171.797 192.922 175.367
188.918 175.367 c 187.379 175.367 l 183.371 175.367 180.148 171.797
180.148 167.367 c 180.148 151.367 l 180.148 146.934 183.371 143.367
187.379 143.367 c h
187.379 143.367 m S Q
1 g
210.758 61.639 m 212.309 61.639 213.559 60.167 213.559 58.338 c 213.559
56.51 212.309 55.042 210.758 55.042 c 209.207 55.042 207.957 56.51
207.957 58.338 c 207.957 60.167 209.207 61.639 210.758 61.639 c h
210.758 61.639 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
210.758 156.066 m 212.309 156.066 213.559 157.539 213.559 159.367 c
213.559 161.195 212.309 162.664 210.758 162.664 c 209.207 162.664
207.957 161.195 207.957 159.367 c 207.957 157.539 209.207 156.066
210.758 156.066 c h
210.758 156.066 m S Q
1 g
231.797 74.338 m 233.336 74.338 l 237.34 74.338 240.566 70.772 240.566
66.338 c 240.566 50.338 l 240.566 45.909 237.34 42.338 233.336 42.338 c
231.797 42.338 l 227.793 42.338 224.566 45.909 224.566 50.338 c 224.566
66.338 l 224.566 70.772 227.793 74.338 231.797 74.338 c h
231.797 74.338 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
231.797 143.367 m 233.336 143.367 l 237.34 143.367 240.566 146.934
240.566 151.367 c 240.566 167.367 l 240.566 171.797 237.34 175.367
233.336 175.367 c 231.797 175.367 l 227.793 175.367 224.566 171.797
224.566 167.367 c 224.566 151.367 l 224.566 146.934 227.793 143.367
231.797 143.367 c h
231.797 143.367 m S Q
1 g
202.25 61.639 m 203.805 61.639 205.051 60.167 205.051 58.338 c 205.051
56.51 203.805 55.042 202.25 55.042 c 200.699 55.042 199.453 56.51
199.453 58.338 c 199.453 60.167 200.699 61.639 202.25 61.639 c h
202.25 61.639 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
202.25 156.066 m 203.805 156.066 205.051 157.539 205.051 159.367 c
205.051 161.195 203.805 162.664 202.25 162.664 c 200.699 162.664
199.453 161.195 199.453 159.367 c 199.453 157.539 200.699 156.066
202.25 156.066 c h
202.25 156.066 m S Q
1 1 0.6 rg
166.176 91.877 m 233.336 91.877 l 237.34 91.877 240.566 89.03 240.566
85.491 c 240.566 85.209 l 240.566 81.674 237.34 78.827 233.336 78.827 c
166.176 78.827 l 162.172 78.827 158.945 81.674 158.945 85.209 c 158.945
85.491 l 158.945 89.03 162.172 91.877 166.176 91.877 c h
166.176 91.877 m f
0 0.2 0.4 rg
q 1 0 0 -1 0 217.705566 cm
166.176 125.828 m 233.336 125.828 l 237.34 125.828 240.566 128.676
240.566 132.215 c 240.566 132.496 l 240.566 136.031 237.34 138.879
233.336 138.879 c 166.176 138.879 l 162.172 138.879 158.945 136.031
158.945 132.496 c 158.945 132.215 l 158.945 128.676 162.172 125.828
166.176 125.828 c h
166.176 125.828 m S Q
1 g
BT
12.8 0 0 12.8 174.42349 93.828221 Tm
/f-1-0 1 Tf
[<050607>1<08>1<09>-1<070a>]TJ
ET
BT
12.8 0 0 12.8 217.64849 93.828221 Tm
/f-2-0 1 Tf
<02>Tj
ET
0 g
BT
11.2 0 0 11.2 166.348514 82.190721 Tm
/f-0-0 1 Tf
[<01>1<02>-1<03>-1<04>-1<05>1<06>-1<07>1<0809>1<0a0b0c>]TJ
ET
0 0.2 0.4 rg
BT
0 11.2 -11.2 0 170.017753 49.408836 Tm
/f-0-0 1 Tf
<110812>Tj
ET
0 g
BT
0 11.2 -11.2 0 236.463993 44.634471 Tm
/f-1-0 1 Tf
<0102>Tj
ET
BT
0 11.2 -11.2 0 236.463993 60.800096 Tm
/f-2-0 1 Tf
<03>Tj
ET
0 0.2 0.4 rg
111.848 70.409 m 113.398 70.409 114.648 68.936 114.648 67.108 c 114.648
65.28 113.398 63.807 111.848 63.807 c 110.297 63.807 109.047 65.28
109.047 67.108 c 109.047 68.936 110.297 70.409 111.848 70.409 c h
111.848 70.409 m f
127.133 70.409 m 128.684 70.409 129.934 68.936 129.934 67.108 c 129.934
65.28 128.684 63.807 127.133 63.807 c 125.582 63.807 124.332 65.28
124.332 67.108 c 124.332 68.936 125.582 70.409 127.133 70.409 c h
127.133 70.409 m f
142.422 70.409 m 143.973 70.409 145.219 68.936 145.219 67.108 c 145.219
65.28 143.973 63.807 142.422 63.807 c 140.871 63.807 139.621 65.28
139.621 67.108 c 139.621 68.936 140.871 70.409 142.422 70.409 c h
142.422 70.409 m f
1 g
BT
12.8 0 0 12.8 30.66348 93.828221 Tm
/f-1-0 1 Tf
[<050607>1<08>1<09>-1<070a>1<03>]TJ
ET
0 g
BT
0 11.2 -11.2 0 192.044486 47.412058 Tm
/f-1-0 1 Tf
<010204>Tj
ET
/CairoPattern {
q
Q q
0.596078 0.00392157 0.00392157 rg
0 5149.969 5150.262 -5150.258 re f
0 g
0.363 5150 m 0.363 4306.25 l 844.113 5150 l h
1715.988 5150 m 0.363 3437.5 l 0.363 2587.5 l 2562.863 5150 l h
3431.613 5150 m 0.363 1718.75 l 0.363 868.75 l 4281.613 5150 l h
5150.363 5150 m 0.363 0 l 850.363 0 l 5150.363 4300 l h
5150.363 3431.25 m 1719.113 0 l 2569.113 0 l 5150.363 2581.25 l h
5150.363 1712.5 m 3437.863 0 l 4284.738 0 l 5150.363 865.625 l h
5150.363 1712.5 m f
Q
} bind def
<< /PatternType 1
/PaintType 1
/TilingType 1
/XStep 5150 /YStep 5150
/BBox [0 0 5150 5150]
/PaintProc { CairoPattern }
>>
[ 0.008 0 0 0.008 93.477416 260.392966 ]
makepattern setpattern
172.68 136.092 m 171.844 136.053 171.117 135.256 171.156 134.417 c
171.195 133.581 171.992 132.854 172.832 132.893 c 243.129 132.893 l
243.977 132.881 244.754 133.647 244.754 134.495 c 244.754 135.338
243.977 136.104 243.129 136.092 c 172.832 136.092 l 172.781 136.096
172.73 136.096 172.68 136.092 c h
249.535 134.526 m 239.059 138.374 l 239.559 137.678 239.883 136.901
240.086 136.104 c 157.668 136.417 157.742 132.909 240.109 132.909 c
239.91 132.12 239.562 131.334 239.059 130.651 c h
249.535 134.526 m f
Q q
0 217.706 257 -218 re W n
1 1 0.6 rg
88.379 141.03 m 166.285 141.03 l 170.293 141.03 173.516 138.182 173.516
134.647 c 173.516 134.366 l 173.516 130.827 170.293 127.979 166.285
127.979 c 88.379 127.979 l 84.375 127.979 81.148 130.827 81.148 134.366
c 81.148 134.647 l 81.148 138.182 84.375 141.03 88.379 141.03 c h
88.379 141.03 m f
0 0.2 0.4 rg
0.8 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
88.379 76.676 m 166.285 76.676 l 170.293 76.676 173.516 79.523 173.516
83.059 c 173.516 83.34 l 173.516 86.879 170.293 89.727 166.285 89.727 c
88.379 89.727 l 84.375 89.727 81.148 86.879 81.148 83.34 c 81.148
83.059 l 81.148 79.523 84.375 76.676 88.379 76.676 c h
88.379 76.676 m S Q
0 g
BT
11.2 0 0 11.2 89.266974 130.579929 Tm
/f-0-0 1 Tf
[<1303>-1<0a>-1<0814>1<0e>1<150516>1<0809>1<0a0b0c>]TJ
ET
0 0.2 0.4 rg
151.391 196.053 m 235.391 196.053 l 239.824 196.053 243.391 192.487
243.391 188.053 c 243.391 173.471 l 243.391 169.038 239.824 165.471
235.391 165.471 c 151.391 165.471 l 146.961 165.471 143.391 169.038
143.391 173.471 c 143.391 188.053 l 143.391 192.487 146.961 196.053
151.391 196.053 c h
151.391 196.053 m f
q 1 0 0 -1 0 217.705566 cm
151.391 21.652 m 235.391 21.652 l 239.824 21.652 243.391 25.219 243.391
29.652 c 243.391 44.234 l 243.391 48.668 239.824 52.234 235.391 52.234
c 151.391 52.234 l 146.961 52.234 143.391 48.668 143.391 44.234 c
143.391 29.652 l 143.391 25.219 146.961 21.652 151.391 21.652 c h
151.391 21.652 m S Q
1 g
BT
12.8 0 0 12.8 163.433988 176.353123 Tm
/f-0-0 1 Tf
[<1703>-1<0f>1<18>-1<05>1<04>-1<14>1<18>-1<03>]TJ
ET
0.2 0.6 0 rg
BT
8 0 0 8 203.652254 14.833708 Tm
/f-1-0 1 Tf
[<0b>-1<070c0d0e0f09>-1<0a>1<0d>-1<10>1<111209>-1<0f>]TJ
ET
0.596078 0.988235 0.4 rg
199.852 16.745 m 184.051 16.745 l f
0.933333 0.780392 0.243137 rg
4.8 w
1 j
q 1 0 0 -1 0 217.705566 cm
199.852 200.961 m 184.051 200.961 l S Q
0.00392157 0.133333 0.392157 rg
BT
8 0 0 8 111.342377 3.376001 Tm
/f-1-0 1 Tf
[<0c12>-1<0f09>-1<07>1<12>-1<09>-1<0f0a>1<130b>-1<140c>-1<1208>]TJ
ET
0.00392157 0.2 0.592157 rg
4.8 w
q 1 0 0 -1 0 217.705566 cm
107.496 212.344 m 91.695 212.344 l S Q
0.00392157 0.352941 0.00392157 rg
BT
8 0 0 8 111.294379 15.497829 Tm
/f-1-0 1 Tf
[<0b>-1<1315140c16>-1<0a>1<0d>-1<10>1<11>1<12>-1<09>-1<0f>]TJ
ET
0.2 0.6 0 rg
107.496 17.483 m 91.695 17.483 l f
4.8 w
q 1 0 0 -1 0 217.705566 cm
107.496 200.223 m 91.695 200.223 l S Q
0.596078 0.00392157 0.00392157 rg
BT
6.4 0 0 6.4 221.453568 145.33115 Tm
/f-1-0 1 Tf
[<07>1<09>-1<170f0a>1<06180a>1<0f1909>]TJ
ET
BT
6.4 0 0 6.4 227.241068 138.93115 Tm
/f-1-0 1 Tf
[<1209>-1<0f>-1<1a0607>1<08>]TJ
ET
/CairoPattern {
q
Q q
0.596078 0.00392157 0.00392157 rg
0 5149.969 5150.262 -5150.258 re f
0 g
0.363 5150 m 0.363 4306.25 l 844.113 5150 l h
1715.988 5150 m 0.363 3437.5 l 0.363 2587.5 l 2562.863 5150 l h
3431.613 5150 m 0.363 1718.75 l 0.363 868.75 l 4281.613 5150 l h
5150.363 5150 m 0.363 0 l 850.363 0 l 5150.363 4300 l h
5150.363 3431.25 m 1719.113 0 l 2569.113 0 l 5150.363 2581.25 l h
5150.363 1712.5 m 3437.863 0 l 4284.738 0 l 5150.363 865.625 l h
5150.363 1712.5 m f
Q
} bind def
<< /PatternType 1
/PaintType 1
/TilingType 1
/XStep 5150 /YStep 5150
/BBox [0 0 5150 5150]
/PaintProc { CairoPattern }
>>
[ 0.008 0 0 0.008 -166.6779 183.662582 ]
makepattern setpattern
4.8 w
0 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
19.801 200.223 m 4 200.223 l S Q
Q q
0 217.706 257 -218 re W n
0.596078 0.00392157 0.00392157 rg
BT
8 0 0 8 23.60001 15.497837 Tm
/f-1-0 1 Tf
[<10>1<13140f0c>-1<0b>-1<1409>-1<0a>1<0d>-1<140e>1<12>-1<17>]TJ
ET
0.992157 0.792157 0.00392157 rg
4.8 w
0 J
1 j
[] 0.0 d
4 M q 1 0 0 -1 0 217.705566 cm
19.801 211.949 m 4 211.949 l S Q
0.984314 0.545098 0 rg
BT
8 0 0 8 23.60001 3.896001 Tm
/f-1-0 1 Tf
[<10>1<0e120e1b>1<09>-1<100912>-1<0f>]TJ
ET
Q Q
showpage
%%Trailer
count op_count sub {pop} repeat
countdictstack dict_count sub {end} repeat
cairo_eps_state restore
%%EOF
<?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="321"
height="272.13196"
id="svg7426"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="netarch.svg">
<defs
id="defs7428">
<pattern
patternTransform="translate(289.13949,427.25293)"
id="pattern7424"
xlink:href="#pattern7199"
inkscape:collect="always" />
<pattern
patternTransform="translate(289.13949,427.25293)"
id="pattern7422"
xlink:href="#pattern7199"
inkscape:collect="always" />
<pattern
patternTransform="translate(289.13949,427.25293)"
id="pattern7420"
xlink:href="#pattern7199"
inkscape:collect="always" />
<pattern
patternTransform="translate(289.13949,427.25293)"
id="pattern7418"
xlink:href="#pattern7199"
inkscape:collect="always" />
<pattern
patternTransform="translate(289.13949,427.25293)"
id="pattern7416"
xlink:href="#pattern7199"
inkscape:collect="always" />
<pattern
patternUnits="userSpaceOnUse"
width="51.503632"
height="51.502907"
patternTransform="translate(135.90262,558.90625)"
id="pattern7199">
<g
id="g7195"
transform="translate(-135.90262,-558.90625)">
<rect
style="fill:#980101;fill-opacity:1;stroke:none"
id="rect7101"
width="51.502602"
height="51.502602"
x="135.90262"
y="558.90656" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 135.90625,558.90625 0,8.4375 8.4375,-8.4375 -8.4375,0 z m 17.15625,0 -17.15625,17.125 0,8.5 25.625,-25.625 -8.46875,0 z m 17.15625,0 -34.3125,34.3125 0,8.5 42.8125,-42.8125 -8.5,0 z m 17.1875,0 -51.5,51.5 8.5,0 43,-43 0,-8.5 z m 0,17.1875 -34.3125,34.3125 8.5,0 25.8125,-25.8125 0,-8.5 z m 0,17.1875 -17.125,17.125 8.46875,0 8.65625,-8.65625 0,-8.46875 z"
id="rect7169"
inkscape:connector-curvature="0" />
</g>
</pattern>
<pattern
patternUnits="userSpaceOnUse"
width="51.503632"
height="51.502907"
patternTransform="translate(135.90262,558.90625)"
id="pattern7285">
<g
id="g7287"
transform="translate(-135.90262,-558.90625)">
<rect
style="fill:#980101;fill-opacity:1;stroke:none"
id="rect7289"
width="51.502602"
height="51.502602"
x="135.90262"
y="558.90656" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 135.90625,558.90625 0,8.4375 8.4375,-8.4375 -8.4375,0 z m 17.15625,0 -17.15625,17.125 0,8.5 25.625,-25.625 -8.46875,0 z m 17.15625,0 -34.3125,34.3125 0,8.5 42.8125,-42.8125 -8.5,0 z m 17.1875,0 -51.5,51.5 8.5,0 43,-43 0,-8.5 z m 0,17.1875 -34.3125,34.3125 8.5,0 25.8125,-25.8125 0,-8.5 z m 0,17.1875 -17.125,17.125 8.46875,0 8.65625,-8.65625 0,-8.46875 z"
id="path7291"
inkscape:connector-curvature="0" />
</g>
</pattern>
<pattern
patternUnits="userSpaceOnUse"
width="51.503632"
height="51.502907"
patternTransform="translate(135.90262,558.90625)"
id="pattern7293">
<g
id="g7295"
transform="translate(-135.90262,-558.90625)">
<rect
style="fill:#980101;fill-opacity:1;stroke:none"
id="rect7297"
width="51.502602"
height="51.502602"
x="135.90262"
y="558.90656" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 135.90625,558.90625 0,8.4375 8.4375,-8.4375 -8.4375,0 z m 17.15625,0 -17.15625,17.125 0,8.5 25.625,-25.625 -8.46875,0 z m 17.15625,0 -34.3125,34.3125 0,8.5 42.8125,-42.8125 -8.5,0 z m 17.1875,0 -51.5,51.5 8.5,0 43,-43 0,-8.5 z m 0,17.1875 -34.3125,34.3125 8.5,0 25.8125,-25.8125 0,-8.5 z m 0,17.1875 -17.125,17.125 8.46875,0 8.65625,-8.65625 0,-8.46875 z"
id="path7299"
inkscape:connector-curvature="0" />
</g>
</pattern>
<pattern
patternUnits="userSpaceOnUse"
width="51.503632"
height="51.502907"
patternTransform="translate(135.90262,558.90625)"
id="pattern7301">
<g
id="g7303"
transform="translate(-135.90262,-558.90625)">
<rect
style="fill:#980101;fill-opacity:1;stroke:none"
id="rect7305"
width="51.502602"
height="51.502602"
x="135.90262"
y="558.90656" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 135.90625,558.90625 0,8.4375 8.4375,-8.4375 -8.4375,0 z m 17.15625,0 -17.15625,17.125 0,8.5 25.625,-25.625 -8.46875,0 z m 17.15625,0 -34.3125,34.3125 0,8.5 42.8125,-42.8125 -8.5,0 z m 17.1875,0 -51.5,51.5 8.5,0 43,-43 0,-8.5 z m 0,17.1875 -34.3125,34.3125 8.5,0 25.8125,-25.8125 0,-8.5 z m 0,17.1875 -17.125,17.125 8.46875,0 8.65625,-8.65625 0,-8.46875 z"
id="path7307"
inkscape:connector-curvature="0" />
</g>
</pattern>
<pattern
inkscape:collect="always"
xlink:href="#pattern7199"
id="pattern7215"
patternTransform="translate(289.13949,423.25293)" />
<pattern
patternUnits="userSpaceOnUse"
width="51.503632"
height="51.502907"
patternTransform="translate(135.90262,558.90625)"
id="pattern7310">
<g
id="g7312"
transform="translate(-135.90262,-558.90625)">
<rect
style="fill:#980101;fill-opacity:1;stroke:none"
id="rect7314"
width="51.502602"
height="51.502602"
x="135.90262"
y="558.90656" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 135.90625,558.90625 0,8.4375 8.4375,-8.4375 -8.4375,0 z m 17.15625,0 -17.15625,17.125 0,8.5 25.625,-25.625 -8.46875,0 z m 17.15625,0 -34.3125,34.3125 0,8.5 42.8125,-42.8125 -8.5,0 z m 17.1875,0 -51.5,51.5 8.5,0 43,-43 0,-8.5 z m 0,17.1875 -34.3125,34.3125 8.5,0 25.8125,-25.8125 0,-8.5 z m 0,17.1875 -17.125,17.125 8.46875,0 8.65625,-8.65625 0,-8.46875 z"
id="path7316"
inkscape:connector-curvature="0" />
</g>
</pattern>
<pattern
patternUnits="userSpaceOnUse"
width="51.503632"
height="51.502907"
patternTransform="translate(135.90262,558.90625)"
id="pattern7318">
<g
id="g7320"
transform="translate(-135.90262,-558.90625)">
<rect
style="fill:#980101;fill-opacity:1;stroke:none"
id="rect7322"
width="51.502602"
height="51.502602"
x="135.90262"
y="558.90656" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 135.90625,558.90625 0,8.4375 8.4375,-8.4375 -8.4375,0 z m 17.15625,0 -17.15625,17.125 0,8.5 25.625,-25.625 -8.46875,0 z m 17.15625,0 -34.3125,34.3125 0,8.5 42.8125,-42.8125 -8.5,0 z m 17.1875,0 -51.5,51.5 8.5,0 43,-43 0,-8.5 z m 0,17.1875 -34.3125,34.3125 8.5,0 25.8125,-25.8125 0,-8.5 z m 0,17.1875 -17.125,17.125 8.46875,0 8.65625,-8.65625 0,-8.46875 z"
id="path7324"
inkscape:connector-curvature="0" />
</g>
</pattern>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="146.48789"
inkscape:cy="152.44658"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="2"
fit-margin-left="2"
fit-margin-right="2"
fit-margin-bottom="2"
inkscape:window-width="1364"
inkscape:window-height="749"
inkscape:window-x="0"
inkscape:window-y="17"
inkscape:window-maximized="0" />
<metadata
id="metadata7431">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="1. réteg"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-172.29272,-532.11218)">
<rect
rx="10"
ry="10"
y="534.11218"
x="174.29272"
height="236.5"
width="317"
id="rect3277"
style="fill:#aaccee;fill-opacity:1;stroke:none"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
style="fill:none;stroke:#fdca01;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 422.23687,681.13348 0,-27.92462 -42.75,0 0,-13.25"
id="path6921"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
style="fill:none;stroke:#013397;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m 302.31845,631.20886 0,-24.5 -59.63172,0 0,-15.5"
id="path6965"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
id="path6933"
style="fill:none;stroke:#339900;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m 355.464,633.70886 0,-24.5 54.27996,0 0,-35.5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
inkscape:connector-curvature="0"
id="path6931"
d="m 422.23687,596.95886 0,20.5 -54.06371,0 0,13.25"
style="fill:none;stroke:#fdca01;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:nodetypes="cccc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path6915"
d="m 290.29763,631.20886 0,-14.5 -59.27816,0 0,-25.5"
style="fill:none;stroke:url(#pattern7416);stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<g
transform="translate(153.23688,-131.65332)"
id="g6901"
style="fill:#013397"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160">
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#013397;fill-opacity:1;stroke:none;stroke-width:3.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
d="m 178.46875,671.4375 -4.8125,13.09375 c 0.87048,-0.62476 1.22466,-1.03015 2.21875,-1.28125 l 0,79.125 0,2 5.1875,0 0,-2 0,-79.15625 c 0.98809,0.25008 1.39557,0.68376 2.25,1.3125 z"
id="path5703"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
</g>
<path
inkscape:connector-curvature="0"
id="path6923"
d="m 238.98688,677.24439 0,-24.03553 46.24999,0 0,-13.25"
style="fill:none;stroke:#fdca01;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:nodetypes="cccc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="10"
rx="10"
y="673.47992"
x="366.42722"
height="82.257217"
width="111.56497"
id="rect3427"
style="fill:#003366;fill-opacity:1;stroke:none" />
<rect
style="fill:#003366;fill-opacity:1;stroke:none"
id="rect3279"
width="111.56497"
height="82.257217"
x="184.92722"
y="673.47992"
rx="10"
ry="10" />
<path
id="path6939"
style="fill:none;stroke:#339900;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m 282.00069,723.70886 0,-24.5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
id="path6937"
style="fill:none;stroke:#eec73e;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m 463.00069,723.70886 0,-24.5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
d="m 407.47631,723.70886 0,-24.5"
style="fill:none;stroke:#339900;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="path6935"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path5699"
d="m 381.45969,713.20886 0,-15.5"
style="fill:none;stroke:url(#pattern7215);stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
style="fill:none;stroke:url(#pattern7418);stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m 349.80715,639.20886 0,24.5 36.65254,0 0,35.5"
id="path5695"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path3391"
d="m 310.5767,639.20886 0,24.5 -31.11701,0 0,35.5"
style="fill:none;stroke:url(#pattern7420);stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
d="m 226.47632,723.70886 0,-24.5"
style="fill:none;stroke:#eec73e;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="path6941"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<path
id="path6943"
style="fill:none;stroke:#339900;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m 199.97632,723.70886 0,-24.5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3145"
width="20"
height="40"
x="189.97632"
y="711.31952"
rx="9.0380001"
ry="10"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="10"
rx="9.0380001"
y="711.31952"
x="216.47632"
height="40"
width="20"
id="rect3283"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3285"
width="20"
height="40"
x="272.0007"
y="711.31952"
rx="9.0380001"
ry="10"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="7.9791846"
rx="9.0380001"
y="689.39923"
x="189.97632"
height="16.311922"
width="102.02439"
id="rect3287"
style="fill:#ffff99;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<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="199.22838"
y="701.50574"
id="text3289"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
sodipodi:role="line"
id="tspan3291"
x="199.22838"
y="701.50574"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold">Open vSwitch</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:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
x="-744.05505"
y="204.84831"
id="text3293"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
sodipodi:role="line"
id="tspan3295"
x="-744.05505"
y="204.84831"
style="font-size:14px">VM1</tspan></text>
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text3297"
y="231.34831"
x="-744.97906"
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:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
style="font-size:14px"
y="231.34831"
x="-744.97906"
id="tspan3299"
sodipodi:role="line">VM2</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:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
x="-746.35803"
y="286.87268"
id="text3301"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
sodipodi:role="line"
id="tspan3303"
x="-746.35803"
y="286.87268"
style="font-size:14px"><tspan
style="font-style:italic"
id="tspan3445"><tspan
style="font-style:normal"
id="tspan3451">VM</tspan>n</tspan></tspan></text>
<rect
style="fill:#003366;fill-opacity:1;stroke:#003366"
id="rect3331"
width="125"
height="38.23027"
x="185.53172"
y="559.1756"
rx="10"
ry="10"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<text
sodipodi:linespacing="125%"
id="text3337"
y="583.89874"
x="220.46809"
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:#ffffff;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/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
style="font-size:16px;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"
y="583.89874"
x="220.46809"
id="tspan3339"
sodipodi:role="line">Firewall</tspan></text>
<rect
ry="5"
rx="5"
y="727.19452"
x="261.3696"
height="8.2499437"
width="7.0000029"
id="rect3341"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3343"
width="7.0000029"
height="8.2499437"
x="250.73851"
y="727.19452"
rx="5"
ry="5"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="5"
rx="5"
y="727.19452"
x="240.10741"
height="8.2499437"
width="7.0000029"
id="rect3345"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="10"
rx="9.0380001"
y="711.31952"
x="370.97632"
height="40"
width="20"
id="rect3349"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3429"
width="7.0000029"
height="8.2499437"
x="442.8696"
y="727.19452"
rx="5"
ry="5"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3351"
width="20"
height="40"
x="397.47632"
y="711.31952"
rx="9.0380001"
ry="10"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="5"
rx="5"
y="727.19452"
x="432.23853"
height="8.2499437"
width="7.0000029"
id="rect3431"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="10"
rx="9.0380001"
y="711.31952"
x="453.0007"
height="40"
width="20"
id="rect3353"
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#003366"
id="rect3433"
width="7.0000029"
height="8.2499437"
x="421.60742"
y="727.19452"
rx="5"
ry="5"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#ffff99;fill-opacity:1;stroke:#003366"
id="rect3355"
width="102.02439"
height="16.311922"
x="370.97632"
y="689.39923"
rx="9.0380001"
ry="7.9791846"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<text
y="686.95886"
x="390.32208"
inkscape:export-ydpi="160.46001"
inkscape:export-xdpi="160.46001"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
sodipodi:linespacing="125%"
id="text3435"
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"><tspan
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"
id="tspan3437">Worker <tspan
style="font-style:italic"
id="tspan7038">k</tspan></tspan></text>
<text
sodipodi:linespacing="125%"
id="text3357"
y="701.50574"
x="380.22836"
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/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold"
y="701.50574"
x="380.22836"
id="tspan3359"
sodipodi:role="line">Open vSwitch</tspan></text>
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text3361"
y="384.81491"
x="-742.48309"
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:#003366;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/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
style="font-size:14px;font-weight:600;fill:#003366;fill-opacity:1;-inkscape-font-specification:TitilliumText25L Semi-Bold"
y="384.81491"
x="-742.48309"
id="tspan3363"
sodipodi:role="line">fw2</tspan></text>
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text3369"
y="467.87271"
x="-748.45105"
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:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
xml:space="preserve"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
style="font-size:14px"
y="467.87271"
x="-748.45105"
id="tspan3371"
sodipodi:role="line"><tspan
style="font-style:italic"
id="tspan3447"><tspan
style="font-style:normal"
id="tspan3449">VM</tspan>m</tspan></tspan></text>
<rect
style="fill:#003366;fill-opacity:1;stroke:none"
id="rect3383"
width="7.0000029"
height="8.2499437"
x="308.60095"
y="716.23358"
rx="5"
ry="5"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
ry="5"
rx="5"
y="716.23358"
x="327.70972"
height="8.2499437"
width="7.0000029"
id="rect3385"
style="fill:#003366;fill-opacity:1;stroke:none"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<rect
style="fill:#003366;fill-opacity:1;stroke:none"
id="rect3387"
width="7.0000029"
height="8.2499437"
x="346.81848"
y="716.23358"
rx="5"
ry="5"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<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="text3393"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
x="210.62207"
y="686.95886"><tspan
id="tspan3397"
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">Worker 1</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:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
x="-744.97906"
y="412.34833"
id="text3453"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
sodipodi:role="line"
id="tspan3455"
x="-744.97906"
y="412.34833"
style="font-size:14px">VM2</tspan></text>
<path
inkscape:connector-curvature="0"
id="path7043"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#pattern7422);fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
d="m 388.14312,634.12793 a 2.0021961,2.0021961 0 1 0 0.1875,4 l 87.875,0 a 2.0002,2.0002 0 1 0 0,-4 l -87.875,0 a 2.0002,2.0002 0 0 0 -0.1875,0 z m 96.06785,1.9604 -13.09375,-4.8125 c 0.62476,0.87048 1.03015,1.84338 1.28125,2.83747 -103.01969,-0.38797 -102.9282,3.99426 0.0313,3.99426 -0.25008,0.98809 -0.68376,1.97009 -1.3125,2.82452 z"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<g
transform="translate(153.23688,-131.65332)"
id="g7245">
<rect
ry="7.9791846"
rx="9.0380001"
y="759.60956"
x="120.49311"
height="16.311922"
width="115.45942"
id="rect3307"
style="fill:#ffff99;fill-opacity:1;stroke:#003366" />
<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="130.63956"
y="772.67255"
id="text3309"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3311"
x="130.63956"
y="772.67255"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold">Network switch</tspan></text>
</g>
<rect
ry="10"
rx="10"
y="559.1756"
x="351.53171"
height="38.23027"
width="125"
id="rect6925"
style="fill:#003366;fill-opacity:1;stroke:#003366"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<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:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="376.58521"
y="583.80273"
id="text6927"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
sodipodi:role="line"
id="tspan6929"
x="376.58521"
y="583.80273"
style="font-size:16px;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">Head node</tspan></text>
<g
id="g3112"
transform="translate(-100.12884,60.708106)">
<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:#339900;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="526.98688"
y="724.9939"
id="text6971"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6973"
x="526.98688"
y="724.9939"
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#339900;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">private vm-net</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6975"
d="m 522.23687,722.60386 -19.75,0"
style="fill:#98fc66;stroke:#eec73e;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
<g
id="g3137"
transform="translate(-19.911224,-8)">
<g
transform="translate(-195.66496,46.815274)"
id="g3122">
<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:#012264;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="527.04688"
y="761.20886"
id="text6911"
sodipodi:linespacing="125%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
sodipodi:role="line"
id="tspan6913"
x="527.04688"
y="761.20886"
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#012264;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">internet uplink</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6959"
d="m 522.23687,758.72886 -19.75,0"
style="fill:none;stroke:#013397;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
</g>
<g
transform="translate(-195.66496,85.850489)"
id="g3107">
<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:#015a01;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="526.98688"
y="707.02136"
id="text6985"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6987"
x="526.98688"
y="707.02136"
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#015a01;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">public vm-net</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6989"
d="m 522.23687,704.54136 -19.75,0"
style="fill:#339900;stroke:#339900;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:100%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#980101;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="484.95343"
y="622.5802"
id="text7055"
sodipodi:linespacing="100%"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
id="tspan7059"
sodipodi:role="line"
x="484.95343"
y="622.5802"
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:100%;text-anchor:end;fill:#980101;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">rest of the</tspan><tspan
id="tspan7063"
sodipodi:role="line"
x="484.95343"
y="630.5802"
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:100%;text-anchor:end;fill:#980101;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">network</tspan></text>
<g
id="g3127"
transform="translate(3.1053246,-8)">
<g
transform="translate(-328.29947,103.91298)"
id="g3102">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path6977"
d="m 522.23687,686.47886 -19.75,0"
style="fill:none;stroke:url(#pattern7424);stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160" />
<text
sodipodi:linespacing="125%"
id="text6991"
y="688.95886"
x="526.98688"
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:#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/netarch.png"
inkscape:export-xdpi="160"
inkscape:export-ydpi="160"><tspan
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#980101;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
y="688.95886"
x="526.98688"
id="tspan6993"
sodipodi:role="line">multiple vlans</tspan></text>
</g>
<g
transform="translate(-328.29947,64.38024)"
id="g3117">
<path
style="fill:none;stroke:#fdca01;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 522.23687,740.66636 -19.75,0"
id="path6957"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<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:#fb8b00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="526.98688"
y="742.9939"
id="text7077"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan7079"
x="526.98688"
y="742.9939"
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#fb8b00;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L">management</tspan></text>
</g>
</g>
</g>
</svg>
@inproceedings{younge2011analysis,
title={Analysis of virtualization technologies for high performance computing environments},
author={Younge, Andrew J and Henschel, Robert and Brown, James T and von Laszewski, Gregor and Qiu, Judy and Fox, Geoffrey C},
booktitle={Cloud Computing (CLOUD), 2011 IEEE International Conference on},
pages={9--16},
year={2011},
organization={IEEE}
}
@article{creasy1981origin,
title={The origin of the VM/370 time-sharing system},
author={Creasy, Robert J.},
journal={IBM Journal of Research and Development},
volume={25},
number={5},
pages={483--490},
year={1981},
publisher={IBM}
}
@article{duatonew,
title={A New Approach to rCUDA},
author={Duato, Jos{\'e} and Pena, Antonio J and Silla, Federico and Fern{\'a}ndez, Juan C and Mayo, Rafael and Quintana-Ort{\i}, Enrique S}
}
@book{holovaty2009definitive,
title={The Definitive Guide to Django: Web Development Done Right},
author={Holovaty, Adrian and Kaplan-Moss, Jacob},
year={2009},
publisher={Apress}
}
@techreport{pinzari2003introduction,
title={Introduction to NX technology},
author={Pinzari, Gian Filippo},
year={2003},
institution={NoMachine Technical Report 309}
}
@article{victoria2009creating,
title={Creating and Controlling KVM Guests using libvirt},
author={Victoria, B},
journal={University of Victoria},
year={2009}
}
@inproceedings{bolte2010non,
title={Non-intrusive virtualization management using libvirt},
author={Bolte, Matthias and Sievers, Michael and Birkenheuer, Georg and Nieh{\"o}rster, Oliver and Brinkmann, Andr{\'e}},
booktitle={Proceedings of the Conference on Design, Automation and Test in Europe},
pages={574--579},
year={2010},
organization={European Design and Automation Association}
}
@article{pfaff2009extending,
title={Extending networking into the virtualization layer},
author={Pfaff, Ben and Pettit, Justin and Koponen, Teemu and Amidon, Keith and Casado, Martin and Shenker, Scott},
journal={Proc. HotNets (October 2009)},
year={2009}
}
@article{hoskins2006sshfs,
title={Sshfs: super easy file access over ssh},
author={Hoskins, Matthew E},
journal={Linux Journal},
volume={2006},
number={146},
pages={4},
year={2006},
publisher={Belltown Media}
}
@article{szeredi2010fuse,
title={FUSE: Filesystem in userspace},
author={M. Szeredi},
journal={Accessed on},
year={2010}
}
@inproceedings{yang2012implementation,
title={On implementation of GPU virtualization using PCI pass-through},
author={Yang, Chao-Tung and Wang, Hsien-Yi and Ou, Wei-Shen and Liu, Yu-Tso and Hsu, Ching-Hsien},
booktitle={Cloud Computing Technology and Science (CloudCom), 2012 IEEE 4th International Conference on},
pages={711--716},
year={2012},
organization={IEEE}
}
@inproceedings{duato2011enabling,
title={Enabling CUDA acceleration within virtual machines using rCUDA},
author={Duato, Jos{\'e} and Pena, Antonio J and Silla, Federico and Fern{\'a}ndez, Juan C and Mayo, Rafael and Quintana-Orti, ES},
booktitle={High Performance Computing (HiPC), 2011 18th International Conference on},
pages={1--10},
year={2011},
organization={IEEE}
}
@inproceedings{callaghan2002nfs,
title={Nfs over rdma},
author={Callaghan, Brent and Lingutla-Raj, Theresa and Chiu, Alex and Staubach, Peter and Asad, Omer},
booktitle={Proceedings of ACM SIGCOMM Summer 2003 NICELI Workshop},
year={2002}
}
@article{vinoski2006advanced,
title={Advanced message queuing protocol},
author={Vinoski, Steve},
journal={Internet Computing, IEEE},
volume={10},
number={6},
pages={87--89},
year={2006},
publisher={IEEE}
}
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
% %
\documentclass{llncs} \documentclass{llncs}
% %
\usepackage{makeidx} % allows for indexgeneration \usepackage{graphicx}
%\usepackage{makeidx} % allows for indexgeneration
% %
\begin{document} \begin{document}
% %
...@@ -30,440 +31,141 @@ Scientific Computing} ...@@ -30,440 +31,141 @@ Scientific Computing}
\maketitle % typeset the title of the contribution \maketitle % typeset the title of the contribution
\begin{abstract} \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 Nowadays more and more general purpose workstations installed in a student laboratory have a 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 technological development.
computing power. In most cases the utilization of these resources is low, and 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 are to a resource pool, and can be used like ordinary cloud resources. Our solution leverages the advantages of HTCondor and OpenNebula systems.
limited to lecture hours. The concept of utility computing plays an important 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 the computing power of GPUs as well, using the needed amount of unused machines.
role in nowadays technological development. As part of utility computing, cloud Our pilot infrastructure consists of a high performance cluster of 7 compute nodes with a sum of 76 physical cores and 304 GiB memory,
computing offers greater flexibility and responsiveness to ICT users at lower and 28 workstations with dual-core CPUs and dedicated graphics cards. Altogether we can use 10,752 CUDA cores through the network.
cost.
In  this paper, we introduce a cloud management system which enables the \keywords{Cloud, GPGPU, Grid, HTC, Utility computing}
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} \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}
% \section{Introduction}
\begin{proposition} In universities there is a huge demand for high performance computing, but the smaller research groups can not afford buying a supercomputer or a large compute cluster. However significant unused computing capacity has been concentrated in the student laboratories. Most of our student labs have quite new PCs with modern multi-core CPUs and high performance graphics cards. The total computing performance of the laboratory resources could be significant. The open questions are: a) how can we collect and use these resources; b) what is the time limit of the usage; c) what happens if one or more jobs are not finishing at the given time slot; d) what management software and management rules are needed to support the various software environments which must be flexible and on demand.
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 In this paper we are investigating these problems and we introduce a solution based on a new approach. We show that the cloud technology, based on hardware accelerated virtualization, can be the right answer to these questions. First of all the management of the cloud based systems are easier and they are more flexible. According to the literature\cite{younge2011analysis} and our experiences the modern virtualization has minimal overhead compared with the native systems and has more advantages than disadvantages.
$\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}
% Our basic idea is to run only a minimal host operating system on the bare metal and virtualize everything else. In this manner we can easily solve the questions raised up. We do not need a time consuming cloning process for the configuration management. We can save the ongoing scientific computing process at any time, and we can restore and continue it even on another host machine. One can say, yes, these goals are solved already by various cloud management systems in corporate environment. So what is the novum on this?
\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} The main difference between the corporate cloud infrastructure running 24/7 and our laboratory environment is that the corporate infrastructure is used only for serving the virtual machines. However, functions of our student laboratory are twofold: 1) During the scheduled lab exercises, the workstations act as a cloud host which serves only the virtual machines owned by the student sitting in front of the workstation or act as a simple cloud client. 2) While the lab is not used for teaching, the workstations are acting as a normal cloud host running computing intensive jobs like a normal HTCondor executing machine.
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.} Our solution, CIRCLE (Cloud Infrastructure for Research and Computer Labs in Education) is not only harnessing the idle CPU cycles for scientific computing, but it provides
The first results on subharmonics were an easy and flexible web-portal for the usage and the management as well. The user can easily manage their virtual machines and access the files stored on the online storage. Nevertheless the lecturers can easily customise a new virtual machine image and share this image with the students. In this way all the students have the same and clean learning environment which enables to concentrate on the real task.
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}) In the following sections we present the applied technologies and components used in our pilot system.
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.
% \section{Virtualization}
% ---- Bibliography ---- Most IaaS (infrastructure as a service) cloud systems are based on virtual machines. Although the technique has been available since the end of 1960's\cite{creasy1981origin}, widespread adoption of x86 based systems in the server segment made it almost entirely disappear. Later some vendors started implementing different software based solutions for virtualizing operating systems or even emulating CPUs. The renaissance of virtualization began with manufacturers extending the x86 instruction set to support low-overhead virtualization. This extension is known as Intel VT-x or AMD-V.
%
\begin{thebibliography}{5} Current popular techniques are operating system virtualization and full hardware accelerated virtualization. The former typically takes shape in chroot environments and in namespacing of some kernel resources. This does not even allow running different kernels, nor different kinds of operating systems. The latest technique is full hardware accelerated virtualization, which is based on the CPU support for isolating the concurrently running instances. This approach is normally extended with paravirtualized device drivers, which eliminate the need for emulating real world storage and network controllers.
%
\bibitem {clar:eke} Hardware accelerated virtualization requires CPU support, but this is only missing currently on the low-end product line of the main x86 CPU manufacturers: some models of Intel Atom, Celeron, and Pentium. This hardware acceleration provides a near-native performance in HPC applications.\cite{younge2011analysis}
Clarke, F., Ekeland, I.:
Nonlinear oscillations and Currently there are more competing full virtualization solutions, the most notable free ones are KVM and XEN. At the time of our decision, the installation of a XEN hypervisor required modifications to the Linux kernel, and this was unacceptable for us. This is no longer the case, but we are satisfied with KVM.
boundary-value problems for Hamiltonian systems.
Arch. Rat. Mech. Anal. 78, 315--333 (1982) Additionally, we use all KVM functions through the libvirt library, which provides an abstract interface for managing virtual machines.\cite{victoria2009creating} This has the benefit of theoretically flawless migration to other hypervisors like XEN, ESXi, or Hyper-V.\cite{bolte2010non}
\bibitem {clar:eke:2} Physically accessible computers are normally used with directly attached devices like display and keyboard. These devices are also emulated by KVM, and you can access virtual machines' consoles via the VNC protocol. This is useful for installing the operating system or troubleshooting, but Windows and Linux both provide better alternatives for remote access.
Clarke, F., Ekeland, I.:
Solutions p\'{e}riodiques, du We use remote desktop protocol for accessing Windows hosts, and secure shell (SSH) for text-based Linux machines. Remote graphical login to X11 servers has always been available, but this is not reliable even on local network connections because it is stateless. We use instead NoMachine NX\cite{pinzari2003introduction}.
p\'{e}riode donn\'{e}e, des \'{e}quations hamiltoniennes.
Note CRAS Paris 287, 1013--1015 (1978) \section{Networking}
Most virtual machines in a cloud must have a network connection. On the physical layer, our KVM hypervisor gives us a virtual network interface controller, which is an emulated or paravirtualized NIC on the side of the guest operating system, and a virtual NIC on the host side.
\bibitem {mich:tar}
Michalek, R., Tarantello, G.: Virtual machines are connected to virtual networks provided by manageable virtual switches (Figure~\ref{fig:figure1}). The Open vSwitch.\cite{pfaff2009extending}, what we are using, is a high performance multi-layer virtual switch with VLAN, QoS and OpenFlow support, merged into the mainline Linux kernel.
Subharmonic solutions with prescribed minimal
period for nonautonomous Hamiltonian systems. Virtual networks do not necessarily differ from physical ones in the upper layers. The most important different condition is the frequency of changes. Our system in traditional physical networks' point of view is like if someone changed the cabling hundred times in the middle of the day. The developed CIRCLE networking module consists of an iptables gateway, a tinydns name server and an ISC DHCP server. All of these are configured through remote procedure calls, and managed by a relational database backed object model.
J. Diff. Eq. 72, 28--55 (1988)
Our solution groups the VMs to two main groups. The public vm-net is for machines which provide public services to more people, the private vm-net is for those which are used only by one or two persons. Public vm-net machines have public IPv4 and IPv6 addresses, and are protected with a simple ipset-based input filter. On the private vm-net, machines have private IPv4 and public IPv6 addresses. The primary remote connection is reached by automatically configured IPv4 port forward, or directly on the IPv6 address. As connecting to the standard port is a more comfortable solution, users who load our web portal from an IPv6 connection, get a hostname with public AAAA and private A records. If the user has no IPv6 connection, we display a common hostname with a single A record, and a custom port number. As IPv6 is widely available in the central infrastructure of our university, IPv6-capable clients are in majority. Users can open more ports, which means enabling incoming connections, and setting up IPv4 port forwarding in the background.
\bibitem {tar}
Tarantello, G.: \begin{figure}[ht]
Subharmonic solutions for Hamiltonian \begin{minipage}[b]{0.5\linewidth}
systems via a $\bbbz_{p}$ pseudoindex theory. \centering
Annali di Matematica Pura (to appear) \includegraphics[width=\textwidth]{netarch}
\caption{The structure of the network}
\bibitem {rab} \label{fig:figure1}
Rabinowitz, P.: \end{minipage}
On subharmonic solutions of a Hamiltonian system. \hspace{0.5cm}
Comm. Pure Appl. Math. 33, 609--633 (1980) \begin{minipage}[b]{0.4\linewidth}
\centering
\end{thebibliography} \includegraphics[width=\textwidth]{swarch}
\caption{Technologies used for CIRCLE}
\label{fig:figure2}
\end{minipage}
\end{figure}
\section{Storage}
Virtual machines' hard drives are provided to the hypervisors as read-write NFS shares managed by OpenNebula. Our cluster has a legacy InfiniBand SDR network, which is despite its age much faster than the gigabit Ethernet network. InfiniBand has its own data-link protocol, and Linux has mainline support for remote direct memory access (RDMA) over it , which provides near-local access times and no CPU load.\cite{callaghan2002nfs} Unfortunately this kernel module causes random cluster-wide kernel panics, which is unacceptable in a production system. We decided to use NFS4 over IP over InfiniBand, which also provided near-local timing. One problem remained: intensive random writes made the local file access on the NFS server slow (both with RDMA and IP over IB). Switching to the deadline scheduler solved this.
Disk images are stored in qcow2 (QEMU copy on write) format, which allows images with large free space to be stored in a smaller file, and also supports copy-on-write differential images. The latter feature is used for virtual machines, which eliminates the need of copying the whole base image file before launching a new instance. Saving a template consists of merging the base and differential images to a single one.
Since our usual virtual machines have temporary disks there is common need for a permanent online storage that can be easily accessed. It allows the user to use the same resources on different virtual computers or even at home, and it helps sharing data between virtual machines and local computers on a simple interface.
Our solution---CIRCLE File Server---is a multi-protocol file server, which runs on a virtual machine. Every user gets an amount of disk space, which is automatically mounted on our prepared appliances.
Windows VMs access the storage over SMB/CIFS. The authentication is handled by CIRCLE with automatically generated passwords. For security reasons we do not allow SMB access outside vm-net.
Linux guests mount the remote files with SSHFS\cite{hoskins2006sshfs}, a userspace SSH/SFTP virtual file system. For virtual machines the manager automatically generates key-pairs. SFTP service is also accessible over the internet. Users can set public keys on the web portal and immediately access their folder.
It is also possible to manage files on the cloud portal with an AJAX based web interface. Its backend consists of a Celery worker and an Nginx httpd.
\section{Putting it together}
The main goal was to give a self-service interface to our researchers, lecturers, and students.
Cloud management frameworks like OpenNebula and OpenStack promise this, but after learning and deploying OpenNebula, we found even its Self-Service portal's abstraction level too low.
Our solution is a new cloud management system, called CIRCLE, built up from various open source software components(figure~\ref{fig:figure2}). It provides an attractive web interface where users can do themselves all the common tasks including launching and managing/controlling virtual machines, creating templates based on other ones, and sharing templates with groups of users.
This cloud management system is based on Django\cite{holovaty2009definitive}. This popular Python framework gives us among other things a flexible object-relational mapping system. Although the Django framework is originally designed for web applications, the business logic is not at all web specific. That's why it is easy to provide command line or remote procedure call interfaces to the model.
As the primary interface is web, which is in some aspect a soft real-time system, the model can not use synchronous calls to external resources, nor execute system commands. This is the reason why all remote procedure calls are done asynchronously through a standard task queue. Our choice is the Celery distributed task queue. This is the most popular among such systems, which are integrated with Django. Celery is configured to use an implementation of AMQP\cite{vinoski2006advanced} protocol---called RabbitMQ---as its message broker.
Celery workers set up the netfilter firewall, the domain name and DHCP services, the IP blacklist, execute file server operations, and also communicate with OpenNebula. This distributed solution makes it possible to dynamically alter the subsystems.
In the opposite direction, some subsystems notify others of their state transitions through Celery. Based on this information further Celery tasks are submitted, and the models are updated.
CIRCLE manages the full state space of the resources. Some of it is also stored by the underlying OpenNebula, but most of this redundant information is bound to its initial value as OpenNebula does not handle changes in meta information. This behavior arises of design decisions, and is not expected to be improved. The thin slice of OpenNebula used by our system is continuously shrinking, and we intend dropping OpenNebula in favor of direct bindings to libvirt and the also considerably customized storage and network hooks.
\section{Execution on workstations}
The cloud system at our institute takes a big role in education and in general R{\&}D infrastructure, but there is a significant demand for high-throughput scientific computing. This kind of requirement usually appears in form of many long-running, independent jobs. On most parts of the world there is no fund to build dedicated HPC clusters with enough resources for these jobs.
The highest load on the cloud takes place in the office hours and the evenings, in more than half of the time we have many free resources, so it is possible to run these jobs on low priority virtual machines in the cloud. If interactive load is increasing, we can even suspend these machines, and resume them later.
Running scientific batch jobs on student laboratory computers also has a long history. Our idea is to run some of these jobs on virtual machines in the computer laboratories overnight and on weekends. We can suspend in the morning all virtual machines to a memory image, and resume on the same or some other hypervisor next evening. This solution makes it possible to run individual jobs virtually continuously through months or a year, without any specific efforts. This result is important because of our observation that the runtime of similar jobs have a high standard deviation, and it also protects against losing the partial result of months long computations in case of hardware or power failure. HTCondor has a similar result with its checkpoint support, but it needs to modify the software, which is often impossible or sometimes the users are not able to do this modification by themselves.
To be able to resume suspended machines, we have to copy back the differential image and the memory dump. Our choice for this is rsync.
The lab network is exposed to unauthorized access, so we have to limit access to confidential material. As a physically accessible general purpose workstation does not currently have a way to reliably authenticate itself to a server, nor to protect the stored data, we can not employ any solution against these attacks other than security through obscurity and not using these systems for any confidential executions.
Another important aspect is energy efficiency. We have successfully used HTCondor to automatically turn on and off the compute nodes of a HPC cluster. This is also working with Wake on LAN and SSH on the workstations.
\section{GPUs in the cloud}
The most significant HPC performance in our student laboratories is provided by the mid-level GPUs in all the workstations used for teaching computer graphics. There is a technology we applied successfully to use GPGPUs from the dedicated clusters' virtual machines: PCI passthrough.\cite{yang2012implementation} However, this technology requires both CPU and motherboard support of IOMMU, which is a high-end feature nowadays. The implementations are called Intel VT-d and AMD-Vi technologies, and they appear in the server- and high-end workstation segments.
As none of our laboratory computers support IOMMU, we have to find a different solution. The first one is using rCUDA, which is a small framework making it possible to run the host and device side of a CUDA program on different hosts, communicating over TCP/IP or InfiniBand network.\cite{duato2011enabling} With this, we can launch user-prepared virtual machines on each host, and run the device code via local (virtio-based) network on the hypervisor. rCUDA is also capable to serve more clients with a single device. This is useful if the host code uses the GPU only part time.
The other option is using directly the host machine to execute GPGPU jobs. This is a simpler approach, but necessarily involves a more complicated scheduler. Our choice for this type of problems is HTCondor, which can manage this scenario without much customization. The disadvantage is that the user can not customize the host-side operating system.
\section{Conclusions and future plans}
Our cloud system is built up in a modular manner. We have implemented all the main modules which enabled us to set up a production system. The system is now used as an integral part of our teaching activity, and also hosts several server functions for our department to use. At the time of writing this paper, there are 70 running and 54 suspended machines, using 109GiB of memory and producing not more than 3{\%} cummulated host cpu load on the cluster. In the first two months' production run, more than 1500 virtual machines have been launched by 125 users.
The students found the system useful and lecturers use it with pleasure because they can really set up a new lab exercise in minutes. The feedback from the users is absolutely positive, which encourages us to proceed and extend our system with the GPGPU module. We are working on making it fully functional, and releasing the whole system in an easily deployable and highly modular open source package. We are planning to finish the current development phase until the end of August.
\emph{We thank to the other members of the developer team: D\'aniel Bach, Bence D\'anyi, and \'Ad\'am Dud\'as. }
\bibliographystyle{splncs}
\bibliography{proceedings}
\end{document} \end{document}
% BibTeX bibliography style `splncs'
% An attempt to match the bibliography style required for use with
% numbered references in Springer Verlag's "Lecture Notes in Computer
% Science" series. (See Springer's documentation for llncs.sty for
% more details of the suggested reference format.) Note that this
% file will not work for author-year style citations.
% Use \documentclass{llncs} and \bibliographystyle{splncs}, and cite
% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text.
% Copyright (C) 1999 Jason Noble.
% Last updated: Friday 07 March 2006, 08:04:42 Frank Holzwarth, Springer
%
% Based on the BibTeX standard bibliography style `unsrt'
ENTRY
{ address
author
booktitle
chapter
edition
editor
howpublished
institution
journal
key
month
note
number
organization
pages
publisher
school
series
title
type
volume
year
}
{}
{ label }
INTEGERS { output.state before.all mid.sentence after.sentence
after.block after.authors between.elements}
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
#4 'after.authors :=
#5 'between.elements :=
}
STRINGS { s t }
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ " " * write$ }
{ output.state after.block =
{ add.period$ write$
newline$
"\newblock " write$
}
{
output.state after.authors =
{ ": " * write$
newline$
"\newblock " write$
}
{ output.state between.elements =
{ ", " * write$ }
{ output.state before.all =
'write$
{ add.period$ " " * write$ }
if$
}
if$
}
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output}
{ duplicate$ empty$
'pop$
'output.nonnull
if$
}
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
FUNCTION {output.bibitem}
{ newline$
"\bibitem{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
FUNCTION {fin.entry}
{ write$
newline$
}
FUNCTION {new.block}
{ output.state before.all =
'skip$
{ after.block 'output.state := }
if$
}
FUNCTION {stupid.colon}
{ after.authors 'output.state := }
FUNCTION {insert.comma}
{ output.state before.all =
'skip$
{ between.elements 'output.state := }
if$
}
FUNCTION {new.sentence}
{ output.state after.block =
'skip$
{ output.state before.all =
'skip$
{ after.sentence 'output.state := }
if$
}
if$
}
FUNCTION {not}
{ { #0 }
{ #1 }
if$
}
FUNCTION {and}
{ 'skip$
{ pop$ #0 }
if$
}
FUNCTION {or}
{ { pop$ #1 }
'skip$
if$
}
FUNCTION {new.block.checka}
{ empty$
'skip$
'new.block
if$
}
FUNCTION {new.block.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.block
if$
}
FUNCTION {new.sentence.checka}
{ empty$
'skip$
'new.sentence
if$
}
FUNCTION {new.sentence.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.sentence
if$
}
FUNCTION {field.or.null}
{ duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
FUNCTION {emphasize}
{ duplicate$ empty$
{ pop$ "" }
{ "" swap$ * "" * }
if$
}
FUNCTION {bold}
{ duplicate$ empty$
{ pop$ "" }
{ "\textbf{" swap$ * "}" * }
if$
}
FUNCTION {parens}
{ duplicate$ empty$
{ pop$ "" }
{ "(" swap$ * ")" * }
if$
}
INTEGERS { nameptr namesleft numnames }
FUNCTION {format.springer.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{vv~}{ll}{, jj}{, f{.}.}" format.name$ 't :=
nameptr #1 >
{ namesleft #1 >
{ ", " * t * }
{ numnames #1 >
{ ", " * }
'skip$
if$
t "others" =
{ " et~al." * }
{ "" * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=
nameptr #1 >
{ namesleft #1 >
{ ", " * t * }
{ numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " et~al." * }
{ " \& " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {format.authors}
{ author empty$
{ "" }
{ author format.springer.names }
if$
}
FUNCTION {format.editors}
{ editor empty$
{ "" }
{ editor format.springer.names
editor num.names$ #1 >
{ ", eds." * }
{ ", ed." * }
if$
}
if$
}
FUNCTION {format.title}
{ title empty$
{ "" }
{ title "t" change.case$ }
if$
}
FUNCTION {n.dashify}
{ 't :=
""
{ t empty$ not }
{ t #1 #1 substring$ "-" =
{ t #1 #2 substring$ "--" = not
{ "--" *
t #2 global.max$ substring$ 't :=
}
{ { t #1 #1 substring$ "-" = }
{ "-" *
t #2 global.max$ substring$ 't :=
}
while$
}
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
if$
}
while$
}
FUNCTION {format.date}
{ year empty$
{ month empty$
{ "" }
{ "there's a month but no year in " cite$ * warning$
month
}
if$
}
{ month empty$
'year
{ month " " * year * }
if$
}
if$
}
FUNCTION {format.btitle}
{ title emphasize
}
FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
{ "~" }
{ " " }
if$
swap$ * *
}
FUNCTION {either.or.check}
{ empty$
'pop$
{ "can't use both " swap$ * " fields in " * cite$ * warning$ }
if$
}
FUNCTION {format.bvolume}
{ volume empty$
{ "" }
{ "Volume" volume tie.or.space.connect
series empty$
'skip$
{ " of " * series emphasize * }
if$
add.period$
"volume and number" number either.or.check
}
if$
}
FUNCTION {format.number.series}
{ volume empty$
{ number empty$
{ series field.or.null }
{ output.state mid.sentence =
{ "number" }
{ "Number" }
if$
number tie.or.space.connect
series empty$
{ "there's a number but no series in " cite$ * warning$ }
{ " in " * series * }
if$
}
if$
}
{ "" }
if$
}
FUNCTION {format.edition}
{ edition empty$
{ "" }
{ output.state mid.sentence =
{ edition "l" change.case$ " edn." * }
{ edition "t" change.case$ " edn." * }
if$
}
if$
}
INTEGERS { multiresult }
FUNCTION {multi.page.check}
{ 't :=
#0 'multiresult :=
{ multiresult not
t empty$ not
and
}
{ t #1 #1 substring$
duplicate$ "-" =
swap$ duplicate$ "," =
swap$ "+" =
or or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
while$
multiresult
}
FUNCTION {format.pages}
{ pages empty$
{ "" }
{ pages multi.page.check
{ "" pages n.dashify tie.or.space.connect }
{ "" pages tie.or.space.connect }
if$
}
if$
}
FUNCTION {format.vol}
{ volume bold
}
FUNCTION {format.vol.num}
{ volume bold
number empty$
{ }
{ number "(" swap$ * * ")" * }
if$
}
FUNCTION {pre.format.pages}
{ pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ " " * pages n.dashify * }
if$
}
if$
}
FUNCTION {format.chapter.pages}
{ chapter empty$
'format.pages
{ type empty$
{ "chapter" }
{ type "l" change.case$ }
if$
chapter tie.or.space.connect
pages empty$
'skip$
{ " " * format.pages * }
if$
}
if$
}
FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
{ "" }
{ editor empty$
{ "In: " booktitle emphasize * }
{ "In " format.editors * ": " * booktitle emphasize * }
if$
}
if$
}
FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
month empty$ year empty$ note empty$
and and and and and
{ "all relevant fields are empty in " cite$ * warning$ }
'skip$
if$
}
FUNCTION {format.thesis.type}
{ type empty$
'skip$
{ pop$
type "t" change.case$
}
if$
}
FUNCTION {format.tr.number}
{ type empty$
{ "Technical Report" }
'type
if$
number empty$
{ "t" change.case$ }
{ number tie.or.space.connect }
if$
}
FUNCTION {format.article.crossref}
{ key empty$
{ journal empty$
{ "need key or journal for " cite$ * " to crossref " * crossref *
warning$
""
}
{ "In {\em " journal * "\/}" * }
if$
}
{ "In " key * }
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.crossref.editor}
{ editor #1 "{vv~}{ll}" format.name$
editor num.names$ duplicate$
#2 >
{ pop$ " et~al." * }
{ #2 <
'skip$
{ editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{ " et~al." * }
{ " and " * editor #2 "{vv~}{ll}" format.name$ * }
if$
}
if$
}
if$
}
FUNCTION {format.book.crossref}
{ volume empty$
{ "empty volume in " cite$ * "'s crossref of " * crossref * warning$
"In "
}
{ "Volume" volume tie.or.space.connect
" of " *
}
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.incoll.inproc.crossref}
{ editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ booktitle empty$
{ "need editor, key, or booktitle for " cite$ * " to crossref " *
crossref * warning$
""
}
{ "" }
if$
}
{ "" }
if$
}
{ "" }
if$
" \cite{" * crossref * "}" *
}
FUNCTION {and.the.note}
{ note output
note empty$
'skip$
{ add.period$ }
if$
}
FUNCTION {article}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
new.block
crossref missing$
{ journal emphasize "journal" output.check
format.vol.num output
format.date parens output
format.pages output
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
and.the.note
fin.entry
}
FUNCTION {book}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check }
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
stupid.colon
format.btitle "title" output.check
new.sentence
crossref missing$
{ format.edition output
format.bvolume output
new.block
format.number.series output
new.sentence
publisher "publisher" output.check
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
}
{ format.book.crossref output.nonnull
}
if$
and.the.note
fin.entry
}
FUNCTION {booklet}
{ output.bibitem
format.authors output
stupid.colon
format.title "title" output.check
howpublished address new.block.checkb
howpublished output
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
and.the.note
fin.entry
}
FUNCTION {inbook}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check }
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
stupid.colon
crossref missing$
{ chapter output
new.block
format.number.series output
new.sentence
"In:" output
format.btitle "title" output.check
new.sentence
format.edition output
format.bvolume output
publisher "publisher" output.check
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
}
{ chapter output
new.block
format.incoll.inproc.crossref output.nonnull
}
if$
format.pages output
and.the.note
fin.entry
}
FUNCTION {incollection}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
new.sentence
format.bvolume output
format.number.series output
new.block
format.edition output
publisher "publisher" output.check
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
format.pages output
}
{ format.incoll.inproc.crossref output.nonnull
format.chapter.pages output
}
if$
and.the.note
fin.entry
}
FUNCTION {inproceedings}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
new.sentence
format.bvolume output
format.number.series output
address empty$
{ organization publisher new.sentence.checkb
organization empty$
'skip$
{ insert.comma }
if$
organization output
publisher empty$
'skip$
{ insert.comma }
if$
publisher output
format.date parens output
}
{ insert.comma
address output.nonnull
organization empty$
'skip$
{ insert.comma }
if$
organization output
publisher empty$
'skip$
{ insert.comma }
if$
publisher output
format.date parens output
}
if$
}
{ format.incoll.inproc.crossref output.nonnull
}
if$
format.pages output
and.the.note
fin.entry
}
FUNCTION {conference} { inproceedings }
FUNCTION {manual}
{ output.bibitem
author empty$
{ organization empty$
'skip$
{ organization output.nonnull
address output
}
if$
}
{ format.authors output.nonnull }
if$
stupid.colon
format.btitle "title" output.check
author empty$
{ organization empty$
{ address new.block.checka
address output
}
'skip$
if$
}
{ organization address new.block.checkb
organization output
address empty$
'skip$
{ insert.comma }
if$
address output
}
if$
new.sentence
format.edition output
format.date parens output
and.the.note
fin.entry
}
FUNCTION {mastersthesis}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
new.block
"Master's thesis" format.thesis.type output.nonnull
school empty$
'skip$
{ insert.comma }
if$
school "school" output.check
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
and.the.note
fin.entry
}
FUNCTION {misc}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
howpublished new.block.checka
howpublished output
format.date parens output
and.the.note
fin.entry
empty.misc.check
}
FUNCTION {phdthesis}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.btitle "title" output.check
new.block
"PhD thesis" format.thesis.type output.nonnull
school empty$
'skip$
{ insert.comma }
if$
school "school" output.check
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
and.the.note
fin.entry
}
FUNCTION {proceedings}
{ output.bibitem
editor empty$
{ organization empty$
{ "" }
{ organization output
stupid.colon }
if$
}
{ format.editors output.nonnull
stupid.colon
}
if$
format.btitle "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
new.sentence
format.bvolume output
format.number.series output
address empty$
{ organization publisher new.sentence.checkb
organization empty$
'skip$
{ insert.comma }
if$
organization output
publisher empty$
'skip$
{ insert.comma }
if$
publisher output
format.date parens output
}
{ insert.comma
address output.nonnull
organization empty$
'skip$
{ insert.comma }
if$
organization output
publisher empty$
'skip$
{ insert.comma }
if$
publisher output
format.date parens output
}
if$
}
{ format.incoll.inproc.crossref output.nonnull
}
if$
and.the.note
fin.entry
}
FUNCTION {techreport}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
new.block
format.tr.number output.nonnull
institution empty$
'skip$
{ insert.comma }
if$
institution "institution" output.check
address empty$
'skip$
{ insert.comma }
if$
address output
format.date parens output
and.the.note
fin.entry
}
FUNCTION {unpublished}
{ output.bibitem
format.authors "author" output.check
stupid.colon
format.title "title" output.check
new.block
note "note" output.check
format.date parens output
fin.entry
}
FUNCTION {default.type} { misc }
MACRO {jan} {"January"}
MACRO {feb} {"February"}
MACRO {mar} {"March"}
MACRO {apr} {"April"}
MACRO {may} {"May"}
MACRO {jun} {"June"}
MACRO {jul} {"July"}
MACRO {aug} {"August"}
MACRO {sep} {"September"}
MACRO {oct} {"October"}
MACRO {nov} {"November"}
MACRO {dec} {"December"}
MACRO {acmcs} {"ACM Computing Surveys"}
MACRO {acta} {"Acta Informatica"}
MACRO {cacm} {"Communications of the ACM"}
MACRO {ibmjrd} {"IBM Journal of Research and Development"}
MACRO {ibmsj} {"IBM Systems Journal"}
MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
MACRO {ieeetc} {"IEEE Transactions on Computers"}
MACRO {ieeetcad}
{"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
MACRO {ipl} {"Information Processing Letters"}
MACRO {jacm} {"Journal of the ACM"}
MACRO {jcss} {"Journal of Computer and System Sciences"}
MACRO {scp} {"Science of Computer Programming"}
MACRO {sicomp} {"SIAM Journal on Computing"}
MACRO {tocs} {"ACM Transactions on Computer Systems"}
MACRO {tods} {"ACM Transactions on Database Systems"}
MACRO {tog} {"ACM Transactions on Graphics"}
MACRO {toms} {"ACM Transactions on Mathematical Software"}
MACRO {toois} {"ACM Transactions on Office Information Systems"}
MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
MACRO {tcs} {"Theoretical Computer Science"}
READ
STRINGS { longest.label }
INTEGERS { number.label longest.label.width }
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
#1 'number.label :=
#0 'longest.label.width :=
}
FUNCTION {longest.label.pass}
{ number.label int.to.str$ 'label :=
number.label #1 + 'number.label :=
label width$ longest.label.width >
{ label 'longest.label :=
label width$ 'longest.label.width :=
}
'skip$
if$
}
EXECUTE {initialize.longest.label}
ITERATE {longest.label.pass}
FUNCTION {begin.bib}
{ preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{" longest.label * "}" * write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
ITERATE {call.type$}
FUNCTION {end.bib}
{ newline$
"\end{thebibliography}" write$ newline$
}
EXECUTE {end.bib}
This source diff could not be displayed because it is too large. You can view the blob instead.
<?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="340.52362"
height="340.65274"
id="svg7943"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="Új dokumentum 21">
<defs
id="defs7945">
<path
inkscape:transform-center-y="-3.7041667"
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-x="1.902837"
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="path3225"
style="fill:none;stroke:#980101;stroke-width:0.70014137;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="arc"
transform="matrix(-1.240021,-2.4138594,2.4138594,-1.240021,985.30896,703.49865)" />
<path
transform="matrix(1.9231545,-1.91464,1.91464,1.9231545,556.01653,358.19871)"
sodipodi:type="arc"
style="fill:none;stroke:#980101;stroke-width:0.70014137;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3216"
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="-2.9511681"
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-y="-2.9381179" />
<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"
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
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="path7826"
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
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="fill:none;stroke:none"
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)" />
<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"
id="path7830"
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)" />
<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
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="path7833"
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
style="opacity:0;fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;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" />
<path
style="opacity:0;fill:#fdd99b;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;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="path7836"
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" />
<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.77341002;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" />
<path
sodipodi:type="arc"
style="opacity:0;fill:#980101;fill-opacity:1;stroke:#ffffff;stroke-width:1.89999998;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="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
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" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="176.6598"
inkscape:cy="195.26705"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="2"
fit-margin-left="2"
fit-margin-right="2"
fit-margin-bottom="2"
inkscape:window-width="678"
inkscape:window-height="749"
inkscape:window-x="1280"
inkscape:window-y="17"
inkscape:window-maximized="0" />
<metadata
id="metadata7948">
<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"
transform="translate(-304.0239,-353.45277)">
<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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path7842"
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,52.421854,1025.7494)" />
<path
transform="matrix(1.5701332,3.6885219,3.6885219,-1.5701332,-79.272136,112.43043)"
sodipodi:type="arc"
style="fill:none;stroke:#ffff00;stroke-width:0.47395673;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path7844"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 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="path7846"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
transform="matrix(-0.62861196,2.7525075,-2.7525075,-0.62861196,806.72337,169.64599)" />
<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="path7848"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="118.39488"
sodipodi:ry="118.39488"
d="m 266.89488,86.862183 c 0,65.387687 -53.00719,118.394877 -118.39488,118.394877 -65.387688,0 -118.394882,-53.00719 -118.394882,-118.394877 0,-65.387688 53.007194,-118.394883 118.394882,-118.394883 65.38769,0 118.39488,53.007195 118.39488,118.394883 z"
transform="matrix(0.29589859,1.1985833,1.1985833,-0.29589859,326.23319,371.50352)" />
<path
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 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,376.98155,105.95342)"
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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
sodipodi:ry="40.5"
sodipodi:rx="40.5"
sodipodi:cy="86.862183"
sodipodi:cx="148.5"
id="path7851"
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,487.40312,905.87369)"
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,-139.3598,164.85076)"
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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 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.6946248,0,0,3.6946248,-74.366076,202.86756)"
sodipodi:type="arc"
style="fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:0.51426053;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path3272"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 128.25,51.788154 c 19.37085,-11.183766 44.14026,-4.546823 55.32403,14.824028 2.95698,5.121641 4.75642,10.828734 5.27186,16.720191 L 148.5,86.862183 z"
inkscape:transform-center-x="-5.6695666"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"
sodipodi:start="4.1887902"
sodipodi:end="6.1959188" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-77.547636,201.00658)"
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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -5.91396,0 -11.75617,-1.29518 -17.11604,-3.79453 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,-77.547636,201.00658)"
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 c 0,22.377457 -18.14051,40.517967 -40.51796,40.517967 -1.24815,0 -2.49563,-0.0577 -3.73845,-0.17284 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 c 0,20.863527 -15.84314,38.316387 -36.60937,40.328997 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,-77.547636,201.00658)" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-77.547636,201.00658)"
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 c 0,20.698127 -15.60025,38.068697 -36.17938,40.285007 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,-77.547636,201.00658)"
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 c -2.16484,-0.60784 -4.2753,-1.39492 -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 c -19.37085,-11.18376 -26.0078,-35.953176 -14.82403,-55.324027 2.95698,-5.121641 6.99975,-9.533548 11.84418,-12.925657 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,-77.547636,201.00658)"
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
id="path3258"
d="m 475.22279,391.83481 c -23.83754,0 -47.34882,7.11351 -66.6491,18.1705 l 67.3053,113.79825 130.7812,-11.46875 c -5.8108,-67.50758 -62.424,-120.5 -131.4374,-120.5 z"
style="fill:#eeeeee;fill-opacity:1;stroke:#003366;stroke-width:1.89999974;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="scccs"
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 c 0,10.690108 -4.9253,20.784027 -13.35149,27.362607 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,-77.547636,201.00658)" />
<path
inkscape:connector-curvature="0"
id="path3260"
d="m 597.01619,512.83059 c -3.6759,38.82512 -35.7283,65.39664 -61.7151,90.91258 -31.2208,30.08849 -82.35701,26.32501 -116.58393,3.51574 -40.49749,-24.9635 -58.48632,-78.23862 -44.30298,-123.16278 8.94091,-32.6142 34.84648,-59.72827 67.4441,-69.2231 48.85281,-16.80454 110.49431,-3.98972 140.97781,39.85496 11.0858,17.05711 15.6584,37.91904 14.1801,58.1026 z"
style="fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:1.89999974;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" />
<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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
transform="matrix(-1.5185185,0,0,1.5185185,699.7857,391.88891)"
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="path7865"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
transform="matrix(-0.73337337,-0.96181362,0.96181362,-0.73337337,499.64641,730.32247)"
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 445.71762,444.79793 c 43.62652,-15.77772 91.78318,6.79821 107.5609,50.42473 15.77771,43.62652 -6.79821,91.78318 -50.42473,107.5609 -43.62653,15.77771 -91.78319,-6.79822 -107.5609,-50.42474 -15.77771,-43.62652 6.79821,-91.78318 50.42473,-107.56089 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
transform="matrix(2.6295998,0,0,2.6295998,83.790134,295.37796)"
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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 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,285.11903,415.33636)"
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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-9.728884 3.50213,-19.132672 9.86592,-26.49157"
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 c -5.93635,4.65416 -13.05407,7.55875 -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,-77.547636,201.00658)" />
<path
transform="matrix(3.7160494,0,0,3.7160494,-77.547636,201.00658)"
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 c -5.08604,3.98751 -11.18424,6.47606 -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
inkscape:connector-curvature="0"
style="fill:#003366;fill-opacity:1;stroke:#003366;stroke-width:1.9000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
d="m 473.0357,437.80356 c -57.02341,0 -103.25,43.76416 -103.25,97.75 0,4.4009 0.31105,8.72188 0.90625,12.96875 11.30806,46.15474 53.57916,80.68211 104.3125,81.75 0.13548,-9e-4 0.27088,0.001 0.40625,0 39.00612,-0.40429 72.96871,-21.7686 91.1875,-53.375 0.0165,-0.0333 0.0461,-0.0604 0.0625,-0.0937 6.17236,-12.52788 9.625,-26.51231 9.625,-41.25 0,-53.98584 -46.22659,-97.75 -103.25,-97.75 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 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 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,442.61916,825.85794)"
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,377.96832,282.00424)"
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,409.73136,266.65812)"
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,290.95236,416.55348)"
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 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
transform="translate(381.7857,279.92856)"
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>
<path
transform="matrix(-1.0841391,2.204492,2.204492,1.0841391,443.79336,102.25299)"
sodipodi:type="arc"
style="opacity:0;fill:#ccff99;fill-opacity:1;stroke:#003366;stroke-width:0.77341002;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path7884"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<text
transform="translate(381.7857,279.92856)"
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="-471.00821"
y="621.1474"
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="-471.00821"
y="621.1474"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#980101;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="tspan3436">SMB</tspan></text>
<text
transform="matrix(0.20261113,-0.97925928,0.97925928,0.20261113,0,0)"
sodipodi:linespacing="125%"
id="text3440"
y="579.93793"
x="-545.62189"
style="font-size:38.21019363px;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.10509682px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#980101;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
y="579.93793"
x="-545.62189"
sodipodi:role="line">SFTP</tspan></text>
<text
xml:space="preserve"
style="font-size:38.21019363px;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="-642.69623"
y="494.18115"
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="-642.69623"
y="494.18115"
style="font-size:19.10509682px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#980101;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L"
id="tspan3450">WEB</tspan></text>
<text
transform="translate(381.7857,279.92856)"
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.89999998;stroke-miterlimit:4;stroke-dashoffset:0"
d="m 507.37226,644.35762 c 28.77579,-8.16369 53.82029,-26.07346 70.84837,-50.66486"
id="path7898"
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,266.62623,365.9853)"><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 566.22883,608.51119 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.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
transform="translate(381.7857,279.92856)"
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 508.78647,666.98504 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
transform="translate(381.7857,279.92856)"
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.89999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="path7911"
sodipodi:cx="92.5"
sodipodi:cy="243.86218"
sodipodi:rx="29"
sodipodi:ry="29"
d="m 121.5,243.86218 c 0,16.01626 -12.98374,29 -29,29 -16.016258,0 -29,-12.98374 -29,-29 0,-16.01626 12.983742,-29 29,-29 16.01626,0 29,12.98374 29,29 z"
transform="matrix(-0.01061887,0.99994362,-0.99994362,-0.01061887,719.11638,433.8855)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001" />
<path
transform="translate(381.7857,279.92856)"
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1;stroke:#003366;stroke-width:1.89999998;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 c 0,5.52285 -4.477152,10 -10,10 -5.522848,0 -10.000001,-4.47715 -10.000001,-10 0,-5.52285 4.477153,-10 10.000001,-10 5.522848,0 10,4.47715 10,10 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:#333333;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"
transform="translate(383.2857,278.92856)"><textPath
xlink:href="#path3524"
id="textPath3536"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;fill:#333333;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Semi-Bold"
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"
id="path7917"
sodipodi:cx="148.5"
sodipodi:cy="86.862183"
sodipodi:rx="40.5"
sodipodi:ry="40.5"
d="m 189,86.862183 c 0,22.367527 -18.13247,40.499997 -40.5,40.499997 -22.36753,0 -40.5,-18.13247 -40.5,-40.499997 0,-22.367533 18.13247,-40.5 40.5,-40.5 22.36753,0 40.5,18.132467 40.5,40.5 z"
transform="matrix(-1.5029938,-2.9059467,2.9059467,-1.5029938,445.06339,1085.8772)" />
<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,306.78021,724.45533)"><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(383.2857,278.92856)"><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,849.88476,123.6663)"
d="m 187.35849,98.27567 c -5.11247,17.40597 -21.17604,29.28892 -39.31613,29.08393"
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
style="fill:none;stroke:#003366;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dashoffset:0"
d="M 370.18063,498.64376 327.56338,488.60335"
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 375.93063,566.26876 -40.86725,15.70959"
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
transform="translate(381.7857,279.92856)"
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="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"
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,304.00768,721.35189)"><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
transform="translate(381.7857,279.92856)"
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>
<text
transform="matrix(0.99748842,-0.07082977,0.07082977,0.99748842,-544.7247,358.17924)"
sodipodi:linespacing="125%"
id="text3262"
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:#333333;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
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#333333;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
id="textPath3264"
xlink:href="#path3216">libvirt</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:#333333;fill-opacity:1;stroke:none;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
id="text3266"
sodipodi:linespacing="125%"
transform="translate(-536.74601,279.92856)"
inkscape:export-filename="/home/maat/Munka/cloud/miscellaneous/paper/sozopol13/arch.png"
inkscape:export-xdpi="160.46001"
inkscape:export-ydpi="160.46001"><textPath
id="textPath3268"
xlink:href="#path3225"><tspan
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#333333;fill-opacity:1;font-family:TitilliumText25L;-inkscape-font-specification:TitilliumText25L Light"
id="tspan3270">KVM</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:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3274"
d="m 536.32911,386.47726 -8.0183,17.43383"
style="fill:none;stroke:#003366;stroke-width:1.9000001;stroke-miterlimit:4;stroke-dashoffset:0" />
</g>
</svg>
#!/usr/bin/python #!/usr/bin/python
import xmltodict
import xml.dom.minidom as minidom import xml.dom.minidom as minidom
import sys import sys
import json import json
...@@ -23,6 +22,7 @@ mem_max = 0 ...@@ -23,6 +22,7 @@ mem_max = 0
running_vms = 0 running_vms = 0
for host in hosts: for host in hosts:
if host.getElementsByTagName("STATE")[0].childNodes[0].data == "2":
share = host.getElementsByTagName("HOST_SHARE")[0] share = host.getElementsByTagName("HOST_SHARE")[0]
cpu_max += int(share.getElementsByTagName("MAX_CPU")[0].childNodes[0].data) cpu_max += int(share.getElementsByTagName("MAX_CPU")[0].childNodes[0].data)
used_cpu += int(share.getElementsByTagName("USED_CPU")[0].childNodes[0].data) used_cpu += int(share.getElementsByTagName("USED_CPU")[0].childNodes[0].data)
......
...@@ -98,8 +98,19 @@ class InstanceAdmin(contrib.admin.ModelAdmin): ...@@ -98,8 +98,19 @@ class InstanceAdmin(contrib.admin.ModelAdmin):
class DiskAdmin(contrib.admin.ModelAdmin): class DiskAdmin(contrib.admin.ModelAdmin):
model=models.Disk model=models.Disk
list_display = ('name', 'used_by')
def used_by(self, obj):
try:
return ", ".join(obj.template_set.all())
except:
return None
used_by.verbose_name = _('used by')
class NetworkAdmin(contrib.admin.ModelAdmin): class NetworkAdmin(contrib.admin.ModelAdmin):
model=models.Network model=models.Network
list_display = ('name', 'nat', 'public', 'get_vlan')
class ShareAdmin(contrib.admin.ModelAdmin): class ShareAdmin(contrib.admin.ModelAdmin):
model=models.Network model=models.Network
list_filter = ('group', 'template', ) list_filter = ('group', 'template', )
......
...@@ -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-22 10:43+0100\n" "POT-Creation-Date: 2013-04-04 18:33+0200\n"
"PO-Revision-Date: 2013-03-22 10:46+0100\n" "PO-Revision-Date: 2013-04-04 18:01+0200\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:319 models.py:366 #: admin.py:11 models.py:343 models.py:392
msgid "owner" msgid "owner"
msgstr "tulajdonos" msgstr "tulajdonos"
...@@ -47,6 +47,10 @@ msgstr "VM felfüggesztése" ...@@ -47,6 +47,10 @@ msgstr "VM felfüggesztése"
msgid "Resume VM" msgid "Resume VM"
msgstr "VM folytatása" msgstr "VM folytatása"
#: admin.py:108
msgid "used by"
msgstr "használja:"
#: models.py:37 #: models.py:37
msgid "user" msgid "user"
msgstr "felhasználó" msgstr "felhasználó"
...@@ -126,48 +130,48 @@ msgstr "új" ...@@ -126,48 +130,48 @@ msgstr "új"
msgid "perparing" msgid "perparing"
msgstr "előkészítés" msgstr "előkészítés"
#: models.py:160 models.py:305 #: models.py:160 models.py:329
msgid "saving" msgid "saving"
msgstr "mentés" msgstr "mentés"
#: models.py:160 models.py:306 #: models.py:160 models.py:330
msgid "ready" msgid "ready"
msgstr "kész" msgstr "kész"
#: models.py:162 #: models.py:161
msgid "lab" msgid "lab"
msgstr "labor" msgstr "labor"
#: models.py:164 #: models.py:163
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:165 #: models.py:164
msgid "project" msgid "project"
msgstr "projekt" msgstr "projekt"
#: models.py:167 #: models.py:166
msgid "For project work." msgid "For project work."
msgstr "Projektmunkához." msgstr "Projektmunkához."
#: models.py:168 #: models.py:167
msgid "server" msgid "server"
msgstr "szerver" msgstr "szerver"
#: models.py:170 #: models.py:169
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:176 models.py:219 models.py:254 models.py:293 models.py:310 #: models.py:176 models.py:234 models.py:271 models.py:315 models.py:334
#: models.py:361 #: models.py:387
msgid "name" msgid "name"
msgstr "név" msgstr "név"
#: models.py:177 models.py:327 #: models.py:177 models.py:351
msgid "description" msgid "description"
msgstr "leírás" msgstr "leírás"
#: models.py:181 models.py:322 models.py:369 #: models.py:181 models.py:346 models.py:395
msgid "created at" msgid "created at"
msgstr "létrehozás ideje" msgstr "létrehozás ideje"
...@@ -187,156 +191,172 @@ msgstr "felhasználónkénti korlát" ...@@ -187,156 +191,172 @@ msgstr "felhasználónkénti korlát"
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:255 #: models.py:193 models.py:415
msgid "share"
msgstr "megosztás"
#: models.py:194
msgid "shares"
msgstr "megosztások"
#: models.py:238 models.py:338
msgid "disk"
msgstr "lemez"
#: models.py:239
msgid "disks"
msgstr "lemezek"
#: models.py:272
msgid "NAT" msgid "NAT"
msgstr "NAT" msgstr "NAT"
#: models.py:256 #: models.py:273
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:257 models.py:325 #: models.py:274 models.py:349
msgid "public" msgid "public"
msgstr "publikus" msgstr "publikus"
#: models.py:258 #: models.py:275
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:294 #: models.py:279 models.py:341
msgid "network"
msgstr "hálózat"
#: models.py:280
msgid "networks"
msgstr "hálózatok"
#: models.py:316
msgid "CPU cores." msgid "CPU cores."
msgstr "CPU magok száma." msgstr "CPU magok száma."
#: models.py:295 #: models.py:317
msgid "Mebibytes of memory." msgid "Mebibytes of memory."
msgstr "Memória mérete mebibyte-ban." msgstr "Memória mérete mebibyte-ban."
#: models.py:296 #: models.py:318
msgid "credits" msgid "credits"
msgstr "kredit" msgstr "kredit"
#: models.py:297 #: models.py:319
msgid "Price of instance." msgid "Price of instance."
msgstr "Példány értéke." msgstr "Példány értéke."
#: models.py:305 #: models.py:323 models.py:340
msgid "instance type"
msgstr "példánytípus"
#: models.py:324
msgid "instance types"
msgstr "példánytípusok"
#: models.py:329
msgid "new" msgid "new"
msgstr "új" msgstr "új"
#: models.py:313 #: models.py:337
msgid "access method" msgid "access method"
msgstr "elérési mód" msgstr "elérési mód"
#: models.py:314 #: models.py:350
msgid "disk"
msgstr "lemez"
#: models.py:316
msgid "instance type"
msgstr "példánytípus"
#: models.py:317
msgid "network"
msgstr "hálózat"
#: 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:328 #: models.py:352
msgid "operating system" msgid "operating system"
msgstr "operációs rendszer" msgstr "operációs rendszer"
#: models.py:329 #: models.py:353
#, 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:333 models.py:364 #: models.py:357 models.py:390
msgid "template" msgid "template"
msgstr "sablon" msgstr "sablon"
#: models.py:334 #: models.py:358
msgid "templates" msgid "templates"
msgstr "sablonok" msgstr "sablonok"
#: models.py:363 #: models.py:389
msgid "IP address" msgid "IP address"
msgstr "IP cím" msgstr "IP cím"
#: models.py:371 #: models.py:397
msgid "deployable" msgid "deployable"
msgstr "beküldhető" msgstr "beküldhető"
#: models.py:372 #: models.py:398
msgid "pending" msgid "pending"
msgstr "várakozó" msgstr "várakozó"
#: models.py:373 #: models.py:399
msgid "done" msgid "done"
msgstr "kész" msgstr "kész"
#: models.py:374 #: models.py:400
msgid "active" msgid "active"
msgstr "aktív" msgstr "aktív"
#: models.py:375 #: models.py:401
msgid "unknown" msgid "unknown"
msgstr "ismeretlen" msgstr "ismeretlen"
#: models.py:376 #: models.py:402
msgid "suspended" msgid "suspended"
msgstr "felfüggesztett" msgstr "felfüggesztett"
#: models.py:377 #: models.py:403
msgid "failed" msgid "failed"
msgstr "hiba" msgstr "hiba"
#: models.py:380 #: models.py:406
msgid "active since" msgid "active since"
msgstr "aktívvá válás ideje" msgstr "aktívvá válás ideje"
#: models.py:381 #: models.py:407
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:383 #: models.py:409
msgid "host in firewall" msgid "host in firewall"
msgstr "gép a tűzfalban" msgstr "gép a tűzfalban"
#: models.py:384 #: models.py:410
msgid "password" msgid "password"
msgstr "jelszó" msgstr "jelszó"
#: models.py:385 #: models.py:411
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:387 #: models.py:413
msgid "OpenNebula ID" msgid "OpenNebula ID"
msgstr "OpenNebula ID" msgstr "OpenNebula ID"
#: models.py:389 #: models.py:417 templates/box/vm/entry.html:68
msgid "share"
msgstr "megosztás"
#: 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:393 templates/box/vm/entry.html:68 #: models.py:419 templates/box/vm/entry.html:78
msgid "time of delete" msgid "time of delete"
msgstr "törlés ideje" msgstr "törlés ideje"
#: models.py:397 #: models.py:423
msgid "instance" msgid "instance"
msgstr "példány" msgstr "példány"
#: models.py:398 #: models.py:424
msgid "instances" msgid "instances"
msgstr "példányok" msgstr "példányok"
#: models.py:417 #: models.py:445
msgid "None" msgid "None"
msgstr "Nincs" msgstr "Nincs"
...@@ -364,44 +384,44 @@ msgstr "A sablon törlése sikeres." ...@@ -364,44 +384,44 @@ msgstr "A sablon törlése sikeres."
msgid "Unexpected error happened." msgid "Unexpected error happened."
msgstr "Váratlan hiba történt." msgstr "Váratlan hiba történt."
#: views.py:112 #: views.py:115
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:113 views.py:532 #: views.py:116 views.py:551
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:162 views.py:209 #: views.py:165 views.py:212
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:196 views.py:230 #: views.py:199 views.py:233
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:201 #: views.py:204
#, python-format #, python-format
msgid "Successfully shared %s." msgid "Successfully shared %s."
msgstr "„%s” megosztása sikeres." msgstr "„%s” megosztása sikeres."
#: views.py:239 #: views.py:242
#, 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:251 #: views.py:254
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:282 #: views.py:285
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:286 #: views.py:289
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 +429,7 @@ msgstr "" ...@@ -409,7 +429,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:289 #: views.py:292
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 +437,15 @@ msgstr "" ...@@ -417,15 +437,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:292 #: views.py:295
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:313 #: views.py:316
msgid "Can not create template." msgid "Can not create template."
msgstr "Sablon létrehozása sikertelen." msgstr "Sablon létrehozása sikertelen."
#: views.py:318 #: views.py:321
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 +453,107 @@ msgstr "" ...@@ -433,101 +453,107 @@ 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:333 #: views.py:336
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:421 #: views.py:434
msgid "Port number is in a restricted domain (22000 to 24000)." msgid "Adding port failed."
msgstr "A megadott port foglalt tartományba esik (22000-től 24000-ig)." msgstr "Port hozzáadása sikertelen."
#: views.py:428 #: views.py:436
#, 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:430 #: views.py:451
msgid "Adding port failed."
msgstr "Port hozzáadása sikertelen."
#: 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:448 #: views.py:454
msgid "Removing port failed." msgid "Removing port failed."
msgstr "Port eltávolítása sikertelen." msgstr "Port eltávolítása sikertelen."
#: views.py:458 #: views.py:464
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:460 #: views.py:466
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:482 #: views.py:490
msgid "There are machines running of this share." #, python-format
msgstr "A sablonnak még vannak futó példányai." msgid "There is a machine running of this share."
msgid_plural "There are %(n)d machines running of this share."
msgstr[0] "A sablonnak még van futó példánya."
msgstr[1] "A sablonnak még van %(n)d futó példánya."
#: views.py:494
#, python-format
msgid "There is a suspended machine of this share."
msgid_plural "There are %(m)d suspended machines of this share."
msgstr[0] "A sablonnak még van felfüggesztett példánya."
msgstr[1] "A sablonnak még van %(m)d felfüggesztett példánya."
#: views.py:485 #: views.py:499
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:487 #: views.py:502
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:495 #: views.py:510
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:497 #: views.py:512
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:506 #: views.py:521
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:508 #: views.py:523
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:520 #: views.py:536
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:522 #: views.py:538
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:530 #: views.py:549
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:540 #: views.py:559
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:542 #: views.py:561
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:560 #: views.py:579
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:562 #: views.py:581
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:573 #: views.py:592
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:585 #: views.py:604
msgid "Failed to reset keys" msgid "Failed to reset keys"
msgstr "Kulcsok újragenerálása" msgstr "Kulcsok újragenerálása"
...@@ -567,7 +593,7 @@ msgstr "Impresszum" ...@@ -567,7 +593,7 @@ msgstr "Impresszum"
msgid "Policy" msgid "Policy"
msgstr "Szabályzat" msgstr "Szabályzat"
#: templates/base.html:81 templates/show.html:123 #: templates/base.html:81 templates/show.html:127
#: templates/vm-credentials.html:13 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"
...@@ -635,7 +661,7 @@ msgid "Cancel" ...@@ -635,7 +661,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:51 templates/box/file/box.html:112 #: templates/show.html:55 templates/box/file/box.html:112
msgid "Save" msgid "Save"
msgstr "Mentés" msgstr "Mentés"
...@@ -649,7 +675,7 @@ msgstr "Név" ...@@ -649,7 +675,7 @@ msgstr "Név"
#: templates/edit-template-flow.html:17 templates/new-template-flow.html:25 #: templates/edit-template-flow.html:17 templates/new-template-flow.html:25
#: templates/box/template/box.html:114 templates/box/template/entry.html:23 #: templates/box/template/box.html:114 templates/box/template/entry.html:23
#: templates/box/vm/box.html:84 templates/box/vm/entry.html:44 #: templates/box/vm/box.html:84 templates/box/vm/entry.html:54
msgid "Size" msgid "Size"
msgstr "Méret" msgstr "Méret"
...@@ -680,7 +706,7 @@ msgstr "Csoport" ...@@ -680,7 +706,7 @@ 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:57 #: templates/box/template/summary.html:57
#: templates/box/template/summary.html:58 templates/box/vm/entry.html:34 #: templates/box/template/summary.html:58 templates/box/vm/entry.html:44
msgid "Share" msgid "Share"
msgstr "Megosztás" msgstr "Megosztás"
...@@ -714,77 +740,94 @@ msgstr "Ez egy megosztott sablon." ...@@ -714,77 +740,94 @@ msgstr "Ez egy megosztott sablon."
msgid "Next &raquo;" msgid "Next &raquo;"
msgstr "Tovább &raquo;" msgstr "Tovább &raquo;"
#: templates/new-template-flow.html:40 templates/box/vm/box.html:87
msgid "CPU cores"
msgstr "CPU magok"
#: templates/new-template-flow.html:43 templates/box/vm/box.html:88
msgid "RAM"
msgstr "RAM"
#: templates/new-template-flow.html:44 templates/box/vm/box.html:89
msgid "Credit"
msgstr "Kredit"
#: templates/new-template-flow.html:57 #: templates/new-template-flow.html:57
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:45 #: templates/show.html:41
#, python-format
msgid "Details of %(name)s"
msgstr "%(name)s részletei"
#: templates/show.html:49
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:56 #: templates/show.html:60
msgid "Connect to the machine." msgid "Connect to the machine."
msgstr "Csatlakozzon a géphez." msgstr "Csatlakozzon a géphez."
#: templates/show.html:58 #: templates/show.html:62
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:61 #: templates/show.html:65
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:64 #: templates/show.html:68
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:67 #: templates/show.html:71
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:70 #: templates/show.html:74
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:82 templates/show.html.py:101 #: templates/show.html:86 templates/show.html.py:105
msgid "Starting..." msgid "Starting..."
msgstr "Indítás…" msgstr "Indítás…"
#: templates/show.html:87 #: templates/show.html:91
msgid "Saving..." msgid "Saving..."
msgstr "Mentés…" msgstr "Mentés…"
#: templates/show.html:93 #: templates/show.html:97
msgid "Running" msgid "Running"
msgstr "Fut" msgstr "Fut"
#: templates/show.html:98 #: templates/show.html:102
msgid "Stopping..." msgid "Stopping..."
msgstr "Felfüggesztés…" msgstr "Felfüggesztés…"
#: templates/show.html:103 #: templates/show.html:107
msgid "Stopped" msgid "Stopped"
msgstr "Leállítva" msgstr "Leállítva"
#: templates/show.html:106 #: templates/show.html:110
msgid "Deleted" msgid "Deleted"
msgstr "Törölve" msgstr "Törölve"
#: templates/show.html:109 #: templates/show.html:113
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:114 #: templates/show.html:118
msgid "Login credentials" msgid "Login credentials"
msgstr "Belépési adatok" msgstr "Belépési adatok"
#: templates/show.html:126 #: templates/show.html:130
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:128 #: templates/show.html:132
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"
...@@ -793,7 +836,7 @@ msgstr "" ...@@ -793,7 +836,7 @@ 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:131 #: templates/show.html:135
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 " " listed private ports direcly using the VM's global "
...@@ -805,35 +848,39 @@ msgstr "" ...@@ -805,35 +848,39 @@ msgstr ""
"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:138 #: templates/show.html:142
msgid "Port administration" msgid "Port administration"
msgstr "Portok kezelése" msgstr "Portok kezelése"
#: templates/show.html:144 templates/vm-credentials.html:7 #: templates/show.html:148
msgid "Protocol" msgid "Port"
msgstr "Protokoll" msgstr "Port"
#: templates/show.html:145
msgid "Public port"
msgstr "Külső port"
#: templates/show.html:146 #: templates/show.html:149
msgid "Private port" msgid "Access"
msgstr "Belső port" msgstr "Hozzáférés"
#: templates/show.html:154 templates/box/template/box.html:91 #: templates/show.html:167 templates/show.html.py:188
#: templates/box/template/summary.html:24 templates/box/vm/summary.html:40 #: templates/box/template/box.html:91 templates/box/template/summary.html:24
#: templates/box/vm/summary.html.py:41 templates/box/vm/summary.html:50 #: templates/box/vm/summary.html:40 templates/box/vm/summary.html.py:41
#: templates/box/vm/summary.html.py:51 templates/box/vm/summary.html:57 #: templates/box/vm/summary.html:50 templates/box/vm/summary.html.py:51
#: templates/box/vm/summary.html.py:58 templates/box/vm/summary.html:61 #: templates/box/vm/summary.html:57 templates/box/vm/summary.html.py:58
#: templates/box/vm/summary.html.py:62 #: templates/box/vm/summary.html:61 templates/box/vm/summary.html.py:62
msgid "Delete" msgid "Delete"
msgstr "Törlés" msgstr "Törlés"
#: templates/show.html:174 #: templates/show.html:194
msgid "Port/Protocol"
msgstr "Port/protokoll"
#: templates/show.html:205
msgid "Add" msgid "Add"
msgstr "Hozzáadás" msgstr "Hozzáadás"
#: templates/vm-credentials.html:7
msgid "Protocol"
msgstr "Protokoll"
#: templates/vm-credentials.html:17 #: templates/vm-credentials.html:17
msgid "" msgid ""
"You can access Linux machines through\n" "You can access Linux machines through\n"
...@@ -874,12 +921,20 @@ msgstr "" ...@@ -874,12 +921,20 @@ msgstr ""
"Remminát ajánljuk." "Remminát ajánljuk."
#: templates/vm-credentials.html:40 #: templates/vm-credentials.html:40
msgid "IP" msgid "IPv4 Host"
msgstr "IP" msgstr "IPv4 host"
#: templates/vm-credentials.html:40
msgid "You are using IPv6"
msgstr "IPv6 elérhető"
#: templates/vm-credentials.html:44 #: templates/vm-credentials.html:44
msgid "Port" msgid "IPv6 Host"
msgstr "Port" msgstr "IPv6 host"
#: templates/vm-credentials.html:44
msgid "You are using IPv4"
msgstr "IPv4 érhető el"
#: templates/vm-credentials.html:48 #: templates/vm-credentials.html:48
msgid "Username" msgid "Username"
...@@ -1071,7 +1126,7 @@ msgstr "" ...@@ -1071,7 +1126,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 #: templates/box/vm/entry.html:37
msgid "Try" msgid "Try"
msgstr "Kipróbálás" msgstr "Kipróbálás"
...@@ -1095,7 +1150,7 @@ msgid "System" ...@@ -1095,7 +1150,7 @@ msgid "System"
msgstr "Rendszer" msgstr "Rendszer"
#: templates/box/template/box.html:128 templates/box/template/entry.html:37 #: templates/box/template/box.html:128 templates/box/template/entry.html:37
#: templates/box/vm/entry.html:53 #: templates/box/vm/entry.html:63
msgid "Created at" msgid "Created at"
msgstr "Létrehozás ideje" msgstr "Létrehozás ideje"
...@@ -1169,19 +1224,23 @@ msgstr "Személyes kvóta: %(used)s/%(all)s" ...@@ -1169,19 +1224,23 @@ msgstr "Személyes kvóta: %(used)s/%(all)s"
msgid "Hostname" msgid "Hostname"
msgstr "Gépnév" msgstr "Gépnév"
#: templates/box/vm/entry.html:39 #: templates/box/vm/entry.html:35
msgid "Master instance"
msgstr "Mesterpéldány"
#: templates/box/vm/entry.html:49
msgid "Template" msgid "Template"
msgstr "Sablon" msgstr "Sablon"
#: templates/box/vm/entry.html:60 templates/box/vm/entry.html.py:61 #: templates/box/vm/entry.html:70 templates/box/vm/entry.html.py:71
msgid "Renew suspend time" msgid "Renew suspend time"
msgstr "Felfüggesztési idő meghosszabbítása" msgstr "Felfüggesztési idő meghosszabbítása"
#: templates/box/vm/entry.html:70 templates/box/vm/entry.html.py:71 #: templates/box/vm/entry.html:80 templates/box/vm/entry.html.py:81
msgid "Renew deletion time" msgid "Renew deletion time"
msgstr "Törlési idő meghosszabbítása" msgstr "Törlési idő meghosszabbítása"
#: templates/box/vm/entry.html:79 templates/box/vm/summary.html:16 #: templates/box/vm/entry.html:89 templates/box/vm/summary.html:16
msgid "More details" msgid "More details"
msgstr "További részletek" msgstr "További részletek"
...@@ -1366,6 +1425,21 @@ msgstr "" ...@@ -1366,6 +1425,21 @@ msgstr ""
"A lemez- és memóriaképet tárolni fogjuk, így a végleges lejárati\n" "A lemez- és memóriaképet tárolni fogjuk, így a végleges lejárati\n"
"időig (%(deldate)s) folytathatja a futtatását.\n" "időig (%(deldate)s) folytathatja a futtatását.\n"
#~ msgid "IPv6 Port"
#~ msgstr "IPv6 port"
#~ msgid "Port number is in a restricted domain (22000 to 24000)."
#~ msgstr "A megadott port foglalt tartományba esik (22000-től 24000-ig)."
#~ msgid "Public port"
#~ msgstr "Külső port"
#~ msgid "Private port"
#~ msgstr "Belső port"
#~ msgid "IP"
#~ msgstr "IP"
#~ msgid "Impressum" #~ msgid "Impressum"
#~ msgstr "Impresszum" #~ msgstr "Impresszum"
...@@ -1441,9 +1515,6 @@ msgstr "" ...@@ -1441,9 +1515,6 @@ msgstr ""
#~ msgid "%(m)s MiB" #~ msgid "%(m)s MiB"
#~ msgstr "%(m)s MiB" #~ msgstr "%(m)s MiB"
#~ msgid "CPU cores"
#~ msgstr "CPU magok"
#~ msgid "&laquo; Cancel" #~ msgid "&laquo; Cancel"
#~ msgstr "&laquo; Mégsem" #~ msgstr "&laquo; Mégsem"
......
...@@ -6,8 +6,8 @@ msgid "" ...@@ -6,8 +6,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-22 10:43+0100\n" "POT-Creation-Date: 2013-04-04 18:33+0200\n"
"PO-Revision-Date: 2013-03-07 17:02+0100\n" "PO-Revision-Date: 2013-04-04 18:03+0200\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"
...@@ -17,17 +17,18 @@ msgstr "" ...@@ -17,17 +17,18 @@ 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.js:41 static/script/cloud.min.js:1
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:301 #: static/script/cloud.js:41 static/script/cloud.js.c:338
#: static/script/cloud.js:373 static/script/cloud.js.c:600 #: static/script/cloud.js:416 static/script/cloud.js.c:644
#: static/script/store.js:288 #: static/script/cloud.min.js:1 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.js:53 static/script/cloud.min.js:1
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!"
...@@ -35,92 +36,114 @@ msgstr "" ...@@ -35,92 +36,114 @@ 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.js:53 static/script/cloud.min.js:1
msgid "Reset" msgid "Reset"
msgstr "Újragenerálás" msgstr "Újragenerálás"
#: static/script/cloud.js:76 static/script/store.js:323 #: static/script/cloud.js:95 static/script/cloud.min.js:1
#: 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:276 static/script/store.js:288 #: static/script/cloud.js:311 static/script/cloud.min.js:1
#: 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:290 #: static/script/cloud.js:327 static/script/cloud.min.js:1
#, 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:291 #: static/script/cloud.js:328 static/script/cloud.min.js:1
msgid "Stop" msgid "Stop"
msgstr "Felfüggesztés" msgstr "Felfüggesztés"
#: static/script/cloud.js:300 #: static/script/cloud.js:337 static/script/cloud.min.js:1
#, 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:310 #: static/script/cloud.js:347 static/script/cloud.min.js:1
#, 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:311 #: static/script/cloud.js:348 static/script/cloud.min.js:1
msgid "Restart" msgid "Restart"
msgstr "Újraindítás" msgstr "Újraindítás"
#: static/script/cloud.js:372 #: static/script/cloud.js:415 static/script/cloud.min.js:1
#, 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:551 static/script/cloud.js.c:554 #: static/script/cloud.js:436 static/script/cloud.min.js:1
msgid "Template deletion successful!"
msgstr "Sablon törlése sikeres."
#: static/script/cloud.js:595 static/script/cloud.js.c:598
#: 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:554 #: static/script/cloud.js:598 static/script/cloud.min.js:1
msgid "Unknown" msgid "Unknown"
msgstr "Ismeretlen" msgstr "Ismeretlen"
#: static/script/cloud.js:600 #: static/script/cloud.js:644 static/script/cloud.min.js:1
#, 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.js:282 static/script/store.min.js:1
msgid "file" msgid "file"
msgstr "fájl" msgstr "fájl"
#: static/script/store.js:125 #: static/script/store.js:125 static/script/store.min.js:1
msgid "Toplist" msgid "Toplist"
msgstr "Legújabb fájlok" msgstr "Legújabb fájlok"
#: static/script/store.js:127 #: static/script/store.js:127 static/script/store.min.js:1
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.js:283 static/script/store.min.js:1
#, 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.js:285 static/script/store.min.js:1
#, 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.js:288 static/script/store.min.js:1
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:396 static/script/store.min.js:1
#, c-format
msgid "File %s is already present! Click OK to override it."
msgstr "%s már létezik. Felülírja?"
#: static/script/store.js:408 static/script/store.min.js:1
#, c-format
msgid ""
"%s seems to be a directory. Uploading directories is currently not "
"supported. If you're sure that %s is a file, click OK to upload it."
msgstr ""
"%s egy mappának tűnik. Mappák feltöltésére nincs lehetőség. Ha biztos benne, "
"hogy %s egy fájl, kattintson az OK-ra a feltöltéshez."
#: static/script/store.js:463 static/script/store.js.c:465
#: 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.js:465 static/script/store.min.js:1
msgid "done, processing..." msgid "done, processing..."
msgstr "kész, feldolgozás..." msgstr "kész, feldolgozás..."
......
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Removing unique constraint on 'Instance', fields ['name']
db.delete_unique('one_instance', ['name'])
def backwards(self, orm):
# Adding unique constraint on 'Instance', fields ['name']
db.create_unique('one_instance', ['name'])
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'firewall.domain': {
'Meta': {'object_name': 'Domain'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'})
},
'firewall.group': {
'Meta': {'object_name': 'Group'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'firewall.host': {
'Meta': {'object_name': 'Host'},
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['firewall.Group']", 'null': 'True', 'blank': 'True'}),
'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'ipv6': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'pub_ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}),
'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['firewall.Vlan']"})
},
'firewall.vlan': {
'Meta': {'object_name': 'Vlan'},
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['firewall.Domain']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'interface': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'ipv6': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'net4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'net6': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
'prefix4': ('django.db.models.fields.IntegerField', [], {'default': '16'}),
'prefix6': ('django.db.models.fields.IntegerField', [], {'default': '80'}),
'reverse_domain': ('django.db.models.fields.TextField', [], {}),
'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}),
'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'})
},
'one.disk': {
'Meta': {'ordering': "['name']", 'object_name': 'Disk'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'one.instance': {
'Meta': {'object_name': 'Instance'},
'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'firewall_host': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'instance_set'", 'null': 'True', 'to': "orm['firewall.Host']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'one_id': ('django.db.models.fields.IntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'instance_set'", 'to': "orm['auth.User']"}),
'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
'share': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'instance_set'", 'null': 'True', 'to': "orm['one.Share']"}),
'state': ('django.db.models.fields.CharField', [], {'default': "'DEPLOYABLE'", 'max_length': '20'}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'instance_set'", 'to': "orm['one.Template']"}),
'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
'waiting': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'one.instancetype': {
'CPU': ('django.db.models.fields.IntegerField', [], {}),
'Meta': {'ordering': "['credit']", 'object_name': 'InstanceType'},
'RAM': ('django.db.models.fields.IntegerField', [], {}),
'credit': ('django.db.models.fields.IntegerField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'one.network': {
'Meta': {'ordering': "['name']", 'object_name': 'Network'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'nat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'one.share': {
'Meta': {'object_name': 'Share'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'share_set'", 'to': "orm['school.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'instance_limit': ('django.db.models.fields.IntegerField', [], {}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'share_set'", 'null': 'True', 'to': "orm['auth.User']"}),
'per_user_limit': ('django.db.models.fields.IntegerField', [], {}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'share_set'", 'to': "orm['one.Template']"}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '10'})
},
'one.sshkey': {
'Meta': {'object_name': 'SshKey'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'key': ('django.db.models.fields.TextField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sshkey_set'", 'to': "orm['auth.User']"})
},
'one.template': {
'Meta': {'object_name': 'Template'},
'access_type': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'disk': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['one.Disk']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'instance_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['one.InstanceType']"}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['one.Network']"}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['auth.User']"}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'state': ('django.db.models.fields.CharField', [], {'default': "'NEW'", 'max_length': '10'}),
'system': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'one.userclouddetails': {
'Meta': {'object_name': 'UserCloudDetails'},
'disk_quota': ('django.db.models.fields.IntegerField', [], {'default': '2048'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'instance_quota': ('django.db.models.fields.IntegerField', [], {'default': '20'}),
'share_quota': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'smb_password': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
'ssh_key': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'userclouddetails_set'", 'null': 'True', 'to': "orm['one.SshKey']"}),
'ssh_private_key': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'cloud_details'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'school.course': {
'Meta': {'object_name': 'Course'},
'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'default_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'default_group_of'", 'null': 'True', 'to': "orm['school.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}),
'owners': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['school.Person']", 'null': 'True', 'blank': 'True'}),
'short_name': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'})
},
'school.group': {
'Meta': {'unique_together': "(('name', 'course', 'semester'),)", 'object_name': 'Group'},
'course': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['school.Course']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'members': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['school.Person']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
'owners': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'owned_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['school.Person']"}),
'semester': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['school.Semester']"})
},
'school.person': {
'Meta': {'object_name': 'Person'},
'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'default': "'hu'", 'max_length': '10'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True', 'null': 'True', 'blank': 'True'})
},
'school.semester': {
'Meta': {'object_name': 'Semester'},
'end': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'start': ('django.db.models.fields.DateField', [], {})
}
}
complete_apps = ['one']
\ No newline at end of file
...@@ -158,7 +158,6 @@ class SshKey(models.Model): ...@@ -158,7 +158,6 @@ class SshKey(models.Model):
TEMPLATE_STATES = (("INIT", _('init')), ("PREP", _('perparing')), TEMPLATE_STATES = (("INIT", _('init')), ("PREP", _('perparing')),
("SAVE", _('saving')), ("READY", _('ready'))) ("SAVE", _('saving')), ("READY", _('ready')))
TYPES = {"LAB": {"verbose_name": _('lab'), "id": "LAB", TYPES = {"LAB": {"verbose_name": _('lab'), "id": "LAB",
"suspend": td(hours=5), "delete": td(days=15), "suspend": td(hours=5), "delete": td(days=15),
"help_text": _('For lab or homework with short lifetime.')}, "help_text": _('For lab or homework with short lifetime.')},
...@@ -169,6 +168,7 @@ TYPES = {"LAB": {"verbose_name": _('lab'), "id": "LAB", ...@@ -169,6 +168,7 @@ TYPES = {"LAB": {"verbose_name": _('lab'), "id": "LAB",
"suspend": td(days=365), "delete": None, "suspend": td(days=365), "delete": None,
"help_text": _('For long-term server use.')}, "help_text": _('For long-term server use.')},
} }
DEFAULT_TYPE = TYPES['LAB']
TYPES_L = sorted(TYPES.values(), key=lambda m: m["suspend"]) TYPES_L = sorted(TYPES.values(), key=lambda m: m["suspend"])
TYPES_C = tuple([(i[0], i[1]["verbose_name"]) for i in TYPES.items()]) TYPES_C = tuple([(i[0], i[1]["verbose_name"]) for i in TYPES.items()])
...@@ -188,13 +188,23 @@ class Share(models.Model): ...@@ -188,13 +188,23 @@ class Share(models.Model):
'user.')) 'user.'))
owner = models.ForeignKey(User, null=True, blank=True, related_name='share_set') owner = models.ForeignKey(User, null=True, blank=True, related_name='share_set')
def get_type(self): class Meta:
t = TYPES[self.type] ordering = ['group', 'template', 'owner', ]
verbose_name = _('share')
verbose_name_plural = _('shares')
@classmethod
def extend_type(cls, t):
t['deletex'] = (datetime.now() + td(seconds=1) + t['delete'] t['deletex'] = (datetime.now() + td(seconds=1) + t['delete']
if t['delete'] else None) if t['delete'] else None)
t['suspendx'] = (datetime.now() + td(seconds=1) + t['suspend'] t['suspendx'] = (datetime.now() + td(seconds=1) + t['suspend']
if t['suspend'] else None) if t['suspend'] else None)
return t return t
def get_type(self):
t = TYPES[self.type]
return self.extend_type(t)
def get_running_or_stopped(self, user=None): def get_running_or_stopped(self, user=None):
running = (Instance.objects.all().exclude(state='DONE') running = (Instance.objects.all().exclude(state='DONE')
.filter(share=self)) .filter(share=self))
...@@ -210,9 +220,14 @@ class Share(models.Model): ...@@ -210,9 +220,14 @@ class Share(models.Model):
return running.filter(owner=user).count() return running.filter(owner=user).count()
else: else:
return running.count() return running.count()
def get_instance_pc(self): def get_instance_pc(self):
return float(self.get_running()) / self.instance_limit * 100 return float(self.get_running()) / self.instance_limit * 100
def __unicode__(self):
return u"%(group)s: %(tpl)s %(owner)s" % {
'group': self.group, 'tpl': self.template, 'owner': self.owner}
class Disk(models.Model): class Disk(models.Model):
"""Virtual disks automatically synchronized with OpenNebula.""" """Virtual disks automatically synchronized with OpenNebula."""
name = models.CharField(max_length=100, unique=True, name = models.CharField(max_length=100, unique=True,
...@@ -220,6 +235,8 @@ class Disk(models.Model): ...@@ -220,6 +235,8 @@ class Disk(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
verbose_name = _('disk')
verbose_name_plural = _('disks')
def __unicode__(self): def __unicode__(self):
return u"%s (#%d)" % (self.name, self.id) return u"%s (#%d)" % (self.name, self.id)
...@@ -259,6 +276,9 @@ class Network(models.Model): ...@@ -259,6 +276,9 @@ class Network(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
verbose_name = _('network')
verbose_name_plural = _('networks')
def __unicode__(self): def __unicode__(self):
return self.name return self.name
...@@ -285,6 +305,8 @@ class Network(models.Model): ...@@ -285,6 +305,8 @@ class Network(models.Model):
Network(id=id, name=name).save() Network(id=id, name=name).save()
l.append(id) l.append(id)
Network.objects.exclude(id__in=l).delete() Network.objects.exclude(id__in=l).delete()
def get_vlan(self):
return Vlan.objects.get(vid=self.id)
class InstanceType(models.Model): class InstanceType(models.Model):
...@@ -298,6 +320,8 @@ class InstanceType(models.Model): ...@@ -298,6 +320,8 @@ class InstanceType(models.Model):
class Meta: class Meta:
ordering = ['credit'] ordering = ['credit']
verbose_name = _('instance type')
verbose_name_plural = _('instance types')
def __unicode__(self): def __unicode__(self):
return u"%s" % self.name return u"%s" % self.name
...@@ -332,6 +356,8 @@ class Template(models.Model): ...@@ -332,6 +356,8 @@ class Template(models.Model):
class Meta: class Meta:
verbose_name = _('template') verbose_name = _('template')
verbose_name_plural = _('templates') verbose_name_plural = _('templates')
ordering = ['name', ]
def __unicode__(self): def __unicode__(self):
return self.name return self.name
...@@ -357,7 +383,7 @@ class Template(models.Model): ...@@ -357,7 +383,7 @@ class Template(models.Model):
class Instance(models.Model): class Instance(models.Model):
"""Virtual machine instance.""" """Virtual machine instance."""
name = models.CharField(max_length=100, unique=True, name = models.CharField(max_length=100,
verbose_name=_('name'), blank=True) verbose_name=_('name'), blank=True)
ip = models.IPAddressField(blank=True, null=True, ip = models.IPAddressField(blank=True, null=True,
verbose_name=_('IP address')) verbose_name=_('IP address'))
...@@ -396,6 +422,7 @@ class Instance(models.Model): ...@@ -396,6 +422,7 @@ class Instance(models.Model):
class Meta: class Meta:
verbose_name = _('instance') verbose_name = _('instance')
verbose_name_plural = _('instances') verbose_name_plural = _('instances')
ordering = ['pk', ]
def __unicode__(self): def __unicode__(self):
return self.name return self.name
...@@ -407,28 +434,17 @@ class Instance(models.Model): ...@@ -407,28 +434,17 @@ class Instance(models.Model):
def get_port(self, use_ipv6=False): def get_port(self, use_ipv6=False):
"""Get public port number for default access method.""" """Get public port number for default access method."""
proto = self.template.access_type proto = self.template.access_type
if self.template.network.nat and not use_ipv6: if self.nat and not use_ipv6:
return {"rdp": 23000, "nx": 22000, "ssh": 22000}[proto] + int(self.ip.split('.')[2]) * 256 + int(self.ip.split('.')[3]) return {"rdp": 23000, "nx": 22000, "ssh": 22000}[proto] + int(self.ip.split('.')[2]) * 256 + int(self.ip.split('.')[3])
else: else:
return {"rdp": 3389, "nx": 22, "ssh": 22}[proto] return {"rdp": 3389, "nx": 22, "ssh": 22}[proto]
def get_connect_host(self, use_ipv6=False): def get_connect_host(self, use_ipv6=False):
"""Get public hostname.""" """Get public hostname."""
if self.firewall_host is None: if self.firewall_host is None:
return _('None') return _('None')
try: proto = 'ipv6' if use_ipv6 else 'ipv4'
if use_ipv6: return self.firewall_host.get_hostname(proto=proto)
return self.firewall_host.record_set.filter(type='AAAA')[0].get_data()['name']
else:
if self.template.network.nat:
ip = self.firewall_host.pub_ipv4
return Record.objects.filter(type='A', address=ip)[0].get_data()['name']
else:
return self.firewall_host.record_set.filter(type='A')[0].get_data()['name']
except:
if self.template.network.nat:
return self.firewall_host.pub_ipv4
else:
return self.firewall_host.ipv4
def get_connect_uri(self, use_ipv6=False): def get_connect_uri(self, use_ipv6=False):
"""Get access parameters in URI format.""" """Get access parameters in URI format."""
...@@ -472,6 +488,15 @@ class Instance(models.Model): ...@@ -472,6 +488,15 @@ class Instance(models.Model):
self.check_if_is_save_as_done() self.check_if_is_save_as_done()
return x return x
@property
def nat(self):
if self.firewall_host is not None:
return self.firewall_host.shared_ip
elif self.template is not None:
return self.template.network.nat
else:
return False
def get_age(self): def get_age(self):
"""Get age of VM in seconds.""" """Get age of VM in seconds."""
from datetime import datetime from datetime import datetime
...@@ -491,7 +516,7 @@ class Instance(models.Model): ...@@ -491,7 +516,7 @@ class Instance(models.Model):
inst = Instance(pw=pwgen(), template=template, owner=owner, inst = Instance(pw=pwgen(), template=template, owner=owner,
share=share, state='PENDING') share=share, state='PENDING')
inst.save() inst.save()
hostname = u"cloud-%d" % (inst.id, ) hostname = u"%d" % (inst.id, )
with tempfile.NamedTemporaryFile(delete=False) as f: with tempfile.NamedTemporaryFile(delete=False) as f:
os.chmod(f.name, stat.S_IRUSR|stat.S_IWUSR|stat.S_IRGRP|stat.S_IROTH) os.chmod(f.name, stat.S_IRUSR|stat.S_IWUSR|stat.S_IRGRP|stat.S_IROTH)
token = signing.dumps(inst.id, salt='activate') token = signing.dumps(inst.id, salt='activate')
...@@ -638,13 +663,20 @@ class Instance(models.Model): ...@@ -638,13 +663,20 @@ class Instance(models.Model):
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_type['suspendx']
if which in ['delete', 'both']: if which in ['delete', 'both']:
self.time_of_delete = self.share.get_type()['deletex'] self.time_of_delete = self.share_type['deletex']
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()
@property
def share_type(self):
if self.share:
return self.share.get_type()
else:
return Share.extend_type(DEFAULT_TYPE)
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)
......
...@@ -9,7 +9,24 @@ $(function() { ...@@ -9,7 +9,24 @@ $(function() {
$(this).next('.details').slideDown(700); $(this).next('.details').slideDown(700);
} }
}) })
$('a').click(function(e) { $('a[href=#]').click(function(e) {
e.preventDefault();
});
$('.host-toggle').click(function(e){
e.preventDefault();
if($(this).find('.v4').is(':hidden')){
$(this).find('.v4').show();
$(this).find('.v6').hide();
$(this).parent().next().find('.host').show();
$(this).parent().next().find('.ipv4host').hide();
} else {
$(this).find('.v6').show();
$(this).find('.v4').hide();
$(this).parent().next().find('.host').hide();
$(this).parent().next().find('.ipv4host').show();
}
});
$('a[href!=#]').click(function(e) {
e.stopPropagation(); e.stopPropagation();
}); });
$('.delete-template').click(function(e) { $('.delete-template').click(function(e) {
...@@ -64,12 +81,14 @@ $(function() { ...@@ -64,12 +81,14 @@ $(function() {
var content = $('#vm-' + id + '-name').html(); var content = $('#vm-' + id + '-name').html();
var self=this; var self=this;
var url = $(this).data('url'); var url = $(this).data('url');
$('#vm-'+id).addClass('editing');
$(this).unbind('click').click(function(e){ $(this).unbind('click').click(function(e){
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
$(this).unbind('click').click(handler); $(this).unbind('click').click(handler);
$('#vm-' + id + '-name-details').show(); $('#vm-' + id + '-name-details').show();
$('#vm-' + id + '-name').html(content); $('#vm-' + id + '-name').html(content);
$('#vm-'+id).removeClass('editing');
}) })
$('#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 + '" />\
...@@ -91,6 +110,8 @@ $(function() { ...@@ -91,6 +110,8 @@ $(function() {
$('#vm-' + id + '-name-details').removeAttr('style'); $('#vm-' + id + '-name-details').removeAttr('style');
$('#vm-' + id + '-name').text(data.name); $('#vm-' + id + '-name').text(data.name);
$(self).click(handler); $(self).click(handler);
$(self).data('name', newName);
$('#vm-'+id).removeClass('editing');
} }
}); });
}) })
...@@ -120,7 +141,7 @@ $(function() { ...@@ -120,7 +141,7 @@ $(function() {
e.stopPropagation(); e.stopPropagation();
restart_vm($(this).data('id'), $(this).data('name')); restart_vm($(this).data('id'), $(this).data('name'));
}); });
$('.renew-suspend-vm').click(function(e) { $('.entry').on('click', '.renew-suspend-vm', function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
renew_suspend_vm($(this).data('id')) renew_suspend_vm($(this).data('id'))
...@@ -255,6 +276,20 @@ $(function() { ...@@ -255,6 +276,20 @@ $(function() {
function get_vm_details(id) { function get_vm_details(id) {
$.get('/vm/credentials/' + id, function(data) { $.get('/vm/credentials/' + id, function(data) {
$('#modal-container').html(data); $('#modal-container').html(data);
$('#modal-container .host-toggle').click(function(e){
e.preventDefault();
if($(this).find('.v4').is(':hidden')){
$(this).find('.v4').show();
$(this).find('.v6').hide();
$(this).parent().next().find('.host').show();
$(this).parent().next().find('.ipv4host').hide();
} else {
$(this).find('.v6').show();
$(this).find('.v4').hide();
$(this).parent().next().find('.host').hide();
$(this).parent().next().find('.ipv4host').show();
}
});
$('#modal-container .hidden-password').click(function() { $('#modal-container .hidden-password').click(function() {
if ($(this).attr('type') == 'password') { if ($(this).attr('type') == 'password') {
$(this).attr('type', 'text'); $(this).attr('type', 'text');
...@@ -282,6 +317,8 @@ $(function() { ...@@ -282,6 +317,8 @@ $(function() {
$('#modal').hide(); $('#modal').hide();
}); });
} }
cloud.confirm=vm_confirm_popup;
/** /**
* Manage VM State (STOP) * Manage VM State (STOP)
*/ */
...@@ -324,7 +361,11 @@ $(function() { ...@@ -324,7 +361,11 @@ $(function() {
*/ */
function renew_suspend_vm(id) { function renew_suspend_vm(id) {
manage_vm(id, "renew/suspend") manage_vm(id, "renew/suspend", function(data) {
//workaround for some strange jquery parse error :o
var foo=$('<div />').append(data);
$('#vm-'+id+' .details-container').replaceWith(foo.find('.details-container'));
});
} }
/** /**
* Renew vm deletion time. * Renew vm deletion time.
...@@ -337,12 +378,14 @@ $(function() { ...@@ -337,12 +378,14 @@ $(function() {
* Manage VM State generic * Manage VM State generic
*/ */
function manage_vm(id, state) { function manage_vm(id, state, f) {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/vm/' + state + '/' + id + '/', url: '/vm/' + state + '/' + id + '/',
success: function(data, b, c) { success: function(data, b, c) {
if (state == "resume") { if(f) {
f(data);
} else if (state == "resume") {
window.location.href = '/vm/show/' + id + "/"; window.location.href = '/vm/show/' + id + "/";
} else { } else {
window.location.reload(); window.location.reload();
...@@ -371,7 +414,7 @@ $(function() { ...@@ -371,7 +414,7 @@ $(function() {
function delete_template_confirm(url, 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(url, id)
}) })
} }
/** /**
...@@ -389,7 +432,8 @@ $(function() { ...@@ -389,7 +432,8 @@ $(function() {
alert(data['responseText']); alert(data['responseText']);
}, },
200: function(data) { 200: function(data) {
$("#t" + id).remove() $("#t" + id).remove();
alert(gettext('Template deletion successful!'));
}, },
} }
......
...@@ -343,7 +343,7 @@ var cloud = (function(cloud) { ...@@ -343,7 +343,7 @@ var cloud = (function(cloud) {
/** /**
* Requests a new upload link from the store server * Requests a new upload link from the store server
*/ */
self.getUploadURL = function() { self.getUploadURL = function(f) {
uploadURLRequestInProgress = true; uploadURLRequestInProgress = true;
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
...@@ -353,6 +353,7 @@ var cloud = (function(cloud) { ...@@ -353,6 +353,7 @@ var cloud = (function(cloud) {
success: function(data) { success: function(data) {
self.uploadURL(data.url); self.uploadURL(data.url);
uploadURLRequestInProgress = false; uploadURLRequestInProgress = false;
if (typeof f == 'function') f();
} }
}) })
} }
...@@ -387,8 +388,31 @@ var cloud = (function(cloud) { ...@@ -387,8 +388,31 @@ var cloud = (function(cloud) {
* Uploads the specified file(s) * Uploads the specified file(s)
*/ */
var readfiles = cloud.delayUntil(function(file, next) { var readfiles = cloud.delayUntil(function(file, next) {
console.log('read', file, next) for (var i in self.files()) {
//1 GB file limit var f = self.files()[i];
if (file.name == f.originalName) {
if (!confirm(
interpolate(
gettext('File %s is already present! Click OK to override it.'),
[file.name]
)
)
) {
return next();
}
}
}
if (file.name.indexOf('.') == -1 && file.size % 4096 == 0) {
if (!confirm(
interpolate(
gettext('%s seems to be a directory. Uploading directories is currently not supported. If you\'re sure that %s is a file, click OK to upload it.'),
[file.name, file.name]
)
)
) {
return next();
}
}
if (file.size > 1024 * 1024 * 1024) { if (file.size > 1024 * 1024 * 1024) {
$('#upload-zone').hide(); $('#upload-zone').hide();
$('#upload-error').show(); $('#upload-error').show();
...@@ -407,18 +431,11 @@ var cloud = (function(cloud) { ...@@ -407,18 +431,11 @@ var cloud = (function(cloud) {
var start = new Date().getTime(); var start = new Date().getTime();
xhr.open('POST', self.uploadURL()); xhr.open('POST', self.uploadURL());
xhr.onload = xhr.onerror = function() { xhr.onload = xhr.onerror = function() {
console.log('onload');
self.uploadProgress('0%'); self.uploadProgress('0%');
self.uploadURL('/'); self.uploadURL('/');
if (next) { console.log('complete, next');
console.log('complete, next')
next(); next();
} else {
$('.file-upload').removeClass('opened');
$('.file-upload .details').slideUp(700);
$('#upload-zone').show();
$('#upload-progress-text').hide();
loadFolder(self.currentPath());
}
} }
if (tests.progress) { if (tests.progress) {
$('#upload-zone').hide(); $('#upload-zone').hide();
...@@ -466,22 +483,25 @@ var cloud = (function(cloud) { ...@@ -466,22 +483,25 @@ var cloud = (function(cloud) {
var files = e.dataTransfer.files; var files = e.dataTransfer.files;
console.log(files); console.log(files);
console.log(e.dataTransfer.files); console.log(e.dataTransfer.files);
var i = 1; var i = 0;
readfiles(e.dataTransfer.files[0], function() { (function next() {
console.log('next', i); if (i >= files.length) {
next = arguments.callee; $('.file-upload').removeClass('opened');
return function() { $('.file-upload .details').slideUp(700);
console.log('readnext', i, len); $('#upload-zone').show();
if (i >= len - 2) { $('#upload-progress-text').hide();
console.log('end', i, len); loadFolder(self.currentPath());
self.getUploadURL();
readfiles(files[i++], null);
return; return;
} }
self.getUploadURL(); console.log('reading file ' + i);
readfiles(files[i++], next()); if (self.uploadURL() == '/') {
self.getUploadURL(function() {
readfiles(files[i++], next);
});
} else {
readfiles(files[i++], next);
} }
}()); })();
return false; return false;
}); });
document.addEventListener('dragover', function(e) { document.addEventListener('dragover', function(e) {
......
...@@ -419,6 +419,15 @@ body > footer { ...@@ -419,6 +419,15 @@ body > footer {
} }
} }
.host-toggle {
.v6 {
display: none;
}
}
.ipv4host {
display: none;
}
@media (max-width: 900px) { @media (max-width: 900px) {
#content { #content {
width: 100%; width: 100%;
...@@ -438,3 +447,10 @@ body > footer { ...@@ -438,3 +447,10 @@ body > footer {
font-size: 1.1em; font-size: 1.1em;
} }
} }
.vendor (@prop, @val) {
-foo: ~"bar; -webkit-@{prop}: @{val}; -moz-@{prop}: @{val}; -ms-@{prop}: @{val}; -o-@{prop}: @{val}; @{prop}: @{val};";
}
.vendorVal (@prop, @val, @arg) {
-foo: ~"bar; @{prop}: -webkit-@{val}(@{arg}); @{prop}: -moz-@{val}(@{arg}); @{prop}: -ms-@{val}(@{arg}); @{prop}: -o-@{val}(@{arg}); @{prop}: @{val}(@{arg});";
}
...@@ -67,10 +67,37 @@ ...@@ -67,10 +67,37 @@
list-style-type: none; list-style-type: none;
} }
.entry { .entry {
&.editing {
.summary {
&:hover .name > span {
width: 100%;
max-width: 100%;
}
.name > span {
width: 100%;
max-width: 100%;
}
}
}
&.opened { &.opened {
&.editing {
.summary {
.name > span {
width: 100%;
max-width: 100%;
}
}
}
.actions { .actions {
display: block !important; display: block !important;
} }
.summary .name {
.vendorVal(width, calc, "100% - 200px");
span {
.vendorVal(width, calc, "100% - 110px");
.vendorVal(max-width, calc, "100% - 95px");
}
}
.summary .name .details { .summary .name .details {
display: inline; display: inline;
border: none; border: none;
...@@ -81,11 +108,15 @@ ...@@ -81,11 +108,15 @@
cursor: default; cursor: default;
&:hover { &:hover {
background-color: #c1c1c1; background-color: #c1c1c1;
.name {
width: 90%;
}
} }
.name { .name {
background: none !important; background: none !important;
text-align: center; text-align: center;
float: none; float: none;
width: 90%;
} }
} }
&.small-row .summary{ &.small-row .summary{
...@@ -168,11 +199,18 @@ ...@@ -168,11 +199,18 @@
.actions { .actions {
display: block; display: block;
} }
.name .details { .name {
display: inline; .vendorVal(width, calc, "100% - 200px");
span {
.vendorVal(width, calc, "100% - 110px");
.vendorVal(max-width, calc, "100% - 95px");
}
.details {
display: block;
border: none; border: none;
} }
} }
}
.id { .id {
float: right; float: right;
...@@ -186,11 +224,20 @@ ...@@ -186,11 +224,20 @@
z-index: 2; z-index: 2;
position: relative; position: relative;
height: 24px; height: 24px;
.vendorVal(width, calc, "100% - 90px");
span {
float: left;
text-overflow: ellipsis;
display: block;
white-space: nowrap;
overflow: hidden;
}
&.filetype-new-folder { &.filetype-new-folder {
float: left; float: left;
} }
.details { .details {
display: none; display: none;
float: right;
} }
} }
.status { .status {
...@@ -321,7 +368,7 @@ ...@@ -321,7 +368,7 @@
font-size: .8em; font-size: .8em;
text-align: right; text-align: right;
} }
span { .entry span {
background-position: left center; background-position: left center;
background-repeat: no-repeat; background-repeat: no-repeat;
padding-left: 18px; padding-left: 18px;
...@@ -513,6 +560,10 @@ ...@@ -513,6 +560,10 @@
.content { .content {
padding: 15px; padding: 15px;
} }
.faded {
color: #666;
font-size: 0.8em;
}
} }
table { table {
...@@ -537,7 +588,17 @@ table { ...@@ -537,7 +588,17 @@ table {
.summary { .summary {
.name { .name {
background-image: url(/static/icons/users.png); background-image: url(/static/icons/users.png);
.vendorVal(width, calc, "100% - 70px");
}
}
li.owner {
background-image: url(/static/icons/user-worker-boss.png);
} }
li.course {
background-image: url(/static/icons/book-open.png);
}
li.members {
background-image: url(/static/icons/users.png);
} }
} }
#new-group { #new-group {
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,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 %}
......
...@@ -84,9 +84,9 @@ ...@@ -84,9 +84,9 @@
{% trans "Size" %}: {% trans "Size" %}:
<span class="value"> <span class="value">
{{s.template.instance_type.name}} {{s.template.instance_type.name}}
<span class="cpu">{{s.template.instance_type.CPU}}</span> <span title="{% trans 'CPU cores' %}" class="cpu">{{s.template.instance_type.CPU}}</span>
<span class="memory">{{s.template.instance_type.RAM}}</span> <span title="{% trans 'RAM' %}" class="memory">{{s.template.instance_type.RAM}}</span>
<span class="credit">{{s.template.instance_type.credit}}</span> <span title="{% trans 'Credit' %}" class="credit">{{s.template.instance_type.credit}}</span>
</span> </span>
</li> </li>
<li class="share-type"> <li class="share-type">
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% block content %} {% block content %}
<li class="entry {% if id == vm.id %}opened{% endif %}"> <li class="entry {% if id == vm.id %}opened{% endif %}" id="vm-{{vm.id}}">
{{block.super }} {{block.super }}
</li> </li>
{% endblock content %} {% endblock content %}
...@@ -22,17 +22,27 @@ ...@@ -22,17 +22,27 @@
</li> </li>
<li class="os-{{vm.template.os_type}}"> <li class="os-{{vm.template.os_type}}">
{% trans "System" %}: {% trans "System" %}:
<span class="value">{{vm.template.system}}</span> <span class="value">{{vm.template.system|default:"n/a"}}</span>
<div class="clear"></div> <div class="clear"></div>
</li> </li>
<li class="template"> <li class="template">
{% trans "Type" %}: {% trans "Type" %}:
<span class="value">{% if vm.share %}{{vm.share.type}}{% else %}{% trans "Try" %}{% endif %}</span> <span class="value">
{% if vm.share %}
{{vm.get_type}}
{% else %}
{% if vm.template.state != "READY" %}
{% trans "Master instance" %}
{% else %}
{% trans "Try" %}
{% endif %}
{% endif %}
</span>
<div class="clear"></div> <div class="clear"></div>
</li> </li>
<li class="template"> <li class="template">
{% trans "Share" %}: {% trans "Share" %}:
<span class="value">{{vm.share.name}}</span> <span class="value">{{vm.share.name|default:"n/a"}}</span>
<div class="clear"></div> <div class="clear"></div>
</li> </li>
<li class="template"> <li class="template">
...@@ -57,9 +67,9 @@ ...@@ -57,9 +67,9 @@
<li class="date"> <li class="date">
{% trans "time of suspend"|capfirst %}: {% trans "time of suspend"|capfirst %}:
<span class="value"> <abbr title="{{vm.time_of_suspend}}">{{vm.time_of_suspend|timeuntil}}</abbr> <span class="value"> <abbr title="{{vm.time_of_suspend}}">{{vm.time_of_suspend|timeuntil}}</abbr>
{% if vm.share %}<a href="#" class="renew-vm renew-suspend-vm" data-id="{{ vm.id }}" title="{% trans "Renew suspend time" %}"> <a href="#" class="renew-vm renew-suspend-vm" data-id="{{ vm.id }}" title="{% trans "Renew suspend time" %}">
<img src="{% static "icons/control-double.png" %}" alt="{% trans "Renew suspend time" %}" /> <img src="{% static "icons/control-double.png" %}" alt="{% trans "Renew suspend time" %}" />
</a>{% endif %} </a>
</span> </span>
</li> </li>
{% endif %} {% endif %}
...@@ -67,9 +77,9 @@ ...@@ -67,9 +77,9 @@
<li class="date"> <li class="date">
{% trans "time of delete"|capfirst %}: {% trans "time of delete"|capfirst %}:
<span class="value"> <abbr title="{{vm.time_of_delete}}">{{vm.time_of_delete|timeuntil}}</abbr> <span class="value"> <abbr title="{{vm.time_of_delete}}">{{vm.time_of_delete|timeuntil}}</abbr>
{% if vm.share %}<a href="#" class="renew-vm renew-delete-vm" data-id="{{ vm.id }}" title="{% trans "Renew deletion time" %}"> <a href="#" class="renew-vm renew-delete-vm" data-id="{{ vm.id }}" title="{% trans "Renew deletion time" %}">
<img src="{% static "icons/control-double.png" %}" alt="{% trans "Renew deletion time" %}" /> <img src="{% static "icons/control-double.png" %}" alt="{% trans "Renew deletion time" %}" />
</a>{% endif %} </a>
</span> </span>
</li> </li>
{% endif %} {% endif %}
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
{% block name %} {% block name %}
<div class="name {% if vm.state == 'ACTIVE' %}vm-on{% else %}vm-off{% endif %}"> <div class="name {% if vm.state == 'ACTIVE' %}vm-on{% else %}vm-off{% endif %}">
<span id="vm-{{vm.id}}-name">{{vm.name|truncatechars:20}}</span> <span id="vm-{{vm.id}}-name">{{vm.name}}</span>
<small id="vm-{{vm.id}}-name-details" class="details"> <small id="vm-{{vm.id}}-name-details" class="details">
(<a href="{{ vm.get_absolute_url }}" title="{{vm.name}}">{% trans "More details" %}</a>) (<a href="{{ vm.get_absolute_url }}" title="{{vm.name}}">{% trans "More details" %}</a>)
</small> </small>
......
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
'type': 'GET', 'type': 'GET',
'url': '{% url one.views.ajax_template_name_unique %}?name=' + $("#new-template-name").val(), 'url': '{% url one.views.ajax_template_name_unique %}?name=' + $("#new-template-name").val(),
'success': function(data, b, c) { 'success': function(data, b, c) {
if (data == "True" || s == original) { if (data == "True" || $("#new-template-name").val() == original) {
$("#template-wizard").unbind('submit').submit() $("#template-wizard").unbind('submit').submit()
} }
else { else {
......
...@@ -37,11 +37,11 @@ ...@@ -37,11 +37,11 @@
{% for s in sizes %} {% for s in sizes %}
<p id="new-template-size-summary-{{s.id}}" class="size-summary clear" <p id="new-template-size-summary-{{s.id}}" class="size-summary clear"
{% if s != base.instance_type %}style="display:none"{% endif %}> {% if s != base.instance_type %}style="display:none"{% endif %}>
<span class="cpu"> <span title="{% trans 'CPU cores' %}" class="cpu">
{% blocktrans count n=s.CPU %}{{n}} core{% plural %}{{n}} cores{% endblocktrans %} {% blocktrans count n=s.CPU %}{{n}} core{% plural %}{{n}} cores{% endblocktrans %}
</span> </span>
<span class="memory">{{s.RAM}} MiB</span> <span title="{% trans 'RAM' %}" class="memory">{{s.RAM}} MiB</span>
<span class="credit">{{s.credit}}</span> <span title="{% trans 'Credit' %}" class="credit">{{s.credit}}</span>
</p> </p>
{% endfor %} {% endfor %}
<div class="clear"></div> <div class="clear"></div>
......
...@@ -37,6 +37,10 @@ ...@@ -37,6 +37,10 @@
</script> </script>
{% endblock %} {% endblock %}
{% block title %}
{% blocktrans with name=i.name %}Details of {{name}}{% endblocktrans %}
- {{block.super}}
{% endblock %}
{% block content %} {% block content %}
{% if i.template.state != "READY" %} {% if i.template.state != "READY" %}
...@@ -141,36 +145,63 @@ ...@@ -141,36 +145,63 @@
{% csrf_token %} {% csrf_token %}
<table> <table>
<tr> <tr>
<th>{% trans "Protocol" %}</th> <th>{% trans "Port" %}</th>
<th>{% trans "Public port" %}</th> <th colspan="2">{% trans "Access" %}</th>
{% if i.template.network.nat %}<th colspan="2">{% trans "Private port" %}</th>{%endif%}
</tr> </tr>
{% for port in ports %} {% for port in ports %}
<tr> <tr{% if i.is_ipv6 %} class="faded"{% endif %}>
<td>{{port.proto}}</td> <td>{{port.private}}/{{port.proto}}</td>
<td>{{port.public}}</td> <td style="white-space: nowrap;">
{% if i.template.network.nat %}<td>{{port.private}}</td>{%endif%} {% if port.private == 80 or port.private == 8080 or port.private == 8000 %}
<a href="http://{{port.ipv4.host}}:{{port.ipv4.port}}">
{{port.ipv4.host}}:{{port.ipv4.port}}
</a>
{% elif port.private == 443 %}
<a href="https://{{port.ipv4.host}}:{{port.ipv4.port}}">{{port.ipv4.host}}:{{port.ipv4.port}}</a>
{% else %}
{{port.ipv4.host}}:{{port.ipv4.port}}
{% endif %}
</td>
{% if not i.is_ipv6 %}
<td>
<a href="{% url one.views.vm_port_del i.id port.proto port.private %}">{% trans "Delete" %}</a>
</td>
{% endif %}
</tr>
<tr{% if not i.is_ipv6 %} style="display: none"{% endif %}>
<td>{{port.private}}/{{port.proto}}6</td>
<td style="white-space: nowrap;">
{% if port.private == 80 or port.private == 8080 or port.private == 8000 %}
<a href="http://{{port.ipv6.host}}:{{port.ipv6.port}}">
{{port.ipv6.host}}:{{port.ipv6.port}}
</a>
{% elif port.private == 443 %}
<a href="https://{{port.ipv6.host}}:{{port.ipv6.port}}">
{{port.ipv6.host}}:{{port.ipv6.port}}
</a>
{% else %}
{{port.ipv6.host}}:{{port.ipv6.port}}
{% endif %}
</td>
{% if i.is_ipv6 %}
<td> <td>
<a href="{% url one.views.vm_port_del i.id port.proto port.public %}">{% trans "Delete" %}</a> <a href="{% url one.views.vm_port_del i.id port.proto port.private %}">{% trans "Delete" %}</a>
</td> </td>
{% endif %}
</tr> </tr>
{% endfor %} {% endfor %}
<tr> <tr>
<td> <th colspan="3">{% trans "Port/Protocol" %}</th>
<select style="min-width:50px;" name=proto> </tr>
<tr>
<td colspan="2">
<input style="min-width:50px;width:50px;" type="text" name="port"/>/
<select style="min-width:50px;" name="proto">
<option value="tcp">tcp</option> <option value="tcp">tcp</option>
<option value="udp">udp</option> <option value="udp">udp</option>
</select> </select>
</td> </td>
<td> <td>
<input style="min-width:70px;width:70px;" type="text" name="public"/>
</td>
{% if i.template.network.nat %}
<td>
<input style="min-width:70px;width:70px;" type="text" name="private"/>
</td>
{% endif %}
<td>
<input type="submit" style="min-width:3em" value="{% trans "Add" %}" /> <input type="submit" style="min-width:3em" value="{% trans "Add" %}" />
</td> </td>
</tr> </tr>
......
...@@ -36,13 +36,13 @@ ...@@ -36,13 +36,13 @@
{{i.template.access_type|upper}} {{i.template.access_type|upper}}
</td> </td>
</tr> </tr>
<tr> <tr{% if i.is_ipv6 %} class="faded"{% endif %}>
<th>{% trans "IP" %}:</th> <th>{% trans "IPv4 Host" %}{% if i.is_ipv6 %} ({% trans "You are using IPv6" %}){% endif %}:</th>
<td>{{ i.hostname }}</td> <td>{{ i.hostname_v4 }}<strong>:{{ i.port_v4 }}</strong></td>
</tr> </tr>
<tr> <tr{% if not i.is_ipv6 %} style="display: none"{% endif %}>
<th>{% trans "Port" %}:</th> <th>{% trans "IPv6 Host" %}{% if not i.is_ipv6 %} ({% trans "You are using IPv4" %}){% endif %}:</th>
<td>{{ i.port}}</td> <td>{{ i.hostname_v6 }}<strong>:{{ i.port_v6 }}</strong></td>
</tr> </tr>
<tr> <tr>
<th>{% trans "Username" %}:</th> <th>{% trans "Username" %}:</th>
......
...@@ -16,7 +16,7 @@ from django.template import RequestContext ...@@ -16,7 +16,7 @@ from django.template import RequestContext
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.translation import get_language as lang from django.utils.translation import get_language as lang
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _, ungettext_lazy
from django.views.decorators.http import * from django.views.decorators.http import *
from django.views.generic import * from django.views.generic import *
from firewall.tasks import * from firewall.tasks import *
...@@ -104,9 +104,12 @@ def ajax_template_name_unique(request): ...@@ -104,9 +104,12 @@ def ajax_template_name_unique(request):
def vm_credentials(request, iid): def vm_credentials(request, iid):
try: try:
vm = get_object_or_404(Instance, pk=iid, owner=request.user) vm = get_object_or_404(Instance, pk=iid, owner=request.user)
proto = len(request.META["REMOTE_ADDR"].split('.')) == 1 is_ipv6 = len(request.META["REMOTE_ADDR"].split('.')) == 1
vm.hostname = vm.get_connect_host(use_ipv6=proto) vm.hostname_v4 = vm.get_connect_host(use_ipv6=False)
vm.port = vm.get_port(use_ipv6=proto) vm.hostname_v6 = vm.get_connect_host(use_ipv6=True)
vm.is_ipv6 = is_ipv6
vm.port_v4 = vm.get_port(use_ipv6=False)
vm.port_v6 = vm.get_port(use_ipv6=True)
return render_to_response('vm-credentials.html', RequestContext(request, { 'i' : vm })) return render_to_response('vm-credentials.html', RequestContext(request, { 'i' : vm }))
except: except:
return HttpResponse(_("Could not get Virtual Machine credentials."), status=404) return HttpResponse(_("Could not get Virtual Machine credentials."), status=404)
...@@ -278,7 +281,7 @@ def _check_quota(request, template, share): ...@@ -278,7 +281,7 @@ def _check_quota(request, template, share):
Returns if the given request is permitted to run the new vm. Returns if the given request is permitted to run the new vm.
""" """
det = UserCloudDetails.objects.get(user=request.user) det = UserCloudDetails.objects.get(user=request.user)
if det.get_weighted_instance_count() + template.instance_type.credit >= det.instance_quota: if det.get_weighted_instance_count() + template.instance_type.credit > det.instance_quota:
messages.error(request, _('You do not have any free quota. You can not launch this until you stop an other instance.')) messages.error(request, _('You do not have any free quota. You can not launch this until you stop an other instance.'))
return False return False
if share: if share:
...@@ -364,9 +367,12 @@ def vm_show(request, iid): ...@@ -364,9 +367,12 @@ def vm_show(request, iid):
except UserCloudDetails.DoesNotExist: except UserCloudDetails.DoesNotExist:
details = UserCloudDetails(user=request.user) details = UserCloudDetails(user=request.user)
details.save() details.save()
proto = len(request.META["REMOTE_ADDR"].split('.')) == 1 is_ipv6 = len(request.META["REMOTE_ADDR"].split('.')) == 1
inst.hostname = inst.get_connect_host(use_ipv6=proto) inst.is_ipv6 = is_ipv6
inst.port = inst.get_port(use_ipv6=proto) inst.hostname_v4 = inst.get_connect_host(use_ipv6=False)
inst.hostname_v6 = inst.get_connect_host(use_ipv6=True)
inst.port_v4 = inst.get_port(use_ipv6=False)
inst.port_v6 = inst.get_port(use_ipv6=True)
return render_to_response("show.html", RequestContext(request,{ return render_to_response("show.html", RequestContext(request,{
'uri': inst.get_connect_uri(), 'uri': inst.get_connect_uri(),
'state': inst.state, 'state': inst.state,
...@@ -415,20 +421,19 @@ def boot_token(request, token): ...@@ -415,20 +421,19 @@ def boot_token(request, token):
class VmPortAddView(View): class VmPortAddView(View):
def post(self, request, iid, *args, **kwargs): def post(self, request, iid, *args, **kwargs):
try: try:
public = int(request.POST['public']) port = int(request.POST['port'])
if public >= 22000 and public < 24000:
raise ValidationError(_("Port number is in a restricted domain (22000 to 24000)."))
inst = get_object_or_404(Instance, id=iid, owner=request.user) inst = get_object_or_404(Instance, id=iid, owner=request.user)
if inst.template.network.nat: if inst.nat:
private = private=int(request.POST['private']) inst.firewall_host.add_port(proto=request.POST['proto'],
public=None, private=port)
else: else:
private = 0 inst.firewall_host.add_port(proto=request.POST['proto'],
inst.firewall_host.add_port(proto=request.POST['proto'], public=public, private=private) public=port, private=None)
messages.success(request, _(u"Port %d successfully added.") % public)
except: except:
messages.error(request, _(u"Adding port failed.")) messages.error(request, _(u"Adding port failed."))
# raise else:
messages.success(request, _(u"Port %d successfully added.") % port)
return redirect('/vm/show/%d/' % int(iid)) return redirect('/vm/show/%d/' % int(iid))
def get(self, request, iid, *args, **kwargs): def get(self, request, iid, *args, **kwargs):
...@@ -439,11 +444,12 @@ vm_port_add = login_required(VmPortAddView.as_view()) ...@@ -439,11 +444,12 @@ vm_port_add = login_required(VmPortAddView.as_view())
@require_safe @require_safe
@login_required @login_required
@require_GET @require_GET
def vm_port_del(request, iid, proto, public): def vm_port_del(request, iid, proto, private):
inst = get_object_or_404(Instance, id=iid, owner=request.user) inst = get_object_or_404(Instance, id=iid, owner=request.user)
try: try:
inst.firewall_host.del_port(proto=proto, public=public) inst.firewall_host.del_port(proto=proto, private=private)
messages.success(request, _(u"Port %s successfully removed.") % public) messages.success(request, _(u"Port %s successfully removed.") %
private)
except: except:
messages.error(request, _(u"Removing port failed.")) messages.error(request, _(u"Removing port failed."))
return redirect('/vm/show/%d/' % int(iid)) return redirect('/vm/show/%d/' % int(iid))
...@@ -478,12 +484,21 @@ def vm_unshare(request, id, *args, **kwargs): ...@@ -478,12 +484,21 @@ def vm_unshare(request, id, *args, **kwargs):
if not g.owners.filter(user=request.user).exists(): if not g.owners.filter(user=request.user).exists():
raise PermissionDenied() raise PermissionDenied()
try: try:
if s.get_running_or_stopped() > 0: n = s.get_running()
messages.error(request, _('There are machines running of this share.')) m = s.get_running_or_stopped()
if n > 0:
messages.error(request, ungettext_lazy('There is a machine running of this share.',
'There are %(n)d machines running of this share.', n) %
{'n' : n})
elif m > 0:
messages.error(request, ungettext_lazy('There is a suspended machine of this share.',
'There are %(m)d suspended machines of this share.', m) %
{'m' : m})
else: else:
s.delete() s.delete()
messages.success(request, _('Share is successfully removed.')) messages.success(request, _('Share is successfully removed.'))
except: except Exception as e:
print e
messages.error(request, _('Failed to remove share.')) messages.error(request, _('Failed to remove share.'))
return redirect(g) return redirect(g)
...@@ -516,11 +531,15 @@ def vm_resume(request, iid, *args, **kwargs): ...@@ -516,11 +531,15 @@ def vm_resume(request, iid, *args, **kwargs):
@require_POST @require_POST
def vm_renew(request, which, iid, *args, **kwargs): def vm_renew(request, which, iid, *args, **kwargs):
try: try:
get_object_or_404(Instance, id=iid, owner=request.user).renew() vm = get_object_or_404(Instance, id=iid, owner=request.user)
vm.renew()
messages.success(request, _('Virtual machine is successfully renewed.')) messages.success(request, _('Virtual machine is successfully renewed.'))
except: except:
messages.error(request, _('Failed to renew virtual machine.')) messages.error(request, _('Failed to renew virtual machine.'))
return redirect('/') return redirect('/')
return render_to_response('box/vm/entry.html', RequestContext(request, {
'vm': vm
}))
@login_required @login_required
@require_POST @require_POST
......
...@@ -6,8 +6,8 @@ msgid "" ...@@ -6,8 +6,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-22 10:43+0100\n" "POT-Creation-Date: 2013-04-04 18:33+0200\n"
"PO-Revision-Date: 2013-03-07 17:48+0100\n" "PO-Revision-Date: 2013-04-04 18:03+0200\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"
"Language: en_US\n" "Language: en_US\n"
...@@ -155,39 +155,44 @@ msgstr "Érvénytelen Neptun-kód." ...@@ -155,39 +155,44 @@ msgstr "Érvénytelen Neptun-kód."
msgid "Invalid NEPTUN code" msgid "Invalid NEPTUN code"
msgstr "Érvénytelen Neptun-kód" msgstr "Érvénytelen Neptun-kód"
#: templates/show-group.html:9 #: templates/show-group.html:7
#, python-format
msgid "Details of %(name)s"
msgstr "%(name)s részletei"
#: templates/show-group.html:15
msgid "Owners of" msgid "Owners of"
msgstr "Tulajdonosok" msgstr "Tulajdonosok"
#: templates/show-group.html:23 templates/box/person/entry.html:23 #: templates/show-group.html:29 templates/box/person/entry.html:23
msgid "Remove" msgid "Remove"
msgstr "Eltávolítás" msgstr "Eltávolítás"
#: templates/show-group.html:31 templates/box/person/entry.html:32 #: templates/show-group.html:37 templates/box/person/entry.html:32
msgid "This user never logged in, no data available" msgid "This user never logged in, no data available"
msgstr "Ez a felhasználó még nem lépett be, nincs adat róla" msgstr "Ez a felhasználó még nem lépett be, nincs adat róla"
#: templates/show-group.html:35 templates/box/person/entry.html:36 #: templates/show-group.html:41 templates/box/person/entry.html:36
msgid "Name" msgid "Name"
msgstr "Név" msgstr "Név"
#: templates/show-group.html:38 templates/box/person/entry.html:39 #: templates/show-group.html:44 templates/box/person/entry.html:39
msgid "NEPTUN" msgid "NEPTUN"
msgstr "NEPTUN" msgstr "NEPTUN"
#: templates/show-group.html:51 #: templates/show-group.html:57
msgid "Add owner" msgid "Add owner"
msgstr "Tulajdonos hozzáadása" msgstr "Tulajdonos hozzáadása"
#: templates/show-group.html:56 #: templates/show-group.html:62
msgid "Owner name/NEPTUN" msgid "Owner name/NEPTUN"
msgstr "Tulajdonos neve/NEPTUN-kódja" msgstr "Tulajdonos neve/NEPTUN-kódja"
#: templates/show-group.html:69 #: templates/show-group.html:75
msgid "This group has no shared templates." msgid "This group has no shared templates."
msgstr "Ennek a csoportnak egy sablon sincs megosztva." msgstr "Ennek a csoportnak egy sablon sincs megosztva."
#: templates/show-group.html:72 #: templates/show-group.html:78
msgid "Share one, and the group members can start their own virtual machine." msgid "Share one, and the group members can start their own virtual machine."
msgstr "" msgstr ""
"Osszon meg egyet, hogy a csoport tagjai is elindíthassák egy példányát." "Osszon meg egyet, hogy a csoport tagjai is elindíthassák egy példányát."
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
{% block details %} {% block details %}
<ul> <ul>
<li> <li class="course">
{% trans "Course" %}: {% trans "Course" %}:
<span class="value"> <span class="value">
{% if group.course %} {% if group.course %}
...@@ -39,15 +39,15 @@ ...@@ -39,15 +39,15 @@
{% endif %} {% endif %}
</span> </span>
</li> </li>
<li> <li class="date">
{% trans "Semester" %}: {% trans "Semester" %}:
<span class="value">{{group.semester.name}}</span> <span class="value">{{group.semester.name}}</span>
</li> </li>
<li> <li class="owner">
{% trans "Owner(s)" %}: {% trans "Owner(s)" %}:
<span class="value">{{group.owner_list}}</span> <span class="value">{{group.owner_list}}</span>
</li> </li>
<li> <li class="members">
{% trans "Member count" %}: {% trans "Member count" %}:
<span class="value">{{group.member_count}}</span> <span class="value">{{group.member_count}}</span>
</li> </li>
......
...@@ -2,6 +2,12 @@ ...@@ -2,6 +2,12 @@
{% load i18n %} {% load i18n %}
{% load staticfiles %} {% load staticfiles %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% block title %}
{% blocktrans with name=group.name %}Details of {{name}}{% endblocktrans %}
- {{block.super}}
{% endblock %}
{% block content %} {% block content %}
<div class="boxes"> <div class="boxes">
{% include "box/person/box.html" %} {% include "box/person/box.html" %}
......
from django.test import TestCase from django.test import TestCase
from models import create_user_profile, Person from models import create_user_profile, Person, Course, Semester
from datetime import datetime, timedelta
class MockUser: class MockUser:
username = "testuser" username = "testuser"
...@@ -50,3 +51,24 @@ class PersonTestCase(TestCase): ...@@ -50,3 +51,24 @@ class PersonTestCase(TestCase):
def test_unicode(self): def test_unicode(self):
# TODO # TODO
self.testperson.__unicode__() self.testperson.__unicode__()
class CourseTestCase(TestCase):
def setUp(self):
now = datetime.now()
delta = timedelta(weeks=7)
self.testperson1 = Person.objects.create(code="testperson1")
self.testperson2 = Person.objects.create(code="testperson2")
self.testsemester = Semester.objects.create(name="testsemester",
start=now-delta, end=now+delta)
self.testcourse = Course.objects.create(code="testcode",
name="testname", short_name="tn")
self.testcourse.owners.add(self.testperson1, self.testperson2)
def test_get_or_create_default_group(self):
default_group = self.testcourse.get_or_create_default_group()
self.assertIsNotNone(default_group)
self.assertEquals(default_group, self.testcourse.default_group)
def test_owner_list(self):
owner_list = self.testcourse.owner_list()
self.assertIsNotNone(owner_list)
...@@ -198,7 +198,7 @@ def gui(request): ...@@ -198,7 +198,7 @@ def gui(request):
else: else:
return HttpResponse('Can not update authorization information!') return HttpResponse('Can not update authorization information!')
if StoreApi.updateauthorizationinfo(user, password, key_list): if StoreApi.updateauthorizationinfo(user, password, key_list):
return HttpResponse('https://cloud.ik.bme.hu/?neptun='+user+"&"+"host="+StoreApi.get_host()) return HttpResponse('https://cloud.ik.bme.hu/home/'+'?neptun='+user+'&'+'host='+StoreApi.get_host())
else: else:
return HttpResponse('Can not update authorization information!') return HttpResponse('Can not update authorization information!')
else: else:
......
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