From 3d8167d5e49c0c48d4bad6bc2e308f3d9635fb79 Mon Sep 17 00:00:00 2001 From: bohung Date: Fri, 24 Apr 2020 22:38:28 +0800 Subject: [PATCH] Finish create site feature.Add server manager. --- .../admin/site_panel_controller.rb | 88 +++++++++++- app/models/site_construct.rb | 7 +- app/models/site_request.rb | 2 +- app/models/site_server.rb | 13 ++ app/views/admin/site_panel/_form.html.erb | 15 +- .../site_panel/_server_manager_index.html.erb | 25 ++++ .../site_panel/edit_server_info.html.erb | 74 ++++++++++ .../admin/site_panel/server_manager.html.erb | 12 ++ .../admin/site_panel/sites_list.html.erb | 133 ++++++++++++++++++ client_management.gemspec | 2 +- config/locales/en.yml | 5 +- config/locales/zh_tw.yml | 5 +- config/routes.rb | 8 +- lib/client_management/engine.rb | 12 ++ lib/tasks/create_site.rake | 103 ++++++++++++++ 15 files changed, 491 insertions(+), 13 deletions(-) create mode 100644 app/models/site_server.rb create mode 100644 app/views/admin/site_panel/_server_manager_index.html.erb create mode 100644 app/views/admin/site_panel/edit_server_info.html.erb create mode 100644 app/views/admin/site_panel/server_manager.html.erb create mode 100644 app/views/admin/site_panel/sites_list.html.erb create mode 100644 lib/tasks/create_site.rake diff --git a/app/controllers/admin/site_panel_controller.rb b/app/controllers/admin/site_panel_controller.rb index 3945d77..1848dbd 100644 --- a/app/controllers/admin/site_panel_controller.rb +++ b/app/controllers/admin/site_panel_controller.rb @@ -7,18 +7,100 @@ class Admin::SitePanelController < OrbitAdminController def index @site_construct = SiteConstruct.new + @module_app = ModuleApp.where(:title=>@app_title).first + end + def server_manager + @module_app = ModuleApp.where(:title=>@app_title).first + @categories = @module_app.categories + @tags = [] + @filter_fields = filter_fields(@categories,@tags) + @site_servers = SiteServer.all.with_categories(filters("category")).with_status(filters("status")) + @site_servers = search_data(@site_servers,[:server_name,:ip]).page(params[:page].to_i).per(10) + if request.xhr? + render :partial => "server_manager_index" + end + end + def edit_server_info + @module_app = ModuleApp.where(:title=>@app_title).first + if params[:type] == 'update' + @site_server = SiteServer.find(params[:id]) rescue nil + if @site_server.present? + @site_server.update_attributes(site_server_params) + else + @site_server = SiteServer.create(site_server_params) + end + redirect_to admin_site_panel_server_manager_path + elsif params[:type] == 'create' + @site_server = SiteServer.new + elsif params[:type] == 'delete' + SiteServer.find(params[:id]).destroy + redirect_to admin_site_panel_server_manager_path + else + @site_server = SiteServer.find(params[:id]) + end end - def create site_construct = SiteConstruct.new(site_construct_params) site_construct.user_id = current_user.id.to_s + site_construct.status = "creating" site_construct.save - redirect_to admin_site_panel_path("msg" => "success") + git_user = "chiu" + git_password = "orbit_is_great_1" + git_url = "http://gitlab.tp.rulingcom.com/orbit_chiu1/orbit4-5.git" + site_server = SiteServer.where(:server_name=>site_construct.server_type).first + ip = site_server.ip + user = site_server.account + password = site_server.password + site_name = site_construct.site_name + domain_name = site_construct.domain_name + port = site_construct.port + db_name = site_construct.db_name + path = site_construct.path + site_construct_id = site_construct.id.to_s + Thread.new do + system("rake create_site:create_site[#{git_user},#{git_password},#{git_url},#{ip},#{user},#{password},#{site_name},#{domain_name},#{port},#{db_name},#{path},#{site_construct_id}]") + end + redirect_to "#{admin_site_panel_sites_list_path}?id=#{site_construct_id}" + end + def create_site + site_construct = SiteConstruct.find(params[:id]) + site_construct.user_id = current_user.id.to_s + git_user = "chiu" + git_password = "orbit_is_great_1" + git_url = "http://gitlab.tp.rulingcom.com/orbit_chiu1/orbit4-5.git" + site_server = SiteServer.where(:server_name=>site_construct.server_type).first + ip = site_server.ip + user = site_server.account + password = site_server.password + site_name = site_construct.site_name + domain_name = site_construct.domain_name + port = site_construct.port + db_name = site_construct.db_name + path = site_construct.path + site_construct_id = params[:id] + Thread.new do + puts site_construct_id + system("rake create_site:create_site['#{git_user}','#{git_password}','#{git_url}','#{ip}','#{user}','#{password}','#{site_name}','#{domain_name}','#{port}','#{db_name}','#{path}','#{site_construct_id}']") + end + render :json =>{"success"=>true} + end + def sites_list + @sites = SiteConstruct.all.desc(:id) + end + def site_infos + site_construct = SiteConstruct.where(:id=>params[:id]).first + if site_construct.nil? + render :json => {:status=>"creating",:infos=>[]} + else + render :json => {:status=>site_construct.status,:infos=>site_construct.infos} + end end - private def site_construct_params params.require(:site_construct).permit! end + def site_server_params + params.require(:site_server).permit! + end end \ No newline at end of file diff --git a/app/models/site_construct.rb b/app/models/site_construct.rb index fef75fb..cbe4f02 100644 --- a/app/models/site_construct.rb +++ b/app/models/site_construct.rb @@ -2,18 +2,19 @@ class SiteConstruct include Mongoid::Document include Mongoid::Timestamps - SERVER_TYPES = ["Pending","Store"] + SERVER_TYPES = SiteServer.all.map{|s| s.server_name} SITE_TYPES = ["School","Gravity"] field :server_type field :site_name field :domain_name field :db_name - field :port + field :port, type: String, :default => "80" field :path field :site_type field :school_name field :user_id field :constructed, type: Boolean, :default => false - + field :status, type: String, :default => "" + field :infos, type: Array, :default => [] end \ No newline at end of file diff --git a/app/models/site_request.rb b/app/models/site_request.rb index e02d085..0e748a0 100644 --- a/app/models/site_request.rb +++ b/app/models/site_request.rb @@ -10,7 +10,7 @@ class SiteRequest field :maintenance_years, type: Integer field :optional_modules, type: Array, default: [] field :custom_module, type: Boolean, default: false - field :custom_module_details + field :custom_module_details, type: String, default: '' field :template_number field :custom_template, type: Boolean, default: false field :custom_template_details diff --git a/app/models/site_server.rb b/app/models/site_server.rb new file mode 100644 index 0000000..bbb6c16 --- /dev/null +++ b/app/models/site_server.rb @@ -0,0 +1,13 @@ +class SiteServer + include Mongoid::Document + include Mongoid::Timestamps + include OrbitCategory::Categorizable + include OrbitTag::Taggable + include OrbitModel::Status + field :server_name , type: String ,default: '' + field :domain_name , type: String ,default: '' + field :ip , type: String ,default: '' + field :account , type: String ,default: '' + field :password , type: String ,default: '' + field :active , type: Boolean ,default: true +end \ No newline at end of file diff --git a/app/views/admin/site_panel/_form.html.erb b/app/views/admin/site_panel/_form.html.erb index cd8c68f..4a83a0d 100644 --- a/app/views/admin/site_panel/_form.html.erb +++ b/app/views/admin/site_panel/_form.html.erb @@ -87,6 +87,11 @@ \ No newline at end of file diff --git a/client_management.gemspec b/client_management.gemspec index f11192a..ca86010 100644 --- a/client_management.gemspec +++ b/client_management.gemspec @@ -13,7 +13,7 @@ Gem::Specification.new do |s| s.summary = "ClientManagement tool for store." s.description = "ClientManagement tool for store." s.license = "MIT" - + s.add_dependency "net-ssh" s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] s.test_files = Dir["test/**/*"] end diff --git a/config/locales/en.yml b/config/locales/en.yml index cb3443a..f62b94c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -53,4 +53,7 @@ en: amount_pending: Amount Pending receipt_status: Receipt Status loading_purchases: Loading Purchases - create_site: Create Site \ No newline at end of file + create_site: Create Site + sites_list: Site list + server_manager: Server Manager + confirm: Confirm \ No newline at end of file diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 0034787..8cd1229 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -53,4 +53,7 @@ zh_tw: amount_pending: Amount Pending receipt_status: Receipt Status loading_purchases: Loading Purchases - create_site: Create Site \ No newline at end of file + create_site: Create Site + sites_list: Site list + server_manager: Server Manager + confirm: Confirm \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 9cf1b3d..3a2514f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -36,8 +36,14 @@ Rails.application.routes.draw do get "contracts" end end - + get "site_panel/site_infos" => "site_panel#site_infos" + post "site_panel/site_infos" => "site_panel#site_infos" + post "site_panel/create_site" => "site_panel#create_site" get "site_panel" => "site_panel#index" + get "site_panel/sites_list" => "site_panel#sites_list" + get "site_panel/server_manager" => "site_panel#server_manager" + get "site_panel/edit_server_info" => "site_panel#edit_server_info" + post "site_panel/edit_server_info" => "site_panel#edit_server_info" resources :site_panel end diff --git a/lib/client_management/engine.rb b/lib/client_management/engine.rb index efa6e28..53aab69 100644 --- a/lib/client_management/engine.rb +++ b/lib/client_management/engine.rb @@ -6,6 +6,7 @@ module ClientManagement base_url File.expand_path File.dirname(__FILE__) categorizable authorizable + taggable "SiteServer" # frontend_enabled # data_count 1..30 set_keyword_contstraints ["/cpanel/"] @@ -39,6 +40,17 @@ module ClientManagement :active_for_action=>{'admin/site_panel'=>"index"}, :available_for => 'users' + context_link 'client_management.sites_list', + :link_path=>"admin_site_panel_sites_list_path" , + :priority=>1, + :active_for_action=>{'admin/site_panel'=>"sites_list"}, + :available_for => 'users' + + context_link 'client_management.server_manager', + :link_path=>"admin_site_panel_server_manager_path" , + :priority=>1, + :active_for_action=>{'admin/site_panel'=>"server_manager"}, + :available_for => 'users' end end end diff --git a/lib/tasks/create_site.rake b/lib/tasks/create_site.rake new file mode 100644 index 0000000..ef08c8d --- /dev/null +++ b/lib/tasks/create_site.rake @@ -0,0 +1,103 @@ +require 'net/ssh' +require 'pathname' +namespace :create_site do + desc "Create Site Script" + task :create_site,[:git_user,:git_password,:git_url,:ip,:user,:password,:site_name,:domain_name,:port,:db_name,:path,:site_construct_id] => :environment do |task,args| + @password = args.password + puts args + if args.site_construct_id.blank? + @site_construct = SiteConstruct.new + @site_construct.server_type = (SiteServer.where(:ip=>args.ip).first.server_name rescue args.ip) + @site_construct.site_name = args.site_name + @site_construct.domain_name = args.domain_name + @site_construct.db_name = args.db_name + @site_construct.port = args.port + @site_construct.path = args.path + @site_construct.school_name = args.site_name.split(/[-_]/) + @site_construct.user_id = User.first.id.to_s + @site_construct.save + else + @site_construct = SiteConstruct.find(args.site_construct_id) + end + begin + @site_construct.update(:status=>"creating") + Net::SSH.start(args.ip , args.user , password: args.password) do |ssh| + update_infos("setting nginx for #{args.site_name}") + nginx_setting_texts = ('upstream '+args.site_name+'_sock {\n'+ + ' server unix:'+args.path+'/'+args.site_name+'/tmp/unicorn.sock;\n'+ + '}\n'+ + 'server {\n'+ + ' listen '+args.port+';\n\n'+ + ' root '+args.path+'/'+args.site_name+'/public;\n\n'+ + 'server_name '+args.domain_name+';\n\n'+ + ' client_max_body_size 500m;\n\n'+ + ' location / {\n'+ + ' try_files \$uri \$uri/index.html \$uri.html @app;\n'+ + ' }\n\n'+ + ' location @app {\n'+ + ' proxy_redirect off;\n'+ + ' proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;\n'+ + ' proxy_set_header Host \$http_host;\n'+ + ' proxy_connect_timeout 360;\n'+ + 'proxy_pass http://'+args.site_name+'_sock;\n'+ + ' }\n'+ + '}') + exec_ssh_command_by_sudo(ssh,"touch /etc/nginx/orbit_sites/#{args.site_name}") + exec_ssh_command_by_sudo(ssh,"sh -c \"echo '#{nginx_setting_texts}' > /etc/nginx/orbit_sites/#{args.site_name}\"") + update_infos("restarting nginx") + exec_ssh_command_by_sudo(ssh,"service nginx restart") + update_infos("finish restarting nginx") + dir = Pathname.new(args.path) + while dir.to_s != '/' do + exec_ssh_command_by_sudo(ssh,"mkdir #{dir}") + dir = dir.dirname + end + update_infos("cloning orbit4-5 from #{args.git_url} to #{args.path}/#{args.site_name}") + exec_ssh_command_by_sudo(ssh,"git clone #{args.git_url.gsub("http://","http://#{args.git_user+':'+args.git_password+'@'}").gsub("https://","https://#{args.git_user+':'+args.git_password+'@'}")} #{args.path}/#{args.site_name}") + exec_ssh_command_by_sudo(ssh,"chown #{args.user}:#{args.user} -R #{args.path}/#{args.site_name}") + exec_ssh_command_by_sudo(ssh,"chmod 777 #{args.path}/#{args.site_name} -R") + db_setting_text = ssh.exec!("cat #{args.path}/#{args.site_name}/config/mongoid.yml") + update_infos("setting dbname to #{args.db_name}") + exec_ssh_command_by_sudo(ssh,"echo '#{db_setting_text.gsub("orbit_4_5",args.db_name)}' > #{args.path}/#{args.site_name}/config/mongoid.yml") + gemdir = ssh.exec!("/home/rulingcom/.rvm/bin/rvm gemdir").to_s + if gemdir.include?("No such file or directory") + ls = ssh.exec!("echo `ls /home`").to_s.split + ls.each do |d| + gemdir = ssh.exec!("/home/#{d}/.rvm/bin/rvm gemdir").to_s + break if !gemdir.to_s.include?("No such file or directory") + end + end + if gemdir.include?("No such file or directory") + update_infos("please connect your admin to install rvm on #{args.ip}") + @site_construct.update(:status =>"error") + else + bundle_dir = gemdir.gsub("\n","") + '/bin/bundle' + update_infos("execing bundle install...") + exec_ssh_command_by_sudo(ssh,"bash -l -c 'cd #{args.path}/#{args.site_name}\n#{bundle_dir} install'") + exec_ssh_command_by_sudo(ssh,"bash -l -c 'cd #{args.path}/#{args.site_name}\n#{bundle_dir} install'") + update_infos("finish execing bundle install") + update_infos("starting #{args.site_name} web server to development") + exec_ssh_command_by_sudo(ssh,"bash -l -c 'cd #{args.path}/#{args.site_name}\n#{bundle_dir} exec unicorn_rails -c config/unicorn.rb -D -E development\n'") + update_infos("finish creating #{args.site_name}") + @site_construct.update(:status =>"finish") + puts "finish creating #{args.site_name} on #{args.ip}" + end + end + rescue =>e + @site_construct.update(:status =>"error",:infos=>@site_construct.infos.push("#{e}")) + end + end + def exec_ssh_command_by_sudo(session,command) + output = session.exec!("echo '#{@password}' | sudo -S #{command}") + # output = session.exec!("echo '#{@password}' | sudo -S -s #{command}") + if output.include?("sudo:") && output.include?("command not found") + output = session.exec!(command) + end + return output + end + def update_infos(info) + @site_construct.infos = @site_construct.infos.push(info) + @site_construct.save! + return @site_construct.infos + end +end \ No newline at end of file