Bug 737697 - RFE: rhn_check fails to deploy some files when the configuration channel have some other files which does not have a valid UID/GID
RFE: rhn_check fails to deploy some files when the configuration channel have...
Status: NEW
Product: Spacewalk
Classification: Community
Component: Clients (Show other bugs)
1.6
All All
medium Severity medium
: ---
: ---
Assigned To: Marcelo Moreira de Mello
Red Hat Satellite QA List
: FutureFeature, Patch
Depends On:
Blocks: spacewalk-rfe
  Show dependency treegraph
 
Reported: 2011-09-12 18:08 EDT by Marcelo Moreira de Mello
Modified: 2013-02-03 15:11 EST (History)
4 users (show)

See Also:
Fixed In Version:
Doc Type: Enhancement
Doc Text:
Story Points: ---
Clone Of:
: 737698 (view as bug list)
Environment:
Last Closed:
Type: ---
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)
patch proposed (2.49 KB, patch)
2011-09-22 12:05 EDT, Marcelo Moreira de Mello
no flags Details | Diff

  None (edit)
Description Marcelo Moreira de Mello 2011-09-12 18:08:15 EDT
Description of problem:
rhn_check fails to deploy some files when the configuration channel have some other files which does not have a valid UID/GID

But when running rhncfg-client get, only the missing UID/GID files owner fails at deployment. All the other files within into the configuration channel (having a valid UID/GID) are works as expected. 

Version-Release number of selected component (if applicable):
Spacewalk 1.6 Nightly Build


How reproducible:
100%

Steps to Reproduce:
1. Create a configuration channel with some files as described below:

/etc/file2                 <--- owned by root
/etc/no_such_user_file     <--  owned by no_user (keep in mind that no_user does not exists into the server)
/tmp/file1                 <--- owned by root
/etc/hosts                 <--- owned by root
/tmp/no_such_user_tmp_file <-- owned by no_user (keep in mind that no_user does not exists into the server)

2. Go the webUI and set the configuration files to be deploy and then run manually rhn_check (all the files will fail)

# rhn_check  -vv

{ .. SNIP .. }
D: Sending back response (50, "Failed deployment and rollback, information on user 'no_user' could not be found", {})
D: do_call packages.checkNeedUpdate ('rhnsd=1',)
Loaded plugins: rhnplugin
D: local action status:  (0, 'rpm database not modified since last update (or package list recently updated)', {})

# rhncfg-client verify
  missing /etc/file2
 modified /etc/hosts
  missing /etc/no_such_user_file
  missing /tmp/file1
  missing /tmp/no_such_user_tmp_file


3. Run rhncfg-client get into the box (only the missing UID/GID files will fail (as expected))

# rhncfg-client elist
Mode          Owner Group          Size Rev      Config Channel    File
-rw-r--r--     root root             35   1             no_user    /etc/file2
-rw-r--r--     root root            199   1             no_user    /etc/hosts
-rw-r--r--  no_user no_user          51   2             no_user    /etc/no_such_user_file
-rw-r--r--     root root             34   1             no_user    /tmp/file1
-rw-r--r--  no_user no_user          50   2             no_user    /tmp/no_such_user_tmp_file

# ls -la /etc/file2 /etc/hosts /etc/no_such_user_file /tmp/file1 /tmp/no_such_user_tmp_file 
ls: /etc/no_such_user_file: No such file or directory
ls: /tmp/no_such_user_tmp_file: No such file or directory
-rw-r--r-- 1 root root  35 Sep 12 18:19 /etc/file2
-rw-r--r-- 1 root root 199 Sep 12 18:19 /etc/hosts
-rw-r--r-- 1 root root  34 Sep 12 18:19 /tmp/file1

  
Actual results:

 rhn_check fails to deploy all files when the configuration channel have a file which does not have a valid UID/GID


Expected results:

 rhn_check **ONLY** fails the deployment for those files which does not have a valid UID/GID, as rhncfg-client does.
