Files
metasploit-gs/msfupdate
T

143 lines
4.2 KiB
Ruby
Raw Normal View History

2010-10-19 07:32:50 +00:00
#!/usr/bin/env ruby
# -*- coding: binary -*-
2010-10-19 07:32:50 +00:00
2011-10-23 12:04:41 +00:00
# $Id$
# $Revision$
2010-10-19 07:32:50 +00:00
msfbase = __FILE__
2012-10-03 17:06:38 -05:00
while File.symlink?(msfbase)
2010-10-19 07:32:50 +00:00
msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
end
2012-11-05 11:48:09 -06:00
@msfbase_dir = File.dirname(msfbase)
2012-11-05 11:44:53 -06:00
@args = ARGV.dup
2010-10-19 07:32:50 +00:00
2012-10-09 16:56:22 -05:00
# May be changed
2012-10-09 16:25:06 -05:00
@configdir = File.expand_path(File.join(File.dirname(msfbase), "data", "svn"))
2012-11-05 11:48:09 -06:00
Dir.chdir(@msfbase_dir)
2010-10-19 07:32:50 +00:00
$stderr.puts "[*]"
$stderr.puts "[*] Attempting to update the Metasploit Framework..."
$stderr.puts "[*]"
2010-10-19 08:22:44 +00:00
$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."
2011-10-10 21:08:04 +00:00
end
2012-11-05 11:44:53 -06:00
2012-11-05 11:48:09 -06:00
def is_git
File.directory?(File.join(@msfbase_dir, ".git"))
2012-11-05 11:44:53 -06:00
end
2012-11-05 11:48:09 -06:00
def is_svn
File.directory?(File.join(@msfbase_dir, ".svn"))
2012-11-05 11:44:53 -06:00
end
2012-11-05 12:13:10 -06:00
def print_deprecation_warning
2012-11-05 12:15:11 -06:00
$stdout.puts "[*] Deprecation Note: The next version of Metasploit will"
$stdout.puts "[*] update over the git protocol, which requires outbound"
$stdout.puts "[*] access to github.com:9418/TCP."
$stdout.puts "[*] Please adjust your egress firewall rules accordingly."
2012-11-05 11:44:53 -06:00
end
# Some of these args are meaningful for SVN, some for Git,
# some for both. Fun times.
2012-10-01 12:41:36 -05:00
@args.each_with_index do |arg,i|
2012-10-01 13:07:51 -05:00
case arg
2012-11-05 11:44:53 -06:00
# Handle the old wait/nowait argument behavior
2012-10-10 09:50:30 -05:00
when "wait", "nowait"
2012-10-01 13:10:58 -05:00
@wait_index = i
2012-10-10 09:50:30 -05:00
@actually_wait = (arg == "wait")
2012-11-05 11:44:53 -06:00
# An empty or absent config-dir means a default config-dir
when "--config-dir"
@configdir_index = i
2012-11-05 11:44:53 -06:00
# A defined config dir means a defined config-dir
when /--config-dir=(.*)?/
2012-10-01 13:07:51 -05: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.
@configdir = $1
2012-10-01 13:10:58 -05:00
@configdir_index = i
2012-11-05 11:56:05 -06:00
when /--git-remote=([^\s]*)?/
@git_remote = $1
@git_remote_index = i
when /--git-branch=([^\s]*)?/
@git_branch = $1
@git_branch_index = i
2012-10-01 12:41:36 -05:00
end
end
@args[@wait_index] = nil if @wait_index
@args[@configdir_index] = nil if @configdir_index
2012-11-05 11:56:05 -06:00
@args[@git_remote_index] = nil if @git_remote_index
@args[@git_branch_index] = nil if @git_branch_index
@args = @args.compact
2012-11-05 11:44:53 -06:00
####### Since we're SVN, do it all this way #######
if is_svn
2012-11-05 12:13:10 -06:00
print_deprecation_warning
2012-11-05 11:44:53 -06:00
@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
2012-11-05 11:56:05 -06:00
remote = @git_remote || "origin"
branch = @git_branch || "master"
2012-11-05 14:37:32 -06:00
# This will save local changes in a stash, but won't
# attempt to reapply them. If the user wants them back
# they can always git stash pop them, and that presumes
# they know what they're doing when they're editing local
# checkout, which presumes they're not using msfupdate
# to begin with.
#
# Note, this requires at least user.name and user.email
# to be configured in the global git config. Installers should
# take care that this is done. TODO: Enforce this in msfupdate
res = system("git", "stash")
2012-11-05 11:44:53 -06:00
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
2012-11-05 14:52:14 -06:00
else
$stdout.puts "[*] Stashed local changes (if any) to avoid merge conflicts."
$stdout.puts "[*] Run 'git stash pop' to reapply local changes."
2012-11-05 11:44:53 -06:00
end
2012-11-05 14:37:32 -06:00
system("git", "reset", "HEAD", "--hard")
2012-11-05 11:56:05 -06:00
system("git", "checkout", branch)
2012-11-05 11:44:53 -06:00
system("git", "fetch")
2012-11-05 11:56:05 -06:00
system("git", "merge", "#{remote}/#{branch}")
2012-11-05 11:44:53 -06:00
end
unless is_svn || is_git
2012-11-05 11:48:09 -06:00
raise RuntimeError, "Cannot determine checkout type: `#{@msfbase_dir}'"
end
2011-05-03 23:58:41 +00:00
2012-10-10 09:50:30 -05:00
if @actually_wait
2010-10-19 08:22:44 +00:00
$stderr.puts ""
$stderr.puts "[*] Please hit enter to exit"
$stderr.puts ""
2010-10-19 08:22:44 +00:00
$stdin.readline
end