[policycoreutils] Fix semanage argparse bugs

Daniel J Walsh dwalsh at fedoraproject.org
Fri Jul 26 16:20:33 UTC 2013


commit 0eb608c4317236e83bf9cf8d460839de16c0c227
Author: Dan Walsh <dwalsh at redhat.com>
Date:   Fri Jul 26 12:20:20 2013 -0400

    Fix semanage argparse bugs
    
    - Update Translations
    - Add test suite for semanage command lines

 policycoreutils-rhat.patch |  527 +++++++++++++++++++++++++++++++------------
 policycoreutils.spec       |    7 +-
 2 files changed, 386 insertions(+), 148 deletions(-)
---
diff --git a/policycoreutils-rhat.patch b/policycoreutils-rhat.patch
index b5bbf4b..cc361d7 100644
--- a/policycoreutils-rhat.patch
+++ b/policycoreutils-rhat.patch
@@ -219135,10 +219135,10 @@ index 4216790..9fef0da 100644
 +msgid "Boolean %s Allow Rules"
  msgstr ""
 diff --git a/policycoreutils/po/or.po b/policycoreutils/po/or.po
-index c95cd67..690bbb4 100644
+index c95cd67..0cd1d80 100644
 --- a/policycoreutils/po/or.po
 +++ b/policycoreutils/po/or.po
-@@ -3,15 +3,16 @@
+@@ -3,16 +3,17 @@
  # This file is distributed under the same license as the PACKAGE package.
  # 
  # Translators:
@@ -219155,11 +219155,13 @@ index c95cd67..690bbb4 100644
  "Report-Msgid-Bugs-To: \n"
 -"POT-Creation-Date: 2013-01-04 12:01-0500\n"
 -"PO-Revision-Date: 2013-01-04 17:02+0000\n"
+-"Last-Translator: dwalsh <dwalsh at redhat.com>\n"
 +"POT-Creation-Date: 2013-07-10 16:36-0400\n"
-+"PO-Revision-Date: 2013-07-10 20:44+0000\n"
- "Last-Translator: dwalsh <dwalsh at redhat.com>\n"
++"PO-Revision-Date: 2013-07-26 14:16+0000\n"
++"Last-Translator: Manoj Kumar Giri <mgiri at redhat.com>\n"
  "Language-Team: Oriya (http://www.transifex.com/projects/p/fedora/language/or/)\n"
  "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
 @@ -25,9 +26,9 @@ msgid ""
  "USAGE: run_init <script> <args ...>\n"
  "  where: <script> is the name of the init script to run,\n"
@@ -219198,7 +219200,7 @@ index c95cd67..690bbb4 100644
 +#: ../semanage/seobject.py:288
 +#, python-format
 +msgid "Module does not exists %s "
-+msgstr ""
++msgstr "ମଡ୍ୟୁଲ ଅବସ୍ଥିତ ନାହିଁ %s "
 +
 +#: ../semanage/seobject.py:298
  #, python-format
@@ -219239,7 +219241,7 @@ index c95cd67..690bbb4 100644
 +"In some distributions it is included in the policycoreutils-devel patckage.\n"
 +"# yum install policycoreutils-devel\n"
 +"Or similar for your distro."
-+msgstr ""
++msgstr "sepolgen python ମଡ୍ୟୁଲକୁ permissive ଡମେନଗୁଡ଼ିକୁ ବ୍ୟବସ୍ଥା କରିବା ଆବଶ୍ୟକ।\nକିଛି ବଣ୍ଟନଗୁଡ଼ିକରେ ଏହାକୁ  policycoreutils-devel ପ୍ୟାକେଜରେ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଥାଏ।\n# yum install policycoreutils-devel\nକିମ୍ବା ଆପଣଙ୍କର ତନ୍ତ୍ର ପାଇଁ ସେହିପରି ଏକ।"
 +
 +#: ../semanage/seobject.py:418
  #, python-format
@@ -221357,7 +221359,7 @@ index c95cd67..690bbb4 100644
 -#: booleans.py:70
 +#: booleans.py:72
 +msgid "Allow http daemon to connect to mythtv"
-+msgstr ""
++msgstr "mythtv ସହିତ ସଂଯୋଗ କରିବା ପାଇଁ http ଡେମନକୁ ଅନୁମତି ଦିଅନ୍ତୁ"
 +
 +#: booleans.py:73
  msgid "Allow http daemon to connect to zabbix"
@@ -221519,23 +221521,23 @@ index c95cd67..690bbb4 100644
  msgstr "httpd କୁ openstack ପୋର୍ଟଗୁଡ଼ିକରେ ଅଭିଗମ୍ୟତା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ"
  
 -#: booleans.py:100
--msgid "Allow Apache to query NS records"
 +#: booleans.py:103
 +msgid "Allow httpd to connect to  sasl"
- msgstr ""
++msgstr "sasl ସହିତ ସଂଯୋଗ କରିବା ପାଇଁ httpd କୁ ଅନୁମତି ଦିଅନ୍ତୁ"
++
++#: booleans.py:104
+ msgid "Allow Apache to query NS records"
+-msgstr ""
++msgstr "Apache କୁ NS ବିବରଣୀଗୁଡ଼ିକୁ ଅନୁସନ୍ଧାନ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ"
  
 -#: booleans.py:101
 -msgid "Allow icecast to connect to all ports, not just sound ports."
 -msgstr "icecast କୁ କେବଳ ଧ୍ୱନି ପୋର୍ଟ ବ୍ୟତୀତ ବାକି ସମସ୍ତ ପୋର୍ଟଗୁଡ଼ିକ ସହିତ ସଂଯୋଗ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"
-+#: booleans.py:104
-+msgid "Allow Apache to query NS records"
-+msgstr "Apache କୁ NS ବିବରଣୀଗୁଡ଼ିକୁ ଅନୁସନ୍ଧାନ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ"
- 
--#: booleans.py:102
 +#: booleans.py:105
 +msgid "Determine whether icecast can listen on and connect to any TCP port."
 +msgstr "icecast ଯେକୌଣସି TCP ପୋର୍ଟରେ ଶୁଣି ପାରିବ ଏବଂ ସଂଯୁକ୍ତ ହୋଇପାରିବ କି ନାହିଁ ନିର୍ଦ୍ଧାରଣ କରନ୍ତୁ।"
-+
+ 
+-#: booleans.py:102
 +#: booleans.py:106
 +msgid ""
 +"Determine whether irc clients can listen on and connect to any unreserved "
@@ -221613,7 +221615,7 @@ index c95cd67..690bbb4 100644
 -msgstr "ସ୍ଥାପନ ନିର୍ଦ୍ଦେଶ କୌଣସି ଡିରେକ୍ଟୋରୀ କିମ୍ବା ଫାଇଲକୁ ସ୍ଥାପନ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"
 +#: booleans.py:121
 +msgid "Allow the mount commands to mount any directory or file."
-+msgstr ""
++msgstr "ସ୍ଥାପନ ନିର୍ଦ୍ଦେଶ କୌଣସି ଡିରେକ୍ଟୋରୀ କିମ୍ବା ଫାଇଲକୁ ସ୍ଥାପନ କରିବା ପାଇଁ ଅନୁମତି ଦେଇଥାଏ।"
  
 -#: booleans.py:110
 +#: booleans.py:122
