Selaa lähdekoodia

Update english

tags/3.5.0
vanhempi
commit
f810c54128
10 muutettua tiedostoa jossa 87 lisäystä ja 87 poistoa
  1. +10
    -10
      pym/unix/unix.py
  2. +1
    -1
      pym/unix/utils/cl_unix_groupadd.py
  3. +1
    -1
      pym/unix/utils/cl_unix_groupmod.py
  4. +2
    -2
      pym/unix/utils/cl_unix_setup.py
  5. +3
    -3
      pym/unix/variables/action.py
  6. +3
    -3
      pym/unix/variables/filters.py
  7. +16
    -16
      pym/unix/variables/groups.py
  8. +2
    -1
      pym/unix/variables/unix.py
  9. +32
    -33
      pym/unix/variables/users.py
  10. +17
    -17
      pym/unix/wsdl_unix.py

+ 10
- 10
pym/unix/unix.py Näytä tiedosto

@@ -165,7 +165,7 @@ class UnixGroups(object):
self.group_dn(group),
[(ldap.MOD_REPLACE, 'gidNumber', gid)])
except LDAPConnectError as e:
raise UnixError(_("Failed to update group id in LDAP: %s") % str(e))
raise UnixError(_("Failed to update group ID in LDAP: %s") % str(e))

def update_group_comment(self, group, comment):
try:
@@ -192,7 +192,7 @@ class UnixGroups(object):
self.ldap_connect.ldap_modify_dn(old_dn, new_dn)
except LDAPConnectError as e:
raise UnixError(
_("Failed to rename the group in LDAP: %s") % str(e))
_("Failed to rename group in LDAP: %s") % str(e))

def remove_group(self, group):
try:
@@ -509,14 +509,14 @@ class Unix(Ldap):

