module Knj::Os

Public Class Methods

chdir_file(filepath) click to toggle source
# File lib/knj/os.rb, line 93
def self.chdir_file(filepath)
  if File.symlink?(filepath)
    Dir.chdir(File.dirname(File.readlink(filepath)))
  else
    Dir.chdir(File.dirname(filepath))
  end
end
check_display_env() click to toggle source

Checks if the display variable and xauth is set - if not sets it to the GDM xauth and defaults the display to :0.0.

# File lib/knj/os.rb, line 176
def self.check_display_env
  ret = {}
  
  if ENV["DISPLAY"].to_s.strip.length <= 0
    x_procs = Knj::Unix_proc.list("grep" => "/usr/bin/X")
    set_disp = nil
    
    x_procs.each do |x_proc|
      if match = x_proc["cmd"].match(/(:\d+)/)
        set_disp = match[1]
        break
      end
    end
    
    raise "Could not figure out display." if !set_disp
    
    ENV["DISPLAY"] = set_disp
    ret["display"] = set_disp
  else
    ret["display"] = ENV["DISPLAY"]
  end
  
  if !ENV["XAUTHORITY"]
    res = Knj::Os.xauth_file
    ENV["XAUTHORITY"] = res
    ret["xauth"] = res
  else
    ret["xauth"] = ENV["XAUTHORITY"]
  end
  
  return ret
end
class_exist(classstr) click to toggle source
# File lib/knj/os.rb, line 85
def self.class_exist(classstr)
  if Module.constants.index(classstr) != nil
    return true
  end
  
  return false
end
executed_cmd() click to toggle source

Returns the command used to execute the current process.

# File lib/knj/os.rb, line 210
def self.executed_cmd
  return ENV["SUDO_COMMAND"] if ENV["SUDO_COMMAND"]
  
  proc_self = Knj::Unix_proc.find_self
  cmd = proc_self["cmd"]
  
  cmd.gsub!(/^ruby([\d\.]+)/, ENV["_"]) if ENV["_"]
  
  return cmd
end
executed_executable() click to toggle source

Returns the Ruby executable that is running the current process if possible.

# File lib/knj/os.rb, line 222
def self.executed_executable
  return ENV["rvm_ruby_string"] if !ENV["rvm_ruby_string"].to_s.empty?
  
  if ENV["MY_RUBY_HOME"]
    ruby_bin_path = "#{ENV["MY_RUBY_HOME"]}/bin/ruby"
    return ruby_bin_path if File.exists?(ruby_bin_path)
  end
  
  #Try to look the executeable up by command.
  if self.os == "linux"
    unix_proc = Knj::Unix_proc.find_self
    if unix_proc
      if match_cmd = unix_proc["cmd"].match(/^(\/usr\/bin\/|)((j|iron|)ruby([\d\.-]*))(\s+|$)/)
        return "#{match_cmd[1]}#{match_cmd[2]}"
      else
        raise "Could not match the executed command from the process."
      end
    else
      raise "Could not find the self-process."
    end
  end
  
  # Code for returning RBEnv Ruby path if running through RBEnv.
  if ENV["RBENV_VERSION"] && ENV["RBENV_ROOT"]
    rbenv_path = "#{ENV["RBENV_ROOT"]}/versions/#{ENV["RBENV_VERSION"]}/bin/ruby"
    return rbenv_path if File.exists?(rbenv_path)
  end
  
  raise "Could not figure out the executed executable from the environment: '#{ENV.to_hash}'."
end
homedir() click to toggle source

Returns the path of the home-dir as a string.

Examples

print "Looks like the current user uses Mozilla software?" if File.exists?("#{Knj::Os.homedir}/.mozilla")
# File lib/knj/os.rb, line 5
def self.homedir
  if ENV["USERPROFILE"]
    homedir = ENV["USERPROFILE"]
  else
    homedir = File.expand_path("~")
  end
  
  if homedir.length <= 0
    raise "Could not figure out the homedir."
  end
  
  return homedir
end
os() click to toggle source

Returns the operating system a string.

Examples