@@ -221626,12 +221628,12 @@ index c95cd67..690bbb4 100644
 -msgstr "ବ୍ୟବହାରକାରୀଙ୍କ ହୋମ ଡିରେକ୍ଟୋରୀରେ ମନଇଚ୍ଛା ବିଷୟବସ୍ତୁ ନିର୍ମାଣ କରିବା ପାଇଁ mozilla_plugins କୁ ଅନୁମତି ଦିଅନ୍ତୁ"
 +#: booleans.py:123
 +msgid "Allow mozilla plugin to support GPS."
-+msgstr ""
++msgstr "GPS କୁ ସହାୟତା ଦେବା ପାଇଁ mozilla ପ୍ଲଗଇନକୁ ଅନୁମତି ଦିଅନ୍ତୁ।"
  
 -#: booleans.py:112
 +#: booleans.py:124
 +msgid "Allow mozilla plugin to support spice protocols."
-+msgstr ""
++msgstr "spice ପ୍ରଟୋକଲକୁ ସହାୟତା ଦେବା ପାଇଁ mozilla ପ୍ଲଗଇନକୁ ଅନୁମତି ଦିଅନ୍ତୁ।"
 +
 +#: booleans.py:125
  msgid "Allow confined web browsers to read home directory content"
@@ -221802,7 +221804,7 @@ index c95cd67..690bbb4 100644
 -"Allow privoxy to connect to all ports, not just HTTP, FTP, and Gopher ports."
 -msgstr "privoxy କୁ HTTP, FTP, ଏବଂ Gopher ପୋର୍ଟଗୁଡ଼ିକ ସହିତ ବାକି ସମସ୍ତ ପୋର୍ଟଗୁଡ଼ିକ ସହିତ ସଂଯୋଗ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"
 +"Permit to prosody to bind apache port. Need to be activated to use BOSH."
-+msgstr ""
++msgstr "apache ପୋର୍ଟକୁ ବାନ୍ଧିବାକୁ prosody  ପାଇଁ ଥିବା ଅନୁମତି।  BOSH କୁ ବ୍ୟବହାର କରିବା ପାଇଁ ସକ୍ରିୟ କରିବା ଆବଶ୍ୟକ।"
  
 -#: booleans.py:139
 +#: booleans.py:156
@@ -222011,12 +222013,12 @@ index c95cd67..690bbb4 100644
 +#: booleans.py:190
  msgid "Allow user  to use ssh chroot environment."
 -msgstr ""
--
++msgstr "ssh chroot ପରିବେଶକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ବ୍ୟବହାରକାରୀମାନଙ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"
+ 
 -#: booleans.py:175
 -msgid "Allow user music sharing"
 -msgstr "ବ୍ୟବହାରକାରୀ ସଂଗୀତ ସହଭାଗକୁ ଅନୁମତି ଦିଅନ୍ତୁ"
-+msgstr "ssh chroot ପରିବେଶକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ବ୍ୟବହାରକାରୀମାନଙ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"
- 
+-
 -#: booleans.py:176
 +#: booleans.py:191
  msgid ""
@@ -222154,7 +222156,7 @@ index c95cd67..690bbb4 100644
 -#: booleans.py:196
 +#: booleans.py:211
 +msgid "Allow testpolicy to exec content"
-+msgstr ""
++msgstr "ବିଷୟବସ୍ତୁକୁ ନିଷ୍ପାଦନ କରିବା ପାଇଁ testpolicy କୁ ଅନୁମତି ଦିଅନ୍ତୁ"
 +
 +#: booleans.py:212
  msgid ""
@@ -222348,7 +222350,7 @@ index c95cd67..690bbb4 100644
 +msgid ""
 +"Allow the graphical login program to create files in HOME dirs as "
 +"xdm_home_t."
-+msgstr ""
++msgstr "ଆଲେଖିକ ଲଗଇନ ପ୍ରଗ୍ରାମକୁ HOME dirs ରେ xdm_home_t ଭାବରେ ଫାଇଲ ସୃଷ୍ଟି କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"
 +
 +#: booleans.py:243
  msgid "Allow xen to manage nfs files"
@@ -222424,7 +222426,7 @@ index c95cd67..690bbb4 100644
 +
 +#: booleans.py:256
 +msgid "Allow ZoneMinder to run su/sudo."
-+msgstr ""
++msgstr "ZoneMinder କୁ su/sudo ଚଲାଇବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"
 +
 +#: ../sepolicy/sepolicy.py:194
 +#, python-format
@@ -222433,7 +222435,7 @@ index c95cd67..690bbb4 100644
 +
 +#: ../sepolicy/sepolicy.py:281
 +msgid "Graphical User Interface for SELinux Policy"
-+msgstr ""
++msgstr "SELinux ନିତୀ ପାଇଁ ଆଲେଖୀକ ଚାଳକ ଅନ୍ତରାପୃଷ୍ଠ"
 +
 +#: ../sepolicy/sepolicy.py:305
 +msgid "Generate SELinux man pages"
@@ -222567,11 +222569,11 @@ index c95cd67..690bbb4 100644
 +
 +#: ../sepolicy/sepolicy.py:528
 +msgid "Enter SELinux role(s) to which the administror domain will transition"
-+msgstr ""
++msgstr "SELinux ନିୟମାବଳୀ(ଗୁଡ଼ିକୁ) ଭରଣ କରନ୍ତୁ ଯେଉଁଥିରେ ପ୍ରଶାସକ ଡମେନ ପରିବର୍ତ୍ତିତ ହେବ"
 +
 +#: ../sepolicy/sepolicy.py:531
 +msgid "Enter domain(s) which this confined admin will administrate"
-+msgstr ""
++msgstr "ଯେଉଁ ଡମେନ(ଗୁଡ଼ିକୁ) ଏହି ନିର୍ଦ୍ଦିଷ୍ଟ ପ୍ରଶାସକ ଚଲାଇବ ତାହାକୁ ଭରଣ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy.py:534
 +msgid "name of policy to generate"
@@ -222618,35 +222620,35 @@ index c95cd67..690bbb4 100644
 +
 +#: ../sepolicy/sepolicy/__init__.py:167 ../sepolicy/sepolicy/gui.py:479
 +msgid "all files"
-+msgstr ""
++msgstr "ସମସ୍ତ ଫାଇଲଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:168
 +msgid "regular file"
-+msgstr ""
++msgstr "ନିୟମିତ ଫାଇଲ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:169
 +msgid "directory"
-+msgstr ""
++msgstr "ଡିରେକ୍ଟୋରି"
 +
 +#: ../sepolicy/sepolicy/__init__.py:170
 +msgid "character device"
-+msgstr ""
++msgstr "ବର୍ଣ୍ଣ ଉପକରଣ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:171
 +msgid "block device"
-+msgstr ""
++msgstr "ବ୍ଲକ ଉପକରଣ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:172
 +msgid "socket file"
-+msgstr ""
++msgstr "ସକେଟ ଫାଇଲ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:173
 +msgid "symbolic link"
-+msgstr ""
++msgstr "ସାଙ୍କେତିକ ଲିଙ୍କ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:174
 +msgid "named pipe"
-+msgstr ""
++msgstr "ନାମକରଣ ହୋଇଥିବା ପାଇପ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:306
 +msgid "No SELinux Policy installed"
@@ -222654,7 +222656,7 @@ index c95cd67..690bbb4 100644
 +
 +#: ../sepolicy/sepolicy/__init__.py:386
 +msgid "You must regenerate interface info by running /usr/bin/sepolgen-ifgen"
-+msgstr ""
++msgstr "/usr/bin/sepolgen-ifgen କୁ ଚଲାଇ ଆପଣଙ୍କୁ ନିଶ୍ଚିତ ଭାବରେ ଅନ୍ତରାପୃଷ୍ଠ ସୂଚନାକୁ ପୁଣି ଦର୍ଶାଇବାକୁ ହେବ"
 +
 +#: ../sepolicy/sepolicy/__init__.py:591
 +#, python-format
