{% endblock %}
-
-{% block extra_js %}
-
-
-{% endblock %}
diff --git a/circle/dashboard/templates/dashboard/vm-opensearch.xml b/circle/dashboard/templates/dashboard/vm-opensearch.xml
new file mode 100644
index 0000000..cf323d8
--- /dev/null
+++ b/circle/dashboard/templates/dashboard/vm-opensearch.xml
@@ -0,0 +1,6 @@
+{% load i18n %}
+
+ {% blocktrans with name=COMPANY_NAME %}{{name}} virtual machines{% endblocktrans %}
+
+
diff --git a/circle/dashboard/tests/test_templates.py b/circle/dashboard/tests/test_templates.py
new file mode 100644
index 0000000..2592bc4
--- /dev/null
+++ b/circle/dashboard/tests/test_templates.py
@@ -0,0 +1,52 @@
+# Copyright 2014 Budapest University of Technology and Economics (BME IK)
+#
+# This file is part of CIRCLE Cloud.
+#
+# CIRCLE is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along
+# with CIRCLE. If not, see .
+
+from os import listdir
+from os.path import isfile, isdir, join
+import unittest
+
+from django.conf import settings
+from django.template import Template, Context, VariableDoesNotExist
+from django.template.loader import find_template_loader
+from django.core.urlresolvers import NoReverseMatch
+
+
+class TemplateSyntaxTestCase(unittest.TestCase):
+
+ def test_templates(self):
+ """Test all templates for syntax errors."""
+ for loader_name in settings.TEMPLATE_LOADERS:
+ print loader_name
+ loader = find_template_loader(loader_name)
+ self._test_dir(loader.get_template_sources(''))
+
+ def _test_dir(self, dir, path="/"):
+ for i in dir:
+ i = join(path, i)
+ if isfile(i):
+ self._test_template(join(path, i))
+ elif isdir(i):
+ print "%s:" % i
+ self._test_dir(listdir(i), i)
+
+ def _test_template(self, path):
+ print path
+ try:
+ Template(open(path).read()).render(Context({}))
+ except (NoReverseMatch, VariableDoesNotExist, KeyError, AttributeError,
+ ValueError, ) as e:
+ print e
diff --git a/circle/dashboard/urls.py b/circle/dashboard/urls.py
index 9bbc5b2..2c93f64 100644
--- a/circle/dashboard/urls.py
+++ b/circle/dashboard/urls.py
@@ -50,6 +50,7 @@ from .views import (
VmGraphView, NodeGraphView, NodeListGraphView,
TransferInstanceOwnershipView, TransferInstanceOwnershipConfirmView,
TransferTemplateOwnershipView, TransferTemplateOwnershipConfirmView,
+ OpenSearchDescriptionView,
)
from .views.vm import vm_ops, vm_mass_ops
from .views.node import node_ops
@@ -221,6 +222,8 @@ urlpatterns = patterns(
name="dashboard.views.client-check"),
url(r'^token-login/(?P.*)/$', TokenLogin.as_view(),
name="dashboard.views.token-login"),
+ url(r'^vm/opensearch.xml$', OpenSearchDescriptionView.as_view(),
+ name="dashboard.views.vm-opensearch"),
)
urlpatterns += patterns(
diff --git a/circle/dashboard/views/index.py b/circle/dashboard/views/index.py
index bd4839a..2ffb18a 100644
--- a/circle/dashboard/views/index.py
+++ b/circle/dashboard/views/index.py
@@ -19,6 +19,7 @@ from __future__ import unicode_literals, absolute_import
import logging
from django.core.cache import get_cache
+from django.core.urlresolvers import reverse
from django.conf import settings
from django.contrib.auth.models import Group
from django.views.generic import TemplateView
@@ -121,3 +122,15 @@ class HelpView(TemplateView):
ctx.update({"saml": hasattr(settings, "SAML_CONFIG"),
"store": settings.STORE_URL})
return ctx
+
+
+class OpenSearchDescriptionView(TemplateView):
+ template_name = "dashboard/vm-opensearch.xml"
+ content_type = "application/opensearchdescription+xml"
+
+ def get_context_data(self, **kwargs):
+ context = super(OpenSearchDescriptionView, self).get_context_data(
+ **kwargs)
+ context['url'] = self.request.build_absolute_uri(
+ reverse("dashboard.views.vm-list"))
+ return context
diff --git a/circle/dashboard/views/vm.py b/circle/dashboard/views/vm.py
index 606b768..b02153f 100644
--- a/circle/dashboard/views/vm.py
+++ b/circle/dashboard/views/vm.py
@@ -115,6 +115,7 @@ class VmDetailView(GraphMixin, CheckedDetailView):
'op': {i.op: i for i in ops},
'connect_commands': user.profile.get_connect_commands(instance),
'hide_tutorial': hide_tutorial,
+ 'fav': instance.favourite_set.filter(user=user).exists(),
})
# activity data
diff --git a/circle/fabfile.py b/circle/fabfile.py
index 42e1477..73460b9 100755
--- a/circle/fabfile.py
+++ b/circle/fabfile.py
@@ -34,6 +34,15 @@ def pip(env, req):
run("pip install -r %s" % req)
+def bower(component=None):
+ "Install bower component"
+ with cd("~/circle/circle"):
+ if component:
+ run("bower install %s" % component)
+ else:
+ run("bower install")
+
+
@roles('portal')
def migrate():
"Run db migrations"
@@ -113,11 +122,14 @@ def pull(dir="~/circle/circle"):
@roles('portal')
-def update_portal(test=False):
+def update_portal(test=False, git=True):
"Update and restart portal+manager"
with _stopped("portal", "manager"):
- pull()
+ if git:
+ pull()
+ cleanup()
pip("circle", "~/circle/requirements.txt")
+ bower()
migrate()
compile_things()
if test:
@@ -125,6 +137,12 @@ def update_portal(test=False):
@roles('portal')
+def build_portal():
+ "Update portal without pulling from git"
+ return update_portal(False, False)
+
+
+@roles('portal')
def stop_portal(test=False):
"Stop portal and manager"
_stop_services("portal", "manager")
@@ -136,10 +154,15 @@ def update_node():
with _stopped("node", "agentdriver", "monitor-client"):
pull("~/vmdriver")
pip("vmdriver", "~/vmdriver/requirements/production.txt")
+ _cleanup("~/vmdriver")
+
pull("~/agentdriver")
pip("agentdriver", "~/agentdriver/requirements.txt")
+ _cleanup("~/agentdriver")
+
pull("~/monitor-client")
pip("monitor-client", "~/monitor-client/requirements.txt")
+ _cleanup("~/monitor-client")
@parallel
@@ -161,6 +184,18 @@ def checkout(vmdriver="master", agent="master"):
run("git checkout %s" % agent)
+@roles('portal')
+def cleanup():
+ "Clean pyc files of portal"
+ _cleanup()
+
+
+def _cleanup(dir="~/circle/circle"):
+ "Clean pyc files"
+ with cd("~/circle/circle"):
+ run("find -name '*.py[co]' -exec rm -f {} +")
+
+
def _stop_services(*services):
"Stop given services (warn only if not running)"
with settings(warn_only=True):
@@ -189,3 +224,12 @@ def _stopped(*services):
def _workon(name):
return prefix("source ~/.virtualenvs/%s/bin/activate && "
"source ~/.virtualenvs/%s/bin/postactivate" % (name, name))
+
+
+@roles('portal')
+def install_bash_completion_script():
+ sudo("wget https://raw.githubusercontent.com/marcelor/fabric-bash-"
+ "autocompletion/48baf5735bafbb2be5be8787d2c2c04a44b6cdb0/fab "
+ "-O /etc/bash_completion.d/fab")
+ print("To have bash completion instantly, run\n"
+ " source /etc/bash_completion.d/fab")
diff --git a/circle/firewall/fields.py b/circle/firewall/fields.py
index 8da33a4..6113ba0 100644
--- a/circle/firewall/fields.py
+++ b/circle/firewall/fields.py
@@ -15,6 +15,7 @@
# You should have received a copy of the GNU General Public License along
# with CIRCLE. If not, see .
+from string import ascii_letters
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import ugettext_lazy as _
@@ -22,7 +23,7 @@ from django.utils.ipv6 import is_valid_ipv6_address
from south.modelsinspector import add_introspection_rules
from django import forms
from netaddr import (IPAddress, IPNetwork, AddrFormatError, ZEROFILL,
- EUI, mac_unix)
+ EUI, mac_unix, AddrConversionError)
import re
@@ -31,7 +32,6 @@ domain_re = re.compile(r'^([A-Za-z0-9_-]\.?)+$')
domain_wildcard_re = re.compile(r'^(\*\.)?([A-Za-z0-9_-]\.?)+$')
ipv4_re = re.compile('^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$')
reverse_domain_re = re.compile(r'^(%\([abcd]\)d|[a-z0-9.-])+$')
-ipv6_template_re = re.compile(r'^(%\([abcd]\)[dxX]|[A-Za-z0-9:-])+$')
class mac_custom(mac_unix):
@@ -246,15 +246,60 @@ def val_reverse_domain(value):
raise ValidationError(u'%s - invalid reverse domain name' % value)
-def is_valid_ipv6_template(value):
- """Check whether the parameter is a valid ipv6 template."""
- return ipv6_template_re.match(value) is not None
-
-
def val_ipv6_template(value):
- """Validate whether the parameter is a valid ipv6 template."""
- if not is_valid_ipv6_template(value):
- raise ValidationError(u'%s - invalid reverse ipv6 template' % value)
+ """Validate whether the parameter is a valid ipv6 template.
+
+ Normal use:
+ >>> val_ipv6_template("123::%(a)d:%(b)d:%(c)d:%(d)d")
+ >>> val_ipv6_template("::%(a)x:%(b)x:%(c)d:%(d)d")
+
+ Don't have to use all bytes from the left (no a):
+ >>> val_ipv6_template("::%(b)x:%(c)d:%(d)d")
+
+ But have to use all ones to the right (a, but no b):
+ >>> val_ipv6_template("::%(a)x:%(c)d:%(d)d")
+ Traceback (most recent call last):
+ ...
+ ValidationError: [u"template doesn't use parameter b"]
+
+ Detects valid templates building invalid ips:
+ >>> val_ipv6_template("xxx::%(a)d:%(b)d:%(c)d:%(d)d")
+ Traceback (most recent call last):
+ ...
+ ValidationError: [u'template renders invalid IPv6 address']
+
+ Also IPv4-compatible addresses are invalid:
+ >>> val_ipv6_template("::%(a)02x%(b)02x:%(c)d:%(d)d")
+ Traceback (most recent call last):
+ ...
+ ValidationError: [u'template results in IPv4 address']
+ """
+ tpl = {ascii_letters[i]: 255 for i in range(4)}
+ try:
+ v6 = value % tpl
+ except:
+ raise ValidationError(_('%s: invalid template') % value)
+
+ used = False
+ for i in ascii_letters[:4]:
+ try:
+ value % {k: tpl[k] for k in tpl if k != i}
+ except KeyError:
+ used = True # ok, it misses this key
+ else:
+ if used:
+ raise ValidationError(
+ _("template doesn't use parameter %s") % i)
+ try:
+ v6 = IPAddress(v6, 6)
+ except:
+ raise ValidationError(_('template renders invalid IPv6 address'))
+ try:
+ v6.ipv4()
+ except (AddrConversionError, AddrFormatError):
+ pass # can't converted to ipv4 == it's real ipv6
+ else:
+ raise ValidationError(_('template results in IPv4 address'))
def is_valid_ipv4_address(value):
@@ -284,12 +329,3 @@ def val_mx(value):
domain_re.match(mx[1])):
raise ValidationError(_("Bad MX address format. "
"Should be: :"))
-
-
-def convert_ipv4_to_ipv6(ipv6_template, ipv4):
- """Convert IPv4 address string to IPv6 address string."""
- m = ipv4.words
- return IPAddress(ipv6_template % {'a': int(m[0]),
- 'b': int(m[1]),
- 'c': int(m[2]),
- 'd': int(m[3])})
diff --git a/circle/firewall/management/__init__.py b/circle/firewall/management/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/circle/firewall/management/__init__.py
diff --git a/circle/firewall/management/commands/__init__.py b/circle/firewall/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/circle/firewall/management/commands/__init__.py
diff --git a/circle/firewall/management/commands/reload_firewall.py b/circle/firewall/management/commands/reload_firewall.py
new file mode 100644
index 0000000..9be52f8
--- /dev/null
+++ b/circle/firewall/management/commands/reload_firewall.py
@@ -0,0 +1,27 @@
+# Copyright 2014 Budapest University of Technology and Economics (BME IK)
+#
+# This file is part of CIRCLE Cloud.
+#
+# CIRCLE is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along
+# with CIRCLE. If not, see .
+
+from __future__ import unicode_literals, absolute_import
+
+from django.core.management.base import BaseCommand
+
+from firewall.tasks.local_tasks import reloadtask
+
+
+class Command(BaseCommand):
+ def handle(self, *args, **options):
+ reloadtask('Vlan')
diff --git a/circle/firewall/models.py b/circle/firewall/models.py
index 2a7e6ba..b4d4299 100644
--- a/circle/firewall/models.py
+++ b/circle/firewall/models.py
@@ -17,9 +17,11 @@
# You should have received a copy of the GNU General Public License along
# with CIRCLE. If not, see .
-from itertools import islice, ifilter
+from string import ascii_letters
+from itertools import islice, ifilter, chain
+from math import ceil
import logging
-from netaddr import IPSet, EUI, IPNetwork
+import random
from django.contrib.auth.models import User
from django.db import models
@@ -28,15 +30,17 @@ from django.utils.translation import ugettext_lazy as _
from firewall.fields import (MACAddressField, val_alfanum, val_reverse_domain,
val_ipv6_template, val_domain, val_ipv4,
val_domain_wildcard,
- val_ipv6, val_mx, convert_ipv4_to_ipv6,
+ val_ipv6, val_mx,
IPNetworkField, IPAddressField)
from django.core.validators import MinValueValidator, MaxValueValidator
import django.conf
from django.db.models.signals import post_save, post_delete
-import random
+from celery.exceptions import TimeoutError
+from netaddr import IPSet, EUI, IPNetwork, IPAddress, ipv6_full
from common.models import method_cache, WorkerNotFound, HumanSortField
from firewall.tasks.local_tasks import reloadtask
+from firewall.tasks.remote_tasks import get_dhcp_clients
from .iptables import IptRule
from acl.models import AclBase
@@ -360,9 +364,19 @@ class Vlan(AclBase, models.Model):
'address is: "%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa".'),
default="%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa")
ipv6_template = models.TextField(
- validators=[val_ipv6_template],
- verbose_name=_('ipv6 template'),
- default="2001:738:2001:4031:%(b)d:%(c)d:%(d)d:0")
+ blank=True,
+ help_text=_('Template for translating IPv4 addresses to IPv6. '
+ 'Automatically generated hosts in dual-stack networks '
+ 'will get this address. The template '
+ 'can contain four tokens: "%(a)d", "%(b)d", '
+ '"%(c)d", and "%(d)d", representing the four bytes '
+ 'of the IPv4 address, respectively, in decimal notation. '
+ 'Moreover you can use any standard printf format '
+ 'specification like %(a)02x to get the first byte as two '
+ 'hexadecimal digits. Usual choices for mapping '
+ '198.51.100.0/24 to 2001:0DB8:1:1::/64 would be '
+ '"2001:db8:1:1:%(d)d::" and "2001:db8:1:1:%(d)02x00::".'),
+ validators=[val_ipv6_template], verbose_name=_('ipv6 template'))
dhcp_pool = models.TextField(blank=True, verbose_name=_('DHCP pool'),
help_text=_(
'The address range of the DHCP pool: '
@@ -377,6 +391,87 @@ class Vlan(AclBase, models.Model):
modified_at = models.DateTimeField(auto_now=True,
verbose_name=_('modified at'))
+ def clean(self):
+ super(Vlan, self).clean()
+ if self.ipv6_template:
+ if not self.network6:
+ raise ValidationError(
+ _("You cannot specify an IPv6 template if there is no "
+ "IPv6 network set."))
+ for i in (self.network4[1], self.network4[-1]):
+ i6 = self.convert_ipv4_to_ipv6(i)
+ if i6 not in self.network6:
+ raise ValidationError(
+ _("%(ip6)s (translated from %(ip4)s) is outside of "
+ "the IPv6 network.") % {"ip4": i, "ip6": i6})
+ if self.network6:
+ tpl, prefixlen = self._magic_ipv6_template(self.network4,
+ self.network6)
+ if not self.ipv6_template:
+ self.ipv6_template = tpl
+ if not self.host_ipv6_prefixlen:
+ self.host_ipv6_prefixlen = prefixlen
+
+ @staticmethod
+ def _host_bytes(prefixlen, maxbytes):
+ return int(ceil((maxbytes - prefixlen / 8.0)))
+
+ @staticmethod
+ def _append_hexa(s, v, lasthalf):
+ if lasthalf: # can use last half word
+ assert s[-1] == "0" or s[-1].endswith("00")
+ if s[-1].endswith("00"):
+ s[-1] = s[-1][:-2]
+ s[-1] += "%({})02x".format(v)
+ s[-1].lstrip("0")
+ else:
+ s.append("%({})02x00".format(v))
+
+ @classmethod
+ def _magic_ipv6_template(cls, network4, network6, verbose=None):
+ """Offer a sensible ipv6_template value.
+
+ Based on prefix lengths the method magically selects verbose (decimal)
+ format:
+ >>> Vlan._magic_ipv6_template(IPNetwork("198.51.100.0/24"),
+ ... IPNetwork("2001:0DB8:1:1::/64"))
+ ('2001:db8:1:1:%(d)d::', 80)
+
+ However you can explicitly select non-verbose, i.e. hexa format:
+ >>> Vlan._magic_ipv6_template(IPNetwork("198.51.100.0/24"),
+ ... IPNetwork("2001:0DB8:1:1::/64"), False)
+ ('2001:db8:1:1:%(d)02x00::', 72)
+ """
+ host4_bytes = cls._host_bytes(network4.prefixlen, 4)
+ host6_bytes = cls._host_bytes(network6.prefixlen, 16)
+ if host4_bytes > host6_bytes:
+ raise ValidationError(
+ _("IPv6 network is too small to map IPv4 addresses to it."))
+ letters = ascii_letters[4-host4_bytes:4]
+ remove = host6_bytes // 2
+ ipstr = network6.network.format(ipv6_full)
+ s = ipstr.split(":")[0:-remove]
+ if verbose is None: # use verbose format if net6 much wider
+ verbose = 2 * (host4_bytes + 1) < host6_bytes
+ if verbose:
+ for i in letters:
+ s.append("%({})d".format(i))
+ else:
+ remain = host6_bytes
+ for i in letters:
+ cls._append_hexa(s, i, remain % 2 == 1)
+ remain -= 1
+ if host6_bytes > host4_bytes:
+ s.append(":")
+ tpl = ":".join(s)
+ # compute prefix length
+ mask = int(IPAddress(tpl % {"a": 1, "b": 1, "c": 1, "d": 1}))
+ prefixlen = 128
+ while mask % 2 == 0:
+ mask /= 2
+ prefixlen -= 1
+ return (tpl, prefixlen)
+
def __unicode__(self):
return "%s - %s" % ("managed" if self.managed else "unmanaged",
self.name)
@@ -402,7 +497,7 @@ class Vlan(AclBase, models.Model):
logger.debug("Found unused IPv4 address %s.", ipv4)
ipv6 = None
if self.network6 is not None:
- ipv6 = convert_ipv4_to_ipv6(self.ipv6_template, ipv4)
+ ipv6 = self.convert_ipv4_to_ipv6(ipv4)
if ipv6 in used_v6:
continue
else:
@@ -411,6 +506,20 @@ class Vlan(AclBase, models.Model):
else:
raise ValidationError(_("All IP addresses are already in use."))
+ def convert_ipv4_to_ipv6(self, ipv4):
+ """Convert IPv4 address string to IPv6 address string."""
+ if isinstance(ipv4, basestring):
+ ipv4 = IPAddress(ipv4, 4)
+ nums = {ascii_letters[i]: int(ipv4.words[i]) for i in range(4)}
+ return IPAddress(self.ipv6_template % nums)
+
+ def get_dhcp_clients(self):
+ macs = set(i.mac for i in self.host_set.all())
+ return [{"mac": k, "ip": v["ip"], "hostname": v["hostname"]}
+ for k, v in chain(*(fw.get_dhcp_clients().iteritems()
+ for fw in Firewall.objects.all() if fw))
+ if v["interface"] == self.name and EUI(k) not in macs]
+
class VlanGroup(models.Model):
"""
@@ -581,8 +690,7 @@ class Host(models.Model):
def save(self, *args, **kwargs):
if not self.id and self.ipv6 == "auto":
- self.ipv6 = convert_ipv4_to_ipv6(self.vlan.ipv6_template,
- self.ipv4)
+ self.ipv6 = self.vlan.convert_ipv4_to_ipv6(self.ipv4)
self.full_clean()
super(Host, self).save(*args, **kwargs)
@@ -716,9 +824,6 @@ class Host(models.Model):
proto=proto, nat=False, action='accept',
host=self, foreign_network=vg)
if self.behind_nat:
- if public < 1024:
- raise ValidationError(
- _("Only ports above 1024 can be used."))
rule.nat_external_port = public
rule.nat = True
rule.full_clean()
@@ -838,7 +943,7 @@ class Firewall(models.Model):
return self.name
@method_cache(30)
- def get_remote_queue_name(self, queue_id):
+ def get_remote_queue_name(self, queue_id="firewall"):
"""Returns the name of the remote celery queue for this node.
Throws Exception if there is no worker on the queue.
@@ -851,6 +956,20 @@ class Firewall(models.Model):
else:
raise WorkerNotFound()
+ @method_cache(20)
+ def get_dhcp_clients(self):
+ try:
+ return get_dhcp_clients.apply_async(
+ queue=self.get_remote_queue_name(), expires=60).get(timeout=2)
+ except TimeoutError:
+ logger.info("get_dhcp_clients task timed out")
+ except IOError:
+ logger.exception("get_dhcp_clients failed. "
+ "maybe syslog isn't readble by firewall worker")
+ except:
+ logger.exception("get_dhcp_clients failed")
+ return {}
+
class Domain(models.Model):
name = models.CharField(max_length=40, validators=[val_domain],
diff --git a/circle/firewall/tasks/remote_tasks.py b/circle/firewall/tasks/remote_tasks.py
index 742101d..cf57ba7 100644
--- a/circle/firewall/tasks/remote_tasks.py
+++ b/circle/firewall/tasks/remote_tasks.py
@@ -62,5 +62,6 @@ def reload_blacklist(data):
@celery.task(name='firewall.get_dhcp_clients')
-def get_dhcp_clients(data):
+def get_dhcp_clients():
+ # {'00:21:5a:73:72:cd': {'interface': 'OFF', 'ip': None, 'hostname': None}}
pass
diff --git a/circle/firewall/tests/test_firewall.py b/circle/firewall/tests/test_firewall.py
index 99ced76..3707343 100644
--- a/circle/firewall/tests/test_firewall.py
+++ b/circle/firewall/tests/test_firewall.py
@@ -78,6 +78,7 @@ class GetNewAddressTestCase(TestCase):
self.vlan = Vlan(vid=1, name='test', network4='10.0.0.0/29',
network6='2001:738:2001:4031::/80', domain=d,
owner=self.u1)
+ self.vlan.clean()
self.vlan.save()
self.vlan.host_set.all().delete()
for i in [1] + range(3, 6):
@@ -85,6 +86,9 @@ class GetNewAddressTestCase(TestCase):
ipv4='10.0.0.%d' % i, vlan=self.vlan,
owner=self.u1).save()
+ def tearDown(self):
+ self.vlan.delete()
+
def test_new_addr_w_empty_vlan(self):
self.vlan.host_set.all().delete()
self.vlan.get_new_address()
@@ -96,12 +100,6 @@ class GetNewAddressTestCase(TestCase):
owner=self.u1).save()
self.assertRaises(ValidationError, self.vlan.get_new_address)
- def test_all_addr_in_use_w_ipv6(self):
- Host(hostname='h-x', mac='01:02:03:04:05:06',
- ipv4='10.0.0.6', ipv6='2001:738:2001:4031:0:0:2:0',
- vlan=self.vlan, owner=self.u1).save()
- self.assertRaises(ValidationError, self.vlan.get_new_address)
-
def test_new_addr(self):
used_v4 = IPSet(self.vlan.host_set.values_list('ipv4', flat=True))
assert self.vlan.get_new_address()['ipv4'] not in used_v4
@@ -313,11 +311,6 @@ class ReloadTestCase(TestCase):
new_rules = h.rules.count()
self.assertEqual(new_rules, old_rules)
- def test_host_add_port_w_validationerror(self):
- h = self.h1
- self.assertRaises(ValidationError, h.add_port,
- 'tcp', public=1000, private=22)
-
def test_periodic_task(self):
# TODO
with patch('firewall.tasks.local_tasks.cache') as cache:
diff --git a/circle/locale/hu/LC_MESSAGES/django.po b/circle/locale/hu/LC_MESSAGES/django.po
index b8c8759..f8d8d23 100644
--- a/circle/locale/hu/LC_MESSAGES/django.po
+++ b/circle/locale/hu/LC_MESSAGES/django.po
@@ -6,16 +6,17 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-10-20 12:09+0200\n"
-"PO-Revision-Date: 2014-10-20 13:01+0200\n"
-"Last-Translator: Mate Ory \n"
+"POT-Creation-Date: 2014-11-14 13:44+0100\n"
+"PO-Revision-Date: 2014-11-14 14:00+0100\n"
+"Last-Translator: \n"
"Language-Team: Hungarian \n"
-"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.5\n"
+"X-Translated-Using: django-rosetta 0.7.4\n"
#: circle/settings/base.py:123
msgid "English"
@@ -57,7 +58,7 @@ msgstr "feladat uuid"
#: common/models.py:157
#: dashboard/templates/dashboard/instanceactivity_detail.html:37
-#: firewall/models.py:273 vm/models/common.py:84 vm/models/instance.py:131
+#: firewall/models.py:284 vm/models/common.py:84 vm/models/instance.py:131
#: vm/models/instance.py:212
msgid "user"
msgstr "felhasználó"
@@ -138,10 +139,10 @@ msgid "realtime"
msgstr "valós idejű"
#: dashboard/forms.py:88 dashboard/forms.py:805 dashboard/forms.py:895
-#: dashboard/forms.py:1196 dashboard/tables.py:225
+#: dashboard/forms.py:1246 dashboard/tables.py:228
#: dashboard/templates/dashboard/_vm-create-2.html:20
#: dashboard/templates/dashboard/vm-list.html:60
-#: dashboard/templates/dashboard/vm-detail/home.html:8 firewall/models.py:285
+#: dashboard/templates/dashboard/vm-detail/home.html:8 firewall/models.py:296
#: network/templates/network/index.html:24
#: network/templates/network/switch-port-edit.html:45
msgid "Name"
@@ -204,22 +205,25 @@ msgstr ""
msgid "Create"
msgstr "Létrehozás"
-#: dashboard/forms.py:277 dashboard/forms.py:1116 dashboard/forms.py:1133
-#: dashboard/forms.py:1159 dashboard/forms.py:1209 dashboard/forms.py:1250
-#: dashboard/forms.py:1270 dashboard/forms.py:1299
+#: dashboard/forms.py:277 dashboard/forms.py:1166 dashboard/forms.py:1183
+#: dashboard/forms.py:1209 dashboard/forms.py:1259 dashboard/forms.py:1300
+#: dashboard/forms.py:1320 dashboard/forms.py:1349
#: dashboard/templates/dashboard/_manage_access.html:73
#: dashboard/templates/dashboard/connect-command-create.html:37
#: dashboard/templates/dashboard/connect-command-edit.html:37
-#: dashboard/templates/dashboard/group-detail.html:132
+#: dashboard/templates/dashboard/group-detail.html:140
#: dashboard/templates/dashboard/lease-edit.html:96
+#: dashboard/templates/dashboard/template-tx-owner.html:12
#: dashboard/templates/dashboard/vm-detail/tx-owner.html:12
-#: network/forms.py:82 network/forms.py:103 network/forms.py:139
-#: network/forms.py:164 network/forms.py:203 network/forms.py:224
-#: network/forms.py:273 network/forms.py:295
+#: network/forms.py:82 network/forms.py:103 network/forms.py:143
+#: network/forms.py:168 network/forms.py:207 network/forms.py:228
+#: network/forms.py:279 network/forms.py:304
msgid "Save"
msgstr "Mentés"
-#: dashboard/forms.py:307 dashboard/templates/dashboard/vm-detail.html:92
+#: dashboard/forms.py:307 dashboard/forms.py:966
+#: dashboard/templates/dashboard/_vm-remove-port.html:15
+#: dashboard/templates/dashboard/vm-detail.html:99
msgid "Host"
msgstr "Gép"
@@ -286,9 +290,10 @@ msgid ""
"service interruption of at most some seconds. Please note that it can take "
"very long and cause much network traffic in case of busy machines."
msgstr ""
-"A live migration lehetővé teszi virtuális gépek csomópontok közti mozgatását "
-"legfeljebb néhány másodperces szolgáltatáskimaradással. Vegye figyelembe, "
-"hogy ez terhelt gépek esetén sokáig tarthat és nagy hálózati forgalommal jár."
+"A live migration lehetővé teszi virtuális gépek csomópontok közti mozgatását"
+" legfeljebb néhány másodperces szolgáltatáskimaradással. Vegye figyelembe, "
+"hogy ez terhelt gépek esetén sokáig tarthat és nagy hálózati forgalommal "
+"jár."
#: dashboard/forms.py:782
msgid "Forcibly interrupt all running activities."
@@ -350,7 +355,8 @@ msgid "Could not find filename in URL, please specify a name explicitly."
msgstr "Az URL-ben nem található fájlnév. Kérem adja meg explicite."
#: dashboard/forms.py:917
-#: dashboard/templates/dashboard/node-detail/resources.html:17
+#: dashboard/templates/dashboard/_vm-remove-port.html:17
+#: dashboard/templates/dashboard/node-detail/resources.html:27
msgid "Vlan"
msgstr "Vlan"
@@ -365,72 +371,86 @@ msgstr ""
"A virtuális gép elindítása ezen a csomóponton (üresen hagyva automatikus "
"ütemezés)."
-#: dashboard/forms.py:956 dashboard/templates/dashboard/profile.html:31
-#: dashboard/templates/dashboard/vm-detail.html:108
+#: dashboard/forms.py:947 dashboard/forms.py:953
+#: dashboard/templates/dashboard/_vm-remove-port.html:13
+msgid "Port"
+msgstr "Port"
+
+#: dashboard/forms.py:956 dashboard/templates/dashboard/vm-detail.html:97
+msgid "Protocol"
+msgstr "Protokoll"
+
+#: dashboard/forms.py:978
+#, python-brace-format
+msgid " {0}"
+msgstr " {0}"
+
+#: dashboard/forms.py:1006 dashboard/templates/dashboard/profile.html:31
+#: dashboard/templates/dashboard/vm-detail.html:115
msgid "Username"
msgstr "Felhasználónév"
-#: dashboard/forms.py:970 dashboard/templates/dashboard/vm-detail.html:110
+#: dashboard/forms.py:1020 dashboard/templates/dashboard/vm-detail.html:117
msgid "Password"
msgstr "Jelszó"
-#: dashboard/forms.py:975
+#: dashboard/forms.py:1025
msgid "Sign in"
msgstr "Bejelentkezés"
-#: dashboard/forms.py:998 dashboard/templates/dashboard/profile.html:37
+#: dashboard/forms.py:1048 dashboard/templates/dashboard/profile.html:37
msgid "Email address"
msgstr "E-mail cím"
-#: dashboard/forms.py:1003
+#: dashboard/forms.py:1053
msgid "Reset password"
msgstr "Új jelszó"
-#: dashboard/forms.py:1019 dashboard/forms.py:1142
+#: dashboard/forms.py:1069 dashboard/forms.py:1192
msgid "Change password"
msgstr "Jelszóváltoztatás"
-#: dashboard/forms.py:1091
+#: dashboard/forms.py:1141
msgid "Add trait"
msgstr "Jellemző hozzáadása"
-#: dashboard/forms.py:1173 dashboard/templates/dashboard/lease-edit.html:86
+#: dashboard/forms.py:1223 dashboard/templates/dashboard/lease-edit.html:86
msgid "Name of group or user"
msgstr "Csoport vagy felhasználó neve"
-#: dashboard/forms.py:1181 dashboard/forms.py:1190
+#: dashboard/forms.py:1231 dashboard/forms.py:1240
msgid "Name of user"
msgstr "Felhasználó neve"
-#: dashboard/forms.py:1183 dashboard/forms.py:1192
+#: dashboard/forms.py:1233 dashboard/forms.py:1242
msgid "E-mail address or identifier of user"
msgstr "A felhasználó e-mail címe vagy azonosítója"
-#: dashboard/forms.py:1198
+#: dashboard/forms.py:1248
msgid "Key"
msgstr "Kulcs"
-#: dashboard/forms.py:1199
+#: dashboard/forms.py:1249
msgid "For example: ssh-rsa AAAAB3NzaC1yc2ED..."
msgstr "Például: ssh-rsa AAAAB3NzaC1yc2ED…"
-#: dashboard/forms.py:1285
+#: dashboard/forms.py:1335
msgid "permissions"
msgstr "jogosultságok"
-#: dashboard/forms.py:1342
+#: dashboard/forms.py:1392
msgid "owned"
msgstr "saját"
-#: dashboard/forms.py:1343
+#: dashboard/forms.py:1393
msgid "shared"
msgstr "osztott"
-#: dashboard/forms.py:1344
+#: dashboard/forms.py:1394
msgid "all"
msgstr "összes"
-#: dashboard/forms.py:1351 dashboard/forms.py:1375
+#: dashboard/forms.py:1401 dashboard/forms.py:1425
#: dashboard/templates/dashboard/index-groups.html:21
#: dashboard/templates/dashboard/index-nodes.html:61
#: dashboard/templates/dashboard/index-vm.html:57
@@ -438,7 +458,7 @@ msgid "Search..."
msgstr "Keresés..."
#: dashboard/models.py:65 dashboard/templates/dashboard/index-groups.html:39
-#: dashboard/templates/dashboard/index-nodes.html:78
+#: dashboard/templates/dashboard/index-nodes.html:79
#: dashboard/templates/dashboard/index-templates.html:38
#: dashboard/templates/dashboard/index-vm.html:76
#: dashboard/templates/dashboard/store/_list-box.html:101
@@ -461,8 +481,8 @@ msgstr "elérés módja"
msgid "Type of the remote access method."
msgstr "Távoli elérési mód típusa."
-#: dashboard/models.py:110 firewall/models.py:413 firewall/models.py:440
-#: firewall/models.py:828 firewall/models.py:850 firewall/models.py:871
+#: dashboard/models.py:110 firewall/models.py:529 firewall/models.py:556
+#: firewall/models.py:943 firewall/models.py:979 firewall/models.py:1000
#: storage/models.py:47 storage/models.py:86 vm/models/common.py:65
#: vm/models/common.py:89 vm/models/common.py:165 vm/models/instance.py:135
#: vm/models/instance.py:225 vm/models/node.py:65
@@ -529,14 +549,14 @@ msgstr "Lemezkvóta mebibyte-okban."
msgid "Can use autocomplete."
msgstr "Használhat automatikus kiegészítést."
-#: dashboard/models.py:229 firewall/models.py:274 vm/models/common.py:85
+#: dashboard/models.py:229 firewall/models.py:285 vm/models/common.py:85
#: vm/models/instance.py:132 vm/models/instance.py:213
msgid "operator"
msgstr "operátor"
-#: dashboard/models.py:230 firewall/models.py:100 firewall/models.py:369
-#: firewall/models.py:422 firewall/models.py:445 firewall/models.py:510
-#: firewall/models.py:851 firewall/models.py:880 vm/models/common.py:86
+#: dashboard/models.py:230 firewall/models.py:104 firewall/models.py:390
+#: firewall/models.py:538 firewall/models.py:561 firewall/models.py:626
+#: firewall/models.py:980 firewall/models.py:1009 vm/models/common.py:86
#: vm/models/instance.py:133 vm/models/instance.py:214
msgid "owner"
msgstr "tulajdonos"
@@ -561,57 +581,66 @@ msgstr "VM-ek száma"
msgid "Monitor"
msgstr "Állapot"
-#: dashboard/tables.py:145 dashboard/templates/dashboard/_vm-create-2.html:38
-#: dashboard/templates/dashboard/node-detail.html:69
-#: dashboard/templates/dashboard/vm-detail.html:177
+#: dashboard/tables.py:91
+msgid "Number of users"
+msgstr "Felhasználók száma"
+
+#: dashboard/tables.py:98 dashboard/templates/dashboard/base.html:48
+msgid "Admin"
+msgstr "Adminisztráció"
+
+#: dashboard/tables.py:105 dashboard/tables.py:178 dashboard/tables.py:209
+#: dashboard/tables.py:243 dashboard/tables.py:272
+msgid "Actions"
+msgstr "Műveletek"
+
+#: dashboard/tables.py:148 dashboard/templates/dashboard/_vm-create-2.html:38
+#: dashboard/templates/dashboard/node-detail.html:71
+#: dashboard/templates/dashboard/vm-detail.html:191
msgid "Resources"
msgstr "Erőforrások"
-#: dashboard/tables.py:151 dashboard/templates/dashboard/vm-list.html:72
+#: dashboard/tables.py:154 dashboard/templates/dashboard/vm-list.html:72
#: vm/models/instance.py:104
msgid "Lease"
msgstr "Bérlet"
-#: dashboard/tables.py:162 dashboard/templates/dashboard/vm-list.html:68
+#: dashboard/tables.py:165 dashboard/templates/dashboard/template-edit.html:84
+#: dashboard/templates/dashboard/vm-list.html:68
#: dashboard/templates/dashboard/vm-detail/access.html:2
msgid "Owner"
msgstr "Tulajdonos"
-#: dashboard/tables.py:167 dashboard/tables.py:235
+#: dashboard/tables.py:170 dashboard/tables.py:238
msgid "Created at"
msgstr "Létrehozva"
-#: dashboard/tables.py:171
+#: dashboard/tables.py:174
msgid "Running"
msgstr "Fut"
-#: dashboard/tables.py:175 dashboard/tables.py:206 dashboard/tables.py:240
-#: dashboard/tables.py:269
-msgid "Actions"
-msgstr "Műveletek"
-
-#: dashboard/tables.py:218
+#: dashboard/tables.py:221
msgid "No available leases."
msgstr "Nincs elérhető bérlési mód."
-#: dashboard/tables.py:230
+#: dashboard/tables.py:233
msgid "Fingerprint"
msgstr "Ujjlenyomat"
-#: dashboard/tables.py:251
+#: dashboard/tables.py:254
msgid "You haven't added any public keys yet."
msgstr "Még nem adott meg publikus kulcsot."
-#: dashboard/tables.py:261
+#: dashboard/tables.py:264
msgid "Access method"
msgstr "Elérés módja"
-#: dashboard/tables.py:265
+#: dashboard/tables.py:268
#: dashboard/templates/dashboard/vm-detail/home.html:129
msgid "Template"
msgstr "Sablon"
-#: dashboard/tables.py:282
+#: dashboard/tables.py:285
msgid ""
"You don't have any custom connection commands yet. You can specify commands "
"to be displayed on VM detail pages instead of the defaults."
@@ -641,7 +670,7 @@ msgid "Policy"
msgstr "Szabályzat"
#: dashboard/templates/base.html:64
-#: dashboard/templates/dashboard/group-detail.html:13
+#: dashboard/templates/dashboard/group-detail.html:18
#: templates/info/help.html:4 templates/info/help.html.py:9
msgid "Help"
msgstr "Súgó"
@@ -658,40 +687,29 @@ msgstr "Megerősítés"
#: dashboard/templates/dashboard/_client-check.html:4
msgid ""
"\n"
-" To effortlessly connect to all kind of virtual machines you have to "
-"install the CIRCLE Client.\n"
+" To effortlessly connect to all kind of virtual machines you have to install the CIRCLE Client.\n"
" "
msgstr ""
"\n"
-" A virtuális gépekhez való könnyű csatlakozáshoz telepítse a "
-"CIRCLE klienst.\n"
+" A virtuális gépekhez való könnyű csatlakozáshoz telepítse a CIRCLE klienst.\n"
" "
#: dashboard/templates/dashboard/_client-check.html:9
msgid ""
"\n"
-" To install the CIRCLE Client click on the "
-"Download the Client button. \n"
-" The button takes you to the installation detail page, where you can "
-"choose your operating system and start \n"
-" the download or read more detailed information about the Client"
-"strong>. The program can be installed on Windows XP (and above)\n"
-" or Debian based Linux operating systems. To successfully install the "
-"client you have to have admin (root or elevated) rights.\n"
-" After the installation complete clicking on the I have the "
-"Client installed button will launch the appropriate tool\n"
-" designed for that connection with necessarily predefined configurations. "
-"This option will also save your answer and this prompt about\n"
+" To install the CIRCLE Client click on the Download the Client button. \n"
+" The button takes you to the installation detail page, where you can choose your operating system and start \n"
+" the download or read more detailed information about the Client. The program can be installed on Windows XP (and above)\n"
+" or Debian based Linux operating systems. To successfully install the client you have to have admin (root or elevated) rights.\n"
+" After the installation complete clicking on the I have the Client installed button will launch the appropriate tool\n"
+" designed for that connection with necessarily predefined configurations. This option will also save your answer and this prompt about\n"
" installation will not pop up again.\n"
" "
msgstr ""
"\n"
-" A CIRCLE kliens letöltéséhez kattintson a "
-"Kliens letöltése gombra. \n"
-" A gomb a letöltőoldalra visz, ahol kiválaszthatja a megfelelő "
-"kliens telepítőcsomagot.\n"
-" A telepítés után kattintson a Már telepítve van gombra "
-"a megfelelő eszköz indításához. Ezt a választást a rendszer megjegyzi.\n"
+" A CIRCLE kliens letöltéséhez kattintson a Kliens letöltése gombra. \n"
+" A gomb a letöltőoldalra visz, ahol kiválaszthatja a megfelelő kliens telepítőcsomagot.\n"
+" A telepítés után kattintson a Már telepítve van gombra a megfelelő eszköz indításához. Ezt a választást a rendszer megjegyzi.\n"
" "
#: dashboard/templates/dashboard/_client-check.html:23
@@ -724,11 +742,11 @@ msgstr "Már telepítve van"
#: dashboard/templates/dashboard/_disk-list-element.html:12
#: dashboard/templates/dashboard/_manage_access.html:34
#: dashboard/templates/dashboard/_manage_access.html:56
-#: dashboard/templates/dashboard/group-detail.html:93
+#: dashboard/templates/dashboard/group-detail.html:99
#: dashboard/templates/dashboard/lease-edit.html:60
#: dashboard/templates/dashboard/lease-edit.html:80
-#: dashboard/templates/dashboard/template-edit.html:107
-#: dashboard/templates/dashboard/template-edit.html:108
+#: dashboard/templates/dashboard/template-edit.html:127
+#: dashboard/templates/dashboard/template-edit.html:128
#: dashboard/templates/dashboard/confirm/base-remove.html:12
#: dashboard/templates/dashboard/store/_list-box.html:133
#: dashboard/templates/dashboard/store/remove.html:36
@@ -751,7 +769,7 @@ msgid "username"
msgstr "felhasználónév"
#: dashboard/templates/dashboard/_manage_access.html:7
-#: dashboard/templates/dashboard/group-detail.html:93
+#: dashboard/templates/dashboard/group-detail.html:99
#: dashboard/templates/dashboard/lease-edit.html:35
msgid "Who"
msgstr "Ki"
@@ -797,7 +815,8 @@ msgstr "RAM-méret mebibyte-okban."
#: dashboard/templates/dashboard/_template-choose.html:5
msgid "Customize an existing template or create a brand new one from scratch."
-msgstr "Szabjon testre egy meglévő sablont, vagy készítsen egyet az alapoktól."
+msgstr ""
+"Szabjon testre egy meglévő sablont, vagy készítsen egyet az alapoktól."
#: dashboard/templates/dashboard/_template-choose.html:7
msgid "Customize an existing template."
@@ -859,9 +878,9 @@ msgstr "Lemezek"
#: dashboard/templates/dashboard/_vm-create-1.html:40
#: dashboard/templates/dashboard/_vm-create-2.html:65
-#: dashboard/templates/dashboard/base.html:46
-#: dashboard/templates/dashboard/vm-detail.html:191
-#: dashboard/views/graph.py:192 dashboard/views/graph.py:215
+#: dashboard/templates/dashboard/base.html:47
+#: dashboard/templates/dashboard/vm-detail.html:205
+#: dashboard/views/graph.py:198 dashboard/views/graph.py:221
#: network/forms.py:123 network/templates/network/base.html:7
msgid "Network"
msgstr "Hálózat"
@@ -907,7 +926,8 @@ msgstr "Újraütemezés"
#: dashboard/templates/dashboard/_vm-mass-migrate.html:17
msgid "This option will reschedule each virtual machine to the optimal node."
-msgstr "Ez a lehetőség minden virtuális gépet az optimális csomópontra migrál."
+msgstr ""
+"Ez a lehetőség minden virtuális gépet az optimális csomópontra migrál."
#: dashboard/templates/dashboard/_vm-mass-migrate.html:29
#: dashboard/templates/dashboard/_vm-migrate.html:31
@@ -948,28 +968,24 @@ msgstr ""
msgid "Name of template"
msgstr "Sablon neve"
-#: dashboard/templates/dashboard/base.html:26
+#: dashboard/templates/dashboard/base.html:27
#: dashboard/templates/dashboard/notifications.html:9
msgid "Notifications"
msgstr "Értesítések"
-#: dashboard/templates/dashboard/base.html:32
+#: dashboard/templates/dashboard/base.html:33
msgid "Loading..."
msgstr "Betöltés..."
-#: dashboard/templates/dashboard/base.html:38
+#: dashboard/templates/dashboard/base.html:39
msgid "Log out"
msgstr "Kijelentkezés"
-#: dashboard/templates/dashboard/base.html:40
+#: dashboard/templates/dashboard/base.html:41
msgid "User profile"
msgstr "Felhasználói profil"
-#: dashboard/templates/dashboard/base.html:47
-msgid "Admin"
-msgstr "Adminisztráció"
-
-#: dashboard/templates/dashboard/base.html:50
+#: dashboard/templates/dashboard/base.html:51
msgid "Log in "
msgstr "Bejelentkezés"
@@ -988,8 +1004,8 @@ msgstr "Parancssablon létrehozása"
#: dashboard/templates/dashboard/confirm/base-renew.html:26
#: dashboard/templates/dashboard/confirm/node-flush.html:26
#: network/forms.py:61 network/forms.py:83 network/forms.py:104
-#: network/forms.py:140 network/forms.py:165 network/forms.py:204
-#: network/forms.py:225 network/forms.py:274 network/forms.py:296
+#: network/forms.py:144 network/forms.py:169 network/forms.py:208
+#: network/forms.py:229 network/forms.py:280 network/forms.py:305
msgid "Back"
msgstr "Vissza"
@@ -1015,15 +1031,15 @@ msgstr ""
"A felhasználói csoportok lehetővé teszik sablonok és más erőforrások "
"együttes megosztását több felhasználóval."
-#: dashboard/templates/dashboard/group-detail.html:5
+#: dashboard/templates/dashboard/group-detail.html:6
msgid "group"
msgstr "csoport"
-#: dashboard/templates/dashboard/group-detail.html:11
-#: dashboard/templates/dashboard/group-detail.html:20
-#: dashboard/templates/dashboard/group-detail.html:33
-#: dashboard/templates/dashboard/node-detail.html:13
-#: dashboard/templates/dashboard/node-detail.html:21
+#: dashboard/templates/dashboard/group-detail.html:12
+#: dashboard/templates/dashboard/group-detail.html:27
+#: dashboard/templates/dashboard/group-detail.html:40
+#: dashboard/templates/dashboard/node-detail.html:14
+#: dashboard/templates/dashboard/node-detail.html:23
#: dashboard/templates/dashboard/vm-detail.html:63
#: dashboard/templates/dashboard/group-list/column-name.html:7
#: dashboard/templates/dashboard/node-list/column-name.html:7
@@ -1032,9 +1048,9 @@ msgstr "csoport"
msgid "Rename"
msgstr "Átnevezés"
-#: dashboard/templates/dashboard/group-detail.html:12
-#: dashboard/templates/dashboard/group-detail.html:37
-#: dashboard/templates/dashboard/node-detail.html:14
+#: dashboard/templates/dashboard/group-detail.html:15
+#: dashboard/templates/dashboard/group-detail.html:44
+#: dashboard/templates/dashboard/node-detail.html:15
#: dashboard/templates/dashboard/template-edit.html:75
#: dashboard/templates/dashboard/confirm/ajax-delete.html:18
#: dashboard/templates/dashboard/confirm/mass-delete.html:12
@@ -1045,41 +1061,41 @@ msgstr "Átnevezés"
msgid "Delete"
msgstr "Törlés"
-#: dashboard/templates/dashboard/group-detail.html:34
+#: dashboard/templates/dashboard/group-detail.html:41
msgid "Change the name of the group."
msgstr "Válasszon csoportnevet."
-#: dashboard/templates/dashboard/group-detail.html:38
+#: dashboard/templates/dashboard/group-detail.html:45
msgid "Delete group."
msgstr "Csoport törlése."
-#: dashboard/templates/dashboard/group-detail.html:55
+#: dashboard/templates/dashboard/group-detail.html:59
msgid "Available objects for this group"
msgstr "Csoport számára elérhető objektumok"
-#: dashboard/templates/dashboard/group-detail.html:85
+#: dashboard/templates/dashboard/group-detail.html:89
msgid "User list"
msgstr "Felhasználók"
-#: dashboard/templates/dashboard/group-detail.html:87
+#: dashboard/templates/dashboard/group-detail.html:92
msgid "Create user"
msgstr "Új felhasználó"
-#: dashboard/templates/dashboard/group-detail.html:104
-#: dashboard/templates/dashboard/group-detail.html:117
+#: dashboard/templates/dashboard/group-detail.html:111
+#: dashboard/templates/dashboard/group-detail.html:125
#: dashboard/templates/dashboard/vm-detail/network.html:28
msgid "remove"
msgstr "eltávolítás"
-#: dashboard/templates/dashboard/group-detail.html:130
+#: dashboard/templates/dashboard/group-detail.html:138
msgid "Add multiple users at once (one identifier per line)."
msgstr "Több felhasználó hozzáadása (egy azonosító soronként)."
-#: dashboard/templates/dashboard/group-detail.html:137
+#: dashboard/templates/dashboard/group-detail.html:144
msgid "Access permissions"
msgstr "Hozzáférési jogosultságok"
-#: dashboard/templates/dashboard/group-detail.html:146
+#: dashboard/templates/dashboard/group-detail.html:154
msgid "Group permissions"
msgstr "Csoportjogosultságok"
@@ -1087,6 +1103,14 @@ msgstr "Csoportjogosultságok"
msgid "Group list"
msgstr "Csoportok"
+#: dashboard/templates/dashboard/group-list.html:13
+#: dashboard/templates/dashboard/index-groups.html:7
+#: dashboard/templates/dashboard/profile.html:56
+#: dashboard/templates/dashboard/vm-detail/network.html:39
+#: network/templates/network/host-edit.html:32 templates/info/help.html:192
+msgid "Groups"
+msgstr "Csoportok"
+
#: dashboard/templates/dashboard/groupprofile_form.html:10
msgid "Update group"
msgstr "Csoport frissítése"
@@ -1095,13 +1119,6 @@ msgstr "Csoport frissítése"
msgid "List of groups that you have access to."
msgstr "Azon csoportok, amelyekhez hozzáférése van."
-#: dashboard/templates/dashboard/index-groups.html:7
-#: dashboard/templates/dashboard/profile.html:56
-#: dashboard/templates/dashboard/vm-detail/network.html:39
-#: network/templates/network/host-edit.html:32 templates/info/help.html:192
-msgid "Groups"
-msgstr "Csoportok"
-
#: dashboard/templates/dashboard/index-groups.html:30
#, python-format
msgid ""
@@ -1132,8 +1149,8 @@ msgid ""
"List of compute nodes, also called worker nodes or hypervisors, which run "
"the virtual machines."
msgstr ""
-"A virtuális gépeket futtató számítási csomópontok (más néven worker node-ok, "
-"hypervisorok) listája."
+"A virtuális gépeket futtató számítási csomópontok (más néven worker node-ok,"
+" hypervisorok) listája."
#: dashboard/templates/dashboard/index-nodes.html:16
#: dashboard/templates/dashboard/node-list.html:5
@@ -1200,10 +1217,12 @@ msgid "Virtual machines"
msgstr "Virtuális gépek"
#: dashboard/templates/dashboard/index-vm.html:34
+#: dashboard/templates/dashboard/vm-detail.html:75
msgid "Unfavourite"
msgstr "Kedvencnek jelölés törlése"
#: dashboard/templates/dashboard/index-vm.html:36
+#: dashboard/templates/dashboard/vm-detail.html:77
msgid "Mark as favorite"
msgstr "Kedvencnek jelölés"
@@ -1265,13 +1284,18 @@ msgstr "%(count)s leállítva"
msgid "Index"
msgstr "Kezdőoldal"
-#: dashboard/templates/dashboard/index.html:16
+#: dashboard/templates/dashboard/index.html:10
+#, python-format
+msgid "%(name)s virtual machines"
+msgstr "%(name)s virtuális gépek"
+
+#: dashboard/templates/dashboard/index.html:23
msgid "You have no permission to start or manage virtual machines."
msgstr "Nincs jogosultsága virtuális gépek indítására vagy kezelésére."
#: dashboard/templates/dashboard/instanceactivity_detail.html:25
-#: dashboard/templates/dashboard/node-detail.html:82
-#: dashboard/templates/dashboard/vm-detail.html:196
+#: dashboard/templates/dashboard/node-detail.html:84
+#: dashboard/templates/dashboard/vm-detail.html:210
#: dashboard/templates/dashboard/node-detail/activity.html:3
#: dashboard/templates/dashboard/vm-detail/activity.html:3
msgid "Activity"
@@ -1287,7 +1311,7 @@ msgid "time"
msgstr "idő"
#: dashboard/templates/dashboard/instanceactivity_detail.html:40
-#: firewall/models.py:876 firewall/models.py:1002
+#: firewall/models.py:1005 firewall/models.py:1131
msgid "type"
msgstr "típus"
@@ -1343,8 +1367,8 @@ msgid "Edit lease"
msgstr "Bérlési mód szerkesztése"
#: dashboard/templates/dashboard/lease-edit.html:27
-#: dashboard/templates/dashboard/template-edit.html:84
-#: network/templates/network/vlan-edit.html:26
+#: dashboard/templates/dashboard/template-edit.html:104
+#: network/templates/network/vlan-edit.html:33
msgid "Manage access"
msgstr "Jogosultságok kezelése"
@@ -1352,56 +1376,52 @@ msgstr "Jogosultságok kezelése"
#, python-format
msgid ""
"\n"
-"Do you want to perform the %(op)s operation on the "
-"following instance?\n"
+"Do you want to perform the %(op)s operation on the following instance?\n"
msgid_plural ""
"\n"
-"Do you want to perform the %(op)s operation on the "
-"following %(count)s instances?\n"
+"Do you want to perform the %(op)s operation on the following %(count)s instances?\n"
msgstr[0] ""
"\n"
-"Biztosan végrehajtja a(z) %(op)s műveletet a következő "
-"példányon?\n"
+"Biztosan végrehajtja a(z) %(op)s műveletet a következő példányon?\n"
msgstr[1] ""
"\n"
-"Biztosan végrehajtja a(z) %(op)s műveletet a következő "
-"%(count)s példányon?\n"
+"Biztosan végrehajtja a(z) %(op)s műveletet a következő %(count)s példányon?\n"
#: dashboard/templates/dashboard/node-add-trait.html:19
msgid "Add Trait"
msgstr "Jellemző hozzáadása"
-#: dashboard/templates/dashboard/node-detail.html:41
+#: dashboard/templates/dashboard/node-detail.html:43
#: dashboard/templates/dashboard/node-detail/resources.html:10
msgid "Enabled"
msgstr "Engedélyezve"
-#: dashboard/templates/dashboard/node-detail.html:43
+#: dashboard/templates/dashboard/node-detail.html:45
msgid "Schedule enabled"
msgstr "Ütemezés engedélyezve"
-#: dashboard/templates/dashboard/node-detail.html:45
+#: dashboard/templates/dashboard/node-detail.html:47
msgid "Schedule disabled"
msgstr "Ütemezés tiltva"
-#: dashboard/templates/dashboard/node-detail.html:48
+#: dashboard/templates/dashboard/node-detail.html:50
msgid "Disabled"
msgstr "Tiltás"
-#: dashboard/templates/dashboard/node-detail.html:51
+#: dashboard/templates/dashboard/node-detail.html:53
msgid "Online"
msgstr "Elérhető"
-#: dashboard/templates/dashboard/node-detail.html:53
+#: dashboard/templates/dashboard/node-detail.html:55
msgid "Offline"
msgstr "Offline"
-#: dashboard/templates/dashboard/node-detail.html:63
-#: dashboard/templates/dashboard/vm-detail.html:172
+#: dashboard/templates/dashboard/node-detail.html:65
+#: dashboard/templates/dashboard/vm-detail.html:186
msgid "Home"
msgstr "Kezdőoldal"
-#: dashboard/templates/dashboard/node-detail.html:76
+#: dashboard/templates/dashboard/node-detail.html:78
msgid "Virtual Machines"
msgstr "Virtuális gépek"
@@ -1418,8 +1438,7 @@ msgstr "Grafikonok"
msgid ""
"\n"
"Do you want to perform the following operation on\n"
-"%(obj)s: %(op)s"
-"strong>?\n"
+"%(obj)s: %(op)s?\n"
msgstr ""
"\n"
"Biztosan végrehajtja a(z) %(op)s műveletet\n"
@@ -1537,11 +1556,30 @@ msgstr "Szülősablon"
msgid "Delete template"
msgstr "Sablon törlése"
-#: dashboard/templates/dashboard/template-edit.html:94
+#: dashboard/templates/dashboard/template-edit.html:88
+msgid "You are the current owner of this template."
+msgstr "Ön a jelenlegi tulajdonosa a sablonnak."
+
+#: dashboard/templates/dashboard/template-edit.html:91
+#, python-format
+msgid ""
+"\n"
+" The current owner of this template is %(name)s (%(owner)s).\n"
+" "
+msgstr ""
+"\n"
+"A sablon jelenlegi tulajdonosa %(name)s (%(owner)s)."
+
+#: dashboard/templates/dashboard/template-edit.html:97
+#: dashboard/templates/dashboard/vm-detail/access.html:15
+msgid "Transfer ownership..."
+msgstr "Tulajdon átruházása..."
+
+#: dashboard/templates/dashboard/template-edit.html:114
msgid "Disk list"
msgstr "Lemezek"
-#: dashboard/templates/dashboard/template-edit.html:99
+#: dashboard/templates/dashboard/template-edit.html:119
msgid "No disks are added!"
msgstr "Egy lemez sincs hozzáadva!"
@@ -1628,78 +1666,78 @@ msgstr "Kattintson a Mentés sablonként gombra"
msgid "Delete this virtual machine (optional)"
msgstr "Törölje a virtális gépet (ha szükséges)"
-#: dashboard/templates/dashboard/vm-detail.html:88
+#: dashboard/templates/dashboard/vm-detail.html:95
msgid "Connection details"
msgstr "Kapcsolat részletei"
-#: dashboard/templates/dashboard/vm-detail.html:90
-msgid "Protocol"
-msgstr "Protokoll"
-
-#: dashboard/templates/dashboard/vm-detail.html:97
+#: dashboard/templates/dashboard/vm-detail.html:104
msgid "The VM doesn't have any network interface."
msgstr "A VM-nek nincs hálózati interfésze."
-#: dashboard/templates/dashboard/vm-detail.html:99
+#: dashboard/templates/dashboard/vm-detail.html:106
msgid "The required port for this protocol is not forwarded."
msgstr "A csatlakozáshoz szükséges port nincs továbbítva."
-#: dashboard/templates/dashboard/vm-detail.html:104
+#: dashboard/templates/dashboard/vm-detail.html:111
msgid "Host (IPv6)"
msgstr "Gép (IPv6)"
-#: dashboard/templates/dashboard/vm-detail.html:116
+#: dashboard/templates/dashboard/vm-detail.html:123
msgid "Show password"
msgstr "Jelszó megjelenítése"
-#: dashboard/templates/dashboard/vm-detail.html:124
+#: dashboard/templates/dashboard/vm-detail.html:135
msgid "Start the VM to change the password."
msgstr "Jelszóváltoztatáshoz el kell indítani a gépet."
-#: dashboard/templates/dashboard/vm-detail.html:124
+#: dashboard/templates/dashboard/vm-detail.html:135
+msgid "This machine has no agent installed."
+msgstr "A gépre nincs ügynök telepítve."
+
+#: dashboard/templates/dashboard/vm-detail.html:137
msgid "Generate new password!"
msgstr "Új jelszó generálása"
-#: dashboard/templates/dashboard/vm-detail.html:131
-#: dashboard/templates/dashboard/vm-detail.html:143
+#: dashboard/templates/dashboard/vm-detail.html:145
+#: dashboard/templates/dashboard/vm-detail.html:157
msgid "Command"
msgstr "Parancs"
-#: dashboard/templates/dashboard/vm-detail.html:136
-#: dashboard/templates/dashboard/vm-detail.html:147
+#: dashboard/templates/dashboard/vm-detail.html:150
+#: dashboard/templates/dashboard/vm-detail.html:161
#: dashboard/templates/dashboard/vm-list.html:22
msgid "Select all"
msgstr "Összes kiválasztása"
-#: dashboard/templates/dashboard/vm-detail.html:144
+#: dashboard/templates/dashboard/vm-detail.html:158
msgid "Connection is not possible."
msgstr "A csatlakozás nem lehetséges."
-#: dashboard/templates/dashboard/vm-detail.html:154
+#: dashboard/templates/dashboard/vm-detail.html:168
msgid "Connect via the CIRCLE Client"
msgstr "Csatlakozás CIRCLE klienssel"
-#: dashboard/templates/dashboard/vm-detail.html:155
+#: dashboard/templates/dashboard/vm-detail.html:169
msgid "Connect"
msgstr "Csatlakozás"
-#: dashboard/templates/dashboard/vm-detail.html:157
+#: dashboard/templates/dashboard/vm-detail.html:171
msgid "Download client"
msgstr "Kliens letöltése"
-#: dashboard/templates/dashboard/vm-detail.html:159
+#: dashboard/templates/dashboard/vm-detail.html:173
msgid "Download the CIRCLE Client"
msgstr "A CIRCLE kliens letöltése"
-#: dashboard/templates/dashboard/vm-detail.html:160
+#: dashboard/templates/dashboard/vm-detail.html:174
msgid "Connect (download client)"
msgstr "Csatlakozás (kliens letöltése)"
-#: dashboard/templates/dashboard/vm-detail.html:182
+#: dashboard/templates/dashboard/vm-detail.html:196
msgid "Console"
msgstr "Konzol"
-#: dashboard/templates/dashboard/vm-detail.html:186
+#: dashboard/templates/dashboard/vm-detail.html:200
msgid "Access"
msgstr "Hozzáférés"
@@ -1733,8 +1771,8 @@ msgstr "Nincs eredmény."
#: dashboard/templates/dashboard/vm-list.html:152
msgid ""
-"You can select multiple vm instances while holding down the CTRL"
-"strong> key."
+"You can select multiple vm instances while holding down the "
+"CTRL key."
msgstr ""
"Több virtuális gépet is kiválaszthat a CTRL billentyű "
"lenyomásával."
@@ -1744,8 +1782,8 @@ msgid ""
"If you want to select multiple instances by one click select an instance "
"then hold down SHIFT key and select another one!"
msgstr ""
-"Ha több egymást követő példányt szeretne kiválasztani, válassza ki az elsőt, "
-"majd a SHIFT billentyűt lenyomva tartva az utolsót."
+"Ha több egymást követő példányt szeretne kiválasztani, válassza ki az elsőt,"
+" majd a SHIFT billentyűt lenyomva tartva az utolsót."
#: dashboard/templates/dashboard/confirm/ajax-delete.html:9
#, python-format
@@ -1763,13 +1801,11 @@ msgstr ""
#, python-format
msgid ""
"\n"
-" Are you sure you want to change %(object)s "
-"status?\n"
+" Are you sure you want to change %(object)s status?\n"
" "
msgstr ""
"\n"
-" Biztosan megváltoztatja a következő állapotát: "
-"%(object)s?\n"
+" Biztosan megváltoztatja a következő állapotát: %(object)s?\n"
" "
#: dashboard/templates/dashboard/confirm/ajax-node-status.html:19
@@ -1782,13 +1818,11 @@ msgstr "Igen, %(status)s"
#, python-format
msgid ""
"\n"
-"\t Are you sure you want to remove %(member)s from "
-"%(object)s?\n"
+" Are you sure you want to remove %(member)s from %(object)s?\n"
" "
msgstr ""
"\n"
-"\t Biztosan eltávolítja a(z) %(member)s tagot a "
-"következőből: %(object)s?\n"
+"Biztosan eltávolítja a(z) %(member)s tagot a következőből: %(object)s?\n"
" "
#: dashboard/templates/dashboard/confirm/base-delete.html:12
@@ -1807,8 +1841,9 @@ msgstr ""
" "
#: dashboard/templates/dashboard/confirm/base-delete.html:31
-#: dashboard/templates/dashboard/confirm/base-transfer-ownership.html:23
#: dashboard/templates/dashboard/confirm/node-flush.html:28
+#: dashboard/templates/dashboard/confirm/transfer-instance-ownership.html:23
+#: dashboard/templates/dashboard/confirm/transfer-template-ownership.html:23
msgid "Yes"
msgstr "Igen"
@@ -1853,37 +1888,13 @@ msgid ""
msgstr ""
"\n"
" A példány felfüggesztése %(suspend)s időpontban,\n"
-" törlése %(delete)s időpontban történik, ha most "
-"megújítja.\n"
+" törlése %(delete)s időpontban történik, ha most megújítja.\n"
" "
#: dashboard/templates/dashboard/confirm/base-renew.html:27
msgid "Renew"
msgstr "Megújítás"
-#: dashboard/templates/dashboard/confirm/base-transfer-ownership.html:9
-msgid "Ownership transfer"
-msgstr "Átruházás"
-
-#: dashboard/templates/dashboard/confirm/base-transfer-ownership.html:13
-#, python-format
-msgid ""
-"\n"
-" %(owner)s offered to take the ownership of\n"
-" virtual machine %(name)s (%(id)s).\n"
-" Do you accept the responsility of being the host's owner?\n"
-" "
-msgstr ""
-"\n"
-" %(owner)s kezdeményezte a(z) %(name)s\n"
-" (%(id)s) virtuális gép átruházását.\n"
-" Elfogadja a gép birtoklásával járó felelősséget?\n"
-" "
-
-#: dashboard/templates/dashboard/confirm/base-transfer-ownership.html:21
-msgid "No"
-msgstr "Nem"
-
#: dashboard/templates/dashboard/confirm/mass-delete.html:6
msgid "Are you sure you want to delete the following objects?"
msgstr "Biztosan törli a következő objektumokat?"
@@ -1903,6 +1914,42 @@ msgstr ""
msgid "Status changing confirmation"
msgstr "Állapotváltozás megerősítése"
+#: dashboard/templates/dashboard/confirm/transfer-instance-ownership.html:9
+#: dashboard/templates/dashboard/confirm/transfer-template-ownership.html:9
+msgid "Ownership transfer"
+msgstr "Átruházás"
+
+#: dashboard/templates/dashboard/confirm/transfer-instance-ownership.html:13
+#, python-format
+msgid ""
+"\n"
+" %(owner)s offered to take the ownership of\n"
+" virtual machine %(name)s (%(id)s).\n"
+" Do you accept the responsility of being the host's owner?\n"
+" "
+msgstr ""
+"\n"
+"%(owner)s kezdeményezte a(z) %(name)s (%(id)s) virtuális gép átruházását.\n"
+"Elfogadja a gép birtoklásával járó felelősséget?"
+
+#: dashboard/templates/dashboard/confirm/transfer-instance-ownership.html:21
+#: dashboard/templates/dashboard/confirm/transfer-template-ownership.html:21
+msgid "No"
+msgstr "Nem"
+
+#: dashboard/templates/dashboard/confirm/transfer-template-ownership.html:13
+#, python-format
+msgid ""
+"\n"
+" %(owner)s offered to take the ownership of\n"
+" template %(name)s (%(id)s).\n"
+" Do you accept the responsility of being the template's owner?\n"
+" "
+msgstr ""
+"\n"
+"%(owner)s kezdeményezte a(z) %(name)s (%(id)s) sablon átruházását.\n"
+"Elfogadja a sablon birtoklásával járó felelősséget?"
+
#: dashboard/templates/dashboard/connect-command-list/column-command-actions.html:2
#: dashboard/templates/dashboard/template-list/column-lease-actions.html:2
#: dashboard/templates/dashboard/template-list/column-template-actions.html:6
@@ -1952,14 +1999,22 @@ msgid "Priority"
msgstr "Prioritás"
#: dashboard/templates/dashboard/node-detail/resources.html:13
+msgid "Driver Version:"
+msgstr "Driver verziója:"
+
+#: dashboard/templates/dashboard/node-detail/resources.html:19
+msgid "with uncommitted changes!"
+msgstr "beküldetlen változásokkal!"
+
+#: dashboard/templates/dashboard/node-detail/resources.html:23
msgid "Host owner"
msgstr "Gép tulajdonosa"
-#: dashboard/templates/dashboard/node-detail/resources.html:18
+#: dashboard/templates/dashboard/node-detail/resources.html:28
msgid "Host name"
msgstr "Gépnév"
-#: dashboard/templates/dashboard/node-detail/resources.html:23
+#: dashboard/templates/dashboard/node-detail/resources.html:34
msgid "Edit host"
msgstr "Gép szerkesztése"
@@ -2043,13 +2098,11 @@ msgstr "A legújabb fájlok listája."
#, python-format
msgid ""
"\n"
-" You are currently using %(used)s, your soft limit is %(soft)s, your "
-"hard limit is %(hard)s.\n"
+" You are currently using %(used)s, your soft limit is %(soft)s, your hard limit is %(hard)s.\n"
" "
msgstr ""
"\n"
-" Jelenlegi használat: %(used)s, puha korlát: %(soft)s, kemény korlát: "
-"%(hard)s.\n"
+" Jelenlegi használat: %(used)s, puha korlát: %(soft)s, kemény korlát: %(hard)s.\n"
" "
#: dashboard/templates/dashboard/store/index-files.html:16
@@ -2126,8 +2179,7 @@ msgstr "Fájl helye"
#, python-format
msgid ""
"\n"
-" Are you sure you want to remove the file at %(path)s"
-"strong>?\n"
+" Are you sure you want to remove the file at %(path)s?\n"
" "
msgstr ""
"\n"
@@ -2138,13 +2190,11 @@ msgstr ""
#, python-format
msgid ""
"\n"
-" Are you sure you want to remove the directory "
-"%(directory)s?\n"
+" Are you sure you want to remove the directory %(directory)s?\n"
" "
msgstr ""
"\n"
-" Biztosan törli a következő könyvtárat: %(directory)s"
-"strong>?\n"
+" Biztosan törli a következő könyvtárat: %(directory)s?\n"
" "
#: dashboard/templates/dashboard/store/upload.html:16
@@ -2182,7 +2232,7 @@ msgstr "Kevesebb tevékenység megjelenítése"
msgid "Show all activities"
msgstr "Összes tevékenység megjelenítése"
-#: dashboard/templates/dashboard/vm-detail/_network-port-add.html:15
+#: dashboard/templates/dashboard/vm-detail/_network-port-add.html:16
msgid "Add"
msgstr "Hozzáadás"
@@ -2190,22 +2240,17 @@ msgstr "Hozzáadás"
msgid "You are the current owner of this instance."
msgstr "Ön a jelenlegi tulajdonosa a példánynak."
-#: dashboard/templates/dashboard/vm-detail/access.html:7
+#: dashboard/templates/dashboard/vm-detail/access.html:8
#, python-format
msgid ""
"\n"
-" The current owner of this instance is %(owner)s.\n"
+" The current owner of this instance is %(name)s (%(owner)s).\n"
" "
msgstr ""
"\n"
-" A példány jelenlegi tulajdonosa: %(owner)s.\n"
-" "
+"A példány jelenlegi tulajdonosa: %(name)s (%(owner)s)."
-#: dashboard/templates/dashboard/vm-detail/access.html:14
-msgid "Transfer ownership..."
-msgstr "Tulajdon átruházása..."
-
-#: dashboard/templates/dashboard/vm-detail/access.html:18
+#: dashboard/templates/dashboard/vm-detail/access.html:19
msgid "Permissions"
msgstr "Jogosultságok"
@@ -2275,12 +2320,12 @@ msgid "edit"
msgstr "szerkesztés"
#: dashboard/templates/dashboard/vm-detail/network.html:36
-#: firewall/models.py:482
+#: firewall/models.py:598
msgid "IPv4 address"
msgstr "IPv4 cím"
#: dashboard/templates/dashboard/vm-detail/network.html:37
-#: firewall/models.py:492
+#: firewall/models.py:608
msgid "IPv6 address"
msgstr "IPv6 cím"
@@ -2289,12 +2334,12 @@ msgid "DNS name"
msgstr "DNS név"
#: dashboard/templates/dashboard/vm-detail/network.html:51
-#: network/forms.py:246
+#: network/forms.py:250
msgid "IPv4"
msgstr "IPv4"
#: dashboard/templates/dashboard/vm-detail/network.html:52
-#: network/forms.py:253
+#: network/forms.py:257
msgid "IPv6"
msgstr "IPv6"
@@ -2327,23 +2372,23 @@ msgstr "Elvárt jellemzők"
msgid "Raw data"
msgstr "Nyers adat"
-#: dashboard/views/graph.py:166 dashboard/views/graph.py:167
+#: dashboard/views/graph.py:172 dashboard/views/graph.py:173
msgid "RAM usage (%)"
msgstr "RAM-használat (%)"
-#: dashboard/views/graph.py:178 dashboard/views/graph.py:179
+#: dashboard/views/graph.py:184 dashboard/views/graph.py:185
msgid "CPU usage (%)"
msgstr "CPU-használat (%)"
-#: dashboard/views/graph.py:231 dashboard/views/graph.py:281
+#: dashboard/views/graph.py:237 dashboard/views/graph.py:287
msgid "Instance count"
msgstr "Példányok száma"
-#: dashboard/views/graph.py:232
+#: dashboard/views/graph.py:238
msgid "instance count"
msgstr "példányok száma"
-#: dashboard/views/graph.py:241 dashboard/views/graph.py:261
+#: dashboard/views/graph.py:247 dashboard/views/graph.py:267
msgid "Allocated memory (bytes)"
msgstr "Foglalt memória (byte)"
@@ -2380,23 +2425,23 @@ msgstr "A csoport létrehozásra került."
msgid "Group is successfully updated."
msgstr "A csoport frissítésre került."
-#: dashboard/views/node.py:114
+#: dashboard/views/node.py:121
msgid "Node successfully renamed."
msgstr "A csomópont átnevezésre került."
-#: dashboard/views/node.py:222
+#: dashboard/views/node.py:230
msgid "Node successfully created."
msgstr "A csomópont létrehozásra került."
-#: dashboard/views/node.py:250
+#: dashboard/views/node.py:258
msgid "Node successfully deleted."
msgstr "A csomópont törlésre került."
-#: dashboard/views/node.py:297
+#: dashboard/views/node.py:305
msgid "Trait successfully added to node."
msgstr "A csomópontjellemző hozzáadásra került."
-#: dashboard/views/node.py:342
+#: dashboard/views/node.py:350
msgid "Node successfully changed status."
msgstr "A csomópont állapota megváltoztatásra került."
@@ -2429,64 +2474,64 @@ msgstr "%s törlése sikertelen."
msgid "Unable to create folder."
msgstr "Mappa létrehozása sikertelen."
-#: dashboard/views/template.py:65
+#: dashboard/views/template.py:68
msgid "Choose template"
msgstr "Válasszon sablont"
-#: dashboard/views/template.py:80
+#: dashboard/views/template.py:83
msgid "Select an option to proceed."
msgstr "Válasszon a folytatáshoz."
-#: dashboard/views/template.py:111
+#: dashboard/views/template.py:114
msgid "Create a new base VM"
msgstr "Alap VM létrehozása"
-#: dashboard/views/template.py:226
+#: dashboard/views/template.py:229
msgid "Error during filtering."
msgstr "A szűrés sikertelen."
-#: dashboard/views/template.py:245
+#: dashboard/views/template.py:248
msgid "Only the owners can delete the selected template."
msgstr "A kiválasztott sablont csak a tulajdonosok törölhetik."
-#: dashboard/views/template.py:261
+#: dashboard/views/template.py:264
msgid "Template successfully deleted."
msgstr "A sablon törlésre került."
-#: dashboard/views/template.py:277
+#: dashboard/views/template.py:280
msgid "Successfully modified template."
msgstr "A sablon módosításra került."
-#: dashboard/views/template.py:352
+#: dashboard/views/template.py:355
msgid "Disk remove confirmation"
msgstr "Lemez törlésének megerősítése"
-#: dashboard/views/template.py:353
+#: dashboard/views/template.py:356
#, python-format
msgid ""
-"Are you sure you want to remove %(disk)s from "
-"%(app)s?"
+"Are you sure you want to remove %(disk)s from "
+"%(app)s?"
msgstr ""
"Biztosan eltávolítja a(z) %(disk)s lemezt a következőből: "
"%(app)s?"
-#: dashboard/views/template.py:372
+#: dashboard/views/template.py:375
msgid "Disk successfully removed."
msgstr "A lemez eltávolításra került."
-#: dashboard/views/template.py:390
+#: dashboard/views/template.py:393
msgid "Successfully created a new lease."
msgstr "Új bérlési mód létrehozásra került."
-#: dashboard/views/template.py:409
+#: dashboard/views/template.py:412
msgid "Successfully modified lease."
msgstr "A bérlési mód megváltoztatásra került."
-#: dashboard/views/template.py:423
+#: dashboard/views/template.py:426
msgid "Only the owners can modify the selected lease."
msgstr "Csak a tulajdonosai törölhetik a kiválasztott bérleti módot."
-#: dashboard/views/template.py:452
+#: dashboard/views/template.py:455
msgid ""
"You can't delete this lease because some templates are still using it, "
"modify these to proceed: "
@@ -2494,14 +2539,24 @@ msgstr ""
"Nem törölhető a bérleti mód, mivel az alábbi sablonok még használják. A "
"folytatáshoz módosítsa őket: "
-#: dashboard/views/template.py:463
+#: dashboard/views/template.py:466
msgid "Only the owners can delete the selected lease."
msgstr "Csak a tulajdonos törölheti a kiválasztott bérleti módot."
-#: dashboard/views/template.py:481
+#: dashboard/views/template.py:484
msgid "Lease successfully deleted."
msgstr "A bérlési mód törlésre került."
+#: dashboard/views/template.py:505
+#, python-format
+msgid ""
+"%(user)s offered you to take the ownership of his/her template called "
+"%(instance)s. Accept"
+msgstr ""
+"%(user)s át kívánja ruházni %(instance)s nevű sablonját Önre. Elfogadás"
+
#: dashboard/views/user.py:134
#, python-format
msgid "Logged in as user %s."
@@ -2539,484 +2594,485 @@ msgstr "A parancssablon törlésre került."
msgid "Successfully created a new command template."
msgstr "A parancssablon létrehozásra került."
-#: dashboard/views/util.py:268
+#: dashboard/views/util.py:270
msgid "Could not start operation."
msgstr "A művelet megkezdése meghiúsult."
-#: dashboard/views/util.py:285
+#: dashboard/views/util.py:287
msgid "Operation failed."
msgstr "A művelet meghiúsult."
-#: dashboard/views/util.py:290
+#: dashboard/views/util.py:292
msgid "Operation succeeded."
msgstr "A művelet sikeresen végrehajtásra került."
-#: dashboard/views/util.py:292
+#: dashboard/views/util.py:294
msgid "Operation is started."
msgstr "A művelet megkezdődött."
-#: dashboard/views/util.py:386
+#: dashboard/views/util.py:388
#, python-format
msgid "Acl user/group %(w)s successfully modified."
msgstr "A(z) %(w)s ACL felhasználó/csoport módosításra került."
-#: dashboard/views/util.py:388
+#: dashboard/views/util.py:390
#, python-format
msgid "Acl user/group %(w)s successfully added."
msgstr "A(z) %(w)s ACL felhasználó/csoport hozzáadásra került."
-#: dashboard/views/util.py:390
+#: dashboard/views/util.py:392
#, python-format
msgid "Acl user/group %(w)s successfully removed."
msgstr "A(z) %(w)s ACL felhasználó/csoport törlésre került."
-#: dashboard/views/util.py:475
+#: dashboard/views/util.py:477
msgid ""
"The original owner cannot be removed, however you can transfer ownership."
msgstr "Az eredeti tulajdonos nem törölhető, azonban a tulajdon átruházható."
-#: dashboard/views/util.py:511
+#: dashboard/views/util.py:513
#, python-format
msgid "User \"%s\" has already access to this object."
msgstr "„%s” felhasználó már hozzáfér az objektumhoz."
-#: dashboard/views/util.py:520
+#: dashboard/views/util.py:522
#, python-format
msgid "Group \"%s\" has already access to this object."
msgstr "„%s” csoport már hozzáfér az objektumhoz."
-#: dashboard/views/util.py:525
+#: dashboard/views/util.py:527
#, python-format
msgid "User or group \"%s\" not found."
msgstr "Nem található „%s” felhasználó vagy csoport."
-#: dashboard/views/util.py:541
+#: dashboard/views/util.py:543
msgid "1 hour"
msgstr "1 óra"
-#: dashboard/views/util.py:542
+#: dashboard/views/util.py:544
msgid "6 hours"
msgstr "6 óra"
-#: dashboard/views/util.py:543
+#: dashboard/views/util.py:545
msgid "1 day"
msgstr "1 nap"
-#: dashboard/views/util.py:544
+#: dashboard/views/util.py:546
msgid "1 week"
msgstr "1 hét"
-#: dashboard/views/util.py:545
+#: dashboard/views/util.py:547
msgid "1 month"
msgstr "1 hónap"
-#: dashboard/views/util.py:546
+#: dashboard/views/util.py:548
msgid "6 months"
msgstr "6 hónap"
-#: dashboard/views/util.py:555
+#: dashboard/views/util.py:557
msgid "Bad graph time format, available periods are: h, d, w, and y."
msgstr "Hibás grafikon időformátum. Lehetséges egységek: h, d, w és y."
-#: dashboard/views/vm.py:84
+#: dashboard/views/util.py:582
+msgid "Transfer ownership"
+msgstr "Tulajdon átruházása"
+
+#: dashboard/views/util.py:595
+msgid "Can not find specified user."
+msgstr "Nem található a megadott felhasználó."
+
+#: dashboard/views/util.py:611
+msgid "Ownership offer"
+msgstr "Átruházási ajánlat"
+
+#: dashboard/views/util.py:615
+msgid "Can not notify selected user."
+msgstr "A kiválaszott felhasználó értesítése sikertelen."
+
+#: dashboard/views/util.py:618
+#, python-format
+msgid "User %s is notified about the offer."
+msgstr "%s felhasználó értesítésre került az ajánlatról."
+
+#: dashboard/views/util.py:628
+msgid "Ownership successfully transferred to you."
+msgstr "A tulajdon átruházásra került."
+
+#: dashboard/views/util.py:641
+msgid "This token is for an other user."
+msgstr "A token más felhasználó nevére szól."
+
+#: dashboard/views/util.py:644
+msgid "This token is invalid or has expired."
+msgstr "A token érvénytelen vagy lejárt."
+
+#: dashboard/views/util.py:666
+msgid "Ownership accepted"
+msgstr "Átruházás elfogadva"
+
+#: dashboard/views/util.py:667
+#, python-format
+msgid "Your ownership offer of %(instance)s has been accepted by %(user)s."
+msgstr "%(instance)s gépre vonatkozó átruházási ajánlatát elfogadta %(user)s."
+
+#: dashboard/views/vm.py:86
msgid "console access"
msgstr "konzolhozzáférés"
-#: dashboard/views/vm.py:193
+#: dashboard/views/vm.py:195
msgid "VM successfully renamed."
msgstr "A virtuális gép átnevezésre került."
-#: dashboard/views/vm.py:217
+#: dashboard/views/vm.py:219
msgid "VM description successfully updated."
msgstr "A VM leírása megváltoztatásra került."
-#: dashboard/views/vm.py:294
-msgid "There is a problem with your input."
-msgstr "A megadott érték nem megfelelő."
-
-#: dashboard/views/vm.py:296
-msgid "Unknown error."
-msgstr "Ismeretlen hiba."
-
-#: dashboard/views/vm.py:543
+#: dashboard/views/vm.py:567
msgid "The token has expired."
msgstr "A token lejárt."
-#: dashboard/views/vm.py:757
+#: dashboard/views/vm.py:783
#, python-format
msgid "Failed to execute %(op)s operation on instance %(instance)s."
msgstr "%(op)s végrehajtása meghiúsult a következőn: %(instance)s."
-#: dashboard/views/vm.py:773
+#: dashboard/views/vm.py:799
#, python-format
msgid "You are not permitted to execute %(op)s on instance %(instance)s."
msgstr "Nem engedélyezett a(z) %(op)s végrehajtása a(z) %(instance)s gépen."
-#: dashboard/views/vm.py:955
+#: dashboard/views/vm.py:981
msgid "Customize VM"
msgstr "VM testreszabása"
-#: dashboard/views/vm.py:963
+#: dashboard/views/vm.py:989
msgid "Create a VM"
msgstr "VM létrehozása"
-#: dashboard/views/vm.py:1028
+#: dashboard/views/vm.py:1054
#, python-format
msgid "Successfully created %(count)d VM."
msgid_plural "Successfully created %(count)d VMs."
msgstr[0] "%(count)d VM létrehozásra került."
msgstr[1] "%(count)d VM létrehozásra került."
-#: dashboard/views/vm.py:1033
+#: dashboard/views/vm.py:1059
msgid "VM successfully created."
msgstr "VM létrehozásra került."
-#: dashboard/views/vm.py:1062
+#: dashboard/views/vm.py:1088
#, python-format
msgid "Instance limit (%d) exceeded."
msgstr "A példányok létrehozási korlátját (%d) túllépte."
-#: dashboard/views/vm.py:1100
+#: dashboard/views/vm.py:1126
#, python-format
msgid ""
"Are you sure you want to remove this interface from %(vm)s?"
msgstr ""
"Biztosan eltávolítja az interfészt a(z) %(vm)s gépből?"
-#: dashboard/views/vm.py:1114
+#: dashboard/views/vm.py:1140
msgid "Interface successfully deleted."
msgstr "Az interfész törlésre került."
-#: dashboard/views/vm.py:1183
-msgid "Port delete confirmation"
-msgstr "Porteltávolítás megerősítése"
-
-#: dashboard/views/vm.py:1184
-#, python-format
-msgid "Are you sure you want to close %(port)d/%(proto)s on %(vm)s?"
-msgstr "Biztosan bezárja a(z) %(port)d/%(proto)s portot a következőn: %(vm)s?"
-
-#: dashboard/views/vm.py:1199
-msgid "Port successfully removed."
-msgstr "A port eltávolításra került."
-
-#: dashboard/views/vm.py:1226
+#: dashboard/views/vm.py:1206
msgid "About CIRCLE Client"
msgstr "A CIRCLE kliensről"
-#: dashboard/views/vm.py:1323
-msgid "Transfer ownership"
-msgstr "Tulajdon átruházása"
-
-#: dashboard/views/vm.py:1336
-msgid "Can not find specified user."
-msgstr "Nem található a megadott felhasználó."
+#: dashboard/views/vm.py:1296
+msgid "transfer ownership"
+msgstr "tulajdon átruházása"
-#: dashboard/views/vm.py:1352
-msgid "Ownership offer"
-msgstr "Átruházási ajánlat"
-
-#: dashboard/views/vm.py:1353
+#: dashboard/views/vm.py:1306
#, python-format
msgid ""
-"%(user)s offered you to take the ownership of his/her virtual machine called "
-"%(instance)s. Accept"
+"%(user)s offered you to take the ownership of his/her virtual machine called"
+" %(instance)s. Accept"
msgstr ""
-"%(user)s át kívánja ruházni %(instance)s nevű virtuális gépét Önre. Elfogadás"
-
-#: dashboard/views/vm.py:1359
-msgid "Can not notify selected user."
-msgstr "A kiválaszott felhasználó értesítése sikertelen."
-
-#: dashboard/views/vm.py:1362
-#, python-format
-msgid "User %s is notified about the offer."
-msgstr "%s felhasználó értesítésre került az ajánlatról."
-
-#: dashboard/views/vm.py:1373
-msgid "Ownership successfully transferred to you."
-msgstr "A tulajdon átruházásra került."
-
-#: dashboard/views/vm.py:1386
-msgid "This token is for an other user."
-msgstr "A token más felhasználó nevére szól."
-
-#: dashboard/views/vm.py:1389
-msgid "This token is invalid or has expired."
-msgstr "A token érvénytelen vagy lejárt."
-
-#: dashboard/views/vm.py:1411
-msgid "Ownership accepted"
-msgstr "Átruházás elfogadva"
-
-#: dashboard/views/vm.py:1412
-#, python-format
-msgid "Your ownership offer of %(instance)s has been accepted by %(user)s."
-msgstr "%(instance)s gépre vonatkozó átruházási ajánlatát elfogadta %(user)s."
+"%(user)s át kívánja ruházni %(instance)s nevű virtuális gépét Önre. Elfogadás"
-#: firewall/fields.py:39
+#: firewall/fields.py:43
#, python-format
msgid "Enter a valid MAC address. %s"
msgstr "Érvénytelen MAC cím. %s"
-#: firewall/fields.py:51
+#: firewall/fields.py:55
msgid "MAC Address object"
msgstr "MAC cím objektum"
-#: firewall/fields.py:90
+#: firewall/fields.py:91
#, python-format
msgid "Enter a valid IP address. %s"
msgstr "Érvénytelen IP cím. %s"
-#: firewall/fields.py:107 firewall/fields.py:165
+#: firewall/fields.py:108 firewall/fields.py:166
msgid "IP Network object"
msgstr "IP hálózat objektum"
-#: firewall/fields.py:148
+#: firewall/fields.py:149
#, python-format
msgid "Enter a valid IP network. %s"
msgstr "Érvénytelen IP hálózat. %s"
-#: firewall/fields.py:211
+#: firewall/fields.py:212
#, python-format
msgid "%s - only letters, numbers, underscores and hyphens are allowed!"
msgstr "%s – csak betűk, számok, alulvonások és kötőjelek."
-#: firewall/fields.py:228 firewall/fields.py:234
+#: firewall/fields.py:229 firewall/fields.py:235
#, python-format
msgid "%s - invalid domain name"
msgstr "%s – érvénytelen tartománynév"
-#: firewall/fields.py:267
+#: firewall/fields.py:281
+#, python-format
+msgid "%s: invalid template"
+msgstr "%s: érvénytelen sablon"
+
+#: firewall/fields.py:292
+#, python-format
+msgid "template doesn't use parameter %s"
+msgstr "a sablon nem használja a(z) %s paramétert"
+
+#: firewall/fields.py:296
+msgid "template renders invalid IPv6 address"
+msgstr "a sablon érvénytelen IPv6 címet ad"
+
+#: firewall/fields.py:302
+msgid "template results in IPv4 address"
+msgstr "a sablon IPv4 címet ad"
+
+#: firewall/fields.py:313
#, python-format
msgid "%s - not an IPv4 address"
msgstr "%s – nem egy IPv4 cím"
-#: firewall/fields.py:273
+#: firewall/fields.py:319
#, python-format
msgid "%s - not an IPv6 address"
msgstr "%s – nem egy IPv6 cím"
-#: firewall/fields.py:284
+#: firewall/fields.py:330
msgid "Bad MX address format. Should be: :"
msgstr "Érvénytelen MX címformátum. Elvárt formátum: :"
-#: firewall/models.py:60
+#: firewall/models.py:64
msgid "out"
msgstr "ki"
-#: firewall/models.py:60
+#: firewall/models.py:64
msgid "in"
msgstr "be"
-#: firewall/models.py:61
+#: firewall/models.py:65
msgid "accept"
msgstr "elfogadás"
-#: firewall/models.py:61
+#: firewall/models.py:65
msgid "drop"
msgstr "eldobás"
-#: firewall/models.py:62
+#: firewall/models.py:66
msgid "ignore"
msgstr "ignorálás"
-#: firewall/models.py:65
+#: firewall/models.py:69
msgid "direction"
msgstr "irány"
-#: firewall/models.py:66
+#: firewall/models.py:70
msgid "If the rule matches egress or ingress packets."
msgstr "A szabály kimenő vagy bejövő csomagokra illeszkedik."
-#: firewall/models.py:68 firewall/models.py:334 firewall/models.py:419
-#: firewall/models.py:442 firewall/models.py:499 firewall/models.py:857
-#: firewall/models.py:881 firewall/models.py:951 vm/models/instance.py:137
+#: firewall/models.py:72 firewall/models.py:345 firewall/models.py:535
+#: firewall/models.py:558 firewall/models.py:615 firewall/models.py:986
+#: firewall/models.py:1010 firewall/models.py:1080 vm/models/instance.py:137
#: vm/models/instance.py:227
msgid "description"
msgstr "leírás"
-#: firewall/models.py:69
+#: firewall/models.py:73
msgid "Why is the rule needed, or how does it work."
msgstr "Miért szükséges a szabály, vagy hogyan működik."
-#: firewall/models.py:72
+#: firewall/models.py:76
msgid "foreign network"
msgstr "idegen hálózat"
-#: firewall/models.py:73
+#: firewall/models.py:77
msgid ""
"The group of vlans the matching packet goes to (direction out) or from (in)."
msgstr ""
"A vlanok azon csoportja, amelybe a csomag megy (ki irány) vagy emelyből jön "
"(be irány)."
-#: firewall/models.py:77
+#: firewall/models.py:81
msgid "dest. port"
msgstr "célport"
-#: firewall/models.py:79
+#: firewall/models.py:83
msgid "Destination port number of packets that match."
msgstr "Az illeszkedő csomagok célportjának száma."
-#: firewall/models.py:81
+#: firewall/models.py:85
msgid "source port"
msgstr "forrásport"
-#: firewall/models.py:83
+#: firewall/models.py:87
msgid "Source port number of packets that match."
msgstr "Az illeszkedő csomagok forrásportjának száma."
-#: firewall/models.py:85
+#: firewall/models.py:89
msgid "weight"
msgstr "súly"
-#: firewall/models.py:87
+#: firewall/models.py:91
msgid "Rule weight"
msgstr "A szabály súlya"
-#: firewall/models.py:90
+#: firewall/models.py:94
msgid "protocol"
msgstr "protokoll"
-#: firewall/models.py:91
+#: firewall/models.py:95
msgid "Protocol of packets that match."
msgstr "Az illeszkedő csomagok protokollja."
-#: firewall/models.py:92
+#: firewall/models.py:96
msgid "extra arguments"
msgstr "további argumentumok"
-#: firewall/models.py:93
+#: firewall/models.py:97
msgid "Additional arguments passed literally to the iptables-rule."
msgstr "Az iptables-szabályhoz változtatás nélkül hozzáadott argumentumok."
-#: firewall/models.py:96
+#: firewall/models.py:100
msgid "action"
msgstr "művelet"
-#: firewall/models.py:97
+#: firewall/models.py:101
msgid "Accept, drop or ignore the matching packets."
msgstr "Az illeszkedő csomagok elfogadása, eldobása vagy ignorálása."
-#: firewall/models.py:101
+#: firewall/models.py:105
msgid "The user responsible for this rule."
msgstr "A szabályért felelős felhasználó."
-#: firewall/models.py:104
+#: firewall/models.py:108
msgid "NAT"
msgstr "NAT"
-#: firewall/models.py:105
+#: firewall/models.py:109
msgid "If network address translation should be done."
msgstr "Hálózati címfordítás engedélyezése."
-#: firewall/models.py:109
+#: firewall/models.py:113
msgid "Rewrite destination port number to this if NAT is needed."
msgstr "Célport számának átírása a megadottra NAT esetén."
-#: firewall/models.py:114
+#: firewall/models.py:118
msgid "external IPv4 address"
msgstr "külső IPv4 cím"
-#: firewall/models.py:118 firewall/models.py:367 firewall/models.py:424
-#: firewall/models.py:447 firewall/models.py:518
+#: firewall/models.py:122 firewall/models.py:388 firewall/models.py:540
+#: firewall/models.py:563 firewall/models.py:634
msgid "created at"
msgstr "létrehozva"
-#: firewall/models.py:121 firewall/models.py:371 firewall/models.py:426
-#: firewall/models.py:449 firewall/models.py:520
+#: firewall/models.py:125 firewall/models.py:392 firewall/models.py:542
+#: firewall/models.py:565 firewall/models.py:636
msgid "modified at"
msgstr "módosítva"
-#: firewall/models.py:124 firewall/models.py:507
+#: firewall/models.py:128 firewall/models.py:623
#: network/templates/network/vlan-create.html:8
#: network/templates/network/vlan-edit.html:8 vm/models/network.py:39
#: vm/models/network.py:64
msgid "vlan"
msgstr "vlan"
-#: firewall/models.py:125
+#: firewall/models.py:129
msgid "Vlan the rule applies to (if type is vlan)."
msgstr "Erre a vlanra vonatkozik a szabály (ha a típus vlan)."
-#: firewall/models.py:129 network/templates/network/vlan-group-create.html:8
+#: firewall/models.py:133 network/templates/network/vlan-group-create.html:8
#: network/templates/network/vlan-group-edit.html:8
msgid "vlan group"
msgstr "vlan-csoport"
-#: firewall/models.py:130
+#: firewall/models.py:134
msgid "Group of vlans the rule applies to (if type is vlan)."
msgstr "Erre a vlan-csoportra vonatkozik a szabály (ha a típus vlan)."
-#: firewall/models.py:133 firewall/models.py:874 firewall/models.py:994
+#: firewall/models.py:137 firewall/models.py:1003 firewall/models.py:1123
#: network/templates/network/host-create.html:8
#: network/templates/network/host-edit.html:8 vm/models/network.py:66
#: vm/models/node.py:70
msgid "host"
msgstr "gép"
-#: firewall/models.py:134
+#: firewall/models.py:138
msgid "Host the rule applies to (if type is host)."
msgstr "Erre a gépre vonatkozik a szabály (ha a típus gép)."
-#: firewall/models.py:137 network/templates/network/group-create.html:8
+#: firewall/models.py:141 network/templates/network/group-create.html:8
#: network/templates/network/group-edit.html:8
msgid "host group"
msgstr "gépcsoport"
-#: firewall/models.py:138
+#: firewall/models.py:142
msgid "Group of hosts the rule applies to (if type is host)."
msgstr "Erre a gépcsoportra vonatkozik a szabály (ha a típus gép)."
-#: firewall/models.py:141
+#: firewall/models.py:145
msgid "firewall"
msgstr "tűzfal"
-#: firewall/models.py:142
+#: firewall/models.py:146
msgid "Firewall the rule applies to (if type is firewall)."
msgstr "Erre a tűzfalra vonatkozik a szabály (ha a típus tűzfal)."
-#: firewall/models.py:154
+#: firewall/models.py:158
msgid "Only one field can be selected."
msgstr "Csak egy mező választható ki."
-#: firewall/models.py:247 network/templates/network/rule-create.html:8
+#: firewall/models.py:258 network/templates/network/rule-create.html:8
#: network/templates/network/rule-edit.html:8
msgid "rule"
msgstr "szabály"
-#: firewall/models.py:248
+#: firewall/models.py:259
msgid "rules"
msgstr "szabályok"
-#: firewall/models.py:276
+#: firewall/models.py:287
msgid "public"
msgstr "nyilvános"
-#: firewall/models.py:277
+#: firewall/models.py:288
msgid "portforward"
msgstr "porttovábbítás"
-#: firewall/models.py:279
+#: firewall/models.py:290
msgid "VID"
msgstr "VID"
-#: firewall/models.py:280
+#: firewall/models.py:291
msgid "The vlan ID of the subnet."
msgstr "Az alhálózat vlan-azonosítója."
-#: firewall/models.py:286
+#: firewall/models.py:297
msgid "The short name of the subnet."
msgstr "Az alhálózat rövid neve."
-#: firewall/models.py:290
+#: firewall/models.py:301
msgid "IPv4 address/prefix"
msgstr "IPv4 cím/prefixhossz"
-#: firewall/models.py:292
+#: firewall/models.py:303
msgid ""
"The IPv4 address and the prefix length of the gateway. Recommended value is "
"the last valid address of the subnet, for example 10.4.255.254/16 for "
@@ -3025,43 +3081,43 @@ msgstr ""
"Az útválasztó IPv4 címe és prefixhossza. Az ajánlott érték az alhálózat "
"utolsó érvényes címe, például 10.4.255.254/16 a 10.4.0.0/16 hálózat esetén."
-#: firewall/models.py:299
+#: firewall/models.py:310
msgid "IPv6 prefixlen/host"
msgstr "IPv6 prefixhossz/gép"
-#: firewall/models.py:300
+#: firewall/models.py:311
msgid ""
-"The prefix length of the subnet assigned to a host. For example /112 = 65536 "
-"addresses/host."
+"The prefix length of the subnet assigned to a host. For example /112 = 65536"
+" addresses/host."
msgstr ""
"A géphez rendelt alhálózat prefixhossza. Például a /112 beállítás 65536 "
"címet jelent gépenként."
-#: firewall/models.py:308
+#: firewall/models.py:319
msgid "IPv6 address/prefix"
msgstr "IPv6 cím/prefixhossz"
-#: firewall/models.py:310
+#: firewall/models.py:321
msgid "The IPv6 address and the prefix length of the gateway."
msgstr "Az útválasztó IPv6 címe és prefixhossza."
-#: firewall/models.py:314
+#: firewall/models.py:325
msgid "NAT IP address"
msgstr "NAT IP cím"
-#: firewall/models.py:316
+#: firewall/models.py:327
msgid ""
"Common IPv4 address used for address translation of connections to the "
"networks selected below (typically to the internet)."
msgstr ""
-"Közös címfordításra használt IPv4 cím a kiválasztott hálózatok felé irányuló "
-"kapcsolatokhoz (tipikusan az internet felé)."
+"Közös címfordításra használt IPv4 cím a kiválasztott hálózatok felé irányuló"
+" kapcsolatokhoz (tipikusan az internet felé)."
-#: firewall/models.py:322
+#: firewall/models.py:333
msgid "NAT to"
msgstr "NAT ide"
-#: firewall/models.py:324
+#: firewall/models.py:335
msgid ""
"Connections to these networks should be network address translated, i.e. "
"their source address is rewritten to the value of NAT IP address."
@@ -3069,62 +3125,84 @@ msgstr ""
"A megadott hálózatok felé induló kapcsolatok címfordításra kerülnek: a "
"forráscímük a megadott NAT IP címre lesz átírva."
-#: firewall/models.py:330
+#: firewall/models.py:341
msgid "network type"
msgstr "hálózat típusa"
-#: firewall/models.py:333 vm/models/network.py:41
+#: firewall/models.py:344 vm/models/network.py:41
msgid "managed"
msgstr "menedzselt"
-#: firewall/models.py:336
+#: firewall/models.py:347
msgid "Description of the goals and elements of the vlan network."
msgstr "A vlan hálózat céljainak és elemeinek leírása."
-#: firewall/models.py:338
+#: firewall/models.py:349
msgid "comment"
msgstr "megjegyzés"
-#: firewall/models.py:340
+#: firewall/models.py:351
msgid "Notes, comments about the network"
msgstr "Jegyzetek, megjegyzések a hálózatról"
-#: firewall/models.py:341
+#: firewall/models.py:352
msgid "domain name"
msgstr "tartománynév"
-#: firewall/models.py:342
+#: firewall/models.py:353
msgid "Domain name of the members of this network."
msgstr "A hálózat tagjainak tartományneve."
-#: firewall/models.py:346
+#: firewall/models.py:357
msgid "reverse domain"
msgstr "reverz tartomány"
-#: firewall/models.py:347
+#: firewall/models.py:358
#, python-format
msgid ""
"Template of the IPv4 reverse domain name that should be generated for each "
-"host. The template should contain four tokens: \"%(a)d\", \"%(b)d\", \"%(c)d"
-"\", and \"%(d)d\", representing the four bytes of the address, respectively, "
-"in decimal notation. For example, the template for the standard reverse "
-"address is: \"%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa\"."
+"host. The template should contain four tokens: \"%(a)d\", \"%(b)d\", "
+"\"%(c)d\", and \"%(d)d\", representing the four bytes of the address, "
+"respectively, in decimal notation. For example, the template for the "
+"standard reverse address is: \"%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa\"."
msgstr ""
"Az IPv4 reverz tartománynevek generálásához használt sablon. A sablon négy "
"tokent kell tartalmazzon: \"%(a)d\", \"%(b)d\", \"%(c)d\" és \"%(d)d\", "
"amelyek rendre a cím négy byte-ját reprezentálják, decimális jelölésben. "
-"Például a szabványos reverz név sablonja: \"%(d)d.%(c)d.%(b)d.%(a)d.in-addr."
-"arpa\"."
-
-#: firewall/models.py:357
+"Például a szabványos reverz név sablonja: \"%(d)d.%(c)d.%(b)d.%(a)d.in-"
+"addr.arpa\"."
+
+#: firewall/models.py:368
+#, python-format
+msgid ""
+"Template for translating IPv4 addresses to IPv6. Automatically generated "
+"hosts in dual-stack networks will get this address. The template can contain"
+" four tokens: \"%(a)d\", \"%(b)d\", \"%(c)d\", and \"%(d)d\", representing "
+"the four bytes of the IPv4 address, respectively, in decimal notation. "
+"Moreover you can use any standard printf format specification like %(a)02x "
+"to get the first byte as two hexadecimal digits. Usual choices for mapping "
+"198.51.100.0/24 to 2001:0DB8:1:1::/64 would be \"2001:db8:1:1:%(d)d::\" and "
+"\"2001:db8:1:1:%(d)02x00::\"."
+msgstr ""
+"Sablon az IPv4 címek IPv6-ra való fordításához. A dual-stack hálózatokban "
+"automatikusan generált gépek ezt a címet fogják kapni. A sablon négy tokent "
+"(\"%(a)d\", \"%(b)d\", \"%(c)d\" és \"%(d)d\") tartalmazhat, amelyek rendre "
+"az IPv4 cím négy byte-ját tartalmazzák decimális formában. Ezen kívül más "
+"szabványos printf formátumspecifikációk is használhatóak, mint például a "
+"%(a)02x, amely az első byte-ot két hexadecimális számjegyként reprezentálja."
+" Például a 198.51.100.0/24 hálózat 2001:0DB8:1:1::/64 alá képezésére "
+"szokásos választás lehet a \"2001:db8:1:1:%(d)d::\" és a "
+"\"2001:db8:1:1:%(d)02x00::\"."
+
+#: firewall/models.py:379
msgid "ipv6 template"
msgstr "ipv6 sablon"
-#: firewall/models.py:359
+#: firewall/models.py:380
msgid "DHCP pool"
msgstr "DHCP készlet"
-#: firewall/models.py:361
+#: firewall/models.py:382
msgid ""
"The address range of the DHCP pool: empty for no DHCP service, \"manual\" "
"for no DHCP pool, or the first and last address of the range separated by a "
@@ -3134,180 +3212,194 @@ msgstr ""
"tiltásához adja meg a „manual” értéket, engedélyezéséhez az első és utolsó "
"érvényes címet szóközzel elválasztva."
+#: firewall/models.py:399
+msgid "You cannot specify an IPv6 template if there is no IPv6 network set."
+msgstr "Nem adhat meg IPv6 sablont, ha nincs IPv6 hálózat beállítva."
+
#: firewall/models.py:405
+#, python-format
+msgid "%(ip6)s (translated from %(ip4)s) is outside of the IPv6 network."
+msgstr "%(ip6)s (ebből képezve: %(ip4)s) kívül esik az IPv6 hálózaton."
+
+#: firewall/models.py:449
+msgid "IPv6 network is too small to map IPv4 addresses to it."
+msgstr "Az IPv6 hálózat túl kicsi az IPv4 címek leképezéséhez."
+
+#: firewall/models.py:507
msgid "All IP addresses are already in use."
msgstr "Minden IP cím használatban van."
-#: firewall/models.py:414 firewall/models.py:441
+#: firewall/models.py:530 firewall/models.py:557
msgid "The name of the group."
msgstr "A csoport neve."
-#: firewall/models.py:416
+#: firewall/models.py:532
msgid "vlans"
msgstr "vlanok"
-#: firewall/models.py:417
+#: firewall/models.py:533
msgid "The vlans which are members of the group."
msgstr "A csoport tagjait képező vlanok."
-#: firewall/models.py:420 firewall/models.py:443
+#: firewall/models.py:536 firewall/models.py:559
msgid "Description of the group."
msgstr "A csoport leírása."
-#: firewall/models.py:465 storage/models.py:50
+#: firewall/models.py:581 network/tables.py:130 storage/models.py:50
msgid "hostname"
msgstr "gépnév"
-#: firewall/models.py:466
+#: firewall/models.py:582
msgid "The alphanumeric hostname of the host, the first part of the FQDN."
msgstr "A gép alfanumerikus gépneve, az FQDN első része."
-#: firewall/models.py:472
+#: firewall/models.py:588
msgid "reverse"
msgstr "reverz"
-#: firewall/models.py:473
+#: firewall/models.py:589
msgid ""
-"The fully qualified reverse hostname of the host, if different than hostname."
-"domain."
+"The fully qualified reverse hostname of the host, if different than "
+"hostname.domain."
msgstr ""
-"A gép teljes reverz tartományneve, amennyiben különbözik ettől: gépnév."
-"tartomány."
+"A gép teljes reverz tartományneve, amennyiben különbözik ettől: "
+"gépnév.tartomány."
-#: firewall/models.py:477
+#: firewall/models.py:593 network/tables.py:129
msgid "MAC address"
msgstr "MAC cím"
-#: firewall/models.py:478
+#: firewall/models.py:594
msgid ""
-"The MAC (Ethernet) address of the network interface. For example: 99:AA:BB:"
-"CC:DD:EE."
+"The MAC (Ethernet) address of the network interface. For example: "
+"99:AA:BB:CC:DD:EE."
msgstr "A hálózati interfész MAC (Ethernet) címe. Például 99:AA:BB:CC:DD:EE."
-#: firewall/models.py:483
+#: firewall/models.py:599
msgid "The real IPv4 address of the host, for example 10.5.1.34."
msgstr "A gép valódi IPv4 címe, például 10.5.1.34."
-#: firewall/models.py:487
+#: firewall/models.py:603
msgid "WAN IPv4 address"
msgstr "WAN IPv4 cím"
-#: firewall/models.py:488
+#: firewall/models.py:604
msgid ""
"The public IPv4 address of the host on the wide area network, if different."
msgstr "A gép nyilvános IPv4 címe a nagy kiterjedésű hálózaton, ha eltér."
-#: firewall/models.py:493
+#: firewall/models.py:609
msgid "The global IPv6 address of the host, for example 2001:db:88:200::10."
msgstr "A gép globális IPv6 címe, például 2001:db:88:200::10."
-#: firewall/models.py:495
+#: firewall/models.py:611
msgid "shared IP"
msgstr "osztott IP"
-#: firewall/models.py:497
+#: firewall/models.py:613
msgid "If the given WAN IPv4 address is used by multiple hosts."
msgstr "A WAN IPv4 címet több gép használja-e."
-#: firewall/models.py:500
+#: firewall/models.py:616
msgid "What is this host for, what kind of machine is it."
msgstr "Mi a gép célja, milyen gép ez."
-#: firewall/models.py:503
+#: firewall/models.py:619
msgid "Notes"
msgstr "Jegyzetek"
-#: firewall/models.py:504
+#: firewall/models.py:620
msgid "location"
msgstr "elhelyezés"
-#: firewall/models.py:506
+#: firewall/models.py:622
msgid "The physical location of the machine."
msgstr "A gép fizikai helye."
-#: firewall/models.py:509
+#: firewall/models.py:625
msgid "Vlan network that the host is part of."
msgstr "Az a vlan hálózat, amelynek a gép része."
-#: firewall/models.py:512
+#: firewall/models.py:628
msgid "The person responsible for this host."
msgstr "A gépért felelős személy."
-#: firewall/models.py:514
+#: firewall/models.py:630
msgid "groups"
msgstr "csoportok"
-#: firewall/models.py:516
+#: firewall/models.py:632
msgid "Host groups the machine is part of."
msgstr "Gépcsoportok, amelyeknek tagja a gép."
-#: firewall/models.py:569
+#: firewall/models.py:685
msgid "If shared_ip has been checked, external_ipv4 has to be unique."
msgstr ""
-"Amennyiben az osztott IP mező igaz, a külső IPv4 cím mező egyedi kell legyen."
+"Amennyiben az osztott IP mező igaz, a külső IPv4 cím mező egyedi kell "
+"legyen."
-#: firewall/models.py:572
+#: firewall/models.py:688
msgid "You can't use another host's NAT'd address as your own IPv4."
msgstr "Nem használható másik gép NAT-olt címe saját IPv4 címként."
-#: firewall/models.py:678
+#: firewall/models.py:793
#, python-format
msgid "All %s ports are already in use."
msgstr "Minden %s port használatban van."
-#: firewall/models.py:696
+#: firewall/models.py:811
#, python-format
msgid "Port %(proto)s %(public)s is already in use."
msgstr "A(z) %(public)s %(proto)s port használatban van."
-#: firewall/models.py:714
+#: firewall/models.py:829
msgid "Only ports above 1024 can be used."
msgstr "Csak az 1024 feletti portok használhatóak."
-#: firewall/models.py:853 firewall/models.py:883 firewall/models.py:953
-#: firewall/models.py:981 firewall/models.py:1005
+#: firewall/models.py:982 firewall/models.py:1012 firewall/models.py:1082
+#: firewall/models.py:1110 firewall/models.py:1134
msgid "created_at"
msgstr "létrehozva"
-#: firewall/models.py:855 firewall/models.py:885 firewall/models.py:955
-#: firewall/models.py:983 firewall/models.py:1007
+#: firewall/models.py:984 firewall/models.py:1014 firewall/models.py:1084
+#: firewall/models.py:1112 firewall/models.py:1136
msgid "modified_at"
msgstr "módosítva"
-#: firewall/models.py:856 firewall/models.py:879
+#: firewall/models.py:985 firewall/models.py:1008
msgid "ttl"
msgstr "ttl"
-#: firewall/models.py:872 network/templates/network/domain-create.html:8
+#: firewall/models.py:1001 network/templates/network/domain-create.html:8
#: network/templates/network/domain-edit.html:8
msgid "domain"
msgstr "tartomány"
-#: firewall/models.py:878
+#: firewall/models.py:1007
msgid "address"
msgstr "cím"
-#: firewall/models.py:900
+#: firewall/models.py:1029
msgid "Address must be specified!"
msgstr "A cím megadása kötelező."
-#: firewall/models.py:913
+#: firewall/models.py:1042
msgid "Unknown record type."
msgstr "Ismeretlen rekordtípus."
-#: firewall/models.py:947
+#: firewall/models.py:1076
msgid "untagged vlan"
msgstr "untagged vlan"
-#: firewall/models.py:950
+#: firewall/models.py:1079
msgid "tagged vlans"
msgstr "tagged vlanok"
-#: firewall/models.py:973
+#: firewall/models.py:1102
msgid "interface"
msgstr "interfész"
-#: firewall/models.py:974
+#: firewall/models.py:1103
msgid ""
"The name of network interface the gateway should serve this network on. For "
"example eth2."
@@ -3315,24 +3407,24 @@ msgstr ""
"Azon hálózati interfész nevve, amelyen az útválasztó ezt a hálózatot "
"kiszolgálja. Például eth2."
-#: firewall/models.py:979 network/templates/network/switch-port-create.html:8
+#: firewall/models.py:1108 network/templates/network/switch-port-create.html:8
#: network/templates/network/switch-port-edit.html:8
msgid "switch port"
msgstr "switch port"
-#: firewall/models.py:995
+#: firewall/models.py:1124
msgid "reason"
msgstr "indok"
-#: firewall/models.py:997
+#: firewall/models.py:1126
msgid "short message"
msgstr "rövid üzenet"
-#: firewall/models.py:1017
+#: firewall/models.py:1146
msgid "blacklist item"
msgstr "tiltólista eleme"
-#: firewall/models.py:1018 network/templates/network/blacklist-create.html:8
+#: firewall/models.py:1147 network/templates/network/blacklist-create.html:8
#: network/templates/network/blacklist-edit.html:8
msgid "blacklist"
msgstr "tiltólista"
@@ -3395,96 +3487,117 @@ msgstr ""
#: manager/scheduler.py:49
msgid ""
-"No node can satisfy the required traits of the new virtual machine currently."
+"No node can satisfy the required traits of the new virtual machine "
+"currently."
msgstr ""
"Egy csomópont sem biztosítja a virtuális gép indításához szükséges "
"jellemzőket."
-#: network/forms.py:131
+#: network/forms.py:127
+msgid "Generate random address."
+msgstr "Véletlenszerű cím generálása."
+
+#: network/forms.py:130
+msgid "Generate IPv6 pair of IPv4 address."
+msgstr "IPv4-es cím IPv6-os párjának generálása."
+
+#: network/forms.py:135
msgid "Information"
msgstr "Információ"
-#: network/forms.py:194
+#: network/forms.py:198
msgid "External"
msgstr "Külső"
-#: network/forms.py:259
+#: network/forms.py:261
+msgid "Generate sensible template."
+msgstr "Ésszerű sablon generálása."
+
+#: network/forms.py:265
msgid "Domain name service"
msgstr "DNS szolgáltatás"
-#: network/forms.py:264
+#: network/forms.py:270
msgid "Info"
msgstr "Infó"
-#: network/tables.py:202
+#: network/tables.py:125 network/tables.py:138
+msgid "No hosts."
+msgstr "Nincs gép."
+
+#: network/tables.py:131
+msgid "requested IP"
+msgstr "kért IP"
+
+#: network/tables.py:230
msgid "No records."
msgstr "Nincs rekord."
-#: network/views.py:104
+#: network/views.py:132
#, python-format
msgid "Successfully modified blacklist item%(ipv4)s - %(type)s!"
msgstr "Tiltólista eleme sikeresen módosítva (%(ipv4)s %(type)s)."
-#: network/views.py:122
+#: network/views.py:150
#, python-format
msgid "Successfully created blacklist item %(ipv4)s - %(type)s!"
msgstr "Tiltólista eleme sikeresen létrehozva (%(ipv4)s %(type)s)."
-#: network/views.py:160
+#: network/views.py:188
#, python-format
msgid "Successfully modified domain %(name)s!"
msgstr "A(z) %(name)s tartománynév módosításra került."
-#: network/views.py:187
+#: network/views.py:215
#, python-format
msgid "Successfully created domain %(name)s!"
msgstr "A(z) %(name)s tartománynév létrehozásra került."
-#: network/views.py:204 network/views.py:442 network/views.py:699
+#: network/views.py:232 network/views.py:507 network/views.py:774
msgid "Object name does not match!"
msgstr "Az objektum neve nem egyezik."
-#: network/views.py:208
+#: network/views.py:236
msgid "Domain successfully deleted!"
msgstr "A tartománynév törlésre került."
-#: network/views.py:214
+#: network/views.py:242
msgid "Records from hosts"
msgstr "A gépek rekordjai"
-#: network/views.py:220 network/templates/network/menu.html:8
+#: network/views.py:248 network/templates/network/menu.html:8
#: network/templates/network/vlan-list.html:7
msgid "Vlans"
msgstr "Vlanok"
-#: network/views.py:228 network/views.py:714
+#: network/views.py:256 network/views.py:789
#: network/templates/network/host-list.html:7
#: network/templates/network/host-list.html:13
#: network/templates/network/menu.html:5
msgid "Hosts"
msgstr "Gépek"
-#: network/views.py:271
+#: network/views.py:299
#, python-format
msgid "Successfully created host group %(name)s!"
msgstr "%(name)s gépcsoport létrehozásra került."
-#: network/views.py:279
+#: network/views.py:307
#, python-format
msgid "Successfully modified host group %(name)s!"
msgstr "%(name)s gépcsoport módosításra került."
-#: network/views.py:339
+#: network/views.py:386
#, python-format
msgid "Successfully modified host %(hostname)s!"
msgstr "%(hostname)s gép módosításra került."
-#: network/views.py:410
+#: network/views.py:459
#, python-format
msgid "Successfully created host %(hostname)s!"
msgstr "%(hostname)s gép létrehozásra került."
-#: network/views.py:431 network/views.py:722
+#: network/views.py:496 network/views.py:797
#: network/templates/network/host-edit.html:75
#: network/templates/network/menu.html:14
#: network/templates/network/record-list.html:7
@@ -3492,83 +3605,83 @@ msgstr "%(hostname)s gép létrehozásra került."
msgid "Records"
msgstr "Rekordok"
-#: network/views.py:446
+#: network/views.py:511
msgid "Host successfully deleted!"
msgstr "A gép törlésre került."
-#: network/views.py:476
+#: network/views.py:541
msgid "Successfully modified record!"
msgstr "A rekord módosításra került."
-#: network/views.py:495
+#: network/views.py:560
msgid "Successfully created record!"
msgstr "A rekord létrehozásra került."
-#: network/views.py:546
+#: network/views.py:611
msgid "Successfully modified rule!"
msgstr "A szabály módosításra került."
-#: network/views.py:566
+#: network/views.py:631
msgid "Successfully created rule!"
msgstr "A szabály létrehozásra került."
-#: network/views.py:602
+#: network/views.py:667
msgid "Succesfully modified switch port!"
msgstr "A switch-port módosításra került."
-#: network/views.py:621
+#: network/views.py:686
msgid "Successfully created switch port!"
msgstr "A switch-port létrehozásra került."
-#: network/views.py:654
+#: network/views.py:733
#, python-format
msgid "Succesfully modified vlan %(name)s!"
msgstr "A(z) %(name)s vlan módosításra került."
-#: network/views.py:678
+#: network/views.py:753
#, python-format
msgid "Successfully created vlan %(name)s!"
msgstr "A(z) %(name)s vlan létrehozásra került."
-#: network/views.py:703
+#: network/views.py:778
msgid "Vlan successfully deleted!"
msgstr "A vlan törlésre került."
-#: network/views.py:745
+#: network/views.py:820
#, python-format
msgid "Successfully modified vlan group %(name)s!"
msgstr "A(z) %(name)s vlan-csoport módosításra került."
-#: network/views.py:758
+#: network/views.py:833
#, python-format
msgid "Successfully created vlan group %(name)s!"
msgstr "A(z) %(name)s vlan-csoport módosításra került."
-#: network/views.py:790
+#: network/views.py:865
#, python-format
msgid "Successfully removed %(host)s from %(group)s group!"
msgstr "A(z) %(host)s csoport törlésre került a(z) %(group)s csoportból."
-#: network/views.py:806
+#: network/views.py:881
#, python-format
msgid "Successfully added %(host)s to group %(group)s!"
msgstr "A(z) %(host)s csoport hozzáadásra került a(z) %(group)s csoporthoz."
-#: network/views.py:825
+#: network/views.py:900
#, python-format
msgid "Successfully deleted ethernet device %(name)s!"
msgstr "A(z) %(name)s ethernet-eszköz törlésre került."
-#: network/views.py:843
+#: network/views.py:918
#, python-format
msgid "Successfully added %(name)s to this switch port"
msgstr "%(name)s hozzáadásra került a switch-porthoz."
-#: network/views.py:850
+#: network/views.py:925
msgid "Ethernet device name cannot be empty!"
msgstr "Az ethernet-eszköz megadása kötelező."
-#: network/views.py:853
+#: network/views.py:928
msgid "There is already an ethernet device with that name!"
msgstr "Már létezik a megadott nevű ethernet-eszköz."
@@ -3652,6 +3765,7 @@ msgstr "Gépcsoportok"
#: network/templates/network/host-create.html:12
#: network/templates/network/host-list.html:11
+#: network/templates/network/vlan-edit.html:22
msgid "Create a new host"
msgstr "Gép létrehozása"
@@ -3818,10 +3932,14 @@ msgstr "Vlan törlése"
msgid "details of vlan"
msgstr "vlan részletei"
-#: network/templates/network/vlan-edit.html:22
+#: network/templates/network/vlan-edit.html:23
msgid "Host list"
msgstr "Gépek"
+#: network/templates/network/vlan-edit.html:28
+msgid "Unregistered hosts"
+msgstr "Regisztrálatlan gépek"
+
#: network/templates/network/vlan-group-create.html:12
#: network/templates/network/vlan-group-list.html:11
msgid "Create a new vlan group"
@@ -3831,10 +3949,9 @@ msgstr "Vlan-csoport létrehozása"
msgid "list of all vlans"
msgstr "összes vlan"
-#: network/templates/network/columns/mac.html:3
-#, python-format
-msgid "Vendor: %(vendor)s"
-msgstr "Gyártó: %(vendor)s"
+#: network/templates/network/columns/host-register.html:3
+msgid "register host"
+msgstr "gép regisztrálása"
#: network/templates/network/confirm/base_delete.html:8
#, python-format
@@ -3929,8 +4046,8 @@ msgid ""
"The requested operation can't be performed on disk '%(name)s' because it is "
"in use."
msgstr ""
-"A kért művelet nem hajtható végre a(z) „%(name)s” lemezen, mivel használatban "
-"van."
+"A kért művelet nem hajtható végre a(z) „%(name)s” lemezen, mivel "
+"használatban van."
#: storage/models.py:139
#, python-format
@@ -3944,11 +4061,11 @@ msgstr ""
#: storage/models.py:148
#, python-format
msgid ""
-"The requested operation can't be performed on disk '%(name)s' because it has "
-"never been deployed."
+"The requested operation can't be performed on disk '%(name)s' because it has"
+" never been deployed."
msgstr ""
-"A kért művelet nem hajtható végre a(z) „%(name)s” lemezen, mivel nem volt még "
-"csatolva."
+"A kért művelet nem hajtható végre a(z) „%(name)s” lemezen, mivel nem volt "
+"még csatolva."
#: storage/models.py:152
#, python-format
@@ -3972,8 +4089,8 @@ msgstr ""
#, python-format
msgid ""
"The requested operation can't be performed on disk '%(name)s' (%(pk)s) "
-"[%(filename)s] because its base '%(b_name)s' (%(b_pk)s) [%(b_filename)s] has "
-"never beendeployed."
+"[%(filename)s] because its base '%(b_name)s' (%(b_pk)s) [%(b_filename)s] has"
+" never beendeployed."
msgstr ""
"A kért művelet nem hajtható végre a(z) „%(name)s” (%(pk)s) [%(filename)s] "
"lemezen, mivel az alapja, „%(b_name)s” (%(b_pk)s) [%(b_filename)s] nem "
@@ -4016,49 +4133,41 @@ msgid ""
msgstr ""
"\n"
" Ez a CIRCLE\n"
-" Cloud szoftver egy telepítése. A CIRCLE egy szabad, nyílt "
-"forrású felhőmenedzser.\n"
+" Cloud szoftver egy telepítése. A CIRCLE egy szabad, nyílt forrású felhőmenedzser.\n"
" "
#: templates/info/help.html:20
msgid ""
"\n"
-" Its most important function is starting and managing virtual "
-"machine\n"
+" Its most important function is starting and managing virtual machine\n"
" instances based on templates.\n"
" These templates are also easy to create.\n"
" "
msgstr ""
"\n"
-"Legfontosabb funkciója a virtuális gépek indítása és kezelése könnyen "
-"létrehozható sablonok alapján."
+"Legfontosabb funkciója a virtuális gépek indítása és kezelése könnyen létrehozható sablonok alapján."
#: templates/info/help.html:26
msgid ""
"\n"
-" Apart from this tutorial we recommend to try the system, it is "
-"quite\n"
+" Apart from this tutorial we recommend to try the system, it is quite\n"
" intuitive, and the web interface shows detailed instructions on\n"
" advanced options.\n"
" "
msgstr ""
"\n"
-"Ezen az útmutatón kívül javasoljuk, hogy próbálja ki a rendszert, amelynek "
-"használata magától értetődő. A webes felületen részletes útmutatást talál a "
-"haladó lehetőségekről."
+"Ezen az útmutatón kívül javasoljuk, hogy próbálja ki a rendszert, amelynek használata magától értetődő. A webes felületen részletes útmutatást talál a haladó lehetőségekről."
#: templates/info/help.html:34
#, python-format
msgid ""
"\n"
-" You can reach this service at https://%(host)s/ where you "
-"can log in\n"
+" You can reach this service at https://%(host)s/ where you can log in\n"
" to the dashboard.\n"
" "
msgstr ""
"\n"
-"A szolgáltatást a https://%(host)s/ címen érheti el. Itt "
-"bejelentkezhet az irányítópultra."
+"A szolgáltatást a https://%(host)s/ címen érheti el. Itt bejelentkezhet az irányítópultra."
#: templates/info/help.html:39
msgid ""
@@ -4069,8 +4178,7 @@ msgid ""
" "
msgstr ""
"\n"
-"Az irányítópult összefoglalja a virtuális gépeket és más erőforrásokat. Ez a "
-"kiindulópont a rendszer lehetőségeinek eléréséhez."
+"Az irányítópult összefoglalja a virtuális gépeket és más erőforrásokat. Ez a kiindulópont a rendszer lehetőségeinek eléréséhez."
#: templates/info/help.html:49
msgid "Sorry, you have no permission to launch virtual machines."
@@ -4088,10 +4196,7 @@ msgid ""
" "
msgstr ""
"\n"
-"A virtuális gépek dobozban találja legutóbbi virtuális gépeit. Egy "
-"összefoglaló nézet is elérhető az műszer gombra () kattintva. Kattintson a virtuális gép nevére a kapcsolódási adatok, "
-"beállítások megtekintéséhez, vagy az állapotának megváltoztatásához."
+"A virtuális gépek dobozban találja legutóbbi virtuális gépeit. Egy összefoglaló nézet is elérhető az műszer gombra () kattintva. Kattintson a virtuális gép nevére a kapcsolódási adatok, beállítások megtekintéséhez, vagy az állapotának megváltoztatásához."
#: templates/info/help.html:61
msgid ""
@@ -4107,32 +4212,22 @@ msgid ""
" "
msgstr ""
"\n"
-"A fontos vagy gyakran használt gépeket megjelölheti kedvencként (). A keresés mező inkrementálisan mutatja az "
-"eredményeket, beküldésével (⏎) közvetlenül a megtalált gépre ugrik, ha "
-"pontosan egy találat van. Új virtuális gépeket az új "
-"gombra kattintva, majd a sablont kiválasztva indíthat. "
+"A fontos vagy gyakran használt gépeket megjelölheti kedvencként (). A keresés mező inkrementálisan mutatja az eredményeket, beküldésével (⏎) közvetlenül a megtalált gépre ugrik, ha pontosan egy találat van. Új virtuális gépeket az új gombra kattintva, majd a sablont kiválasztva indíthat. "
#: templates/info/help.html:72
msgid ""
"\n"
" If you select a virtual machine, you get to a page with all the\n"
-" details and operations listed. On the left, you will see the "
-"state\n"
+" details and operations listed. On the left, you will see the state\n"
" of the machine and a summary about how you can\n"
" connect to the\n"
" machine.\n"
-" In the middle there is a tabbed pane, which contains details "
-"about\n"
+" In the middle there is a tabbed pane, which contains details about\n"
" the machine in categories.\n"
" "
msgstr ""
"\n"
-"Ha kiválaszt egy virtuális gépet, a gép adatait és műveleteit elérhetővé "
-"tévő oldalra jut. Baloldalt a gép állapotát és a csatlakozáshoz"
-"strong> szükséges adatokat találja. Középen egy több lapból álló panel van, "
-"amely a gép összes részletét kategorizálva mutatja be."
+"Ha kiválaszt egy virtuális gépet, a gép adatait és műveleteit elérhetővé tévő oldalra jut. Baloldalt a gép állapotát és a csatlakozáshoz szükséges adatokat találja. Középen egy több lapból álló panel van, amely a gép összes részletét kategorizálva mutatja be."
#: templates/info/help.html:81
msgid ""
@@ -4143,14 +4238,12 @@ msgid ""
" "
msgstr ""
"\n"
-"A jobb felső sarokban a műveleteket tartalmazó eszköztár található a gép "
-"életciklusát befolyásoló, legfontosabb műveletekkel."
+"A jobb felső sarokban a műveleteket tartalmazó eszköztár található a gép életciklusát befolyásoló, legfontosabb műveletekkel."
#: templates/info/help.html:87
msgid ""
"\n"
-" The tool buttons are color coded by their effect, and enabled/"
-"disabled\n"
+" The tool buttons are color coded by their effect, and enabled/disabled\n"
" based on the current state of the machine.\n"
" The recommended operation is always the biggest tool button with\n"
" the name displayed.\n"
@@ -4159,11 +4252,7 @@ msgid ""
" "
msgstr ""
"\n"
-"Az eszköztár gombjai színkódoltak a hatásuk szerint, valamint a gép "
-"állapotától függően kerülnek engedélyezésre/tiltásra. Az ajánlott művelet "
-"gombja a legnagyobb, amelyen szerepel az adott művelet megnevezése is. "
-"Nyugodtan rákattinthat a gombokra, a megerősítő ablak részletesen bemutatja "
-"az egyes műveleteket."
+"Az eszköztár gombjai színkódoltak a hatásuk szerint, valamint a gép állapotától függően kerülnek engedélyezésre/tiltásra. Az ajánlott művelet gombja a legnagyobb, amelyen szerepel az adott művelet megnevezése is. Nyugodtan rákattinthat a gombokra, a megerősítő ablak részletesen bemutatja az egyes műveleteket."
#: templates/info/help.html:96
msgid ""
@@ -4181,29 +4270,18 @@ msgid ""
" "
msgstr ""
"\n"
-"A Kezdőoldal lap "
-"statisztikát mutat be a gép működéséről, valamint itt változtathatja meg a "
-"gép nevét, leírását és címkéit. Kifejezetten ajánljuk a leírás kitöltését, "
-"amely megkönnyíti a felhő üzemeltetőinek dolgát karbantartás esetén. Itt "
-"található a lejárati idők összefoglalása is. Minden "
-"virtuális gépnek van egy-egy határideje, amikor felfüggesztésre és amikor "
-"törlésre kerül. Ez előre megadott bérlési módok szerint kerül beállításra. A "
-"megújítás gomb segítségével ezeket a határidőket frissítheti. Természetesen "
-"értesítjük, ha egy gépe a lejárathoz közeledik."
+"A Kezdőoldal lap statisztikát mutat be a gép működéséről, valamint itt változtathatja meg a gép nevét, leírását és címkéit. Kifejezetten ajánljuk a leírás kitöltését, amely megkönnyíti a felhő üzemeltetőinek dolgát karbantartás esetén. Itt található a lejárati idők összefoglalása is. Minden virtuális gépnek van egy-egy határideje, amikor felfüggesztésre és amikor törlésre kerül. Ez előre megadott bérlési módok szerint kerül beállításra. A megújítás gomb segítségével ezeket a határidőket frissítheti. Természetesen értesítjük, ha egy gépe a lejárathoz közeledik."
#: templates/info/help.html:109
msgid ""
"\n"
-" Resources pane "
-"shows\n"
+" Resources pane shows\n"
" details about how much memory and CPU the VM has, and how is it\n"
" scheduled.\n"
" "
msgstr ""
"\n"
-"Az Erőforrások lap "
-"bemutatja, hogy a virtuális gép mennyi CPU-val és memóriával rendelkezik, "
-"valamint milyen az ütemezése. "
+"Az Erőforrások lap bemutatja, hogy a virtuális gép mennyi CPU-val és memóriával rendelkezik, valamint milyen az ütemezése. "
#: templates/info/help.html:115
msgid ""
@@ -4212,22 +4290,18 @@ msgid ""
" the machine is stopped."
msgstr ""
"\n"
-"A megfelelő jogosultsággal rendelkező felhasználók megváltoztathatják ezeket "
-"a beállításokat, ha a gépet leállították."
+"A megfelelő jogosultsággal rendelkező felhasználók megváltoztathatják ezeket a beállításokat, ha a gépet leállították."
#: templates/info/help.html:119
msgid ""
"\n"
-" Console pane "
-"allows\n"
+" Console pane allows\n"
" to see the console of the virutal machine for troubleshooting and\n"
" operating system installation."
msgstr ""
"\n"
"A\n"
-" Konzol lap "
-"lehetővé teszi a virtuális gépek hibaelhárítását és az operációs rendszer "
-"telepítését."
+" Konzol lap lehetővé teszi a virtuális gépek hibaelhárítását és az operációs rendszer telepítését."
#: templates/info/help.html:124
msgid "You can also use the keyboard and mouse."
@@ -4260,10 +4334,7 @@ msgid ""
" "
msgstr ""
"\n"
-"A Hozzáférés lap a gép "
-"megosztását és a tulajdon átruházását teszi lehetővé. A gép felhasználói "
-"láthatják a gép részleteit, az operátorok használhatják a legtöbb műveletet, "
-"a tulajdonosok törölhetik is a gépet."
+"A Hozzáférés lap a gép megosztását és a tulajdon átruházását teszi lehetővé. A gép felhasználói láthatják a gép részleteit, az operátorok használhatják a legtöbb műveletet, a tulajdonosok törölhetik is a gépet."
#: templates/info/help.html:140
msgid ""
@@ -4276,27 +4347,20 @@ msgid ""
msgstr ""
"\n"
"A\n"
-" Hálózat lap a "
-"virtuális gép hálózati kapcsolatait mutatja be. Lehetőség van interfészek "
-"hozzáadására és törlésére, valamint a különböző TCP/UDP portok távoli "
-"elérését is itt lehet engedélyezni."
+" Hálózat lap a virtuális gép hálózati kapcsolatait mutatja be. Lehetőség van interfészek hozzáadására és törlésére, valamint a különböző TCP/UDP portok távoli elérését is itt lehet engedélyezni."
#: templates/info/help.html:147
msgid ""
"\n"
-" Activity pane "
-"shows\n"
+" Activity pane shows\n"
" the full life history of the virtual machine. This is where you\n"
-" can see the causes of failed actions (just point the mouse to the "
-"name of\n"
+" can see the causes of failed actions (just point the mouse to the name of\n"
" the action).\n"
" "
msgstr ""
"\n"
"A \n"
-" Tevékenységek "
-"lapon látszik a virtuális gép teljes élettörténete. Itt lehet a műveletek "
-"meghiúsulásának okait is megtekinteni (húzza az egeret a művelet nevére)."
+" Tevékenységek lapon látszik a virtuális gép teljes élettörténete. Itt lehet a műveletek meghiúsulásának okait is megtekinteni (húzza az egeret a művelet nevére)."
#: templates/info/help.html:159
msgid "Sorry, you have no permission to create templates."
@@ -4312,37 +4376,30 @@ msgid ""
" "
msgstr ""
"\n"
-"A sablonok a virtuálisgép-példányok prototípusai, "
-"megadják a létrehozandó VM különböző technikai beállításait, beleértve a "
-"hálózati interfészeket és a csatolandó lemezeket."
+"A sablonok a virtuálisgép-példányok prototípusai, megadják a létrehozandó VM különböző technikai beállításait, beleértve a hálózati interfészeket és a csatolandó lemezeket."
#: templates/info/help.html:170
msgid ""
"\n"
" In the dashboard box you see your own templates and those, for\n"
-" which you have operator permission. This means that you "
-"can\n"
+" which you have operator permission. This means that you can\n"
" share them with your groups or other users.\n"
" "
msgstr ""
"\n"
-"Az irányítópulti dobozban a saját sablonait, valamint azokat látja, "
-"amelyekhez legalább operátor jogosultsága van. Ez azt jelenti, hogy "
-"megoszthatja őket csoportjaival vagy egyes felhasználókkal."
+"Az irányítópulti dobozban a saját sablonait, valamint azokat látja, amelyekhez legalább operátor jogosultsága van. Ez azt jelenti, hogy megoszthatja őket csoportjaival vagy egyes felhasználókkal."
#: templates/info/help.html:176
msgid ""
"\n"
" You can create templates from any virtual machine with the\n"
-" \n"
+" \n"
" save as template\n"
" button.\n"
" "
msgstr ""
"\n"
-" Bármely virtuális gépből létrehozhat sablont a \n"
+" Bármely virtuális gépből létrehozhat sablont a \n"
" mentés sablonként\n"
" gomb segítségével.\n"
" "
@@ -4357,9 +4414,7 @@ msgid ""
" "
msgstr ""
"\n"
-"Ezen felül a sablonok dobozban lévő új gombbal is elindíthat "
-"egy sablonkészítő varázslót."
+"Ezen felül a sablonok dobozban lévő új gombbal is elindíthat egy sablonkészítő varázslót."
#: templates/info/help.html:195
msgid "Sorry, you have no permission to create groups."
@@ -4373,8 +4428,7 @@ msgid ""
" "
msgstr ""
"\n"
-"A csoportok a jogosultságkezelés epítőelemei. Az irányítópulton azon "
-"csoportokat látja, amelykhez hozzáférése van."
+"A csoportok a jogosultságkezelés epítőelemei. Az irányítópulton azon csoportokat látja, amelykhez hozzáférése van."
#: templates/info/help.html:204
msgid ""
@@ -4386,15 +4440,12 @@ msgid ""
" "
msgstr ""
"\n"
-"Saját csoportokat is létrehozhat a csoportok dobozban lévő új "
-"gombbal."
+"Saját csoportokat is létrehozhat a csoportok dobozban lévő új gombbal."
#: templates/info/help.html:211
msgid ""
"\n"
-" Users logged in with SSO authentication can automatically "
-"become\n"
+" Users logged in with SSO authentication can automatically become\n"
" members of groups based on its organizational identifier.\n"
" Those who are administrators of an organizational group (or a\n"
" professor of a subject in academics) can create groups with the\n"
@@ -4403,11 +4454,7 @@ msgid ""
" "
msgstr ""
"\n"
-"SSO azonosítással belépett felhasználók automatikusan tagjai lehetnek "
-"csoportoknak a szervezeti azonosítójuk alapján. Aki adminisztrátorai egy "
-"csoportnak (vagy oktatói egy tantárgynak az akadémiai szférában) olyan "
-"csoportokat is létrehozhatnak, amelyeknek a tagjai bejelentkezéskor "
-"automatikusan bekerülnek."
+"SSO azonosítással belépett felhasználók automatikusan tagjai lehetnek csoportoknak a szervezeti azonosítójuk alapján. Aki adminisztrátorai egy csoportnak (vagy oktatói egy tantárgynak az akadémiai szférában) olyan csoportokat is létrehozhatnak, amelyeknek a tagjai bejelentkezéskor automatikusan bekerülnek."
#: templates/info/help.html:219
msgid ""
@@ -4417,8 +4464,7 @@ msgid ""
" "
msgstr ""
"\n"
-"Azonosítójuk alapján is hozzáadhat felhasználókat, akkor is, ha még nem "
-"léptek be a rendszerbe."
+"Azonosítójuk alapján is hozzáadhat felhasználókat, akkor is, ha még nem léptek be a rendszerbe."
#: templates/info/help.html:230
msgid "Sorry, this deployment of CIRCLE does not support file store."
@@ -4427,14 +4473,12 @@ msgstr "Ez a CIRCLE-telepítés nem támogatja a tárhelyet."
#: templates/info/help.html:234
msgid ""
"\n"
-" Each user has a simple personal file store, which is the "
-"easiest\n"
+" Each user has a simple personal file store, which is the easiest\n"
" way to keep and retrieve your work done on virtual machines.\n"
" "
msgstr ""
"\n"
-"Minden felhasználónak van egy személyes tárhelye, ami a egyszerű módot ad a "
-"virtuális gépeken elkészített munka tárolására és letöltésére."
+"Minden felhasználónak van egy személyes tárhelye, ami a egyszerű módot ad a virtuális gépeken elkészített munka tárolására és letöltésére."
#: templates/info/help.html:239
msgid ""
@@ -4451,12 +4495,7 @@ msgid ""
" "
msgstr ""
"\n"
-"Fájljait a webes felületről és a virtuális gépekről is eléri. A webes "
-"felület olyan, mint bármelyik fájlböngésző. A virtuális gépek alapesetben "
-"nem kapják meg a tárhely eléréséhez szükséges azonosítókat elkerülendő "
-"megosztásukat a gép esetleges többi használójával. A tárhely használatához "
-"nyomja meg a tárhely csatolása gombot a virtuális gépen."
+"Fájljait a webes felületről és a virtuális gépekről is eléri. A webes felület olyan, mint bármelyik fájlböngésző. A virtuális gépek alapesetben nem kapják meg a tárhely eléréséhez szükséges azonosítókat elkerülendő megosztásukat a gép esetleges többi használójával. A tárhely használatához nyomja meg a tárhely csatolása gombot a virtuális gépen."
#: templates/info/help.html:251
msgid ""
@@ -4470,13 +4509,11 @@ msgstr ""
msgid ""
"\n"
" CIRCLE Cloud is a complete and open source cloud solution \n"
-" that can be deployed with minimal effort on a single computer as "
-"well as on a larger cluster.\n"
+" that can be deployed with minimal effort on a single computer as well as on a larger cluster.\n"
" "
msgstr ""
"\n"
-"A CIRCLE Cloud egy teljeskörű nyílt forrású felhőmegoldás, amely könnyen "
-"telepíthető egy gépre, vagy akár egy nagyobb fürtre."
+"A CIRCLE Cloud egy teljeskörű nyílt forrású felhőmegoldás, amely könnyen telepíthető egy gépre, vagy akár egy nagyobb fürtre."
#: templates/info/legal.html:23
#, python-format
@@ -4505,10 +4542,8 @@ msgstr ""
#: templates/info/policy.html:22
msgid ""
" \n"
-" Every virtual machine has an expiration date, when this date is "
-"reached\n"
-" the machine will be stopped, if the user doesn't renew the "
-"machine\n"
+" Every virtual machine has an expiration date, when this date is reached\n"
+" the machine will be stopped, if the user doesn't renew the machine\n"
" it will be deleted and all data on it will be lost.\n"
" "
msgstr ""
@@ -4519,41 +4554,32 @@ msgstr ""
msgid ""
"\n"
" Running the the virtual machine safely and \n"
-" updating the operating system is the responsibility of the "
-"user.\n"
+" updating the operating system is the responsibility of the user.\n"
" "
msgstr ""
"\n"
-"A virtuális gépek biztonságos üzemeltetése, a rajtuk futó szoftverek "
-"frissítése a felhasználó felelőssége."
+"A virtuális gépek biztonságos üzemeltetése, a rajtuk futó szoftverek frissítése a felhasználó felelőssége."
#: templates/info/policy.html:41
msgid ""
"\n"
-" You can connect to the running virtual machines the usual way: "
-"for Windows machines\n"
-" this mean RDP (remote desktop), Linux machines can be accessed "
-"either via SSH\n"
+" You can connect to the running virtual machines the usual way: for Windows machines\n"
+" this mean RDP (remote desktop), Linux machines can be accessed either via SSH\n"
" or NoMachine NX (GUI).\n"
" "
msgstr ""
"\n"
-"A gépekhez az adott operációs rendszeren szokásos módon csatlakozhat: Window "
-"alatt RDP-vel (távoli asztali kapcsolat), Linuxot futtató gépekhez SSH-val "
-"vagy grafikusan a NoMachine NX rendszerrel."
+"A gépekhez az adott operációs rendszeren szokásos módon csatlakozhat: Window alatt RDP-vel (távoli asztali kapcsolat), Linuxot futtató gépekhez SSH-val vagy grafikusan a NoMachine NX rendszerrel."
#: templates/info/support.html:14
msgid ""
"\n"
-" CIRCLE Cloud is an open source cloud solution. If you notice any "
-"bugs or\n"
-" you have an idea for a feature please contact the maintainer of the "
-"site.\n"
+" CIRCLE Cloud is an open source cloud solution. If you notice any bugs or\n"
+" you have an idea for a feature please contact the maintainer of the site.\n"
" "
msgstr ""
"\n"
-"A CIRCLE Cloud egy nyílt forrású felhőmegoldás. Amennyiben hibát tapasztal, "
-"vagy fejlesztési javaslata van, keresse meg a szolgáltatás üzemeltetőjét."
+"A CIRCLE Cloud egy nyílt forrású felhőmegoldás. Amennyiben hibát tapasztal, vagy fejlesztési javaslata van, keresse meg a szolgáltatás üzemeltetőjét."
#: templates/registration/login.html:6
msgid "Login"
@@ -4590,8 +4616,7 @@ msgstr "Megerősítés jelszó-visszaállításról"
#: templates/registration/password_reset_confirm.html:15
msgid ""
"\n"
-" Please enter your new password twice so we can verify you typed it in "
-"correctly.\n"
+" Please enter your new password twice so we can verify you typed it in correctly.\n"
" "
msgstr ""
"\n"
@@ -4601,8 +4626,8 @@ msgstr ""
#: templates/registration/password_reset_confirm.html:25
#, python-format
msgid ""
-"This token is expired, please request a new password "
-"reset link again."
+"This token is expired, please request a new password"
+" reset link again."
msgstr ""
"A token lejárt, igényeljen új jelszó-visszaállítást."
@@ -4676,8 +4701,7 @@ msgid ""
"Resize the virtual disk image. Size must be greater value than the actual "
"size."
msgstr ""
-"Virtuális lemezkép átméretezése. Az új méret meg kell haladja "
-"a jelenlegit."
+"Virtuális lemezkép átméretezése. Az új méret meg kell haladja a jelenlegit."
#: vm/operations.py:298
#, python-format
@@ -4725,11 +4749,11 @@ msgstr ""
msgid "virtual machine successfully deployed to node: %(node)s"
msgstr "a virtuális gép sikeresen elindítva a következő csomóponton: %(node)s"
-#: vm/operations.py:388 vm/operations.py:563 vm/operations.py:889
+#: vm/operations.py:388 vm/operations.py:563 vm/operations.py:929
msgid "deploy network"
msgstr "hálózati kapcsolat létrehozása"
-#: vm/operations.py:400 vm/operations.py:581 vm/operations.py:645
+#: vm/operations.py:400 vm/operations.py:581 vm/operations.py:680
msgid "wait operating system loading"
msgstr "várakozás az operációs rendszer betöltésére"
@@ -4812,7 +4836,7 @@ msgstr "ütemezés"
msgid "migrate to %(node)s"
msgstr "migrálás %(node)s csomópontra"
-#: vm/operations.py:553 vm/operations.py:838
+#: vm/operations.py:553 vm/operations.py:878
msgid "shutdown network"
msgstr "hálózati kapcsolat leállítása"
@@ -4824,7 +4848,8 @@ msgstr "újraindítás"
msgid ""
"Warm reboot virtual machine by sending Ctrl+Alt+Del signal to its console."
msgstr ""
-"Virtuális gép újraindítása a konzoljára a Ctrl+Alt+Del kombináció küldésével."
+"Virtuális gép újraindítása a konzoljára a Ctrl+Alt+Del kombináció "
+"küldésével."
#: vm/operations.py:587
msgid "remove interface"
@@ -4844,55 +4869,81 @@ msgid "remove %(vlan)s interface"
msgstr "%(vlan)s interfész törlése"
#: vm/operations.py:611
+msgid "close port"
+msgstr "port bezárása"
+
+#: vm/operations.py:612
+msgid "Close the specified port."
+msgstr "A megadott port bezárása."
+
+#: vm/operations.py:621
+#, python-format
+msgid "close %(proto)s/%(port)d on %(host)s"
+msgstr "%(proto)s/%(port)d bezárása ezen: %(host)s"
+
+#: vm/operations.py:629
+msgid "open port"
+msgstr "port nyitása"
+
+#: vm/operations.py:630
+msgid "Open the specified port."
+msgstr "A megadott port kinyitása."
+
+#: vm/operations.py:639
+#, python-format
+msgid "open %(proto)s/%(port)d on %(host)s"
+msgstr "%(proto)s/%(port)d kinyitása ezen: %(host)s"
+
+#: vm/operations.py:646
msgid "remove disk"
msgstr "lemez eltávolítása"
-#: vm/operations.py:612
+#: vm/operations.py:647
msgid ""
"Remove the specified disk from the virtual machine, and destroy the data."
msgstr "A megadott lemez eltávolítása a virtuális gépből és az adat törlése."
-#: vm/operations.py:622
+#: vm/operations.py:657
msgid "destroy disk"
msgstr "lemez megsemmisítése"
-#: vm/operations.py:628
+#: vm/operations.py:663
#, python-format
msgid "remove disk %(name)s"
msgstr "%(name)s lemez eltávolítása"
-#: vm/operations.py:635 vm/operations.py:1041
+#: vm/operations.py:670 vm/operations.py:1081
msgid "reset"
msgstr "reset"
-#: vm/operations.py:636
+#: vm/operations.py:671
msgid "Cold reboot virtual machine (power cycle)."
msgstr "Virtuális gép hideg újraindítása (hálózati tápellátás megszakítása)."
-#: vm/operations.py:651
+#: vm/operations.py:686
msgid "save as template"
msgstr "mentés sablonként"
-#: vm/operations.py:652
+#: vm/operations.py:687
msgid ""
"Save virtual machine as a template so they can be shared with users and "
"groups. Anyone who has access to a template (and to the networks it uses) "
"will be able to start an instance of it."
msgstr ""
"Virtuális gép mentése sablonként, amelyet meg lehet osztani más "
-"felhasználókkal és csoportokkal. Mindenki, aki hozzáférést kap egy sablonhoz "
-"(és az általa használt hálózatokhoz), képes lesz egy példányát elindítani."
+"felhasználókkal és csoportokkal. Mindenki, aki hozzáférést kap egy sablonhoz"
+" (és az általa használt hálózatokhoz), képes lesz egy példányát elindítani."
-#: vm/operations.py:728
+#: vm/operations.py:763
#, python-format
msgid "saving disk %(name)s"
msgstr "%(name)s lemez mentése"
-#: vm/operations.py:755
+#: vm/operations.py:795
msgid "shutdown"
msgstr "leállítás"
-#: vm/operations.py:756
+#: vm/operations.py:796
msgid ""
"Try to halt virtual machine by a standard ACPI signal, allowing the "
"operating system to keep a consistent state. The operation will fail if the "
@@ -4902,62 +4953,62 @@ msgstr ""
"operációs rendszer számár a szabályos leállást. A művelet meghiúsul, ha a "
"gép nem áll le."
-#: vm/operations.py:775
+#: vm/operations.py:815
msgid ""
"The virtual machine did not switch off in the provided time limit. Most of "
"the time this is caused by incorrect ACPI settings. You can also try to "
"power off the machine from the operating system manually."
msgstr ""
-"A virtuális gép nem állt le a biztosított időkorlát alatt. A legtöbb esetben "
-"ez a nem megfelelő ACPI beállítások miatt van. Megpróbálhatja a gépet az "
+"A virtuális gép nem állt le a biztosított időkorlát alatt. A legtöbb esetben"
+" ez a nem megfelelő ACPI beállítások miatt van. Megpróbálhatja a gépet az "
"operációs rendszerből, kézzel leállítani."
-#: vm/operations.py:787
+#: vm/operations.py:827
msgid "shut off"
msgstr "kikapcsolás"
-#: vm/operations.py:788
+#: vm/operations.py:828
msgid ""
-"Forcibly halt a virtual machine without notifying the operating system. This "
-"operation will even work in cases when shutdown does not, but the operating "
-"system and the file systems are likely to be in an inconsistent state, so "
+"Forcibly halt a virtual machine without notifying the operating system. This"
+" operation will even work in cases when shutdown does not, but the operating"
+" system and the file systems are likely to be in an inconsistent state, so "
"data loss is also possible. The effect of this operation is the same as "
"interrupting the power supply of a physical machine."
msgstr ""
-"Virtuális gép erőltetett leállítása az operációs rendszer értesítése nélkül. "
-"Ez a művelet akkor is működik, ha a normál leállítás nem, de az operációs "
-"rendszer és a fájlrendszer sérülhet, adatvesztés történhet. A művelet hatása "
-"hasonló, mint egy fizikai gép tápellátásának megszüntetése."
+"Virtuális gép erőltetett leállítása az operációs rendszer értesítése nélkül."
+" Ez a művelet akkor is működik, ha a normál leállítás nem, de az operációs "
+"rendszer és a fájlrendszer sérülhet, adatvesztés történhet. A művelet hatása"
+" hasonló, mint egy fizikai gép tápellátásának megszüntetése."
-#: vm/operations.py:811
+#: vm/operations.py:851
msgid "sleep"
msgstr "altatás"
-#: vm/operations.py:812
+#: vm/operations.py:852
msgid ""
-"Suspend virtual machine. This means the machine is stopped and its memory is "
-"saved to disk, so if the machine is waked up, all the applications will keep "
-"running. Most of the applications will be able to continue even after a long "
-"suspension, but those which need a continous network connection may fail "
-"when resumed. In the meantime, the machine will only use storage resources, "
-"and keep network resources allocated."
+"Suspend virtual machine. This means the machine is stopped and its memory is"
+" saved to disk, so if the machine is waked up, all the applications will "
+"keep running. Most of the applications will be able to continue even after a"
+" long suspension, but those which need a continous network connection may "
+"fail when resumed. In the meantime, the machine will only use storage "
+"resources, and keep network resources allocated."
msgstr ""
"Virtuális gép felfüggesztése. A virtuális gép megállításra, memóriája "
"lemezre mentésre kerül. Így a gép ébresztése után minden futó alkalmazás "
"folytatódik. A legtöbb alkalmazás elviseli akár a hosszabb idejű "
"felfüggesztést, azonban a folyamatos hálózati kapcsolatot igénylő programok "
-"megállhatnak visszaállítás után. A felfüggesztés ideje alatt a virtuális gép "
-"csak tárterületet és hálózati erőforrásokat foglal."
+"megállhatnak visszaállítás után. A felfüggesztés ideje alatt a virtuális gép"
+" csak tárterületet és hálózati erőforrásokat foglal."
-#: vm/operations.py:846
+#: vm/operations.py:886
msgid "suspend virtual machine"
msgstr "virtuális gép felfüggesztése"
-#: vm/operations.py:860
+#: vm/operations.py:900
msgid "wake up"
msgstr "virtuális gép ébresztése"
-#: vm/operations.py:861
+#: vm/operations.py:901
msgid ""
"Wake up sleeping (suspended) virtual machine. This will load the saved "
"memory of the system and start the virtual machine from this state."
@@ -4965,25 +5016,25 @@ msgstr ""
"Alvó (felfüggesztett) gép ébresztése: az elmentett memóriatartalom "
"visszatöltése és a virtuális gép indítása ebből a mentett állapotból."
-#: vm/operations.py:900
+#: vm/operations.py:940
msgid "resume virtual machine"
msgstr "virtuális gép ébresztése"
-#: vm/operations.py:914
+#: vm/operations.py:954
msgid "renew"
msgstr "megújítás"
-#: vm/operations.py:915
+#: vm/operations.py:955
msgid ""
"Virtual machines are suspended and destroyed after they expire. This "
"operation renews expiration times according to the lease type. If the "
"machine is close to the expiration, its owner will be notified."
msgstr ""
-"A virtuális gépek lejáratuk után felfüggesztésre, majd törlésre kerülnek. Ez "
-"a művelet megújítja a bérletet a kiválasztott típusnak megfelelően. Ha egy "
+"A virtuális gépek lejáratuk után felfüggesztésre, majd törlésre kerülnek. Ez"
+" a művelet megújítja a bérletet a kiválasztott típusnak megfelelően. Ha egy "
"gép közeledik a lejárathoz, a tulajdonost értesítjük."
-#: vm/operations.py:928
+#: vm/operations.py:968
msgid ""
"Renewing the machine with the selected lease would result in its suspension "
"time get earlier than before."
@@ -4991,25 +5042,25 @@ msgstr ""
"A gép megújítása a kiválasztott bérleti mód mellett a felfüggesztési időt "
"korábbra állította volna, mint a jelenlegi érték."
-#: vm/operations.py:933
+#: vm/operations.py:973
msgid ""
-"Renewing the machine with the selected lease would result in its delete time "
-"get earlier than before."
+"Renewing the machine with the selected lease would result in its delete time"
+" get earlier than before."
msgstr ""
"A gép megújítása a kiválasztott bérleti mód mellett a törlési időt korábbra "
"állította volna, mint a jelenlegi érték."
-#: vm/operations.py:941
+#: vm/operations.py:981
#, python-format
msgid "Renewed to suspend at %(suspend)s and destroy at %(delete)s."
msgstr ""
"Megújítás után felfüggesztés ideje: %(suspend)s, a törlésé: %(delete)s."
-#: vm/operations.py:948
+#: vm/operations.py:988
msgid "emergency state change"
msgstr "vész-állapotváltás"
-#: vm/operations.py:949
+#: vm/operations.py:989
msgid ""
"Change the virtual machine state to NOSTATE. This should only be used if "
"manual intervention was needed in the virtualization layer, and the machine "
@@ -5020,101 +5071,102 @@ msgstr ""
"rétegben, és úgy szeretné a gépet újból elindítani, hogy ne vesszenek el "
"lemezei vagy hálózati erőforrásai."
-#: vm/operations.py:962
+#: vm/operations.py:1002
msgid "Activity is forcibly interrupted."
msgstr "A tevékenység erőszakos megszakításra került."
-#: vm/operations.py:977
+#: vm/operations.py:1017
msgid "redeploy"
msgstr "újbóli létrehozás"
-#: vm/operations.py:978
+#: vm/operations.py:1018
msgid ""
"Change the virtual machine state to NOSTATE and redeploy the VM. This "
"operation allows starting machines formerly running on a failed node."
msgstr ""
"A virtuális gép állapotának átállítása NOSTATE-re, majd a VM újbóli "
-"létrehozása. "
-"Ez a művelet lehetővé teszi olyan gépek elindítását, amelyek korábban egy "
-"meghibásodott csomóponton futnak."
+"létrehozása. Ez a művelet lehetővé teszi olyan gépek elindítását, amelyek "
+"korábban egy meghibásodott csomóponton futnak."
-#: vm/operations.py:1014
+#: vm/operations.py:1054
msgid "You cannot call this operation on an offline node."
msgstr "Nem hívható ez a művelet elérhetetlen csomópontra."
-#: vm/operations.py:1042
+#: vm/operations.py:1082
msgid "Disable missing node and redeploy all instances on other ones."
msgstr "Hiányzó csomópont letiltása és az összes példány elindítása a többin."
-#: vm/operations.py:1052
+#: vm/operations.py:1092
msgid "You cannot reset a disabled or online node."
msgstr "Tiltott vagy elérhető csomópont resetelése nem lehetséges."
-#: vm/operations.py:1060 vm/operations.py:1080
+#: vm/operations.py:1100 vm/operations.py:1120
#, python-format
msgid "migrate %(instance)s (%(pk)s)"
msgstr "%(instance)s (%(pk)s) migrálása"
-#: vm/operations.py:1069
+#: vm/operations.py:1109
msgid "flush"
msgstr "ürítés"
-#: vm/operations.py:1070
+#: vm/operations.py:1110
msgid "Passivate node and move all instances to other ones."
msgstr ""
"A csomópont passzívra állítása és az összes példány másikakra mozgatása."
-#: vm/operations.py:1089
+#: vm/operations.py:1129
msgid "activate"
msgstr "aktiválás"
-#: vm/operations.py:1090
+#: vm/operations.py:1130
msgid ""
-"Make node active, i.e. scheduler is allowed to deploy virtual machines to it."
-msgstr "Csomópont aktívvá tétele: az ütemező indíthat virtuális gépeket rajta."
+"Make node active, i.e. scheduler is allowed to deploy virtual machines to "
+"it."
+msgstr ""
+"Csomópont aktívvá tétele: az ütemező indíthat virtuális gépeket rajta."
-#: vm/operations.py:1098
+#: vm/operations.py:1138
msgid "You cannot activate an active node."
msgstr "Aktív csomópont aktiválása nem lehetséges."
-#: vm/operations.py:1109
+#: vm/operations.py:1150
msgid "passivate"
msgstr "passziválás"
-#: vm/operations.py:1110
+#: vm/operations.py:1151
msgid ""
"Make node passive, i.e. scheduler is denied to deploy virtual machines to "
"it, but remaining instances and the ones manually migrated will continue "
"running."
msgstr ""
-"Csomópont passzívvá tétele: az ütemező nem indíthat rajta virtuális gépeket, "
-"azonban a megmaradt példányok és a kézzel idemigráltak tovább működnek."
+"Csomópont passzívvá tétele: az ütemező nem indíthat rajta virtuális gépeket,"
+" azonban a megmaradt példányok és a kézzel idemigráltak tovább működnek."
-#: vm/operations.py:1118
+#: vm/operations.py:1159
msgid "You cannot passivate a passive node."
msgstr "Passzív csomópont passziválása nem lehetséges."
-#: vm/operations.py:1130
+#: vm/operations.py:1172
msgid "disable"
msgstr "tiltás"
-#: vm/operations.py:1131
+#: vm/operations.py:1173
msgid "Disable node."
msgstr "Csomópont tiltása."
-#: vm/operations.py:1138
+#: vm/operations.py:1180
msgid "You cannot disable a disabled node."
msgstr "Tiltott csomópont tiltása nem lehetséges."
-#: vm/operations.py:1141
+#: vm/operations.py:1183
msgid "You cannot disable a node which is hosting instances."
msgstr "Nem tiltható le olyan csomópont, amelyen még futnak példányok."
-#: vm/operations.py:1154
+#: vm/operations.py:1196
msgid "screenshot"
msgstr "képernyőkép"
-#: vm/operations.py:1155
+#: vm/operations.py:1197
msgid ""
"Get a screenshot about the virtual machine's console. A key will be pressed "
"on the keyboard to stop screensaver."
@@ -5122,29 +5174,33 @@ msgstr ""
"Képernyőkép készítése a virtuális gép konzoljáról. Egy billentyűnyomást "
"követően készül a kép a képernyővédő miatt."
-#: vm/operations.py:1167
+#: vm/operations.py:1209
msgid "recover"
msgstr "visszaállítás"
-#: vm/operations.py:1168
+#: vm/operations.py:1210
msgid ""
-"Try to recover virtual machine disks from destroyed state. Network resources "
-"(allocations) are already lost, so you will have to manually add interfaces "
-"afterwards."
+"Try to recover virtual machine disks from destroyed state. Network resources"
+" (allocations) are already lost, so you will have to manually add interfaces"
+" afterwards."
msgstr ""
"Megsemmisített virtuális gép lemezeinek visszaállítását kísérli meg. A "
"hálózati erőforrások foglalásai már végleg elvesztek, így az interfészeket "
"kézzel kell a visszaállítás után pótolni."
-#: vm/operations.py:1194
+#: vm/operations.py:1227
+msgid "recover instance"
+msgstr "példány helyreállítása"
+
+#: vm/operations.py:1250
msgid "resources change"
msgstr "erőforrások módosítása"
-#: vm/operations.py:1195
+#: vm/operations.py:1251
msgid "Change resources of a stopped virtual machine."
msgstr "Leállított virtuális gép erőforrásainak változtatása."
-#: vm/operations.py:1212
+#: vm/operations.py:1268
#, python-format
msgid ""
"Priority: %(priority)s, Num cores: %(num_cores)s, Ram size: %(ram_size)s"
@@ -5152,66 +5208,66 @@ msgstr ""
"Prioritás: %(priority)s, magok száma: %(num_cores)s, memória mérete: "
"%(ram_size)s"
-#: vm/operations.py:1221
+#: vm/operations.py:1277
msgid "password reset"
msgstr "jelszó visszaállítása"
-#: vm/operations.py:1222
+#: vm/operations.py:1278
msgid ""
-"Generate and set a new login password on the virtual machine. This operation "
-"requires the agent running. Resetting the password is not warranted to allow "
-"you logging in as other settings are possible to prevent it."
+"Generate and set a new login password on the virtual machine. This operation"
+" requires the agent running. Resetting the password is not warranted to "
+"allow you logging in as other settings are possible to prevent it."
msgstr ""
"Egy új belépési jelszó generálása és beállítása a virtuális gépen. Ez a "
"művelet megköveteli az ügynök futását. A jelszó átállítása nem garantálja a "
"sikeres belépést, mivel más beállítások is megakadályozhatják ezt."
-#: vm/operations.py:1246
+#: vm/operations.py:1302
msgid "agent"
msgstr "ügynök"
-#: vm/operations.py:1287
+#: vm/operations.py:1343
msgid "starting"
msgstr "indítás"
-#: vm/operations.py:1305
+#: vm/operations.py:1361
msgid "wait agent restarting"
msgstr "várakozás az ügynök újraindulására"
-#: vm/operations.py:1322
+#: vm/operations.py:1378
msgid "cleanup"
msgstr "takarítás"
-#: vm/operations.py:1328
+#: vm/operations.py:1384
msgid "set time"
msgstr "óra beállítása"
-#: vm/operations.py:1339
+#: vm/operations.py:1395
msgid "set hostname"
msgstr "gépnév beállítása"
-#: vm/operations.py:1350
+#: vm/operations.py:1406
msgid "restart networking"
msgstr "hálózat újratöltése"
-#: vm/operations.py:1356
+#: vm/operations.py:1412
msgid "change ip"
msgstr "IP cím beállítása"
-#: vm/operations.py:1371
+#: vm/operations.py:1427
msgid "update agent"
msgstr "ügynök frissítése"
-#: vm/operations.py:1377
+#: vm/operations.py:1433
#, python-format
msgid "update agent to %(version)s"
msgstr "ügynökfrissítés erre: %(version)s"
-#: vm/operations.py:1460
+#: vm/operations.py:1516
msgid "mount store"
msgstr "tárhely csatolása"
-#: vm/operations.py:1462
+#: vm/operations.py:1518
msgid ""
"This operation attaches your personal file store. Other users who have "
"access to this machine can see these files as well."
@@ -5219,28 +5275,28 @@ msgstr ""
"Ez a művelet csatolja az ön személyes tárhelyét. A gép más felhasználói is "
"elérhetik fájljait."
-#: vm/operations.py:1496
+#: vm/operations.py:1552
msgid "attach disk"
msgstr "lemez csatolása"
-#: vm/operations.py:1507
+#: vm/operations.py:1563
msgid "Resource was not found."
msgstr "Nem található az erőforrás."
-#: vm/operations.py:1508
+#: vm/operations.py:1564
#, python-format
msgid "Resource was not found. %(exception)s"
msgstr "Nem található az erőforrás. %(exception)s"
-#: vm/operations.py:1517
+#: vm/operations.py:1573
msgid "detach disk"
msgstr "lemez leválasztása"
-#: vm/operations.py:1532
+#: vm/operations.py:1588
msgid "attach network"
msgstr "hálózat csatolása"
-#: vm/operations.py:1539
+#: vm/operations.py:1595
msgid "detach network"
msgstr "hálózat lecsatolása"
@@ -5277,7 +5333,8 @@ msgstr "csomópont"
#: vm/models/activity.py:267
msgid "Manager is restarted, activity is cleaned up. You can try again now."
msgstr ""
-"A menedzser újraindítása miatt a tevékenység lezárásra került. Próbálja újra."
+"A menedzser újraindítása miatt a tevékenység lezárásra került. Próbálja "
+"újra."
#: vm/models/common.py:39
msgid "number of cores"
@@ -5355,8 +5412,8 @@ msgstr "rendszerbetöltő menüje"
#: vm/models/instance.py:102
msgid "Show boot device selection menu on boot."
msgstr ""
-"A rendszerbetöltés eszközének kiválasztását lehetővé tevő menü megjelenítése "
-"indításkor."
+"A rendszerbetöltés eszközének kiválasztását lehetővé tevő menü megjelenítése"
+" indításkor."
#: vm/models/instance.py:103
msgid "Preferred expiration periods."
@@ -5585,13 +5642,11 @@ msgstr "VM állapota erre változott: %(state)s (ezen: %(node)s)"
#, python-format
msgid ""
"Your instance %(instance)s is going to expire. It "
-"will be suspended at %(suspend)s and destroyed at %(delete)s. Please, either "
-"renew or destroy it now."
+"will be suspended at %(suspend)s and destroyed at %(delete)s. Please, either"
+" renew or destroy it now."
msgstr ""
"%(instance)s gépe hamarosan lejár:\n"
-"%(suspend)s időpontban felfüggesztésre, %(delete)s időpontban törlésre "
-"kerül. Kérjük, újítsa meg vagy törölje most."
+"%(suspend)s időpontban felfüggesztésre, %(delete)s időpontban törlésre kerül. Kérjük, újítsa meg vagy törölje most."
#: vm/models/instance.py:658
#, python-format
@@ -5656,8 +5711,8 @@ msgstr "Az interfész létrehozásra került."
#: vm/models/network.py:136
#, python-format
msgid ""
-"Interface successfully created. New addresses: ipv4: %(ip4)s, ipv6: %(ip6)s, "
-"vlan: %(vlan)s."
+"Interface successfully created. New addresses: ipv4: %(ip4)s, ipv6: %(ip6)s,"
+" vlan: %(vlan)s."
msgstr ""
"Az interfész létrehozásra került.Az új címek: %(ip4)s (ipv4), %(ip6)s "
"(ipv6). Vlan: %(vlan)s."
@@ -5706,23 +5761,27 @@ msgstr "túlfoglalási arány"
msgid "The ratio of total memory with to without overcommit."
msgstr "Az összes memória és a túlfoglalható memória aránya."
-#: vm/models/node.py:138
+#: vm/models/node.py:92
+msgid "Can view Node box and statistics."
+msgstr "Láthatja a csomópontok dobozt és a statisztikát."
+
+#: vm/models/node.py:140
msgid "missing"
msgstr "eltűnt"
-#: vm/models/node.py:139
+#: vm/models/node.py:141
msgid "offline"
msgstr "nem elérhető"
-#: vm/models/node.py:140
+#: vm/models/node.py:142
msgid "disabled"
msgstr "tiltva"
-#: vm/models/node.py:141
+#: vm/models/node.py:143
msgid "passive"
msgstr "passzív"
-#: vm/models/node.py:142
+#: vm/models/node.py:144
msgid "active"
msgstr "aktív"
@@ -5738,8 +5797,8 @@ msgstr "%(instance)s megsemmisítve"
#: vm/tasks/local_periodic_tasks.py:53
#, python-format
msgid ""
-"Your instance %(instance)s has been destroyed due to "
-"expiration."
+"Your instance %(instance)s has been destroyed due to"
+" expiration."
msgstr ""
"%(instance)s gépe megsemmisítésre került, mivel "
"lejárt."
@@ -5752,16 +5811,34 @@ msgstr "%(instance)s felfüggesztve"
#: vm/tasks/local_periodic_tasks.py:67
#, python-format
msgid ""
-"Your instance %(instance)s has been suspended due to "
-"expiration. You can resume or destroy it."
+"Your instance %(instance)s has been suspended due to"
+" expiration. You can resume or destroy it."
msgstr ""
"%(instance)s gépe felfüggesztésre került, mivel "
"lejárt. Felébresztheti vagy megsemmisítheti."
-#: vm/tests/test_models.py:218
+#: vm/tests/test_models.py:219
msgid "x"
msgstr "x"
+#~ msgid "There is a problem with your input."
+#~ msgstr "A megadott érték nem megfelelő."
+
+#~ msgid "Unknown error."
+#~ msgstr "Ismeretlen hiba."
+
+#~ msgid "Port delete confirmation"
+#~ msgstr "Porteltávolítás megerősítése"
+
+#~ msgid "Are you sure you want to close %(port)d/%(proto)s on %(vm)s?"
+#~ msgstr "Biztosan bezárja a(z) %(port)d/%(proto)s portot a következőn: %(vm)s?"
+
+#~ msgid "Port successfully removed."
+#~ msgstr "A port eltávolításra került."
+
+#~ msgid "Vendor: %(vendor)s"
+#~ msgstr "Gyártó: %(vendor)s"
+
#~ msgid "Visit"
#~ msgstr "Megtekintés"
@@ -5846,8 +5923,7 @@ msgstr "x"
#~ "Virtuális gép mentése sablonként.\n"
#~ "\n"
#~ " A sablonokat megoszthatja csoportokkal vagy felhasználókkal.\n"
-#~ " A felhasználók virtuális gépeket példányosíthatnak a "
-#~ "sablonokból.\n"
+#~ " A felhasználók virtuális gépeket példányosíthatnak a sablonokból.\n"
#~ " "
#~ msgid "Shutdown virtual machine with ACPI signal."
@@ -5945,13 +6021,11 @@ msgstr "x"
#~ msgid ""
#~ "\n"
-#~ "Please, either renew or destroy\n"
+#~ "Please, either renew or destroy\n"
#~ "it now.\n"
#~ msgstr ""
#~ "\n"
-#~ "Újítsa meg vagy törölje"
-#~ "a>\n"
+#~ "Újítsa meg vagy törölje\n"
#~ "most.\n"
#~ msgid "Add new network interface!"
@@ -5963,9 +6037,6 @@ msgstr "x"
#~ msgid "Disk this activity works on."
#~ msgstr "A lemez, amelyre a művelet vonatkozik."
-#~ msgid "Add the specified disk to the VM."
-#~ msgstr "A megadott lemez hozzáadása a VM-hez."
-
#~ msgid "None"
#~ msgstr "Nincs"
diff --git a/circle/locale/hu/LC_MESSAGES/djangojs.po b/circle/locale/hu/LC_MESSAGES/djangojs.po
index 8add889..572b4d5 100644
--- a/circle/locale/hu/LC_MESSAGES/djangojs.po
+++ b/circle/locale/hu/LC_MESSAGES/djangojs.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-10-20 12:09+0200\n"
+"POT-Creation-Date: 2014-11-14 13:43+0100\n"
"PO-Revision-Date: 2014-10-20 12:21+0200\n"
"Last-Translator: Mate Ory \n"
"Language-Team: Hungarian \n"
@@ -17,7 +17,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.5\n"
-#: dashboard/static/dashboard/dashboard.js:68
+#: dashboard/static/dashboard/dashboard.js:83
#: static_collected/all.047675ebf594.js:3443
#: static_collected/all.0aecd87e873a.js:3443
#: static_collected/all.0db607331718.js:3443
@@ -34,13 +34,13 @@ msgstr ""
#: static_collected/dashboard/dashboard.be8725cd91bf.js:68
#: static_collected/dashboard/dashboard.e740d80401b2.js:68
#: static_collected/dashboard/dashboard.fe0a2f126346.js:68
-#: static_collected/dashboard/dashboard.js:68
+#: static_collected/dashboard/dashboard.js:83
msgid "Select an option to proceed!"
msgstr "Válasszon a folytatáshoz."
-#: dashboard/static/dashboard/dashboard.js:259
-#: dashboard/static/dashboard/dashboard.js:307
-#: dashboard/static/dashboard/dashboard.js:317
+#: dashboard/static/dashboard/dashboard.js:274
+#: dashboard/static/dashboard/dashboard.js:322
+#: dashboard/static/dashboard/dashboard.js:332
#: static_collected/all.047675ebf594.js:3633
#: static_collected/all.047675ebf594.js:3681
#: static_collected/all.047675ebf594.js:3691
@@ -88,9 +88,9 @@ msgstr "Válasszon a folytatáshoz."
#: static_collected/dashboard/dashboard.fe0a2f126346.js:258
#: static_collected/dashboard/dashboard.fe0a2f126346.js:306
#: static_collected/dashboard/dashboard.fe0a2f126346.js:316
-#: static_collected/dashboard/dashboard.js:259
-#: static_collected/dashboard/dashboard.js:307
-#: static_collected/dashboard/dashboard.js:317
+#: static_collected/dashboard/dashboard.js:274
+#: static_collected/dashboard/dashboard.js:322
+#: static_collected/dashboard/dashboard.js:332
msgid "No result"
msgstr "Nincs eredmény"
@@ -129,10 +129,12 @@ msgid "Unknown error."
msgstr "Ismeretlen hiba."
#: dashboard/static/dashboard/template-list.js:103
+#: static_collected/dashboard/template-list.js:103
msgid "Only the owners can delete the selected object."
msgstr "Csak a tulajdonos törölheti a kiválasztott elemet."
#: dashboard/static/dashboard/template-list.js:105
+#: static_collected/dashboard/template-list.js:105
msgid "An error occurred. ("
msgstr "Hiba történt. ("
@@ -206,11 +208,12 @@ msgstr "Jelszó megjelenítése"
#: static_collected/vm-detail.js:6391
#: static_collected/dashboard/vm-tour.1562cc89a659.js:22
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:22
-#: static_collected/dashboard/vm-tour.js:22
+#: static_collected/dashboard/vm-tour.js:6
msgid "Next"
msgstr "Tovább"
#: dashboard/static/dashboard/vm-tour.js:7
+#: static_collected/dashboard/vm-tour.js:7
msgid "Previous"
msgstr "Vissza"
@@ -226,15 +229,17 @@ msgstr "Vissza"
#: static_collected/vm-detail.js:6395
#: static_collected/dashboard/vm-tour.1562cc89a659.js:26
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:26
-#: static_collected/dashboard/vm-tour.js:26
+#: static_collected/dashboard/vm-tour.js:8
msgid "End tour"
msgstr "Befejezés"
#: dashboard/static/dashboard/vm-tour.js:9
+#: static_collected/dashboard/vm-tour.js:9
msgid "Done"
msgstr "Kész"
#: dashboard/static/dashboard/vm-tour.js:56
+#: static_collected/dashboard/vm-tour.js:56
msgid ""
"Welcome to the template tutorial. In this quick tour, we are going to show "
"you how to do the steps described above."
@@ -254,7 +259,7 @@ msgstr ""
#: static_collected/vm-detail.js:6404
#: static_collected/dashboard/vm-tour.1562cc89a659.js:35
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:35
-#: static_collected/dashboard/vm-tour.js:35
+#: static_collected/dashboard/vm-tour.js:57
msgid ""
"For the next tour step press the \"Next\" button or the right arrow (or "
"\"Back\" button/left arrow for the previous step)."
@@ -263,6 +268,7 @@ msgstr ""
"nyílbillentyűket."
#: dashboard/static/dashboard/vm-tour.js:61
+#: static_collected/dashboard/vm-tour.js:61
msgid ""
"In this tab you can extend the expiration date of your virtual machine, add "
"tags and modify the name and description."
@@ -271,24 +277,26 @@ msgstr ""
"vagy módosíthatja a nevét, leírását."
#: dashboard/static/dashboard/vm-tour.js:65
+#: static_collected/dashboard/vm-tour.js:65
msgid ""
"Please add a meaningful description to the virtual machine. Changing the "
"name is also recommended, however you can choose a new name when saving the "
"template."
msgstr ""
-"Kérjük, adjon meg egy informatív leírást. A név megváltoztatása is "
-"ajánlott, azonban a mentéskor is van a sablon nevének "
-"megválasztására."
+"Kérjük, adjon meg egy informatív leírást. A név megváltoztatása is ajánlott, "
+"azonban a mentéskor is van a sablon nevének megválasztására."
#: dashboard/static/dashboard/vm-tour.js:69
+#: static_collected/dashboard/vm-tour.js:69
msgid ""
"You can change the lease to extend the expiration date. This will be the "
"lease of the new template."
msgstr ""
-"Megváltoztathatja a bérleti módot is a lejárat bővítéséhez. Az gép "
-"bérleti módját örökli majd a sablon is."
+"Megváltoztathatja a bérleti módot is a lejárat bővítéséhez. Az gép bérleti "
+"módját örökli majd a sablon is."
#: dashboard/static/dashboard/vm-tour.js:73
+#: static_collected/dashboard/vm-tour.js:73
msgid ""
"On the resources tab you can edit the CPU/RAM options and add/remove disks "
"if you have required permissions."
@@ -308,7 +316,7 @@ msgstr ""
#: static_collected/vm-detail.js:6438
#: static_collected/dashboard/vm-tour.1562cc89a659.js:69
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:69
-#: static_collected/dashboard/vm-tour.js:69
+#: static_collected/dashboard/vm-tour.js:81
msgid "CPU priority"
msgstr "CPU prioritás"
@@ -324,7 +332,7 @@ msgstr "CPU prioritás"
#: static_collected/vm-detail.js:6438
#: static_collected/dashboard/vm-tour.1562cc89a659.js:69
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:69
-#: static_collected/dashboard/vm-tour.js:69
+#: static_collected/dashboard/vm-tour.js:82
msgid "higher is better"
msgstr "a nagyobb érték a jobb"
@@ -340,7 +348,7 @@ msgstr "a nagyobb érték a jobb"
#: static_collected/vm-detail.js:6439
#: static_collected/dashboard/vm-tour.1562cc89a659.js:70
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:70
-#: static_collected/dashboard/vm-tour.js:70
+#: static_collected/dashboard/vm-tour.js:83
msgid "CPU count"
msgstr "CPU-k száma"
@@ -356,7 +364,7 @@ msgstr "CPU-k száma"
#: static_collected/vm-detail.js:6439
#: static_collected/dashboard/vm-tour.1562cc89a659.js:70
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:70
-#: static_collected/dashboard/vm-tour.js:70
+#: static_collected/dashboard/vm-tour.js:84
msgid "number of CPU cores."
msgstr "A CPU-magok száma."
@@ -372,7 +380,7 @@ msgstr "A CPU-magok száma."
#: static_collected/vm-detail.js:6440
#: static_collected/dashboard/vm-tour.1562cc89a659.js:71
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:71
-#: static_collected/dashboard/vm-tour.js:71
+#: static_collected/dashboard/vm-tour.js:85
msgid "RAM amount"
msgstr "RAM mennyiség"
@@ -388,7 +396,7 @@ msgstr "RAM mennyiség"
#: static_collected/vm-detail.js:6440
#: static_collected/dashboard/vm-tour.1562cc89a659.js:71
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:71
-#: static_collected/dashboard/vm-tour.js:71
+#: static_collected/dashboard/vm-tour.js:86
msgid "amount of RAM."
msgstr "a memória mennyisége."
@@ -404,7 +412,7 @@ msgstr "a memória mennyisége."
#: static_collected/vm-detail.js:6451
#: static_collected/dashboard/vm-tour.1562cc89a659.js:82
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:82
-#: static_collected/dashboard/vm-tour.js:82
+#: static_collected/dashboard/vm-tour.js:96
msgid ""
"You can add empty disks, download new ones and remove existing ones here."
msgstr ""
@@ -423,7 +431,7 @@ msgstr ""
#: static_collected/vm-detail.js:6462
#: static_collected/dashboard/vm-tour.1562cc89a659.js:93
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:93
-#: static_collected/dashboard/vm-tour.js:93
+#: static_collected/dashboard/vm-tour.js:105
msgid "You can add new network interfaces or remove existing ones here."
msgstr "Hozzáadhat új hálózati interfészeket, vagy törölheti a meglévőket."
@@ -439,17 +447,18 @@ msgstr "Hozzáadhat új hálózati interfészeket, vagy törölheti a meglévők
#: static_collected/vm-detail.js:6474
#: static_collected/dashboard/vm-tour.1562cc89a659.js:105
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:105
-#: static_collected/dashboard/vm-tour.js:105
+#: static_collected/dashboard/vm-tour.js:109
msgid "Deploy the virtual machine."
msgstr "A virtuális gép elindítása."
#: dashboard/static/dashboard/vm-tour.js:113
+#: static_collected/dashboard/vm-tour.js:113
msgid ""
"Use the CIRCLE client or the connection string to connect to the virtual "
"machine."
msgstr ""
-"Használja a CIRCLE klienst vagy a kapcsolódási adatokat a "
-"virtuális géphez való csatlakozáshoz."
+"Használja a CIRCLE klienst vagy a kapcsolódási adatokat a virtuális géphez "
+"való csatlakozáshoz."
#: dashboard/static/dashboard/vm-tour.js:117
#: static_collected/vm-detail.09737c69abc3.js:5954
@@ -463,7 +472,7 @@ msgstr ""
#: static_collected/vm-detail.js:6490
#: static_collected/dashboard/vm-tour.1562cc89a659.js:121
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:121
-#: static_collected/dashboard/vm-tour.js:121
+#: static_collected/dashboard/vm-tour.js:117
msgid ""
"After you have connected to the virtual machine do your modifications then "
"log off."
@@ -483,7 +492,7 @@ msgstr ""
#: static_collected/vm-detail.js:6498
#: static_collected/dashboard/vm-tour.1562cc89a659.js:129
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:129
-#: static_collected/dashboard/vm-tour.js:129
+#: static_collected/dashboard/vm-tour.js:121
msgid ""
"Press the \"Save as template\" button and wait until the activity finishes."
msgstr ""
@@ -491,12 +500,11 @@ msgstr ""
"elkészül."
#: dashboard/static/dashboard/vm-tour.js:125
+#: static_collected/dashboard/vm-tour.js:125
msgid ""
"This is the last message, if something is not clear you can do the the tour "
"again."
-msgstr ""
-"A túra véget ért. Ha valami nem érthető, újrakezdheti az "
-"útmutatót."
+msgstr "A túra véget ért. Ha valami nem érthető, újrakezdheti az útmutatót."
#: network/static/js/host.js:10 static_collected/all.047675ebf594.js:5239
#: static_collected/all.0aecd87e873a.js:5309
@@ -617,7 +625,6 @@ msgstr "Biztosan törli ezt az eszközt?"
#: static_collected/vm-detail.js:6389
#: static_collected/dashboard/vm-tour.1562cc89a659.js:20
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:20
-#: static_collected/dashboard/vm-tour.js:20
msgid "Prev"
msgstr "Vissza"
@@ -632,7 +639,6 @@ msgstr "Vissza"
#: static_collected/vm-detail.js:6402
#: static_collected/dashboard/vm-tour.1562cc89a659.js:33
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:33
-#: static_collected/dashboard/vm-tour.js:33
msgid "Template Tutorial Tour"
msgstr "Sablon-kalauz"
@@ -647,7 +653,6 @@ msgstr "Sablon-kalauz"
#: static_collected/vm-detail.js:6403
#: static_collected/dashboard/vm-tour.1562cc89a659.js:34
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:34
-#: static_collected/dashboard/vm-tour.js:34
msgid ""
"Welcome to the template tutorial. In this quick tour, we gonna show you how "
"to do the steps described above."
@@ -665,7 +670,6 @@ msgstr ""
#: static_collected/vm-detail.js:6405
#: static_collected/dashboard/vm-tour.1562cc89a659.js:36
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:36
-#: static_collected/dashboard/vm-tour.js:36
msgid ""
"During the tour please don't try the functions because it may lead to "
"graphical glitches, however "
@@ -682,7 +686,6 @@ msgstr "A túra során még ne próbálja ki a bemutatott funkciókat."
#: static_collected/vm-detail.js:6414
#: static_collected/dashboard/vm-tour.1562cc89a659.js:45
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:45
-#: static_collected/dashboard/vm-tour.js:45
msgid "Home tab"
msgstr "Kezdőoldal"
@@ -697,7 +700,6 @@ msgstr "Kezdőoldal"
#: static_collected/vm-detail.js:6415
#: static_collected/dashboard/vm-tour.1562cc89a659.js:46
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:46
-#: static_collected/dashboard/vm-tour.js:46
msgid ""
"In this tab you can tag your virtual machine and modify the name and "
"description."
@@ -716,7 +718,6 @@ msgstr ""
#: static_collected/vm-detail.js:6424
#: static_collected/dashboard/vm-tour.1562cc89a659.js:55
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:55
-#: static_collected/dashboard/vm-tour.js:55
msgid "Resources tab"
msgstr "Erőforrások lap"
@@ -731,7 +732,6 @@ msgstr "Erőforrások lap"
#: static_collected/vm-detail.js:6427
#: static_collected/dashboard/vm-tour.1562cc89a659.js:58
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:58
-#: static_collected/dashboard/vm-tour.js:58
msgid ""
"On the resources tab you can edit the CPU/RAM options and add/remove disks!"
msgstr ""
@@ -749,7 +749,6 @@ msgstr ""
#: static_collected/vm-detail.js:6437
#: static_collected/dashboard/vm-tour.1562cc89a659.js:68
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:68
-#: static_collected/dashboard/vm-tour.js:68
msgid "Resources"
msgstr "Erőforrások"
@@ -764,7 +763,6 @@ msgstr "Erőforrások"
#: static_collected/vm-detail.js:6450
#: static_collected/dashboard/vm-tour.1562cc89a659.js:81
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:81
-#: static_collected/dashboard/vm-tour.js:81
msgid "Disks"
msgstr "Lemezek"
@@ -779,7 +777,6 @@ msgstr "Lemezek"
#: static_collected/vm-detail.js:6461
#: static_collected/dashboard/vm-tour.1562cc89a659.js:92
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:92
-#: static_collected/dashboard/vm-tour.js:92
msgid "Network tab"
msgstr "Hálózat lap"
@@ -794,7 +791,6 @@ msgstr "Hálózat lap"
#: static_collected/vm-detail.js:6471
#: static_collected/dashboard/vm-tour.1562cc89a659.js:102
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:102
-#: static_collected/dashboard/vm-tour.js:102
msgid "Deploy"
msgstr "Indítás"
@@ -809,7 +805,6 @@ msgstr "Indítás"
#: static_collected/vm-detail.js:6479
#: static_collected/dashboard/vm-tour.1562cc89a659.js:110
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:110
-#: static_collected/dashboard/vm-tour.js:110
msgid "Connect"
msgstr "Csatlakozás"
@@ -824,7 +819,6 @@ msgstr "Csatlakozás"
#: static_collected/vm-detail.js:6482
#: static_collected/dashboard/vm-tour.1562cc89a659.js:113
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:113
-#: static_collected/dashboard/vm-tour.js:113
msgid "Use the connection string or connect with your choice of client!"
msgstr "Használja a megadott parancsot, vagy kedvenc kliensét."
@@ -839,7 +833,6 @@ msgstr "Használja a megadott parancsot, vagy kedvenc kliensét."
#: static_collected/vm-detail.js:6489
#: static_collected/dashboard/vm-tour.1562cc89a659.js:120
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:120
-#: static_collected/dashboard/vm-tour.js:120
msgid "Customize the virtual machine"
msgstr "Szabja testre a gépet"
@@ -854,7 +847,6 @@ msgstr "Szabja testre a gépet"
#: static_collected/vm-detail.js:6495
#: static_collected/dashboard/vm-tour.1562cc89a659.js:126
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:126
-#: static_collected/dashboard/vm-tour.js:126
msgid "Save as"
msgstr "Mentés sablonként"
@@ -869,7 +861,6 @@ msgstr "Mentés sablonként"
#: static_collected/vm-detail.js:6504
#: static_collected/dashboard/vm-tour.1562cc89a659.js:135
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:135
-#: static_collected/dashboard/vm-tour.js:135
msgid "Finish"
msgstr "Befejezés"
@@ -884,7 +875,6 @@ msgstr "Befejezés"
#: static_collected/vm-detail.js:6507
#: static_collected/dashboard/vm-tour.1562cc89a659.js:138
#: static_collected/dashboard/vm-tour.7b4cf596f543.js:138
-#: static_collected/dashboard/vm-tour.js:138
msgid ""
"This is the last message, if something is not clear you can do the the tour "
"again!"
diff --git a/circle/network/forms.py b/circle/network/forms.py
index 7287488..af1417c 100644
--- a/circle/network/forms.py
+++ b/circle/network/forms.py
@@ -15,13 +15,13 @@
# You should have received a copy of the GNU General Public License along
# with CIRCLE. If not, see .
-from django.forms import ModelForm
+from django.forms import ModelForm, widgets
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Fieldset, Div, Submit, BaseInput
-from crispy_forms.bootstrap import FormActions
+from crispy_forms.bootstrap import FormActions, FieldWithButtons, StrictButton
from firewall.models import (Host, Vlan, Domain, Group, Record, BlacklistItem,
Rule, VlanGroup, SwitchPort)
@@ -122,8 +122,12 @@ class HostForm(ModelForm):
Fieldset(
_('Network'),
'vlan',
- 'ipv4',
- 'ipv6',
+ FieldWithButtons('ipv4', StrictButton(
+ '', css_id="ipv4-magic",
+ title=_("Generate random address."))),
+ FieldWithButtons('ipv6', StrictButton(
+ '', css_id="ipv6-magic",
+ title=_("Generate IPv6 pair of IPv4 address."))),
'shared_ip',
'external_ipv4',
),
@@ -252,7 +256,9 @@ class VlanForm(ModelForm):
Fieldset(
_('IPv6'),
'network6',
- 'ipv6_template',
+ FieldWithButtons('ipv6_template', StrictButton(
+ '', css_id="ipv6-tpl-magic",
+ title=_("Generate sensible template."))),
'host_ipv6_prefixlen',
),
Fieldset(
@@ -277,6 +283,9 @@ class VlanForm(ModelForm):
class Meta:
model = Vlan
+ widgets = {
+ 'ipv6_template': widgets.TextInput,
+ }
class VlanGroupForm(ModelForm):
diff --git a/circle/network/static/js/host.js b/circle/network/static/js/host.js
index 997d65c..b63636c 100644
--- a/circle/network/static/js/host.js
+++ b/circle/network/static/js/host.js
@@ -1,4 +1,4 @@
-$('i[class="fa fa-times"]').click(function() {
+$('#small_rule_table i[class="fa fa-times"]').click(function() {
href = $(this).parent('a').attr('href');
csrf = getCookie('csrftoken');
var click_this = this;
diff --git a/circle/network/static/js/network.js b/circle/network/static/js/network.js
index e59d0e8..2061084 100644
--- a/circle/network/static/js/network.js
+++ b/circle/network/static/js/network.js
@@ -28,6 +28,49 @@ function getURLParameter(name) {
);
}
+function doBlink(id, count) {
+ if (count > 0) {
+ $(id).parent().delay(200).queue(function() {
+ $(this).delay(200).queue(function() {
+ $(this).removeClass("has-warning").dequeue();
+ doBlink(id, count-1);});
+ $(this).addClass("has-warning").dequeue()
+ });
+ }
+}
+
$(function() {
$("[title]").tooltip();
+
+$("#ipv6-magic").click(function() {
+ $.ajax({url: window.location,
+ data: {ipv4: $("[name=ipv4]").val(),
+ vlan: $("[name=vlan]").val()},
+ success: function(data) {
+ $("[name=ipv6]").val(data.ipv6);
+ }});
+});
+$("#ipv4-magic").click(function() {
+ $.ajax({url: window.location,
+ data: {vlan: $("[name=vlan]").val()},
+ success: function(data) {
+ $("[name=ipv4]").val(data.ipv4);
+ if ($("[name=ipv6]").val() != data.ipv6) {
+ doBlink("[name=ipv6]", 3);
+ }
+ $("[name=ipv6]").val(data.ipv6);
+ }});
+});
+$("#ipv6-tpl-magic").click(function() {
+ $.ajax({url: window.location,
+ data: {network4: $("[name=network4]").val(),
+ network6: $("[name=network6]").val()},
+ success: function(data) {
+ $("[name=ipv6_template]").val(data.ipv6_template);
+ if ($("[name=host_ipv6_prefixlen]").val() != data.host_ipv6_prefixlen) {
+ doBlink("[name=host_ipv6_prefixlen]", 3);
+ }
+ $("[name=host_ipv6_prefixlen]").val(data.host_ipv6_prefixlen);
+ }});
+});
});
diff --git a/circle/network/static/js/select2-3.4.0/LICENSE b/circle/network/static/js/select2-3.4.0/LICENSE
deleted file mode 100644
index 3c98f3d..0000000
--- a/circle/network/static/js/select2-3.4.0/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright 2012 Igor Vaynberg
-
-Version: @@ver@@ Timestamp: @@timestamp@@
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
-http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the Apache License
-or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied. See the Apache License and the GPL License for the specific language governing
-permissions and limitations under the Apache License and the GPL License.
\ No newline at end of file
diff --git a/circle/network/static/js/select2-3.4.0/README.md b/circle/network/static/js/select2-3.4.0/README.md
deleted file mode 100644
index 12e2492..0000000
--- a/circle/network/static/js/select2-3.4.0/README.md
+++ /dev/null
@@ -1,83 +0,0 @@
-Select2
-=================
-
-Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
-
-To get started checkout examples and documentation at http://ivaynberg.github.com/select2
-
-What Usecases Does Select2 Support
--------------------------------------------------
-
-* Enhances native selects with search
-* Enhances native selects with a better multi-select interface
-* Loading data from javascript: easily load items via ajax and have them searchable
-* Nested optgroups: native selects only support one level of nested, Select2 does not have this restriction
-* Tagging: ability to add new items on the fly
-* Working with large remote datesets: ability to partially load a dataset based on the search term
-* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end
-* Templating: support for custom rendering of results and selections
-
-Browser Compatibility
---------------------
-* IE 8+ (7 mostly works except for [issue with z-index](https://github.com/ivaynberg/select2/issues/37))
-* Chrome 8+
-* Firefox 3.5+
-* Safari 3+
-* Opera 10.6+
-
-Integrations
-------------
-
-* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
-* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
-* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
-* [Django](https://github.com/applegrew/django-select2)
-* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
-* [Bootstrap](https://github.com/t0m/select2-bootstrap-css) (CSS skin)
-* [Yii](https://github.com/tonybolzan/yii-select2)
-
-Internationalization (i18n)
----------------------------
-
-Select2 supports multiple languages by simply including the right
-language JS file (`select2_locale_it.js`, `select2_locale_nl.js` etc.).
-
-Missing a language? Just copy `select2_locale_en.js.template`, translate
-it and make a pull request back to Select2 here on Github.
-
-Bug tracker
------------
-
-Have a bug? Please create an issue here on GitHub!
-
-https://github.com/ivaynberg/select2/issues
-
-Mailing list
-------------
-
-Have a question? Ask on our mailing list!
-
-select2@googlegroups.com
-
-https://groups.google.com/d/forum/select2
-
-
-Copyright and License
----------------------
-
-Copyright 2012 Igor Vaynberg
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
-
-http://www.apache.org/licenses/LICENSE-2.0
-http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the Apache License
-or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied. See the Apache License and the GPL License for the specific language governing
-permissions and limitations under the Apache License and the GPL License.
diff --git a/circle/network/static/js/select2-3.4.0/component.json b/circle/network/static/js/select2-3.4.0/component.json
deleted file mode 100644
index 4c7337f..0000000
--- a/circle/network/static/js/select2-3.4.0/component.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "select2",
- "version": "3.4.0",
- "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
- "dependencies": {
- "jquery": ">= 1.7.1"
- }
-}
diff --git a/circle/network/static/js/select2-3.4.0/release.sh b/circle/network/static/js/select2-3.4.0/release.sh
deleted file mode 100755
index 0a315ab..0000000
--- a/circle/network/static/js/select2-3.4.0/release.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-set -e
-
-echo -n "Enter the version for this release: "
-
-read ver
-
-if [ ! $ver ]; then
- echo "Invalid version."
- exit
-fi
-
-name="select2"
-js="$name.js"
-mini="$name.min.js"
-css="$name.css"
-release="$name-$ver"
-tag="$ver"
-branch="build-$ver"
-curbranch=`git branch | grep "*" | sed "s/* //"`
-timestamp=$(date)
-tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
-remote="github"
-
-echo "Updating Version Identifiers"
-
-sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i "" component.json select2.jquery.json
-git add component.json
-git add select2.jquery.json
-git commit -m "modified version identifiers in descriptors for release $ver"
-git push
-
-git branch "$branch"
-git checkout "$branch"
-
-echo "Tokenizing..."
-
-find . -name "$js" | xargs -I{} sed -e "$tokens" -i "" {}
-find . -name "$css" | xargs -I{} sed -e "$tokens" -i "" {}
-sed -e "s/latest/$ver/g" -i "" component.json
-
-git add "$js"
-git add "$css"
-
-echo "Minifying..."
-
-echo "/*" > "$mini"
-cat LICENSE | sed "$tokens" >> "$mini"
-echo "*/" >> "$mini"
-
-curl -s \
- --data-urlencode "js_code@$js" \
- http://marijnhaverbeke.nl/uglifyjs \
- >> "$mini"
-
-git add "$mini"
-
-git commit -m "release $ver"
-
-echo "Tagging..."
-git tag -a "$tag" -m "tagged version $ver"
-git push "$remote" --tags
-
-echo "Cleaning Up..."
-
-git checkout "$curbranch"
-git branch -D "$branch"
-
-echo "Done"
diff --git a/circle/network/static/js/select2-3.4.0/select2-spinner.gif b/circle/network/static/js/select2-3.4.0/select2-spinner.gif
deleted file mode 100644
index 5b33f7e..0000000
Binary files a/circle/network/static/js/select2-3.4.0/select2-spinner.gif and /dev/null differ
diff --git a/circle/network/static/js/select2-3.4.0/select2.jquery.json b/circle/network/static/js/select2-3.4.0/select2.jquery.json
deleted file mode 100644
index b9b114d..0000000
--- a/circle/network/static/js/select2-3.4.0/select2.jquery.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "select2",
- "title": "Select2",
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
- "keywords": [
- "select",
- "autocomplete",
- "typeahead",
- "dropdown",
- "multiselect",
- "tag",
- "tagging"
- ],
- "version": "3.4.0",
- "author": {
- "name": "Igor Vaynberg",
- "url": "https://github.com/ivaynberg"
- },
- "licenses": [
- {
- "type": "Apache",
- "url": "http://www.apache.org/licenses/LICENSE-2.0"
- },
- {
- "type": "GPL v2",
- "url": "http://www.gnu.org/licenses/gpl-2.0.html"
- }
- ],
- "bugs": "https://github.com/ivaynberg/select2/issues",
- "homepage": "http://ivaynberg.github.com/select2",
- "docs": "http://ivaynberg.github.com/select2/",
- "download": "https://github.com/ivaynberg/select2/tags",
- "dependencies": {
- "jquery": ">=1.7.1"
- }
-}
diff --git a/circle/network/static/js/select2-3.4.0/select2.js b/circle/network/static/js/select2-3.4.0/select2.js
deleted file mode 100644
index 992ba8b..0000000
--- a/circle/network/static/js/select2-3.4.0/select2.js
+++ /dev/null
@@ -1,3054 +0,0 @@
-/*
-Copyright 2012 Igor Vaynberg
-
-Version: 3.4.0 Timestamp: Tue May 14 08:27:33 PDT 2013
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
- http://www.apache.org/licenses/LICENSE-2.0
- http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the
-Apache License or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
-the specific language governing permissions and limitations under the Apache License and the GPL License.
-*/
- (function ($) {
- if(typeof $.fn.each2 == "undefined"){
- $.fn.extend({
- /*
- * 4-10 times faster .each replacement
- * use it carefully, as it overrides jQuery context of element on each iteration
- */
- each2 : function (c) {
- var j = $([0]), i = -1, l = this.length;
- while (
- ++i < l
- && (j.context = j[0] = this[i])
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
- );
- return this;
- }
- });
- }
-})(jQuery);
-
-(function ($, undefined) {
- "use strict";
- /*global document, window, jQuery, console */
-
- if (window.Select2 !== undefined) {
- return;
- }
-
- var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
- lastMousePosition, $document, scrollBarDimensions,
-
- KEY = {
- TAB: 9,
- ENTER: 13,
- ESC: 27,
- SPACE: 32,
- LEFT: 37,
- UP: 38,
- RIGHT: 39,
- DOWN: 40,
- SHIFT: 16,
- CTRL: 17,
- ALT: 18,
- PAGE_UP: 33,
- PAGE_DOWN: 34,
- HOME: 36,
- END: 35,
- BACKSPACE: 8,
- DELETE: 46,
- isArrow: function (k) {
- k = k.which ? k.which : k;
- switch (k) {
- case KEY.LEFT:
- case KEY.RIGHT:
- case KEY.UP:
- case KEY.DOWN:
- return true;
- }
- return false;
- },
- isControl: function (e) {
- var k = e.which;
- switch (k) {
- case KEY.SHIFT:
- case KEY.CTRL:
- case KEY.ALT:
- return true;
- }
-
- if (e.metaKey) return true;
-
- return false;
- },
- isFunctionKey: function (k) {
- k = k.which ? k.which : k;
- return k >= 112 && k <= 123;
- }
- },
- MEASURE_SCROLLBAR_TEMPLATE = "";
-
- $document = $(document);
-
- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
-
- function indexOf(value, array) {
- var i = 0, l = array.length;
- for (; i < l; i = i + 1) {
- if (equal(value, array[i])) return i;
- }
- return -1;
- }
-
- function measureScrollbar () {
- var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
- $template.appendTo('body');
-
- var dim = {
- width: $template.width() - $template[0].clientWidth,
- height: $template.height() - $template[0].clientHeight
- };
- $template.remove();
-
- return dim;
- }
-
- /**
- * Compares equality of a and b
- * @param a
- * @param b
- */
- function equal(a, b) {
- if (a === b) return true;
- if (a === undefined || b === undefined) return false;
- if (a === null || b === null) return false;
- if (a.constructor === String) return a+'' === b+''; // IE requires a+'' instead of just a
- if (b.constructor === String) return b+'' === a+''; // IE requires b+'' instead of just b
- return false;
- }
-
- /**
- * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
- * strings
- * @param string
- * @param separator
- */
- function splitVal(string, separator) {
- var val, i, l;
- if (string === null || string.length < 1) return [];
- val = string.split(separator);
- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
- return val;
- }
-
- function getSideBorderPadding(element) {
- return element.outerWidth(false) - element.width();
- }
-
- function installKeyUpChangeEvent(element) {
- var key="keyup-change-value";
- element.on("keydown", function () {
- if ($.data(element, key) === undefined) {
- $.data(element, key, element.val());
- }
- });
- element.on("keyup", function () {
- var val= $.data(element, key);
- if (val !== undefined && element.val() !== val) {
- $.removeData(element, key);
- element.trigger("keyup-change");
- }
- });
- }
-
- $document.on("mousemove", function (e) {
- lastMousePosition = {x: e.pageX, y: e.pageY};
- });
-
- /**
- * filters mouse events so an event is fired only if the mouse moved.
- *
- * filters out mouse events that occur when mouse is stationary but
- * the elements under the pointer are scrolled.
- */
- function installFilteredMouseMove(element) {
- element.on("mousemove", function (e) {
- var lastpos = lastMousePosition;
- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
- $(e.target).trigger("mousemove-filtered", e);
- }
- });
- }
-
- /**
- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
- * within the last quietMillis milliseconds.
- *
- * @param quietMillis number of milliseconds to wait before invoking fn
- * @param fn function to be debounced
- * @param ctx object to be used as this reference within fn
- * @return debounced version of fn
- */
- function debounce(quietMillis, fn, ctx) {
- ctx = ctx || undefined;
- var timeout;
- return function () {
- var args = arguments;
- window.clearTimeout(timeout);
- timeout = window.setTimeout(function() {
- fn.apply(ctx, args);
- }, quietMillis);
- };
- }
-
- /**
- * A simple implementation of a thunk
- * @param formula function used to lazily initialize the thunk
- * @return {Function}
- */
- function thunk(formula) {
- var evaluated = false,
- value;
- return function() {
- if (evaluated === false) { value = formula(); evaluated = true; }
- return value;
- };
- };
-
- function installDebouncedScroll(threshold, element) {
- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
- element.on("scroll", function (e) {
- if (indexOf(e.target, element.get()) >= 0) notify(e);
- });
- }
-
- function focus($el) {
- if ($el[0] === document.activeElement) return;
-
- /* set the focus in a 0 timeout - that way the focus is set after the processing
- of the current event has finished - which seems like the only reliable way
- to set focus */
- window.setTimeout(function() {
- var el=$el[0], pos=$el.val().length, range;
-
- $el.focus();
-
- /* make sure el received focus so we do not error out when trying to manipulate the caret.
- sometimes modals or others listeners may steal it after its set */
- if ($el.is(":visible") && el === document.activeElement) {
-
- /* after the focus is set move the caret to the end, necessary when we val()
- just before setting focus */
- if(el.setSelectionRange)
- {
- el.setSelectionRange(pos, pos);
- }
- else if (el.createTextRange) {
- range = el.createTextRange();
- range.collapse(false);
- range.select();
- }
- }
- }, 0);
- }
-
- function getCursorInfo(el) {
- el = $(el)[0];
- var offset = 0;
- var length = 0;
- if ('selectionStart' in el) {
- offset = el.selectionStart;
- length = el.selectionEnd - offset;
- } else if ('selection' in document) {
- el.focus();
- var sel = document.selection.createRange();
- length = document.selection.createRange().text.length;
- sel.moveStart('character', -el.value.length);
- offset = sel.text.length - length;
- }
- return { offset: offset, length: length };
- }
-
- function killEvent(event) {
- event.preventDefault();
- event.stopPropagation();
- }
- function killEventImmediately(event) {
- event.preventDefault();
- event.stopImmediatePropagation();
- }
-
- function measureTextWidth(e) {
- if (!sizer){
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
- sizer = $(document.createElement("div")).css({
- position: "absolute",
- left: "-10000px",
- top: "-10000px",
- display: "none",
- fontSize: style.fontSize,
- fontFamily: style.fontFamily,
- fontStyle: style.fontStyle,
- fontWeight: style.fontWeight,
- letterSpacing: style.letterSpacing,
- textTransform: style.textTransform,
- whiteSpace: "nowrap"
- });
- sizer.attr("class","select2-sizer");
- $("body").append(sizer);
- }
- sizer.text(e.val());
- return sizer.width();
- }
-
- function syncCssClasses(dest, src, adapter) {
- var classes, replacements = [], adapted;
-
- classes = dest.attr("class");
- if (classes) {
- classes = '' + classes; // for IE which returns object
- $(classes.split(" ")).each2(function() {
- if (this.indexOf("select2-") === 0) {
- replacements.push(this);
- }
- });
- }
- classes = src.attr("class");
- if (classes) {
- classes = '' + classes; // for IE which returns object
- $(classes.split(" ")).each2(function() {
- if (this.indexOf("select2-") !== 0) {
- adapted = adapter(this);
- if (adapted) {
- replacements.push(this);
- }
- }
- });
- }
- dest.attr("class", replacements.join(" "));
- }
-
-
- function markMatch(text, term, markup, escapeMarkup) {
- var match=text.toUpperCase().indexOf(term.toUpperCase()),
- tl=term.length;
-
- if (match<0) {
- markup.push(escapeMarkup(text));
- return;
- }
-
- markup.push(escapeMarkup(text.substring(0, match)));
- markup.push("");
- markup.push(escapeMarkup(text.substring(match, match + tl)));
- markup.push("");
- markup.push(escapeMarkup(text.substring(match + tl, text.length)));
- }
-
- /**
- * Produces an ajax-based query function
- *
- * @param options object containing configuration paramters
- * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
- * @param options.url url for the data
- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
- * @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
- * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
- * The expected format is an object containing the following keys:
- * results array of objects that will be used as choices
- * more (optional) boolean indicating whether there are more results available
- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
- */
- function ajax(options) {
- var timeout, // current scheduled but not yet executed request
- requestSequence = 0, // sequence used to drop out-of-order responses
- handler = null,
- quietMillis = options.quietMillis || 100,
- ajaxUrl = options.url,
- self = this;
-
- return function (query) {
- window.clearTimeout(timeout);
- timeout = window.setTimeout(function () {
- requestSequence += 1; // increment the sequence
- var requestNumber = requestSequence, // this request's sequence number
- data = options.data, // ajax data function
- url = ajaxUrl, // ajax url string or function
- transport = options.transport || $.fn.select2.ajaxDefaults.transport,
- // deprecated - to be removed in 4.0 - use params instead
- deprecated = {
- type: options.type || 'GET', // set type of request (GET or POST)
- cache: options.cache || false,
- jsonpCallback: options.jsonpCallback||undefined,
- dataType: options.dataType||"json"
- },
- params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
-
- data = data ? data.call(self, query.term, query.page, query.context) : null;
- url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
-
- if( null !== handler) { handler.abort(); }
-
- if (options.params) {
- if ($.isFunction(options.params)) {
- $.extend(params, options.params.call(self));
- } else {
- $.extend(params, options.params);
- }
- }
-
- $.extend(params, {
- url: url,
- dataType: options.dataType,
- data: data,
- success: function (data) {
- if (requestNumber < requestSequence) {
- return;
- }
- // TODO - replace query.page with query so users have access to term, page, etc.
- var results = options.results(data, query.page);
- query.callback(results);
- }
- });
- handler = transport.call(self, params);
- }, quietMillis);
- };
- }
-
- /**
- * Produces a query function that works with a local array
- *
- * @param options object containing configuration parameters. The options parameter can either be an array or an
- * object.
- *
- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
- *
- * If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
- * the text.
- */
- function local(options) {
- var data = options, // data elements
- dataText,
- tmp,
- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
-
- if ($.isArray(data)) {
- tmp = data;
- data = { results: tmp };
- }
-
- if ($.isFunction(data) === false) {
- tmp = data;
- data = function() { return tmp; };
- }
-
- var dataItem = data();
- if (dataItem.text) {
- text = dataItem.text;
- // if text is not a function we assume it to be a key name
- if (!$.isFunction(text)) {
- dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
- text = function (item) { return item[dataText]; };
- }
- }
-
- return function (query) {
- var t = query.term, filtered = { results: [] }, process;
- if (t === "") {
- query.callback(data());
- return;
- }
-
- process = function(datum, collection) {
- var group, attr;
- datum = datum[0];
- if (datum.children) {
- group = {};
- for (attr in datum) {
- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
- }
- group.children=[];
- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
- if (group.children.length || query.matcher(t, text(group), datum)) {
- collection.push(group);
- }
- } else {
- if (query.matcher(t, text(datum), datum)) {
- collection.push(datum);
- }
- }
- };
-
- $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
- query.callback(filtered);
- };
- }
-
- // TODO javadoc
- function tags(data) {
- var isFunc = $.isFunction(data);
- return function (query) {
- var t = query.term, filtered = {results: []};
- $(isFunc ? data() : data).each(function () {
- var isObject = this.text !== undefined,
- text = isObject ? this.text : this;
- if (t === "" || query.matcher(t, text)) {
- filtered.results.push(isObject ? this : {id: this, text: this});
- }
- });
- query.callback(filtered);
- };
- }
-
- /**
- * Checks if the formatter function should be used.
- *
- * Throws an error if it is not a function. Returns true if it should be used,
- * false if no formatting should be performed.
- *
- * @param formatter
- */
- function checkFormatter(formatter, formatterName) {
- if ($.isFunction(formatter)) return true;
- if (!formatter) return false;
- throw new Error("formatterName must be a function or a falsy value");
- }
-
- function evaluate(val) {
- return $.isFunction(val) ? val() : val;
- }
-
- function countResults(results) {
- var count = 0;
- $.each(results, function(i, item) {
- if (item.children) {
- count += countResults(item.children);
- } else {
- count++;
- }
- });
- return count;
- }
-
- /**
- * Default tokenizer. This function uses breaks the input on substring match of any string from the
- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
- * two options have to be defined in order for the tokenizer to work.
- *
- * @param input text user has typed so far or pasted into the search field
- * @param selection currently selected choices
- * @param selectCallback function(choice) callback tho add the choice to selection
- * @param opts select2's opts
- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
- */
- function defaultTokenizer(input, selection, selectCallback, opts) {
- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
- token, // token
- index, // position at which the separator was found
- i, l, // looping variables
- separator; // the matched separator
-
- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
-
- while (true) {
- index = -1;
-
- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
- separator = opts.tokenSeparators[i];
- index = input.indexOf(separator);
- if (index >= 0) break;
- }
-
- if (index < 0) break; // did not find any token separator in the input string, bail
-
- token = input.substring(0, index);
- input = input.substring(index + separator.length);
-
- if (token.length > 0) {
- token = opts.createSearchChoice(token, selection);
- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
- dupe = false;
- for (i = 0, l = selection.length; i < l; i++) {
- if (equal(opts.id(token), opts.id(selection[i]))) {
- dupe = true; break;
- }
- }
-
- if (!dupe) selectCallback(token);
- }
- }
- }
-
- if (original!==input) return input;
- }
-
- /**
- * Creates a new class
- *
- * @param superClass
- * @param methods
- */
- function clazz(SuperClass, methods) {
- var constructor = function () {};
- constructor.prototype = new SuperClass;
- constructor.prototype.constructor = constructor;
- constructor.prototype.parent = SuperClass.prototype;
- constructor.prototype = $.extend(constructor.prototype, methods);
- return constructor;
- }
-
- AbstractSelect2 = clazz(Object, {
-
- // abstract
- bind: function (func) {
- var self = this;
- return function () {
- func.apply(self, arguments);
- };
- },
-
- // abstract
- init: function (opts) {
- var results, search, resultsSelector = ".select2-results", disabled, readonly;
-
- // prepare options
- this.opts = opts = this.prepareOpts(opts);
-
- this.id=opts.id;
-
- // destroy if called on an existing component
- if (opts.element.data("select2") !== undefined &&
- opts.element.data("select2") !== null) {
- this.destroy();
- }
-
- this.container = this.createContainer();
-
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
- this.containerSelector="#"+this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
- this.container.attr("id", this.containerId);
-
- // cache the body so future lookups are cheap
- this.body = thunk(function() { return opts.element.closest("body"); });
-
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
-
- this.container.css(evaluate(opts.containerCss));
- this.container.addClass(evaluate(opts.containerCssClass));
-
- this.elementTabIndex = this.opts.element.attr("tabindex");
-
- // swap container for the element
- this.opts.element
- .data("select2", this)
- .attr("tabindex", "-1")
- .before(this.container);
- this.container.data("select2", this);
-
- this.dropdown = this.container.find(".select2-drop");
- this.dropdown.addClass(evaluate(opts.dropdownCssClass));
- this.dropdown.data("select2", this);
-
- this.results = results = this.container.find(resultsSelector);
- this.search = search = this.container.find("input.select2-input");
-
- this.resultsPage = 0;
- this.context = null;
-
- // initialize the container
- this.initContainer();
-
- installFilteredMouseMove(this.results);
- this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent));
-
- installDebouncedScroll(80, this.results);
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
-
- // do not propagate change event from the search field out of the component
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
-
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
- if ($.fn.mousewheel) {
- results.mousewheel(function (e, delta, deltaX, deltaY) {
- var top = results.scrollTop(), height;
- if (deltaY > 0 && top - deltaY <= 0) {
- results.scrollTop(0);
- killEvent(e);
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
- results.scrollTop(results.get(0).scrollHeight - results.height());
- killEvent(e);
- }
- });
- }
-
- installKeyUpChangeEvent(search);
- search.on("keyup-change input paste", this.bind(this.updateResults));
- search.on("focus", function () { search.addClass("select2-focused"); });
- search.on("blur", function () { search.removeClass("select2-focused");});
-
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
- this.highlightUnderEvent(e);
- this.selectHighlighted(e);
- }
- }));
-
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
- // dom it will trigger the popup close, which is not what we want
- this.dropdown.on("click mouseup mousedown", function (e) { e.stopPropagation(); });
-
- if ($.isFunction(this.opts.initSelection)) {
- // initialize selection based on the current value of the source element
- this.initSelection();
-
- // if the user has provided a function that can set selection based on the value of the source element
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
- this.monitorSource();
- }
-
- if (opts.maximumInputLength !== null) {
- this.search.attr("maxlength", opts.maximumInputLength);
- }
-
- var disabled = opts.element.prop("disabled");
- if (disabled === undefined) disabled = false;
- this.enable(!disabled);
-
- var readonly = opts.element.prop("readonly");
- if (readonly === undefined) readonly = false;
- this.readonly(readonly);
-
- // Calculate size of scrollbar
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
-
- this.autofocus = opts.element.prop("autofocus")
- opts.element.prop("autofocus", false);
- if (this.autofocus) this.focus();
- },
-
- // abstract
- destroy: function () {
- var select2 = this.opts.element.data("select2");
-
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
-
- if (select2 !== undefined) {
-
- select2.container.remove();
- select2.dropdown.remove();
- select2.opts.element
- .removeClass("select2-offscreen")
- .removeData("select2")
- .off(".select2")
- .attr({"tabindex": this.elementTabIndex})
- .prop("autofocus", this.autofocus||false)
- .show();
- }
- },
-
- // abstract
- optionToData: function(element) {
- if (element.is("option")) {
- return {
- id:element.prop("value"),
- text:element.text(),
- element: element.get(),
- css: element.attr("class"),
- disabled: element.prop("disabled"),
- locked: equal(element.attr("locked"), "locked")
- };
- } else if (element.is("optgroup")) {
- return {
- text:element.attr("label"),
- children:[],
- element: element.get(),
- css: element.attr("class")
- };
- }
- },
-
- // abstract
- prepareOpts: function (opts) {
- var element, select, idKey, ajaxUrl, self = this;
-
- element = opts.element;
-
- if (element.get(0).tagName.toLowerCase() === "select") {
- this.select = select = opts.element;
- }
-
- if (select) {
- // these options are not allowed when attached to a select because they are picked up off the element itself
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
- if (this in opts) {
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a