Przeglądaj źródła

[security] Initial skeleton

Romain Rigaux 12 lat temu
rodzic
commit
e71e2008f9
45 zmienionych plików z 7899 dodań i 2572 usunięć
  1. 2 1
      apps/Makefile
  2. 15 0
      apps/security/src/security/__init__.py
  3. 16 0
      apps/security/src/security/conf.py
  4. 16 0
      apps/security/src/security/forms.py
  5. 658 0
      apps/security/src/security/locale/de/LC_MESSAGES/django.po
  6. 620 0
      apps/security/src/security/locale/en/LC_MESSAGES/django.po
  7. 621 0
      apps/security/src/security/locale/en/LC_MESSAGES/django.po~
  8. 620 0
      apps/security/src/security/locale/en_US.pot
  9. 658 0
      apps/security/src/security/locale/es/LC_MESSAGES/django.po
  10. 658 0
      apps/security/src/security/locale/fr/LC_MESSAGES/django.po
  11. 658 0
      apps/security/src/security/locale/ja/LC_MESSAGES/django.po
  12. 658 0
      apps/security/src/security/locale/ko/LC_MESSAGES/django.po
  13. 658 0
      apps/security/src/security/locale/pt/LC_MESSAGES/django.po
  14. 658 0
      apps/security/src/security/locale/pt_BR/LC_MESSAGES/django.po
  15. 658 0
      apps/security/src/security/locale/zh_CN/LC_MESSAGES/django.po
  16. 15 0
      apps/security/src/security/management/__init__.py
  17. 15 0
      apps/security/src/security/management/commands/__init__.py
  18. 15 0
      apps/security/src/security/migrations/__init__.py
  19. 16 0
      apps/security/src/security/models.py
  20. 28 0
      apps/security/src/security/settings.py
  21. 82 0
      apps/security/src/security/templates/index.mako
  22. 17 0
      apps/security/src/security/tests.py
  23. 4 20
      apps/security/src/security/urls.py
  24. 33 0
      apps/security/src/security/views.py
  25. 39 0
      apps/security/static/js/hive.ko.js
  26. 1 1
      apps/useradmin/src/useradmin/conf.py
  27. 1 1
      apps/useradmin/src/useradmin/models.py
  28. 12 0
      desktop/conf.dist/hue.ini
  29. 12 0
      desktop/conf/pseudo-distributed.ini.tmpl
  30. 2 1
      desktop/core/src/desktop/templates/common_header.mako
  31. 1 1
      desktop/core/src/desktop/views.py
  32. 0 172
      desktop/libs/libsentry/gen-py/fb303/FacebookService-remote
  33. 0 1930
      desktop/libs/libsentry/gen-py/fb303/FacebookService.py
  34. 0 1
      desktop/libs/libsentry/gen-py/fb303/__init__.py
  35. 0 11
      desktop/libs/libsentry/gen-py/fb303/constants.py
  36. 0 47
      desktop/libs/libsentry/gen-py/fb303/ttypes.py
  37. 3 3
      desktop/libs/libsentry/gen-py/sentry_policy_service/SentryPolicyService-remote
  38. 10 10
      desktop/libs/libsentry/gen-py/sentry_policy_service/SentryPolicyService.py
  39. 1 1
      desktop/libs/libsentry/gen-py/sentry_policy_service/constants.py
  40. 206 258
      desktop/libs/libsentry/gen-py/sentry_policy_service/ttypes.py
  41. 6 0
      desktop/libs/libsentry/src/libsentry/__init__.py
  42. 100 18
      desktop/libs/libsentry/src/libsentry/api.py
  43. 83 75
      desktop/libs/libsentry/src/libsentry/client.py
  44. 2 1
      desktop/libs/libsentry/thrift/sentry_common_service.thrift
  45. 21 20
      desktop/libs/libsentry/thrift/sentry_policy_service.thrift

+ 2 - 1
apps/Makefile

@@ -47,7 +47,8 @@ APPS := about \
   sqoop \
   zookeeper \
   rdbms \
-  spark
+  spark \
+  security
 
 ################################################
 # Install all applications into the Desktop environment

+ 15 - 0
apps/security/src/security/__init__.py

