mang_keeper 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .mangkeeper/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in mang_keeper.gemspec
4
+ gemspec
@@ -0,0 +1,4 @@
1
+ MangKeeper
2
+ ==========
3
+
4
+ mangkeeper -h
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'rubygems'
5
+ rescue LoadError
6
+ end
7
+
8
+ require 'mang_keeper'
9
+
10
+ MangKeeper.application.run
@@ -0,0 +1,21 @@
1
+ require "optparse"
2
+ require "ostruct"
3
+ require "active_support/inflector"
4
+ require "json"
5
+
6
+ require "mang_keeper/version"
7
+ require "mang_keeper/helpers/dbhelpers"
8
+ require "mang_keeper/helpers/helpers"
9
+ require "mang_keeper/helpers/initcheckhelpers"
10
+ require "mang_keeper/helpers/confighelpers"
11
+ require "mang_keeper/updates"
12
+ require "mang_keeper/updates/core"
13
+ require "mang_keeper/updates/ytdb"
14
+ require "mang_keeper/updates/core_mr"
15
+ require "mang_keeper/updates/sd2"
16
+ require "mang_keeper/updates/sd2_mr"
17
+ require "mang_keeper/scenario"
18
+ require "mang_keeper/storage"
19
+ require "mang_keeper/config"
20
+ require "mang_keeper/application"
21
+ require "mang_keeper/initializer"
@@ -0,0 +1,157 @@
1
+ module MangKeeper
2
+ class << self
3
+ def application
4
+ @application ||= Application.new
5
+ end
6
+
7
+ def scenario
8
+ application.scenario
9
+ end
10
+ end
11
+
12
+ class Application
13
+
14
+ DEFAULT_STORAGE_DIR = ".mangkeeper"
15
+ DEFAULT_SCENARIO = "info"
16
+
17
+ attr_accessor :skip_init_check
18
+ attr_reader :scenario
19
+
20
+ def initialize
21
+ @skip_init_check = false
22
+ end
23
+
24
+ def run
25
+ init
26
+ start_scenario
27
+ end
28
+
29
+ def init
30
+ handle_options
31
+ load_storage
32
+ config
33
+ get_scenario_name
34
+ load_scenario
35
+ end
36
+
37
+
38
+ def options
39
+ @options ||= OpenStruct.new
40
+ end
41
+
42
+ def storage
43
+ @storage
44
+ end
45
+
46
+ def config
47
+ @config ||= ConfigManager.new
48
+ end
49
+
50
+ def initializer
51
+ @initializer = Initializer.new
52
+ end
53
+
54
+ def dry_run?
55
+ !!options.dryrun
56
+ end
57
+
58
+ # A list of all the standard options, suitable for
59
+ # passing to OptionParser.
60
+ def standard_options
61
+ [
62
+ ['--dry-run', '-n', "Do a dry run without executing actions.",
63
+ lambda { |value| options.dryrun = true }
64
+ ],
65
+ ['--storedir', '-d', "Specify mangkeeper internal storage directory",
66
+ lambda { |value| options.storagedir = value }
67
+ ],
68
+ ['--version', '-v', "Display the program version.",
69
+ lambda { |value|
70
+ puts "mangkeeper, version #{VERSION}"
71
+ exit
72
+ }
73
+ ],
74
+ ]
75
+ end
76
+
77
+ # Read and handle the command line options.
78
+ def handle_options
79
+ OptionParser.new do |opts|
80
+ opts.banner = "mangkeeper scenario {options}"
81
+ opts.separator ""
82
+ opts.separator "Options are ..."
83
+
84
+ opts.on_tail("-h", "--help", "-H", "Display this help message.") do
85
+ puts opts
86
+ exit
87
+ end
88
+
89
+ standard_options.each { |args| opts.on(*args) }
90
+ end.parse!
91
+ end
92
+
93
+ private
94
+
95
+ def load_storage
96
+ storage_dir = options.storagedir || DEFAULT_STORAGE_DIR
97
+ @storage = Storage.new(storage_dir)
98
+ end
99
+
100
+ def get_scenario_name
101
+ @scenario_name = ARGV[0] || DEFAULT_SCENARIO
102
+ end
103
+
104
+ def load_scenario
105
+ # Locate scenario
106
+ scenario_classname = "#{@scenario_name}_scenario".classify
107
+
108
+ checklist = [
109
+ # Search scenario in the storage...
110
+ File.expand_path(File.join(storage.directory, 'scenarios')),
111
+
112
+ # Search scenario in gem
113
+ 'mang_keeper/scenarios',
114
+
115
+ # In the current directory
116
+ '.',
117
+ './scenarios'
118
+ ]
119
+
120
+ # Search
121
+ @scenario_path = nil
122
+ checklist.each do |path|
123
+ file = build_scenario_path(path, scenario_classname.underscore)
124
+
125
+ load_error = false
126
+ begin
127
+ require file
128
+ rescue LoadError
129
+ load_error = true
130
+ end
131
+ unless load_error
132
+ @scenario_path = file
133
+ break
134
+ end
135
+ end
136
+ raise "Scenario #{@scenario_name} not found!" unless @scenario_path
137
+
138
+ @scenario = scenario_classname.constantize.new
139
+ end
140
+
141
+ def build_scenario_path(path, scenario_name, ext = 'rb')
142
+ ext = ".#{ext}" unless ext =~ /^\./
143
+ File.join(path, "#{scenario_name}#{ext}")
144
+ end
145
+
146
+ def start_scenario
147
+ unless @skip_init_check || MangKeeper.application.storage.init?
148
+ puts("You have to run \"mangkeeper init\" before you can use this command!")
149
+ exit
150
+ end
151
+ config.load_required
152
+ @scenario.work
153
+ end
154
+ end
155
+
156
+ end
157
+
@@ -0,0 +1,63 @@
1
+ module MangKeeper
2
+
3
+ class ConfigManager
4
+
5
+ def initialize
6
+ @configs = {}
7
+ @required_configs_loaded = false
8
+ end
9
+
10
+ def [](key)
11
+ @configs[key][:data]
12
+ end
13
+
14
+ def require(config)
15
+ return false if @configs[config]
16
+ @configs[config] = { :loaded => false }
17
+ load_required if @required_configs_loaded
18
+ end
19
+
20
+ def load_required
21
+ @configs.each do |config, info|
22
+ next if info[:loaded]
23
+ config_data = load(config, nil)
24
+ if config_data
25
+ info[:data] = config_data
26
+ info[:loaded] = true
27
+ else
28
+ raise "Required config was not found: #{config}"
29
+ end
30
+ end
31
+ @required_configs_loaded = true
32
+ end
33
+
34
+ def dump(config)
35
+ save(config, self[config])
36
+ end
37
+
38
+ def load(file, default = nil)
39
+ file = filename_check(file)
40
+ data = MangKeeper.application.storage.load(file, nil)
41
+ if data
42
+ JSON.parse(data)
43
+ else
44
+ default
45
+ end
46
+ end
47
+
48
+ def save(file, data)
49
+ file = filename_check(file)
50
+ MangKeeper.application.storage.save(file, JSON.pretty_generate(data))
51
+ end
52
+
53
+ private
54
+
55
+ def filename_check(filename)
56
+ filename = filename.to_s
57
+ filename = filename + ".json" if File.extname(filename) == ""
58
+ filename
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,13 @@
1
+ module MangKeeper
2
+
3
+ module ConfigHelpers
4
+
5
+ module ClassMethods
6
+ def require_config(*args)
7
+ args.each { |conf| MangKeeper.application.config.require(conf) }
8
+ end
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,51 @@
1
+ module MangKeeper
2
+
3
+ module DBHelpers
4
+
5
+ def set_default_db database
6
+ @default_db = database
7
+ end
8
+
9
+ def set_mysql_auth user, pass
10
+ @mysql_user, @mysql_pass = user, pass
11
+ end
12
+
13
+ def upload_file_to_db filename, database = @default_db, options = {}
14
+ do_log = options[:log].nil? ? true : options[:log]
15
+ full_path_in_log = options[:full_path_in_log].nil? ? true : options[:full_path_in_log]
16
+ read_only_mode = options[:read_only_mode].nil? ? false : options[:read_only_mode]
17
+
18
+ if do_log
19
+ log_filename = full_path_in_log ? filename : File.basename(filename)
20
+ puts "Uploading file: #{log_filename} to #{database}"
21
+ end
22
+ `mysql -B -u#{@mysql_user} -p#{@mysql_pass} -D#{database} < "#{filename}"` unless read_only_mode
23
+ # puts "Done" if do_log
24
+ end
25
+
26
+ def recreate_db database
27
+ puts "Recreating DB: #{database}"
28
+ if os_windows?
29
+ `echo DROP DATABASE IF EXISTS #{database}; | mysql -B -u#{@mysql_user} -p#{@mysql_pass}`
30
+ `echo CREATE DATABASE IF NOT EXISTS #{database}; | mysql -B -u#{@mysql_user} -p#{@mysql_pass}`
31
+ else
32
+ `echo "DROP DATABASE IF EXISTS #{database};" | mysql -B -u#{@mysql_user} -p#{@mysql_pass}`
33
+ `echo "CREATE DATABASE IF NOT EXISTS #{database};" | mysql -B -u#{@mysql_user} -p#{@mysql_pass}`
34
+ end
35
+ end
36
+
37
+
38
+ def upload_by_glob glob, options = {}
39
+ db = options[:db] || 'mangos'
40
+ exclude = options[:exclude] || []
41
+ filters = options[:filters] || []
42
+ Dir.glob(glob).each do |file|
43
+ next if exclude.member? File.basename(file)
44
+ next if filters.any? { |filter_proc| filter_proc && !filter_proc.call(file) }
45
+ upload_file_to_db file, db, { :read_only_mode => options[:read_only] }
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,9 @@
1
+ def os_windows?
2
+ !!(RUBY_PLATFORM =~ /mswin|mingw/)
3
+ end
4
+
5
+ class String
6
+ def to_i!(*args)
7
+ self.gsub(/[^0-9]/,'').to_i(*args)
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module MangKeeper
2
+
3
+ module InitCheckHelpers
4
+
5
+ def skip_init_check!
6
+ MangKeeper.application.skip_init_check = true
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,22 @@
1
+ config.save :mysql, {
2
+ user: "root",
3
+ pass: "",
4
+ default_db: "mangos",
5
+ }
6
+
7
+ config.save :sources_paths, {
8
+ mangos: "mangos",
9
+ scriptdev2: "mangos/src/bindings/ScriptDev2",
10
+ ytdb: "YTDB",
11
+ }
12
+
13
+ config.save :git_repos, {
14
+ mangos: "git://github.com/<user>/mangos.git",
15
+ scriptdev2: "git://github.com/<user>/scriptdev2.git",
16
+ ytdb: "git://github.com/<user>/YTDB.git",
17
+ }
18
+
19
+ config.save :load_sources, {
20
+ patch_scriptdev: true,
21
+ unpack_ytdb: true,
22
+ }
@@ -0,0 +1,53 @@
1
+ module MangKeeper
2
+
3
+ class Initializer
4
+ INIT_GENERATORS_DIR = File.join(File.dirname(__FILE__), "init_generators")
5
+
6
+ class InitContext
7
+ def initialize(filename)
8
+ @filename = filename
9
+ end
10
+
11
+ def application
12
+ MangKeeper.application
13
+ end
14
+
15
+ def config
16
+ application.config
17
+ end
18
+
19
+ def storage
20
+ application.storage
21
+ end
22
+ end
23
+
24
+ # This is an internal ruby constructor!!
25
+ def initialize
26
+ collect_init_scripts
27
+ end
28
+
29
+ def run
30
+ prepare_storage_dir
31
+ run_init_scripts
32
+ end
33
+
34
+ private
35
+
36
+ def collect_init_scripts
37
+ @init_scripts = Dir[File.join(INIT_GENERATORS_DIR, "*.rb")]
38
+ end
39
+
40
+ def run_init_scripts
41
+ @init_scripts.each do |init_script|
42
+ InitContext.new(init_script).instance_eval(File.read(init_script))
43
+ end
44
+ end
45
+
46
+ def prepare_storage_dir
47
+ Dir.mkdir(MangKeeper.application.storage.directory) unless File.directory?(MangKeeper.application.storage.directory)
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,26 @@
1
+ module MangKeeper
2
+
3
+ module Scenario
4
+
5
+ class Base
6
+ include DBHelpers
7
+ extend InitCheckHelpers
8
+ extend ConfigHelpers::ClassMethods
9
+
10
+ def storage
11
+ MangKeeper.application.storage
12
+ end
13
+
14
+ def config
15
+ MangKeeper.application.config
16
+ end
17
+
18
+ def work
19
+ raise "Work must be defined for scenario!"
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,8 @@
1
+ class InfoScenario < MangKeeper::Scenario::Base
2
+
3
+ def work
4
+ puts "MangKeeper"
5
+ puts "Use \"mangkeeper -h\" to get some hints"
6
+ end
7
+
8
+ end
@@ -0,0 +1,13 @@
1
+ class InitScenario < MangKeeper::Scenario::Base
2
+ skip_init_check!
3
+
4
+ def work
5
+ MangKeeper.application.initializer.run
6
+ puts <<-MSG.gsub(/^ */, "")
7
+ Initialized MangKeeper in #{storage.directory}
8
+
9
+ Now you should visit #{storage.directory} and do some configuration...
10
+ MSG
11
+ end
12
+
13
+ end
@@ -0,0 +1,35 @@
1
+ module MangKeeper
2
+
3
+ class Storage
4
+ attr_reader :directory
5
+
6
+ def initialize(dir)
7
+ @directory = dir
8
+ # warn "Storage directory #{directory} does not exist!" unless File.directory?(directory)
9
+ end
10
+
11
+ def save(file, data)
12
+ File.open(File.join(directory, file.to_s), "w") do |f|
13
+ f.write(data)
14
+ end
15
+ end
16
+
17
+ # Load file with default value on error
18
+ def load(file, default = nil)
19
+ load!(file)
20
+ rescue Errno::ENOENT
21
+ default
22
+ end
23
+
24
+ # Load JSON file with exception
25
+ def load!(file)
26
+ File.read(File.join(directory, file.to_s))
27
+ end
28
+
29
+ # Is current storage directory initialized with mangkeeper?
30
+ def init?
31
+ File.directory?(directory)
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,119 @@
1
+ module MangKeeper
2
+
3
+ class UpdatesList
4
+
5
+ def self.run &block
6
+ self.new.tap{ |list| list.instance_eval(&block) }
7
+ end
8
+
9
+ def initialize
10
+ @list = []
11
+ @filters = {}
12
+ end
13
+
14
+ # Allows tobind filter for specific update class
15
+ # Update will only be added if filter value is true
16
+ def filter(class_names, filter_code = nil, &block)
17
+ filter_code = block unless filter_code
18
+ raise ArgumentError, "You must pass a block or a proc as a second argument!" unless filter_code
19
+ class_names = [class_names] unless class_names.kind_of?(Array)
20
+ class_names.each do |class_name|
21
+ @filters[class_name] ||= []
22
+ @filters[class_name] << filter_code
23
+ end
24
+ self
25
+ end
26
+
27
+ def add(update)
28
+ return false if @filters[update.class].any? { |filter_proc| filter_proc && !filter_proc.call(update) }
29
+ add!(update)
30
+ end
31
+
32
+ def add!(update)
33
+ @list << update
34
+ end
35
+
36
+ def scan_by_glob(glob, updates_type)
37
+ Dir.glob(glob).each do |filename|
38
+ update = updates_type.build filename
39
+ add update if update
40
+ end
41
+ self
42
+ end
43
+ alias_method :[], :scan_by_glob
44
+
45
+ def apply_all(read_only = false)
46
+ sorted_list.each do |update|
47
+ filename, database = update.upload_info
48
+ if read_only
49
+ puts "Will upload #{filename} to #{database} [#{update.class.name}]"
50
+ else
51
+ MangKeeper.scenario.upload_file_to_db(filename, database)
52
+ end
53
+ update.applied!
54
+ end
55
+ end
56
+
57
+ def latest_update
58
+ sorted_list.last
59
+ end
60
+
61
+ def to_s
62
+ sorted_list.map(&:to_s).join("\n")
63
+ end
64
+
65
+ private
66
+
67
+ def sorted_list
68
+ @list.sort! do |a,b|
69
+ a, b = a.sort_data, b.sort_data
70
+ i = 0
71
+ i+=1 while a[i] == b[i] && (a[i+1] || b[i+1])
72
+ if a[i] && b[i]
73
+ a[i] <=> b[i]
74
+ else
75
+ a[i] ? 1 : -1
76
+ end
77
+ end
78
+ @list
79
+ end
80
+ end
81
+
82
+ class AbstractUpdateFile
83
+ attr_reader :filename, :database
84
+
85
+ def self.build(filename)
86
+ self.new :filename => filename
87
+ end
88
+
89
+ def initialize(options = {})
90
+ @filename = options[:filename]
91
+ @database = options[:database] # silently ignore if its nil and upload to default db
92
+ raise "Full filename must be supplied as :filename!" unless @filename
93
+ end
94
+
95
+ def upload_info
96
+ [self.filename, self.database]
97
+ end
98
+
99
+ def sort_data
100
+ []
101
+ end
102
+
103
+ def applied?
104
+ @applied
105
+ end
106
+
107
+ def applied!
108
+ @applied = true
109
+ end
110
+
111
+ def to_s
112
+ info
113
+ end
114
+
115
+ def info
116
+ "[#{self.class.name}:#{filename}]"
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,27 @@
1
+ module MangKeeper
2
+ class CoreUpdateFile < AbstractUpdateFile
3
+ APPLY_PRIORITY = 1
4
+
5
+ def self.build filename
6
+ update = File.basename(filename, '.sql').split('_')
7
+ self.new :filename => filename, :database => update[2], :core_revision => update[0].to_i, :num => update[1].to_i
8
+ end
9
+
10
+ attr_reader :core_revision, :num
11
+ def initialize options = {}
12
+ super
13
+ @core_revision = options[:core_revision]
14
+ @num = options[:num]
15
+ raise "Core revision must be supplied as :core_revision!" unless @core_revision
16
+ end
17
+
18
+ def sort_data
19
+ [core_revision, APPLY_PRIORITY, num]
20
+ end
21
+
22
+ def info
23
+ "Rev#{core_revision} #{super}"
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,26 @@
1
+ module MangKeeper
2
+ class CoreMrUpdateFile < AbstractUpdateFile
3
+ APPLY_PRIORITY = 1
4
+
5
+ def self.build filename
6
+ update = File.basename(filename, '.sql').split('_')
7
+ self.new :filename => filename, :database => update[1], :mr_revision => update[0].to_i!
8
+ end
9
+
10
+ attr_reader :mr_revision
11
+ def initialize options = {}
12
+ super
13
+ @mr_revision = options[:mr_revision]
14
+ raise "MR revision must be supplied as :mr_revision!" unless @mr_revision
15
+ end
16
+
17
+ def sort_data
18
+ [mr_revision, APPLY_PRIORITY]
19
+ end
20
+
21
+ def info
22
+ "Rev#{mr_revision} #{super}"
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ module MangKeeper
2
+ class Sd2UpdateFile < AbstractUpdateFile
3
+ APPLY_PRIORITY = 1
4
+
5
+ def self.build filename
6
+ update = File.basename(filename, '.sql').split('_')
7
+ self.new :filename => filename, :database => update[1], :sd2_revision => update[0].to_i!
8
+ end
9
+
10
+ attr_reader :sd2_revision
11
+ def initialize options = {}
12
+ super
13
+ @sd2_revision = options[:sd2_revision]
14
+ raise "SD2 revision must be supplied as :sd2_revision!" unless @sd2_revision
15
+ end
16
+
17
+ def sort_data
18
+ [sd2_revision, APPLY_PRIORITY]
19
+ end
20
+
21
+ def info
22
+ "Rev#{sd2_revision} #{super}"
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ module MangKeeper
2
+ class Sd2MrUpdateFile < AbstractUpdateFile
3
+ APPLY_PRIORITY = 1
4
+
5
+ def self.build filename
6
+ update = File.basename(filename, '.sql').split('_')
7
+ self.new :filename => filename, :database => update[1], :mr_revision => update[0].to_i!
8
+ end
9
+
10
+ attr_reader :mr_revision
11
+ def initialize options = {}
12
+ super
13
+ @mr_revision = options[:mr_revision]
14
+ raise "MR revision must be supplied as :mr_revision!" unless @mr_revision
15
+ end
16
+
17
+ def sort_data
18
+ [mr_revision, APPLY_PRIORITY]
19
+ end
20
+
21
+ def info
22
+ "Rev#{mr_revision} #{super}"
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,27 @@
1
+ module MangKeeper
2
+ class YTDBUpdateFile < AbstractUpdateFile
3
+ APPLY_PRIORITY = 5
4
+
5
+ def self.build filename
6
+ update = File.basename(filename, '.sql').split('_')
7
+ return if update[1] == 'corepatch' # skip all corepatches...
8
+ self.new :filename => filename, :database => update[1], :core_revision => update[3].to_i!
9
+ end
10
+
11
+ attr_reader :core_revision
12
+ def initialize options = {}
13
+ super
14
+ @core_revision = options[:core_revision]
15
+ raise "Core revision must be supplied as :core_revision!" unless @core_revision
16
+ end
17
+
18
+ def sort_data
19
+ [core_revision, APPLY_PRIORITY]
20
+ end
21
+
22
+ def info
23
+ "Rev#{core_revision} #{super}"
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,3 @@
1
+ module MangKeeper
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mang_keeper/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mang_keeper"
7
+ s.version = MangKeeper::VERSION
8
+ s.authors = ["MOZGIII"]
9
+ s.email = ["mike-n@narod.ru"]
10
+ s.homepage = "http://github.com/MOZGIII/MaNGOS-Keeper"
11
+ s.summary = %q{MaNGOS Keeper}
12
+ s.description = %q{Helps to maintain MaNGOS server.}
13
+
14
+ s.rubyforge_project = "mang_keeper"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mang_keeper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - MOZGIII
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-10 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Helps to maintain MaNGOS server.
15
+ email:
16
+ - mike-n@narod.ru
17
+ executables:
18
+ - mangkeeper
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - README.md
25
+ - Rakefile
26
+ - bin/mangkeeper
27
+ - lib/mang_keeper.rb
28
+ - lib/mang_keeper/application.rb
29
+ - lib/mang_keeper/config.rb
30
+ - lib/mang_keeper/helpers/confighelpers.rb
31
+ - lib/mang_keeper/helpers/dbhelpers.rb
32
+ - lib/mang_keeper/helpers/helpers.rb
33
+ - lib/mang_keeper/helpers/initcheckhelpers.rb
34
+ - lib/mang_keeper/init_generators/configs.rb
35
+ - lib/mang_keeper/initializer.rb
36
+ - lib/mang_keeper/scenario.rb
37
+ - lib/mang_keeper/scenarios/info_scenario.rb
38
+ - lib/mang_keeper/scenarios/init_scenario.rb
39
+ - lib/mang_keeper/storage.rb
40
+ - lib/mang_keeper/updates.rb
41
+ - lib/mang_keeper/updates/core.rb
42
+ - lib/mang_keeper/updates/core_mr.rb
43
+ - lib/mang_keeper/updates/sd2.rb
44
+ - lib/mang_keeper/updates/sd2_mr.rb
45
+ - lib/mang_keeper/updates/ytdb.rb
46
+ - lib/mang_keeper/version.rb
47
+ - mang_keeper.gemspec
48
+ homepage: http://github.com/MOZGIII/MaNGOS-Keeper
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project: mang_keeper
68
+ rubygems_version: 1.8.10
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: MaNGOS Keeper
72
+ test_files: []