# # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com) # # This file is part of Ronin. # # Ronin is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ronin is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ronin. If not, see . # require 'ronin/model' require 'ronin/model/has_name' require 'ronin/extensions/meta' require 'dm-is-predefined' module Ronin # # Represents an Operating System and pre-defines other common ones # ({linux}, {freebsd}, {openbsd}, {netbsd}, {osx}, {solaris}, {windows} # and {unix}). # class OS include Model include Model::HasName is :predefined # Primary key property :id, Serial # Version of the Operating System property :version, String, :index => true # Any OS guesses for the Operating System has 0..n, :os_guesses, :model => 'OSGuess' # Any IP Addresses that might be running the Operating System has 0..n, :ip_addresses, :through => :os_guesses, :model => 'IPAddress', :via => :ip_address # # The IP Address that was most recently guessed to be using the # Operating System. # # @return [IPAddress] # The IP Address most recently guessed to be using the # Operating System. # # @since 1.0.0 # # @api public # def recent_ip_address relation = self.os_guesses.first(:order => [:created_at.desc]) if relation return relation.ip_address end end # # Converts the Operating System to a String. # # @return [String] # The OS name and version. # # @example # os = OS.new(:name => 'Linux', :version => '2.6.11') # os.to_s # => "Linux 2.6.11" # # @api public # def to_s if self.version "#{self.name} #{self.version}" else super end end # # Splits the Operating System into multiple variables. # # @return [Array] # The name and version of the Operating System. # # @example # os = OS.linux('2.6.31') # name, version = os # # name # # => "Linux" # version # # => "2.6.31" # # @since 1.0.0 # # @api public # def to_ary [self.name, self.version] end # # Defines a new predefined OS. # # @param [Symbol, String] name # The method name to define for the predefined OS. # # @param [String] os_name # The name of the OS. # # @return [nil] # # @example # OS.predefine :freebsd, 'FreeBSD' # # @api private # def OS.predefine(name,attributes) unless attributes[:name] raise(ArgumentError,"must specify the :name attribute") end super(name,attributes) # if no version was predefined, allow the predefined helper-methods # to accept a version argument unless attributes[:version] os_name = attributes[:name] meta_def(name) do |*arguments| attributes = predefined_attributes[name] version = if arguments.first arguments.first.to_s end OS.first_or_create(attributes.merge(:version => version)) end end return nil end # The Linux OS predefine :linux, :name => 'Linux' # The FreeBSD OS predefine :freebsd, :name => 'FreeBSD' # The OpenBSD OS predefine :openbsd, :name => 'OpenBSD' # The NetBSD OS predefine :netbsd, :name => 'NetBSD' # OSX predefine :osx, :name => 'OSX' # The Solaris OS predefine :solaris, :name => 'Solaris' # The Windows OS predefine :windows, :name => 'Windows' # The family UNIX OSes predefine :unix, :name => 'UNIX' end end