@@ -222791,368 +222793,368 @@ index c95cd67..690bbb4 100644
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:7
 +msgid "SELinux Gui"
-+msgstr ""
++msgstr "SELinux Gui"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:33
 +msgid "Type to search for a process"
-+msgstr ""
++msgstr "ଏକ ପଦ୍ଧତି ପାଇଁ ସନ୍ଧାନ ପ୍ରକାର"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:35
 +msgid "Select domain"
-+msgstr ""
++msgstr "ଡମେନ ବାଛନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:70
 +#: ../sepolicy/sepolicy/sepolicy.glade:308
 +msgid "Booleans"
-+msgstr ""
++msgstr "ବୁଲିଆନଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:74
 +msgid ""
 +"Display boolean information that can be used to modify the policy for the "
 +"'selected domain'."
-+msgstr ""
++msgstr "ବୁଲିଆନ ସୂଚନା ଦର୍ଶାନ୍ତୁ ଯାହାକୁ 'ବଚ୍ଛିତ ଡମେନ' ପାଇଁ ନିତୀ ପରିବର୍ତ୍ତନ କରିବାକୁ ବ୍ୟବହାର କରାଯାଇଥାଏ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:85
 +#: ../sepolicy/sepolicy/sepolicy.glade:710
 +msgid "Files"
-+msgstr ""
++msgstr "ଫାଇଲଗୁଡିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:89
 +msgid ""
 +"Display file type information that can be used by the 'selected domain'."
-+msgstr ""
++msgstr "ଫାଇଲ ପ୍ରକାର ସୂଚନା ଦର୍ଶାନ୍ତୁ ଯାହାକୁ 'ବଚ୍ଛିତ ଡମେନ' ଦ୍ୱାରା ବ୍ୟବହାର କରାଯାଇଥାଏ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:100
 +#: ../sepolicy/sepolicy/sepolicy.glade:1062
 +msgid "Network"
-+msgstr ""
++msgstr "ନେଟୱର୍କ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:104
 +msgid ""
 +"Display network ports to which the 'selected domain' can connect or listen "
 +"to."
-+msgstr ""
++msgstr "ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ ଯାହା ସହିତ 'ବଚ୍ଛିତ ଡମେନ' ସଂଯୋଗ ହୋଇପାରିବ କିମ୍ବା ଉତ୍ତର ପାଇ ପାରିବ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:115
 +#: ../sepolicy/sepolicy/sepolicy.glade:1361
 +msgid "Transitions"
-+msgstr ""
++msgstr "ପରିବର୍ତ୍ତନଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:119
 +msgid ""
 +"Display applications that can transition into or out of the 'selected "
 +"domain'."
-+msgstr ""
++msgstr "ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ ଯାହାକି 'ବଚ୍ଛିତ ଡମେନ'ଭିତରକୁ କିମ୍ବା ବାହାରକୁ ପରିବର୍ତ୍ତିତ ହୋଇପାରିବ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:188
 +#: ../sepolicy/sepolicy/sepolicy.glade:358
 +#: ../sepolicy/sepolicy/sepolicy.glade:765
 +#: ../sepolicy/sepolicy/sepolicy.glade:1113
 +msgid "Show Modified Only"
-+msgstr ""
++msgstr "କେବଳ ପରିବର୍ତ୍ତିତଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:219
 +msgid ""
 +"If-Then-Else rules written in policy that can \n"
 +"allow alternative access control."
-+msgstr ""
++msgstr "If-Then-Else ନିୟମଗୁଡ଼ିକ ନିତୀରେ ଲେଖା ହୋଇଛି ଯାହାକି \nବୈକଳ୍ପିକ ଅଭିଗମ୍ୟତା ନିୟନ୍ତ୍ରଣକୁ ଅନୁମତି ଦେଇଥାଏ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:373
 +#: ../sepolicy/sepolicy/sepolicy.glade:787
 +#: ../sepolicy/sepolicy/sepolicy.glade:1128
 +msgid "Modify"
-+msgstr ""
++msgstr "ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:377
 +#: ../sepolicy/sepolicy/sepolicy.glade:791
 +msgid "Modify an existing item"
-+msgstr ""
++msgstr "ଏକ ସ୍ଥିତବାନ ବସ୍ତୁକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:389
 +#: ../sepolicy/sepolicy/sepolicy.glade:803
 +#: ../sepolicy/sepolicy/sepolicy.glade:1142
 +msgid "Delete"
-+msgstr ""
++msgstr "ଅପସାରଣ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:393
 +#: ../sepolicy/sepolicy/sepolicy.glade:807
 +msgid "Delete an existing item"
-+msgstr ""
++msgstr "ଏକ ସ୍ଥିତବାନ ବସ୍ତୁକୁ ଅପସାରଣ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:409
 +#: ../sepolicy/sepolicy/sepolicy.glade:823
 +msgid "Add a new item"
-+msgstr ""
++msgstr "ଏକ ନୂତନ ବସ୍ତୁ ଯୋଗ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:442
 +msgid "File path used to enter the above selected process domain."
-+msgstr ""
++msgstr "ଉପରଲିଖିତ ବଚ୍ଛିତ ପଦ୍ଧତି ଡମେନକୁ ଭରଣ କରିବାକୁ ବ୍ୟବହୃତ ଫାଇଲ ପଥ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:450
 +#: ../sepolicy/sepolicy/sepolicy.glade:531
 +msgid "File Path"
-+msgstr ""
++msgstr "ଫାଇଲ ପଥ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:468
 +#: ../sepolicy/sepolicy/sepolicy.glade:549
 +msgid "SELinux File Label"
-+msgstr ""
++msgstr "SELinux ଫାଇଲ ନାମପଟି"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:485
 +#: ../sepolicy/sepolicy/sepolicy.glade:567
 +#: ../sepolicy/sepolicy/sepolicy.glade:660
 +msgid "Class"
-+msgstr ""
++msgstr "ଶ୍ରେଣୀ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:505
 +msgid "File path used to enter the 'selected domain'."
-+msgstr ""
++msgstr "'ବଚ୍ଛିତ ଡମେନ' କୁ ଭରଣ କରିବା ପାଇଁ ବ୍ୟବହୃତ ଫାଇଲ ପଥ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:506
 +msgid "Executable Files"
-+msgstr ""
++msgstr "ନିଷ୍ପାଦନଯୋଗ୍ୟ ଫାଇଲଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:523
 +msgid "Files to which the above selected process domain can write."
-+msgstr ""
++msgstr "ଉପରଲିଖିତ ପଦ୍ଧତି ଡମେନରେ ଯେଉଁ ଫାଇଲଗୁଡ଼ିକ ଲେଖିପାରିବ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:591
 +msgid "Files to which the 'selected domain' can write."
-+msgstr ""
++msgstr "'ବଚ୍ଛିତ ଡମେନ' ଲେଖି ପାରୁଥିବା ଫାଇଲଗୁଡ଼ିକ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:592
 +msgid "Writable Files"
-+msgstr ""
++msgstr "ଲେଖିବା ଯୋଗ୍ୟ ଫାଇଲଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:610
 +msgid "File Types defined for the selected domain"
-+msgstr ""
++msgstr "ବଚ୍ଛିତ ଡମେନ ପାଇଁ ନିର୍ଦ୍ଦିଷ୍ଟ ଫାଇଲ ପ୍ରକାରଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:618
 +msgid "File path"