def remove_users_from_group(self, users, groupname):
self._remove_users_from_group(users, groupname)
self.printSUCCESS(_("Users {logins} was removed "
"from group {group}").format(
self.printSUCCESS(_("Users {logins} were removed from "
"group {group}").format(
logins=", ".join(users), group=groupname))
return True

def add_users_in_group(self, users, groupname):
self._add_users_in_group(users, groupname)
self.printSUCCESS(_("Users {logins} was added "
self.printSUCCESS(_("Users {logins} were added "
"to group {group}").format(
logins=", ".join(users), group=groupname))
return True
@@ -542,7 +542,7 @@ class Unix(Ldap):
"""
for group in groups:
self._add_users_in_group([user], group)
self.printSUCCESS(_("User {login} added "
self.printSUCCESS(_("User {login} was added "
"to groups {groups}").format(
login=user, groups=", ".join(groups)))
return True
@@ -553,7 +553,7 @@ class Unix(Ldap):
"""
for group in groups:
self._remove_users_from_group([user], group)
self.printSUCCESS(_("User {login} removed "
self.printSUCCESS(_("User {login} was removed "
"from groups {groups}").format(
login=user, groups=", ".join(groups)))
return True
@@ -609,7 +609,7 @@ class Unix(Ldap):
_("User %s is visible already") % user.username)
else:
self.printWARNING(
_("User %s is unvisible already") % user.username)
_("User %s is already unvisible") % user.username)
if lock is not None:
if user.lock != lock:
params['lock'] = lock
@@ -749,7 +749,7 @@ class Unix(Ldap):
if any(body):
num_page, count_page = getPagesInterval(
count, offset, maxi + 1)
self.printSUCCESS(_('page %d from ') % num_page + str(count_page))
self.printSUCCESS(_('page %d of ') % num_page + str(count_page))
return True

def show_group(self, groupname):
@@ -878,7 +878,7 @@ class Unix(Ldap):
if any(body):
num_page, count_page = getPagesInterval(
count, offset, maxi + 1)
self.printSUCCESS(_('page %d from ') % num_page + str(count_page))
self.printSUCCESS(_('page %d of ') % num_page + str(count_page))
return True

def show_user(self, user):


+ 1
- 1
pym/unix/utils/cl_unix_groupadd.py Näytä tiedosto

@@ -46,7 +46,7 @@ class ClUnixGroupaddAction(Action):
UnixError,
LdapError)

successMessage = __("Group {ur_unix_group_name} added in Unix service!")
successMessage = __("Group {ur_unix_group_name} added to Unix service!")
failedMessage = __("Failed to add {ur_unix_group_name} group "
"in Unix server!")
interruptMessage = __("Adding of new group manually interrupted")


+ 1
- 1
pym/unix/utils/cl_unix_groupmod.py Näytä tiedosto

@@ -75,7 +75,7 @@ class ClUnixGroupmodAction(Action):
Get('unix.ur_unix_group_name'))
},
{'name': 'change_comment',
'message': _("Changed comment for group {unix.ur_unix_group_name} to "
'message': _("Comment for group {unix.ur_unix_group_name} changed to "
"{unix.ur_unix_group_comment}"),
'method': 'Unix.update_group_comment(unix.ur_unix_group_name,'
'unix.ur_unix_group_comment)',


+ 2
- 2
pym/unix/utils/cl_unix_setup.py Näytä tiedosto

@@ -98,13 +98,13 @@ class ClUnixSetupAction(Action):
'method': 'Server.service_install("unix")'
},
{'name': 'generate_password',
'message': _("Create new Unix service password"),
'message': _("Create new password for Unix service"),
'method': 'Unix.generate_password(ld_unix_bind_dn,'
'ld_unix_hash,"Unix")',
'condition': lambda Get: Get('cl_unix_pw_generate_set') == 'on'
},
{'name': 'templates',
'message': __("Configure system"),
'message': __("System configuration"),
'method': 'Server.applyTemplates(install.cl_source,'
'False,True,None,True,True)',
},


+ 3
- 3
pym/unix/variables/action.py Näytä tiedosto

@@ -33,11 +33,11 @@ class VariableClUnixAction(UnixGroupHelper, UnixUserHelper, Variable):
def check(self, value):
if (value not in Actions.All and
not self.GetBool('server.sr_unix_set')):
raise VariableError(_("Unix service is not setup"))
raise VariableError(_("Unix service has not been configured"))
if value in Actions.UserExists and not self.ldap_user_list():
raise VariableError(_("Unix service has not users"))
raise VariableError(_("Unix service has no users"))
if value in Actions.GroupExists and not self.ldap_group_list():
raise VariableError(_("Unix service has not groups"))
raise VariableError(_("Unix service has no groups"))
# проверить соединение с ldap
if value != Actions.Setup:
self.Get('ldap.cl_ldap_connect')


+ 3
- 3
pym/unix/variables/filters.py Näytä tiedosto

@@ -257,8 +257,8 @@ class VariableClUnixUserFilterGroups(FilterListHelper, UnixGroupHelper,
opt = ["--filter-groups"]

def init(self):
self.label = _("Supplimentary group filter")
self.help = _("set supplimentary group filter")
self.label = _("Supplementary group filter")
self.help = _("set supplementary group filter")

def test(self, user):
return self.test_value(x.group_name for x in self.iterate_ldap_group(
@@ -371,7 +371,7 @@ class VariableClUnixGroupFilterUsers(FilterListHelper, UnixUserHelper,
opt = ["--filter-users"]

def init(self):
self.label = _("Users filter")
self.label = _("User filter")
self.help = _("set users filter")

def test(self, group):


+ 16
- 16
pym/unix/variables/groups.py Näytä tiedosto

@@ -63,10 +63,10 @@ class VariableUrUnixGroupName(GroupNameHelper,

def check(self, value):
if not value:
raise VariableError(_("You should specify group name"))
raise VariableError(_("Please specify the group name"))
self.check_group_name(value)
if value == "list":
raise VariableError(_("List is using as keyword"))
raise VariableError(_("List is used as keyword"))
if self.check_name(value):
raise VariableError(_("Group name already exists"))

@@ -125,10 +125,10 @@ class VariableUrUnixGroupNameExists(UnixUserHelper, UnixGroupHelper, Variable):
"gidNumber=%d" % group.gid))
if users:
raise VariableError(
_("Group {group} is primary group for users {users}"
_("Group {group} is the primary group for users {users}"
).format(group=value, users=users))
if not value:
raise VariableError(_("Choice group"))
raise VariableError(_("Select group"))
raise VariableError(_("Group %s not found") % value)

class VariableClUnixGroupCommentDefault(Variable):
@@ -203,14 +203,14 @@ class VariableUrUnixGroupId(LdapSearchHelper, UnixActionHelper, Variable):

def check_new(self, value):
if not value:
raise VariableError(_("You should specify group ID"))
raise VariableError(_("Please specify the group ID"))
if self.check_name(value):
raise VariableError(_("Group ID already exists"))

def check_exists(self, value):
old_value = self.Get('ur_unix_group_id_exists')
if not value:
raise VariableError(_("You should specify group ID"))
raise VariableError(_("Please specify the group ID"))
if value != old_value and self.check_name(value):
raise VariableError(_("Group ID already exists"))

@@ -304,8 +304,8 @@ class VariableUrUnixGroupUsersAdd(UnixUserHelper, Variable):
replace_users = self.Get('ur_unix_group_users_replace')
if set(exists_users) != set(replace_users):
raise VariableError(_(
"Appending users to group unavailable "
"with the replace user using"))
"You cannot add users to group and replace the list "
"of its members"))
group = self.Get('ur_unix_group_name')
users = self.ldap_user_names()
failed = [x for x in value if x not in users]
@@ -332,7 +332,7 @@ class VariableUrUnixGroupUsersReplace(UnixUserHelper, UnixActionHelper,

def init(self):
self.label = _("Users")
self.help = _("new user list of group")
self.help = _("new group's members list")

def get_exists(self):
return list(sorted(self.Get('ur_unix_group_users')))
@@ -378,10 +378,10 @@ class VariableUrUnixGroupUsersDel(UnixUserHelper, Variable):
replace_users = self.Get('ur_unix_group_users_replace')
if set(exists_users) != set(replace_users):
raise VariableError(_(
"Removing users from group unavailable "
"with the replace user using"))
"You cannot remove users from a group and replace the "
"list of its members"))
if not exists_users and value:
raise VariableError(_("Group has not members"))
raise VariableError(_("No members in this group"))

group = self.Get('ur_unix_group_name')
users = self.ldap_user_names()
@@ -393,12 +393,12 @@ class VariableUrUnixGroupUsersDel(UnixUserHelper, Variable):
not_exists = [x for x in value if x not in exists_users]
if not_exists:
raise VariableError(
_("Users {users} are not exist in group {group}").format(
_("Users {users} are not in group {group}").format(
users=", ".join(not_exists), group=group))

def humanReadable(self):
if not self.Get():
return _("Not change")
return _("Do not change")


class VariableUrUnixGroupNewname(GroupNameHelper, UnixGroupHelper, Variable):
@@ -408,7 +408,7 @@ class VariableUrUnixGroupNewname(GroupNameHelper, UnixGroupHelper, Variable):

def init(self):
self.label = _("Group name")
self.help = _("use NEW_GROUP name by GROUP")
self.help = _("use NEW_GROUP for GROUP name")

def get(self):
return self.Get('ur_unix_group_name')
@@ -424,7 +424,7 @@ class VariableUrUnixGroupNewname(GroupNameHelper, UnixGroupHelper, Variable):
def humanReadable(self):
value = self.Get()
if not value:
return _("Not change")
return _("Do not change")
return value




+ 2
- 1
pym/unix/variables/unix.py Näytä tiedosto

@@ -123,7 +123,8 @@ class VariableClUnixRemoveSet(Variable):

def check(self, value):
if self.Get('server.sr_unix_set') != 'on':
raise VariableError(_("Unix service is not setup"))
raise VariableError(
_("Unix service has not been configured"))

def uncompatible(self):
if self.Get('server.sr_unix_set') != 'on':


+ 32
- 33
pym/unix/variables/users.py Näytä tiedosto

@@ -69,15 +69,15 @@ class VariableUrUnixLogin(UserNameHelper, UnixUserHelper, UnixActionHelper,

def check_new(self, value):
if not value:
raise VariableError(_("You should specify login"))
raise VariableError(_("Please specify the login"))
self.check_user_name(value)
if value == "list":
raise VariableError(_("List is using as keyword"))
raise VariableError(_("List is used as keyword"))
if self.search_ldap_user_name(value):
raise VariableError(_("User %s already exists" % value))
if self.search_system_user_name(value):
raise VariableError(
_("User %s already exists in /etc/passwd") % value)
_("User %s is already in /etc/passwd") % value)


class VariableUrUnixLoginExists(UnixUserHelper, UnixActionHelper, Variable):
@@ -107,7 +107,7 @@ class VariableUrUnixLoginExists(UnixUserHelper, UnixActionHelper, Variable):

def raiseWrongChoice(self, name, choiceVal, value, error):
if not value:
raise VariableError(_("Please specify user login"))
raise VariableError(_("Please specify the user login"))
else:
raise VariableError(_("%s user not found") % value)

@@ -122,7 +122,7 @@ class VariableUrUnixBaseDir(Variable):

def init(self):
self.label = _("Base directory")
self.help = _("base directory for the home directory of new account")
self.help = _("base directory for new account's home")


class VariableUrUnixComment(ExistsUserHelper, UnixActionHelper, Variable):
@@ -136,7 +136,7 @@ class VariableUrUnixComment(ExistsUserHelper, UnixActionHelper, Variable):

def init(self):
self.label = _("Full name")
self.help = _("set fullname of the account")
self.help = _("set full name for account")

def get_new(self):
return ""
@@ -154,7 +154,7 @@ class VariableUrUnixHomePath(ExistsUserHelper, UnixActionHelper, Variable):

def init(self):
self.label = _("Home directory")
self.help = _("set home directory of the account")
self.help = _("set home directory for account")

def get_exists(self):
return self.Get('ur_unix_home_path_exists')
@@ -164,9 +164,9 @@ class VariableUrUnixHomePath(ExistsUserHelper, UnixActionHelper, Variable):

def check_exists(self, value):
if "," in value:
raise VariableError(_("Wrong home directory"))
raise VariableError(_("Non-existing home directory"))
if not value.startswith('/'):
raise VariableError(_("Home directory path must be absolutly"))
raise VariableError(_("Home must have an absolute path"))


class VariableUrUnixHomePathExists(ExistsUserHelper, UnixActionHelper,
@@ -188,16 +188,16 @@ class VariableUrUnixHomePathMove(Variable):

def init(self):
self.label = _("Move home directory")
self.help = _("move contents of the home directory to the new location")
self.help = _("move home conents to new location")

def check_on(self):
new_path = self.Get('ur_unix_home_path')
old_path = self.Get('ur_unix_home_path_exists')
if new_path == old_path:
raise VariableError(_("You should change home directory"))
raise VariableError(_("Please change home directory"))
if path.exists(new_path):
raise VariableError(
_("New home directory %s exists") % new_path)
_("New home directory %s already exists") % new_path)


class VariableClUnixGroupDefault(Variable):
@@ -223,8 +223,8 @@ class VariableUrUnixPrimaryGroup(ExistsUserHelper, UnixGroupHelper,

def init(self):
self.label = _("Primary group")
self.help = _("set name or ID of primary group of the account "
"('default' value for create default group)")
self.help = _("set name or ID of primary group for account "
"('default' creates a default group)")

def get_new(self):
return self.domain_group
@@ -246,11 +246,11 @@ class VariableUrUnixPrimaryGroup(ExistsUserHelper, UnixGroupHelper,

def check_new(self, value):
if not value:
raise VariableError(_("You should specify primary group ID"))
raise VariableError(_("Please specify the primary group ID"))

def check_exists(self, value):
if not value:
raise VariableError(_("You should specify primary group ID"))
raise VariableError(_("Please specify the primary group ID"))
if value:
self.check_group(value)

@@ -284,7 +284,7 @@ class VariableUrUnixUid(UnixUserHelper, UnixActionHelper, Variable):

def init(self):
self.label = _("User ID")
self.help = _("set user ID of the account")
self.help = _("set user ID")

def get_new(self):
return self.Get('ur_unix_next_uid')
@@ -298,12 +298,12 @@ class VariableUrUnixUid(UnixUserHelper, UnixActionHelper, Variable):
user = self.search_ldap_user_id(value)
if user:
raise VariableError(
_("Uid {userid} is used by user {username}").format(
_("UID {userid} is used by user {username}").format(
userid=user.uid, username=user.username))
user = self.search_system_user_id(value)
if user:
raise VariableError(
_("Uid {userid} is used by system user {username}").format(
_("UID {userid} is used by system user {username}").format(
userid=user.uid, username=user.username))


@@ -317,8 +317,8 @@ class VariableUrUnixGroups(UnixGroupHelper, UnixActionHelper, Variable):
value = []

def init(self):
self.label = _("Supplimentary groups")
self.help = _("set list of supplementary groups of the account")
self.label = _("Supplementary groups")
self.help = _("set list of supplementary groups for account")

def set(self, value):
return map(self.gid_to_name, value)
@@ -388,8 +388,7 @@ class VariableUrUnixGroupsAdd(UnixGroupHelper, UnixActionHelper, Variable):
replace_groups = self.Get('ur_unix_groups')
if set(exists_groups) != set(replace_groups):
raise VariableError(_(
"Appending user to groups unavailable "
"with the replace groups using"))
"You cannot add user to group and replace their groups"))
login = self.Get('ur_unix_login')
groups = self.ldap_group_names()
failed = [x for x in value if x not in groups]
@@ -408,7 +407,7 @@ class VariableUrUnixGroupsAdd(UnixGroupHelper, UnixActionHelper, Variable):

def humanReadable(self):
if not self.Get():
return _("Not change")
return _("Do not change")


class VariableUrUnixGroupsDel(VariableUrUnixGroupsAdd):
@@ -442,7 +441,7 @@ class VariableUrUnixGroupsDel(VariableUrUnixGroupsAdd):
not_exists = [x for x in value if x not in exists_groups]
if not_exists:
raise VariableError(
_("User {user} is not exist in groups {groups}").format(
_("No user {user} was found in groups {groups}").format(
groups=", ".join(not_exists), user=login))


@@ -456,7 +455,7 @@ class VariableUrUnixSkel(Variable):

def init(self):
self.label = _("Skeleton directory")
self.help = _("use this alternative skeleton directory")
self.help = _("use alternative skeleton directory")


class VariableUrUnixCreateHomeSet(Variable):
@@ -470,7 +469,7 @@ class VariableUrUnixCreateHomeSet(Variable):

def init(self):
self.label = _("Create home directory")
self.help = _("create the user's home directory")
self.help = _("create user's home directory")

def check_on(self):
home_path = self.Get('ur_unix_home_path')
@@ -502,8 +501,8 @@ class VariableUrUnixPw(Variable):
raise PasswordError(_("Specify user password"))
if self.Get('cl_unix_action') in (Actions.Passwd, Actions.UserMod):
if self.Get('ur_unix_pw_delete_set') == 'on' and value:
raise VariableError(_("Can not use remove and "
"set the password options together"))
raise VariableError(_("You cannot use remove and password "
"setup options together"))


class VariableUrUnixPwSet(UnixActionHelper, UnixUserHelper, ReadonlyVariable):
@@ -535,7 +534,7 @@ class VariableUrUnixPwDeleteSet(Variable):

def init(self):
self.label = _("Remove user password")
self.help = _("delete the password for the named account")
self.help = _("delete account password")


class VariableUrUnixHash(HashHelper, ReadonlyVariable):
@@ -568,7 +567,7 @@ class VariableUrUnixShell(ExistsUserHelper, UnixActionHelper, Variable):

def init(self):
self.label = _("Shell")
self.help = _("login shell of the account")
self.help = _("account's login shell")

def get_new(self):
return "/bin/bash"
@@ -584,7 +583,7 @@ class VariableUrUnixVisibleSet(ExistsUserHelper, UnixActionHelper, Variable):

def init(self):
self.label = _("Visible")
self.help = _("set visible of the account")
self.help = _("manage account visibility")

def get_new(self):
return "on"
@@ -603,7 +602,7 @@ class VariableUrUnixLockSet(ExistsUserHelper, UnixActionHelper, Variable):

def init(self):
self.label = _("Locked")
self.help = _("lock the account")
self.help = _("lock account")

def get(self):
return "auto"


+ 17
- 17
pym/unix/wsdl_unix.py Näytä tiedosto

@@ -104,7 +104,7 @@ class Wsdl(WsdlBase):
),
],
'depends': [Ldap.Method.Setup],
'brief': {'next': __("Perform"),
'brief': {'next': __("Run"),
'name': __("Setup Accounts Server"), }
},
#
@@ -114,7 +114,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.UserAdd,
# заголовок метода
'title': __("Add the User"),
'title': __("Add User"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -161,7 +161,7 @@ class Wsdl(WsdlBase):
'ur_unix_visible_set',
'ur_unix_skel',
),
next_label=_("Perform")
next_label=_("Run")
),
],
'depends': [Unix.Method.Setup],
@@ -173,7 +173,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.GroupAdd,
# заголовок метода
'title': __("Add the Group"),
'title': __("Add Group"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -203,7 +203,7 @@ class Wsdl(WsdlBase):
# описание груп (список лямбда функций)
'groups': [
lambda group: group(
_("Add the New Group"),
_("Add New Group"),
brief=(),
hide=('ur_unix_base_dir',),
normal=(
@@ -212,7 +212,7 @@ class Wsdl(WsdlBase):
'ur_unix_group_comment',
),
expert=(),
next_label=_("Perform")
next_label=_("Run")
),
],
'depends': [Unix.Method.Setup],
@@ -224,7 +224,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.GroupMod,
# заголовок метода
'title': __("Modify the Group"),
'title': __("Modify Group"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -299,7 +299,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.GroupDel,
# заголовок метода
'title': __("Delete the Group"),
'title': __("Delete Group"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -334,7 +334,7 @@ class Wsdl(WsdlBase):
normal=(
'ur_unix_group_name_exists',
),
next_label=_("Perform")
next_label=_("Run")
),
],
'depends': [Unix.Method.Setup]
@@ -346,7 +346,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.UserMod,
# заголовок метода
'title': __("Modify the User"),
'title': __("Modify User"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -402,7 +402,7 @@ class Wsdl(WsdlBase):
CustomButton.run_method(Unix.Method.UserMod,
'but2', _("Modify"))
],
next_label=_("Perform")
next_label=_("Run")
),
],
'invalidators': {
@@ -429,7 +429,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.UserDel,
# заголовок метода
'title': __("Delete the User"),
'title': __("Delete User"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -464,7 +464,7 @@ class Wsdl(WsdlBase):
normal=(
'ur_unix_login_exists',
),
next_label=_("Perform")
next_label=_("Run")
),
],
'depends': [Unix.Method.Setup]
@@ -476,7 +476,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.Passwd,
# заголовок метода
'title': __("Change the Password"),
'title': __("Password Modification"),
# иконка для графической консоли
'image': None,
# метод присутствует в графической консоли
@@ -514,7 +514,7 @@ class Wsdl(WsdlBase):
'ur_unix_pw_delete_set',
'ur_unix_lock_set'
),
next_label=_("Perform")
next_label=_("Run")
),
],
'depends': [Unix.Method.Setup]
@@ -526,7 +526,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.GroupShow,
# категория метода
'category': __('Server Accounts'),
'category': __('Accounts Server'),
# заголовок метода
'title': __("Unix Groups"),
# иконка для графической консоли
@@ -590,7 +590,7 @@ class Wsdl(WsdlBase):
# идентификатор метода
'method_name': Unix.Method.UserShow,
# категория метода
'category': __('Server Accounts'),
'category': __('Accounts Server'),
# заголовок метода
'title': __("Unix Users"),
# иконка для графической консоли


Ladataan…
Peruuta
Tallenna