smartcloud 0.1.0 → 0.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa2a3f8c929555cb37a5587ddbcf00af3e266afecc59442cdfe7c6c445d5a81b
4
- data.tar.gz: be14f3480b057ccc010c596665313dbbd5d7e6a5aec6098b7a8225b142f5cbea
3
+ metadata.gz: 9958c8ebc6f3cdf8111a9034bf70d052c5e1fcec70a23306deb953a3e81a9675
4
+ data.tar.gz: 335d928f1b65200db471517a4c8c38d32868ec24a2e188e87f6d7ef2b61338e6
5
5
  SHA512:
6
- metadata.gz: 42c54ce67d371361a9c6ffced3e81a864bc9e48feec61248fa5ed35099d62cc905beaf6a100ec6a450102cc5c129d7f4f7883f323cc5c459f2d129cbb7c9f44a
7
- data.tar.gz: cf1d7349d53f1d31abedbc9d403319ed1b2c0f277e8c9fe6ba877636f5a781765c562765a33838490f2e1cf90b6d66d625068d4644a2e485df4f09085e5d2207
6
+ metadata.gz: 6951d53b56b47962fbab916f5943d20974974ba3d70e25c16e505a4ff6bda03ad30f8ef69f99ac24ebb686ea87bc4de7b39f20799ebd07dbbd4a7b522664742a
7
+ data.tar.gz: 796c0b9e7f77ef91161a4d29a46edf637782aee55014f183ef67a24fdbcfda8ee79eb832f74bac53cf8c9443e7aa08991117d0527efeeb3767a773ccf1155174
@@ -2,73 +2,34 @@
2
2
 
3
3
  require 'smartcloud'
4
4
 
5
- if ARGV[0] == 'init'
6
- Smartcloud::Boot.init
7
- elsif !Smartcloud::Boot.initialized?
8
- puts "Smartcloud has not been initialized. Please run command 'smartcloud init'."
9
- exit
10
- end
11
-
12
- # if ARGV[0] == 'new'
13
- # machine = Smartcloud::Machine.new
14
- # raise "Please specify machine name" unless ARGV[1]
15
- # machine.create(ARGV[1])
16
- # elsif ARGV[0] == 'install'
17
- # machine = Smartcloud::Machine.new
18
- # machine.install_docker
19
- # machine.install_engine
20
- # elsif ARGV[0] == 'uninstall'
21
- # machine = Smartcloud::Machine.new
22
- # machine.uninstall_engine
23
- # machine.uninstall_docker
24
- # elsif ARGV[0] == 'run'
25
- # machine = Smartcloud::Machine.new
26
- # ARGV.shift
27
- # raise "Please specify command to run" unless ARGV[0]
28
- # machine.run(ARGV)
5
+ command = ARGV.shift
29
6
 
30
- if ARGV[0] == 'docker'
31
- if ARGV[1] == 'install'
32
- Smartcloud::Docker.install
33
- elsif ARGV[1] == 'uninstall'
34
- Smartcloud::Docker.uninstall
35
- end
36
- elsif ARGV[0] == 'grids'
37
- if ARGV[1] == 'runner'
38
- if ARGV[2] == 'up'
39
- Smartcloud::Grids::Runner.up
40
- elsif ARGV[2] == 'down'
41
- Smartcloud::Grids::Runner.down
42
- end
43
- elsif ARGV[1] == 'mysql'
44
- if ARGV[2] == 'up'
45
- Smartcloud::Grids::Mysql.up(ARGV[3])
46
- elsif ARGV[2] == 'down'
47
- Smartcloud::Grids::Mysql.down
48
- end
49
- elsif ARGV[1] == 'nginx'
50
- if ARGV[2] == 'up'
51
- Smartcloud::Grids::Nginx.up(ARGV[3])
52
- elsif ARGV[2] == 'down'
53
- Smartcloud::Grids::Nginx.down
54
- end
55
- elsif ARGV[1] == 'solr'
56
- if ARGV[2] == 'up'
57
- Smartcloud::Grids::Solr.up(ARGV[3])
58
- elsif ARGV[2] == 'down'
59
- Smartcloud::Grids::Solr.down
60
- elsif ARGV[2] == 'create_core'
61
- Smartcloud::Grids::Solr.create_core(ARGV[3])
62
- elsif ARGV[2] == 'destroy_core'
63
- Smartcloud::Grids::Solr.destroy_core(ARGV[3])
64
- end
7
+ unless command == 'new'
8
+ unless Smartcloud::Machine.smartcloud_dir?
9
+ raise "This is not a smartcloud directory. Are you in the correct directory?"
65
10
  end
