diff --git a/src/onedb/fsck.rb b/src/onedb/fsck.rb index 6b5a314b41..a92a73c79b 100644 --- a/src/onedb/fsck.rb +++ b/src/onedb/fsck.rb @@ -150,6 +150,26 @@ EOT true end + # Check if object UID/GID exist + # + # @param doc [XML] XML document + def check_ugid(doc) + obj = doc.root.name + id = doc.root.at_xpath('ID').text + uid = Integer(doc.root.at_xpath('UID').text) + gid = Integer(doc.root.at_xpath('GID').text) + + return if @users.include?(uid) && @groups.include?(gid) + + if !@users.include?(uid) + log_error("#{obj} ID=#{id}, UID=#{uid} doesn't exist", false) + end + + if !@groups.include?(gid) + log_error("#{obj} ID=#{id}, GID=#{uid} doesn't exist", false) + end + end + ######################################################################## # Acl ######################################################################## @@ -241,6 +261,15 @@ EOT end def fsck + # ---------------------------------------------------------------------- + # Read existing UIDs and GIDs + # ---------------------------------------------------------------------- + @users = [] + @groups = [] + + @db.fetch('SELECT oid FROM user_pool') do |r| @users << r[:oid] end + @db.fetch('SELECT oid FROM group_pool') do |r| @groups << r[:oid] end + init_log_time() @errors = 0 diff --git a/src/onedb/fsck/datastore.rb b/src/onedb/fsck/datastore.rb index 15f9b3fb32..eca174b209 100644 --- a/src/onedb/fsck/datastore.rb +++ b/src/onedb/fsck/datastore.rb @@ -23,6 +23,8 @@ module OneDBFsck images_elem = doc.root.xpath('IMAGES').remove images_new_elem = doc.create_element('IMAGES') + check_ugid(doc) + doc.root.add_child(images_new_elem) datastore[ds_id][:images].each do |id| diff --git a/src/onedb/fsck/image.rb b/src/onedb/fsck/image.rb index 8e82bef1a1..0d0b6cd207 100644 --- a/src/onedb/fsck/image.rb +++ b/src/onedb/fsck/image.rb @@ -35,9 +35,10 @@ module OneDBFsck @db.transaction do @db[:image_pool].each do |row| doc = nokogiri_doc(row[:body], 'image_pool') - oid = row[:oid] + check_ugid(doc) + persistent = ( doc.root.xpath('PERSISTENT').text == "1" ) current_state = doc.root.xpath('STATE').text.to_i diff --git a/src/onedb/fsck/marketplace.rb b/src/onedb/fsck/marketplace.rb index d07ae8cb43..f7cd539b78 100644 --- a/src/onedb/fsck/marketplace.rb +++ b/src/onedb/fsck/marketplace.rb @@ -19,6 +19,8 @@ module OneDBFsck market_id = row[:oid] doc = nokogiri_doc(row[:body], 'marketplace_pool') + check_ugid(doc) + apps_elem = doc.root.at_xpath("MARKETPLACEAPPS") apps_elem.remove if !apps_elem.nil? diff --git a/src/onedb/fsck/marketplaceapp.rb b/src/onedb/fsck/marketplaceapp.rb index 9957d0367a..c26880d0a7 100644 --- a/src/onedb/fsck/marketplaceapp.rb +++ b/src/onedb/fsck/marketplaceapp.rb @@ -24,6 +24,8 @@ module OneDBFsck @db.fetch("SELECT oid,body FROM marketplaceapp_pool") do |row| doc = nokogiri_doc(row[:body], 'marketplaceapp_pool') + check_ugid(doc) + market_id = doc.root.xpath('MARKETPLACE_ID').text.to_i market_name = doc.root.xpath('MARKETPLACE').text diff --git a/src/onedb/fsck/network.rb b/src/onedb/fsck/network.rb index 2f7bd0df2e..19fb68c684 100644 --- a/src/onedb/fsck/network.rb +++ b/src/onedb/fsck/network.rb @@ -36,6 +36,8 @@ module OneDBFsck doc = nokogiri_doc(row[:body]) oid = row[:oid] + check_ugid(doc) + used_leases = doc.root.at_xpath('USED_LEASES').text.to_i counter_no_ar = counters[:vnet][row[:oid]][:no_ar_leases] ar_leases = counters[:vnet][row[:oid]][:ar_leases] diff --git a/src/onedb/fsck/template.rb b/src/onedb/fsck/template.rb index 3b677362c8..11dfd60eec 100644 --- a/src/onedb/fsck/template.rb +++ b/src/onedb/fsck/template.rb @@ -4,11 +4,11 @@ module OneDBFsck templates_fix = @fixes_template = {} @db[:template_pool].each do |row| - doc = nokogiri_doc(row[:body], 'template_pool') - + doc = nokogiri_doc(row[:body], 'template_pool') boot = doc.root.at_xpath("TEMPLATE/OS/BOOT") + uid = doc.root.at_xpath('UID').content - uid = doc.root.at_xpath('UID').content + check_ugid(doc) if boot.nil? || boot.text.downcase.match(/fd|hd|cdrom|network/).nil? next diff --git a/src/onedb/fsck/vm.rb b/src/onedb/fsck/vm.rb index 7dd111e2bd..2bc9f11233 100644 --- a/src/onedb/fsck/vm.rb +++ b/src/onedb/fsck/vm.rb @@ -13,6 +13,8 @@ module OneDBFsck @db.fetch("SELECT oid,body FROM vm_pool WHERE state<>6") do |row| vm_doc = nokogiri_doc(row[:body]) + check_ugid(vm_doc) + state = vm_doc.root.at_xpath('STATE').text.to_i lcm_state = vm_doc.root.at_xpath('LCM_STATE').text.to_i diff --git a/src/onedb/fsck/vrouter.rb b/src/onedb/fsck/vrouter.rb index 8f551022fd..8a9cd24d4d 100644 --- a/src/onedb/fsck/vrouter.rb +++ b/src/onedb/fsck/vrouter.rb @@ -7,6 +7,8 @@ module OneDBFsck @db.fetch("SELECT oid,body FROM vrouter_pool") do |row| vrouter_doc = nokogiri_doc(row[:body]) + check_ugid(vrouter_doc) + # DATA: VNets used by this Virtual Router vrouter_doc.root.xpath("TEMPLATE/NIC").each do |nic| net_id = nil