-+msgstr ""
++msgstr "ଫାଇଲ ପଥ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:686
 +msgid "File Types defined for the 'selected domain'."
-+msgstr ""
++msgstr "'ବଚ୍ଛିତ ଡମେନ' ପାଇଁ ବ୍ଯାଖ୍ୟା କରାଯାଇଥିବା ଫାଇଲ ପ୍ରକାର।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:687
 +msgid "Application File Types"
-+msgstr ""
++msgstr "ପ୍ରୟୋଗ ଫାଇଲ ପ୍ରକାରଗୁଡ଼ିକ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:856
 +msgid "Network Ports to which the selected domain is allowed to connect."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକ ସହିତ ବଚ୍ଛିତ ଡମେନ ସଂଯୋଗ ହେବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:898
 +#: ../sepolicy/sepolicy/sepolicy.glade:997
 +msgid "Modified"
-+msgstr ""
++msgstr "ପରିବର୍ତ୍ତିତ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:937
 +msgid "Network Ports to which the 'selected domain' is allowed to connect."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକ ସହିତ 'ବଚ୍ଛିତ ଡମେନ' ସଂଯୋଗ ହେବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:938
 +msgid "Outbound"
-+msgstr ""
++msgstr "ଯାଉଥିବା"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:955
 +msgid "Network Ports to which the selected domain is allowed to listen."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକ ସହିତ ବଚ୍ଛିତ ଡମେନ ଉତ୍ତର ପାଇବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1038
 +msgid "Network Ports to which the 'selected domain' is allowed to listen."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକ ସହିତ 'ବଚ୍ଛିତ ଡମେନ' ଉତ୍ତର ପାଇବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1039
 +msgid "Inbound"
-+msgstr ""
++msgstr "ଆସୁଥିବା"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1189
 +#: ../sepolicy/sepolicy/sepolicy.glade:1260
 +msgid ""
 +"Executables which will transition to a different domain, when the 'selected "
 +"domain' executes them."
-+msgstr ""
++msgstr "ଭିନ୍ନ ଏକ ଡମେନକୁ ପରିବର୍ତ୍ତିତ ହେଉଥିବା ନିଷ୍ପାଦନଗୁଡ଼ିକ, ଯେତେବେଳେ ଏକ ବଚ୍ଛିତ ଡମେନଗୁଡ଼ିକତାହାକୁ ନିଷ୍ପାଦନ କରିଥାଏ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1194
 +#: ../sepolicy/sepolicy/sepolicy.glade:1285
 +msgid "Enabled"
-+msgstr ""
++msgstr "ସକ୍ରିୟ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1223
 +msgid "Executable File Type"
-+msgstr ""
++msgstr "ନିଷ୍ପାଦନଯୋଗ୍ୟ ଫାଇଲ ପ୍ରକାର"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1239
 +msgid "Transtype"
-+msgstr ""
++msgstr "Transtype"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1263
 +msgid "Transitions From 'select domain'"
-+msgstr ""
++msgstr "'ଡମେନ ବାଛନ୍ତୁ' ରୁ ପରିବର୍ତ୍ତନ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1280
 +#: ../sepolicy/sepolicy/sepolicy.glade:1337
 +msgid ""
 +"Executables which will transition to the 'selected domain', when executing a"
 +" selected domains entrypoint."
-+msgstr ""
++msgstr "'ବଚ୍ଛିତ ଡମେନ' କୁ ପରିବର୍ତ୍ତିତ ହେଉଥିବା ନିଷ୍ପାଦନଗୁଡ଼ିକ, ଯେତେବେଳେ ଏକ ବଚ୍ଛିତ ଡମେନଗୁଡ଼ିକର ପ୍ରବେଶ ସ୍ଥାନରେ ନିଷ୍ପାଦନ କରିଥାଏ।"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1299
 +msgid "Calling Process Domain"
-+msgstr ""
++msgstr "ପଦ୍ଧତି ଡମେନକୁ ଡ଼ାକୁଅଛି"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1313
 +msgid "Executable File"
-+msgstr ""
++msgstr "ନିଷ୍ପାଦନଯୋଗ୍ୟ ଫାଇଲ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1338
 +msgid "Transitions Into 'select domain'"
-+msgstr ""
++msgstr "'ଡମେନ ବାଛନ୍ତୁ' ରୁ ପରିବର୍ତ୍ତନ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1388
 +msgid "Reset"
-+msgstr ""
++msgstr "ପୁନଃସ୍ଥାପନ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1392
 +msgid "Reset to system default"
-+msgstr ""
++msgstr "ତନ୍ତ୍ର ପୂର୍ବନିର୍ଦ୍ଧାରିତରେ ପୁନଃସ୍ଥାପନ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1403
 +msgid "Update"
-+msgstr ""
++msgstr "ଅଦ୍ୟତନ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1407
 +msgid "Save your changes"
-+msgstr ""
++msgstr "ଆପଣଙ୍କର ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1454
 +#: ../sepolicy/sepolicy/sepolicy.glade:1541
 +#: ../sepolicy/sepolicy/sepolicy.glade:1629
 +msgid "Add a File"
-+msgstr ""
++msgstr "ଗୋଟିଏ ଫାଇଲ ଯୋଗକରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1504
 +#: ../sepolicy/sepolicy/sepolicy.glade:1592
 +#: ../sepolicy/sepolicy/sepolicy.glade:1680
 +msgid "Save changes"
-+msgstr ""
++msgstr "ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1518
 +#: ../sepolicy/sepolicy/sepolicy.glade:1606
 +#: ../sepolicy/sepolicy/sepolicy.glade:1694
 +msgid "Reset Changes"
-+msgstr ""
++msgstr "ପରିବର୍ତ୍ତନଗୁଡିକ ପୁନଃସ୍ଥାପନ କରନ୍ତୁ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1780
 +msgid "Applicaiton more detailed view"
-+msgstr ""
++msgstr "ପ୍ରୟୋଗର ଅଧିକ ବିସ୍ତୃତ ଦୃଶ୍ୟ"
 +
 +#: ../sepolicy/sepolicy/sepolicy.glade:1874
 +msgid "Analyzing Policy..."
-+msgstr ""
++msgstr "ନିତୀକୁ ବିଶ୍ଳେଷଣ କରୁଅଛି ..."
 +
 +#: ../sepolicy/sepolicy/gui.py:49
 +msgid "No"
-+msgstr ""
++msgstr "ନାଁ"
 +
 +#: ../sepolicy/sepolicy/gui.py:49
 +msgid "Yes"
-+msgstr ""
++msgstr "ହଁ"
 +
 +#: ../sepolicy/sepolicy/gui.py:61
 +msgid "GTK Not Available"
-+msgstr ""
++msgstr "GTK ଉପଲବ୍ଧ ନାହିଁ"
 +
 +#: ../sepolicy/sepolicy/gui.py:195
 +msgid "System Status: Enforcing"
-+msgstr ""
++msgstr "ତନ୍ତ୍ର ସ୍ଥିତି: Enforcing"
 +
 +#: ../sepolicy/sepolicy/gui.py:197
 +msgid "System Status: Permissive"
-+msgstr ""
++msgstr "ତନ୍ତ୍ର ସ୍ଥିତି: Permissive"
 +
 +#: ../sepolicy/sepolicy/gui.py:199
 +msgid "System Status: Disabled"