Comment 1 Marcelo Moreira de Mello 2011-09-12 18:08:52 EDT
Taking...
Comment 2 Marcelo Moreira de Mello 2011-09-12 18:20:26 EDT
client/tools/rhncfg/actions/configfiles.py
201 def deploy(params, topdir=None, cache_only=None):
202     if cache_only:
203         return (0, "no-ops for caching", {})
204 
205     action_type = 'configfiles.deploy'
206     if not _local_permission_check(action_type):
207         log_to_file(0, "permissions error: " + str(action_type))
208         return _perm_error(action_type)
209 
210     _init()
211     files = params.get('files') or []
212     dep_trans = DeployTransaction(transaction_root=topdir, auto_rollback=0)
213 ....
214     for file in files:
215         dep_trans.add(file)
216 
217     try:
218         dep_trans.deploy()
219     #5/3/05 wregglej - 135415 Adding stuff for missing user info
220     except cfg_exceptions.UserNotFound, e:
221             try:
222                 dep_trans.rollback()....
223             except FailedRollback:
224                 log_to_file(0, "Failed deployment and rollback, information on user '%s' could not be found" % (e[0], ))
225                 return (44, "Failed deployment and rollback, information on user '%s' could not be found" % (e[0], ), {})
226             #5/3/05 wregglej - 136415 Adding some more exceptions to handle
227             except cfg_exceptions.UserNotFound, f:
228                 log_to_file(0, "Failed deployment and rollback, information on user '%s' could not be found" % (f[0], ))
229                 return (50, "Failed deployment and rollback, information on user '%s' could not be found" % (f[0], ), {})
230             #5/5/05 wregglej - 136415 Adding exception handling for unknown group,
231             except cfg_exceptions.GroupNotFound, f:
232                 log_to_file(0, "Failed deployment and rollback, group '%s' could not be found" % (f[0],))
233                 return (51, "Failed deployment and rollback, group '%s' could not be found" % (f[0],), {})
234             else:
235                 log_to_file(0, "Failed deployment and rollback, information on user '%s' could not be found" % (e[0], ))
236                 return (50, "Failed deployment and rollback, information on user '%s' could not be found" % (e[0], ), {})

  Working into this..
Comment 3 Marcelo Moreira de Mello 2011-09-13 01:54:49 EDT
*** notes to myself **** 

  Giving a quick look into the code we added the debug mode below:

/usr/share/rhn/actions/configfiles.py
-------------------------------------
204     #mmello
205     files = params.get('files') or []
206     import pwd....
207     for file in files:
208         uid   = file.get('username')
209         group = file.get('groupname')
210         if uid and group:
211             try:
212                 user_record  = pwd.getpwnam(uid)
213                 group_record = pwd.getgrnam(group)
214             except:
215                 user_record = group_record = "NOT EXISTS"
216 
217         log_to_file(0,"DEBUG --> uid   '%s'" % (uid, )).
218         log_to_file(0,"DEBUG --> group '%s'" % (group, )).
219         log_to_file(0,"DEBUG --> uid_record   '%s'" % (user_record, )).
220         log_to_file(0,"DEBUG --> group_record '%s'" % (group_record, )).
221 
222     dep_trans = DeployTransaction(transaction_root=topdir, auto_rollback=0)
223 ....
224     for file in files:
225         log_to_file(0,"DEBUG --> file '%s'" % (file, ))
226         dep_trans.add(file)


 Then, going thru webUI and trying to deploy the files etc/no_such_user_file /etc/file2  using rhn_check


# rhn_check -vv ; ls -la /etc/no_such_user_file /etc/file2

 { SNIP } 

D: handle_action actionid = 1254, version = 2
D: do_call configfiles.deploy ({'files': [{'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': 'b2cbe5f297d9af192d82fd84e8284fa5', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IHJvb3Qvcm9vdAo=\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/file2', 'checksum_type': 'md5', 'revision': 1}, {'config_channel': 'no_user', 'username': 'no_user', 'encoding': 'base64', 'checksum': 'bbf7090602cc0b3560371070eea6adf9', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'no_user', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IG5vX3N1Y2hfdXNlci9ub19zdWNoX3VzZXIK\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/no_such_user_file', 'checksum_type': 'md5', 'revision': 2}]},)
D: Sending back response (50, "Failed deployment and rollback, information on user 'no_user' could not be found", {})
D: do_call packages.checkNeedUpdate ('rhnsd=1',)
Loaded plugins: rhnplugin
D: local action status:  (0, 'rpm database not modified since last update (or package list recently updated)', {})
ls: /etc/no_such_user_file: No such file or directory
ls: /etc/file2: No such file or directory


