server 0.0.4 → 0.0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.document +5 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +26 -0
  6. data/Gemfile.lock +113 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.md +12 -1
  9. data/Rakefile +54 -0
  10. data/bin/server +18 -2
  11. data/lib/server/cli.rb +84 -0
  12. data/lib/server/colorizer.rb +12 -0
  13. data/lib/server/conf.rb +148 -0
  14. data/lib/server/installed.rb +23 -0
  15. data/lib/server/log.rb +70 -0
  16. data/lib/server/packages/nginx.rb +54 -0
  17. data/lib/server/packages/phpfpm.rb +37 -0
  18. data/lib/server/packages/templates/nginx.rb +39 -0
  19. data/lib/server/packages/templates/raw/nginx.conf.template +7 -0
  20. data/lib/server/packages/templates/renderer.rb +21 -0
  21. data/lib/server/signals.rb +1 -0
  22. data/lib/server/step.rb +22 -0
  23. data/lib/server/sys.rb +40 -0
  24. data/lib/server/workflows/db.rb +20 -0
  25. data/lib/server/workflows/web.rb +21 -0
  26. data/lib/server.rb +30 -59
  27. data/test/helper.rb +49 -0
  28. data/test/loader.rb +14 -0
  29. data/test/test_logger.rb +38 -0
  30. data/test/test_server.rb +7 -0
  31. data/test/test_templates.rb +14 -0
  32. metadata +188 -26
  33. data/lib/classes/conf.rb +0 -15
  34. data/lib/classes/installed.rb +0 -19
  35. data/lib/classes/sys.rb +0 -11
  36. data/lib/packages/nginx.rb +0 -15
  37. data/lib/packages/phpfpm.rb +0 -15
  38. data/lib/packages/templates/nginx.conf.template +0 -0
  39. data/lib/workflows/db.rb +0 -16
  40. data/lib/workflows/web.rb +0 -18
  41. /data/lib/{packages/templates → server/packages/templates/raw}/haproxy.cfg.template +0 -0
  42. /data/lib/{packages/templates → server/packages/templates/raw}/memcached.conf.template +0 -0
  43. /data/lib/{packages/templates → server/packages/templates/raw}/php.ini.template +0 -0
  44. /data/lib/{packages/templates → server/packages/templates/raw}/phpfpm.conf.template +0 -0
  45. /data/lib/{packages/templates → server/packages/templates/raw}/redis.conf.template +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 73f2ffd5286942a0faa91206e080e9188d285e2b
4
- data.tar.gz: 9167fb9464873647d3e43936f3a05ba844ee61bd
3
+ metadata.gz: a91f424371e91a31c1d549cf6f082c49aa31abc8
4
+ data.tar.gz: e49d1753a6cedfa0dc1f5d2f49e5ddb7fa91c30d
5
5
  SHA512:
