smartcloud 0.1.0 → 0.2.0.beta2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa2a3f8c929555cb37a5587ddbcf00af3e266afecc59442cdfe7c6c445d5a81b
4
- data.tar.gz: be14f3480b057ccc010c596665313dbbd5d7e6a5aec6098b7a8225b142f5cbea
3
+ metadata.gz: 4051b840648e71abfa206f4086f9b88a0b32a3ffa298552051b01e7d400a406e
4
+ data.tar.gz: 31797b7b8e04c51cad59cfe18edf3006b8faa2b8bd8149b51a35d7e6bc0508c3
5
5
  SHA512:
6
- metadata.gz: 42c54ce67d371361a9c6ffced3e81a864bc9e48feec61248fa5ed35099d62cc905beaf6a100ec6a450102cc5c129d7f4f7883f323cc5c459f2d129cbb7c9f44a
7
- data.tar.gz: cf1d7349d53f1d31abedbc9d403319ed1b2c0f277e8c9fe6ba877636f5a781765c562765a33838490f2e1cf90b6d66d625068d4644a2e485df4f09085e5d2207
6
+ metadata.gz: c14a5a273256e5c9addf84b93ba11370038f7f574baba0b6113958626188718ff51f2aaac1482b23c7d935c8f05e09d5d90b0e69085c3bade2b92f45a084b6aa
7
+ data.tar.gz: d3461f67d5b2b7c22d890d3fc78d3ef96ac7b03f55cb3f553cb523e0320022823fac6ea86b946357ff4c19d9ce28927a5b05d653c1859749248aea542cdfb0a1
@@ -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 --pre
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.beta2
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