print "Can I please move to another machine?" if Knj::Os.os == "windows"
print "I like it better now." if Knj::Os.os == "linux"
# File lib/knj/os.rb, line 55
def self.os
  if ENV["OS"]
    teststring = ENV["OS"].to_s.downcase
  elsif RUBY_PLATFORM
    teststring = RUBY_PLATFORM.to_s.downcase
  end
  
  if teststring.include?("windows")
    return "windows"
  elsif teststring.include?("linux")
    return "linux"
  elsif teststring.include?("darwin")
  else
    raise "Could not figure out OS: '#{teststring}'."
  end
end
realpath(path) click to toggle source
# File lib/knj/os.rb, line 101
def self.realpath(path)
  return self.realpath(File.readlink(path)) if File.symlink?(path)
  return path
end
shellcmd(cmd) click to toggle source

Runs a command and returns output. Also throws an exception of something is outputted to stderr.

# File lib/knj/os.rb, line 107
def self.shellcmd(cmd)
  res = {
    :out => "",
    :err => ""
  }
  
  if RUBY_ENGINE == "jruby"
    begin
      IO.popen4(cmd) do |pid, stdin, stdout, stderr|
        res[:out] << stdout.read
        res[:err] << stderr.read
      end
    rescue Errno::EBADF => e
      #Catch and rescue retarted JRuby.
      if e.message == "Bad file descriptor - Bad file descriptor"
        retry
      else
        raise e
      end
    end
  else
    require "open3"
    Open3.popen3(cmd) do |stdin, stdout, stderr|
      res[:out] << stdout.read
      res[:err] << stderr.read
    end
  end
  
  if res[:err].to_s.strip.length > 0
    raise res[:err]
  end
  
  return res[:out]
end
subproc(cmd) click to toggle source

Runs a command as a process of its own and wont block or be depended on this process.

# File lib/knj/os.rb, line 143
def self.subproc(cmd)
  %x[#{cmd} >> /dev/null 2>&1 &]
end
tmpdir() click to toggle source

This method was created to make up for the fact that Dir.tmpdir sometimes returns empty strings??

Examples

tmp_db_path = "#{Knj::Os.tmpdir}/temp_db.sqlite3"
# File lib/knj/os.rb, line 22
def self.tmpdir
  require "tmpdir"
  tmpdir = Dir.tmpdir.to_s.strip
  
  return tmpdir if tmpdir.length >= 3 and File.exists?(tmpdir)
  return ENV["TEMP"] if ENV["TEMP"].to_s.strip.length > 0 and File.exists?(ENV["TMP"])
  return ENV["TMP"] if ENV["TMP"].to_s.strip.length > 0 and File.exists?(ENV["TMP"])
  return "/tmp" if File.exists?("/tmp")
  
  raise "Could not figure out temp-dir."
end
toolkit() click to toggle source

Returns the current graphical toolkit running.

Examples

Knj::Os.toolkit #=> 'kde'
# File lib/knj/os.rb, line 75
def self.toolkit
  if self.os == "linux"
    if ENV["DESKTOP_SESSION"].index("plasma") != nil
      return "kde"
    end
  end
  
  raise "Could not figure out the toolkit."
end
whoami() click to toggle source

This method returns the username of the current user.

Examples

print "I can do what I want, I am root!" if Knj::Os.whoami == "root"
# File lib/knj/os.rb, line 37
def self.whoami
  if ENV["USERNAME"]
    whoami = ENV["USERNAME"]
  else
    whoami = %x[whoami].strip
  end
  
  if whoami.length <= 0
    raise "Could not figure out the user who is logged in."
  end
  
  return whoami
end
xauth_file() click to toggle source

Returns the xauth file for GDM.

# File lib/knj/os.rb, line 148
def self.xauth_file
  authfile = ""
  
  if File.exists?("/var/run/gdm")
    Dir.foreach("/var/run/gdm") do |file|
      next if file == "." or file == ".." or !file.match(/^auth-for-gdm-.+$/)
      authfile = "/var/run/gdm/#{file}/database"
    end
  end
  
  if File.exists?("/var/run/lightdm")
    Dir.foreach("/var/run/lightdm") do |file|
      next if file == "." or file == ".."
      
      Dir.foreach("/var/run/lightdm/#{file}") do |f2|
        authfile = "/var/run/lightdm/#{file}/#{f2}" if f2.match(/^:(\d+)$/)
      end
    end
  end
  
  if authfile.to_s.length <= 0
    raise "Could not figure out authfile for GDM."
  end
  
  return authfile
end