6
- metadata.gz: b718465df94217cf0fa277c6fe4395ab1cd429ddf91fa74f0b0f68dd47604b0ef6aeb52b019a6bac969079b787b4c70ef06be7e465f7a742e2be97eb047d9a1c
7
- data.tar.gz: d4b839795e4327cfb63bff10ee220412cb6d8ce7024e31fe99cb5398eb4297121fc60b9b3064461aa46d00a36e9be1ad01ba5d95d9cd3111c97c187ba2701a47
6
+ metadata.gz: e7da0f4131c76811ea7ff0a773ac71855ec218a77aff09faea55a85e3a6d65b55e361371222cd50bc4a49a2bd532572ee27e1b2991704aa873fdbdfb68e5a39d
7
+ data.tar.gz: 600477a8c7f83e9d47866fa53a4e5078cb5f4046a9ff8e4b16c6dda2f1030f8495fed124333d19254e8347b626287e39b9752a4b7d926f61d7d1ab1115ef1433
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ # - 1.9.2
6
+ # - 1.8.7
7
+ # - jruby-18mode
8
+ # - jruby-19mode
9
+ # - ruby-head
10
+ # - jruby-head
11
+ # - ree
data/Gemfile ADDED
@@ -0,0 +1,26 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Add dependencies required to use your gem here.
4
+ # Example:
5
+ # gem "activesupport", ">= 2.3.5"
6
+ gem "thor", ">= 0.17.1" # http://whatisthor.com/
7
+ gem "highline", ">= 1.5.1" # https://github.com/JEG2/highline
8
+ gem "mustache", "~> 0.99.4" # https://github.com/defunkt/mustache
9
+ gem "terminal-table" # https://github.com/visionmedia/terminal-table
10
+ gem "ruby-progressbar" # https://github.com/jfelchner/ruby-progressbar
11
+
12
+ # gem "god" # http://godrb.com/ <<<<< Still not sure about this. Maybe I can make it work in this for something awesome.
13
+
14
+ # Add dependencies to develop your gem here.
15
+ # Include everything needed to run rake, tests, features, etc.
16
+ group :development do
17
+ gem 'coveralls'
18
+ gem "rake", "~> 10.0"
19
+ gem "shoulda", ">= 3.0"
20
+ gem "rdoc", ">= 4.0"
21
+ gem "bundler", "~> 1.0"
22
+ gem "jeweler", "~> 2.0.1"
23
+ gem "simplecov", ">= 0.8.0"
24
+ gem "ronn" # https://github.com/rtomayko/ronn
25
+ gem "fakefs" # https://github.com/defunkt/fakefs
26
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,113 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (4.0.3)
5
+ i18n (~> 0.6, >= 0.6.4)
6
+ minitest (~> 4.2)
7
+ multi_json (~> 1.3)
8
+ thread_safe (~> 0.1)
9
+ tzinfo (~> 0.3.37)
10
+ addressable (2.3.5)
11
+ atomic (1.1.14)
12
+ builder (3.2.2)
13
+ coveralls (0.7.0)
14
+ multi_json (~> 1.3)
15
+ rest-client
16
+ simplecov (>= 0.7)
17
+ term-ansicolor
18
+ thor
19
+ descendants_tracker (0.0.3)
20
+ docile (1.1.3)
21
+ fakefs (0.5.0)
22
+ faraday (0.9.0)
23
+ multipart-post (>= 1.2, < 3)
24
+ git (1.2.6)
25
+ github_api (0.11.3)
26
+ addressable (~> 2.3)
27
+ descendants_tracker (~> 0.0.1)
28
+ faraday (~> 0.8, < 0.10)
29
+ hashie (>= 1.2)
30
+ multi_json (>= 1.7.5, < 2.0)
31
+ nokogiri (~> 1.6.0)
32
+ oauth2
33
+ hashie (2.0.5)
34
+ highline (1.6.20)
35
+ hpricot (0.8.6)
36
+ i18n (0.6.9)
37
+ jeweler (2.0.1)
38
+ builder
39
+ bundler (>= 1.0)
40
+ git (>= 1.2.5)
41
+ github_api
42
+ highline (>= 1.6.15)
43
+ nokogiri (>= 1.5.10)
44
+ rake
45
+ rdoc
46
+ json (1.8.1)
47
+ jwt (0.1.11)
48
+ multi_json (>= 1.5)
49
+ mime-types (2.1)
50
+ mini_portile (0.5.2)
51
+ minitest (4.7.5)
52
+ multi_json (1.8.4)
53
+ multi_xml (0.5.5)
54
+ multipart-post (2.0.0)
55
+ mustache (0.99.5)
56
+ nokogiri (1.6.1)
57
+ mini_portile (~> 0.5.0)
58
+ oauth2 (0.9.3)
59
+ faraday (>= 0.8, < 0.10)
60
+ jwt (~> 0.1.8)
61
+ multi_json (~> 1.3)
62
+ multi_xml (~> 0.5)
63
+ rack (~> 1.2)
64
+ rack (1.5.2)
65
+ rake (10.1.1)
66
+ rdiscount (2.1.7)
67
+ rdoc (4.1.1)
68
+ json (~> 1.4)
69
+ rest-client (1.6.7)
70
+ mime-types (>= 1.16)
71
+ ronn (0.7.3)
72
+ hpricot (>= 0.8.2)
73
+ mustache (>= 0.7.0)
74
+ rdiscount (>= 1.5.8)
75
+ ruby-progressbar (1.4.1)
76
+ shoulda (3.5.0)
77
+ shoulda-context (~> 1.0, >= 1.0.1)
78
+ shoulda-matchers (>= 1.4.1, < 3.0)
79
+ shoulda-context (1.1.6)
80
+ shoulda-matchers (2.5.0)
81
+ activesupport (>= 3.0.0)
82
+ simplecov (0.8.2)
83
+ docile (~> 1.1.0)
84
+ multi_json
85
+ simplecov-html (~> 0.8.0)
86
+ simplecov-html (0.8.0)
87
+ term-ansicolor (1.3.0)
88
+ tins (~> 1.0)
89
+ terminal-table (1.4.5)
90
+ thor (0.18.1)
91
+ thread_safe (0.1.3)
92
+ atomic
93
+ tins (1.0.0)
94
+ tzinfo (0.3.38)
95
+
96
+ PLATFORMS
97
+ ruby
98
+
99
+ DEPENDENCIES
100
+ bundler (~> 1.0)
101
+ coveralls
102
+ fakefs
103
+ highline (>= 1.5.1)
104
+ jeweler (~> 2.0.1)
105
+ mustache (~> 0.99.4)
106
+ rake (~> 10.0)
107
+ rdoc (>= 4.0)
108
+ ronn
109
+ ruby-progressbar
110
+ shoulda (>= 3.0)
111
+ simplecov (>= 0.8.0)
112
+ terminal-table
113
+ thor (>= 0.17.1)
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 Pierce Moore
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,4 +1,15 @@
1
- server-gem [![Gem Version](https://badge.fury.io/rb/server.png)](http://badge.fury.io/rb/server)
1
+ server-gem
2
2
  ==========
3
3
 
4
+ [![Coverage Status](https://coveralls.io/repos/rex/server-gem/badge.png)](https://coveralls.io/r/rex/server-gem)
5
+ [![Gem Version](https://badge.fury.io/rb/server.png)](http://badge.fury.io/rb/server)
6
+ [![Build Status](https://travis-ci.org/rex/server-gem.png?branch=master)](https://travis-ci.org/rex/server-gem)
7
+ [![Build Status](https://drone.io/github.com/rex/server-gem/status.png)](https://drone.io/github.com/rex/server-gem/latest)
8
+ [![Dependency Status](https://gemnasium.com/rex/server-gem.png)](https://gemnasium.com/rex/server-gem)
9
+ [![Code Climate](https://codeclimate.com/github/rex/server-gem.png)](https://codeclimate.com/github/rex/server-gem)
10
+ [![Codeship Status for rex/server-gem](https://www.codeship.io/projects/cadef7a0-80dc-0131-4ae6-76ce49ff457f/status?branch=master)](https://www.codeship.io/projects/14664)
11
+
4
12
  Manage servers in a really awesome way. Like a boss.
13
+
14
+ NOT FINISHED. NOT REALLY EVEN STARTED. WORK IN PROGRESS. DO NOT USE YET.
15
+ ===
data/Rakefile ADDED
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
+ gem.name = "server"
18
+ gem.version = "0.0.4"
19
+ gem.homepage = "http://github.com/rex/server-gem"
20
+ gem.license = "MIT"
21
+ gem.summary = "Manage servers in a really awesome way. Like a boss. NOTE: This doesn't do much of anything yet. In a few days I should have a much more awesome feature set live."
22
+ gem.description = "PRE-ALPHA RELEASE! This gem is a work in progress that will soon allow for much easier management of servers and performance of various server administration tasks."
23
+ gem.email = "me@prex.io"
24
+ gem.authors = ["Pierce Moore"]
25
+ gem.required_ruby_version = '>= 1.9.3'
26
+ gem.require_paths = ["lib"]
27
+ # dependencies defined in Gemfile
28
+ end
29
+ Jeweler::RubygemsDotOrgTasks.new
30
+
31
+ require 'rake/testtask'
32
+ Rake::TestTask.new(:test) do |test|
33
+ test.libs << 'lib' << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+
38
+ desc "Code coverage detail"
39
+ task :simplecov do
40
+ ENV['COVERAGE'] = "true"
41
+ Rake::Task['test'].execute
42
+ end
43
+
44
+ task :default => :test
45
+
46
+ require 'rdoc/task'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "server #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/bin/server CHANGED
@@ -1,7 +1,23 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- Signal.trap("INT") { exit 1 }
3
+ # Update our load path to make loading internal files easier
4
+ libdir = File.expand_path('../lib/', File.dirname( __FILE__ ) )
5
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
6
+
7
+ require 'server/log' # Initialize our logs
8
+ $Log = Server::Log.new(STDOUT)
9
+
10
+ require 'server/signals' # Initialize our signal listeners
11
+ require 'server/step' # Our convenient step helper
12
+
13
+ $Log.debug("ARGV: #{ARGV}")
14
+
15
+ # $Log.debug("$LOAD_PATH > #{$LOAD_PATH}")
4
16
 
5
17
  require 'server'
6
18
 
7
- # Server.start(ARGV)
19
+ Server.init
20
+
21
+ require 'server/cli'
22
+
23
+ Server::CLI.start(ARGV)
data/lib/server/cli.rb ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require 'highline/import'
5
+ # require 'server/installed'
6
+ # require 'server/conf'
7
+ # require 'server/sys'
8
+ # require 'server/workflows/web'
9
+ # require 'server/workflows/db'
10
+ require 'server/packages/nginx'
11
+ require 'server/packages/phpfpm'
12
+
13
+ module Server
14
+
15
+ class CLI < Thor
16
+
17
+ class_option :info, :type => :boolean, :aliases => "-v", :desc => "Enable info logging"
18
+ class_option :verbose, :type => :boolean, :aliases => "-vv", :desc => "Enable verbose logging"
19
+ class_option :quiet, :type => :boolean, :aliases => "-q", :desc => "Silence all non-error logging"
20
+ class_option :expanded, :type => :boolean, :aliases => "-e", :desc => "Make logging output more roomy and easy to read"
21
+ class_option :reset, :type => :boolean, :aliases => "--delete-config", :desc => "Performs a hard reset on the server config file"
22
+
23
+ no_commands do
24
+ def self.explain
25
+ $Log.info( "Server runtime path: #{Server.runtime_path}" )
26
+ $Log.info( "Server settings: #{Server.settings}" )
27
+ end
28
+ end
29
+
30
+ desc "build", "Build a general server type"
31
+ def build
32
+ choose do |menu|
33
+
34
+ menu.prompt = "What type of server is this going to be?"
35
+
36
+ menu.choice(:web) { Workflows::Web.start! }
37
+ menu.choice(:db) { Workflows::Db.start! }
38
+
39
+ end
40
+ end
41
+
42
+ desc "install", "Installs and configures packages"
43
+ def install
44
+ choose do |menu|
45
+ menu.prompt = "What package do you want to install?"
46
+
47
+ menu.choice(:nginx) { Server::Packages::Nginx.install! }
48
+ menu.choice(:phpfpm) { Server::Packages::PHPFPM.install! }
49
+ end
50
+ end
51
+
52
+ desc "configure", "Change the configuration of an existing package"
53
+ def configure
54
+ $Log.info( "Configuring" )
55
+ end
56
+
57
+ desc "server", "Change general server/machine settings"
58
+ def server
59
+ $Log.info( "Server settings" )
60
+ end
61
+
62
+ desc "ssh", "Manage authorized SSH keys"
63
+ def ssh
64
+ $Log.info( "SSH keys" )
65
+ end
66
+
67
+ desc "stats", "View statistics for this machine"
68
+ def stats
69
+ $Log.info( "Machine stats" )
70
+ end
71
+
72
+ desc "info", "Displays information about this machine"
73
+ def info
74
+ $Log.info( "Nginx path: #{Conf::nginx_path}" )
75
+ $Log.info( "PHP-FPM path: #{Conf::phpfpm_path}" )
76
+ $Log.info( "Yum package manager available" ) if Installed::yum?
77
+ $Log.info( "Brew package manager available" ) if Installed::brew?
78
+ $Log.info( "PHP-FPM installed" ) if Installed::phpfpm?
79
+ $Log.info( "Nginx installed" ) if Installed::nginx?
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,12 @@
1
+ class String
2
+
3
+ def black; "\033[30m#{self}\033[0m" end
4
+ def red; "\033[31m#{self}\033[0m" end
5
+ def green; "\033[32m#{self}\033[0m" end
6
+ def brown; "\033[33m#{self}\033[0m" end
7
+ def blue; "\033[34m#{self}\033[0m" end
8
+ def magenta; "\033[35m#{self}\033[0m" end
9
+ def cyan; "\033[36m#{self}\033[0m" end
10
+ def gray; "\033[37m#{self}\033[0m" end
11
+
12
+ end
@@ -0,0 +1,148 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pathname'
4
+ require 'fileutils'
5
+ require 'json'
6
+ require 'terminal-table'
7
+
8
+ module Server
9
+
10
+ class Conf
11
+ attr_reader :okay
12
+ attr_accessor :config
13
+
14
+ def initialize(opts)
15
+ configure! if ARGV.include?('--delete-config') || !paths[:config].exist?
16
+
17
+ # Check whether we're able to properly interact with the config
18
+ @okay = true
19
+ @okay = false if !paths[:sys_dir].writable?
20
+ @okay = false if !paths[:app_dir].writable?
21
+ @okay = false if !paths[:config].writable?
22
+
23
+ @okay ? $Log.info("Environment ready to configure") : $Log.error("Unable to configure environment")
24
+
25
+ check_permissions
26
+
27
+ # Now create necessary files
28
+ create! if !paths[:config].exist?
29
+ end
30
+
31
+ def paths
32
+ {
33
+ :config => Pathname.new(Server.config_path),
34
+ :sys_dir => Pathname.new(Server.sys_dir),
35
+ :app_dir => Pathname.new(Server.app_dir)
36
+ }
37
+ end
38
+
39
+ def check_permissions
40
+ $Log.debug("Checking permissions for config module")
41
+ rows = []
42
+ paths.each do |name, path|
43
+ good = "✓".green
44
+ bad = "✖".red
45
+ exists = path.exist? ? good : bad
46
+ readable = path.readable? ? good : bad
47
+ writable = path.writable? ? good : bad
48
+
49
+ rows << [name, path, exists, readable, writable]
50
+
51
+ # msg = "#{name} (#{path}): "
52
+ # path.exist? ? msg = "#{msg}#{'exists ✓'.green}" : msg = "#{msg}#{'exists ✖'.red}"
53
+ # path.readable? ? msg = "#{msg}#{', readable ✓'.green}" : msg = "#{msg}#{', readable ✖'.red}"
54
+ # path.writable? ? msg = "#{msg}#{', writable ✓'.green}" : msg = "#{msg}#{', writable ✖'.red}"
55
+ # $Log.info(msg)
56
+ end
57
+
58
+ table = Terminal::Table.new :title => "File Permissions", :headings => ['name', 'path', 'exists?', 'readable?', 'writable?'], :alignment => :center, :rows => rows
59
+ puts table
60
+ end
61
+
62
+ def configure!
63
+ delete! if ARGV.include?('--delete-config')
64
+
65
+ $Log.info("Configuring file/folder paths")
66
+
67
+ Step.start("Making sys_dir writable")
68
+ FileUtils.chmod("u=wrx,go=rx", paths[:sys_dir]) if !paths[:sys_dir].exist?
69
+ Step.complete()
70
+
71
+ Step.start("Creating app_dir")
72
+ FileUtils.mkdir(paths[:app_dir], :mode => 0755) if !paths[:app_dir].exist?
73
+ Step.complete()
74
+
75
+ Step.start("Making app_dir writable")
76
+ FileUtils.chmod("u=wrx,go=rx", paths[:app_dir]) if !paths[:app_dir].writable?
77
+ Step.complete()
78
+
79
+ # Now let's see if the config file is blank. If so, it's the first
80
+ # run and we need to create and store it.
81
+ $Log.debug("Creating base JSON config if need be")
82
+ create! if !read
83
+
84
+ # $Log.debug("Config file: #{read}")
85
+ # $Log.debug("Raw config file: #{File.read(paths[:config])}")
86
+
87
+ return true
88
+ end
89
+
90
+ def read
91
+
92
+ $Log.debug("Parsing config file: #{paths[:config]}")
93
+ config = begin
94
+ if paths[:config].exist? && File.size?(paths[:config])
95
+ Logger.debug("File exists and has size: #{File.size?(paths[:config])}")
96
+ json = File.read(paths[:config])
97
+ JSON.parse(json) if json != ""
98
+ else
99
+ $Log.fatal("Can't read config.json... Did you break something?")
100
+ return false
101
+ end
102
+ rescue JSON::ParserError, TypeError => e
103
+ $Log.error("Could not parse config file: #{e.message}")
104
+ $Log.error(e.backtrace)
105
+ end
106
+ end
107
+
108
+ def write!(config)
109
+ # $Log.debug("Writing config: #{config}")
110
+ if !config.respond_to?("to_json")
111
+ $Log.error("Unable to convert configuration to JSON. Is the gem installed?")
112
+ return false
113
+ else
114
+ File.open(paths[:config], "w") do |f|
115
+ f.write(config.to_json)
116
+ end
117
+ end
118
+ end
119
+
120
+ def get(item)
121
+ #
122
+ end
123
+
124
+ def update(opts)
125
+ #
126
+ end
127
+
128
+ def create!
129
+ $Log.info("Creating server-gem config file")
130
+ config = {}
131
+
132
+ [:packages, :sys, :installed, :conf, :history, :info, :log, :signals, :vim, :ssh, :cron, :build].each do |key|
133
+ config[key] = {}
134
+ end
135
+
136
+ write!(config)
137
+ end
138
+
139
+ def delete!
140
+ Step.start("Deleting existing config: #{paths[:config]}")
141
+ FileUtils.rm(paths[:config]) if paths[:config].exist?
142
+
143
+ paths[:config].exist? ? Step.fail("Failed to delete config file") : Step.complete
144
+ end
145
+
146
+ end
147
+
148
+ end
@@ -0,0 +1,23 @@
1
+ module Server
2
+
3
+ class Installed
4
+
5
+ def self.yum?
6
+ `which yum` != ""
7
+ end
8
+
9
+ def self.brew?
10
+ `which brew` != ""
11
+ end
12
+
13
+ def self.nginx?
14
+ `which nginx` != ""
15
+ end
16
+
17
+ def self.phpfpm?
18
+ `which php-fpm` != ""
19
+ end
20
+
21
+ end
22
+
23
+ end
data/lib/server/log.rb ADDED
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logger'
4
+ require 'server/colorizer'
5
+
6
+ module Server
7
+
8
+ class Log
9
+
10
+ def initialize(output_stream)
11
+ @instance = Logger.new(output_stream)
12
+
13
+ format_date
14
+ set_prompts
15
+ return @instance
16
+ end
17
+
18
+ def format_date(format = '%Y-%m-%d %H:%M:%S')
19
+ @instance.datetime_format = format
20
+ end
21
+
22
+ def set_prompts
23
+ @instance.formatter = proc do |severity, datetime, progname, msg|
24
+ case severity.downcase
25
+ when "debug"
26
+ prompt = "☰ ".blue
27
+ when "info"
28
+ prompt = "i ".green
29
+ when "warn"
30
+ prompt = "⚑ ".magenta
31
+ when "error"
32
+ prompt = "⁢⁢⁢⁢⁢⁢✖ ".red
33
+ when "fatal"
34
+ prompt = ":( ".red
35
+ else
36
+ prompt = "✓ ".blue
37
+ end
38
+
39
+ ( ARGV.include? "-e" ) ? "#{prompt} #{datetime.strftime("%Y/%m/%d %H:%M:%S")} \n » #{msg.strip} \n\n" : "#{prompt} #{msg.strip} \n"
40
+ end
41
+ end
42
+
43
+ def debug(msg)
44
+ text = @instance.debug(msg)
45
+ puts "Debug text? #{text}"
46
+ end
47
+
48
+ def info(msg)
49
+ @instance.info(msg)
50
+ end
51
+
52
+ def warn(msg)
53
+ @instance.warn(msg)
54
+ end
55
+
56
+ def error(msg)
57
+ @instance.error(msg)
58
+ end
59
+
60
+ def fatal(msg)
61
+ @instance.fatal(msg)
62
+ end
63
+
64
+ def add(severity, msg)
65
+ @instance.add(severity, msg)
66
+ end
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,54 @@
1
+ require 'mustache'
2
+ require 'server/packages/templates/nginx'
3
+
4
+ module Server
5
+
6
+ module Packages
7
+
8
+ class Nginx
9
+
10
+ attr_accessor :template
11
+
12
+ def self.init
13
+ @template = Server::Templates::Nginx.new
14
+ end
15
+
16
+ def self.install!(opts = {})
17
+ self.init
18
+
19
+ $Log.info("Installing Nginx!")
20
+ self.render_config
21
+ self.write_config!
22
+ end
23
+
24
+ def self.uninstall!(opts)
25
+ self.init
26
+ #
27
+ end
28
+
29
+ def self.configure(opts)
30
+ self.init
31
+ #
32
+ end
33
+
34
+ def self.render_config
35
+ Step.start("Rendering config")
36
+ @content = @template.render
37
+ Step.complete
38
+ end
39
+
40
+ def self.write_config!
41
+ return $Log.warn("Compiled template was empty") if @content == ""
42
+
43
+ Step.start("Writing nginx template to #{Server.pkg_path}/nginx.conf")
44
+ File.open("#{Server.pkg_path}/nginx.conf", "w") do |f|
45
+ f.write(@content)
46
+ end
47
+ Step.complete
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end