-+msgstr ""
++msgstr "ତନ୍ତ୍ର ସ୍ଥିତି: Disabled"
 +
 +#: ../sepolicy/sepolicy/gui.py:413
 +#, python-format
 +msgid "File path used to enter the '%s' domain."
-+msgstr ""
++msgstr "'%s' ଡମେନରେ ପ୍ରବେଶ ପାଇଁ ବ୍ୟବହୃତ ଫାଇଲ ପଥ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:414
 +#, python-format
 +msgid "Files to which the '%s' domain can write."
-+msgstr ""
++msgstr "ଯେଉଁ ଫାଇଲଗୁଡ଼ିକରେ '%s' ଡମେନ ଲେଖିପାରିବ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:415
 +#, python-format
 +msgid "Network Ports to which the '%s' is allowed to connect."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକରେ '%s' ସଂଯୋଗ ହେବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:416
 +#, python-format
 +msgid "Network Ports to which the '%s' is allowed to listen."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକରେ '%s' ଉତ୍ତର ପାଇବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:417
 +#, python-format
 +msgid "File Types defined for the '%s'."
-+msgstr ""
++msgstr "'%s' ପାଇଁ ବ୍ୟାଖ୍ୟା ହୋଇଥିବା ଫାଇଲ ପ୍ରକାର।"
 +
 +#: ../sepolicy/sepolicy/gui.py:418
 +#, python-format
 +msgid ""
 +"Display boolean information that can be used to modify the policy for the "
 +"'%s'."
-+msgstr ""
++msgstr "ବୁଲିଆନ ସୂଚନା ଦର୍ଶାନ୍ତୁ ଯାହାକୁ '%s' ପାଇଁ ନିତୀ ପରିବର୍ତ୍ତନ କରିବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:419
 +#, python-format
 +msgid "Display file type information that can be used by the '%s'."
-+msgstr ""
++msgstr "ଫାଇଲ ପ୍ରକାର ସୂଚନାକୁ ଦର୍ଶାନ୍ତୁ ଯାହାକୁ '%s' ଦ୍ୱାରା ବ୍ୟବହାର କରାଯାଇପାରିବ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:420
 +#, python-format
 +msgid "Display network ports to which the '%s' can connect or listen to."
-+msgstr ""
++msgstr "ଯେଉଁ ନେଟୱର୍କ ପୋର୍ଟଗୁଡ଼ିକରେ '%s' ସଂଯୋଗ ହୋଇପାରିବ କିମ୍ବା ଉତ୍ତର ପାଇ ପାରିବ ତାହାକୁ ଦର୍ଶାନ୍ତୁ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:421
 +#, python-format
 +msgid "Transitions Into '%s'"
-+msgstr ""
++msgstr "'%s' କୁ ପରିବର୍ତ୍ତନ"
 +
 +#: ../sepolicy/sepolicy/gui.py:422
 +#, python-format
 +msgid "Transitions From '%s'"
-+msgstr ""
++msgstr "'%s' ରୁ ପରିବର୍ତ୍ତନ"
 +
 +#: ../sepolicy/sepolicy/gui.py:423
 +#, python-format
 +msgid ""
 +"Executables which will transition to the '%s', when executing a selected "
 +"domains entrypoint."
-+msgstr ""
++msgstr "'%s' କୁ ପରିବର୍ତ୍ତନ ହୋଇପାରୁଥିବା ନିଷ୍ପାଦନଗୁଡ଼ିକ, ଯେତେବେଳେ ଏକ ବଚ୍ଛିତ ଡମେନ ନିବେଶ ବିନ୍ଦୁକୁ ନିଷ୍ପାଦନ କରାଯାଏ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:424
 +#, python-format
 +msgid ""
 +"Executables which will transition to a different domain, when the '%s' "
 +"executes them."
-+msgstr ""
++msgstr "ଭିନ୍ନ ଏକ ଡମେନକୁ ପରିବର୍ତ୍ତନ ହେଉଥିବା ନିଷ୍ପାଦନଗୁଡ଼ିକ, ଯେତେବେଳେ '%s' ସେଗୁଡ଼ିକୁ ନିଷ୍ପାଦନ କରିଥାଏ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:425
 +#, python-format
 +msgid "Display applications that can transition into or out of the '%s'."
-+msgstr ""
++msgstr "ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାଇଥାଏ ଯାହାକି '%s' କୁ କିମ୍ବା ସେଥିରୁ ପରିବର୍ତ୍ତନ ହୋଇପାରୁଥିବ।"
 +
 +#: ../sepolicy/sepolicy/gui.py:604
 +#, python-format
 +msgid "Boolean %s Allow Rules"
-+msgstr ""
++msgstr "ବୁଲିଆନ %s ଅନୁମୋଦିତ ନିୟମାବଳୀ"
 diff --git a/policycoreutils/po/pa.po b/policycoreutils/po/pa.po
 index 128fb5f..94b7d0d 100644
 --- a/policycoreutils/po/pa.po
@@ -318093,7 +318095,7 @@ index 0000000..e2befdb
 +      packages=["policycoreutils"],
 +)
 diff --git a/policycoreutils/semanage/semanage b/policycoreutils/semanage/semanage
-index 6e33c85..37fff6e 100644
+index 6e33c85..9f5a805 100644
 --- a/policycoreutils/semanage/semanage
 +++ b/policycoreutils/semanage/semanage
 @@ -1,5 +1,7 @@
@@ -318105,7 +318107,7 @@ index 6e33c85..37fff6e 100644
  # see file 'COPYING' for use and warranty information
  #
  # semanage is a tool for managing SELinux configuration files
-@@ -19,564 +21,797 @@
+@@ -19,564 +21,798 @@
  #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA     
  #                                        02111-1307  USA
  #
@@ -318291,7 +318293,7 @@ index 6e33c85..37fff6e 100644
 +
 +def handleLogin(args):
 +    # {action:[conflict_opts,require_opts]}
-+    login_args = {'list':[('login','seuser'),('')],'add':[('locallist'),('seuser','login')],'modify':[('locallist'),('seuser','login')], 'delete':[('locallist'),('login')],'extract':[('locallist','login','seuser'),('')],'deleteall':[('locallist','login','seuser'),('')]}
++    login_args = {'list':[('login','seuser'),('')],'add':[('locallist'),('seuser','login')],'modify':[('locallist'),('login')], 'delete':[('locallist'),('login')],'extract':[('locallist','login','seuser'),('')],'deleteall':[('locallist'),('')]}
 +
 +    handle_opts(args,login_args,args.action)
 +
@@ -318310,7 +318312,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "login %s" % (str(i))
 +    
 +def parser_add_store(parser, name):
 +    parser.add_argument('-S', '--store', action=SetStore, help=_("Select an alternate SELinux Policy Store to manage"))
@@ -318361,7 +318363,7 @@ index 6e33c85..37fff6e 100644
 +    parser.add_argument('-D', '--deleteall', dest='action', action='store_const', const='deleteall', help=_('Remove all %s objects local customizations') % name )
 +
 +def parser_add_seuser(parser, name):
-+    parser.add_argument('-s', '--seuser', default=None, help=_("SELinux user name"))
++    parser.add_argument('-s', '--seuser', default="", help=_("SELinux user name"))
 +
 +def setupLoginParser(subparsers):
 +    generated_usage = generate_custom_usage(usage_login, usage_login_dict)
@@ -318370,6 +318372,7 @@ index 6e33c85..37fff6e 100644
 +    parser_add_noheading(loginParser, "login")
 +    parser_add_noreload(loginParser, "login")
 +    parser_add_store(loginParser, "login")
