injection-helper 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/injection +52 -0
  2. data/lib/injection.rb +129 -0
  3. metadata +52 -0
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'injection'
4
+ require 'optparse'
5
+
6
+ class OptionsParser
7
+
8
+ def self.parse(args)
9
+ options = {}
10
+
11
+ opt_parser = OptionParser.new do |opts|
12
+ opts.banner = 'Usage: injection COMMAND [options]'
13
+
14
+ opts.separator ''
15
+ opts.separator 'Use "patch", "revert", "refresh", "mute", "unmute" as a COMMAND'
16
+ opts.separator ''
17
+ opts.on_tail('-h', '--help', 'Show this message') do
18
+ puts opts
19
+ exit
20
+ end
21
+
22
+ end
23
+
24
+ opt_parser.parse!(args)
25
+ options
26
+ end
27
+
28
+ end
29
+
30
+
31
+ arg = ARGV[0]
32
+ options = OptionsParser.parse(ARGV)
33
+
34
+ case arg
35
+ when 'revert'
36
+ injection = Injection.new
37
+ injection.revert
38
+ when 'patch'
39
+ injection = Injection.new
40
+ injection.patch
41
+ when 'refresh'
42
+ injection = Injection.new
43
+ injection.refresh
44
+ when 'mute'
45
+ injection = Injection.new
46
+ injection.mute_all
47
+ when 'unmute'
48
+ injection = Injection.new
49
+ injection.unmute_all
50
+ else
51
+ OptionsParser.parse(["-h"])
52
+ end
@@ -0,0 +1,129 @@
1
+ require 'socket'
2
+ require 'securerandom'
3
+
4
+ class Injection
5
+
6
+ def initialize
7
+ home = Dir.home
8
+ @resources = home + '/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/'
9
+
10
+ project_files = Dir.glob('./*.xcodeproj')
11
+
12
+ if project_files.size != 1
13
+ raise 'Zero or more than one project file found in current path. Make sure you run this script in XCode project directory '
14
+ end
15
+
16
+ @project_file = project_files[0]
17
+ end
18
+
19
+ def revert
20
+ self.execute_command('revertProject.pl')
21
+ end
22
+
23
+ def patch
24
+ self.execute_command('patchProject.pl')
25
+ end
26
+
27
+ def refresh
28
+ self.revert
29
+ self.patch
30
+ end
31
+
32
+ def my_first_public_ipv4
33
+ Socket.ip_address_list.detect { |intf| intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? }.ip_address
34
+ end
35
+
36
+ def execute_command(script_name)
37
+ ip = self.my_first_public_ipv4
38
+ puts "ip: #{ip}"
39
+
40
+ backup_suffix = SecureRandom.hex
41
+ mute_script 'common.pm', backup_suffix
42
+
43
+ command = "\"#{@resources}#{script_name}\" \"#{@resources}\" \"#{@project_file}\" \"\" \"\" i386 0 20 0 \"127.0.0.1 #{ip}\" 31444"
44
+ system(command)
45
+
46
+ unmute_script 'common.pm', backup_suffix
47
+ end
48
+
49
+ def mute_script(script_name, backup_suffix = '')
50
+ path = "#{@resources}#{script_name}"
51
+ bak_path = "#{path}_bak#{backup_suffix}"
52
+
53
+ if File.exist?(bak_path)
54
+ return
55
+ end
56
+
57
+ system("cp \"#{path}\" \"#{bak_path}\"")
58
+
59
+ puts "path: #{path}"
60
+ text = File.read(path)
61
+
62
+ muting_definitions[script_name].each { |line|
63
+ line.each { |to_replace, replacement|
64
+ puts "to_replace: #{to_replace}"
65
+ puts "replacement: #{replacement}"
66
+ text.gsub! to_replace, replacement
67
+ }
68
+
69
+ }
70
+ File.open(path, 'w') { |file| file.puts text }
71
+
72
+ end
73
+
74
+ def unmute_script(script_name, backup_suffix = '')
75
+ path = "#{@resources}#{script_name}"
76
+ bak_path = "#{path}_bak#{backup_suffix}"
77
+
78
+ system("cp \"#{bak_path}\" \"#{path}\"")
79
+ system("rm \"#{bak_path}\" ")
80
+ end
81
+
82
+ def convert_file(script_name, reverse)
83
+ path = "#{@resources}#{script_name}"
84
+ bak_path = "#{path}_bak"
85
+
86
+ system("cp \"#{path}\" \"#{bak_path}\"")
87
+
88
+ puts "path: #{path}"
89
+ text = File.read(path)
90
+
91
+ muting_definitions[script_name].each { |line|
92
+ line.each { |to_replace, replacement|
93
+ puts "to_replace: #{to_replace}"
94
+ puts "replacement: #{replacement}"
95
+ text.gsub! to_replace, replacement
96
+ }
97
+
98
+ }
99
+ File.open(path, 'w') { |file| file.puts text }
100
+ end
101
+
102
+ def mute_all
103
+
104
+ muting_definitions.each { |key, value|
105
+ mute_script key
106
+ }
107
+
108
+ end
109
+
110
+ def unmute_all
111
+
112
+ muting_definitions.each { |key, value|
113
+ unmute_script key
114
+ }
115
+
116
+ end
117
+
118
+ def muting_definitions
119
+ {'BundleInjection.h' => [{
120
+ '[alert show];' => '/* REDACTED */'
121
+ }],
122
+ 'common.pm' => [{
123
+ 'system "open \'$file\'";' => '# REDACTED ";'
124
+ }],
125
+ }
126
+ end
127
+
128
+ end
129
+
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: injection-helper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michal Lukasiewicz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-11-07 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! 'It lets you patch your project for XCode injection directly from command
15
+ line rather than
16
+
17
+ using option in Xcode or AppCode menu, which generates a lot of alerts'
18
+ email: michal.lukasiewicz@brightinventions.pl
19
+ executables:
20
+ - injection
21
+ extensions: []
22
+ extra_rdoc_files: []
23
+ files:
24
+ - lib/injection.rb
25
+ - bin/injection
26
+ homepage: https://github.com/bright/injection
27
+ licenses:
28
+ - MIT
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 1.8.24
48
+ signing_key:
49
+ specification_version: 3
50
+ summary: simple command line utility for patching project for InjectionForXcode and
51
+ reverting it
52
+ test_files: []