vagrant-mosh 0.1.0
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 +7 -0
- data/.gitignore +7 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +10 -0
- data/LICENSE.md +20 -0
- data/README.md +90 -0
- data/Rakefile +14 -0
- data/Vagrantfile +23 -0
- data/lib/vagrant-mosh.rb +4 -0
- data/lib/vagrant-mosh/command.rb +93 -0
- data/lib/vagrant-mosh/plugin.rb +13 -0
- data/lib/vagrant-mosh/version.rb +5 -0
- data/support/provision.sh +23 -0
- data/vagrant-mosh.gemspec +20 -0
- metadata +70 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf1674d5eaceb827312236ae52fbaf863d246f95
|
4
|
+
data.tar.gz: ff03c7134727e4169d3ebc5b51986ddef90bca1d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ff65aa296e50fe852e09272b56c12f37c8d81c1cba6d3404331f1a033e00551ef1537db75b22ecd99749a9342158e40a9807f156b19bb6427e0835287b4f1ec0
|
7
|
+
data.tar.gz: c76a0c52fcfd82ccda0615d23624a842a53434b11906c582bc8bfba99af95600fe9526ccb7d6ec391200d86e7ed085c599be80dfc58e045b485a3d8fee18e039
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2015 Alex Rodionov
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
vagrant-mosh [](http://badge.fury.io/rb/vagrant-mosh)
|
2
|
+
============
|
3
|
+
|
4
|
+
Vagrant plugin to connect to box using [Mosh](https://mosh.mit.edu/).
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
```bash
|
10
|
+
$ vagrant plugin install vagrant-mosh
|
11
|
+
```
|
12
|
+
|
13
|
+
Usage
|
14
|
+
-----
|
15
|
+
|
16
|
+
Just use it as you would normally use `ssh` command:
|
17
|
+
|
18
|
+
```bash
|
19
|
+
$ vagrant mosh
|
20
|
+
```
|
21
|
+
|
22
|
+
Notes
|
23
|
+
-----
|
24
|
+
|
25
|
+
1. You have to install Mosh both on host and box by yourself.
|
26
|
+
2. Plugin has been tested to work with VirtualBox, AWS and DigitalOcean.
|
27
|
+
3. If you are using VirtualBox, it's required to use private/public network (that is because we need to have remote IP address from the box).
|
28
|
+
|
29
|
+
Testing
|
30
|
+
-------
|
31
|
+
|
32
|
+
Unfortunately, it's not that easy to write automated tests for it. The test should probably just run `vagrant mosh`, execute command in box and assert the result, but the way Mosh works doesn't allow to just execute the process.
|
33
|
+
|
34
|
+
Discussion on `#mosh`:
|
35
|
+
|
36
|
+
```
|
37
|
+
p0deje: can anybody help me run mosh programmatically?
|
38
|
+
p0deje: I want to run mosh from Ruby script, execute command and return
|
39
|
+
p0deje: the script works fine for SSH, but not for Mosh
|
40
|
+
p0deje: script itself is at https://gist.github.com/p0deje/c5dbfa0d137e8c11d3f5
|
41
|
+
chris2: i guess expect doesnt like mosh's efficient redrawing
|
42
|
+
...
|
43
|
+
chris2: perhaps you can work around by running mosh in tmux and exporting the output of tmux...
|
44
|
+
chris2: anyway, you need something that understands ANSI sequences
|
45
|
+
```
|
46
|
+
|
47
|
+
To test it manually, there is a Vagrantfile which helps you do that:
|
48
|
+
|
49
|
+
```bash
|
50
|
+
# start all boxes
|
51
|
+
$ bundle exec rake box:add
|
52
|
+
$ bundle exec vagrant up
|
53
|
+
|
54
|
+
$ bundle exec vagrant mosh static_ip # test VirtualBox static IP networking
|
55
|
+
$ bundle exec vagrant mosh dynamic_ip # test VirtualBox DHCP networking
|
56
|
+
|
57
|
+
# remove all boxes
|
58
|
+
$ bundle exec vagrant destroy
|
59
|
+
$ bundle exec rake box:remove
|
60
|
+
```
|
61
|
+
|
62
|
+
Also, it's possible to test remote providers (if you have [DigitalOcean](https://www.digitalocean.com/) account):
|
63
|
+
|
64
|
+
```bash
|
65
|
+
$ export DIGITALOCEAN_TOKEN="your_token"
|
66
|
+
$ bundle exec vagrant up digitalocean
|
67
|
+
$ bundle exec vagrant mosh digitalocean
|
68
|
+
$ bundle exec vagrant destroy digitalocean
|
69
|
+
```
|
70
|
+
|
71
|
+
TODO
|
72
|
+
----
|
73
|
+
|
74
|
+
1. Try to forward UDP ports rather finding remote IP address of the box.
|
75
|
+
2. Add tests.
|
76
|
+
3. Refactor to work as action.
|
77
|
+
|
78
|
+
Contributing
|
79
|
+
------------
|
80
|
+
|
81
|
+
* Fork the project.
|
82
|
+
* Make your feature addition or bug fix.
|
83
|
+
* ~~Add tests for it. This is important so I don't break it in a future version unintentionally.~~ (no automated tests exist at the moment)
|
84
|
+
* Commit, do not mess with Rakefile, version, or history. If you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull.
|
85
|
+
* Send me a pull request. Bonus points for topic branches.
|
86
|
+
|
87
|
+
Copyright
|
88
|
+
---------
|
89
|
+
|
90
|
+
Copyright (c) 2015 Alex Rodionov. See LICENSE.md for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
namespace :box do
|
5
|
+
desc 'Downloads and adds vagrant box for testing.'
|
6
|
+
task :add do
|
7
|
+
sh 'bundle exec vagrant box add ubuntu/trusty64'
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Removes testing vagrant box.'
|
11
|
+
task :remove do
|
12
|
+
sh 'bundle exec vagrant box remove --force ubuntu/trusty64'
|
13
|
+
end
|
14
|
+
end
|
data/Vagrantfile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Vagrant.configure('2') do |config|
|
2
|
+
config.vm.box = 'ubuntu/trusty64'
|
3
|
+
config.vm.provision 'shell', path: 'support/provision.sh'
|
4
|
+
|
5
|
+
config.vm.define 'static_ip' do |machine|
|
6
|
+
machine.vm.network :private_network, ip: '192.168.50.6'
|
7
|
+
end
|
8
|
+
|
9
|
+
config.vm.define 'dynamic_ip' do |machine|
|
10
|
+
machine.vm.network :private_network, type: 'dhcp'
|
11
|
+
end
|
12
|
+
|
13
|
+
config.vm.define 'digitalocean', autostart: false do |machine|
|
14
|
+
machine.vm.provider :digital_ocean do |provider, override|
|
15
|
+
override.ssh.private_key_path = '~/.ssh/id_rsa'
|
16
|
+
override.vm.box = 'digital_ocean'
|
17
|
+
override.vm.box_url = 'https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box'
|
18
|
+
|
19
|
+
provider.token = ENV['DIGITALOCEAN_TOKEN']
|
20
|
+
provider.image = 'ubuntu-14-04-x64'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/vagrant-mosh.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Mosh
|
3
|
+
class Command < Vagrant.plugin(2, :command)
|
4
|
+
def self.synopsis
|
5
|
+
'connects to machine via Mosh'
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute
|
9
|
+
opts = OptionParser.new do |o|
|
10
|
+
o.banner = 'Usage: vagrant mosh [vm-name]'
|
11
|
+
o.separator ''
|
12
|
+
end
|
13
|
+
argv = parse_options(opts)
|
14
|
+
return unless argv
|
15
|
+
|
16
|
+
with_target_vms(argv, single_target: true) do |vm|
|
17
|
+
ssh_info = vm.ssh_info
|
18
|
+
switch_to_remote_ip(ssh_info, vm) if localhost?(ssh_info[:host])
|
19
|
+
mosh_command = ['mosh', *mosh_arguments(ssh_info)].join(' ')
|
20
|
+
Vagrant::Util::SafeExec.exec(mosh_command)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def localhost?(host)
|
27
|
+
%w[localhost 127.0.0.1].include?(host)
|
28
|
+
end
|
29
|
+
|
30
|
+
def switch_to_remote_ip(ssh_info, vm)
|
31
|
+
ssh_info.delete(:port)
|
32
|
+
if ip = find_remote_ip(vm)
|
33
|
+
ssh_info[:host] = ip
|
34
|
+
else
|
35
|
+
raise "Cannot find remote box IP address. Make sure you're not using NAT."
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_remote_ip(vm)
|
40
|
+
adapter_numbers = vm.provider.driver.read_network_interfaces.keys
|
41
|
+
adapter_numbers.map do |adapter_number|
|
42
|
+
begin
|
43
|
+
vm.provider.driver.read_guest_ip(adapter_number)
|
44
|
+
rescue Vagrant::Errors::VirtualBoxGuestPropertyNotFound
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
end.compact.first
|
48
|
+
end
|
49
|
+
|
50
|
+
def mosh_arguments(ssh_info)
|
51
|
+
[
|
52
|
+
"--ssh", "'#{ssh_command(ssh_info)}'",
|
53
|
+
"#{ssh_info[:username]}@#{ssh_info[:host]}"
|
54
|
+
]
|
55
|
+
end
|
56
|
+
|
57
|
+
# This method pretty much duplicates `Vagrant::Util::SSH.exec`.
|
58
|
+
#
|
59
|
+
# It would be great to be able to get this logic from Vagrant itself
|
60
|
+
# but it requires some core changes.
|
61
|
+
def ssh_command(ssh_info)
|
62
|
+
command_options = %W[
|
63
|
+
-o Compression=yes
|
64
|
+
-o DSAAuthentication=yes
|
65
|
+
-o LogLevel=#{ssh_info[:log_level] || 'FATAL'}
|
66
|
+
-o StrictHostKeyChecking=no
|
67
|
+
-o UserKnownHostsFile=/dev/null
|
68
|
+
]
|
69
|
+
|
70
|
+
if ssh_info[:forward_x11]
|
71
|
+
command_options += %w[
|
72
|
+
-o ForwardX11=yes
|
73
|
+
-o ForwardX11Trusted=yes
|
74
|
+
]
|
75
|
+
end
|
76
|
+
|
77
|
+
if ssh_info[:forward_agent]
|
78
|
+
command_options += %w[-o ForwardAgent=yes]
|
79
|
+
end
|
80
|
+
|
81
|
+
ssh_info[:private_key_path].each do |path|
|
82
|
+
command_options += ['-i', path]
|
83
|
+
end
|
84
|
+
|
85
|
+
if ssh_info[:port]
|
86
|
+
command_options += ['-p', ssh_info[:port]]
|
87
|
+
end
|
88
|
+
|
89
|
+
"ssh #{command_options.join(' ')}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/bin/bash -x
|
2
|
+
|
3
|
+
# fix locale
|
4
|
+
export LANGUAGE=en_US.UTF-8
|
5
|
+
export LANG=en_US.UTF-8
|
6
|
+
export LC_ALL=en_US.UTF-8
|
7
|
+
sudo locale-gen en_US.UTF-8
|
8
|
+
sudo dpkg-reconfigure locales
|
9
|
+
|
10
|
+
# Uncomment the following to build using package manager:
|
11
|
+
sudo apt-get install -y mosh
|
12
|
+
|
13
|
+
# Uncomment the following to build from source:
|
14
|
+
# sudo apt-get install -y libncurses5-dev libprotobuf-dev libssl-dev protobuf-compiler zlib1g-dev
|
15
|
+
# sudo apt-get install -y autoconf build-essential git pkg-config
|
16
|
+
# git clone https://github.com/keithw/mosh
|
17
|
+
# cd mosh
|
18
|
+
# ./autogen.sh
|
19
|
+
# ./configure
|
20
|
+
# make
|
21
|
+
# sudo make install
|
22
|
+
# cd ../
|
23
|
+
# rm -rf mosh/
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
2
|
+
require 'vagrant-mosh/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'vagrant-mosh'
|
6
|
+
s.version = VagrantPlugins::Mosh::VERSION
|
7
|
+
s.author = 'Alex Rodionov'
|
8
|
+
s.email = 'p0deje@gmail.com'
|
9
|
+
s.homepage = 'http://github.com/p0deje/vagrant-mosh'
|
10
|
+
s.summary = 'Use Mosh to connect to box'
|
11
|
+
s.description = 'Vagrant plugin to use Mosh to connect to box'
|
12
|
+
s.license = 'MIT'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
17
|
+
s.require_paths = %w[lib]
|
18
|
+
|
19
|
+
s.add_development_dependency 'rake'
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-mosh
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Rodionov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Vagrant plugin to use Mosh to connect to box
|
28
|
+
email: p0deje@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- ".gitignore"
|
34
|
+
- CHANGELOG.md
|
35
|
+
- Gemfile
|
36
|
+
- LICENSE.md
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- Vagrantfile
|
40
|
+
- lib/vagrant-mosh.rb
|
41
|
+
- lib/vagrant-mosh/command.rb
|
42
|
+
- lib/vagrant-mosh/plugin.rb
|
43
|
+
- lib/vagrant-mosh/version.rb
|
44
|
+
- support/provision.sh
|
45
|
+
- vagrant-mosh.gemspec
|
46
|
+
homepage: http://github.com/p0deje/vagrant-mosh
|
47
|
+
licenses:
|
48
|
+
- MIT
|
49
|
+
metadata: {}
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 2.2.2
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: Use Mosh to connect to box
|
70
|
+
test_files: []
|