++    parser_add_range(loginParser, "login")
 +
 +    login_action = loginParser.add_mutually_exclusive_group(required=True)
 +
@@ -318381,14 +318384,14 @@ index 6e33c85..37fff6e 100644
 +    parser_add_deleteall(login_action, "login")
 +    parser_add_seuser(loginParser, "login")
 +    
-+    parser_add_range(login_action, "login")
 +    loginParser.add_argument('login', nargs='?', default=None, help=_("login_name | %%groupname"))
++
 +    loginParser.set_defaults(func=handleLogin)
 +
 +def handleFcontext(args):
-+    fcontext_args = {'list':[('equal','ftype','seuser','type'),('')],'add':[('locallist'),('type','file_spec')],'modify':[('locallist'),('type','file_spec')], 'delete':[('locallist'),('type','file_spec')],'extract':[('locallist','equal','ftype','seuser','type'),('')],'deleteall':[('locallist','equal','ftype','seuser','type'),('')]}
++    fcontext_args = {'list':[('equal','ftype','seuser','type'),('')],'add':[('locallist'),('type','file_spec')],'modify':[('locallist'),('type','file_spec')], 'delete':[('locallist'), ('file_spec')],'extract':[('locallist','equal','ftype','seuser','type'),('')],'deleteall':[('locallist'),('')]}
 +    # we can not use mutually for equal because we can define some actions together with equal
-+    fcontext_equal_args = {'equal':[('list','locallist','type','ftype','seuser','deleteall','extract'),('add','modify','delete','file_spec')]}
++    fcontext_equal_args = {'equal':[('list','locallist','type','ftype','seuser','deleteall','extract'),()]}
 +
 +    if args.action is None:
 +        print("usage: "+"%s" % generate_custom_usage(usage_fcontext, usage_fcontext_dict))
@@ -318410,7 +318413,7 @@ index 6e33c85..37fff6e 100644
 +        if args.equal:
 +            OBJECT.add_equal(args.file_spec, args.equal)
 +        else:
-+            OBJECT.modify(args.file_spec, args.type, args.ftype, args.seuser, args.range)
++            OBJECT.modify(args.file_spec, args.type, args.ftype, args.range, args.seuser)
 +    if args.action is "delete":
 +        if args.equal:
 +            OBJECT.delete(args.file_spec, args.equal)
