placer 0.2.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e5096d719ac49f40ad59c6e52dfb19934a7929fb
4
+ data.tar.gz: 04205c0121ffed5e8fab9b0c62bdfa15918e5ace
5
+ SHA512:
6
+ metadata.gz: 8b8844240a7b9729b9674fefcd26e5d9d1bee3e2c5002bb884ce9412f9c507896b4e6c357df2dfc19a7eaa22e7e986b8e579b1be1016caa0206db57ab504f2c9
7
+ data.tar.gz: afa2a6ac773a71c314c8c07eddb91b34ef12efc83c07b47dc33aa782f2f720e6b6813d76440e36da5cb891041307806196775440dd80cf53e98ac07e742969b0
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ # gem "rails"
5
+ gem 'net-ssh'
6
+ gem 'net-sftp'
@@ -0,0 +1,16 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ net-sftp (2.1.2)
5
+ net-ssh (>= 2.6.5)
6
+ net-ssh (4.1.0)
7
+
8
+ PLATFORMS
9
+ ruby
10
+
11
+ DEPENDENCIES
12
+ net-sftp
13
+ net-ssh
14
+
15
+ BUNDLED WITH
16
+ 1.14.6
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'placer'
4
+
5
+ placer = Placer.new ARGV
6
+ placer.start
@@ -0,0 +1,12 @@
1
+ # Supported levels are basically every user-defined symbol
2
+ class MyLogger
3
+ # Pass [:all] to log just everything
4
+ def initialize(*hide_levels)
5
+ @hide_levels = hide_levels.flatten
6
+ end
7
+
8
+ def log(level, message)
9
+ return if @hide_levels.include?(:all) || @hide_levels.include?(level)
10
+ puts "[LOG] [#{level.to_s.upcase}]: #{message}"
11
+ end
12
+ end
@@ -0,0 +1,69 @@
1
+ require 'optparse'
2
+ require_relative 'placer_dsl'
3
+ require_relative 'my_logger'
4
+
5
+ class Placer
6
+ def initialize(args)
7
+ @args, @params = parse_options(args)
8
+ @logger = @params[:log] ? MyLogger.new : MyLogger.new(:all)
9
+ end
10
+
11
+ def start
12
+ @logger.log(:info, "Loading config file #{@params[:config_path]}")
13
+ if @params[:debug]
14
+ run
15
+ else
16
+ begin
17
+ run
18
+ rescue => e
19
+ @logger.log(:error, e)
20
+ end
21
+ end
22
+ end
23
+
24
+ def run
25
+ PlacerDSL.new(File.read(@params[:config_path]), @logger)
26
+ end
27
+
28
+ def parse_options(args)
29
+ opts = OptionParser.new
30
+ params = {}
31
+
32
+ banner = <<BANNER
33
+ placer - a simpler deployment
34
+ deployment back to the basics
35
+
36
+ If you have no config, just start off by the example in the repo/placer.yaml.
37
+ In case you are wondering, public/private key auth is the only way.
38
+ We don't support manual solutions. This tool is thought for automated use.
39
+
40
+ Usage: placer [options]
41
+ BANNER
42
+
43
+ opts.banner = banner
44
+
45
+ params[:log] = true
46
+ opts.on('-q', '--[no-]log', 'toggle logging') do |val|
47
+ params[:log] = val
48
+ end
49
+
50
+ params[:config_path] = 'placer.rb'
51
+ opts.on('-c', '--config FILE', 'path to config FILE to use default: ' << params[:config_path]) do |file|
52
+ params[:config_path] = file
53
+ end
54
+
55
+ params[:debug] = false
56
+ opts.on('--debug', 'enable debugging') do
57
+ params[:debug] = true
58
+ end
59
+
60
+ opts.on_tail('-h', '--help', 'shows this message') do
61
+ puts opts
62
+ exit
63
+ end
64
+
65
+ args = opts.parse(args)
66
+
67
+ [args, params]
68
+ end
69
+ end
@@ -0,0 +1,62 @@
1
+ require 'net/ssh'
2
+ require 'net/sftp'
3
+
4
+ class SSHDSL
5
+ def initialize(conn, logger)
6
+ @conn = conn
7
+ @logger = logger
8
+ end
9
+
10
+ def exec(*command)
11
+ cmd = command.flatten.join(' ')
12
+ @logger.log(:ssh_exec, "Executing command #{cmd} on remote")
13
+ @conn.exec!(cmd) do |channel, stream, data|
14
+ {:stdout => :ssh_info, :stderr => :ssh_error}.each do |s, l|
15
+ data.lines.each{ |d| @logger.log(l, d) if stream == s }
16
+ end
17
+
18
+ channel.on_request("exit-status") do |ch, data|
19
+ exit_code = data.read_long
20
+ raise "remote command: \"#{cmd}\" returned with non-zero exit code: #{exit_code}" if exit_code != 0
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ class SFTPDSL
27
+ def initialize(conn, logger)
28
+ @conn = conn
29
+ @logger = logger
30
+ end
31
+
32
+ def upload(from, to)
33
+ Dir.glob(from).each do |src|
34
+ to.flatten.each do |dst|
35
+ dst += File.basename(src) if dst.end_with?('/')
36
+ @logger.log(:sftp, "Uploading #{src} to #{dst}")
37
+ # Maybe parallel uploads with @conn.upload!
38
+ @conn.upload!(src, dst)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ class PlacerDSL
45
+ def initialize(config, logger)
46
+ @logger = logger
47
+
48
+ instance_eval config
49
+ end
50
+
51
+ def ssh(&block)
52
+ Net::SSH.start(@ssh_host, @ssh_user, @ssh_options) do |c|
53
+ block.call SSHDSL.new(c, @logger)
54
+ end
55
+ end
56
+
57
+ def sftp(&block)
58
+ Net::SFTP.start(@ssh_host, @ssh_user, @ssh_options) do |c|
59
+ block.call SFTPDSL.new(c, @logger)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,18 @@
1
+ # @ssh_host, @ssh_user and @ssh_options are used for sftp and ssh
2
+ @ssh_host = 'ekranos.me'
3
+ @ssh_user = 'ekranos'
4
+ @ssh_options = {port: 10099, user: 'ekranos', keys: '~/.ssh/ekranos.me', keys_only: true}
5
+ @tmp_gem_path = '/tmp/placer.gem'
6
+ @public_path = "/home/#{@ssh_user}/caddy/public.ekranos.me/browse"
7
+
8
+ sftp do |sftp|
9
+ {'placer-*.gem' => [@tmp_gem_path, "#{@public_path}/ruby/gems/placer/"]}.each do |k, v|
10
+ sftp.upload k, v
11
+ end
12
+ end
13
+
14
+ ssh do |ssh|
15
+ ['gem install', 'rm'].each do |cmd|
16
+ ssh.exec "#{cmd} '#{@tmp_gem_path}'"
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: placer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Marvin Lee Fimmel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-05-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Automates Deployment via ssh and sftp. Focuses on simplicity.
14
+ email: kontakt@ekranos.me
15
+ executables:
16
+ - placer
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - Gemfile
21
+ - Gemfile.lock
22
+ - bin/placer
23
+ - lib/my_logger.rb
24
+ - lib/placer.rb
25
+ - lib/placer_dsl.rb
26
+ - placer.rb
27
+ homepage: https://git.ekranos.me/ekranos/placer
28
+ licenses:
29
+ - MIT
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements:
46
+ - net-ssh
47
+ - net-sftp
48
+ rubyforge_project:
49
+ rubygems_version: 2.6.8
50
+ signing_key:
51
+ specification_version: 4
52
+ summary: Simple Deployment Automation
53
+ test_files: []