hardpixel/marv

View on GitHub
lib/marv/server/server.rb

Summary

Maintainability
B
4 hrs
Test Coverage
require 'mysql2'

require 'marv/server/actions'
require 'marv/server/create'

module Marv
  module Server
    class Server

      attr_accessor :task, :name, :path, :config, :host, :port, :database, :context

      # Initialize server config
      def initialize(task, dir)
        @task = task
        @global = Marv::Global.new(task)
        @name = dir
        @path = server_path
        @config_file = config_file
        @options = {}
        @config = server_config
        @host = server_host
        @port = server_port
        @database = db_client
        @context = server_context

        @global.clean_broken_links(server_projects_paths)
      end

      # Server exists
      def exists?
        ::File.exists?(server_path)
      end

      # Server path
      def server_path
          ::File.join(@global.servers_path, @name)
      end

      # Config file
      def config_file
        ::File.join(server_path, 'config.rb')
      end

      # Database name
      def db_name
        'marv_'+@name.gsub(/\W/, '_').downcase
      end

      # Database username
      def db_user
        @config[:db_user]
      end

      # Database user password
      def db_password
        @config[:db_password]
      end

      # Database host
      def db_host
        @config[:db_host]
      end

      # Database port
      def db_port
        @config[:db_port]
      end

      # Wordpress version
      def wp_version
        @config[:wp_version]
      end

      # Server host
      def server_host
        @config[:server_host]
      end

      # Server port
      def server_port
        @config[:server_port]
      end

      # Server config file
      def server_config
        config = @global.config

        # Check for user options
        unless @options.nil?
          config.merge!(@options)
        end

        # Check for config.rb in server folder
        if ::File.exists?(@config_file)
          config.merge!(@global.load_ruby_config(@config_file))
        end

        return config
      end

      # Ask for server options
      def server_options
        options = {}

        unless ::File.exists?(@config_file)
          @task.say_info "This will create a new development server."
          @task.say_warning "Please enter server settings below:"

          options.merge!(ask_server_details)
          options.merge!(ask_database_details)
          options.merge!(ask_wordpress_details)
        end

        return options
      end

      # Server details
      def ask_server_details
        options = {}
        options[:server_host] = @task.ask_input "Where do you want to run the server?", :default => @global.config[:server_host]
        options[:server_port] = @task.ask_input "Which port do you want to use?", :default => @global.config[:server_port]

        return options
      end

      # Database details
      def ask_database_details
        options = {}
        options[:db_user] = @task.ask_input "MySQL database username:", :default => @global.config[:db_user]
        options[:db_password] = @task.ask_input "MySQL database password:", :default => @global.config[:db_password]
        options[:db_host] = @task.ask_input "MySQL database host:", :default => @global.config[:db_host]
        options[:db_port] = @task.ask_input "MySQL database port:", :default => @global.config[:db_port]

        return options
      end

      # Wordpress details
      def ask_wordpress_details
        options = {}
        options[:wp_version] = @task.ask_input "WordPress version to install:", :default => @global.config[:wp_version]

        return options
      end

      # Server database
      def db_client
        begin
          ::Mysql2::Client.new(:host => db_host, :port => db_port, :username => db_user, :password => db_password)
        rescue Mysql2::Error::ConnectionError
          @task.say_error "Not able to connect to the database.", "Start the database if it is not running.", false
          abort
        end
      end

      # MySQL create database
      def db_client_create
        @database.query("CREATE DATABASE IF NOT EXISTS #{db_name}")
      end

      # MySQL create database
      def db_client_drop
        @database.query("DROP DATABASE IF EXISTS #{db_name}")
      end

      # MySQL grant all privileges
      def db_client_grant_all
        @database.query("GRANT ALL PRIVILEGES ON #{db_name}.* TO '#{db_user}'@'#{db_host}'")
      end

      # MySQL revoke all privileges
      def db_client_revoke_all
        @database.query("REVOKE ALL PRIVILEGES ON #{db_name}.* FROM '#{db_user}'@'#{db_host}'")
      end

      # MySQL flush privileges
      def db_client_flush_priv
        @database.query("FLUSH PRIVILEGES")
      end

      # Create MySQL database
      def create_database
        begin
          db_client_create
          db_client_grant_all
          db_client_flush_priv
          @database.close
        rescue Exception => e
          @task.say_error "An error occured while creating the database:", e.message, false, true
        end
      end

      # Remove MySQL database
      def remove_database
        begin
          db_client_drop
          db_client_revoke_all
          db_client_flush_priv
          @database.close
        rescue Exception => e
          @task.say_error "An error occured while removing the database:", e.message, false, true
        end
      end

      # Get server class context
      def server_context
        instance_eval('binding')
      end

      # Server projects paths
      def server_projects_paths
        paths = ::Dir.glob(::File.join(server_path, 'wp-content', 'themes', '*'))
        paths = paths + ::Dir.glob(::File.join(server_path, 'wp-content', 'plugins', '*'))

        return paths
      end

    end
  end
end