metasploit-framework/msfupdate

120 lines
3.2 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env ruby
# -*- coding: binary -*-
# $Id$
# $Revision$
msfbase = __FILE__
2012-10-04 06:06:38 +08:00
while File.symlink?(msfbase)
msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
end
2012-11-06 01:48:09 +08:00
@msfbase_dir = File.dirname(msfbase)
@args = ARGV.dup
2012-10-10 05:56:22 +08:00
# May be changed
@configdir = File.expand_path(File.join(File.dirname(msfbase), "data", "svn"))
2012-11-06 01:48:09 +08:00
Dir.chdir(@msfbase_dir)
$stderr.puts "[*]"
$stderr.puts "[*] Attempting to update the Metasploit Framework..."
$stderr.puts "[*]"
$stderr.puts ""
if not (Process.uid == 0 or File.stat(msfbase).owned?)
$stderr.puts "[-] ERROR: User running msfupdate does not own the metasploit install"
$stderr.puts "Please run msfupdate as the same user who installed metasploit."
end
2012-11-06 01:48:09 +08:00
def is_git
File.directory?(File.join(@msfbase_dir, ".git"))
end
2012-11-06 01:48:09 +08:00
def is_svn
File.directory?(File.join(@msfbase_dir, ".svn"))
end
# TODO
def print_depreciation_warning
end
# Some of these args are meaningful for SVN, some for Git,
# some for both. Fun times.
2012-10-02 01:41:36 +08:00
@args.each_with_index do |arg,i|
2012-10-02 02:07:51 +08:00
case arg
# Handle the old wait/nowait argument behavior
when "wait", "nowait"
@wait_index = i
@actually_wait = (arg == "wait")
# An empty or absent config-dir means a default config-dir
when "--config-dir"
@configdir_index = i
# A defined config dir means a defined config-dir
when /--config-dir=(.*)?/
2012-10-02 02:07:51 +08:00
# Spaces in the directory should be fine since this whole thing is passed
# as a single argument via the multi-arg syntax for system() below.
# TODO: Test this spaces business. I don't buy it. -todb
@configdir = $1
@configdir_index = i
2012-10-02 01:41:36 +08:00
end
end
@args[@wait_index] = nil if @wait_index
@args[@configdir_index] = nil if @configdir_index
@args = @args.compact
####### Since we're SVN, do it all this way #######
if is_svn
print_depreciation_warning
@args.push("--config-dir=#{@configdir}")
@args.push("--non-interactive")
res = system("svn", "cleanup")
if res.nil?
$stderr.puts "[-] ERROR: Failed to run svn"
$stderr.puts ""
$stderr.puts "[-] If you used a binary installer, make sure you run the symlink in"
$stderr.puts "[-] /usr/local/bin instead of running this file directly (e.g.: ./msfupdate)"
$stderr.puts "[-] to ensure a proper environment."
exit 1
else
# Cleanup worked, go ahead and update
system("svn", "update", *@args)
end
end
####### Since we're Git, do it all that way #######
if is_git
# Always lose any local changes, but not unchecked files
# TODO: Allow for git stash and git stash pop
res = system("git", "reset", "HEAD", "--hard")
if res.nil?
$stderr.puts "[-] ERROR: Failed to run git"
$stderr.puts ""
$stderr.puts "[-] If you used a binary installer, make sure you run the symlink in"
$stderr.puts "[-] /usr/local/bin instead of running this file directly (e.g.: ./msfupdate)"
$stderr.puts "[-] to ensure a proper environment."
exit 1
end
# TODO: Allow msfupdate to take a branch argument
system("git", "checkout", "master")
system("git", "fetch")
system("git", "merge", "origin/master")
end
unless is_svn || is_git
2012-11-06 01:48:09 +08:00
raise RuntimeError, "Cannot determine checkout type: `#{@msfbase_dir}'"
end
if @actually_wait
$stderr.puts ""
$stderr.puts "[*] Please hit enter to exit"
$stderr.puts ""
$stdin.readline
end