66
- # elsif ARGV[0] == 'user'
67
- # if ARGV[1] == 'create'
68
- # Smartcloud::User.create(ARGV[2], ARGV[3], ARGV[4])
69
- # elsif ARGV[1] == 'destroy'
70
- # Smartcloud::User.destroy(ARGV[2], ARGV[3])
71
- # end
11
+ end
12
+
13
+ if command == 'new'
14
+ raise "This is already a smartcloud directory. Are you in the correct directory?" if Smartcloud::Machine.smartcloud_dir?
15
+ raise "Please specify a machine name" if ARGV.empty?
16
+ machine = Smartcloud::Machine.new
17
+ machine.create ARGV
18
+ elsif command == 'start'
19
+ machine = Smartcloud::Machine.new
20
+ machine.start
21
+ elsif command == 'stop'
22
+ machine = Smartcloud::Machine.new
23
+ machine.stop
24
+ elsif command == 'grid'
25
+ machine = Smartcloud::Machine.new
26
+ machine.grid ARGV
27
+ elsif command == 'ssh'
28
+ machine = Smartcloud::Machine.new
29
+ machine.ssh
30
+ elsif command == 'sync'
31
+ machine = Smartcloud::Machine.new
32
+ machine.sync
72
33
  else
73
34
  puts "Specify a command to execute."
74
35
  end
@@ -1,10 +1,23 @@
1
1
  require "ostruct"
2
+ require "yaml"
2
3
 
3
4
  # The main Smartcloud driver
4
5
  module Smartcloud
5
6
  def self.config
6
7
  @@config ||= OpenStruct.new
7
8
  end
9
+
10
+ def self.credentials
11
+ @@credentials ||= OpenStruct.new(Smartcloud.transform_keys_to_symbols(YAML.load_file("#{Dir.pwd}/config/credentials.yml")))
12
+ end
13
+
14
+ private
15
+
16
+ def self.transform_keys_to_symbols(value)
17
+ return value if not value.is_a?(Hash)
18
+ hash = value.inject({}){|memo,(k,v)| memo[k.to_sym] = self.transform_keys_to_symbols(v); memo}
19
+ return hash
20
+ end
8
21
  end
9
22
 
10
23
  Smartcloud.config.root_path = File.expand_path('../..', __FILE__)
@@ -1,87 +1,12 @@
1
- require 'securerandom'
2
- require "tempfile"
3
-
4
1
  # The main Smartcloud Boot driver
5
2
  module Smartcloud
6
3
  class Boot < Smartcloud::Base
7
4
  def initialize
8
5
  end
9
-
10
- def self.init
11
- # Copy Template for dotsmartcloud
12
- unless self.initialized?
13
- puts "Initializing Smartcloud ...\n\n"
14
-
15
- begin
16
- print "Enter top-level apps domain to be used for subdomains of your apps. [Recommended: yourdomain.com]: "
17
- config_apps_domain = STDIN.gets.chomp
18
- raise if config_apps_domain.empty?
19
- rescue
20
- retry
21
- end
22
-
23
- begin
24
- print "Enter sysadmin email id. [Recommended: admin@#{config_apps_domain}]: "
25
- config_sysadmin_email = STDIN.gets.chomp
26
- raise if config_sysadmin_email.empty?
27
- rescue
28
- retry
29
- end
30
-
31
- begin
32
- print "Enter username for your git grid user. [Recommended: git@#{config_apps_domain}]: "
33
- username = STDIN.gets.chomp
34
- raise if username.empty?
35
- rescue
36
- retry
37
- end
38
-
39
- print "Enter password for your git grid user. (leave blank to generate automatically) [Recommended: Minimum 8 characters with numbers and symbols]: "
40
- password = STDIN.gets.chomp
41
- if password.empty?
42
- password = SecureRandom.base64(8)
43
- end
44
-
45
- # Copy dotsmartcloud template to user home directory
46
- FileUtils.cp_r("#{Smartcloud.config.root_path}/lib/smartcloud/templates/dotsmartcloud", "#{Smartcloud.config.user_home_path}/.smartcloud")
47
-
48
- # modifying environment.rb file
49
- tempFile = Tempfile.new("#{Smartcloud.config.user_home_path}/.smartcloud/config/environmentTemp.rb")
50
- File.open("#{Smartcloud.config.user_home_path}/.smartcloud/config/environment.rb", "r").each_line do |line|
51
- if line =~ /Smartcloud.config.apps_domain/
52
- tempFile.puts "Smartcloud.config.apps_domain = \"#{config_apps_domain}\""
53
- elsif line =~ /Smartcloud.config.git_domain/
54
- tempFile.puts "Smartcloud.config.git_domain = \"git.#{config_apps_domain}\""
55
- elsif line =~ /Smartcloud.config.sysadmin_email/
56
- tempFile.puts "Smartcloud.config.sysadmin_email = \"#{config_sysadmin_email}\""
57
- else
58
- tempFile.puts line
59
- end
60
- end
61
- tempFile.close
62
- FileUtils.mv(tempFile.path, "#{Smartcloud.config.user_home_path}/.smartcloud/config/environment.rb")
63
-
64
- # Reload the updated environment.rb file as it is required by methods below
65
- require "#{Smartcloud.config.user_home_path}/.smartcloud/config/environment.rb"
66
-
67
- # creating user for git grid at config.git_domain
68
- Smartcloud::User.create(Smartcloud.config.git_domain, username, password)
69
-
70
- puts "\nIMPORTANT NOTE: Please ensure that the required top-level apps domain '#{Smartcloud.config.apps_domain}' and git domain '#{Smartcloud.config.git_domain}' is pointing to this server using DNS Records before proceeding."
71
- puts "IMPORTANT NOTE: Your git grid password is #{password} for username #{username}"
72
-
73
- puts "\nInitializing Smartcloud ... done"
74
- else
75
- puts "Already Initialized. Please go to #{Smartcloud.config.user_home_path}/.smartcloud/config to make configuration changes."
76
- end
77
- end
78
-
79
- def self.initialized?
80
- Dir.exist? "#{Smartcloud.config.user_home_path}/.smartcloud"
81
- end
82
6
  end