@@ -318422,7 +318425,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "fcontext %s" % str(i)
 +
 +def setupFcontextParser(subparsers):
 +    ftype_help = '''
@@ -318460,7 +318463,7 @@ index 6e33c85..37fff6e 100644
 +    fcontextParser.set_defaults(func=handleFcontext)
 +
 +def handleUser(args):
-+    user_args = {'list':[('selinux_name','seuser','roles'),('')],'add':[('locallist'),('roles','selinux_name')],'modify':[('locallist'),('roles','selinux_name')], 'delete':[('locallist'),('selinux_name')],'extract':[('locallist','selinux_name','seuser','role'),('')],'deleteall':[('locallist','selinux_name','seuser','roles'),('')]}
++    user_args = {'list':[('selinux_name','seuser','roles'),('')],'add':[('locallist'),('roles','selinux_name')],'modify':[('locallist'),('selinux_name')], 'delete':[('locallist'),('selinux_name')],'extract':[('locallist','selinux_name','seuser','role'),('')],'deleteall':[('locallist'),('')]}
 +
 +    handle_opts(args,user_args,args.action)
 +
@@ -318479,7 +318482,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "user %s" % str(i)
 + 
 +def setupUserParser(subparsers):
 +    generated_usage = generate_custom_usage(usage_user, usage_user_dict)
@@ -318509,7 +318512,7 @@ index 6e33c85..37fff6e 100644
 +    userParser.set_defaults(func=handleUser)
 +    
 +def handlePort(args):
-+    port_args = {'list':[('port','type','proto'),('')],'add':[('locallist'),('type','port','proto')],'modify':[('localist'),('type','port','proto')], 'delete':[('locallist'),('port','proto')],'extract':[('locallist','port','type','proto'),('')],'deleteall':[('locallist','port','type','proto'),('')]}
++    port_args = {'list':[('port','type','proto'),('')],'add':[('locallist'),('type','port','proto')],'modify':[('localist'),('port','proto')], 'delete':[('locallist'),('port','proto')],'extract':[('locallist','port','type','proto'),('')],'deleteall':[('locallist'),('')]}
 +
 +    handle_opts(args,port_args,args.action)
 +
@@ -318528,7 +318531,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "port %s" % str(i)
 + 
 +def setupPortParser(subparsers):
 +    generated_usage = generate_custom_usage(usage_port, usage_port_dict)
@@ -318552,7 +318555,7 @@ index 6e33c85..37fff6e 100644
 +    portParser.set_defaults(func=handlePort)
 +    
 +def handleInterface(args):
-+    interface_args = {'list':[('interface'),('')],'add':[('locallist'),('type','interface')],'modify':[('locallist'),('type','interface')], 'delete':[('locallist'),('type','interface')],'extract':[('locallist','interface','type'),('')],'deleteall':[('locallist','interface','type'),('')]}
++    interface_args = {'list':[('interface'),('')],'add':[('locallist'),('type','interface')],'modify':[('locallist'),('type','interface')], 'delete':[('locallist'),('interface')],'extract':[('locallist','interface','type'),('')],'deleteall':[('locallist'),('')]}
 +    
 +    handle_opts(args,interface_args,args.action)
 +
@@ -318571,7 +318574,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "interface %s" % str(i)
 +    
 +def setupInterfaceParser(subparsers):
 +    generated_usage = generate_custom_usage(usage_interface, usage_interface_dict)
@@ -318623,7 +318626,7 @@ index 6e33c85..37fff6e 100644
 +    moduleParser.set_defaults(func=handleModule)
 +    
 +def handleNode(args):
-+    node_args = {'list':[('node','type','proto','mask'),('')],'add':[('locallist'),('type','node','proto','mask')],'modify':[('locallist'),('type','node','mask','proto')], 'delete':[('locallist'),('type','node','mask')],'extract':[('locallist','node','type','proto','mask'),('')],'deleteall':[('locallist','node','type','proto','mask'),('')]}
++    node_args = {'list':[('node','type','proto','mask'),('')],'add':[('locallist'),('type','node','proto','mask')],'modify':[('locallist'),('node','mask','proto')], 'delete':[('locallist'),('node','mask','prototype')],'extract':[('locallist','node','type','proto','mask'),('')],'deleteall':[('locallist'),('')]}
 +    handle_opts(args,node_args,args.action)
 +
 +    OBJECT = object_dict['node']()
@@ -318641,7 +318644,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "node %s" % str(i)
 +    
 +def setupNodeParser(subparsers):
 +    generated_usage = generate_custom_usage(usage_node, usage_node_dict)
@@ -318667,7 +318670,7 @@ index 6e33c85..37fff6e 100644
 +    nodeParser.set_defaults(func=handleNode)
 +
 +def handleBoolean(args):
-+    boolean_args = {'list':[('state','boolean'),('')],'modify':[('localist'),('')], 'extract':[('locallist','state','boolean'),('')],'deleteall':[('locallist','state','boolean'),('')],'state':[('locallist','list','extract','deleteall'),('modify')]}
++    boolean_args = {'list':[('state','boolean'),('')],'modify':[('localist'),('')], 'extract':[('locallist','state','boolean'),('')],'deleteall':[('locallist'),('')],'state':[('locallist','list','extract','deleteall'),('modify')]}
 +    if args.action is None:
 +        print("Usage: "+"%s" % generate_custom_usage(usage_boolean, usage_boolean_dict))
 +        sys.exit(2)
@@ -318693,7 +318696,7 @@ index 6e33c85..37fff6e 100644
 +        OBJECT.deleteall()
 +    if args.action is "extract":
 +        for i in OBJECT.customized():
-+            print "%s %s" % (object, str(i))
++            print "boolean %s" % str(i)
 +
 +def setupBooleanParser(subparsers):
 +    generated_usage = generate_custom_usage(usage_boolean, usage_boolean_dict)
@@ -320574,7 +320577,7 @@ index 28a9022..90b142e 100644
 +usage: semanage [-h]
 +                
 diff --git a/policycoreutils/semanage/seobject.py b/policycoreutils/semanage/seobject.py
-index 85bc37f..2f6a440 100644
+index 85bc37f..b66840f 100644
 --- a/policycoreutils/semanage/seobject.py
 +++ b/policycoreutils/semanage/seobject.py
 @@ -32,11 +32,10 @@ from IPy import IP
@@ -320668,11 +320671,11 @@ index 85bc37f..2f6a440 100644
 +	def __add(self, target, type, ftype = "", serange = "s0", seuser = "system_u"):
                  self.validate(target)
  
-+                if not seuser:
++                if seuser == "":
 +                        seuser = "system_u"
 +
-+                if not serange:
-+                        seuser = "s0"
++                if serange == "":
++                        serange = "s0"
 +
  		if is_mls_enabled == 1:
                         serange = untranslate(serange)
@@ -320705,6 +320708,201 @@ index 85bc37f..2f6a440 100644
                 return l
  
  	def list(self, heading = True, locallist = False, use_file = False):
+diff --git a/policycoreutils/semanage/test-semanage.py b/policycoreutils/semanage/test-semanage.py
+new file mode 100644
+index 0000000..2aeffba
+--- /dev/null
++++ b/policycoreutils/semanage/test-semanage.py
+@@ -0,0 +1,189 @@
++import unittest, os, shutil 
++from tempfile import mkdtemp
++from subprocess import Popen, PIPE
++
++object_list = [ 'login', 'user', 'port', 'module', 'interface', 'node', 'fcontext', 'boolean','permissive', "dontaudit"]
++
++class SemanageTests(unittest.TestCase):
++    def assertDenied(self, err):
++        self.assertTrue('Permission denied' in err,
++                     '"Permission denied" not found in %r' % err)
++    def assertNotFound(self, err):
++        self.assertTrue('not found' in err,
++                     '"not found" not found in %r' % err)
++
++    def assertFailure(self, status):
++        self.assertTrue(status != 0,
++                     '"semanage succeeded when it should have failed')
++
++    def assertSuccess(self, status, err):
++        self.assertTrue(status == 0,
++                     '"semanage should have succeeded for this test %r' %  err)
++
++    def test_extract(self):
++        for object in object_list:
++            if object in ["dontaudit","module","permissive"]:
++                continue
++            "Verify semanage %s -E" % object
++            p = Popen(['semanage', object, '-E'], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_input_output(self):
++        print("Verify semanage export -f /tmp/out")
++        p = Popen(['semanage', "export", '-f', '/tmp/out'], stdout = PIPE)
++        out, err = p.communicate()
++        self.assertSuccess(p.returncode, err)
++        print("Verify semanage import -f /tmp/out")
++        p = Popen(['semanage', "import", '-f', '/tmp/out'], stdout = PIPE)
++        out, err = p.communicate()
++        self.assertSuccess(p.returncode, err)
++
++    def test_list(self):
++        for object in object_list:
++            if object in ["dontaudit"]:
++                continue
++            "Verify semanage %s -l" % object
++            p = Popen(['semanage', object, '-l'], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_list_c(self):
++        for object in object_list:
++            if object in ["module", "permissive", "dontaudit"]:
++                continue
++            print("Verify semanage %s -l" % object)
++            p = Popen(['semanage', object, '-lC'], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_fcontext(self):
++            p = Popen(["semanage", "fcontext", "-d", "/ha-web(/.*)?" ], stderr = PIPE)
++            out, err = p.communicate()
++
++            print("Verify semanage fcontext -a")
++            p = Popen(["semanage", "fcontext", "-a", "-t", "httpd_sys_content_t", "/ha-web(/.*)?" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage fcontext -m")
++            p = Popen(["semanage", "fcontext", "-m", "-t", "default_t", "/ha-web(/.*)?" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage fcontext -d")
++            p = Popen(["semanage", "fcontext", "-d", "/ha-web(/.*)?" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_fcontext_e(self):
++            p = Popen(["semanage", "fcontext", "-d", "/myhome" ], stderr = PIPE)
++            out, err = p.communicate()
++            p = Popen(["semanage", "fcontext", "-d", "/myhome1" ], stderr = PIPE)
++            out, err = p.communicate()
++
++            print("Verify semanage fcontext -a -e")
++            p = Popen(["semanage", "fcontext", "-a", "-e", "/home", "/myhome" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage fcontext -m -e")
++            p = Popen(["semanage", "fcontext", "-a", "-e", "/home", "/myhome1" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage fcontext -d -e")
++            p = Popen(["semanage", "fcontext", "-d", "/myhome1" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_port(self):
++            # Cleanup
++            p = Popen(["semanage", "port", "-d", "-p", "tcp", "55" ], stdout = PIPE, stderr = PIPE)
++            out, err = p.communicate()
++
++            # test
++            print("Verify semanage port -a")
++            p = Popen(["semanage", "port", "-a", "-t", "ssh_port_t", "-p", "tcp", "55" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage port -m")
++            p = Popen(["semanage", "port", "-m", "-t", "http_port_t", "-p", "tcp", "55" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage port -d")
++            p = Popen(["semanage", "port", "-d", "-p", "tcp", "55" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_login(self):
++            # Cleanup
++            p = Popen(["userdel", "-f", "-r", "testlogin" ], stderr = PIPE, stdout = PIPE)
++            out, err = p.communicate()
++            p = Popen(["semanage", "user", "-d", "testuser_u" ], stderr = PIPE, stdout = PIPE)
++            out, err = p.communicate()
++            p = Popen(["semanage", "login", "-d", "testlogin" ], stderr = PIPE, stdout = PIPE)
++            out, err = p.communicate()
++
++            #test
++            print("Verify semanage user -a")
++            p = Popen(["semanage", "user", "-a", "-R", "staff_r", "-r", "s0-s0:c0.c1023", "testuser_u" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify useradd ")
++            p = Popen(["useradd", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage login -a")
++            p = Popen(["semanage", "login", "-a", "-s", "testuser_u", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage login -m -r")
++            p = Popen(["semanage", "login", "-m", "-r", "s0-s0:c1", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage login -m -s")
++            p = Popen(["semanage", "login", "-m", "-s", "staff_u", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage login -m -s -r")
++            p = Popen(["semanage", "login", "-m", "-s", "testuser_u", "-r", "s0", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage login -d")
++            p = Popen(["semanage", "login", "-d", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            print("Verify userdel ")
++            p = Popen(["userdel", "testlogin" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage user -d")
++            p = Popen(["semanage", "user", "-d", "testuser_u" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++    def test_user(self):
++            # Cleanup
++            p = Popen(["semanage", "user", "-d", "testuser_u" ], stderr = PIPE, stdout = PIPE)
++            out, err = p.communicate()
++
++            # test
++            print("Verify semanage user -a")
++            p = Popen(["semanage", "user", "-a", "-R", "staff_r", "-r", "s0-s0:c0.c1023", "testuser_u" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage user -m -R")
++            p = Popen(["semanage", "user", "-m", "-R", "sysadm_r unconfined_r", "testuser_u" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage user -m -r")
++            p = Popen(["semanage", "user", "-m", "-r", "s0-s0:c1", "testuser_u" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++            print("Verify semanage user -d")
++            p = Popen(["semanage", "user", "-d", "testuser_u" ], stdout = PIPE)
++            out, err = p.communicate()
++            self.assertSuccess(p.returncode, err)
++
++if __name__ == "__main__":
++    import selinux
++    if selinux.security_getenforce() == 1:
++        unittest.main()
++    else:
++        print("SELinux must be in enforcing mode for this test")
 diff --git a/policycoreutils/semodule/Makefile b/policycoreutils/semodule/Makefile
 index 4c5243a..036c418 100644
 --- a/policycoreutils/semodule/Makefile
@@ -321142,7 +321340,7 @@ index 82fea52..779fd75 100644
              fi
              COMPREPLY=( $(compgen -W '${OPTS[$verb]}' -- "$cur") )
 diff --git a/policycoreutils/sepolicy/sepolicy-generate.8 b/policycoreutils/sepolicy/sepolicy-generate.8
-index fb84af6..2d97999 100644
+index fb84af6..9408c5e 100644
 --- a/policycoreutils/sepolicy/sepolicy-generate.8
 +++ b/policycoreutils/sepolicy/sepolicy-generate.8
 @@ -4,16 +4,66 @@ sepolicy-generate \- Generate an initial SELinux policy module template.
@@ -321159,28 +321357,28 @@ index fb84af6..2d97999 100644
 +Confined Applications
 +
 +.br
-+.B sepolicy generate \-\-application [\-n NAME] [\-w WRITE_PATH ] command
++.B sepolicy generate \-\-application [\-n NAME] command [\-w WRITE_PATH ] 
 +.br
-+.B sepolicy generate \-\-cgi [\-n NAME] [\-w WRITE_PATH ] command
++.B sepolicy generate \-\-cgi [\-n NAME] command [\-w WRITE_PATH ] 
 +.br
-+.B sepolicy generate \-\-dbus [\-n NAME] [\-w WRITE_PATH ] command
++.B sepolicy generate \-\-dbus [\-n NAME] command [\-w WRITE_PATH ] 
 +.br
-+.B sepolicy generate \-\-inetd [\-n NAME] [\-w WRITE_PATH ] command
++.B sepolicy generate \-\-inetd [\-n NAME] command [\-w WRITE_PATH ] 
 +.br
-+.B sepolicy generate \-\-init [\-n NAME] [\-w WRITE_PATH ] command
++.B sepolicy generate \-\-init [\-n NAME] command [\-w WRITE_PATH ] 
 +
 +Confined Users
 +
 +.br
 +.B sepolicy generate \-\-admin_user [\-r TRANSITION_ROLE] \-n NAME
 +.br
-+.B sepolicy generate \-\-confined_admin \-n NAME [\-a ADMIN_DOMAIN] [\-u USER] [\-n NAME] [\-p PATH]
++.B sepolicy generate \-\-confined_admin \-n NAME [\-a ADMIN_DOMAIN] [\-u USER] [\-n NAME] [\-w WRITE_PATH]
 +.br
-+.B sepolicy generate \-\-desktop_user \-n NAME [\-p PATH]
++.B sepolicy generate \-\-desktop_user \-n NAME [\-w WRITE_PATH]
 +.br
-+.B sepolicy generate \-\-term_user \-n NAME [\-p PATH]
++.B sepolicy generate \-\-term_user \-n NAME [\-w WRITE_PATH]
 +.br
-+.B sepolicy generate \-\-x_user \-n NAME [\-p PATH]
++.B sepolicy generate \-\-x_user \-n NAME [\-w WRITE_PATH]
 +.br
 +
 +Miscellaneous Policy
@@ -321256,6 +321454,15 @@ index fb84af6..2d97999 100644
  .TP
  .I  \-\-admin_user 
  Generate Policy for Administrator Login User Role
+@@ -95,7 +154,7 @@ Generate Policy for Minimal Terminal Login User Role
+ Generate Policy for Minimal X Windows Login User Role
+ 
+ .SH "EXAMPLE"
+-.B > sepolicy generate /usr/sbin/rwhod
++.B > sepolicy generate --init /usr/sbin/rwhod
+ .br
+ Generating Policy for /usr/sbin/rwhod named rwhod
+ .br
 diff --git a/policycoreutils/sepolicy/sepolicy-gui.8 b/policycoreutils/sepolicy/sepolicy-gui.8
 new file mode 100644
 index 0000000..49ea4b4
@@ -326923,6 +327130,32 @@ index 4b44b3c..98f4f7d 100644
  override CFLAGS += -I$(PREFIX)/include
  LDLIBS = -lselinux -lsepol -L$(LIBDIR)
  
+diff --git a/policycoreutils/setfiles/restore.c b/policycoreutils/setfiles/restore.c
+index a0e5415..7fe4166 100644
+--- a/policycoreutils/setfiles/restore.c
++++ b/policycoreutils/setfiles/restore.c
+@@ -118,7 +118,7 @@ static int restore(FTSENT *ftsent, int recurse)
+ 		r_opts->count++;
+ 		if (r_opts->count % STAR_COUNT == 0) {
+ 			if (r_opts->progress == 1) {
+-				fprintf(stdout, "*");
++				fprintf(stdout, "\r%luk", (size_t) r_opts->count / STAR_COUNT );
+ 			} else {
+ 				if (r_opts->nfile > 0) {
+ 					progress = (r_opts->count < r_opts->nfile) ? (100.0 * r_opts->count / r_opts->nfile) : 100;
+diff --git a/policycoreutils/setfiles/restore.h b/policycoreutils/setfiles/restore.h
+index 57ae46a..406594b 100644
+--- a/policycoreutils/setfiles/restore.h
++++ b/policycoreutils/setfiles/restore.h
+@@ -16,7 +16,7 @@
+ #include <limits.h>
+ #include <stdint.h>
+ 
+-#define STAR_COUNT 1000
++#define STAR_COUNT 1024
+ 
+ /* Things that need to be init'd */
+ struct restore_opts {
 diff --git a/policycoreutils/setfiles/restorecon.8 b/policycoreutils/setfiles/restorecon.8
 index 80b6d6e..ff759af 100644
 --- a/policycoreutils/setfiles/restorecon.8
diff --git a/policycoreutils.spec b/policycoreutils.spec
index 5fad36a..897f37b 100644
--- a/policycoreutils.spec
+++ b/policycoreutils.spec
@@ -7,7 +7,7 @@
 Summary: SELinux policy core utilities
 Name:	 policycoreutils
 Version: 2.1.14
-Release: 69%{?dist}
+Release: 70%{?dist}
 License: GPLv2
 Group:	 System Environment/Base
 # Based on git repository with tag 20101221
@@ -330,6 +330,11 @@ The policycoreutils-restorecond package contains the restorecond service.
 %systemd_postun_with_restart restorecond.service
 
 %changelog
+* Fri Jul 26 2013 Dan Walsh <dwalsh at redhat.com> - 2.1.14-70
+- Fix semanage argparse bugs
+- Update Translations
+- Add test suite for semanage command lines
+
 * Wed Jul 24 2013 Dan Walsh <dwalsh at redhat.com> - 2.1.14-69
 - Fix semanage argparse bugs
 


More information about the scm-commits mailing list