@@ -0,0 +1,15 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 16 - 0
apps/security/src/security/conf.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 16 - 0
apps/security/src/security/forms.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 658 - 0
apps/security/src/security/locale/de/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# German translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: de <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "Benutzername"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "Erforderlich. 30 Zeichen oder weniger. Keine Leerzeichen oder Doppelpunkte."
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "Leerzeichen und ':' nicht erlaubt"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "Kennwort"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "Kennwortbestätigung"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "Home-Verzeichnis erstellen"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "Home-Verzeichnis für erstellen, falls noch keines vorhanden ist."
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "Kennwörter stimmen nicht überein."
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "Sie müssen ein Kennwort angeben, wenn Sie einen neuen Benutzer erstellen."
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "Erforderlich. Höchstens 30 Zeichen mit Benutzernamen. Höchstens 64 Zeichen mit DN. Keine Leerzeichen oder Doppelpunkte."
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "Hervorgehobener Name"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "Ob der Benutzer nach hervorgehobenem Namen importiert werden soll oder nicht."
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "Home-Verzeichnis für den Benutzer erstellen, falls noch keines vorhanden ist."
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "Zu lang: Höchstens 64 Zeichen und nicht %s."
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "Zu lang: Höchstens 30 Zeichen und nicht %s."
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "Name"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "Erforderlich. 80 Zeichen oder weniger."
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 Zeichen oder weniger."
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "Ob die Gruppe nach hervorgehobenem Namen importiert werden soll oder nicht."
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "Neue Mitglieder importieren"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "Nicht importierte oder neue Benutzer von der Gruppe importieren."
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "Home-Verzeichnisse erstellen"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "Home-Verzeichnisse für jedes importierte Mitglied erstellen, wenn Mitglieder importiert werden."
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "Neue Mitglieder aus allen Untergruppen importieren."
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "Nicht importierte oder neue Benutzer aus allen Untergruppen importieren."
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "Zu lang: Höchstens 80 Zeichen und nicht %s"
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "Gruppenname darf nur Buchstaben, Ziffern, Bindestriche oder Unterstriche enthalten."
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "Mitglieder"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "Berechtigungen"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "Gruppen"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "Home-Verzeichnisse erstellen"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "Home-Verzeichnis für alle Benutzer erstellen, falls noch keines vorhanden ist."
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "Sie haben keine Berechtigung zu %(description)s."
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "Sie müssen ein Superuser sein, um Benutzer löschen zu können."
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "Eine POST-Anforderung ist erforderlich."
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "Sie können sich selbst nicht löschen."
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "Die Benutzer wurden gelöscht."
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "Sie müssen ein Superuser sein, um Gruppen zu löschen."
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "Die Standard-Benutzergruppe kann nicht gelöscht werden."
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "Die Gruppe wurde gelöscht."
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "Gruppe nicht gefunden."
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "Sie müssen ein Superuser sein, um einen anderen Benutzer hinzufügen oder bearbeiten zu können."
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "Ein Benutzername kann nicht geändert werden."
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "Sie können sich selbst nicht deaktivieren."
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "Sie können sich selbst nicht zu einem Superuser machen."
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "Benutzerinformationen aktualisiert"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "Home-Verzeichnis für Benutzer %s kann nicht erstellt werden."
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "Sie müssen ein Superuser sein, um eine Gruppe hinzuzufügen oder zu bearbeiten."
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "Gruppeninformationen aktualisiert"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "Sie müssen ein Superuser sein, um Berechtigungen ändern zu können."
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "Berechtigungsinformationen aktualisiert"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "Sie müssen ein Superuser sein, um einen anderen Benutzer hinzufügen zu können."
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "Fehler bei der Kommunikation mit LDAP"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "LDAP-Details für Benutzer in Muster %s konnten nicht abgerufen werden."
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "Sie müssen ein Superuser sein, um eine andere Gruppe hinzufügen zu können."
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "LDAP-Ausnahme: %s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "LDAP-Details für Gruppe in Muster %s konnten nicht abgerufen werden"
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "Sie müssen ein Superuser sein, um die LDAP-Benutzer/-Gruppen zu synchronisieren."
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "Der Import wurde möglicherweise nicht abgeschlossen. Erneut synchronisieren."
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "Es wurde kein aktiver Superuser konfiguriert."
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "Der letzte aktive Superuser kann nicht aus der Konfiguration entfernt werden."
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "Benutzer %s von Unix synchronisiert"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "Es gab einen Namenskonflikt beim Importieren des Benutzers %(username)s."
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "Beim Importieren von Gruppe %(groupname)s in Muster %(groupname_pattern)s ist ein Namenskonflikt aufgetreten"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "Benutzer aus der Gruppe importieren."
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "Importieren Sie Benutzer aus der Gruppe, aber auch rekursiv."
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "Synchronisieren Sie Benutzer in der Gruppe."
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "Der Server, zu dem eine Verbindung hergestellt werden soll."
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "Es muss ein Gruppenname angegeben werden."
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "Synchronisieren Sie Benutzergruppen."
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "Es muss ein Benutzername angegeben werden."
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "Minimale UID zu importieren (Inklusiv)."
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "Maximale UID zu importieren (Exklusiv)."
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "Minimale GID zu importieren (Inklusiv)."
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "Maximale GID zu importieren (Exklusiv)."
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "Ob geprüft werden soll oder nicht, dass die Shell des Benutzers nicht /bin/false ist."
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Hue-Benutzer"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Hue-Benutzer - LDAP-Benutzer hinzufügen/synchronisieren"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "Benutzer aktualisieren"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "Benutzer hinzufügen/synchronisieren"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "Alle auswählen"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "Suche"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "Keine Gruppen gefunden."
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "Jetzt eine neue Gruppe erstellen"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "Bestätigen"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "Ja"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "Möchten Sie"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "wirklich löschen?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "Nein"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Hue-Gruppen"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Hue-Gruppen - Gruppe bearbeiten: %(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Hue-Gruppen - LDAP-Gruppe hinzufügen/synchronisieren"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Hue-Gruppen - Gruppe erstellen"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "Gruppe aktualisieren"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "Gruppe hinzufügen/synchronisieren"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "Gruppe hinzufügen"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "Keine Benutzer gefunden."
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "Jetzt einen neuen Benutzer erstellen"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "Keine Berechtigungen gefunden."
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Hue-Berechtigungen"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Hue-Berechtigungen - App bearbeiten: %(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "Berechtigung aktualisieren"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Hue-Benutzer - Benutzer bearbeiten: %(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Hue-Benutzer - Benutzer erstellen"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "Schritt 1: Zugangsdaten (erforderlich)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "Schritt 2: Namen und Gruppen"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "Schritt 2: Namen"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "Schritt 3: Erweitert"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "Zurück"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "Weiter"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "Benutzer hinzufügen"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "Dieses Feld ist erforderlich."
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "Benutzeradministration"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "Benutzer"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "Gruppen"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "Berechtigungen"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "Nach Namen, Mitgliedern usw. suchen..."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "Löschen"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "LDAP-Gruppe hinzufügen/synchronisieren"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "Gruppenname"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "Mitglieder"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "%(groupname)s bearbeiten"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "Es gibt keine Gruppen, die den Suchkriterien entsprechen."
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "Keine Daten verfügbar"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "Keine übereinstimmenden Datensätze"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "Nach Anwendung, Gruppe usw. suchen..."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "Anwendung"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "Berechtigung"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "Berechtigung bearbeiten"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "Es gibt keine Berechtigungen, die den Suchkriterien entsprechen."
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "Nach Namen, Gruppe usw. suchen..."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "LDAP-Benutzer hinzufügen/synchronisieren"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "LDAP-Benutzer/-Gruppen synchronisieren"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "Vorname"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "Nachname"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "E-Mail"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "Letzte Anmeldung"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "%(username)s bearbeiten"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "Es gibt keine Benutzer, die den Suchkriterien entsprechen."
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "Möchten Sie den/die ausgewählten Benutzer wirklich löschen?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "LDAP-Benutzer und -Gruppen synchronisieren"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Hiermit werden keine Benutzer oder Gruppen importiert, die nicht bereits in Hue vorhanden sind. Synchronisation ist nur mit Benutzern und Gruppen möglich, die bereits aus LDAP importiert wurden."
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "Alle Benutzerinformationen und Gruppenmitgliedschaften werden entsprechend dem aktuellen Status des LDAP-Servers aktualisiert."
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "Sync"
+

+ 620 - 0
apps/security/src/security/locale/en/LC_MESSAGES/django.po

@@ -0,0 +1,620 @@
+# English translations for Hue.
+# Copyright (C) 2013 Cloudera, Inc
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Hue VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2013-05-10 11:59-0700\n"
+"PO-Revision-Date: 2013-10-28 10:31-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: en <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:43 src/security/forms.py:104
+#: src/security/templates/list_users.mako:52
+msgid "Username"
+msgstr ""
+
+#: src/security/forms.py:46 src/security/forms.py:107
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr ""
+
+#: src/security/forms.py:47 src/security/forms.py:108
+msgid "Whitespaces and ':' not allowed"
+msgstr ""
+
+#: src/security/forms.py:48
+msgid "Password"
+msgstr ""
+
+#: src/security/forms.py:49
+msgid "Password confirmation"
+msgstr ""
+
+#: src/security/forms.py:50 src/security/forms.py:114
+msgid "Create home directory"
+msgstr ""
+
+#: src/security/forms.py:51
+msgid "Create home directory if one doesn't already exist."
+msgstr ""
+
+#: src/security/forms.py:62
+msgid "Passwords do not match."
+msgstr ""
+
+#: src/security/forms.py:68
+msgid "You must specify a password when creating a new user."
+msgstr ""
+
+#: src/security/forms.py:109 src/security/forms.py:141
+msgid "Distinguished name"
+msgstr ""
+
+#: src/security/forms.py:110
+#: src/security/management/commands/import_ldap_group.py:35
+#: src/security/management/commands/import_ldap_user.py:33
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr ""
+
+#: src/security/forms.py:115
+msgid "Create home directory for user if one doesn't already exist."
+msgstr ""
+
+#: src/security/forms.py:126 src/security/forms.py:166
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s"
+msgstr ""
+
+#: src/security/forms.py:136
+msgid "Name"
+msgstr ""
+
+#: src/security/forms.py:139
+msgid "Required. 80 characters or fewer."
+msgstr ""
+
+#: src/security/forms.py:140
+msgid "80 characters or fewer."
+msgstr ""
+
+#: src/security/forms.py:142
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr ""
+
+#: src/security/forms.py:146
+msgid "Import new members"
+msgstr ""
+
+#: src/security/forms.py:147
+msgid "Import unimported or new users from the group."
+msgstr ""
+
+#: src/security/forms.py:150
+msgid "Import new members from all subgroups"
+msgstr ""
+
+#: src/security/forms.py:151
+msgid "Import unimported or new users from the all subgroups."
+msgstr ""
+
+#: src/security/forms.py:154
+msgid "Create home directories"
+msgstr ""
+
+#: src/security/forms.py:155
+msgid ""
+"Create home directories for every member imported, if members are being "
+"imported."
+msgstr ""
+
+#: src/security/forms.py:188
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr ""
+
+#: src/security/forms.py:203
+msgid "members"
+msgstr ""
+
+#: src/security/forms.py:204
+msgid "permissions"
+msgstr ""
+
+#: src/security/forms.py:247
+msgid "groups"
+msgstr ""
+
+#: src/security/forms.py:282
+msgid "Create Home Directories"
+msgstr ""
+
+#: src/security/forms.py:283
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr ""
+
+#: src/security/models.py:125
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr ""
+
+#: src/security/views.py:76
+msgid "You must be a superuser to delete users."
+msgstr ""
+
+#: src/security/views.py:79
+msgid "A POST request is required."
+msgstr ""
+
+#: src/security/views.py:86
+msgid "You cannot remove yourself."
+msgstr ""
+
+#: src/security/views.py:93
+msgid "The users were deleted."
+msgstr ""
+
+#: src/security/views.py:99
+msgid "You must be a superuser to delete groups."
+msgstr ""
+
+#: src/security/views.py:112
+msgid "The default user group may not be deleted."
+msgstr ""
+
+#: src/security/views.py:117
+msgid "The group was deleted."
+msgstr ""
+
+#: src/security/views.py:120
+msgid "Group not found."
+msgstr ""
+
+#: src/security/views.py:135
+msgid "You must be a superuser to add or edit another user."
+msgstr ""
+
+#: src/security/views.py:162
+msgid "You cannot make yourself inactive."
+msgstr ""
+
+#: src/security/views.py:174
+msgid "You cannot make yourself a superuser."
+msgstr ""
+
+#: src/security/views.py:178
+msgid "User information updated"
+msgstr ""
+
+#: src/security/views.py:187 src/security/views.py:294
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr ""
+
+#: src/security/views.py:215
+msgid "You must be a superuser to add or edit a group."
+msgstr ""
+
+#: src/security/views.py:226
+msgid "Group information updated"
+msgstr ""
+
+#: src/security/views.py:249
+msgid "You must be a superuser to change permissions."
+msgstr ""
+
+#: src/security/views.py:257
+msgid "Permission information updated"
+msgstr ""
+
+#: src/security/views.py:276
+msgid "You must be a superuser to add another user."
+msgstr ""
+
+#: src/security/views.py:287 src/security/views.py:331
+#: src/security/views.py:364
+msgid "There was an error when communicating with LDAP"
+msgstr ""
+
+#: src/security/views.py:298
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr ""
+
+#: src/security/views.py:318
+msgid "You must be a superuser to add another group."
+msgstr ""
+
+#: src/security/views.py:330
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr ""
+
+#: src/security/views.py:337
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr ""
+
+#: src/security/views.py:354
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr ""
+
+#: src/security/views.py:372
+msgid "The import may not be complete, sync again."
+msgstr ""
+
+#: src/security/views.py:399
+msgid "No active superuser configured."
+msgstr ""
+
+#: src/security/views.py:401
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr ""
+
+#: src/security/views.py:459
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr ""
+
+#: src/security/views.py:473
+#, python-format
+msgid "Could not get LDAP details for users with pattern %s"
+msgstr ""
+
+#: src/security/views.py:482
+#, python-format
+msgid ""
+"There was a naming conflict while importing user %(username)s in pattern "
+"%(username_pattern)s"
+msgstr ""
+
+#: src/security/views.py:517
+#, python-format
+msgid "Could not get LDAP details for group pattern %s"
+msgstr ""
+
+#: src/security/views.py:525
+#, python-format
+msgid ""
+"There was a naming conflict while importing group %(groupname)s in "
+"pattern %(groupname_pattern)s"
+msgstr ""
+
+#: src/security/management/commands/import_ldap_group.py:39
+msgid "Import users from the group."
+msgstr ""
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "A group name must be provided."
+msgstr ""
+
+#: src/security/management/commands/import_ldap_user.py:43
+msgid "A username must be provided."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:29
+msgid "Hue Users"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:30
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:46
+#: src/security/templates/edit_user.mako:81
+msgid "Update user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:48
+msgid "Add/Sync user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:50
+#: src/security/templates/edit_group.mako:75
+#: src/security/templates/edit_permissions.mako:53
+#: src/security/templates/sync_ldap_users_groups.mako:49
+msgid "Cancel"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:58
+#: src/security/templates/edit_group.mako:83
+#: src/security/templates/edit_group.mako:90
+#: src/security/templates/edit_permissions.mako:61
+#: src/security/templates/edit_user.mako:114
+msgid "Select all"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:59
+#: src/security/templates/edit_group.mako:84
+#: src/security/templates/edit_group.mako:91
+#: src/security/templates/edit_permissions.mako:62
+#: src/security/templates/edit_user.mako:115
+msgid "Search"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_permissions.mako:63
+#: src/security/templates/edit_user.mako:116
+msgid "No groups found."
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_user.mako:116
+msgid "Create a new group now"
+msgstr ""
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr ""
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:104
+msgid "Yes"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:103
+msgid "No"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:29
+msgid "Hue Groups"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:47
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:50
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:52
+msgid "Hue Groups - Create group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:67
+msgid "Update group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:70
+msgid "Add/Sync group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:72
+#: src/security/templates/list_groups.mako:39
+msgid "Add group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:85
+msgid "No users found."
+msgstr ""
+
+#: src/security/templates/edit_group.mako:85
+msgid "Create a new user now"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:92
+msgid "No permissions found."
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:30
+msgid "Hue Permissions"
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:43
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:52
+msgid "Update permission"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:31
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:33
+msgid "Hue Users - Create user"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:40
+msgid "Step 1: Credentials (required)"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:41
+msgid "Step 2: Names and Groups"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:43
+msgid "Step 3: Advanced"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:77
+msgid "Back"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:78
+msgid "Next"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:83
+#: src/security/templates/list_users.mako:39
+msgid "Add user"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:167
+msgid "This field is required."
+msgstr ""
+
+#: src/security/templates/layout.mako:51
+msgid "Users"
+msgstr ""
+
+#: src/security/templates/layout.mako:52
+#: src/security/templates/list_permissions.mako:38
+#: src/security/templates/list_users.mako:56
+msgid "Groups"
+msgstr ""
+
+#: src/security/templates/layout.mako:53
+#: src/security/templates/list_groups.mako:53
+msgid "Permissions"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:34
+#: src/security/templates/list_users.mako:34
+msgid "Delete"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:40
+msgid "Add/Sync LDAP group"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:51
+msgid "Group Name"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:52
+msgid "Members"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:66
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:80
+msgid "There are no groups matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_groups.mako:108
+#: src/security/templates/list_permissions.mako:81
+#: src/security/templates/list_users.mako:142
+msgid "No data available"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:109
+#: src/security/templates/list_permissions.mako:82
+#: src/security/templates/list_users.mako:143
+msgid "No matching records"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:36
+msgid "Application"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:37
+msgid "Permission"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:46
+msgid "Edit permission"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:60
+msgid "There are no permissions matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_users.mako:40
+msgid "Add/Sync LDAP user"
+msgstr ""
+
+#: src/security/templates/list_users.mako:41
+msgid "Sync LDAP users/groups"
+msgstr ""
+
+#: src/security/templates/list_users.mako:53
+msgid "First Name"
+msgstr ""
+
+#: src/security/templates/list_users.mako:54
+msgid "Last Name"
+msgstr ""
+
+#: src/security/templates/list_users.mako:55
+msgid "E-mail"
+msgstr ""
+
+#: src/security/templates/list_users.mako:57
+msgid "Last Login"
+msgstr ""
+
+#: src/security/templates/list_users.mako:70
+#, python-format
+msgid "Edit %(username)s"
+msgstr ""
+
+#: src/security/templates/list_users.mako:87
+msgid "There are no users matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_users.mako:100
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:37
+msgid "Sync LDAP users and groups"
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:41
+msgid ""
+"This will not import any users or groups that don't already exist in Hue."
+" Only users and groups imported from LDAP can be synced."
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:42
+msgid ""
+"All user information and group memberships will be updated based on the "
+"LDAP server's current state."
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:50
+msgid "Sync"
+msgstr ""
+

+ 621 - 0
apps/security/src/security/locale/en/LC_MESSAGES/django.po~

@@ -0,0 +1,621 @@
+# English translations for Hue.
+# Copyright (C) 2013 Cloudera, Inc
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Hue VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2013-05-10 11:59-0700\n"
+"PO-Revision-Date: 2013-10-28 10:31-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: en <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:43 src/security/forms.py:104
+#: src/security/templates/list_users.mako:52
+msgid "Username"
+msgstr ""
+
+#: src/security/forms.py:46 src/security/forms.py:107
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr ""
+
+#: src/security/forms.py:47 src/security/forms.py:108
+msgid "Whitespaces and ':' not allowed"
+msgstr ""
+
+#: src/security/forms.py:48
+msgid "Password"
+msgstr ""
+
+#: src/security/forms.py:49
+msgid "Password confirmation"
+msgstr ""
+
+#: src/security/forms.py:50 src/security/forms.py:114
+msgid "Create home directory"
+msgstr ""
+
+#: src/security/forms.py:51
+msgid "Create home directory if one doesn't already exist."
+msgstr ""
+
+#: src/security/forms.py:62
+msgid "Passwords do not match."
+msgstr ""
+
+#: src/security/forms.py:68
+msgid "You must specify a password when creating a new user."
+msgstr ""
+
+#: src/security/forms.py:109 src/security/forms.py:141
+msgid "Distinguished name"
+msgstr ""
+
+#: src/security/forms.py:110
+#: src/security/management/commands/import_ldap_group.py:35
+#: src/security/management/commands/import_ldap_user.py:33
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr ""
+
+#: src/security/forms.py:115
+msgid "Create home directory for user if one doesn't already exist."
+msgstr ""
+
+#: src/security/forms.py:126 src/security/forms.py:166
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s"
+msgstr ""
+
+#: src/security/forms.py:136
+msgid "Name"
+msgstr ""
+
+#: src/security/forms.py:139
+msgid "Required. 80 characters or fewer."
+msgstr ""
+
+#: src/security/forms.py:140
+msgid "80 characters or fewer."
+msgstr ""
+
+#: src/security/forms.py:142
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr ""
+
+#: src/security/forms.py:146
+msgid "Import new members"
+msgstr ""
+
+#: src/security/forms.py:147
+msgid "Import unimported or new users from the group."
+msgstr ""
+
+#: src/security/forms.py:150
+msgid "Import new members from all subgroups"
+msgstr ""
+
+#: src/security/forms.py:151
+msgid "Import unimported or new users from the all subgroups."
+msgstr ""
+
+#: src/security/forms.py:154
+msgid "Create home directories"
+msgstr ""
+
+#: src/security/forms.py:155
+msgid ""
+"Create home directories for every member imported, if members are being "
+"imported."
+msgstr ""
+
+#: src/security/forms.py:188
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr ""
+
+#: src/security/forms.py:203
+msgid "members"
+msgstr ""
+
+#: src/security/forms.py:204
+msgid "permissions"
+msgstr ""
+
+#: src/security/forms.py:247
+msgid "groups"
+msgstr ""
+
+#: src/security/forms.py:282
+msgid "Create Home Directories"
+msgstr ""
+
+#: src/security/forms.py:283
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr ""
+
+#: src/security/models.py:125
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr ""
+
+#: src/security/views.py:76
+msgid "You must be a superuser to delete users."
+msgstr ""
+
+#: src/security/views.py:79
+msgid "A POST request is required."
+msgstr ""
+
+#: src/security/views.py:86
+msgid "You cannot remove yourself."
+msgstr ""
+
+#: src/security/views.py:93
+msgid "The users were deleted."
+msgstr ""
+
+#: src/security/views.py:99
+msgid "You must be a superuser to delete groups."
+msgstr ""
+
+#: src/security/views.py:112
+msgid "The default user group may not be deleted."
+msgstr ""
+
+#: src/security/views.py:117
+msgid "The group was deleted."
+msgstr ""
+
+#: src/security/views.py:120
+msgid "Group not found."
+msgstr ""
+
+#: src/security/views.py:135
+msgid "You must be a superuser to add or edit another user."
+msgstr ""
+
+#: src/security/views.py:162
+msgid "You cannot make yourself inactive."
+msgstr ""
+
+#: src/security/views.py:174
+msgid "You cannot make yourself a superuser."
+msgstr ""
+
+#: src/security/views.py:178
+msgid "User information updated"
+msgstr ""
+
+#: src/security/views.py:187 src/security/views.py:294
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr ""
+
+#: src/security/views.py:215
+msgid "You must be a superuser to add or edit a group."
+msgstr ""
+
+#: src/security/views.py:226
+msgid "Group information updated"
+msgstr ""
+
+#: src/security/views.py:249
+msgid "You must be a superuser to change permissions."
+msgstr ""
+
+#: src/security/views.py:257
+msgid "Permission information updated"
+msgstr ""
+
+#: src/security/views.py:276
+msgid "You must be a superuser to add another user."
+msgstr ""
+
+#: src/security/views.py:287 src/security/views.py:331
+#: src/security/views.py:364
+msgid "There was an error when communicating with LDAP"
+msgstr ""
+
+#: src/security/views.py:298
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr ""
+
+#: src/security/views.py:318
+msgid "You must be a superuser to add another group."
+msgstr ""
+
+#: src/security/views.py:330
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr ""
+
+#: src/security/views.py:337
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr ""
+
+#: src/security/views.py:354
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr ""
+
+#: src/security/views.py:372
+msgid "The import may not be complete, sync again."
+msgstr ""
+
+#: src/security/views.py:399
+msgid "No active superuser configured."
+msgstr ""
+
+#: src/security/views.py:401
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr ""
+
+#: src/security/views.py:459
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr ""
+
+#: src/security/views.py:473
+#, python-format
+msgid "Could not get LDAP details for users with pattern %s"
+msgstr ""
+
+#: src/security/views.py:482
+#, python-format
+msgid ""
+"There was a naming conflict while importing user %(username)s in pattern "
+"%(username_pattern)s"
+msgstr ""
+
+#: src/security/views.py:517
+#, python-format
+msgid "Could not get LDAP details for group pattern %s"
+msgstr ""
+
+#: src/security/views.py:525
+#, python-format
+msgid ""
+"There was a naming conflict while importing group %(groupname)s in "
+"pattern %(groupname_pattern)s"
+msgstr ""
+
+#: src/security/management/commands/import_ldap_group.py:39
+msgid "Import users from the group."
+msgstr ""
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "A group name must be provided."
+msgstr ""
+
+#: src/security/management/commands/import_ldap_user.py:43
+msgid "A username must be provided."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:29
+msgid "Hue Users"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:30
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:46
+#: src/security/templates/edit_user.mako:81
+msgid "Update user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:48
+msgid "Add/Sync user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:50
+#: src/security/templates/edit_group.mako:75
+#: src/security/templates/edit_permissions.mako:53
+#: src/security/templates/sync_ldap_users_groups.mako:49
+msgid "Cancel"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:58
+#: src/security/templates/edit_group.mako:83
+#: src/security/templates/edit_group.mako:90
+#: src/security/templates/edit_permissions.mako:61
+#: src/security/templates/edit_user.mako:114
+msgid "Select all"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:59
+#: src/security/templates/edit_group.mako:84
+#: src/security/templates/edit_group.mako:91
+#: src/security/templates/edit_permissions.mako:62
+#: src/security/templates/edit_user.mako:115
+msgid "Search"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_permissions.mako:63
+#: src/security/templates/edit_user.mako:116
+msgid "No groups found."
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_user.mako:116
+msgid "Create a new group now"
+msgstr ""
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr ""
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:104
+msgid "Yes"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:103
+msgid "No"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:29
+msgid "Hue Groups"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:47
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:50
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:52
+msgid "Hue Groups - Create group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:67
+msgid "Update group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:70
+msgid "Add/Sync group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:72
+#: src/security/templates/list_groups.mako:39
+msgid "Add group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:85
+msgid "No users found."
+msgstr ""
+
+#: src/security/templates/edit_group.mako:85
+msgid "Create a new user now"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:92
+msgid "No permissions found."
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:30
+msgid "Hue Permissions"
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:43
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:52
+msgid "Update permission"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:31
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:33
+msgid "Hue Users - Create user"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:40
+msgid "Step 1: Credentials (required)"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:41
+msgid "Step 2: Names and Groups"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:43
+msgid "Step 3: Advanced"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:77
+msgid "Back"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:78
+msgid "Next"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:83
+#: src/security/templates/list_users.mako:39
+msgid "Add user"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:167
+msgid "This field is required."
+msgstr ""
+
+#: src/security/templates/layout.mako:51
+msgid "Users"
+msgstr ""
+
+#: src/security/templates/layout.mako:52
+#: src/security/templates/list_permissions.mako:38
+#: src/security/templates/list_users.mako:56
+msgid "Groups"
+msgstr ""
+
+#: src/security/templates/layout.mako:53
+#: src/security/templates/list_groups.mako:53
+msgid "Permissions"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:34
+#: src/security/templates/list_users.mako:34
+msgid "Delete"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:40
+msgid "Add/Sync LDAP group"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:51
+msgid "Group Name"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:52
+msgid "Members"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:66
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:80
+msgid "There are no groups matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_groups.mako:108
+#: src/security/templates/list_permissions.mako:81
+#: src/security/templates/list_users.mako:142
+msgid "No data available"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:109
+#: src/security/templates/list_permissions.mako:82
+#: src/security/templates/list_users.mako:143
+msgid "No matching records"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:36
+msgid "Application"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:37
+msgid "Permission"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:46
+msgid "Edit permission"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:60
+msgid "There are no permissions matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_users.mako:40
+msgid "Add/Sync LDAP user"
+msgstr ""
+
+#: src/security/templates/list_users.mako:41
+msgid "Sync LDAP users/groups"
+msgstr ""
+
+#: src/security/templates/list_users.mako:53
+msgid "First Name"
+msgstr ""
+
+#: src/security/templates/list_users.mako:54
+msgid "Last Name"
+msgstr ""
+
+#: src/security/templates/list_users.mako:55
+msgid "E-mail"
+msgstr ""
+
+#: src/security/templates/list_users.mako:57
+msgid "Last Login"
+msgstr ""
+
+#: src/security/templates/list_users.mako:70
+#, python-format
+msgid "Edit %(username)s"
+msgstr ""
+
+#: src/security/templates/list_users.mako:87
+msgid "There are no users matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_users.mako:100
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:37
+msgid "Sync LDAP users and groups"
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:41
+msgid ""
+"This will not import any users or groups that don't already exist in Hue."
+" Only users and groups imported from LDAP can be synced."
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:42
+msgid ""
+"All user information and group memberships will be updated based on the "
+"LDAP server's current state."
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:50
+msgid "Sync"
+msgstr ""
+

+ 620 - 0
apps/security/src/security/locale/en_US.pot

@@ -0,0 +1,620 @@
+# Translations template for Hue.
+# Copyright (C) 2013 Cloudera, Inc
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Hue VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2013-05-10 11:59-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:43 src/security/forms.py:104
+#: src/security/templates/list_users.mako:52
+msgid "Username"
+msgstr ""
+
+#: src/security/forms.py:46 src/security/forms.py:107
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr ""
+
+#: src/security/forms.py:47 src/security/forms.py:108
+msgid "Whitespaces and ':' not allowed"
+msgstr ""
+
+#: src/security/forms.py:48
+msgid "Password"
+msgstr ""
+
+#: src/security/forms.py:49
+msgid "Password confirmation"
+msgstr ""
+
+#: src/security/forms.py:50 src/security/forms.py:114
+msgid "Create home directory"
+msgstr ""
+
+#: src/security/forms.py:51
+msgid "Create home directory if one doesn't already exist."
+msgstr ""
+
+#: src/security/forms.py:62
+msgid "Passwords do not match."
+msgstr ""
+
+#: src/security/forms.py:68
+msgid "You must specify a password when creating a new user."
+msgstr ""
+
+#: src/security/forms.py:109 src/security/forms.py:141
+msgid "Distinguished name"
+msgstr ""
+
+#: src/security/forms.py:110
+#: src/security/management/commands/import_ldap_group.py:35
+#: src/security/management/commands/import_ldap_user.py:33
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr ""
+
+#: src/security/forms.py:115
+msgid "Create home directory for user if one doesn't already exist."
+msgstr ""
+
+#: src/security/forms.py:126 src/security/forms.py:166
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s"
+msgstr ""
+
+#: src/security/forms.py:136
+msgid "Name"
+msgstr ""
+
+#: src/security/forms.py:139
+msgid "Required. 80 characters or fewer."
+msgstr ""
+
+#: src/security/forms.py:140
+msgid "80 characters or fewer."
+msgstr ""
+
+#: src/security/forms.py:142
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr ""
+
+#: src/security/forms.py:146
+msgid "Import new members"
+msgstr ""
+
+#: src/security/forms.py:147
+msgid "Import unimported or new users from the group."
+msgstr ""
+
+#: src/security/forms.py:150
+msgid "Import new members from all subgroups"
+msgstr ""
+
+#: src/security/forms.py:151
+msgid "Import unimported or new users from the all subgroups."
+msgstr ""
+
+#: src/security/forms.py:154
+msgid "Create home directories"
+msgstr ""
+
+#: src/security/forms.py:155
+msgid ""
+"Create home directories for every member imported, if members are being "
+"imported."
+msgstr ""
+
+#: src/security/forms.py:188
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr ""
+
+#: src/security/forms.py:203
+msgid "members"
+msgstr ""
+
+#: src/security/forms.py:204
+msgid "permissions"
+msgstr ""
+
+#: src/security/forms.py:247
+msgid "groups"
+msgstr ""
+
+#: src/security/forms.py:282
+msgid "Create Home Directories"
+msgstr ""
+
+#: src/security/forms.py:283
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr ""
+
+#: src/security/models.py:125
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr ""
+
+#: src/security/views.py:76
+msgid "You must be a superuser to delete users."
+msgstr ""
+
+#: src/security/views.py:79
+msgid "A POST request is required."
+msgstr ""
+
+#: src/security/views.py:86
+msgid "You cannot remove yourself."
+msgstr ""
+
+#: src/security/views.py:93
+msgid "The users were deleted."
+msgstr ""
+
+#: src/security/views.py:99
+msgid "You must be a superuser to delete groups."
+msgstr ""
+
+#: src/security/views.py:112
+msgid "The default user group may not be deleted."
+msgstr ""
+
+#: src/security/views.py:117
+msgid "The group was deleted."
+msgstr ""
+
+#: src/security/views.py:120
+msgid "Group not found."
+msgstr ""
+
+#: src/security/views.py:135
+msgid "You must be a superuser to add or edit another user."
+msgstr ""
+
+#: src/security/views.py:162
+msgid "You cannot make yourself inactive."
+msgstr ""
+
+#: src/security/views.py:174
+msgid "You cannot make yourself a superuser."
+msgstr ""
+
+#: src/security/views.py:178
+msgid "User information updated"
+msgstr ""
+
+#: src/security/views.py:187 src/security/views.py:294
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr ""
+
+#: src/security/views.py:215
+msgid "You must be a superuser to add or edit a group."
+msgstr ""
+
+#: src/security/views.py:226
+msgid "Group information updated"
+msgstr ""
+
+#: src/security/views.py:249
+msgid "You must be a superuser to change permissions."
+msgstr ""
+
+#: src/security/views.py:257
+msgid "Permission information updated"
+msgstr ""
+
+#: src/security/views.py:276
+msgid "You must be a superuser to add another user."
+msgstr ""
+
+#: src/security/views.py:287 src/security/views.py:331
+#: src/security/views.py:364
+msgid "There was an error when communicating with LDAP"
+msgstr ""
+
+#: src/security/views.py:298
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr ""
+
+#: src/security/views.py:318
+msgid "You must be a superuser to add another group."
+msgstr ""
+
+#: src/security/views.py:330
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr ""
+
+#: src/security/views.py:337
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr ""
+
+#: src/security/views.py:354
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr ""
+
+#: src/security/views.py:372
+msgid "The import may not be complete, sync again."
+msgstr ""
+
+#: src/security/views.py:399
+msgid "No active superuser configured."
+msgstr ""
+
+#: src/security/views.py:401
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr ""
+
+#: src/security/views.py:459
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr ""
+
+#: src/security/views.py:473
+#, python-format
+msgid "Could not get LDAP details for users with pattern %s"
+msgstr ""
+
+#: src/security/views.py:482
+#, python-format
+msgid ""
+"There was a naming conflict while importing user %(username)s in pattern "
+"%(username_pattern)s"
+msgstr ""
+
+#: src/security/views.py:517
+#, python-format
+msgid "Could not get LDAP details for group pattern %s"
+msgstr ""
+
+#: src/security/views.py:525
+#, python-format
+msgid ""
+"There was a naming conflict while importing group %(groupname)s in "
+"pattern %(groupname_pattern)s"
+msgstr ""
+
+#: src/security/management/commands/import_ldap_group.py:39
+msgid "Import users from the group."
+msgstr ""
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "A group name must be provided."
+msgstr ""
+
+#: src/security/management/commands/import_ldap_user.py:43
+msgid "A username must be provided."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr ""
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:29
+msgid "Hue Users"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:30
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:46
+#: src/security/templates/edit_user.mako:81
+msgid "Update user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:48
+msgid "Add/Sync user"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:50
+#: src/security/templates/edit_group.mako:75
+#: src/security/templates/edit_permissions.mako:53
+#: src/security/templates/sync_ldap_users_groups.mako:49
+msgid "Cancel"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:58
+#: src/security/templates/edit_group.mako:83
+#: src/security/templates/edit_group.mako:90
+#: src/security/templates/edit_permissions.mako:61
+#: src/security/templates/edit_user.mako:114
+msgid "Select all"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:59
+#: src/security/templates/edit_group.mako:84
+#: src/security/templates/edit_group.mako:91
+#: src/security/templates/edit_permissions.mako:62
+#: src/security/templates/edit_user.mako:115
+msgid "Search"
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_permissions.mako:63
+#: src/security/templates/edit_user.mako:116
+msgid "No groups found."
+msgstr ""
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_user.mako:116
+msgid "Create a new group now"
+msgstr ""
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr ""
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:104
+msgid "Yes"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr ""
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:103
+msgid "No"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:29
+msgid "Hue Groups"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:47
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:50
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:52
+msgid "Hue Groups - Create group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:67
+msgid "Update group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:70
+msgid "Add/Sync group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:72
+#: src/security/templates/list_groups.mako:39
+msgid "Add group"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:85
+msgid "No users found."
+msgstr ""
+
+#: src/security/templates/edit_group.mako:85
+msgid "Create a new user now"
+msgstr ""
+
+#: src/security/templates/edit_group.mako:92
+msgid "No permissions found."
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:30
+msgid "Hue Permissions"
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:43
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr ""
+
+#: src/security/templates/edit_permissions.mako:52
+msgid "Update permission"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:31
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:33
+msgid "Hue Users - Create user"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:40
+msgid "Step 1: Credentials (required)"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:41
+msgid "Step 2: Names and Groups"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:43
+msgid "Step 3: Advanced"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:77
+msgid "Back"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:78
+msgid "Next"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:83
+#: src/security/templates/list_users.mako:39
+msgid "Add user"
+msgstr ""
+
+#: src/security/templates/edit_user.mako:167
+msgid "This field is required."
+msgstr ""
+
+#: src/security/templates/layout.mako:51
+msgid "Users"
+msgstr ""
+
+#: src/security/templates/layout.mako:52
+#: src/security/templates/list_permissions.mako:38
+#: src/security/templates/list_users.mako:56
+msgid "Groups"
+msgstr ""
+
+#: src/security/templates/layout.mako:53
+#: src/security/templates/list_groups.mako:53
+msgid "Permissions"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:34
+#: src/security/templates/list_users.mako:34
+msgid "Delete"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:40
+msgid "Add/Sync LDAP group"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:51
+msgid "Group Name"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:52
+msgid "Members"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:66
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:80
+msgid "There are no groups matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_groups.mako:108
+#: src/security/templates/list_permissions.mako:81
+#: src/security/templates/list_users.mako:142
+msgid "No data available"
+msgstr ""
+
+#: src/security/templates/list_groups.mako:109
+#: src/security/templates/list_permissions.mako:82
+#: src/security/templates/list_users.mako:143
+msgid "No matching records"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:36
+msgid "Application"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:37
+msgid "Permission"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:46
+msgid "Edit permission"
+msgstr ""
+
+#: src/security/templates/list_permissions.mako:60
+msgid "There are no permissions matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_users.mako:40
+msgid "Add/Sync LDAP user"
+msgstr ""
+
+#: src/security/templates/list_users.mako:41
+msgid "Sync LDAP users/groups"
+msgstr ""
+
+#: src/security/templates/list_users.mako:53
+msgid "First Name"
+msgstr ""
+
+#: src/security/templates/list_users.mako:54
+msgid "Last Name"
+msgstr ""
+
+#: src/security/templates/list_users.mako:55
+msgid "E-mail"
+msgstr ""
+
+#: src/security/templates/list_users.mako:57
+msgid "Last Login"
+msgstr ""
+
+#: src/security/templates/list_users.mako:70
+#, python-format
+msgid "Edit %(username)s"
+msgstr ""
+
+#: src/security/templates/list_users.mako:87
+msgid "There are no users matching the search criteria."
+msgstr ""
+
+#: src/security/templates/list_users.mako:100
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:37
+msgid "Sync LDAP users and groups"
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:41
+msgid ""
+"This will not import any users or groups that don't already exist in Hue."
+" Only users and groups imported from LDAP can be synced."
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:42
+msgid ""
+"All user information and group memberships will be updated based on the "
+"LDAP server's current state."
+msgstr ""
+
+#: src/security/templates/sync_ldap_users_groups.mako:50
+msgid "Sync"
+msgstr ""
+

+ 658 - 0
apps/security/src/security/locale/es/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# Spanish translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: es <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "Obligatorio. 30 caracteres o menos. Sin espacios en blanco ni dos puntos."
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "No se permiten espacios en blanco ni ':'"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "Contraseña"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "Confirmación de contraseña"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "Crear directorio de inicio"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "Crear directorio de inicio si aún no existe ninguno."
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "Las contraseñas no coinciden."
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "Debe especificar una contraseña al crear un nuevo usuario."
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "Obligatorio. Nombre de usuario de 30 caracteres o menos. Nombre de dominio de 64 caracteres o menos. Sin espacios en blanco ni dos puntos."
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "Nombre distintivo"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "Indica si el usuario se debe importar por nombre distintivo o no."
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "Crear directorio de inicio para el usuario si aún no existe ninguno."
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "Demasiado largo: 64 caracteres o menos y no %s."
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "Demasiado largo: 30 caracteres o menos y no %s."
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "Nombre"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "Obligatorio. 80 caracteres o menos."
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 caracteres o menos."
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "Indica si el grupo se debe importar por nombre distintivo o no."
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "Importar nuevos miembros"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "Importar usuarios no importados o nuevos del grupo."
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "Crear directorios de inicio"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "Crear directorios de inicio para todos los miembros importados, si se están importando miembros."
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "Importar nuevos miembros de todos los subgrupos."
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "Importar usuarios no importados o nuevos de todos los subgrupos."
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "Demasiado largo: 80 caracteres o menos y no %s"
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "El nombre de grupo solo puede contener letras, números, guiones o caracteres de subrayado."
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "miembros"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "permisos"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "grupos"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "Crear directorios de inicio"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "Crear directorio de inicio para el usuario, si aún no existe ninguno."
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "No tiene permisos para %(description)s."
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "Debe ser un superusuario para eliminar usuarios."
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "Se necesita una solicitud POST."
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "No puede quitarse a sí mismo."
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "Los usuarios se han eliminado."
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "Debe ser un superusuario para eliminar grupos."
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "No se puede eliminar el grupo de usuarios predeterminado."
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "El grupo se ha eliminado."
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "Grupo no encontrado."
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "Debe ser un superusuario para agregar o editar otro usuario."
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "No puede cambiar un nombre de usuario."
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "No puede desactivarse a sí mismo."
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "No puede convertirse a sí mismo en superusuario."
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "Información de usuario actualizada"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "No puede ser directorio de inicio para el usuario %s."
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "Debe ser un superusuario para agregar o editar un grupo."
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "Información de grupo actualizada"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "Debe ser un superusuario para cambiar permisos."
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "Información de permiso actualizada"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "Debe ser un superusuario para agregar otro usuario."
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "Error al comunicar con LDAP"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "No se pueden obtener los detalles de LDAP de los usuarios en el modelo %s."
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "Debe ser un superusuario para agregar otro grupo."
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "Excepción LDAP: %s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "No se pueden obtener los detalles de LDAP de los grupos en el modelo %s"
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "Debe ser un superusuario para sincronizar los usuarios/grupos LDAP."
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "No se puede completar la importación; sincronizar de nuevo."
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "Ningún superusuario activo configurado."
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "No puede eliminar al último superusuario activo de la configuración."
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "Usuario %s sincronizado desde Unix"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "Se ha producido un conflicto de nombre al importar el usuario %(username)s"
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "Se ha producido un conflicto de nombre al importar el grupo %(groupname)s en el modelo %(groupname_pattern)s"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "Importar usuarios del grupo."
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "Importar usuarios del grupo y hacerlo también de forma recurrente."
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "Sincronizar a los usuarios del grupo."
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "Servidor al que conectarse."
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "Se debe proporcionar un nombre de grupo."
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "Sincronizar grupos de usuarios."
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "Se debe proporcionar un nombre de usuario."
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "UID mínimo para importar (inclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "UID máximo para importar (exclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "GID mínimo para importar (inclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "GID máximo para importar (exclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "Indica si se debe comprobar o no que el shell del usuario no es /bin/false."
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Usuarios de Hue"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Usuarios de Hue: agregar/sincronizar usuario de LDAP"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "Actualizar usuario"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "Agregar/sincronizar usuario"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "Seleccionar todo"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "Buscar"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "No se ha encontrado ningún grupo."
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "Crear un grupo ahora"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "Sí"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "¿Está seguro de que desea eliminar"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "No"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Grupos de Hue"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Grupos de Hue: editar grupo: %(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Grupos de Hue: agregar/sincronizar grupo de LDAP"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Grupos de Hue: crear grupo"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "Actualizar grupo"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "Agregar/sincronizar grupo"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "Agregar grupo"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "No se ha encontrado ningún usuario."
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "Crear un usuario nuevo ahora"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "No se han encontrado permisos."
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Permisos de Hue"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Permisos de Hue: editar aplicación: %(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "Actualizar permiso"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Usuarios de Hue: editar usuario: %(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Usuarios de Hue: crear usuario"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "Paso 1: credenciales (obligatorio)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "Paso 2: nombres y grupos"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "Paso 2: nombres"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "Paso 3: avanzado"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "Volver"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "Siguiente"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "Agregar usuario"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "Administrador de usuario"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "Usuarios"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "Grupos"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "Permisos"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "Buscar nombre, miembros, etc."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "Actualizar/sincronizar grupo de LDAP"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "Nombre de grupo"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "Miembros"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "Editar %(groupname)s"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "No hay ningún grupo que coincida con los criterios de búsqueda."
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "No hay datos disponibles"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "No hay registros coincidentes"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "Buscar aplicación, grupo, etc."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "Aplicación"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "Permiso"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "Editar permiso"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "No hay ningún permiso que coincida con los criterios de búsqueda."
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "Buscar nombre, grupo, etc."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "Agregar/sincronizar usuario de LDAP"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "Sincronizar usuarios/grupos de LDAP"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "Nombre"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "Apellido"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "Correo electrónico"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "Último inicio de sesión"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "Editar %(username)s"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "No hay ningún usuario que coincida con los criterios de búsqueda."
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "¿Está seguro de que desea eliminar a los usuarios seleccionados?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "Sincronizar usuarios y grupos de LDAP"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Esta acción no importa los usuarios o los grupos que no existen en Hue. Únicamente se pueden sincronizar los usuarios y los grupos importados de LDAP."
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "Toda la información de usuario, así como los miembros del grupo se actualizarán de acuerdo con el estado actual del servidor LDAP."
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "Sincronizar"
+

+ 658 - 0
apps/security/src/security/locale/fr/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# French translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: fr <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "Requis. 30 caractères maximum. Espaces ou deux-points non autorisés."
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "Espaces et ':' non autorisés"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "Mot de passe"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "Confirmation du mot de passe"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "Créer un répertoire racine"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "Créez un répertoire racine s'il n'en existe pas encore."
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "Les mots de passe ne concordent pas."
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "Vous devez indiquer un mot de passe lors de la création d'un utilisateur."
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "Requis. 30 caractères maximum pour le nom d'utilisateur. 64 caractères maximum pour le nom distinctif. Espaces ou deux-points non autorisés."
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "Nom distinctif"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "Indique si l'utilisateur doit être importé par un nom distinctif."
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "Créez un répertoire racine pour l'utilisateur s'il n'en existe pas encore."
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "Trop long : 64 caractères maximum (et non %s)."
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "Trop long : 30 caractères maximum (et non %s)."
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "Nom"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "Obligatoire. 80 caractères maximum."
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 caractères maximum."
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "Indique si le groupe doit être importé par un nom distinctif."
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "Importer de nouveaux membres"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "Importer des utilisateurs non importés ou nouveaux depuis le groupe."
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "Créer des répertoires racines"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "Créez des répertoires racines pour chaque membre importé si des membres sont importés actuellement."
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "Importer de nouveaux utilisateurs depuis tous les sous-groupes"
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "Importez des utilisateurs non importés ou nouveaux depuis tous les sous-groupes."
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "Trop long : 80 caractères maximum (et non %s)."
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "Le nom de groupe peut contenir uniquement des lettres, nombres, tirets ou traits de soulignement."
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "membres"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "autorisations"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "groupes"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "Créer des répertoires racines"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "Créez un répertoire racine pour chaque utilisateur s'il n'en existe pas encore."
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "Vous n'êtes pas autorisé à %(description)s."
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "Vous devez être un superutilisateur pour pouvoir supprimer des utilisateurs."
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "Requête POST requise."
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "Vous ne pouvez pas vous supprimer vous-même."
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "Les utilisateurs ont été supprimés."
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "Vous devez être un superutilisateur pour pouvoir supprimer des groupes."
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "Le groupe d'utilisateurs par défaut peut ne pas être supprimé."
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "Le groupe a été supprimé."
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "Groupe introuvable."
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "Vous devez être un superutilisateur pour pouvoir ajouter ou modifier un autre utilisateur."
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "Vous ne pouvez pas modifier un nom d'utilisateur."
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "Vous ne pouvez pas vous définir vous-même comme inactif."
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "Vous ne pouvez pas vous définir vous-même comme un superutilisateur."
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "Informations sur l'utilisateur mises à jour"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "Impossible de générer le répertoire racine pour l'utilisateur %s."
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "Vous devez être un superutilisateur pour pouvoir ajouter ou modifier un groupe."
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "Informations sur le groupe mises à jour"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "Vous devez être un superutilisateur pour pouvoir modifier les autorisations."
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "Informations d'autorisation mises à jour"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "Vous devez être un superutilisateur pour pouvoir ajouter un autre utilisateur."
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "Une erreur s'est produite lors de la communication avec LDAP"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "Impossible de récupérer les détails LDAP des utilisateurs du modèle %s."
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "Vous devez être un superutilisateur pour pouvoir ajouter un autre groupe."
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "Exception LDAP : %s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "Impossible de récupérer les détails LDAP des groupes du modèle %s."
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "Vous devez être un superutilisateur pour pouvoir synchroniser les utilisateurs/groupes LDAP."
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "L'importation n'est peut-être pas terminée. Recommencez la Synchronisation."
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "Aucun super-utilisateur actif configuré."
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "Vous ne pouvez pas supprimer le dernier superutilisateur actif de la configuration."
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "Utilisateur %s synchronisé depuis Unix"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "Un conflit de dénomination est survenu lors de l'importation de l'utilisateur %(username)s"
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "Un conflit de dénomination est survenu lors de l'importation du groupe %(groupname)s dans le modèle %(groupname_pattern)s"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "Importez des utilisateurs depuis le groupe."
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "Importez des utilisateurs depuis le groupe, mais faites-le également de manière récurrente."
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "Synchronisez les utilisateurs dans le groupe."
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "Serveur avec lequel établir une connexion."
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "Un nom de groupe doit être indiqué."
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "Synchronisez les groupes des utilisateurs."
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "Un nom d'utilisateur doit être indiqué."
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "UID minimum à importer (inclusif)."
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "UID maximum à importer (exclusif)."
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "GID minimum à importer (inclusif)."
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "GID maximum à importer (exclusif)."
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "Indique s'il faut vérifier que le shell de l'utilisateur n'est pas /bin/faux."
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Utilisateurs Hue"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Utilisateurs Hue - Ajouter/Synchroniser un utilisateur LDAP"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "Mettre à jour un utilisateur"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "Ajouter/Synchroniser un utilisateur"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "Sélectionner tout"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "Rechercher"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "Groupes introuvables."
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "Créer un groupe maintenant"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "Confirmer"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "Oui"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "Voulez-vous vraiment supprimer"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "Non"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Groupes Hue"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Groupes Hue - Modifier un groupe : %(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Groupes Hue - Ajouter/Synchroniser un groupe LDAP"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Groupes Hue - Créer un groupe"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "Mettre à jour un groupe"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "Ajouter/Synchroniser un groupe"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "Ajouter un groupe"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "Aucun utilisateur trouvé."
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "Créer un utilisateur maintenant"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "Aucune autorisation trouvée."
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Autorisations Hue"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Autorisations Hue - Modifier une application : %(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "Mettre à jour une autorisation"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Utilisateurs Hue - Modifier un utilisateur : %(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Utilisateurs Hue - Créer un utilisateur"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "Etape 1: Informations de connexion (obligatoire)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "Etape 2 : Noms et groupes"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "Etape 2 : Noms"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "Etape 3: Avancé"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "Précédent"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "Suivant"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "Ajouter un utilisateur"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "Ce champ est obligatoire."
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "Administrateur"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "Utilisateurs"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "Groupes"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "Autorisations"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "Rechercher un nom, des membres, etc."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "Supprimer"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "Ajouter/Synchroniser un groupe LDAP"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "Nom de groupe"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "Membres"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "Modifier %(groupname)s"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "Aucun groupe ne correspond aux critères de recherche."
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "Aucune donnée disponible"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "Aucun enregistrement correspondant"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "Rechercher une application, un groupe, etc."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "Application"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "Autorisation"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "Modifier une autorisation"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "Aucune autorisation ne correspond aux critères de recherche."
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "Rechercher un nom, un groupe, etc."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "Ajouter/Synchroniser un utilisateur LDAP"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "Synchroniser des utilisateurs/groupes LDAP"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "Prénom"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "Nom"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "Courriel"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "Dernière connexion"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "Modifier %(username)s"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "Aucun utilisateur ne correspond aux critères de recherche."
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "Voulez-vous vraiment supprimer le(s) utilisateur(s) sélectionné(s) ?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "Synchroniser des utilisateurs et des groupes LDAP"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Aucun utilisateur ou groupe n'existant pas déjà dans Hue ne sera importé. Seuls les utilisateurs et les groupes importés depuis LDAP peuvent être synchronisés."
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "Toutes les informations utilisateur et les appartenances aux groupes seront mises à jour en fonction de l'état actuel du serveur LDAP."
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "Synchroniser"
+

+ 658 - 0
apps/security/src/security/locale/ja/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# Japanese translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: ja <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "ユーザー名"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "必須。文字数は 30以下。スペースとコロンは使用できません。"
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "スペースと '.' は使用できません。"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "パスワード"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "パスワードの設定"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "ホームディレクトリを作成"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "ホームディレクトリを作成してください(存在しない場合)。"
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "パスワードが一致しません。"
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "新規ユーザーの作成ではパスワードを指定する必要があります。"
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "必須。ユーザー名は 30 文字以下、DN は 64 文字以下とし、スペースとコロンは使用できません。"
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "識別名"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "ユーザーを識別名指定でインポートするかどうかの指定です。"
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "ユーザーのホームディレクトリを作成してください(存在しない場合)。"
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "長すぎます。64 文字以下で %s ではないことが必要です。"
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "長すぎます。30 文字以下で %s ではないことが必要です。"
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "名前"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "必須。80 文字以下であることが必要です。"
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 文字以下であることが必要です。"
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "グループを識別名指定でインポートするかどうかの指定です。"
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "新規メンバーのインポート"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "未インポートユーザーまたは新規ユーザーをグループからインポートします。"
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "ホームディレクトリを作成"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "インポートされる各メンバーのホームディレクトリを作成してください(メンバーをインポートする場合)。"
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "すべてのサブグループから新規メンバーをインポート"
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "未インポートユーザーまたは新規ユーザーをすべてのサブグループからインポートします。"
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "長すぎます。80 文字以下で %s ではないことが必要です"
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "グループ名には文字、数字、ハイフン、またはアンダースコアのみを使用できます。"
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "メンバー"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "パーミッション"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "グループ"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "ホームディレクトリを作成"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "各ユーザーのホームディレクトリを作成してください(存在しない場合)。"
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "%(description)s のためのパーミッションがありません。"
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "ユーザーを削除するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "POST 要求が必要です。"
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "自分自身を削除することはできません。"
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "ユーザーが削除されました。"
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "グループを削除するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "デフォルトのユーザーグループは削除できません。"
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "グループが削除されました。"
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "グループが見つかりません。"
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "別のユーザーを追加または編集するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "ユーザー名は変更できません。"
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "自分自身を非アクティブにすることはできません。"
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "自分自身をスーパーユーザーにすることはできません。"
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "ユーザー情報が更新されました"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "ユーザー %s のホームディレクトリを作成できません。"
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "グループを追加または編集するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "グループ情報が更新されました"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "パーミッションを変更するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "パーミッション情報が更新されました"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "別のユーザーを追加するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "LDAP で通信しているときにエラーが発生しました"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "パターン %s のユーザーの LDAP 詳細を取得できませんでした。"
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "別のグループを追加するにはスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "LDAP 例外:%s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "パターン %s のグループの LDAP 詳細を取得できませんでした"
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "LDAP ユーザー/グループの同期化ではスーパーユーザーであることが必要です。"
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "インポートが完全ではない可能性があります。同期を再度実行してください。"
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "アクティブなスーパーユーザーが未設定です。"
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "設定からアクティブな最後のスーパーユーザーを削除することはできません。"
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "UNIX からユーザー %s を同期しました"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "ユーザー %(username)s のインポート中に名前の競合が発生しました"
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "パターン %(groupname_pattern)s のグループ %(groupname)s をインポートしている間に名前の競合が発生しました"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "グループからユーザーをインポートします。"
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "ユーザーをグループからインポートしますが、この操作を再帰的にも実行します。"
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "グループ内のユーザーを同期します。"
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "接続先のサーバーです。"
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "グループ名を指定する必要があります。"
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "ユーザーのグループを同期します。"
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "ユーザー名を指定する必要があります。"
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "インポートする最小 UID(指定値も含む)"
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "インポートする最大 UID(指定値は除外)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "インポートする最小 GID(指定値も含む)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "インポートする最大 GID(指定値は除外)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "ユーザーのシェルが /bin/false ではないことを確認するかどうかの指定です。"
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Hue ユーザー"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Hue ユーザー - LDAP ユーザーを追加/同期"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "ユーザーを更新"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "ユーザーを追加/同期"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "すべて選択"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "検索"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "グループが見つかりません。"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "新しいグループを今すぐ作成"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "確認"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "はい"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "次を削除してよろしいですか"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "いいえ"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Hue グループ"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Hue グループ - グループの編集:%(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Hue グループ - グループを追加/同期"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Hue グループ - グループを作成"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "グループを更新"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "グループを追加/同期"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "グループを追加"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "ユーザーが見つかりません。"
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "新しいユーザーを今すぐ作成"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "パーミッションが見つかりません。"
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Hue のパーミッション"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Hue のパーミッション - アプリケーションを編集:%(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "パーミッションを更新"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Hue ユーザー - ユーザーを編集:%(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Hue ユーザー - ユーザーを作成"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "手順 1:資格情報(必須)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "手順 2:名前とグループ"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "手順 2:名前"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "手順 3:詳細"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "戻る"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "次へ"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "ユーザーを追加"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "このフィールドは必須です。"
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "ユーザー管理者"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "ユーザー"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "グループ"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "パーミッション"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "名前、メンバーなどを検索..."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "削除"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "LDAP グループを追加/同期"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "グループ名"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "メンバー"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "%(groupname)s の編集"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "検索条件に一致するグループが存在しません。"
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "利用可能なデータがありません"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "一致するレコードがありません"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "アプリケーション、グループなどを検索..."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "アプリケーション"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "パーミッション"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "パーミッションを編集"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "検索条件に一致するパーミッションが存在しません。"
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "名前、グループなどを検索..."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "LDAP ユーザーを追加/同期"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "LDAP ユーザー/グループを同期"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "名"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "姓"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "電子メール"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "最終ログイン"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "%(username)s を編集"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "検索条件に一致するユーザーが存在しません。"
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "選択したユーザーを削除しますか?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "LDAP ユーザー/グループを同期"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Hue にまだ存在しないユーザーおよびグループはインポートされません。LDAP からインポートされたユーザーおよびグループのみを同期できます。"
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "すべてのユーザー情報とグループメンバーシップは、LDAP サーバーの現在の状態に基づいて更新されます。"
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "同期"
+

+ 658 - 0
apps/security/src/security/locale/ko/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# Korean translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: ko <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "사용자 이름"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "필수 입력 항목입니다. 30자 이하로 입력하십시오. 공백이나 콜론은 허용되지 않습니다."
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "공백과 ':'은 허용되지 않습니다."
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "암호"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "암호 확인"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "홈 디렉토리 생성"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "홈 디렉토리가 없으면 생성합니다."
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "암호가 일치하지 않습니다."
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "새 사용자를 생성할 때 암호를 지정해야 합니다."
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "필수 입력 항목입니다. 사용자 이름에는 30자 이하로 입력하십시오. 공백이나 콜론은 허용되지 않습니다."
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "고유 이름"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "사용자를 고유 이름별로 가져올지 여부입니다."
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "사용자의 홈 디렉토리가 없으면 생성합니다."
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "너무 깁니다. 64자 이하여야 하며, %s는 허용되지 않습니다."
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "너무 깁니다. 30자 이하여야 하며, %s는 허용되지 않습니다."
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "이름"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "필수 입력 항목입니다. 80자 이하로 입력하십시오."
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80자 이하로 입력하십시오."
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "그룹을 고유 이름별로 가져올지 여부입니다."
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "새 구성원 가져오기"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "그룹에서 새 사용자 또는 가져오지 않은 사용자를 가져옵니다."
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "홈 디렉토리 생성"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "구성원을 가져올 경우 가져온 모든 구성원의 홈 디렉토리를 생성합니다."
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "모든 하위 그룹에서 새 구성원을 가져옵니다."
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "모든 하위 그룹에서 새 사용자 또는 가져오지 않은 사용자를 가져옵니다."
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "너무 깁니다. 80자 이하여야 하며, %s은(는) 사용할 수 없습니다."
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "그룹 이름에는 문자, 숫자, 하이픈, 밑줄만 포함될 수 있습니다."
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "구성원"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "권한"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "그룹"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "홈 디렉토리 생성"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "이미 있는 경우를 제외하고 모든 사용자의 홈 디렉토리를 생성합니다."
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "%(description)s에 대한 권한이 없습니다."
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "사용자를 삭제하려면 superuser여야 합니다."
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "POST 요청이 필요합니다."
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "자신을 제거할 수는 없습니다."
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "사용자가 삭제되었습니다."
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "그룹을 삭제하려면 superuser여야 합니다."
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "기본 사용자 그룹을 삭제할 수 없습니다."
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "그룹이 삭제되었습니다."
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "그룹을 찾을 수 없습니다."
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "다른 사용자를 추가하거나 편집하려면 superuser여야 합니다."
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "사용자 이름을 변경할 수 없습니다."
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "자신을 비활성화할 수는 없습니다."
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "자신을 수퍼 사용자로 지정할 수는 없습니다."
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "사용자 정보 업데이트됨"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "사용자 %s의 홈 디렉토리를 만들 수 없습니다."
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "그룹을 추가하거나 편집하려면 superuser여야 합니다."
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "그룹 정보 업데이트됨"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "권한을 변경하려면 superuser여야 합니다."
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "권한 정보 업데이트됨"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "다른 사용자를 추가하려면 superuser여야 합니다."
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "LDAP와 통신하는 중 오류가 발생했습니다."
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "패턴이 %s인 사용자의 LDAP 세부 정보를 가져오지 못했습니다."
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "다른 그룹을 추가하려면 superuser여야 합니다."
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "LDAP 예외: %s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "패턴이 %s인 그룹의 LDAP 세부 정보를 가져오지 못했습니다."
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "LDAP 사용자/그룹을 동기화하려면 superuser여야 합니다."
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "가져오기를 완료할 수 없습니다. 다시 동기화하십시오."
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "구성된 활성 superuser가 없습니다."
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "구성에서 마지막 활성 수퍼 사용자를 제거할 수 없습니다."
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "Unix에서 사용자 %s이(가) 업데이트됨"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "사용자 %(username)s을(를) 가져오는 중 이름 충돌이 발생했습니다."
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "패턴이 %(groupname_pattern)s인 그룹 %(groupname)s을(를) 가져오는 중 이름 충돌이 발생했습니다."
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "그룹에서 사용자를 가져옵니다."
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "그룹에서 사용자를 가져올 뿐만 아니라 반복 적용합니다."
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "그룹에 있는 사용자를 동기화합니다."
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "연결할 서버입니다."
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "그룹 이름은 반드시 입력해야 합니다."
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "사용자의 그룹을 동기화합니다."
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "사용자 이름은 반드시 입력해야 합니다."
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "가져올 최소 UID입니다(포함)."
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "가져올 최대 UID입니다(제외)."
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "가져올 최소 GID입니다(포함)."
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "가져올 최대 GID입니다(제외)."
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "사용자의 Shell이 /bin/false가 아닌지를 확인하는 검사 수행 여부입니다."
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Hue 사용자"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Hue 사용자 - LDAP 사용자 추가/동기화"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "사용자 업데이트"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "사용자 추가/동기화"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "취소"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "모두 선택"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "검색"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "그룹을 찾을 수 없습니다."
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "지금 새 그룹 생성"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "확인"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "예"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "삭제하시겠습니까"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "아니요"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Hue 그룹"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Hue 그룹 - 그룹 편집: %(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Hue 그룹 - LDAP 그룹 추가/동기화"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Hue 그룹 - 그룹 생성"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "그룹 업데이트"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "그룹 추가/동기화"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "그룹 추가"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "사용자를 찾을 수 없습니다."
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "지금 새 사용자 생성"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "권한을 찾을 수 없습니다."
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Hue 권한"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Hue 권한 - 앱 편집: %(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "권한 업데이트"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Hue 사용자 - 사용자 편집: %(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Hue 사용자 - 사용자 생성"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "1단계: 자격 증명(필수)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "2단계: 이름 및 그룹"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "2단계: 이름"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "3단계: 고급"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "뒤로"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "다음"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "사용자 추가"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "이 필드는 필수 항목입니다."
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "사용자 관리자"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "사용자"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "그룹"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "권한"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "이름, 구성원 등을 검색합니다."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "삭제"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "LDAP 그룹 추가/동기화"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "그룹 이름"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "구성원"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "%(groupname)s 편집"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "검색 기준과 일치하는 그룹이 없습니다."
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "데이터를 이용할 수 없음"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "일치하는 레코드가 없음"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "애플리케이션, 그룹 등을 검색합니다."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "애플리케이션"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "권한"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "권한 편집"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "검색 기준과 일치하는 권한이 없습니다."
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "이름, 그룹 등을 검색합니다."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "LDAP 사용자 추가/동기화"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "LDAP 사용자/그룹 동기화"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "이름"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "성"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "E-maill"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "마지막 로그인"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "%(username)s 편집"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "검색 기준과 일치하는 사용자가 없습니다."
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "선택한 사용자를 삭제하시겠습니까?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "LDAP 사용자 및 그룹 동기화"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Hue에 없는 사용자 또는 그룹은 가져오지 않습니다. LDAP에서 가져온 사용자 및 그룹만 동기화할 수 있습니다."
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "모든 사용자 정보 및 그룹 구성원 자격이 LDAP 서버의 현재 상태에 따라 업데이트됩니다."
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "동기화"
+

+ 658 - 0
apps/security/src/security/locale/pt/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# Portuguese translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: pt <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "Nome de utilizador"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "Necessário. 30 caracteres ou menos. Sem espaços ou dois pontos."
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "Os espaços e os \":\" não são permitidos"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "Palavra-passe"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "Confirmação da palavra-passe"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "Criar directório inicial"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "Criar directório inicial caso ainda não exista."
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "As palavras-passe não são iguais."
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "Tem de especificar uma palavra-passe ao criar um novo utilizador."
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "Necessário. 30 caracteres ou menos com nome de utilizador. 64 caracteres ou menos com DN. Sem espaço em branco ou dois pontos."
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "Nome distinto"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "Indica se o utilizador deve ou não ser importado por nome distinto."
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "Criar directório inicial para utilizador caso ainda não exista."
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "Longo demais: 64 caracteres ou menos e não %s"
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "Longo demais: 30 caracteres ou menos e não %s."
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "Nome"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "Obrigatório. 80 caracteres ou menos."
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 caracteres ou menos."
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "Indica se o grupo deve ser importado por nome distinto ou não."
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "Importar novos membros"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "Importar utilizadores não importados ou novos a partir do grupo."
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "Criar directórios iniciais"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "Criar directórios iniciais para todos os membros importados, se estiverem a ser importados membros."
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "Importar novos membros de todos os subgrupos"
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "Importar utilizadores novos ou não importados de todos os subgrupos."
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "Longo demais: 80 caracteres ou menos e não %s"
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "O nome do grupo pode conter apenas letras, números, hífenes e underscores."
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "membros"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "permissões"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "grupos"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "Criar Directórios Iniciais"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "Criar directório inicial para todos os utilizadores, caso ainda não exista."
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "Não tem permissões para %(description)s."
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "Tem de ser um super-utilizador para poder eliminar utilizadores."
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "É necessário um pedido POST."
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "Não pode remover-se a si próprio."
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "Os utilizadores foram eliminados."
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "Tem de ser um super-utilizador para poder eliminar grupos."
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "O grupo de utilizadores predefinido não pode ser eliminado."
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "O grupo foi eliminado."
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "Grupo não encontrado."
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "Tem de ser um super-utilizador para poder adicionar ou editar outro utilizador."
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "Não pode alterar um nome de utilizador."
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "Não pode desactivar-se a si próprio."
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "Não pode definir-se a si próprio como super-utilizador."
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "Informações de utilizador actualizadas"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "Não é possível criar o directório inicial para o utilizador %s."
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "Tem de ser um super-utilizador para poder adicionar ou editar um grupo."
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "Informações de grupo actualizadas"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "Tem de ser um super-utilizador para poder alterar permissões."
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "Informações de permissão actualizadas"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "Tem de ser um super-utilizador para poder adicionar outro utilizador."
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "Ocorreu um erro ao comunicar com o LDAP"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "Não foi possível obter os detalhes LDAP dos utilizadores no padrão %s."
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "Tem de ser um super-utilizador para poder adicionar outro grupo."
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "Excepção LDAP: %s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "Não foi possível obter os detalhes LDAP dos grupos no padrão %s"
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "Tem de ser um super-utilizador para poder sincronizar utilizadores/grupos de LDAP."
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "A importação pode não estar completa; sincronize novamente."
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "Não existe um super-utilizador activo configurado."
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "Não é possível eliminar o último super-utilizador activo da configuração."
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "Utilizador %s sincronizado do Unix"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "Ocorreu um conflito de nomes ao importar o utilizador %(username)s"
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "Ocorreu um conflito de nomes ao importar o grupo %(groupname)s no padrão %(groupname_pattern)s"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "Importar utilizadores do grupo."
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "Importar utilizadores do grupo, mas também fazê-lo repetidamente."
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "Sincronizar utilizadores no grupo."
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "Servidor ao qual ligar."
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "É necessário indicar um nome de grupo."
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "Sincronizar grupos de utilizadores."
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "É necessário indicar um nome de utilizador."
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "UID mínimo a importar (incluído)."
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "UID máximo a importar (não incluído)."
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "GID mínimo a importar (incluído)."
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "GID máximo a importar (não incluído)."
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "Verificar ou não se a shell do utilizador não é /bin/false."
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Utilizadores da Hue"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Utilizadores da Hue - Adicionar/Sinc. utilizador LDAP"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "Actualizar utilizador"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "Adicionar/Sincronizar utilizador"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "Seleccionar tudo"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "Pesquisar"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "Não foram encontrados grupos."
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "Criar um novo grupo agora"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "Sim"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "Tem a certeza de que pretende eliminar"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "Não"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Grupos da Hue"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Grupos da Hue - Editar grupo: %(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Grupos da Hue - Adicionar/Sinc. grupo LDAP"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Grupos da Hue - Criar grupo"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "Actualizar grupo"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "Adicionar/Sinc. grupo"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "Adicionar grupo"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "Não foram encontrados utilizadores."
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "Criar um novo utilizador agora"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "Não foram encontradas permissões."
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Permissões da Hue"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Permissões da Hue - Editar aplicação: %(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "Actualizar permissão"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Utilizadores da Hue - Editar utilizador: %(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Utilizadores da Hue - Criar utilizador"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "Passo 1: credenciais (obrigatórias)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "Passo 2: nomes e grupos"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "Passo 2: nomes"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "Passo 3: avançado"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "Voltar"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "Seguinte"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "Adicionar utilizador"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "Este campo é obrigatório."
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "Utilizador admin"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "Utilizadores"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "Grupos"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "Permissões"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "Pesquisar por nome, membros, etc..."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "Adicionar/Sinc. grupo LDAP"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "Nome do grupo"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "Membros"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "Editar %(groupname)s"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "Não existem grupos que correspondam aos critérios de pesquisa."
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "Não existem dados disponíveis"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "Não existem registos correspondentes"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "Pesquisar por aplicação, grupo, etc..."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "Aplicação"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "Permissão"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "Editar permissão"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "Não existem permissões que correspondam aos critérios de pesquisa."
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "Pesquisar por nome, grupo, etc..."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "Adicionar/sincronizar utilizador LDAP"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "Sincronizar utilizadores/grupos LDAP"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "Primeiro nome"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "Último nome"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "E-mail"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "Último início de sessão"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "Editar %(username)s"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "Não existem utilizadores que correspondam aos critérios de pesquisa."
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "Tem a certeza de que pretende eliminar os utilizadores seleccionados?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "Sincronizar utilizadores e grupos de LDAP"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Esta acção não importará nenhum utilizador ou grupo que não exista no Hue. Só é possível sincronizar utilizadores e grupos importados do LDAP."
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "Todas as informações do utilizador e associações de grupo serão actualizadas com base no estado actual do servidor LDAP."
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "Sincronizar"
+

+ 658 - 0
apps/security/src/security/locale/pt_BR/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# Portuguese (Brazil) translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: pt_BR <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "Nome de usuário"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "Obrigatório. 30 caracteres ou menos. Sem espaços em branco ou dois pontos."
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "Espaços em branco e ':' não são permitidos"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "Senha"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "Confirmação de senha"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "Criar diretório inicial"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "Criar diretório inicial se ainda não existir um."
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "As senhas não coincidem."
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "Você deve especificar uma senha quando criar um novo usuário."
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "Obrigatório. 30 caracteres ou menos no nome de usuário. 64 caracteres ou menos com DN. Sem espaços em branco ou dois-pontos."
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "Nome distinto"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "Se o usuário deve ser importado ou não por um nome distinto."
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "Criar diretório inicial para o usuário se ainda não existir um."
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "Longo demais: 64 caracteres ou menos e não %s."
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "Longo demais: 30 caracteres ou menos e não %s."
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "Nome"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "Obrigatório. 80 caracteres ou menos."
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 caracteres ou menos."
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "Se o grupo deve ser importado ou não por um nome distinto."
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "Importar novos membros"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "Importar usuários não importados ou novos do grupo."
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "Criar diretórios iniciais"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "Criar diretórios iniciais para cada membro importado, se os membros estiverem sendo importados."
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "Importar membros novos de todos os subgrupos"
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "Importar usuários não importados ou novos de todos os subgrupos."
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "Longo demais: 80 caracteres ou menos e não %s"
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "O nome do grupo pode conter somente letras, números, hífens ou sublinhados."
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "membros"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "permissões"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "grupos"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "Criar diretórios iniciais"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "Criar diretório inicial para cada usuário, se ainda não houver um."
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "Você não tem permissões para %(description)s."
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "Você deve ser um superusuário para excluir usuários."
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "É necessária uma solicitação POST."
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "Não é possível remover a si mesmo."
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "Os usuários foram excluídos."
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "Você deve ser um superusuário para excluir grupos."
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "O grupo de usuários padrão não pode ser excluído."
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "O grupo foi excluído."
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "Grupo não encontrado."
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "Você deve ser um superusuário para adicionar ou editar outro usuário."
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "Não é possível alterar um nome de usuário."
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "Não é possível desativar a si próprio."
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "Não é possível definir-se a si próprio como superusuário."
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "Informações do usuário atualizadas."
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "Não é possível criar o diretório inicial para o usuário %s."
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "Você deve ser um superusuário para adicionar ou editar um grupo."
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "Informações do grupo atualizadas"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "Você deve ser um superusuário para alterar as permissões."
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "Informações de permissão atualizadas"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "Você deve ser um superusuário para adicionar outro usuário."
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "Ocorreu um erro ao comunicar com o LDAP"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "Não foi possível obter os detalhes do LDAP para os usuários no padrão %s."
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "Você deve ser um superusuário para adicionar outro grupo."
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "Exceção de LDAP: %s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "Não foi possível obter detalhes de LDAP grupos no padrão %s"
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "Você deve ser um superusuário para sincronizar os usuários/grupos do LDAP."
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "A importação pode não estar completa, sincronize novamente."
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "Nenhum superusuário ativo configurado."
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "Você não pode remover o último superusuário ativo da configuração."
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "Usuário %s sincronizado no Unix"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "Ocorreu um conflito de nomes ao importar o usuário %(username)s"
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "Houve um conflito de nomes durante a importação do grupo %(groupname)s no padrão %(groupname_pattern)s"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "Importar usuários do grupo."
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "Importar usuários do grupo, de maneira recorrente."
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "usuários Sync no grupo."
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "Conectar servidor a."
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "Deve ser fornecido um nome de grupo."
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "Grupos Sync dos usuários"
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "Deve ser fornecido um nome de usuário."
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "Mínimo de UID a ser importado (inclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "Máximo de UID a ser importado (exclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "Mínimo de GID a ser importado (inclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "Máximo de GID a ser importado (exclusivo)."
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "Se deve ser verificado que o shell do usuário não é /bin/false."
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Usuários de Hue"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Usuários de Hue - Adicionar/sincronizar usuário de LDAP"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "Atualizar usuário"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "Adicionar/sincronizar usuário"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "Selecionar todos"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "Pesquisar"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "Nenhum grupo encontrado."
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "Criar um novo grupo agora"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "Sim"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "Tem certeza de que deseja excluir"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "Não"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Grupos de Hue"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Grupos de Hue - Editar grupo: %(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Grupos de Hue - Adicionar/sincronizar grupo de LDAP"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Grupos de Hue - Criar grupo"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "Atualizar grupo"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "Adicionar/sincronizar grupo"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "Adicionar grupo"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "Nenhum usuário encontrado."
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "Criar um novo usuário agora"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "Nenhuma permissão encontrada."
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Permissões do Hue"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Permissões de Hue - Editar aplicativo: %(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "Atualizar permissão"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Usuários de Hue - Editar usuário %(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Usuários de Hue - Criar usuário"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "Etapa 1: Credenciais (obrigatório)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "Etapa 2: Nomes e Grupos"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "Etapa 2: Nomes"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "Etapa 3: Avançado"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "Voltar"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "Próximo"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "Adicionar usuário"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "Este campo é obrigatório."
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "Admin do usuário"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "Usuários"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "Grupos"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "Permissões"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "Pesquisar por nome, membros, etc..."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "Excluir"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "Adicionar/sincronizar grupo de LDAP"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "Nome do grupo"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "Membros"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "Editar %(groupname)s"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "Não há grupos que correspondam aos critérios da pesquisa."
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "Nenhum dado disponível"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "Nenhum registro correspondente"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "Pesquisar por aplicativo, grupo, etc..."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "Aplicação"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "Permissão"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "Editar permissão"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "Não há permissões que correspondam aos critérios da pesquisa."
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "Pesquisar por nome, grupo, etc..."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "Adicionar/sincronizar usuário de LDAP"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "Sincronizar usuários/grupos de LDAP"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "Nome"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "Sobrenome"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "E-mail"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "Último login"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "Editar %(username)s"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "Não há usuários que correspondam aos critérios da pesquisa."
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "Tem certeza de que deseja excluir o(s) usuário(s) selecionado(s)?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "Sincronizar usuários e grupos do LDAP"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "Essa ação não importará nenhum usuário ou grupo que não exista no Hue. Somente usuários e grupos importados do LDAP podem ser sincronizados."
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "Todas as informações de usuários e associações de grupos serão atualizadas com base no estado atual do servidor LDAP."
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "Sincronizar"
+

+ 658 - 0
apps/security/src/security/locale/zh_CN/LC_MESSAGES/django.po

@@ -0,0 +1,658 @@
+# Chinese (China) translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-05-29 17:10-0700\n"
+"PO-Revision-Date: 2012-07-30 18:47-0700\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: zh_CN <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/security/forms.py:51 src/security/forms.py:121
+#: src/security/templates/list_users.mako:71
+msgid "Username"
+msgstr "用户名"
+
+#: src/security/forms.py:54
+msgid "Required. 30 characters or fewer. No whitespaces or colons."
+msgstr "必填。30 个或更少字符。无空格或冒号。"
+
+#: src/security/forms.py:55 src/security/forms.py:124
+msgid "Whitespaces and ':' not allowed"
+msgstr "不允许使用空格和 ':'"
+
+#: src/security/forms.py:56
+msgid "Password"
+msgstr "密码"
+
+#: src/security/forms.py:57
+msgid "Password confirmation"
+msgstr "确认密码"
+
+#: src/security/forms.py:58 src/security/forms.py:130
+msgid "Create home directory"
+msgstr "创建主目录"
+
+#: src/security/forms.py:59
+msgid "Create home directory if one doesn't already exist."
+msgstr "如果不存在主目录,应创建。"
+
+#: src/security/forms.py:79
+msgid "Passwords do not match."
+msgstr "密码不匹配。"
+
+#: src/security/forms.py:85
+msgid "You must specify a password when creating a new user."
+msgstr "创建新用户时必须指定密码。"
+
+#: src/security/forms.py:123
+msgid "Required. 30 characters or fewer with username. 64 characters or fewer with DN. No whitespaces or colons."
+msgstr "必填。用户名最多为 30 个字符。DN 最多为 64 个字符。无空格或冒号。"
+
+#: src/security/forms.py:125 src/security/forms.py:168
+msgid "Distinguished name"
+msgstr "可分辨名称"
+
+#: src/security/forms.py:126
+#: src/security/management/commands/import_ldap_group.py:38
+#: src/security/management/commands/import_ldap_user.py:35
+msgid "Whether or not the user should be imported by distinguished name."
+msgstr "是否按可分辨名称导入用户。"
+
+#: src/security/forms.py:131
+msgid "Create home directory for user if one doesn't already exist."
+msgstr "如果不存在用户主目录,应创建。"
+
+#: src/security/forms.py:147
+#, python-format
+msgid "Too long: 64 characters or fewer and not %s."
+msgstr "过长:最多 64 个字符,且不是 %s。"
+
+#: src/security/forms.py:153
+#, python-format
+msgid "Too long: 30 characters or fewer and not %s."
+msgstr "过长:最多 30 个字符,且不是 %s。"
+
+#: src/security/forms.py:163
+msgid "Name"
+msgstr "名称"
+
+#: src/security/forms.py:166
+msgid "Required. 80 characters or fewer."
+msgstr "必填。80 个或更少字符。"
+
+#: src/security/forms.py:167
+msgid "80 characters or fewer."
+msgstr "80 个或更少字符。"
+
+#: src/security/forms.py:169
+msgid "Whether or not the group should be imported by distinguished name."
+msgstr "是否按可分辨名称导入组。"
+
+#: src/security/forms.py:173
+msgid "Import new members"
+msgstr "导入新成员"
+
+#: src/security/forms.py:174
+msgid "Import unimported or new users from the group."
+msgstr "从组导入未导入的用户或新用户。"
+
+#: src/security/forms.py:177
+msgid "Create home directories"
+msgstr "创建主目录"
+
+#: src/security/forms.py:178
+msgid "Create home directories for every member imported, if members are being imported."
+msgstr "为导入的每个成员创建主目录(如果成员已导入)。"
+
+#: src/security/forms.py:181
+msgid "Import new members from all subgroups"
+msgstr "从所有子组导入新用户。"
+
+#: src/security/forms.py:182
+msgid "Import unimported or new users from the all subgroups."
+msgstr "从所有子组导入未导入的用户或新用户。"
+
+#: src/security/forms.py:198
+#, python-format
+msgid "Too long: 80 characters or fewer and not %s"
+msgstr "过长:最多 80 个字符,且不是 %s"
+
+#: src/security/forms.py:220
+msgid "Group name may only contain letters, numbers, hyphens or underscores."
+msgstr "组名称只能包含字母、数字、连字符或下划线。"
+
+#: src/security/forms.py:235
+msgid "members"
+msgstr "成员"
+
+#: src/security/forms.py:236
+msgid "permissions"
+msgstr "权限"
+
+#: src/security/forms.py:279
+msgid "groups"
+msgstr "组"
+
+#: src/security/forms.py:314
+msgid "Create Home Directories"
+msgstr "创建主目录"
+
+#: src/security/forms.py:315
+msgid "Create home directory for every user, if one doesn't already exist."
+msgstr "如果不存在每位用户的主目录,应创建。"
+
+#: src/security/models.py:128
+#, python-format
+msgid "You do not have permissions to %(description)s."
+msgstr "您没有 %(description)s 的权限。"
+
+#: src/security/views.py:114
+msgid "You must be a superuser to delete users."
+msgstr "您必须是超级用户才能删除用户。"
+
+#: src/security/views.py:117
+msgid "A POST request is required."
+msgstr "需要 POST 请求。"
+
+#: src/security/views.py:124
+msgid "You cannot remove yourself."
+msgstr "您不能删除自己。"
+
+#: src/security/views.py:131
+msgid "The users were deleted."
+msgstr "用户已删除。"
+
+#: src/security/views.py:137
+msgid "You must be a superuser to delete groups."
+msgstr "您必须是超级用户才能删除组。"
+
+#: src/security/views.py:150
+msgid "The default user group may not be deleted."
+msgstr "默认用户组不可删除。"
+
+#: src/security/views.py:155
+msgid "The group was deleted."
+msgstr "组已删除。"
+
+#: src/security/views.py:158
+msgid "Group not found."
+msgstr "未找到组。"
+
+#: src/security/views.py:173
+msgid "You must be a superuser to add or edit another user."
+msgstr "您必须是超级用户才能添加或编辑其他用户。"
+
+#: src/security/views.py:193
+msgid "You cannot change a username."
+msgstr "您无法更改用户名。"
+
+#: src/security/views.py:195
+msgid "You cannot make yourself inactive."
+msgstr "您不能让自己处于非活动状态。"
+
+#: src/security/views.py:207
+msgid "You cannot make yourself a superuser."
+msgstr "您不能让自己成为超级用户。"
+
+#: src/security/views.py:211
+msgid "User information updated"
+msgstr "已更新用户信息"
+
+#: src/security/views.py:220 src/security/views.py:329
+#, python-format
+msgid "Cannot make home directory for user %s."
+msgstr "无法为用户 %s 创建主目录。"
+
+#: src/security/views.py:248
+msgid "You must be a superuser to add or edit a group."
+msgstr "您必须是超级用户才能添加或编辑组。"
+
+#: src/security/views.py:259
+msgid "Group information updated"
+msgstr "已更新组信息"
+
+#: src/security/views.py:282
+msgid "You must be a superuser to change permissions."
+msgstr "您必须是超级用户才能更改权限。"
+
+#: src/security/views.py:290
+msgid "Permission information updated"
+msgstr "已更新权限信息"
+
+#: src/security/views.py:309
+msgid "You must be a superuser to add another user."
+msgstr "您必须是超级用户才能添加其他用户。"
+
+#: src/security/views.py:322 src/security/views.py:368
+#: src/security/views.py:412
+msgid "There was an error when communicating with LDAP"
+msgstr "与 LDAP 通信时出错"
+
+#: src/security/views.py:333
+#, python-format
+msgid "Could not get LDAP details for users in pattern %s."
+msgstr "无法获取用户 %s 的 LDAP 详细信息。"
+
+#: src/security/views.py:353
+msgid "You must be a superuser to add another group."
+msgstr "您必须是超级用户才能添加其他组。"
+
+#: src/security/views.py:367
+#, python-format
+msgid "LDAP Exception: %s"
+msgstr "LDAP 例外情况:%s"
+
+#: src/security/views.py:374
+#, python-format
+msgid "Could not get LDAP details for groups in pattern %s"
+msgstr "无法获取组 %s 的 LDAP 详细信息"
+
+#: src/security/views.py:391
+msgid "You must be a superuser to sync the LDAP users/groups."
+msgstr "您必须是超级用户才能同步 LDAP 用户/组。"
+
+#: src/security/views.py:420
+msgid "The import may not be complete, sync again."
+msgstr "导入可能不完整,再次同步。"
+
+#: src/security/views.py:441
+msgid "No active superuser configured."
+msgstr "未配置活动的超级用户。"
+
+#: src/security/views.py:443
+msgid "You cannot remove the last active superuser from the configuration."
+msgstr "您无法从配置中删除最后一个活动的超级用户。"
+
+#: src/security/views.py:501
+#, python-format
+msgid "Synced user %s from Unix"
+msgstr "从 Unix 同步的用户 %s"
+
+#: src/security/views.py:530
+#, python-format
+msgid "There was a naming conflict while importing user %(username)s"
+msgstr "导入用户 %(username)s 时发生命名冲突"
+
+#: src/security/views.py:672 src/security/views.py:721
+#, python-format
+msgid "There was a naming conflict while importing group %(groupname)s in pattern %(groupname_pattern)s"
+msgstr "导入以 %(groupname_pattern)s 形式命名的组 %(groupname)s 时发生命名冲突"
+
+#: src/security/management/commands/import_ldap_group.py:42
+msgid "Import users from the group."
+msgstr "从组导入用户。"
+
+#: src/security/management/commands/import_ldap_group.py:45
+msgid "Import users from the group, but also do so recursively."
+msgstr "从组导入用户,但也要如此循环执行。"
+
+#: src/security/management/commands/import_ldap_group.py:48
+msgid "Sync users in the group."
+msgstr "同步组中的用户。"
+
+#: src/security/management/commands/import_ldap_group.py:51
+#: src/security/management/commands/import_ldap_user.py:42
+#: src/security/management/commands/sync_ldap_users_and_groups.py:37
+msgid "Server to connect to."
+msgstr "要连接到的服务器。"
+
+#: src/security/management/commands/import_ldap_group.py:60
+msgid "A group name must be provided."
+msgstr "必须提供组名称。"
+
+#: src/security/management/commands/import_ldap_user.py:39
+msgid "Sync groups of the users."
+msgstr "同步用户组。"
+
+#: src/security/management/commands/import_ldap_user.py:51
+msgid "A username must be provided."
+msgstr "必须提供用户名。"
+
+#: src/security/management/commands/security_sync_with_unix.py:31
+msgid "Minimum UID to import (Inclusive)."
+msgstr "要导入的最小 UID(包括)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:32
+msgid "Maximum UID to import (Exclusive)."
+msgstr "要导入的最大 UID(排除)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:33
+msgid "Minimum GID to import (Inclusive)."
+msgstr "要导入的最小 GID(包括)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:34
+msgid "Maximum GID to import (Exclusive)."
+msgstr "要导入的最大 GID(排除)。"
+
+#: src/security/management/commands/security_sync_with_unix.py:35
+msgid "Whether or not to check that the user's shell is not /bin/false."
+msgstr "是否检查用户的 shell 是否为 /bin/false。"
+
+#: src/security/templates/add_ldap_users.mako:25
+#: src/security/templates/edit_user.mako:23
+#: src/security/templates/list_users.mako:25
+#: src/security/templates/list_users.mako:30
+msgid "Hue Users"
+msgstr "Hue 用户"
+
+#: src/security/templates/add_ldap_users.mako:31
+msgid "Hue Users - Add/Sync LDAP user"
+msgstr "Hue 用户 - 添加/同步 LDAP 用户"
+
+#: src/security/templates/add_ldap_users.mako:47
+#: src/security/templates/edit_user.mako:78
+msgid "Update user"
+msgstr "更新用户"
+
+#: src/security/templates/add_ldap_users.mako:49
+msgid "Add/Sync user"
+msgstr "添加/同步用户"
+
+#: src/security/templates/add_ldap_users.mako:51
+#: src/security/templates/edit_group.mako:77
+#: src/security/templates/edit_permissions.mako:57
+#: src/security/templates/sync_ldap_users_groups.mako:51
+msgid "Cancel"
+msgstr "取消"
+
+#: src/security/templates/add_ldap_users.mako:60
+#: src/security/templates/edit_group.mako:86
+#: src/security/templates/edit_group.mako:93
+#: src/security/templates/edit_permissions.mako:66
+#: src/security/templates/edit_user.mako:93
+msgid "Select all"
+msgstr "全选"
+
+#: src/security/templates/add_ldap_users.mako:61
+#: src/security/templates/edit_group.mako:87
+#: src/security/templates/edit_group.mako:94
+#: src/security/templates/edit_permissions.mako:67
+#: src/security/templates/edit_user.mako:94
+msgid "Search"
+msgstr "搜索"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_permissions.mako:68
+#: src/security/templates/edit_user.mako:95
+msgid "No groups found."
+msgstr "未找到组。"
+
+#: src/security/templates/add_ldap_users.mako:62
+#: src/security/templates/edit_user.mako:95
+msgid "Create a new group now"
+msgstr "现在创建一个新组"
+
+#: src/security/templates/confirm.mako:22
+msgid "Confirm"
+msgstr "确认"
+
+#: src/security/templates/confirm.mako:25
+#: src/security/templates/delete_group.mako:26
+#: src/security/templates/list_users.mako:128
+msgid "Yes"
+msgstr "是"
+
+#: src/security/templates/delete_group.mako:22
+msgid "Are you sure you want to delete"
+msgstr "是否确定要删除"
+
+#: src/security/templates/delete_group.mako:22
+msgid "?"
+msgstr "?"
+
+#: src/security/templates/delete_group.mako:25
+#: src/security/templates/list_users.mako:127
+msgid "No"
+msgstr "否"
+
+#: src/security/templates/edit_group.mako:26
+#: src/security/templates/list_groups.mako:25
+#: src/security/templates/list_groups.mako:30
+msgid "Hue Groups"
+msgstr "Hue 组"
+
+#: src/security/templates/edit_group.mako:48
+#, python-format
+msgid "Hue Groups - Edit group: %(name)s"
+msgstr "Hue 组 - 编辑组:%(name)s"
+
+#: src/security/templates/edit_group.mako:51
+msgid "Hue Groups - Add/Sync LDAP group"
+msgstr "Hue 组 - 添加/同步 LDAP 组"
+
+#: src/security/templates/edit_group.mako:53
+msgid "Hue Groups - Create group"
+msgstr "Hue 组 - 创建组"
+
+#: src/security/templates/edit_group.mako:69
+msgid "Update group"
+msgstr "更新组"
+
+#: src/security/templates/edit_group.mako:72
+msgid "Add/Sync group"
+msgstr "添加/同步组"
+
+#: src/security/templates/edit_group.mako:74
+#: src/security/templates/list_groups.mako:46
+msgid "Add group"
+msgstr "添加组"
+
+#: src/security/templates/edit_group.mako:88
+msgid "No users found."
+msgstr "未找到用户。"
+
+#: src/security/templates/edit_group.mako:88
+msgid "Create a new user now"
+msgstr "立即创建一个新用户"
+
+#: src/security/templates/edit_group.mako:95
+msgid "No permissions found."
+msgstr "未找到权限。"
+
+#: src/security/templates/edit_permissions.mako:23
+#: src/security/templates/list_permissions.mako:26
+#: src/security/templates/list_permissions.mako:31
+msgid "Hue Permissions"
+msgstr "Hue 权限"
+
+#: src/security/templates/edit_permissions.mako:44
+#, python-format
+msgid "Hue Permissions - Edit app: %(app)s"
+msgstr "Hue 权限 - 编辑应用程序:%(app)s"
+
+#: src/security/templates/edit_permissions.mako:56
+msgid "Update permission"
+msgstr "更新权限"
+
+#: src/security/templates/edit_user.mako:29
+#, python-format
+msgid "Hue Users - Edit user: %(username)s"
+msgstr "Hue 用户 - 编辑用户:%(username)s"
+
+#: src/security/templates/edit_user.mako:31
+msgid "Hue Users - Create user"
+msgstr "Hue 用户 - 创建用户"
+
+#: src/security/templates/edit_user.mako:38
+msgid "Step 1: Credentials (required)"
+msgstr "步骤 1:凭据(必需)"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names and Groups"
+msgstr "步骤 2:名称和组"
+
+#: src/security/templates/edit_user.mako:39
+msgid "Step 2: Names"
+msgstr "第 2 步:名称"
+
+#: src/security/templates/edit_user.mako:42
+msgid "Step 3: Advanced"
+msgstr "第 3 步:高级"
+
+#: src/security/templates/edit_user.mako:74
+msgid "Back"
+msgstr "返回"
+
+#: src/security/templates/edit_user.mako:75
+msgid "Next"
+msgstr "下一页"
+
+#: src/security/templates/edit_user.mako:80
+#: src/security/templates/list_users.mako:45
+msgid "Add user"
+msgstr "添加用户"
+
+#: src/security/templates/edit_user.mako:146
+msgid "This field is required."
+msgstr "此字段为必填字段。"
+
+#: src/security/templates/layout.mako:59
+msgid "User Admin"
+msgstr "用户管理员"
+
+#: src/security/templates/layout.mako:63
+msgid "Users"
+msgstr "用户"
+
+#: src/security/templates/layout.mako:64
+#: src/security/templates/list_permissions.mako:44
+#: src/security/templates/list_users.mako:75
+msgid "Groups"
+msgstr "组"
+
+#: src/security/templates/layout.mako:65
+#: src/security/templates/list_groups.mako:69
+msgid "Permissions"
+msgstr "权限"
+
+#: src/security/templates/list_groups.mako:35
+msgid "Search for name, members, etc..."
+msgstr "搜索名称、成员等..."
+
+#: src/security/templates/list_groups.mako:39
+#: src/security/templates/list_groups.mako:40
+#: src/security/templates/list_users.mako:39
+#: src/security/templates/list_users.mako:40
+msgid "Delete"
+msgstr "删除"
+
+#: src/security/templates/list_groups.mako:49
+msgid "Add/Sync LDAP group"
+msgstr "添加/同步 LDAP 组"
+
+#: src/security/templates/list_groups.mako:67
+msgid "Group Name"
+msgstr "组名称"
+
+#: src/security/templates/list_groups.mako:68
+msgid "Members"
+msgstr "成员"
+
+#: src/security/templates/list_groups.mako:85
+#, python-format
+msgid "Edit %(groupname)s"
+msgstr "编辑 %(groupname)s"
+
+#: src/security/templates/list_groups.mako:101
+msgid "There are no groups matching the search criteria."
+msgstr "没有符合搜索条件的组。"
+
+#: src/security/templates/list_groups.mako:129
+#: src/security/templates/list_permissions.mako:91
+#: src/security/templates/list_users.mako:167
+msgid "No data available"
+msgstr "没有可用数据"
+
+#: src/security/templates/list_groups.mako:130
+#: src/security/templates/list_permissions.mako:92
+#: src/security/templates/list_users.mako:168
+msgid "No matching records"
+msgstr "没有匹配记录"
+
+#: src/security/templates/list_permissions.mako:35
+msgid "Search for application, group, etc..."
+msgstr "搜索应用程序、组等..."
+
+#: src/security/templates/list_permissions.mako:42
+msgid "Application"
+msgstr "应用程序"
+
+#: src/security/templates/list_permissions.mako:43
+msgid "Permission"
+msgstr "权限"
+
+#: src/security/templates/list_permissions.mako:53
+msgid "Edit permission"
+msgstr "编辑权限"
+
+#: src/security/templates/list_permissions.mako:69
+msgid "There are no permissions matching the search criteria."
+msgstr "没有符合搜索条件的权限。"
+
+#: src/security/templates/list_users.mako:35
+msgid "Search for name, group, etc..."
+msgstr "搜索名称、组等..."
+
+#: src/security/templates/list_users.mako:49
+msgid "Add/Sync LDAP user"
+msgstr "添加/同步 LDAP 用户"
+
+#: src/security/templates/list_users.mako:52
+msgid "Sync LDAP users/groups"
+msgstr "同步 LDAP 用户/组"
+
+#: src/security/templates/list_users.mako:72
+msgid "First Name"
+msgstr "名字"
+
+#: src/security/templates/list_users.mako:73
+msgid "Last Name"
+msgstr "姓氏"
+
+#: src/security/templates/list_users.mako:74
+msgid "E-mail"
+msgstr "电子邮件"
+
+#: src/security/templates/list_users.mako:76
+msgid "Last Login"
+msgstr "上次登录"
+
+#: src/security/templates/list_users.mako:90
+#, python-format
+msgid "Edit %(username)s"
+msgstr "编辑 %(username)s"
+
+#: src/security/templates/list_users.mako:109
+msgid "There are no users matching the search criteria."
+msgstr "没有符合搜索条件的用户。"
+
+#: src/security/templates/list_users.mako:124
+msgid "Are you sure you want to delete the selected user(s)?"
+msgstr "是否确定要删除所选用户?"
+
+#: src/security/templates/sync_ldap_users_groups.mako:39
+msgid "Sync LDAP users and groups"
+msgstr "同步 LDAP 用户和组"
+
+#: src/security/templates/sync_ldap_users_groups.mako:43
+msgid "This will not import any users or groups that don't already exist in Hue. Only users and groups imported from LDAP can be synced."
+msgstr "这不会导入 Hue 中不存在的任何用户或组。只能同步从 LDAP 导入的用户和组。"
+
+#: src/security/templates/sync_ldap_users_groups.mako:44
+msgid "All user information and group memberships will be updated based on the LDAP server's current state."
+msgstr "所有用户信息和组成员身份将根据 LDAP 服务器的当前状态进行更新。"
+
+#: src/security/templates/sync_ldap_users_groups.mako:52
+msgid "Sync"
+msgstr "同步"
+

+ 15 - 0
apps/security/src/security/management/__init__.py

@@ -0,0 +1,15 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 15 - 0
apps/security/src/security/management/commands/__init__.py

@@ -0,0 +1,15 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 15 - 0
apps/security/src/security/migrations/__init__.py

@@ -0,0 +1,15 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 16 - 0
apps/security/src/security/models.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 28 - 0
apps/security/src/security/settings.py

@@ -0,0 +1,28 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+DJANGO_APPS = [ "security" ]
+NICE_NAME = "Hadoop Security"
+REQUIRES_HADOOP = False
+ICON = "/security/static/art/icon_security_24.png"
+MENU_INDEX = 61
+
+IS_URL_NAMESPACED = True
+
+
+#PERMISSION_ACTIONS = (
+#  ("access_view:security:edit_user", "Access to profile page on User Admin"),
+#)

+ 82 - 0
apps/security/src/security/templates/index.mako

@@ -0,0 +1,82 @@
+## Licensed to Cloudera, Inc. under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  Cloudera, Inc. licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+##
+##     http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+
+<%!
+from desktop.views import commonheader, commonfooter
+from django.utils.translation import ugettext as _
+%>
+
+
+<%namespace name="layout" file="layout.mako" />
+
+${ commonheader(_('Hadoop Security'), "security", user) | n,unicode }
+${ layout.menubar(section='hive') }
+
+
+<div class="container-fluid">
+  <div class="row-fluid">
+    <div class="span2">
+      <div class="sidebar-nav">
+        <ul class="nav nav-list">
+          <li class="nav-header">${ _('Properties') }</li>
+          <li class="active"><a href="#properties"><i class="fa fa-eye"></i> ${ _('View') }</a></li>
+          <li><a href="#listDataset"><i class="fa fa-group"></i> ${ _('Groups') }</a></li>
+          <li><a href="#listDataset"><i class="fa fa-cubes"></i> ${ _('Roles') }</a></li>
+        </ul>
+      </div>
+    </div>
+    <div class="span10">
+      <div class="card card-small">
+        <h1 class="card-heading simple">${ _('View') }</h1>
+        <div class="card-body">
+          Assist: 
+          ${ assist }        
+        <div>
+        <div class="card-body">     
+          Hadoop Groups: 
+          ${ hadoop_groups }
+        <div>            
+        <div class="card-body">     
+          Roles: 
+          ${ roles }
+        <div>      
+        <div class="form-actions" id="bottom-nav">
+          <a id="backBtn" class="btn disabled">${ _('Back') }</a>
+          <a id="nextBtn" class="btn btn-primary disable-feedback">${ _('Next') }</a>
+        </div>
+
+        </div>
+
+        <div id="listDataset" class="section hide">
+          <div class="alert alert-info"><h3>${ _('Existing datasets') }</h3></div>
+        </div>
+
+        <div id="listHistory" class="section hide">
+          <div class="alert alert-info"><h3>${ _('History') }</h3></div>          
+        </div>
+
+      </form>
+
+    </div>
+    </div>
+
+  </div>
+
+</div>
+
+
+
+${ commonfooter(messages) | n,unicode }

+ 17 - 0
apps/security/src/security/tests.py

@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

+ 4 - 20
desktop/libs/libsentry/src/libsentry/views.py → apps/security/src/security/urls.py

@@ -15,25 +15,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import json
+from django.conf.urls.defaults import patterns, url
 
-from django.http import HttpResponse
 
-from libsentry import conf
-from libsentry.client import SentryClient
-
-
-def roles(request):
-  response = {
-    'code': -1
-  }
-
-  try:
-    client = SentryClient(conf.HOSTNAME.get(), conf.PORT.get(), request.user)
-    response['roles'] = client.roles()
-    response['code'] = 0
-  except Exception, e:
-    response['code'] = 1
-    response['error'] = e.message
-
-  return HttpResponse(json.dumps(response), mimetype="application/json", status=200)
+urlpatterns = patterns('security.views',
+  url(r'^$', 'index', name='index'),
+)

+ 33 - 0
apps/security/src/security/views.py

@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from desktop.lib.django_util import render
+
+from libsentry.api import get_api
+from beeswax.api import autocomplete
+
+
+def index(request):
+  assist = autocomplete(request, database=None, table=None)
+  hadoop_groups = ['romain', 'sambashare', 'cdrom', 'lpadmin', 'admin', 'adm', 'lp', 'dialout', 'plugdev']
+  roles = get_api(request.user).list_sentry_roles_by_group()
+  
+  return render("index.mako", request, {      
+      'assist': assist,
+      'hadoop_groups': hadoop_groups,
+      'roles': roles
+  })

+ 39 - 0
apps/security/static/js/hive.ko.js

@@ -0,0 +1,39 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+var View = function (vm, query) {
+  var self = this;
+
+  self.qs = ko.mapping.fromJS(query.qs);
+}
+
+
+var HiveViewModel = function (hive_json) {
+  var self = this;
+
+  // Models
+  self.view = new View(self, hive_json.view);
+  self.groups = new View(self, hive_json.view);
+  self.roles = new View(self, hive_json.view);
+
+
+  function logGA(page) {
+    if (typeof trackOnGA == 'function') {
+      trackOnGA('security/' + page);
+    }
+  }
+};

+ 1 - 1
apps/useradmin/src/useradmin/conf.py

@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.5
+#!/usr/bin/env python
 # Licensed to Cloudera, Inc. under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information

+ 1 - 1
apps/useradmin/src/useradmin/models.py

@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.5
+#!/usr/bin/env python
 # Licensed to Cloudera, Inc. under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information

+ 12 - 0
desktop/conf.dist/hue.ini

@@ -913,3 +913,15 @@
 [useradmin]
   # The name of the default user group that users will be a member of
   ## default_user_group=default
+
+
+###########################################################################
+# Settings for the Sentry lib
+###########################################################################
+
+[libsentry]
+  # Hostname or IP of server.
+  ## hostname=localhost
+
+  # Port the sentry service is running on.
+  ## port=8038

+ 12 - 0
desktop/conf/pseudo-distributed.ini.tmpl

@@ -920,3 +920,15 @@
 [useradmin]
   # The name of the default user group that users will be a member of
   ## default_user_group=default
+
+
+###########################################################################
+# Settings for the Sentry lib
+###########################################################################
+
+[libsentry]
+  # Hostname or IP of server.
+  ## hostname=localhost
+
+  # Port the sentry service is running on.
+  ## port=8038

+ 2 - 1
desktop/core/src/desktop/templates/common_header.mako

@@ -305,7 +305,8 @@ from django.utils.translation import ugettext as _
       <ul class="dropdown-menu">
         <li><a href="${ url('useradmin.views.edit_user', username=urllib.quote(user.username)) }"><i class="fa fa-key"></i>&nbsp;&nbsp;${_('Edit Profile')}</a></li>
         %if user.is_superuser:
-        <li><a href="${ url('useradmin.views.list_users') }"><i class="fa fa-group"></i>&nbsp;&nbsp;${_('Manage users')}</a></li>
+        <li><a href="${ url('useradmin.views.list_users') }"><i class="fa fa-group"></i>&nbsp;&nbsp;${_('Manage Users')}</a></li>
+        <li><a href="${ url('security:index') }">&nbsp;<i class="fa fa-lock"></i>&nbsp;&nbsp;${_('Hadoop Security')}</a></li>
         %endif
       </ul>
     </li>

+ 1 - 1
desktop/core/src/desktop/views.py

@@ -370,7 +370,7 @@ def commonheader(title, section, user, padding="90px"):
     for app in apps:
       if app.display_name not in [
           'beeswax', 'impala', 'pig', 'jobsub', 'jobbrowser', 'metastore', 'hbase', 'sqoop', 'oozie', 'filebrowser',
-          'useradmin', 'search', 'help', 'about', 'zookeeper', 'proxy', 'rdbms', 'spark'] and app.display_name != 'indexer':
+          'useradmin', 'search', 'help', 'about', 'zookeeper', 'proxy', 'rdbms', 'spark', 'indexer', 'security']:
         other_apps.append(app)
       if section == app.display_name:
         current_app = app

+ 0 - 172
desktop/libs/libsentry/gen-py/fb303/FacebookService-remote

@@ -1,172 +0,0 @@
-#!/usr/bin/env python
-#
-# Autogenerated by Thrift Compiler (0.9.1)
-#
-# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
-#
-#  options string: py:new_style
-#
-
-import sys
-import pprint
-from urlparse import urlparse
-from thrift.transport import TTransport
-from thrift.transport import TSocket
-from thrift.transport import THttpClient
-from thrift.protocol import TBinaryProtocol
-
-from fb303 import FacebookService
-from fb303.ttypes import *
-
-if len(sys.argv) <= 1 or sys.argv[1] == '--help':
-  print ''
-  print 'Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] function [arg1 [arg2...]]'
-  print ''
-  print 'Functions:'
-  print '  string getName()'
-  print '  string getVersion()'
-  print '  fb_status getStatus()'
-  print '  string getStatusDetails()'
-  print '   getCounters()'
-  print '  i64 getCounter(string key)'
-  print '  void setOption(string key, string value)'
-  print '  string getOption(string key)'
-  print '   getOptions()'
-  print '  string getCpuProfile(i32 profileDurationInSec)'
-  print '  i64 aliveSince()'
-  print '  void reinitialize()'
-  print '  void shutdown()'
-  print ''
-  sys.exit(0)
-
-pp = pprint.PrettyPrinter(indent = 2)
-host = 'localhost'
-port = 9090
-uri = ''
-framed = False
-http = False
-argi = 1
-
-if sys.argv[argi] == '-h':
-  parts = sys.argv[argi+1].split(':')
-  host = parts[0]
-  if len(parts) > 1:
-    port = int(parts[1])
-  argi += 2
-
-if sys.argv[argi] == '-u':
-  url = urlparse(sys.argv[argi+1])
-  parts = url[1].split(':')
-  host = parts[0]
-  if len(parts) > 1:
-    port = int(parts[1])
-  else:
-    port = 80
-  uri = url[2]
-  if url[4]:
-    uri += '?%s' % url[4]
-  http = True
-  argi += 2
-
-if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
-  framed = True
-  argi += 1
-
-cmd = sys.argv[argi]
-args = sys.argv[argi+1:]
-
-if http:
-  transport = THttpClient.THttpClient(host, port, uri)
-else:
-  socket = TSocket.TSocket(host, port)
-  if framed:
-    transport = TTransport.TFramedTransport(socket)
-  else:
-    transport = TTransport.TBufferedTransport(socket)
-protocol = TBinaryProtocol.TBinaryProtocol(transport)
-client = FacebookService.Client(protocol)
-transport.open()
-
-if cmd == 'getName':
-  if len(args) != 0:
-    print 'getName requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.getName())
-
-elif cmd == 'getVersion':
-  if len(args) != 0:
-    print 'getVersion requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.getVersion())
-
-elif cmd == 'getStatus':
-  if len(args) != 0:
-    print 'getStatus requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.getStatus())
-
-elif cmd == 'getStatusDetails':
-  if len(args) != 0:
-    print 'getStatusDetails requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.getStatusDetails())
-
-elif cmd == 'getCounters':
-  if len(args) != 0:
-    print 'getCounters requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.getCounters())
-
-elif cmd == 'getCounter':
-  if len(args) != 1:
-    print 'getCounter requires 1 args'
-    sys.exit(1)
-  pp.pprint(client.getCounter(args[0],))
-
-elif cmd == 'setOption':
-  if len(args) != 2:
-    print 'setOption requires 2 args'
-    sys.exit(1)
-  pp.pprint(client.setOption(args[0],args[1],))
-
-elif cmd == 'getOption':
-  if len(args) != 1:
-    print 'getOption requires 1 args'
-    sys.exit(1)
-  pp.pprint(client.getOption(args[0],))
-
-elif cmd == 'getOptions':
-  if len(args) != 0:
-    print 'getOptions requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.getOptions())
-
-elif cmd == 'getCpuProfile':
-  if len(args) != 1:
-    print 'getCpuProfile requires 1 args'
-    sys.exit(1)
-  pp.pprint(client.getCpuProfile(eval(args[0]),))
-
-elif cmd == 'aliveSince':
-  if len(args) != 0:
-    print 'aliveSince requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.aliveSince())
-
-elif cmd == 'reinitialize':
-  if len(args) != 0:
-    print 'reinitialize requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.reinitialize())
-
-elif cmd == 'shutdown':
-  if len(args) != 0:
-    print 'shutdown requires 0 args'
-    sys.exit(1)
-  pp.pprint(client.shutdown())
-
-else:
-  print 'Unrecognized method %s' % cmd
-  sys.exit(1)
-
-transport.close()

+ 0 - 1930
desktop/libs/libsentry/gen-py/fb303/FacebookService.py

@@ -1,1930 +0,0 @@
-#
-# Autogenerated by Thrift Compiler (0.9.1)
-#
-# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
-#
-#  options string: py:new_style
-#
-
-from thrift.Thrift import TType, TMessageType, TException, TApplicationException
-from ttypes import *
-from thrift.Thrift import TProcessor
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol, TProtocol
-try:
-  from thrift.protocol import fastbinary
-except:
-  fastbinary = None
-
-
-class Iface(object):
-  """
-  Standard base service
-  """
-  def getName(self):
-    """
-    Returns a descriptive name of the service
-    """
-    pass
-
-  def getVersion(self):
-    """
-    Returns the version of the service
-    """
-    pass
-
-  def getStatus(self):
-    """
-    Gets the status of this service
-    """
-    pass
-
-  def getStatusDetails(self):
-    """
-    User friendly description of status, such as why the service is in
-    the dead or warning state, or what is being started or stopped.
-    """
-    pass
-
-  def getCounters(self):
-    """
-    Gets the counters for this service
-    """
-    pass
-
-  def getCounter(self, key):
-    """
-    Gets the value of a single counter
-
-    Parameters:
-     - key
-    """
-    pass
-
-  def setOption(self, key, value):
-    """
-    Sets an option
-
-    Parameters:
-     - key
-     - value
-    """
-    pass
-
-  def getOption(self, key):
-    """
-    Gets an option
-
-    Parameters:
-     - key
-    """
-    pass
-
-  def getOptions(self):
-    """
-    Gets all options
-    """
-    pass
-
-  def getCpuProfile(self, profileDurationInSec):
-    """
-    Returns a CPU profile over the given time interval (client and server
-    must agree on the profile format).
-
-    Parameters:
-     - profileDurationInSec
-    """
-    pass
-
-  def aliveSince(self):
-    """
-    Returns the unix time that the server has been running since
-    """
-    pass
-
-  def reinitialize(self):
-    """
-    Tell the server to reload its configuration, reopen log files, etc
-    """
-    pass
-
-  def shutdown(self):
-    """
-    Suggest a shutdown to the server
-    """
-    pass
-
-
-class Client(Iface):
-  """
-  Standard base service
-  """
-  def __init__(self, iprot, oprot=None):
-    self._iprot = self._oprot = iprot
-    if oprot is not None:
-      self._oprot = oprot
-    self._seqid = 0
-
-  def getName(self):
-    """
-    Returns a descriptive name of the service
-    """
-    self.send_getName()
-    return self.recv_getName()
-
-  def send_getName(self):
-    self._oprot.writeMessageBegin('getName', TMessageType.CALL, self._seqid)
-    args = getName_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getName(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getName_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getName failed: unknown result");
-
-  def getVersion(self):
-    """
-    Returns the version of the service
-    """
-    self.send_getVersion()
-    return self.recv_getVersion()
-
-  def send_getVersion(self):
-    self._oprot.writeMessageBegin('getVersion', TMessageType.CALL, self._seqid)
-    args = getVersion_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getVersion(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getVersion_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getVersion failed: unknown result");
-
-  def getStatus(self):
-    """
-    Gets the status of this service
-    """
-    self.send_getStatus()
-    return self.recv_getStatus()
-
-  def send_getStatus(self):
-    self._oprot.writeMessageBegin('getStatus', TMessageType.CALL, self._seqid)
-    args = getStatus_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getStatus(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getStatus_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getStatus failed: unknown result");
-
-  def getStatusDetails(self):
-    """
-    User friendly description of status, such as why the service is in
-    the dead or warning state, or what is being started or stopped.
-    """
-    self.send_getStatusDetails()
-    return self.recv_getStatusDetails()
-
-  def send_getStatusDetails(self):
-    self._oprot.writeMessageBegin('getStatusDetails', TMessageType.CALL, self._seqid)
-    args = getStatusDetails_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getStatusDetails(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getStatusDetails_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getStatusDetails failed: unknown result");
-
-  def getCounters(self):
-    """
-    Gets the counters for this service
-    """
-    self.send_getCounters()
-    return self.recv_getCounters()
-
-  def send_getCounters(self):
-    self._oprot.writeMessageBegin('getCounters', TMessageType.CALL, self._seqid)
-    args = getCounters_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getCounters(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getCounters_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getCounters failed: unknown result");
-
-  def getCounter(self, key):
-    """
-    Gets the value of a single counter
-
-    Parameters:
-     - key
-    """
-    self.send_getCounter(key)
-    return self.recv_getCounter()
-
-  def send_getCounter(self, key):
-    self._oprot.writeMessageBegin('getCounter', TMessageType.CALL, self._seqid)
-    args = getCounter_args()
-    args.key = key
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getCounter(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getCounter_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getCounter failed: unknown result");
-
-  def setOption(self, key, value):
-    """
-    Sets an option
-
-    Parameters:
-     - key
-     - value
-    """
-    self.send_setOption(key, value)
-    self.recv_setOption()
-
-  def send_setOption(self, key, value):
-    self._oprot.writeMessageBegin('setOption', TMessageType.CALL, self._seqid)
-    args = setOption_args()
-    args.key = key
-    args.value = value
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_setOption(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = setOption_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    return
-
-  def getOption(self, key):
-    """
-    Gets an option
-
-    Parameters:
-     - key
-    """
-    self.send_getOption(key)
-    return self.recv_getOption()
-
-  def send_getOption(self, key):
-    self._oprot.writeMessageBegin('getOption', TMessageType.CALL, self._seqid)
-    args = getOption_args()
-    args.key = key
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getOption(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getOption_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getOption failed: unknown result");
-
-  def getOptions(self):
-    """
-    Gets all options
-    """
-    self.send_getOptions()
-    return self.recv_getOptions()
-
-  def send_getOptions(self):
-    self._oprot.writeMessageBegin('getOptions', TMessageType.CALL, self._seqid)
-    args = getOptions_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getOptions(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getOptions_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getOptions failed: unknown result");
-
-  def getCpuProfile(self, profileDurationInSec):
-    """
-    Returns a CPU profile over the given time interval (client and server
-    must agree on the profile format).
-
-    Parameters:
-     - profileDurationInSec
-    """
-    self.send_getCpuProfile(profileDurationInSec)
-    return self.recv_getCpuProfile()
-
-  def send_getCpuProfile(self, profileDurationInSec):
-    self._oprot.writeMessageBegin('getCpuProfile', TMessageType.CALL, self._seqid)
-    args = getCpuProfile_args()
-    args.profileDurationInSec = profileDurationInSec
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_getCpuProfile(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = getCpuProfile_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "getCpuProfile failed: unknown result");
-
-  def aliveSince(self):
-    """
-    Returns the unix time that the server has been running since
-    """
-    self.send_aliveSince()
-    return self.recv_aliveSince()
-
-  def send_aliveSince(self):
-    self._oprot.writeMessageBegin('aliveSince', TMessageType.CALL, self._seqid)
-    args = aliveSince_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-  def recv_aliveSince(self):
-    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
-    if mtype == TMessageType.EXCEPTION:
-      x = TApplicationException()
-      x.read(self._iprot)
-      self._iprot.readMessageEnd()
-      raise x
-    result = aliveSince_result()
-    result.read(self._iprot)
-    self._iprot.readMessageEnd()
-    if result.success is not None:
-      return result.success
-    raise TApplicationException(TApplicationException.MISSING_RESULT, "aliveSince failed: unknown result");
-
-  def reinitialize(self):
-    """
-    Tell the server to reload its configuration, reopen log files, etc
-    """
-    self.send_reinitialize()
-
-  def send_reinitialize(self):
-    self._oprot.writeMessageBegin('reinitialize', TMessageType.CALL, self._seqid)
-    args = reinitialize_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-  def shutdown(self):
-    """
-    Suggest a shutdown to the server
-    """
-    self.send_shutdown()
-
-  def send_shutdown(self):
-    self._oprot.writeMessageBegin('shutdown', TMessageType.CALL, self._seqid)
-    args = shutdown_args()
-    args.write(self._oprot)
-    self._oprot.writeMessageEnd()
-    self._oprot.trans.flush()
-
-class Processor(Iface, TProcessor):
-  def __init__(self, handler):
-    self._handler = handler
-    self._processMap = {}
-    self._processMap["getName"] = Processor.process_getName
-    self._processMap["getVersion"] = Processor.process_getVersion
-    self._processMap["getStatus"] = Processor.process_getStatus
-    self._processMap["getStatusDetails"] = Processor.process_getStatusDetails
-    self._processMap["getCounters"] = Processor.process_getCounters
-    self._processMap["getCounter"] = Processor.process_getCounter
-    self._processMap["setOption"] = Processor.process_setOption
-    self._processMap["getOption"] = Processor.process_getOption
-    self._processMap["getOptions"] = Processor.process_getOptions
-    self._processMap["getCpuProfile"] = Processor.process_getCpuProfile
-    self._processMap["aliveSince"] = Processor.process_aliveSince
-    self._processMap["reinitialize"] = Processor.process_reinitialize
-    self._processMap["shutdown"] = Processor.process_shutdown
-
-  def process(self, iprot, oprot):
-    (name, type, seqid) = iprot.readMessageBegin()
-    if name not in self._processMap:
-      iprot.skip(TType.STRUCT)
-      iprot.readMessageEnd()
-      x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
-      oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
-      x.write(oprot)
-      oprot.writeMessageEnd()
-      oprot.trans.flush()
-      return
-    else:
-      self._processMap[name](self, seqid, iprot, oprot)
-    return True
-
-  def process_getName(self, seqid, iprot, oprot):
-    args = getName_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getName_result()
-    result.success = self._handler.getName()
-    oprot.writeMessageBegin("getName", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getVersion(self, seqid, iprot, oprot):
-    args = getVersion_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getVersion_result()
-    result.success = self._handler.getVersion()
-    oprot.writeMessageBegin("getVersion", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getStatus(self, seqid, iprot, oprot):
-    args = getStatus_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getStatus_result()
-    result.success = self._handler.getStatus()
-    oprot.writeMessageBegin("getStatus", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getStatusDetails(self, seqid, iprot, oprot):
-    args = getStatusDetails_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getStatusDetails_result()
-    result.success = self._handler.getStatusDetails()
-    oprot.writeMessageBegin("getStatusDetails", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getCounters(self, seqid, iprot, oprot):
-    args = getCounters_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getCounters_result()
-    result.success = self._handler.getCounters()
-    oprot.writeMessageBegin("getCounters", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getCounter(self, seqid, iprot, oprot):
-    args = getCounter_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getCounter_result()
-    result.success = self._handler.getCounter(args.key)
-    oprot.writeMessageBegin("getCounter", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_setOption(self, seqid, iprot, oprot):
-    args = setOption_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = setOption_result()
-    self._handler.setOption(args.key, args.value)
-    oprot.writeMessageBegin("setOption", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getOption(self, seqid, iprot, oprot):
-    args = getOption_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getOption_result()
-    result.success = self._handler.getOption(args.key)
-    oprot.writeMessageBegin("getOption", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getOptions(self, seqid, iprot, oprot):
-    args = getOptions_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getOptions_result()
-    result.success = self._handler.getOptions()
-    oprot.writeMessageBegin("getOptions", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_getCpuProfile(self, seqid, iprot, oprot):
-    args = getCpuProfile_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = getCpuProfile_result()
-    result.success = self._handler.getCpuProfile(args.profileDurationInSec)
-    oprot.writeMessageBegin("getCpuProfile", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_aliveSince(self, seqid, iprot, oprot):
-    args = aliveSince_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    result = aliveSince_result()
-    result.success = self._handler.aliveSince()
-    oprot.writeMessageBegin("aliveSince", TMessageType.REPLY, seqid)
-    result.write(oprot)
-    oprot.writeMessageEnd()
-    oprot.trans.flush()
-
-  def process_reinitialize(self, seqid, iprot, oprot):
-    args = reinitialize_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    self._handler.reinitialize()
-    return
-
-  def process_shutdown(self, seqid, iprot, oprot):
-    args = shutdown_args()
-    args.read(iprot)
-    iprot.readMessageEnd()
-    self._handler.shutdown()
-    return
-
-
-# HELPER FUNCTIONS AND STRUCTURES
-
-class getName_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getName_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getName_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.STRING, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.STRING:
-          self.success = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getName_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.STRING, 0)
-      oprot.writeString(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getVersion_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getVersion_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getVersion_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.STRING, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.STRING:
-          self.success = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getVersion_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.STRING, 0)
-      oprot.writeString(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getStatus_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getStatus_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getStatus_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.I32, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.I32:
-          self.success = iprot.readI32();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getStatus_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.I32, 0)
-      oprot.writeI32(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getStatusDetails_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getStatusDetails_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getStatusDetails_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.STRING, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.STRING:
-          self.success = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getStatusDetails_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.STRING, 0)
-      oprot.writeString(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getCounters_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getCounters_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getCounters_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.MAP, 'success', (TType.STRING,None,TType.I64,None), None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.MAP:
-          self.success = {}
-          (_ktype1, _vtype2, _size0 ) = iprot.readMapBegin()
-          for _i4 in xrange(_size0):
-            _key5 = iprot.readString();
-            _val6 = iprot.readI64();
-            self.success[_key5] = _val6
-          iprot.readMapEnd()
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getCounters_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.MAP, 0)
-      oprot.writeMapBegin(TType.STRING, TType.I64, len(self.success))
-      for kiter7,viter8 in self.success.items():
-        oprot.writeString(kiter7)
-        oprot.writeI64(viter8)
-      oprot.writeMapEnd()
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getCounter_args(object):
-  """
-  Attributes:
-   - key
-  """
-
-  thrift_spec = (
-    None, # 0
-    (1, TType.STRING, 'key', None, None, ), # 1
-  )
-
-  def __init__(self, key=None,):
-    self.key = key
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 1:
-        if ftype == TType.STRING:
-          self.key = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getCounter_args')
-    if self.key is not None:
-      oprot.writeFieldBegin('key', TType.STRING, 1)
-      oprot.writeString(self.key)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getCounter_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.I64, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.I64:
-          self.success = iprot.readI64();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getCounter_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.I64, 0)
-      oprot.writeI64(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class setOption_args(object):
-  """
-  Attributes:
-   - key
-   - value
-  """
-
-  thrift_spec = (
-    None, # 0
-    (1, TType.STRING, 'key', None, None, ), # 1
-    (2, TType.STRING, 'value', None, None, ), # 2
-  )
-
-  def __init__(self, key=None, value=None,):
-    self.key = key
-    self.value = value
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 1:
-        if ftype == TType.STRING:
-          self.key = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      elif fid == 2:
-        if ftype == TType.STRING:
-          self.value = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('setOption_args')
-    if self.key is not None:
-      oprot.writeFieldBegin('key', TType.STRING, 1)
-      oprot.writeString(self.key)
-      oprot.writeFieldEnd()
-    if self.value is not None:
-      oprot.writeFieldBegin('value', TType.STRING, 2)
-      oprot.writeString(self.value)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class setOption_result(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('setOption_result')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getOption_args(object):
-  """
-  Attributes:
-   - key
-  """
-
-  thrift_spec = (
-    None, # 0
-    (1, TType.STRING, 'key', None, None, ), # 1
-  )
-
-  def __init__(self, key=None,):
-    self.key = key
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 1:
-        if ftype == TType.STRING:
-          self.key = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getOption_args')
-    if self.key is not None:
-      oprot.writeFieldBegin('key', TType.STRING, 1)
-      oprot.writeString(self.key)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getOption_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.STRING, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.STRING:
-          self.success = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getOption_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.STRING, 0)
-      oprot.writeString(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getOptions_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getOptions_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getOptions_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.MAP, 'success', (TType.STRING,None,TType.STRING,None), None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.MAP:
-          self.success = {}
-          (_ktype10, _vtype11, _size9 ) = iprot.readMapBegin()
-          for _i13 in xrange(_size9):
-            _key14 = iprot.readString();
-            _val15 = iprot.readString();
-            self.success[_key14] = _val15
-          iprot.readMapEnd()
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getOptions_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.MAP, 0)
-      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
-      for kiter16,viter17 in self.success.items():
-        oprot.writeString(kiter16)
-        oprot.writeString(viter17)
-      oprot.writeMapEnd()
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getCpuProfile_args(object):
-  """
-  Attributes:
-   - profileDurationInSec
-  """
-
-  thrift_spec = (
-    None, # 0
-    (1, TType.I32, 'profileDurationInSec', None, None, ), # 1
-  )
-
-  def __init__(self, profileDurationInSec=None,):
-    self.profileDurationInSec = profileDurationInSec
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 1:
-        if ftype == TType.I32:
-          self.profileDurationInSec = iprot.readI32();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getCpuProfile_args')
-    if self.profileDurationInSec is not None:
-      oprot.writeFieldBegin('profileDurationInSec', TType.I32, 1)
-      oprot.writeI32(self.profileDurationInSec)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class getCpuProfile_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.STRING, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.STRING:
-          self.success = iprot.readString();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('getCpuProfile_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.STRING, 0)
-      oprot.writeString(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class aliveSince_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('aliveSince_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class aliveSince_result(object):
-  """
-  Attributes:
-   - success
-  """
-
-  thrift_spec = (
-    (0, TType.I64, 'success', None, None, ), # 0
-  )
-
-  def __init__(self, success=None,):
-    self.success = success
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 0:
-        if ftype == TType.I64:
-          self.success = iprot.readI64();
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('aliveSince_result')
-    if self.success is not None:
-      oprot.writeFieldBegin('success', TType.I64, 0)
-      oprot.writeI64(self.success)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class reinitialize_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('reinitialize_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)
-
-class shutdown_args(object):
-
-  thrift_spec = (
-  )
-
-  def read(self, iprot):
-    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
-      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
-      return
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
-      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStructBegin('shutdown_args')
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
-
-  def validate(self):
-    return
-
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, value)
-      for key, value in self.__dict__.iteritems()]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
-
-  def __ne__(self, other):
-    return not (self == other)

+ 0 - 1
desktop/libs/libsentry/gen-py/fb303/__init__.py

@@ -1 +0,0 @@
-__all__ = ['ttypes', 'constants', 'FacebookService']

+ 0 - 11
desktop/libs/libsentry/gen-py/fb303/constants.py

@@ -1,11 +0,0 @@
-#
-# Autogenerated by Thrift Compiler (0.9.1)
-#
-# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
-#
-#  options string: py:new_style
-#
-
-from thrift.Thrift import TType, TMessageType, TException, TApplicationException
-from ttypes import *
-

+ 0 - 47
desktop/libs/libsentry/gen-py/fb303/ttypes.py

@@ -1,47 +0,0 @@
-#
-# Autogenerated by Thrift Compiler (0.9.1)
-#
-# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
-#
-#  options string: py:new_style
-#
-
-from thrift.Thrift import TType, TMessageType, TException, TApplicationException
-
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol, TProtocol
-try:
-  from thrift.protocol import fastbinary
-except:
-  fastbinary = None
-
-
-class fb_status(object):
-  """
-  Common status reporting mechanism across all services
-  """
-  DEAD = 0
-  STARTING = 1
-  ALIVE = 2
-  STOPPING = 3
-  STOPPED = 4
-  WARNING = 5
-
-  _VALUES_TO_NAMES = {
-    0: "DEAD",
-    1: "STARTING",
-    2: "ALIVE",
-    3: "STOPPING",
-    4: "STOPPED",
-    5: "WARNING",
-  }
-
-  _NAMES_TO_VALUES = {
-    "DEAD": 0,
-    "STARTING": 1,
-    "ALIVE": 2,
-    "STOPPING": 3,
-    "STOPPED": 4,
-    "WARNING": 5,
-  }
-

+ 3 - 3
desktop/libs/libsentry/gen-py/sentry_policy_service/SentryPolicyService-remote

@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 #
-# Autogenerated by Thrift Compiler (0.9.1)
+# Autogenerated by Thrift Compiler (0.9.0)
 #
 # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 #
@@ -15,8 +15,8 @@ from thrift.transport import TSocket
 from thrift.transport import THttpClient
 from thrift.protocol import TBinaryProtocol
 
-from sentry_policy_service import SentryPolicyService
-from sentry_policy_service.ttypes import *
+import SentryPolicyService
+from ttypes import *
 
 if len(sys.argv) <= 1 or sys.argv[1] == '--help':
   print ''

+ 10 - 10
desktop/libs/libsentry/gen-py/sentry_policy_service/SentryPolicyService.py

@@ -1,5 +1,5 @@
 #
-# Autogenerated by Thrift Compiler (0.9.1)
+# Autogenerated by Thrift Compiler (0.9.0)
 #
 # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 #
@@ -105,7 +105,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_create_sentry_role(self):
+  def recv_create_sentry_role(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -135,7 +135,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_drop_sentry_role(self):
+  def recv_drop_sentry_role(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -165,7 +165,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_alter_sentry_role_grant_privilege(self):
+  def recv_alter_sentry_role_grant_privilege(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -195,7 +195,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_alter_sentry_role_revoke_privilege(self):
+  def recv_alter_sentry_role_revoke_privilege(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -225,7 +225,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_alter_sentry_role_add_groups(self):
+  def recv_alter_sentry_role_add_groups(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -255,7 +255,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_alter_sentry_role_delete_groups(self):
+  def recv_alter_sentry_role_delete_groups(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -285,7 +285,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_list_sentry_roles_by_group(self):
+  def recv_list_sentry_roles_by_group(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -315,7 +315,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_list_sentry_privileges_by_role(self):
+  def recv_list_sentry_privileges_by_role(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()
@@ -345,7 +345,7 @@ class Client(Iface):
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
 
-  def recv_list_sentry_privileges_for_provider(self):
+  def recv_list_sentry_privileges_for_provider(self, ):
     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
     if mtype == TMessageType.EXCEPTION:
       x = TApplicationException()

+ 1 - 1
desktop/libs/libsentry/gen-py/sentry_policy_service/constants.py

@@ -1,5 +1,5 @@
 #
-# Autogenerated by Thrift Compiler (0.9.1)
+# Autogenerated by Thrift Compiler (0.9.0)
 #
 # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 #

+ 206 - 258
desktop/libs/libsentry/gen-py/sentry_policy_service/ttypes.py

@@ -1,5 +1,5 @@
 #
-# Autogenerated by Thrift Compiler (0.9.1)
+# Autogenerated by Thrift Compiler (0.9.0)
 #
 # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 #
@@ -7,7 +7,6 @@
 #
 
 from thrift.Thrift import TType, TMessageType, TException, TApplicationException
-import fb303.ttypes
 import sentry_common_service.ttypes
 
 
@@ -249,7 +248,6 @@ class TCreateSentryRoleRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
   """
 
@@ -257,14 +255,12 @@ class TCreateSentryRoleRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'roleName', None, None, ), # 4
+    (3, TType.STRING, 'roleName', None, None, ), # 3
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
 
   def read(self, iprot):
@@ -287,16 +283,6 @@ class TCreateSentryRoleRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype3, _size0) = iprot.readSetBegin()
-          for _i4 in xrange(_size0):
-            _elem5 = iprot.readString();
-            self.requestorGroupNames.add(_elem5)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
@@ -319,15 +305,8 @@ class TCreateSentryRoleRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter6 in self.requestorGroupNames:
-        oprot.writeString(iter6)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
-      oprot.writeFieldBegin('roleName', TType.STRING, 4)
+      oprot.writeFieldBegin('roleName', TType.STRING, 3)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -338,8 +317,6 @@ class TCreateSentryRoleRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     return
@@ -424,7 +401,6 @@ class TDropSentryRoleRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
   """
 
@@ -432,14 +408,12 @@ class TDropSentryRoleRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'roleName', None, None, ), # 4
+    (3, TType.STRING, 'roleName', None, None, ), # 3
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
 
   def read(self, iprot):
@@ -462,16 +436,6 @@ class TDropSentryRoleRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype10, _size7) = iprot.readSetBegin()
-          for _i11 in xrange(_size7):
-            _elem12 = iprot.readString();
-            self.requestorGroupNames.add(_elem12)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
@@ -494,15 +458,8 @@ class TDropSentryRoleRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter13 in self.requestorGroupNames:
-        oprot.writeString(iter13)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
-      oprot.writeFieldBegin('roleName', TType.STRING, 4)
+      oprot.writeFieldBegin('roleName', TType.STRING, 3)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -513,8 +470,6 @@ class TDropSentryRoleRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     return
@@ -599,7 +554,6 @@ class TAlterSentryRoleAddGroupsRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
    - groups
   """
@@ -608,15 +562,14 @@ class TAlterSentryRoleAddGroupsRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'roleName', None, None, ), # 4
+    (3, TType.STRING, 'roleName', None, None, ), # 3
+    None, # 4
     (5, TType.SET, 'groups', (TType.STRUCT,(TSentryGroup, TSentryGroup.thrift_spec)), None, ), # 5
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None, groups=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None, groups=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
     self.groups = groups
 
@@ -640,16 +593,6 @@ class TAlterSentryRoleAddGroupsRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype17, _size14) = iprot.readSetBegin()
-          for _i18 in xrange(_size14):
-            _elem19 = iprot.readString();
-            self.requestorGroupNames.add(_elem19)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
@@ -657,11 +600,11 @@ class TAlterSentryRoleAddGroupsRequest(object):
       elif fid == 5:
         if ftype == TType.SET:
           self.groups = set()
-          (_etype23, _size20) = iprot.readSetBegin()
-          for _i24 in xrange(_size20):
-            _elem25 = TSentryGroup()
-            _elem25.read(iprot)
-            self.groups.add(_elem25)
+          (_etype3, _size0) = iprot.readSetBegin()
+          for _i4 in xrange(_size0):
+            _elem5 = TSentryGroup()
+            _elem5.read(iprot)
+            self.groups.add(_elem5)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -683,22 +626,15 @@ class TAlterSentryRoleAddGroupsRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter26 in self.requestorGroupNames:
-        oprot.writeString(iter26)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
-      oprot.writeFieldBegin('roleName', TType.STRING, 4)
+      oprot.writeFieldBegin('roleName', TType.STRING, 3)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
     if self.groups is not None:
       oprot.writeFieldBegin('groups', TType.SET, 5)
       oprot.writeSetBegin(TType.STRUCT, len(self.groups))
-      for iter27 in self.groups:
-        iter27.write(oprot)
+      for iter6 in self.groups:
+        iter6.write(oprot)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -709,8 +645,6 @@ class TAlterSentryRoleAddGroupsRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     if self.groups is None:
@@ -797,7 +731,6 @@ class TAlterSentryRoleDeleteGroupsRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
    - groups
   """
@@ -806,15 +739,14 @@ class TAlterSentryRoleDeleteGroupsRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'roleName', None, None, ), # 4
+    (3, TType.STRING, 'roleName', None, None, ), # 3
+    None, # 4
     (5, TType.SET, 'groups', (TType.STRUCT,(TSentryGroup, TSentryGroup.thrift_spec)), None, ), # 5
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None, groups=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None, groups=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
     self.groups = groups
 
@@ -838,16 +770,6 @@ class TAlterSentryRoleDeleteGroupsRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype31, _size28) = iprot.readSetBegin()
-          for _i32 in xrange(_size28):
-            _elem33 = iprot.readString();
-            self.requestorGroupNames.add(_elem33)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
@@ -855,11 +777,11 @@ class TAlterSentryRoleDeleteGroupsRequest(object):
       elif fid == 5:
         if ftype == TType.SET:
           self.groups = set()
-          (_etype37, _size34) = iprot.readSetBegin()
-          for _i38 in xrange(_size34):
-            _elem39 = TSentryGroup()
-            _elem39.read(iprot)
-            self.groups.add(_elem39)
+          (_etype10, _size7) = iprot.readSetBegin()
+          for _i11 in xrange(_size7):
+            _elem12 = TSentryGroup()
+            _elem12.read(iprot)
+            self.groups.add(_elem12)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -881,22 +803,15 @@ class TAlterSentryRoleDeleteGroupsRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter40 in self.requestorGroupNames:
-        oprot.writeString(iter40)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
-      oprot.writeFieldBegin('roleName', TType.STRING, 4)
+      oprot.writeFieldBegin('roleName', TType.STRING, 3)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
     if self.groups is not None:
       oprot.writeFieldBegin('groups', TType.SET, 5)
       oprot.writeSetBegin(TType.STRUCT, len(self.groups))
-      for iter41 in self.groups:
-        iter41.write(oprot)
+      for iter13 in self.groups:
+        iter13.write(oprot)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -907,8 +822,6 @@ class TAlterSentryRoleDeleteGroupsRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     if self.groups is None:
@@ -995,7 +908,6 @@ class TAlterSentryRoleGrantPrivilegeRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
    - privilege
   """
@@ -1004,15 +916,14 @@ class TAlterSentryRoleGrantPrivilegeRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'roleName', None, None, ), # 4
+    (3, TType.STRING, 'roleName', None, None, ), # 3
+    None, # 4
     (5, TType.STRUCT, 'privilege', (TSentryPrivilege, TSentryPrivilege.thrift_spec), None, ), # 5
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None, privilege=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None, privilege=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
     self.privilege = privilege
 
@@ -1036,16 +947,6 @@ class TAlterSentryRoleGrantPrivilegeRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype45, _size42) = iprot.readSetBegin()
-          for _i46 in xrange(_size42):
-            _elem47 = iprot.readString();
-            self.requestorGroupNames.add(_elem47)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
@@ -1074,15 +975,8 @@ class TAlterSentryRoleGrantPrivilegeRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter48 in self.requestorGroupNames:
-        oprot.writeString(iter48)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
-      oprot.writeFieldBegin('roleName', TType.STRING, 4)
+      oprot.writeFieldBegin('roleName', TType.STRING, 3)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
     if self.privilege is not None:
@@ -1097,8 +991,6 @@ class TAlterSentryRoleGrantPrivilegeRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     if self.privilege is None:
@@ -1185,7 +1077,6 @@ class TAlterSentryRoleRevokePrivilegeRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
    - privilege
   """
@@ -1194,15 +1085,14 @@ class TAlterSentryRoleRevokePrivilegeRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'roleName', None, None, ), # 4
+    (3, TType.STRING, 'roleName', None, None, ), # 3
+    None, # 4
     (5, TType.STRUCT, 'privilege', (TSentryPrivilege, TSentryPrivilege.thrift_spec), None, ), # 5
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None, privilege=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None, privilege=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
     self.privilege = privilege
 
@@ -1226,16 +1116,6 @@ class TAlterSentryRoleRevokePrivilegeRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype52, _size49) = iprot.readSetBegin()
-          for _i53 in xrange(_size49):
-            _elem54 = iprot.readString();
-            self.requestorGroupNames.add(_elem54)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
@@ -1264,15 +1144,8 @@ class TAlterSentryRoleRevokePrivilegeRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter55 in self.requestorGroupNames:
-        oprot.writeString(iter55)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
-      oprot.writeFieldBegin('roleName', TType.STRING, 4)
+      oprot.writeFieldBegin('roleName', TType.STRING, 3)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
     if self.privilege is not None:
@@ -1287,8 +1160,6 @@ class TAlterSentryRoleRevokePrivilegeRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     if self.privilege is None:
@@ -1375,7 +1246,6 @@ class TListSentryRolesRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - groupName
   """
 
@@ -1383,14 +1253,12 @@ class TListSentryRolesRequest(object):
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
-    (4, TType.STRING, 'groupName', None, None, ), # 4
+    (3, TType.STRING, 'groupName', None, None, ), # 3
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, groupName=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, groupName=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.groupName = groupName
 
   def read(self, iprot):
@@ -1413,16 +1281,6 @@ class TListSentryRolesRequest(object):
         else:
           iprot.skip(ftype)
       elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype59, _size56) = iprot.readSetBegin()
-          for _i60 in xrange(_size56):
-            _elem61 = iprot.readString();
-            self.requestorGroupNames.add(_elem61)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
-      elif fid == 4:
         if ftype == TType.STRING:
           self.groupName = iprot.readString();
         else:
@@ -1445,15 +1303,8 @@ class TListSentryRolesRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter62 in self.requestorGroupNames:
-        oprot.writeString(iter62)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.groupName is not None:
-      oprot.writeFieldBegin('groupName', TType.STRING, 4)
+      oprot.writeFieldBegin('groupName', TType.STRING, 3)
       oprot.writeString(self.groupName)
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -1464,8 +1315,6 @@ class TListSentryRolesRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     return
 
 
@@ -1517,11 +1366,11 @@ class TSentryRole(object):
       elif fid == 2:
         if ftype == TType.SET:
           self.groups = set()
-          (_etype66, _size63) = iprot.readSetBegin()
-          for _i67 in xrange(_size63):
-            _elem68 = TSentryGroup()
-            _elem68.read(iprot)
-            self.groups.add(_elem68)
+          (_etype17, _size14) = iprot.readSetBegin()
+          for _i18 in xrange(_size14):
+            _elem19 = TSentryGroup()
+            _elem19.read(iprot)
+            self.groups.add(_elem19)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -1547,8 +1396,8 @@ class TSentryRole(object):
     if self.groups is not None:
       oprot.writeFieldBegin('groups', TType.SET, 2)
       oprot.writeSetBegin(TType.STRUCT, len(self.groups))
-      for iter69 in self.groups:
-        iter69.write(oprot)
+      for iter20 in self.groups:
+        iter20.write(oprot)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     if self.grantorPrincipal is not None:
@@ -1614,11 +1463,11 @@ class TListSentryRolesResponse(object):
       elif fid == 2:
         if ftype == TType.SET:
           self.roles = set()
-          (_etype73, _size70) = iprot.readSetBegin()
-          for _i74 in xrange(_size70):
-            _elem75 = TSentryRole()
-            _elem75.read(iprot)
-            self.roles.add(_elem75)
+          (_etype24, _size21) = iprot.readSetBegin()
+          for _i25 in xrange(_size21):
+            _elem26 = TSentryRole()
+            _elem26.read(iprot)
+            self.roles.add(_elem26)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -1639,8 +1488,8 @@ class TListSentryRolesResponse(object):
     if self.roles is not None:
       oprot.writeFieldBegin('roles', TType.SET, 2)
       oprot.writeSetBegin(TType.STRUCT, len(self.roles))
-      for iter76 in self.roles:
-        iter76.write(oprot)
+      for iter27 in self.roles:
+        iter27.write(oprot)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -1649,8 +1498,104 @@ class TListSentryRolesResponse(object):
   def validate(self):
     if self.status is None:
       raise TProtocol.TProtocolException(message='Required field status is unset!')
-    if self.roles is None:
-      raise TProtocol.TProtocolException(message='Required field roles is unset!')
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class TSentryAuthorizable(object):
+  """
+  Attributes:
+   - server
+   - uri
+   - db
+   - table
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'server', None, None, ), # 1
+    (2, TType.STRING, 'uri', None, None, ), # 2
+    (3, TType.STRING, 'db', None, None, ), # 3
+    (4, TType.STRING, 'table', None, None, ), # 4
+  )
+
+  def __init__(self, server=None, uri=None, db=None, table=None,):
+    self.server = server
+    self.uri = uri
+    self.db = db
+    self.table = table
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.server = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.uri = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.db = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.STRING:
+          self.table = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('TSentryAuthorizable')
+    if self.server is not None:
+      oprot.writeFieldBegin('server', TType.STRING, 1)
+      oprot.writeString(self.server)
+      oprot.writeFieldEnd()
+    if self.uri is not None:
+      oprot.writeFieldBegin('uri', TType.STRING, 2)
+      oprot.writeString(self.uri)
+      oprot.writeFieldEnd()
+    if self.db is not None:
+      oprot.writeFieldBegin('db', TType.STRING, 3)
+      oprot.writeString(self.db)
+      oprot.writeFieldEnd()
+    if self.table is not None:
+      oprot.writeFieldBegin('table', TType.STRING, 4)
+      oprot.writeString(self.table)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    if self.server is None:
+      raise TProtocol.TProtocolException(message='Required field server is unset!')
     return
 
 
@@ -1670,23 +1615,24 @@ class TListSentryPrivilegesRequest(object):
   Attributes:
    - protocol_version
    - requestorUserName
-   - requestorGroupNames
    - roleName
+   - authorizableHierarchy
   """
 
   thrift_spec = (
     None, # 0
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.STRING, 'requestorUserName', None, None, ), # 2
-    (3, TType.SET, 'requestorGroupNames', (TType.STRING,None), None, ), # 3
+    None, # 3
     (4, TType.STRING, 'roleName', None, None, ), # 4
+    (5, TType.STRUCT, 'authorizableHierarchy', (TSentryAuthorizable, TSentryAuthorizable.thrift_spec), None, ), # 5
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, requestorGroupNames=None, roleName=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], requestorUserName=None, roleName=None, authorizableHierarchy=None,):
     self.protocol_version = protocol_version
     self.requestorUserName = requestorUserName
-    self.requestorGroupNames = requestorGroupNames
     self.roleName = roleName
+    self.authorizableHierarchy = authorizableHierarchy
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
@@ -1707,21 +1653,17 @@ class TListSentryPrivilegesRequest(object):
           self.requestorUserName = iprot.readString();
         else:
           iprot.skip(ftype)
-      elif fid == 3:
-        if ftype == TType.SET:
-          self.requestorGroupNames = set()
-          (_etype80, _size77) = iprot.readSetBegin()
-          for _i81 in xrange(_size77):
-            _elem82 = iprot.readString();
-            self.requestorGroupNames.add(_elem82)
-          iprot.readSetEnd()
-        else:
-          iprot.skip(ftype)
       elif fid == 4:
         if ftype == TType.STRING:
           self.roleName = iprot.readString();
         else:
           iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.STRUCT:
+          self.authorizableHierarchy = TSentryAuthorizable()
+          self.authorizableHierarchy.read(iprot)
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -1740,17 +1682,14 @@ class TListSentryPrivilegesRequest(object):
       oprot.writeFieldBegin('requestorUserName', TType.STRING, 2)
       oprot.writeString(self.requestorUserName)
       oprot.writeFieldEnd()
-    if self.requestorGroupNames is not None:
-      oprot.writeFieldBegin('requestorGroupNames', TType.SET, 3)
-      oprot.writeSetBegin(TType.STRING, len(self.requestorGroupNames))
-      for iter83 in self.requestorGroupNames:
-        oprot.writeString(iter83)
-      oprot.writeSetEnd()
-      oprot.writeFieldEnd()
     if self.roleName is not None:
       oprot.writeFieldBegin('roleName', TType.STRING, 4)
       oprot.writeString(self.roleName)
       oprot.writeFieldEnd()
+    if self.authorizableHierarchy is not None:
+      oprot.writeFieldBegin('authorizableHierarchy', TType.STRUCT, 5)
+      self.authorizableHierarchy.write(oprot)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 
@@ -1759,8 +1698,6 @@ class TListSentryPrivilegesRequest(object):
       raise TProtocol.TProtocolException(message='Required field protocol_version is unset!')
     if self.requestorUserName is None:
       raise TProtocol.TProtocolException(message='Required field requestorUserName is unset!')
-    if self.requestorGroupNames is None:
-      raise TProtocol.TProtocolException(message='Required field requestorGroupNames is unset!')
     if self.roleName is None:
       raise TProtocol.TProtocolException(message='Required field roleName is unset!')
     return
@@ -1812,11 +1749,11 @@ class TListSentryPrivilegesResponse(object):
       elif fid == 2:
         if ftype == TType.SET:
           self.privileges = set()
-          (_etype87, _size84) = iprot.readSetBegin()
-          for _i88 in xrange(_size84):
-            _elem89 = TSentryPrivilege()
-            _elem89.read(iprot)
-            self.privileges.add(_elem89)
+          (_etype31, _size28) = iprot.readSetBegin()
+          for _i32 in xrange(_size28):
+            _elem33 = TSentryPrivilege()
+            _elem33.read(iprot)
+            self.privileges.add(_elem33)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -1837,8 +1774,8 @@ class TListSentryPrivilegesResponse(object):
     if self.privileges is not None:
       oprot.writeFieldBegin('privileges', TType.SET, 2)
       oprot.writeSetBegin(TType.STRUCT, len(self.privileges))
-      for iter90 in self.privileges:
-        iter90.write(oprot)
+      for iter34 in self.privileges:
+        iter34.write(oprot)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -1847,8 +1784,6 @@ class TListSentryPrivilegesResponse(object):
   def validate(self):
     if self.status is None:
       raise TProtocol.TProtocolException(message='Required field status is unset!')
-    if self.privileges is None:
-      raise TProtocol.TProtocolException(message='Required field privileges is unset!')
     return
 
 
@@ -1897,10 +1832,10 @@ class TSentryActiveRoleSet(object):
       elif fid == 2:
         if ftype == TType.SET:
           self.roles = set()
-          (_etype94, _size91) = iprot.readSetBegin()
-          for _i95 in xrange(_size91):
-            _elem96 = iprot.readString();
-            self.roles.add(_elem96)
+          (_etype38, _size35) = iprot.readSetBegin()
+          for _i39 in xrange(_size35):
+            _elem40 = iprot.readString();
+            self.roles.add(_elem40)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -1921,8 +1856,8 @@ class TSentryActiveRoleSet(object):
     if self.roles is not None:
       oprot.writeFieldBegin('roles', TType.SET, 2)
       oprot.writeSetBegin(TType.STRING, len(self.roles))
-      for iter97 in self.roles:
-        oprot.writeString(iter97)
+      for iter41 in self.roles:
+        oprot.writeString(iter41)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -1953,6 +1888,7 @@ class TListSentryPrivilegesForProviderRequest(object):
    - protocol_version
    - groups
    - roleSet
+   - authorizableHierarchy
   """
 
   thrift_spec = (
@@ -1960,12 +1896,14 @@ class TListSentryPrivilegesForProviderRequest(object):
     (1, TType.I32, 'protocol_version', None, 1, ), # 1
     (2, TType.SET, 'groups', (TType.STRING,None), None, ), # 2
     (3, TType.STRUCT, 'roleSet', (TSentryActiveRoleSet, TSentryActiveRoleSet.thrift_spec), None, ), # 3
+    (4, TType.STRUCT, 'authorizableHierarchy', (TSentryAuthorizable, TSentryAuthorizable.thrift_spec), None, ), # 4
   )
 
-  def __init__(self, protocol_version=thrift_spec[1][4], groups=None, roleSet=None,):
+  def __init__(self, protocol_version=thrift_spec[1][4], groups=None, roleSet=None, authorizableHierarchy=None,):
     self.protocol_version = protocol_version
     self.groups = groups
     self.roleSet = roleSet
+    self.authorizableHierarchy = authorizableHierarchy
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
@@ -1984,10 +1922,10 @@ class TListSentryPrivilegesForProviderRequest(object):
       elif fid == 2:
         if ftype == TType.SET:
           self.groups = set()
-          (_etype101, _size98) = iprot.readSetBegin()
-          for _i102 in xrange(_size98):
-            _elem103 = iprot.readString();
-            self.groups.add(_elem103)
+          (_etype45, _size42) = iprot.readSetBegin()
+          for _i46 in xrange(_size42):
+            _elem47 = iprot.readString();
+            self.groups.add(_elem47)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -1997,6 +1935,12 @@ class TListSentryPrivilegesForProviderRequest(object):
           self.roleSet.read(iprot)
         else:
           iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.STRUCT:
+          self.authorizableHierarchy = TSentryAuthorizable()
+          self.authorizableHierarchy.read(iprot)
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -2014,14 +1958,18 @@ class TListSentryPrivilegesForProviderRequest(object):
     if self.groups is not None:
       oprot.writeFieldBegin('groups', TType.SET, 2)
       oprot.writeSetBegin(TType.STRING, len(self.groups))
-      for iter104 in self.groups:
-        oprot.writeString(iter104)
+      for iter48 in self.groups:
+        oprot.writeString(iter48)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     if self.roleSet is not None:
       oprot.writeFieldBegin('roleSet', TType.STRUCT, 3)
       self.roleSet.write(oprot)
       oprot.writeFieldEnd()
+    if self.authorizableHierarchy is not None:
+      oprot.writeFieldBegin('authorizableHierarchy', TType.STRUCT, 4)
+      self.authorizableHierarchy.write(oprot)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 
@@ -2081,10 +2029,10 @@ class TListSentryPrivilegesForProviderResponse(object):
       elif fid == 2:
         if ftype == TType.SET:
           self.privileges = set()
-          (_etype108, _size105) = iprot.readSetBegin()
-          for _i109 in xrange(_size105):
-            _elem110 = iprot.readString();
-            self.privileges.add(_elem110)
+          (_etype52, _size49) = iprot.readSetBegin()
+          for _i53 in xrange(_size49):
+            _elem54 = iprot.readString();
+            self.privileges.add(_elem54)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -2105,8 +2053,8 @@ class TListSentryPrivilegesForProviderResponse(object):
     if self.privileges is not None:
       oprot.writeFieldBegin('privileges', TType.SET, 2)
       oprot.writeSetBegin(TType.STRING, len(self.privileges))
-      for iter111 in self.privileges:
-        oprot.writeString(iter111)
+      for iter55 in self.privileges:
+        oprot.writeString(iter55)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()

+ 6 - 0
desktop/libs/libsentry/src/libsentry/__init__.py

@@ -13,3 +13,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import os
+import sys
+
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '../../gen-py'))

+ 100 - 18
desktop/libs/libsentry/src/libsentry/api.py

@@ -15,36 +15,118 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from libsentry.client import SentryClient
+from libsentry.conf import HOSTNAME, PORT
+
 import logging
 
 
 LOG = logging.getLogger(__name__)
 
 
+class SentryException(Exception):
+  def __init__(self, e, message=''):
+    super(SentryException, self).__init__(e)
+    self.message = message
+
+
+def get_api(user):
+  return SentryApi(SentryClient(HOSTNAME.get(), PORT.get(), user.username))
+
+
 class SentryApi(object):
 
   def __init__(self, client):
-    """
-    Parameters
-    ----------
-    client : SentryClient
-      The sentry client
-    """
     self.client = client
 
-  def get_roles_for_table(self, database, table):
-    roles = self.client.get_roles()
 
-    # Fetch privileges and filter out roles that don't have privileges for this table
-    old_roles = roles.copy()
-    for role, properties in old_roles.items():
-      properties['privileges'] = self.client.get_privileges_for_role(role)
+  def create_sentry_role(self, roleName):
+    response = self.client.create_sentry_role(roleName)
+    
+    if response.status.value == 0:
+      return response
+    else:
+      raise SentryException(response)  
+
+
+  def drop_sentry_role(self, roleName):
+    response = self.client.drop_sentry_role(roleName)
+    
+    if response.status.value == 0:
+      return response
+    else:
+      raise SentryException(response) 
+
+
+  def alter_sentry_role_grant_privilege(self, roleName, tSentryPrivilege):
+    response = self.client.alter_sentry_role_grant_privilege(roleName, tSentryPrivilege)
+    
+    if response.status.value == 0:
+      return response
+    else:
+      raise SentryException(response)
+    
 
-      if not filter(lambda privilege: privilege['scope'].lower() == 'table' and privilege['database'] == database and privilege['table'] == table, roles[role]['privileges']):
-        del roles[role]
+  def alter_sentry_role_revoke_privilege(self, roleName, tSentryPrivilege):
+    response = self.client.alter_sentry_role_revoke_privilege(roleName, tSentryPrivilege)
+    
+    if response.status.value == 0:
+      return response
+    else:
+      raise SentryException(response) 
+    
+    
+  def alter_sentry_role_add_groups(self, roleName, groups):
+    response = self.client.alter_sentry_role_add_groups(roleName, groups)
+    
+    if response.status.value == 0:
+      return response
+    else:
+      raise SentryException(response)
+        
+        
+  def alter_sentry_role_delete_groups(self, roleName, groups):
+    response = self.client.alter_sentry_role_delete_groups(roleName, groups)
+    
+    if response.status.value == 0:
+      return response
+    else:
+      raise SentryException(response)        
+        
+    
+  def list_sentry_roles_by_group(self, groupName=None):
+    response = self.client.list_sentry_roles_by_group()
+    
+    if response.status.value == 0:
+      roles = {}
+      for role in response.roles:
+        roles[role.roleName] = {
+          'grantorPrincipal': role.grantorPrincipal,
+          'groups': [group.groupName for group in role.groups]
+        }
+      return roles
+    else:
+      raise SentryException(response)  
 
-    return roles
 
-  def get_roles(self, database):
-    roles = self.client.get_roles()
-    return roles
+  def list_sentry_privileges_by_role(self, roleName, authorizableHierarchy=None):
+    response = self.client.list_sentry_privileges_by_role(roleName, authorizableHierarchy)
+    
+    if response.status.value == 0:
+      priviliges = []
+      for privilige in response.privileges:
+        priviliges.append({
+          'scope': privilige.privilegeScope,
+          'name': privilige.privilegeName,
+          'server': privilige.serverName,
+          'database': privilige.dbName,
+          'table': privilige.tableName,
+          'URI': privilige.URI,
+          'action': privilige.action,
+          'timestamp': privilige.createTime,
+          'grantor': privilige.grantorPrincipal
+        })
+      return priviliges
+    else:
+      raise SentryException(response)
+    

+ 83 - 75
desktop/libs/libsentry/src/libsentry/client.py

@@ -16,90 +16,98 @@
 # limitations under the License.
 
 import logging
-import sys
-import os
 
 from desktop.lib import thrift_util
 
-sys.path.append(os.path.join(os.path.dirname(__file__), '../../gen-py'))
-
-from sentry_policy_service import SentryPolicyService, ttypes
+from sentry_policy_service import SentryPolicyService
+from sentry_policy_service.ttypes import TListSentryRolesRequest, TListSentryPrivilegesRequest, TSentryAuthorizable, TCreateSentryRoleRequest, \
+    TDropSentryRoleRequest, TAlterSentryRoleGrantPrivilegeRequest, TSentryPrivilege, TAlterSentryRoleGrantPrivilegeResponse, \
+    TAlterSentryRoleRevokePrivilegeRequest, TAlterSentryRoleAddGroupsRequest, TSentryGroup, TAlterSentryRoleDeleteGroupsRequest
 
 
 LOG = logging.getLogger(__name__)
 
+# TODO: kerberos
+
 """
-from libsentry import api
-from django.contrib.auth.models import User
-user = User.objects.all()[0]
-c = api.SentryApi('solaris.abe.cloudera.com', 10001, user)
-response = c.get_roles()
-response = c.get_privileges_for_role('test')
-"""
+struct TSentryPrivilege {
+1: required string privilegeScope, # Valid values are SERVER, DATABASE, TABLE
+2: optional string privilegeName, # Generated on server side
+3: required string serverName,
+4: optional string dbName,
+5: optional string tableName,
+6: optional string URI,
+7: required string action,
+8: optional i64 createTime, # Set on server side
+9: optional string grantorPrincipal # Set on server side
+}
 
+struct TSentryAuthorizable {
+1: required string server,
+2: optional string uri,
+3: optional string db,
+4: optional string table,
+}
+"""
 
 class SentryClient(object):
 
-  def __init__(self, host, port, user):
-    """
-    Client for the sentry service.
-
-    Keyword arguments:
-    host       -- `host` the server is listening on
-    port       -- `port` the server is listening on
-    user       -- Django `user` object
-    """
-    # @TODO(Abe) Kerberos
-    self.user = user
-
-    self.client = thrift_util.get_client(SentryPolicyService.Client,
-                                         host,
-                                         port,
-                                         service_name="SentryPolicyService",
-                                         username=self.user.username,
-                                         timeout_seconds=30,
-                                         multiple=True)
-
-  def roles(self):
-    """
-    Fetch a mapping of roles to groups.
-    """
-    request = ttypes.TListSentryRolesRequest(requestorUserName=self.user.username, requestorGroupNames=[group.name for group in self.user.groups.all()])
-    response = self.client.list_sentry_roles_by_group(request)
-    if response.status.value == 0:
-      roles = {}
-      for role in response.roles:
-        roles[role.roleName] = {
-          'grantor': role.grantorPrincipal,
-          'groups': [group.groupName for group in role.groups]
-        }
-      return roles
-    else:
-      raise RuntimeError(response.status.message)
-
-  def privileges_for_role(self, role):
-    """
-    Fetch the privileges for a role.
-
-    Keyword arguments:
-    role     -- The `role` to fetch privileges for.
-    """
-    request = ttypes.TListSentryPrivilegesRequest(requestorUserName=self.user.username, requestorGroupNames=[group.name for group in self.user.groups.all()], roleName=role)
-    response = self.client.list_sentry_privileges_by_role(request)
-    if response.status.value == 0:
-      priviliges = []
-      for privilige in response.privileges:
-        priviliges.append({
-          'scope': privilige.privilegeScope,
-          'name': privilige.privilegeName,
-          'server': privilige.serverName,
-          'database': privilige.dbName,
-          'table': privilige.tableName,
-          'URI': privilige.URI,
-          'action': privilige.action,
-          'timestamp': privilige.createTime,
-          'grantor': privilige.grantorPrincipal
-        })
-      return priviliges
-    else:
-      raise RuntimeError(response.status.message)
+  def __init__(self, host, port, username):
+    self.username = username
+
+    self.client = thrift_util.get_client(
+        SentryPolicyService.Client,
+        host,
+        port,
+        service_name="SentryPolicyService",
+        username=self.username,
+        timeout_seconds=30,
+        multiple=True
+    )
+    
+  def create_sentry_role(self, roleName):
+    request = TCreateSentryRoleRequest(requestorUserName=self.username, roleName=roleName)
+    return self.client.create_sentry_role(request)
+  
+  
+  def drop_sentry_role(self, roleName):    
+    request = TDropSentryRoleRequest(requestorUserName=self.username, roleName=roleName, )
+    return self.client.drop_sentry_role(request)  
+
+
+  def alter_sentry_role_grant_privilege(self, roleName, tSentryPrivilege):
+    privilege = TSentryPrivilege(**tSentryPrivilege)
+    request = TAlterSentryRoleGrantPrivilegeRequest(requestorUserName=self.username, roleName=roleName, privilege=privilege)
+    return self.client.alter_sentry_role_grant_privilege(request)
+    
+    
+  def alter_sentry_role_revoke_privilege(self, roleName, tSentryPrivilege):
+    privilege = TSentryPrivilege(**tSentryPrivilege)
+    request = TAlterSentryRoleRevokePrivilegeRequest(requestorUserName=self.username, roleName=roleName, privilege=privilege)
+    return self.client.alter_sentry_role_revoke_privilege(request)
+
+
+  def alter_sentry_role_add_groups(self, roleName, groups):
+    groups = [TSentryGroup(name) for name in groups]
+    request = TAlterSentryRoleAddGroupsRequest(requestorUserName=self.username, roleName=roleName, groups=groups)
+    return self.client.alter_sentry_role_add_groups(request)
+
+
+  def alter_sentry_role_delete_groups(self, roleName, groups):
+    groups = [TSentryGroup(name) for name in groups]
+    request = TAlterSentryRoleDeleteGroupsRequest(requestorUserName=self.username, roleName=roleName, groups=groups)
+    return self.client.alter_sentry_role_delete_groups(request)
+
+
+  def list_sentry_roles_by_group(self, groupName=None):
+    request = TListSentryRolesRequest(requestorUserName=self.username, groupName=groupName)
+    return self.client.list_sentry_roles_by_group(request)
+
+
+  def list_sentry_privileges_by_role(self, roleName, authorizableHierarchy=None):
+    if authorizableHierarchy is not None:
+      authorizableHierarchy = TSentryAuthorizable(**authorizableHierarchy)
+    request = TListSentryPrivilegesRequest(requestorUserName=self.username, roleName=roleName, authorizableHierarchy=authorizableHierarchy)
+    return self.client.list_sentry_privileges_by_role(request)
+
+

+ 2 - 1
desktop/libs/libsentry/thrift/sentry_common_service.thrift

@@ -18,7 +18,7 @@
  * limitations under the License.
  */
 
-include "share/fb303/if/fb303.thrift"
+# include "share/fb303/if/fb303.thrift"
 
 namespace java org.apache.sentry.service.thrift
 namespace php sentry.service.thrift
@@ -39,3 +39,4 @@ struct TSentryResponseStatus {
 2: required string message
 3: optional string stack
 }
+

+ 21 - 20
desktop/libs/libsentry/thrift/sentry_policy_service.thrift

@@ -22,7 +22,7 @@
 # Thrift Service that the MetaStore is built on
 #
 
-include "share/fb303/if/fb303.thrift"
+# include "share/fb303/if/fb303.thrift"
 include "sentry_common_service.thrift"
 
 namespace java org.apache.sentry.provider.db.service.thrift
@@ -52,8 +52,7 @@ struct TSentryGroup {
 struct TCreateSentryRoleRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames # groups the requesting user belongs to
-4: required string roleName, # TSentryRole is not required for this request
+3: required string roleName, # TSentryRole is not required for this request
 }
 struct TCreateSentryRoleResponse {
 1: required sentry_common_service.TSentryResponseStatus status
@@ -63,8 +62,7 @@ struct TCreateSentryRoleResponse {
 struct TDropSentryRoleRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames # groups the requesting user belongs to
-4: required string roleName # role to drop
+3: required string roleName # role to drop
 }
 struct TDropSentryRoleResponse {
 1: required sentry_common_service.TSentryResponseStatus status
@@ -74,8 +72,7 @@ struct TDropSentryRoleResponse {
 struct TAlterSentryRoleAddGroupsRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames # groups the requesting user belongs to
-4: required string roleName,
+3: required string roleName,
 5: required set<TSentryGroup> groups
 }
 
@@ -87,8 +84,7 @@ struct TAlterSentryRoleAddGroupsResponse {
 struct TAlterSentryRoleDeleteGroupsRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames # groups the requesting user belongs to
-4: required string roleName,
+3: required string roleName,
 5: required set<TSentryGroup> groups
 }
 struct TAlterSentryRoleDeleteGroupsResponse {
@@ -99,8 +95,7 @@ struct TAlterSentryRoleDeleteGroupsResponse {
 struct TAlterSentryRoleGrantPrivilegeRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames # groups the requesting user belongs to
-4: required string roleName,
+3: required string roleName,
 5: required TSentryPrivilege privilege
 }
 struct TAlterSentryRoleGrantPrivilegeResponse {
@@ -111,8 +106,7 @@ struct TAlterSentryRoleGrantPrivilegeResponse {
 struct TAlterSentryRoleRevokePrivilegeRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames # groups the requesting user belongs to
-4: required string roleName,
+3: required string roleName,
 5: required TSentryPrivilege privilege
 }
 struct TAlterSentryRoleRevokePrivilegeResponse {
@@ -123,8 +117,7 @@ struct TAlterSentryRoleRevokePrivilegeResponse {
 struct TListSentryRolesRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames,# groups the requesting user belongs to
-4: optional string groupName # for this group, or all roles for all groups if null
+3: optional string groupName # for this group, or all roles for all groups if null
 }
 # used only for TListSentryRolesResponse
 struct TSentryRole {
@@ -134,19 +127,26 @@ struct TSentryRole {
 }
 struct TListSentryRolesResponse {
 1: required sentry_common_service.TSentryResponseStatus status
-2: required set<TSentryRole> roles
+2: optional set<TSentryRole> roles
+}
+
+struct TSentryAuthorizable {
+1: required string server,
+2: optional string uri,
+3: optional string db,
+4: optional string table,
 }
 
 # SHOW GRANT
 struct TListSentryPrivilegesRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required string requestorUserName, # user on whose behalf the request is issued
-3: required set<string> requestorGroupNames,# groups the requesting user belongs to
-4: required string roleName # get privileges assigned for this role
+4: required string roleName, # get privileges assigned for this role
+5: optional TSentryAuthorizable authorizableHierarchy # get privileges assigned for this role
 }
 struct TListSentryPrivilegesResponse {
 1: required sentry_common_service.TSentryResponseStatus status
-2: required set<TSentryPrivilege> privileges
+2: optional set<TSentryPrivilege> privileges
 }
 
 # This API was created specifically for ProviderBackend.getPrivileges
@@ -161,6 +161,7 @@ struct TListSentryPrivilegesForProviderRequest {
 1: required i32 protocol_version = sentry_common_service.TSENTRY_SERVICE_V1,
 2: required set<string> groups,
 3: required TSentryActiveRoleSet roleSet,
+4: optional TSentryAuthorizable authorizableHierarchy,
 }
 struct TListSentryPrivilegesForProviderResponse {
 1: required sentry_common_service.TSentryResponseStatus status
@@ -184,4 +185,4 @@ service SentryPolicyService
 
   # For use with ProviderBackend.getPrivileges only
   TListSentryPrivilegesForProviderResponse list_sentry_privileges_for_provider(1:TListSentryPrivilegesForProviderRequest request)
-}
+}