83
7
  end
84
8
 
9
+ require 'smartcloud/ssh'
85
10
  require 'smartcloud/machine'
86
11
 
87
12
  require 'smartcloud/engine'
@@ -13,22 +13,30 @@ module Smartcloud
13
13
  # Arguments:
14
14
  # none
15
15
  def self.install
16
+ ssh = Smartcloud::SSH.new
17
+
16
18
  puts "-----> Installing Docker"
17
- system("sudo apt-get update")
18
- system("sudo apt-get install apt-transport-https ca-certificates curl software-properties-common")
19
- system("curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -")
20
- system("sudo apt-key fingerprint 0EBFCD88")
21
- system("sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"")
22
- system("sudo apt-get update")
23
- system("sudo apt-get install docker-ce")
24
- system("sudo usermod -aG docker $USER")
25
- system("docker run --rm hello-world")
19
+ commands = [
20
+ "sudo apt-get update",
21
+ "sudo apt-get install apt-transport-https ca-certificates curl software-properties-common",
22
+ "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -",
23
+ "sudo apt-key fingerprint 0EBFCD88",
24
+ "sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"",
25
+ "sudo apt-get update",
26
+ "sudo apt-get install docker-ce",
27
+ "sudo usermod -aG docker $USER",
28
+ "docker run --rm hello-world"
29
+ ]
30
+ ssh.run commands
26
31
 
27
32
  puts "-----> Installing Docker Compose"
28
- system("sudo curl -L --fail https://github.com/docker/compose/releases/download/1.24.0/run.sh -o /usr/local/bin/docker-compose")
29
- system("sudo chmod +x /usr/local/bin/docker-compose")
30
- system("docker-compose --version")
31
- system("sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose")
33
+ commands = [
34
+ "sudo curl -L --fail https://github.com/docker/compose/releases/download/1.24.0/run.sh -o /usr/local/bin/docker-compose",
35
+ "sudo chmod +x /usr/local/bin/docker-compose",
36
+ "docker-compose --version",
37
+ "sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose"
38
+ ]
39
+ ssh.run commands
32
40
 
33
41
  self.add_ufw_rules
34
42
 
@@ -44,12 +52,17 @@ module Smartcloud
44
52
  # Arguments:
45
53
  # none
46
54
  def self.uninstall
55
+ ssh = Smartcloud::SSH.new
56
+
47
57
  puts "-----> Uninstalling Docker Compose"
48
- system("sudo rm /usr/local/bin/docker-compose")
58
+ ssh.run "sudo rm /usr/local/bin/docker-compose"
49
59
 
50
60
  puts "-----> Uninstalling Docker"
51
- system("sudo apt-get purge docker-ce")
52
- system("sudo rm -rf /var/lib/docker")
61
+ commands = [
62
+ "sudo apt-get purge docker-ce",
63
+ "sudo rm -rf /var/lib/docker"
64
+ ]
65
+ ssh.run commands
53
66
 
54
67
  self.remove_ufw_rules
55
68
 
@@ -57,15 +70,6 @@ module Smartcloud
57
70
  puts "-----> You must delete any edited configuration files manually."
58
71
  end
59
72
 
60
- def self.running?
61
- if system("docker info", [:out, :err] => File::NULL)
62
- true
63
- else
64
- puts "Error: Docker daemon is not running. Have you installed docker? Please ensure docker daemon is running and try again."
65
- false
66
- end
67
- end
68
-
69
73
  def self.add_ufw_rules
70
74
  puts '-----> Add the following rules to the end of the file /etc/ufw/after.rules and reload ufw using - sudo ufw reload'
71
75
  puts '# BEGIN UFW AND DOCKER
@@ -116,5 +120,16 @@ module Smartcloud
116
120
  # system("sed '/^# BEGIN UFW AND DOCKER/,/^# END UFW AND DOCKER/d' '/etc/ufw/after.rules'")
117
121
  # system("sudo ufw reload")
118
122
  end
123
+
124
+ # Below methods are non ssh methods and should be executed on the server only.
125
+
126
+ def self.running?
127
+ if system("docker info", [:out, :err] => File::NULL)
128
+ true
129
+ else
130
+ puts "Error: Docker daemon is not running. Have you installed docker? Please ensure docker daemon is running and try again."
131
+ false
132
+ end
133
+ end
119
134
  end
120
135
  end
@@ -4,35 +4,32 @@ module Smartcloud
4
4
  def initialize
5
5
  end
6
6
 
7
- def create_images
8
- # unless system("docker image inspect smartcloud", [:out, :err] => File::NULL)
9
- # print "-----> Creating image smartcloud ... "
10
- # if system("docker image build -t smartcloud \
11
- # --build-arg DOCKER_GID=`getent group docker | cut -d: -f3` \
12
- # --build-arg USER_UID=`id -u` \
13
- # --build-arg USER_NAME=`id -un` \
14
- # #{Smartcloud.config.root_path}/lib/smartcloud/engine")
15
- # puts "done"
16
- # end
17
- # end
7
+ def self.install
8
+ ssh = Smartcloud::SSH.new
9
+ machine = Smartcloud::Machine.new
18
10
 
19
- #docker build -t smartcloud \
20
- # --build-arg USER_UID=`id -u` \
21
- # --build-arg USER_GID=`id -g` \
22
- # --build-arg USER_NAME=`id -un` \
23
- # .
11
+ system("mkdir -p ./tmp/engine")
12
+ system("cp #{Smartcloud.config.root_path}/lib/smartcloud/engine/Dockerfile ./tmp/engine/Dockerfile")
24
13
 
25
- # docker run -it --rm -v "/home/$(whoami)/.smartcloud:/home/$(whoami)/.smartcloud" smartcloud
26
- #
27
- # system("docker create \
28
- # --name='smartcloud' \
29
- # --volume='#{Smartcloud.config.user_home_path}/.gem:#{Smartcloud.config.user_home_path}/.gem' \
30
- # --volume='#{Smartcloud.config.user_home_path}/.smartcloud/config:#{Smartcloud.config.user_home_path}/.smartcloud/config' \
31
- # --volume='#{Smartcloud.config.user_home_path}/.smartcloud/grids/grid-runner:#{Smartcloud.config.user_home_path}/.smartcloud/grids/grid-runner' \
32
- # --volume='/var/run/docker.sock:/var/run/docker.sock' \
33
- # --restart='always' \
34
- # --network='nginx-network' \
35
- # smartcloud/runner", out: File::NULL)
14
+ machine.sync first_sync: true
15
+
16
+ puts "-----> Creating image smartcloud ... "
17
+ ssh.run "docker image build -t smartcloud \
18
+ --build-arg DOCKER_GID=`getent group docker | cut -d: -f3` \
19
+ --build-arg USER_UID=`id -u` \
20
+ --build-arg USER_NAME=`id -un` \
21
+ ~/.smartcloud/tmp/engine"
22
+
23
+ puts "-----> Adding smartcloud to PATH ... "
24
+ ssh.run "chmod +x ~/.smartcloud/bin/smartcloud.sh && sudo ln -sf ~/.smartcloud/bin/smartcloud.sh /usr/local/bin/smartcloud"
25
+ system("rm ./tmp/engine/Dockerfile")
26
+
27
+ machine.sync
28
+ end
29
+
30
+ def self.uninstall
31
+ ssh.run "sudo rm /usr/local/bin/smartcloud"
32
+ ssh.run "docker rmi smartcloud"
36
33
  end
37
34
  end
38
- end
35
+ end
@@ -1,27 +1,23 @@
1
1
  FROM ruby:2.6.4-alpine3.10
2
- MAINTAINER Timeboard <hello@timeboard.me>
2
+ LABEL maintainer="Timeboard <hello@timeboard.me>"
3
3
 
4
- RUN apk add --update docker && \
5
- rm -rf /var/cache/apk/*
6
-
7
- # Setting up group and user
8
- # - envs
4
+ # User
5
+ # --- Fix to change gid of 999 to 99 so that addgroup is free to create a group with 999 as gid
9
6
  ARG USER_NAME
10
7
  ARG USER_UID
11
8
  ARG DOCKER_GID
12
- # - fix to change gid of 999 to 99 so that addgroup is free to create a group with 999 as gid
13
- # - Create group & user. Then add user to group
14
9
  RUN sed -i "s/999/99/" /etc/group && \
15
- adduser --disabled-password --gecos "" --uid $USER_UID $USER_NAME && \
16
- addgroup --gid $DOCKER_GID "docker" && adduser $USER_NAME docker
10
+ adduser --disabled-password --gecos "" --uid "$USER_UID" "$USER_NAME" && \
11
+ addgroup --gid "$DOCKER_GID" "docker" && adduser "$USER_NAME" "docker"
12
+
13
+ # Docker
14
+ RUN apk add --update docker && \
15
+ rm -rf /var/cache/apk/*
17
16
 
17
+ # Privileges
18
18
  USER "$USER_NAME"
19
- WORKDIR "/home/$USER_NAME/.smartcloud"
20
19
 
21
- # Generating entrypoint file
22
- RUN echo -e '#!/bin/sh\n\
23
- gem install --no-document smartcloud\n\
24
- exec smartcloud "$@"' >> "/home/$(whoami)/entrypoint"; chmod +x "/home/$(whoami)/entrypoint"
20
+ # Gems
21
+ RUN gem install --no-document smartcloud -v 0.1.0
25
22
 
26
- # Set entrypoint
27
- ENTRYPOINT "/home/$(whoami)/entrypoint"
23
+ ENTRYPOINT ["smartcloud"]
@@ -5,7 +5,10 @@ module Smartcloud
5
5
  def initialize
6
6
  end
7
7
 
8
- def self.up(exposed)
8
+ def self.up(*args)
9
+ args.flatten!
10
+ exposed = args.empty? ? '' : args.shift
11
+
9
12
  if Smartcloud::Docker.running?
10
13
  # Creating networks
11
14
  unless system("docker network inspect mysql-network", [:out, :err] => File::NULL)
@@ -5,7 +5,10 @@ module Smartcloud
5
5
  def initialize
6
6
  end
7
7
 
8
- def self.up(exposed)
8
+ def self.up(*args)
9
+ args.flatten!
10
+ exposed = args.empty? ? '' : args.shift
11
+
9
12
  if Smartcloud::Docker.running?
10
13
  # Creating volumes
11
14
  print "-----> Creating volume nginx-confd ... "
@@ -5,7 +5,10 @@ module Smartcloud
5
5
  def initialize
6
6
  end
7
7
 
8
- def self.up(exposed)
8
+ def self.up(*args)
9
+ args.flatten!
10
+ exposed = args.empty? ? '' : args.shift
11
+
9
12
  if Smartcloud::Docker.running?
10
13
  # Creating networks
11
14
  unless system("docker network inspect solr-network", [:out, :err] => File::NULL)
@@ -59,7 +62,10 @@ module Smartcloud
59
62
  end
60
63
  end
61
64
 
62
- def self.create_core(corename)
65
+ def self.create_core(*args)
66
+ args.flatten!
67
+ corename = args.empty? ? '' : args.shift
68
+
63
69
  if Smartcloud::Docker.running?
64
70
  puts "-----> Creating core #{corename} ... "
65
71
  if system("docker exec -it --user=solr solr solr create_core -c #{corename}")
@@ -77,7 +83,10 @@ module Smartcloud
77
83
  end
78
84
  end
79
85
 
80
- def self.destroy_core(corename)
86
+ def self.destroy_core(*args)
87
+ args.flatten!
88
+ corename = args.empty? ? '' : args.shift
89
+
81
90
  if Smartcloud::Docker.running?
82
91
  puts "-----> Removing core #{corename} ... "
83
92
  if system("docker exec -it --user=solr solr solr delete -c #{corename}")
@@ -6,6 +6,69 @@ module Smartcloud
6
6
  def initialize
7
7
  end
8
8
 
9
+ def create(*args)
10
+ args.flatten!
11
+
12
+ name = args.shift
13
+ FileUtils.mkdir name
14
+ FileUtils.cp_r "#{Smartcloud.config.root_path}/lib/smartcloud/templates/dotsmartcloud/.", "#{name}"
15
+ puts "New machine #{name} has been created."
16
+ end
17
+
18
+ def start
19
+ Smartcloud::User.create_htpasswd_files
20
+ Smartcloud::Docker.install
21
+ Smartcloud::Engine.install
22
+ end
23
+
24
+ def stop
25
+ Smartcloud::Engine.uninstall
26
+ Smartcloud::Docker.uninstall
27
+ end
28
+
29
+ def grid(*args)
30
+ args.flatten!
31
+ name = "Smartcloud::Grids::#{args.shift.capitalize}"
32
+ action = args.shift.to_sym
33
+
34
+ args.empty? ? Object.const_get(name).public_send(action) : Object.const_get(name).public_send(action, args)
35
+
36
+ # if ARGV[1] == 'runner'
37
+ # if ARGV[2] == 'up'
38
+ # Smartcloud::Grids::Runner.up
39
+ # elsif ARGV[2] == 'down'
40
+ # Smartcloud::Grids::Runner.down
41
+ # end
42
+ # elsif ARGV[1] == 'mysql'
43
+ # if ARGV[2] == 'up'
44
+ # Smartcloud::Grids::Mysql.up(ARGV[3])
45
+ # elsif ARGV[2] == 'down'
46
+ # Smartcloud::Grids::Mysql.down
47
+ # end
48
+ # elsif ARGV[1] == 'nginx'
49
+ # if ARGV[2] == 'up'
50
+ # Smartcloud::Grids::Nginx.up(ARGV[3])
51
+ # elsif ARGV[2] == 'down'
52
+ # Smartcloud::Grids::Nginx.down
53
+ # end
54
+ # elsif ARGV[1] == 'solr'
55
+ # if ARGV[2] == 'up'
56
+ # Smartcloud::Grids::Solr.up(ARGV[3])
57
+ # elsif ARGV[2] == 'down'
58
+ # Smartcloud::Grids::Solr.down
59
+ # elsif ARGV[2] == 'create_core'
60
+ # Smartcloud::Grids::Solr.create_core(ARGV[3])
61
+ # elsif ARGV[2] == 'destroy_core'
62
+ # Smartcloud::Grids::Solr.destroy_core(ARGV[3])
63
+ # end
64
+ # end
65
+ end
66
+
67
+ def ssh
68
+ ssh = Smartcloud::SSH.new
69
+ ssh.login
70
+ end
71
+
9
72
  def getting_started
10
73
  # puts 'You may be prompted to make a menu selection when the Grub package is updated on Ubuntu. If prompted, select keep the local version currently installed.'
11
74
 
@@ -62,25 +125,65 @@ module Smartcloud
62
125
  # sudo fail2ban-client status
63
126
  end
64
127
 
65
- # def create(name)
66
- # FileUtils.mkdir_p name
67
- # FileUtils.cp_r "#{Smartcloud.config.root_path}/lib/smartcloud/templates/machine/.", "#{name}"
68
- # puts "Please fill details in your config folder before proceeding."
69
- # end
70
- #
71
- # def run(*args)
72
- # end
73
- #
74
- # def install_docker
75
- # end
76
- #
77
- # def uninstall_docker
78
- # end
79
- #
80
- # def install_engine
81
- # end
82
- #
83
- # def uninstall_engine
84
- # end
128
+ def self.smartcloud_dir?
129
+ File.file?("./bin/smartcloud.sh")
130
+ end
131
+
132
+ def sync(first_sync = false)
133
+ puts "-----> Syncing smartcloud ... "
134
+ return sync_push if first_sync
135
+
136
+ unless block_given?
137
+ sync_pull && sync_push
138
+ else
139
+ sync_pull
140
+ yield
141
+ sync_push
142
+ end
143
+ end
144
+
145
+ private
146
+
147
+ def sync_pull
148
+ system("rsync -azumv --delete --include=*/ --include={#{sync_pull_files_list}} --exclude=* -e ssh #{Smartcloud.credentials.machine[:username]}@#{Smartcloud.credentials.machine[:host]}:~/.smartcloud/ .")
149
+ end
150
+
151
+ def sync_push
152
+ system("rsync -azumv --delete --include=*/ --include={#{sync_push_files_list}} --exclude={#{excluded_sync_files_list}} --exclude={#{sync_pull_files_list}} -e ssh ./ #{Smartcloud.credentials.machine[:username]}@#{Smartcloud.credentials.machine[:host]}:~/.smartcloud")
153
+ end
154
+
155
+ def excluded_sync_files_list
156
+ files = [
157
+ 'config/credentials.yml',
158
+ 'config/users.yml'
159
+ ]
160
+ files.join(',')
161
+ end
162
+
163
+ def sync_pull_files_list
164
+ files = [
165
+ 'grids/grid-mysql/data/***',
166
+ 'grids/grid-nginx/certificates/***',
167
+ 'grids/grid-runner/apps/***',
168
+ 'grids/grid-solr/data/***',
169
+ ]
170
+ files.join(',')
171
+ end
172
+
173
+ def sync_push_files_list
174
+ files = [
175
+ 'grids/grid-mysql/data/.keep',
176
+ 'grids/grid-nginx/certificates/.keep',
177
+ 'grids/grid-runner/apps/containers/.keep',
178
+ 'grids/grid-runner/apps/repositories/.keep',
179
+ 'grids/grid-solr/data/.keep',
180
+ 'grids/grid-solr/data/README.txt',
181
+ 'grids/grid-solr/data/solr.xml',
182
+ 'grids/grid-solr/data/zoo.cfg',
183
+ 'grids/grid-solr/data/configsets/***',
184
+ 'grids/grid-solr/data/lib/***',
185
+ ]
186
+ files.join(',')
187
+ end
85
188
  end
86
189
  end
@@ -0,0 +1,43 @@
1
+ require "net/ssh"
2
+
3
+ # The main Smartcloud SSH driver
4
+ module Smartcloud
5
+ class SSH < Smartcloud::Base
6
+ def initialize
7
+ end
8
+
9
+ def run(*commands)
10
+ commands.flatten!
11
+ Net::SSH.start(Smartcloud.credentials.machine[:host], Smartcloud.credentials.machine[:username], { port: Smartcloud.credentials.machine[:port], password: Smartcloud.credentials.machine[:password] }) do |ssh|
12
+ channel = ssh.open_channel do |channel, success|
13
+ channel.request_pty do |channel, success|
14
+ channel.exec commands.join(';') do |channel, success|
15
+ raise "Could not execute command" unless success
16
+
17
+ channel.on_data do |channel, data|
18
+ $stdout.print data
19
+
20
+ if data =~ /^\[sudo\] password for /
21
+ channel.send_data "#{Smartcloud.credentials.machine[:password]}\n"
22
+ end
23
+ end
24
+
25
+ channel.on_extended_data do |channel, type, data|
26
+ $stderr.print data
27
+ end
28
+
29
+ channel.on_close do |channel|
30
+ # puts "done!"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ channel.wait
36
+ end
37
+ end
38
+
39
+ def login
40
+ exec "ssh #{Smartcloud.credentials.machine[:username]}@#{Smartcloud.credentials.machine[:host]}"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ #!/bin/bash
2
+
3
+ docker run -it --rm \
4
+ -v "/home/$(whoami)/.smartcloud:/home/$(whoami)/.smartcloud" \
5
+ -v "/var/run/docker.sock:/var/run/docker.sock" \
6
+ -v "$PWD:$PWD" \
7
+ -w "$PWD" \
8
+ -u `id -u` \
9
+ smartcloud "$@"
@@ -0,0 +1,6 @@
1
+ machine:
2
+ host: 122.122.122.122
3
+ port: 22
4
+ username: yourusername
5
+ password: yourpassword
6
+ root_password: yourrootpassword
@@ -1,12 +1,14 @@
1
1
  # Be sure to restart your server when you modify this file.
2
2
 
3
- # naked domain to be used for runner apps
3
+ # => NOTE: Ensure that the specified top-level domains are pointing to this server ip address using DNS records.
4
+
5
+ # Top-level naked domain to be used for subdomains of apps.
4
6
  Smartcloud.config.apps_domain = "yourdomain.com"
5
7
 
6
8
  # domain to be used for git runner
7
9
  Smartcloud.config.git_domain = "git.yourdomain.com"
8
10
 
9
- # sysadmin email id to be used
11
+ # Sysadmin email id.
10
12
  Smartcloud.config.sysadmin_email = "admin@yourdomain.com"
11
13
 
12
14
  # letsencrypt test boolean to be used
@@ -0,0 +1,4 @@
1
+ # The username and password will be used by nginx to provide htpasswd based authentication for each of the domains specified.
2
+
3
+ git.yourdomain.com:
4
+ hello@yourdomain.com: yourpassword
@@ -7,50 +7,9 @@ module Smartcloud
7
7
  def initialize
8
8
  end
9
9
 
10
- def self.create(hostname, username, password)
11
- if hostname.nil? || hostname.empty? || username.nil? || username.empty? || password.nil? || password.empty?
12
- puts "One of hostname, username, password missing."
13
- else
14
- puts "-----> Creating User ... "
15
-
16
- salt = Base64.encode64((("a".."z").to_a + ("A".."Z").to_a + (0..9).to_a).shuffle[0..7].join)
17
- new_user = { "#{hostname}" => { "#{username}" => "#{password.crypt(salt)}" } }
18
- users = self.get_users_from_file
19
- users.merge!(new_user) { |hostname, curr_user_vals, new_user_val| (curr_user_vals && new_user_val) ? curr_user_vals.merge(new_user_val) : new_user_val }
20
- self.set_users_to_file(users)
21
-
22
- puts "-----> Creating User ... done"
23
- end
24
- end
25
-
26
- # def self.destroy(hostname, username)
27
- # if hostname.nil? || hostname.empty? || username.nil? || username.empty?
28
- # puts "One of hostname, username missing."
29
- # else
30
- # puts "-----> Removing User ... "
31
- #
32
- # users = self.get_users_from_file
33
- # # users.merge!(new_user)
34
- # self.set_users_to_file(users)
35
- #
36
- # puts "-----> Removing User ... done"
37
- # end
38
- # end
39
-
40
- private
41
-
42
- def self.get_users_from_file
43
- YAML.load_file("#{Smartcloud.config.user_home_path}/.smartcloud/grids/grid-nginx/users.yml") || Hash.new
44
- end
45
-
46
- def self.set_users_to_file(users)
47
- File.open("#{Smartcloud.config.user_home_path}/.smartcloud/grids/grid-nginx/users.yml", "w") { |file| file.write(users.to_yaml) }
48
- self.create_htpasswd_files
49
- end
50
-
51
10
  def self.create_htpasswd_files
52
- htpasswd_dirpath = "#{Smartcloud.config.user_home_path}/.smartcloud/grids/grid-nginx/htpasswd"
53
-
11
+ htpasswd_dirpath = "#{Dir.pwd}/grids/grid-nginx/htpasswd"
12
+
54
13
  # Remove existing htpasswd_dirpath
55
14
  FileUtils.rm_r htpasswd_dirpath if Dir.exist?(htpasswd_dirpath)
56
15
 
@@ -63,10 +22,17 @@ module Smartcloud
63
22
 
64
23
  file_data = ""
65
24
  users.each do |user, password|
66
- file_data += "#{user}:#{password}\n"
25
+ salt = Base64.encode64((("a".."z").to_a + ("A".."Z").to_a + (0..9).to_a).shuffle[0..7].join)
26
+ file_data += "#{user}:#{password.crypt(salt)}\n"
67
27
  end
68
- File.open("#{Smartcloud.config.user_home_path}/.smartcloud/grids/grid-nginx/htpasswd/#{hostname}", "w") { |file| file.write(file_data) }
28
+ File.open("#{Dir.pwd}/grids/grid-nginx/htpasswd/#{hostname}", "w") { |file| file.write(file_data) }
69
29
  end
70
30
  end
31
+
32
+ private
33
+
34
+ def self.get_users_from_file
35
+ YAML.load_file("#{Dir.pwd}/config/users.yml") || Hash.new
36
+ end
71
37
  end
72
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartcloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timeboard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-06 00:00:00.000000000 Z
11
+ date: 2019-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-ssh
@@ -70,12 +70,15 @@ files:
70
70
  - lib/smartcloud/grids/solr.rb
71
71
  - lib/smartcloud/logger.rb
72
72
  - lib/smartcloud/machine.rb
73
+ - lib/smartcloud/ssh.rb
74
+ - lib/smartcloud/templates/dotsmartcloud/bin/smartcloud.sh
75
+ - lib/smartcloud/templates/dotsmartcloud/config/credentials.yml
73
76
  - lib/smartcloud/templates/dotsmartcloud/config/environment.rb
77
+ - lib/smartcloud/templates/dotsmartcloud/config/users.yml
74
78
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-buildpacker/.keep
75
79
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-mysql/data/.keep
76
80
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-nginx/certificates/.keep
77
81
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-nginx/htpasswd/.keep
78
- - lib/smartcloud/templates/dotsmartcloud/grids/grid-nginx/users.yml
79
82
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-runner/apps/containers/.keep
80
83
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-runner/apps/repositories/.keep
81
84
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-runner/pre-receive
@@ -239,7 +242,7 @@ files:
239
242
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-solr/data/lib/.keep
240
243
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-solr/data/solr.xml
241
244
  - lib/smartcloud/templates/dotsmartcloud/grids/grid-solr/data/zoo.cfg
242
- - lib/smartcloud/templates/machine/config/machine.yml
245
+ - lib/smartcloud/templates/dotsmartcloud/tmp/.keep
243
246
  - lib/smartcloud/user.rb
244
247
  homepage: https://github.com/timeboardme/smartcloud
245
248
  licenses:
@@ -1,5 +0,0 @@
1
- machine:
2
- name: example
3
- host: 122.122.122.122
4
- username: exampleuser
5
- password: examplepassword