TYPO free

home

fighting for TYPO free code

Site checker

  1. #!/usr/bin/ruby
  2. require 'etc'
  3. require 'net/smtp'
  4.  
  5. class Checker
  6.         @@apacheGroup = 'www-data'
  7.         @@dirPermissions = '40775'
  8.         @@safeVersions = ['3.8.1', '4.1.1', '4.0.6']
  9.         @@from = 'Site Check <[email protected]_company.com>'
  10.         @@to = 'Server dudes <[email protected]_company.com>'
  11.  
  12.         def getDocumentRoot(file)
  13.                 roots = []
  14.                 fh = File.new(file, "r")
  15.                 while (line = fh.gets)
  16.                         # skip empty lines
  17.                         next if line.strip.empty?
  18.  
  19.                         line.strip!
  20.  
  21.                         # skip comments
  22.                         next if line =~ /\#.*/
  23.  
  24.                         if line =~ /DocumentRoot.*/
  25.                                 roots.push(line.sub(/DocumentRoot\s+(.*)/, '\1'))
  26.                         end
  27.                 end
  28.                 fh.close
  29.                 # remove duplicates
  30.                 roots.uniq!
  31.                 roots
  32.         end
  33.  
  34.         def getHardLinkedSites(sites)
  35.                 msg = ''
  36.                 sites.each {|x|
  37.                         srcDir = x + '/typo3_src'
  38.                         msg = msg + "- " + x + "\n" unless File.symlink?(srcDir)
  39.                 }
  40.                 if msg.empty?
  41.                         ''
  42.                 else
  43.                         msg = "The following installs contain hard linked TYPO3 sources:\n" + msg + "\n"
  44.                 end
  45.         end
  46.  
  47.         def getLocallyLinkedSites(sites)
  48.                 msg = ''
  49.                 sites.each {|x|
  50.                         srcDir = x + '/typo3_src'
  51.                         dir = File.readlink(srcDir)
  52.                         if dir =~ /^[^\/].*/
  53.                                 if dir =~ /^[^\.\.].*/
  54.                                         msg = msg + x + " -> " + dir + "\n"
  55.                                 end
  56.                         end
  57.                 }
  58.                 if msg.empty?
  59.                         ''
  60.                 else
  61.                         msg = "The following installs contain locally linked TYPO3 sources:\n" + msg + "\n"
  62.                 end
  63.         end
  64.  
  65.         def getRoots(dir)
  66.                 roots = []
  67.                 handle = Dir.open(dir)
  68.                 handle.each {|x|
  69.                         # skip default site
  70.                         next if x =~ /000-default/
  71.                         if x != '.' and x != '..'
  72.                                 roots.push(getDocumentRoot(dir + '/' + x))
  73.                         end
  74.                 }
  75.                 # remove duplicates
  76.                 roots.uniq!
  77.                 roots.flatten!
  78.                 roots.sort!
  79.                 roots
  80.         end
  81.  
  82.         def getTYPO3Sites(dir)
  83.                 sites = []
  84.                 roots = []
  85.                 roots = getRoots(dir)
  86.                 roots.each {|x|
  87.                         srcDir = x + '/typo3_src'
  88.                         if File.exists?(srcDir)
  89.                                 sites.push(x)
  90.                         end
  91.                 }
  92.                 sites
  93.         end
  94.  
  95.         def getTYPO3Versions(sites)
  96.                 pre4 = msg = beta = rc = stable = unsafe = ''
  97.                 sites.each {|x|
  98.                         srcDir = x + '/typo3_src'
  99.                         version = File.readlink(srcDir)
  100.                         version.sub!(/.*typo3_src-([^\/]*).*/, '\1')
  101.                         case version
  102.                         when /.*beta.*/ then
  103.                                 beta = beta + version + ' - ' + x + "\n"
  104.                         when /.*3\.8\.1.*/ then
  105.                                 pre4 = pre4 + version + ' - ' + x + "\n"
  106.                         when /.*RC.*/ then
  107.                                 rc = rc + version + ' - ' + x + "\n"
  108.                         else
  109.                                 if not @@safeVersions.include?(version) then
  110.                                         unsafe = unsafe + version + ' - ' + x + "\n"
  111.                                 end
  112.                         end
  113.                 }
  114.                 if beta.empty?
  115.                         ''
  116.                 else
  117.                         beta = "The following installs run on beta sources:\n" + beta + "\n"
  118.                 end
  119.                 if pre4.empty?
  120.                         ''
  121.                 else
  122.                         pre4 = "The following installs run on pre 4 (3.8.1) sources:\n" + pre4  + "\n"
  123.                 end
  124.                 if rc.empty?
  125.                         ''
  126.                 else
  127.                         rc = "The following installs run on RC sources:\n" + rc  + "\n"
  128.                 end
  129.                 if unsafe.empty?
  130.                         ''
  131.                 else
  132.                         unsafe = "The following installs run on unsafe sources:\n" + unsafe  + "\n"
  133.                 end
  134.                 msg = beta + pre4 + rc + unsafe
  135.         end
  136.  
  137.         def permissions(sites)
  138.                 dirs = ['uploads', 'typo3conf', 'typo3temp', 'fileadmin']
  139.                 permissionMsg = groupMsg = msg = ''
  140.                 map = ['---',
  141.                                         '--x',
  142.                                         '-w-',
  143.                                         '-wx',
  144.                                         'r--',
  145.                                         'r-x',
  146.                                         'rw-',
  147.                                         'rwx']
  148.                 sites.each {|s|
  149.                         dirs.each {|d|
  150.                                 path = s + '/' + d
  151.                                 #uid = File.stat(path).uid
  152.                                 gid = File.stat(path).gid
  153.                                 #puts 'Owner name: ', Etc.getpwuid(uid).name
  154.                                 group = Etc.getgrgid(gid).name
  155.                                 permissions = File.stat(path).mode
  156.                                 permissions = sprintf('%o', permissions)
  157.                                 if @@dirPermissions != permissions then
  158.                                         permissionMsg = permissionMsg + permissions + ' should be ' + @@dirPermissions + ' - ' + s + '/' + d + "\n"
  159.                                 end
  160.                                 if @@apacheGroup != group then
  161.                                         groupMsg = groupMsg + 'owner is: ' + group + '- ' + s + '/' + d + "\n"
  162.                                 end
  163.                         }
  164.                 }
  165.                 if groupMsg.empty?
  166.                         ''
  167.                 else
  168.                         groupMsg = "The following directories are not owned by #{@@apacheGroup}:\n" + groupMsg + "\n"
  169.                 end
  170.                 if permissionMsg.empty?
  171.                         ''
  172.                 else
  173.                         permissionMsg = "The following directories have incorrect permissions:\n" + permissionMsg + "\n"
  174.                 end
  175.                 msg = permissionMsg + groupMsg
  176.         end
  177.  
  178.         def sendMail(subject, message)
  179.                 msg = "From: #{@@from}\n" +
  180.                         "To: #{@@to}\n" +
  181.                         "Subject: #{subject}\n" +
  182.                         "#{message}"
  183.                 Net::SMTP.start('localhost') do |smtp|
  184.                         smtp.send_message msg, @@from, @@to
  185.                 end
  186.         end
  187. end
  188.  
  189. check = Checker.new
  190. sites = check.getTYPO3Sites('/etc/apache2/sites-enabled')
  191. msg = ''
  192. msg = msg + check.getTYPO3Versions(sites)
  193. msg = msg + check.getHardLinkedSites(sites)
  194. msg = msg + check.getLocallyLinkedSites(sites)
  195. msg = msg + check.permissions(sites)
  196.  
  197. if msg != ''
  198.         check.sendMail('Site Check report', msg)
  199. end