Looking the logs:
--------------
/var/log/rhncfg-actions
-------------------
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> uid   'root'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> group 'root'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> uid_record   'NOT EXISTS'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> group_record 'NOT EXISTS'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> uid   'no_user'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> group 'no_user'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> uid_record   'NOT EXISTS'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> group_record 'NOT EXISTS'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> file '{'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': 'b2cbe5f297d9af192d82fd84e8284fa5', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IHJvb3Qvcm9vdAo=\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/file2', 'checksum_type': 'md5', 'revision': 1}'
2011-09-13 02:47:11 configfiles.deploy: DEBUG --> file '{'config_channel': 'no_user', 'username': 'no_user', 'encoding': 'base64', 'checksum': 'bbf7090602cc0b3560371070eea6adf9', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'no_user', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IG5vX3N1Y2hfdXNlci9ub19zdWNoX3VzZXIK\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/no_such_user_file', 'checksum_type': 'md5', 'revision': 2}'
2011-09-13 02:47:11 configfiles.deploy: Failed deployment and rollback, information on user 'no_user' could not be found

 Looking into this..
Comment 5 Marcelo Moreira de Mello 2011-09-22 12:05:50 EDT
Created attachment 524443 [details]
patch proposed

Howdy team, 

 When scheduling a config files deployment using the webUI, rhn_check fails if some file scheduled does not have a valid UID/GID into client box. 

 This patch introduce to rhn_check the same behavior as rhncfg-client get allowing the correct files (which have a valid UID/GID) to be deployed and fails to those files which misses a valid UID/GID. 

  We back port it to a test package for RHN Satellite, and customer approved the test package. (See BZ#737698). 


  Bellow follow some tests output: 

# rhncfg-client elist
             Mode          Owner Group          Size Rev      Config Channel    File
             -rw-r--r--     root root             35   1             no_user    /etc/file2
             -rw-r--r--     root root            199   1             no_user    /etc/hosts
             -rw-r--r--  no_user no_user          51   2             no_user    /etc/no_such_user_file
             -rw-r--r--     root root             34   1             no_user    /tmp/file1
             -rw-r--r--  no_user no_user          50   2             no_user    /tmp/no_such_user_tmp_file


            # id no_user 
            id: no_user: No such user

            # rhncfg-client verify
            missing /etc/file2
            modified /etc/hosts
            missing /etc/no_such_user_file
            missing /tmp/file1
            missing /tmp/no_such_user_tmp_file

            ** Going to webUI and setting all files to be deployed

            ** Running rhn_check and reporting results

            # rhn_check  -vv
            { .. SNIP .. }
               
D: do_call configfiles.deploy ({'files': [{'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': '361eac4774c9280fbd0c28221e3a7e39', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyN0aGlzIGZpbGUgaXMgb3duZWQgYnkgcm9vdC9yb290Cg==\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/tmp/file1', 'checksum_type': 'md5', 'revision': 1}, {'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': 'b2cbe5f297d9af192d82fd84e8284fa5', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IHJvb3Qvcm9vdAo=\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/file2', 'checksum_type': 'md5', 'revision': 1}, {'config_channel': 'no_user', 'username': 'no_user', 'encoding': 'base64', 'checksum': 'bbf7090602cc0b3560371070eea6adf9', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'no_user', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IG5vX3N1Y2hfdXNlci9ub19zdWNoX3VzZXIK\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/no_such_user_file', 'checksum_type': 'md5', 'revision': 2}, {'config_channel': 'no_user', 'username': 'no_user', 'encoding': 'base64', 'checksum': 'ff64077256ab8a9153e460ee04e42c22', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'no_user', 'file_contents': 'IyN0aGlzIGZpbGUgaXMgb3duZWQgYnkgbm9fc3VjaF91c2VyL25vX3N1Y2hfdXNlcgo=\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/tmp/no_such_user_tmp_file', 'checksum_type': 'md5', 'revision': 2}, {'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': '3ee5504a6f4824026fde8f4802a15881', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyMjIHRlc3Qgb2YgL2V0Yy9ob3N0cyBmaWxlcwoxMjcuMC4wLjEgICBsb2NhbGhvc3QgbG9jYWxo\nb3N0LmxvY2FsZG9tYWluIGxvY2FsaG9zdDQgbG9jYWxob3N0NC5sb2NhbGRvbWFpbjQKOjoxICAg\nICAgICAgbG9jYWxob3N0IGxvY2FsaG9zdC5sb2NhbGRvbWFpbiBsb2NhbGhvc3Q2IGxvY2FsaG9z\ndDYubG9jYWxkb21haW42CgoKIyBFT0YgZmlsZQ==\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/hosts', 'checksum_type': 'md5', 'revision': 1}]},) {'cache_only': None}
D: Sending back response (44, 'Files successfully deployed but some files were not deployed for not having a valid uid/gid', {})
D: do_call packages.checkNeedUpdate ('rhnsd=1',) {}
Loaded plugins: rhnplugin
D: Called refresh_rpmlist
Updating package profile
D: local action status:  (0, 'rpmlist refreshed', {})

                 
           # rhncfg-client verify
                    /etc/file2
                    /etc/hosts
            missing /etc/no_such_user_file
                    /tmp/file1
            missing /tmp/no_such_user_tmp_file

          # ls -la /tmp/no_such_user_tmp_file /tmp/file1 /etc/no_such_user_file /etc/hosts /etc/file2 
          ls: /tmp/no_such_user_tmp_file: No such file or directory
          ls: /etc/no_such_user_file: No such file or directory
          -rw-r--r-- 1 root root  35 Sep 15 01:01 /etc/file2
          -rw-r--r-- 1 root root 199 Sep 15 01:01 /etc/hosts
          -rw-r--r-- 1 root root  34 Sep 15 01:01 /tmp/file1

   As we can see, the rhn_check now deployed the correct files and not the missing UID/GID files. Looking the logs we have: 

# cat /var/log/rhncfg-actions 
2011-09-15 01:01:51 configfiles.deploy: Files successfully deployed: 
path: /tmp/file1
revision: 1

path: /etc/file2
revision: 1

path: /etc/hosts
revision: 1
 {}
2011-09-15 01:01:51 configfiles.deploy: Files not deployed for not having a valid uid/gid: 
path: /tmp/no_such_user_tmp_file
revision: 2

path: /etc/no_such_user_file
revision: 2
 {}

  At webUI we have: 
Details:

     This action will be executed after 09/15/11 1:01:38 AM BRT.

     This action's status is: Failed.
     The client picked up this action on 09/15/11 1:01:52 AM BRT.
     The client completed this action on 09/15/11 1:01:53 AM BRT.
     Client execution returned "Files successfully deployed but some files were not deployed for not having a valid uid/gid" (code 44)
     
     Config Files:
          /etc/file2 (rev. 1)	
          /etc/hosts (rev. 1)	
          /etc/no_such_user_file (rev. 2)	
          /tmp/file1 (rev. 1)	
          /tmp/no_such_user_tmp_file (rev. 2)

 
   Afterwards, creating the missing user the deployment worked as expected:

   # useradd  no_user
   # rhn_check -v 
   .. { SNIP } ..
   D: do_call configfiles.deploy ({'files': [{'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': '361eac4774c9280fbd0c28221e3a7e39', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyN0aGlzIGZpbGUgaXMgb3duZWQgYnkgcm9vdC9yb290Cg==\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/tmp/file1', 'checksum_type': 'md5', 'revision': 1}, {'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': 'b2cbe5f297d9af192d82fd84e8284fa5', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IHJvb3Qvcm9vdAo=\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/file2', 'checksum_type': 'md5', 'revision': 1}, {'config_channel': 'no_user', 'username': 'no_user', 'encoding': 'base64', 'checksum': 'bbf7090602cc0b3560371070eea6adf9', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'no_user', 'file_contents': 'IyMgdGhpcyBmaWxlIGlzIG93bmVkIGJ5IG5vX3N1Y2hfdXNlci9ub19zdWNoX3VzZXIK\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/no_such_user_file', 'checksum_type': 'md5', 'revision': 2}, {'config_channel': 'no_user', 'username': 'no_user', 'encoding': 'base64', 'checksum': 'ff64077256ab8a9153e460ee04e42c22', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'no_user', 'file_contents': 'IyN0aGlzIGZpbGUgaXMgb3duZWQgYnkgbm9fc3VjaF91c2VyL25vX3N1Y2hfdXNlcgo=\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/tmp/no_such_user_tmp_file', 'checksum_type': 'md5', 'revision': 2}, {'config_channel': 'no_user', 'username': 'root', 'encoding': 'base64', 'checksum': '3ee5504a6f4824026fde8f4802a15881', 'filetype': 'file', 'delim_start': '{|', 'delim_end': '|}', 'symlink': '', 'groupname': 'root', 'file_contents': 'IyMjIHRlc3Qgb2YgL2V0Yy9ob3N0cyBmaWxlcwoxMjcuMC4wLjEgICBsb2NhbGhvc3QgbG9jYWxo\nb3N0LmxvY2FsZG9tYWluIGxvY2FsaG9zdDQgbG9jYWxob3N0NC5sb2NhbGRvbWFpbjQKOjoxICAg\nICAgICAgbG9jYWxob3N0IGxvY2FsaG9zdC5sb2NhbGRvbWFpbiBsb2NhbGhvc3Q2IGxvY2FsaG9z\ndDYubG9jYWxkb21haW42CgoKIyBFT0YgZmlsZQ==\n', 'selinux_ctx': '', 'filemode': 644, 'path': '/etc/hosts', 'checksum_type': 'md5', 'revision': 1}]},) {'cache_only': None}
   D: Sending back response (0, 'Files successfully deployed', {})
   D: do_call packages.checkNeedUpdate ('rhnsd=1',) {}
   Loaded plugins: rhnplugin
   D: local action status:  (0, 'rpm database not modified since last update (or package list recently updated)', {})

   # ls -la /tmp/no_such_user_tmp_file /tmp/file1 /etc/no_such_user_file /etc/hosts /etc/file2 
   -rw-r--r-- 1 root    root     35 Sep 15 01:06 /etc/file2
   -rw-r--r-- 1 root    root    199 Sep 15 01:06 /etc/hosts
   -rw-r--r-- 1 no_user no_user  51 Sep 15 01:06 /etc/no_such_user_file
   -rw-r--r-- 1 root    root     34 Sep 15 01:06 /tmp/file1
   -rw-r--r-- 1 no_user no_user  50 Sep 15 01:06 /tmp/no_such_user_tmp_file

   # rhncfg-client  verify
    /etc/file2
    /etc/hosts
    /etc/no_such_user_file
    /tmp/file1
    /tmp/no_such_user_tmp_file

   # rhncfg-client  elist
   Mode          Owner Group          Size Rev      Config Channel    File
   -rw-r--r--     root root             35   1             no_user    /etc/file2
   -rw-r--r--     root root            199   1             no_user    /etc/hosts
   -rw-r--r--  no_user no_user          51   2             no_user    /etc/no_such_user_file
   -rw-r--r--     root root             34   1             no_user    /tmp/file1
   -rw-r--r--  no_user no_user          50   2             no_user    /tmp/no_such_user_tmp_file

 ++++++++++++++++++++++
 
   Patch already sent to approval at Spacewalk Devel Maillist 

     Mail Thread: https://www.redhat.com/archives/spacewalk-devel/2011-September/msg00036.html

 Best, 
mmello
Comment 6 Jan Pazdziora 2011-09-30 07:24:58 EDT
As noted at

https://www.redhat.com/archives/spacewalk-devel/2011-September/msg00042.html

My preference would be to keep the current rhn_check (strict)
behaviour and change the rhncfg-client get behaviour to

	- default to the current behaviour on terminal and to
	  strict behaviour of stdout is not a terminal;
	- have command-line option to force either the strict or
	  non-strict behaviour.

I'm marking this bugzilla as RFE.

Note You need to log in before you can comment on or make changes to this bug.