linecook 0.6.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +139 -0
- data/HowTo/Control Virtual Machines +106 -0
- data/HowTo/Generate Scripts +263 -0
- data/HowTo/Run Scripts +87 -0
- data/HowTo/Setup Virtual Machines +76 -0
- data/License.txt +1 -1
- data/README +78 -59
- data/bin/linecook +12 -5
- data/bin/linecook_run +45 -0
- data/bin/linecook_scp +50 -0
- data/lib/linecook.rb +1 -3
- data/lib/linecook/attributes.rb +49 -12
- data/lib/linecook/commands.rb +9 -4
- data/lib/linecook/commands/build.rb +69 -0
- data/lib/linecook/commands/command.rb +13 -3
- data/lib/linecook/commands/command_error.rb +6 -0
- data/lib/linecook/commands/env.rb +74 -8
- data/lib/linecook/commands/helper.rb +271 -24
- data/lib/linecook/commands/init.rb +10 -6
- data/lib/linecook/commands/package.rb +36 -18
- data/lib/linecook/commands/run.rb +66 -0
- data/lib/linecook/commands/snapshot.rb +114 -0
- data/lib/linecook/commands/ssh.rb +39 -0
- data/lib/linecook/commands/start.rb +34 -0
- data/lib/linecook/commands/state.rb +32 -0
- data/lib/linecook/commands/stop.rb +22 -0
- data/lib/linecook/commands/vbox_command.rb +130 -0
- data/lib/linecook/cookbook.rb +112 -55
- data/lib/linecook/package.rb +293 -109
- data/lib/linecook/proxy.rb +19 -0
- data/lib/linecook/recipe.rb +321 -62
- data/lib/linecook/template.rb +7 -101
- data/lib/linecook/test.rb +196 -141
- data/lib/linecook/test/command_parser.rb +75 -0
- data/lib/linecook/test/file_test.rb +153 -35
- data/lib/linecook/test/shell_test.rb +176 -0
- data/lib/linecook/utils.rb +25 -7
- data/lib/linecook/version.rb +4 -4
- data/templates/Rakefile +44 -47
- data/templates/_gitignore +1 -1
- data/templates/attributes/project_name.rb +4 -4
- data/templates/config/ssh +15 -0
- data/templates/files/help.txt +1 -0
- data/templates/helpers/project_name/assert_content_equal.erb +15 -0
- data/templates/helpers/project_name/create_dir.erb +9 -0
- data/templates/helpers/project_name/create_file.erb +8 -0
- data/templates/helpers/project_name/install_file.erb +8 -0
- data/templates/packages/abox.yml +4 -0
- data/templates/recipes/abox.rb +22 -0
- data/templates/recipes/abox_test.rb +14 -0
- data/templates/templates/todo.txt.erb +3 -0
- data/templates/test/project_name_test.rb +19 -0
- data/templates/test/test_helper.rb +14 -0
- metadata +43 -41
- data/cookbook +0 -0
- data/lib/linecook/commands/helpers.rb +0 -28
- data/lib/linecook/commands/vbox.rb +0 -85
- data/lib/linecook/helper.rb +0 -117
- data/lib/linecook/shell.rb +0 -11
- data/lib/linecook/shell/posix.rb +0 -145
- data/lib/linecook/shell/test.rb +0 -254
- data/lib/linecook/shell/unix.rb +0 -117
- data/lib/linecook/shell/utils.rb +0 -138
- data/templates/README +0 -90
- data/templates/files/file.txt +0 -1
- data/templates/helpers/project_name/echo.erb +0 -5
- data/templates/recipes/project_name.rb +0 -20
- data/templates/scripts/project_name.yml +0 -7
- data/templates/templates/template.txt.erb +0 -3
- data/templates/vbox/setup/virtual_box +0 -86
- data/templates/vbox/ssh/id_rsa +0 -27
- data/templates/vbox/ssh/id_rsa.pub +0 -1
data/HowTo/Run Scripts
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
= Run Scripts
|
2
|
+
|
3
|
+
Linecook runs scripts using the 'run' command. Internally run copies scripts
|
4
|
+
to a server using scp and then executes the script using ssh. More
|
5
|
+
specifically run copies a *package* to the server and executes a script within
|
6
|
+
the package using ssh. A package is simply a directory containing scripts and
|
7
|
+
any files the scripts use.
|
8
|
+
|
9
|
+
To manually recreate what run does, make a directory with an script, copy it,
|
10
|
+
and execute as below (assuming you set up the 'abox' server {as described
|
11
|
+
earlier}[link:files/Tutorial/1%20-%20VM%20Setup.html]). Note that the script
|
12
|
+
is made executable locally such that scp will make the script executable on
|
13
|
+
the server.
|
14
|
+
|
15
|
+
mkdir demo
|
16
|
+
cat > demo/script.sh <<"DOC"
|
17
|
+
echo "# $(whoami)@$(hostname): hello world!"
|
18
|
+
DOC
|
19
|
+
chmod +x demo/script.sh
|
20
|
+
|
21
|
+
scp -r -P 2220 demo linecook@localhost:/tmp/demo
|
22
|
+
ssh -p 2220 linecook@localhost -- "/tmp/demo/script.sh"
|
23
|
+
# linecook@abox-ubuntu: hello world!
|
24
|
+
|
25
|
+
To simplify this a little, move the redundant information used by scp and ssh
|
26
|
+
can into a standard ssh config file. Linecook looks for an ssh config file in
|
27
|
+
'config/ssh' by default:
|
28
|
+
|
29
|
+
mkdir config
|
30
|
+
cat > config/ssh <<DOC
|
31
|
+
Host abox
|
32
|
+
User linecook
|
33
|
+
HostName localhost
|
34
|
+
Port 2220
|
35
|
+
DOC
|
36
|
+
|
37
|
+
Now run will copy the package under the 'packages' directory with the same
|
38
|
+
name as the Host config, and execute the specified script:
|
39
|
+
|
40
|
+
mkdir packages
|
41
|
+
mv demo packages/abox
|
42
|
+
linecook run --script script.sh abox
|
43
|
+
# linecook@abox-ubuntu: hello world!
|
44
|
+
|
45
|
+
To run multiple packages at once, simply add more hosts to the ssh config
|
46
|
+
file. Run copies each package to the appropriate host and then runs the same
|
47
|
+
script on each (in alphabetic order by host). So say you also set up a 'bbox'
|
48
|
+
same as 'abox':
|
49
|
+
|
50
|
+
cat >> config/ssh <<DOC
|
51
|
+
Host abox
|
52
|
+
Port 2220
|
53
|
+
|
54
|
+
Host bbox
|
55
|
+
Port 2221
|
56
|
+
|
57
|
+
Host *
|
58
|
+
User linecook
|
59
|
+
HostName localhost
|
60
|
+
DOC
|
61
|
+
cp packages/abox packages/bbox
|
62
|
+
|
63
|
+
Then:
|
64
|
+
|
65
|
+
linecook run --script script.sh abox bbox
|
66
|
+
# linecook@abox-ubuntu: hello world!
|
67
|
+
# linecook@bbox-ubuntu: hello world!
|
68
|
+
|
69
|
+
Note that by default run will execute the 'run' script on all hosts configured
|
70
|
+
in 'config/ssh'. Leveraging these defaults simplifies the last command:
|
71
|
+
|
72
|
+
mv packages/abox/script.sh packages/abox/run
|
73
|
+
mv packages/bbox/script.sh packages/bbox/run
|
74
|
+
linecook run
|
75
|
+
# linecook@abox-ubuntu: hello world!
|
76
|
+
# linecook@bbox-ubuntu: hello world!
|
77
|
+
|
78
|
+
If you've never used scp/ssh with a config file then this may seem unfamiliar
|
79
|
+
but hopefully quite graceful. For scp/ssh masters, these are equivalent for
|
80
|
+
each host:
|
81
|
+
|
82
|
+
linecook run --remote-dir=/tmp/linecook SCRIPT ARGS...
|
83
|
+
|
84
|
+
scp -q -r -p -F config/ssh packages/host "host:/tmp/linecook"
|
85
|
+
ssh -q -t -t -F config/ssh host -- "/tmp/linecook/SCRIPT ARGS..."
|
86
|
+
|
87
|
+
Now that you can run scripts, onward to generating scripts!
|
@@ -0,0 +1,76 @@
|
|
1
|
+
= Setup Virtual Machines
|
2
|
+
|
3
|
+
{VirtualBox}[http://www.virtualbox.org] runs virtual machines on your local
|
4
|
+
box. Local VMs help minimize development cycles because they are quick to
|
5
|
+
access and reset. In addition, VirtualBox allows snapshots which can save and
|
6
|
+
restore a particular server state - this functionality enables iterative
|
7
|
+
development.
|
8
|
+
|
9
|
+
To set up a Ubuntu VM using VirtualBox:
|
10
|
+
|
11
|
+
1. Download and Install VirtualBox (http://www.virtualbox.org)
|
12
|
+
2. Download a Ubuntu ISO (http://www.ubuntu.com/server/get-ubuntu/download)
|
13
|
+
3. Build the Box
|
14
|
+
|
15
|
+
When done, see the documentation for {controlling
|
16
|
+
VMs}[link:files/HowTo/Control%20Virtual%20Machines.html]
|
17
|
+
|
18
|
+
== Building a Ubuntu Box
|
19
|
+
|
20
|
+
Use the VirtualBox wizard to get started. The name and other settings (ex
|
21
|
+
user, ssh port) may be changed but be sure to propagate changes throughout the
|
22
|
+
setup process.
|
23
|
+
|
24
|
+
- name: abox
|
25
|
+
- Linux/Ubuntu
|
26
|
+
- 512 MB memory
|
27
|
+
- 8 GB dynamically resizing drive
|
28
|
+
|
29
|
+
Add the Ubuntu iso to the cd/dvd device under Settings > Storage. Now start
|
30
|
+
the server and install Ubuntu (use default settings unless specified):
|
31
|
+
|
32
|
+
- hostname: abox-ubuntu
|
33
|
+
- user/password: linecook
|
34
|
+
- select 'OpenSSH server' in packages to install
|
35
|
+
|
36
|
+
When the server has rebooted and is at the login screen, remove the install
|
37
|
+
iso, take a snapshot, and setup port forwarding. Port forwarding allows you to
|
38
|
+
access the ssh port (22) on the VM via a port on your local box (2220).
|
39
|
+
|
40
|
+
(Devices > CD/DVD Devices > Remove disk from virtual drive)
|
41
|
+
VBoxManage snapshot abox take RAW
|
42
|
+
VBoxManage controlvm abox poweroff
|
43
|
+
# wait to fully power off
|
44
|
+
VBoxManage modifyvm abox --natpf1 'abox-ssh,tcp,,2220,,22'
|
45
|
+
VBoxManage -q snapshot abox restore RAW
|
46
|
+
VBoxManage startvm abox
|
47
|
+
|
48
|
+
Transfer your ssh key to the VM (notice port 2220). Help to generate ssh keys
|
49
|
+
can be found on {GitHub}[http://help.github.com/key-setup-redirect]:
|
50
|
+
|
51
|
+
scp -P 2220 -o UserKnownHostsFile=/dev/null ~/.ssh/id_rsa.pub linecook@localhost:id_rsa.pub
|
52
|
+
|
53
|
+
Login as linecook and setup SSH access:
|
54
|
+
|
55
|
+
vm: mkdir .ssh
|
56
|
+
vm: mv id_rsa.pub .ssh/authorized_keys
|
57
|
+
vm: chmod 0700 .ssh
|
58
|
+
vm: chmod 0600 .ssh/authorized_keys
|
59
|
+
|
60
|
+
Remove the login banner (as a convenience) and exit:
|
61
|
+
|
62
|
+
vm: sudo rm /etc/motd
|
63
|
+
vm: exit
|
64
|
+
|
65
|
+
Now take a base snapshot:
|
66
|
+
|
67
|
+
VBoxManage snapshot abox take BASE
|
68
|
+
VBoxManage controlvm abox poweroff
|
69
|
+
|
70
|
+
To cleanup port forwarding (run later, if ever):
|
71
|
+
|
72
|
+
VBoxManage modifyvm abox --natpf1 delete 'abox-ssh'
|
73
|
+
|
74
|
+
The same procedure can be repeated to build other VMs. Nothing is special
|
75
|
+
about this setup. The os, name, port, and other settings may be changed to
|
76
|
+
your liking - all that Linecook requires is ssh access.
|
data/License.txt
CHANGED
data/README
CHANGED
@@ -4,95 +4,114 @@ A shell script generator.
|
|
4
4
|
|
5
5
|
== Description
|
6
6
|
|
7
|
-
Linecook
|
8
|
-
|
9
|
-
provision
|
7
|
+
Linecook generates shell scripts using an extensible set of ERB helpers. The
|
8
|
+
shell scripts and associated resources (files, subscripts, etc) make up
|
9
|
+
packages that can be used, for example, to provision servers.
|
10
10
|
|
11
|
-
|
11
|
+
Linecook provides a command line tool to manage development servers, generate
|
12
|
+
scripts, and run scripts on servers. Helpers and recipes can be shared as
|
13
|
+
gems; the canonical shell helpers are available through
|
14
|
+
{Linebook}[http://rubygems.org/gems/linebook/].
|
12
15
|
|
13
|
-
|
14
|
-
* write a recipe using the helpers
|
15
|
-
* generate a script from the recipe
|
16
|
+
See the documentation for help to:
|
16
17
|
|
17
|
-
|
18
|
-
|
18
|
+
* {Setup}[link:files/HowTo/Setup%20Virtual%20Machines.html] and {Control}[link:files/HowTo/Control%20Virtual%20Machines.html] Virtual Machines
|
19
|
+
* {Generate Scripts}[link:files/HowTo/Generate%20Scripts.html]
|
20
|
+
* {Run Scripts}[link:files/HowTo/Run%20Scripts.html]
|
19
21
|
|
20
22
|
== Usage
|
21
23
|
|
22
|
-
Generate a
|
24
|
+
Generate a project.
|
23
25
|
|
24
|
-
% linecook init
|
25
|
-
% cd
|
26
|
+
% linecook init chalkboard
|
27
|
+
% cd chalkboard
|
26
28
|
|
27
|
-
|
29
|
+
Define default attributes.
|
28
30
|
|
29
|
-
[
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
[helpers/
|
37
|
-
|
31
|
+
[attributes/chalkboard.rb]
|
32
|
+
attrs['chalkboard']['n'] = 3
|
33
|
+
attrs['chalkboard']['color'] = 'white'
|
34
|
+
attrs['chalkboard']['message'] = 'I will not manually configure my server'
|
35
|
+
|
36
|
+
Define a helper.
|
37
|
+
|
38
|
+
[helpers/chalkboard/echo_in_color.erb]
|
39
|
+
Echo a string in color.
|
38
40
|
(color, str)
|
41
|
+
color_codes = Hash[*%W{
|
42
|
+
black 0;30 red 0;31
|
43
|
+
white 1;37 green 0;32
|
44
|
+
light_gray 0;37 blue 0;34
|
45
|
+
}]
|
39
46
|
--
|
40
|
-
\033[<%=
|
47
|
+
echo -e '\033[<%= color_codes[color.to_s] %>m<%= str %>\033[0m'
|
48
|
+
|
49
|
+
Use both in a recipe.
|
50
|
+
|
51
|
+
[recipes/chalkboard.rb]
|
52
|
+
attributes "chalkboard"
|
53
|
+
helpers "chalkboard"
|
41
54
|
|
42
|
-
[
|
43
|
-
|
44
|
-
|
45
|
-
color = options[:color]
|
46
|
-
--
|
47
|
-
echo -e '<%= color ? _color(color, str) : str %>'
|
55
|
+
attrs['chalkboard']['n'].times do
|
56
|
+
echo_in_color attrs['chalkboard']['color'], attrs['chalkboard']['message']
|
57
|
+
end
|
48
58
|
|
49
|
-
Define default attributes.
|
59
|
+
Define a package to use the recipe; set non-default attributes as needed.
|
50
60
|
|
51
|
-
[
|
52
|
-
|
53
|
-
|
61
|
+
[packages/chalkboard.yml]
|
62
|
+
chalkboard:
|
63
|
+
n: 5
|
64
|
+
color: blue
|
54
65
|
|
55
|
-
|
66
|
+
Generate the package from the attributes, helpers, and recipe.
|
56
67
|
|
57
|
-
|
58
|
-
helpers "example"
|
59
|
-
attributes "example"
|
60
|
-
|
61
|
-
attrs['example']['n'].times do
|
62
|
-
echo "I will not manually configure my server", :color => attrs['example']['color']
|
63
|
-
end
|
68
|
+
% linecook build
|
64
69
|
|
65
|
-
|
70
|
+
Check the packages directory to see the resulting script.
|
66
71
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
72
|
+
% cat packages/chalkboard/run
|
73
|
+
echo -e '\033[0;34mI will not manually configure my server\033[0m'
|
74
|
+
echo -e '\033[0;34mI will not manually configure my server\033[0m'
|
75
|
+
echo -e '\033[0;34mI will not manually configure my server\033[0m'
|
76
|
+
echo -e '\033[0;34mI will not manually configure my server\033[0m'
|
77
|
+
echo -e '\033[0;34mI will not manually configure my server\033[0m'
|
73
78
|
|
74
|
-
|
79
|
+
Now run the package.
|
75
80
|
|
76
|
-
%
|
81
|
+
% linecook run
|
77
82
|
|
78
|
-
|
83
|
+
The package can be run on any server accessible via ssh. See the generated
|
84
|
+
'config/ssh' file as well as the documentation for {Running Scripts on
|
85
|
+
Servers}[link:files/HowTo/Run%20Scripts.html].
|
79
86
|
|
80
|
-
|
81
|
-
% rake vbox:ssh
|
82
|
-
vm: bash /vbox/scripts/example.sh
|
83
|
-
vm: exit
|
87
|
+
== Composition
|
84
88
|
|
85
|
-
|
89
|
+
Linecook consists of the following.
|
90
|
+
|
91
|
+
= Components =
|
92
|
+
attributes
|
93
|
+
helpers
|
94
|
+
|-----> recipes -> packages -a-> (scripts) -b-> (servers) <-c- server setup
|
95
|
+
files
|
96
|
+
templates
|
97
|
+
|
98
|
+
= Commands =
|
99
|
+
ex: 'linecook build' on the command line
|
100
|
+
|
101
|
+
a) env, helper, package, build # build scripts
|
102
|
+
b) run # run scripts
|
103
|
+
c) start, stop, ssh, snapshot, reset # server setup/control
|
86
104
|
|
87
|
-
|
105
|
+
Everything to the left of 'scripts' has to do with generating scripts;
|
106
|
+
everything to the right with running scripts on servers.
|
88
107
|
|
89
108
|
== Installation
|
90
109
|
|
91
|
-
Linecook is available as a gem
|
110
|
+
Linecook is available as a {gem}[http://rubygems.org/gems/linecook].
|
92
111
|
|
93
112
|
% gem install linecook
|
94
113
|
|
95
114
|
== Info
|
96
115
|
|
97
|
-
Developer:: {Simon Chiang}[http://
|
116
|
+
Developer:: {Simon Chiang}[http://github.com/thinkerbot]
|
98
117
|
License:: {MIT-Style}[link:files/License_txt.html]
|
data/bin/linecook
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
if File.exists?('Gemfile')
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler'
|
6
|
+
Bundler.setup
|
7
|
+
end
|
8
|
+
|
3
9
|
require 'linecook/version'
|
4
10
|
require 'linecook/commands'
|
5
11
|
registry = Linecook::Commands::Command.registry
|
@@ -24,7 +30,7 @@ if cmd_class.nil?
|
|
24
30
|
|
25
31
|
exit
|
26
32
|
when '-v', '--version'
|
27
|
-
puts "version #{Linecook::VERSION} -- #{Linecook::WEBSITE}"
|
33
|
+
puts "linecook version #{Linecook::VERSION} -- #{Linecook::WEBSITE}"
|
28
34
|
exit
|
29
35
|
else
|
30
36
|
puts "unknown command: #{cmd.inspect}"
|
@@ -37,10 +43,10 @@ parser.add cmd_class.configurations
|
|
37
43
|
parser.on '-h', '--help', 'print this help' do
|
38
44
|
puts "usage: linecook [options] #{cmd} #{cmd_class.args}"
|
39
45
|
|
40
|
-
desc = cmd_class.desc.wrap
|
46
|
+
desc = cmd_class.desc.wrap(76, 2, "\n ")
|
41
47
|
unless desc.empty?
|
42
48
|
puts
|
43
|
-
puts
|
49
|
+
puts " #{desc}"
|
44
50
|
puts
|
45
51
|
end
|
46
52
|
|
@@ -53,6 +59,7 @@ parser.parse! ARGV
|
|
53
59
|
begin
|
54
60
|
cmd_class.new(parser.config).call ARGV
|
55
61
|
rescue Linecook::Commands::CommandError
|
56
|
-
puts $!.message
|
57
|
-
|
62
|
+
puts $!.message unless $!.message.strip.empty?
|
63
|
+
puts $!.backtrace if $DEBUG
|
64
|
+
exit $!.exitstatus
|
58
65
|
end
|
data/bin/linecook_run
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
############################################################################
|
3
|
+
|
4
|
+
ssh_config_file=${SSH_CONFIG_FILE:-config/ssh}
|
5
|
+
remote_dir=${REMOTE_DIR:-$(pwd)/linecook}
|
6
|
+
remote_script=${REMOTE_SCRIPT:-run}
|
7
|
+
|
8
|
+
usage="usage: %s [-F SSH_CONFIG_FILE] [-D REMOTE_DIR] [-S REMOTE_SCRIPT] [-h] PACKAGE_DIRS...\n"
|
9
|
+
option=" %s %s\n"
|
10
|
+
while getopts "F:D:S:h" opt
|
11
|
+
do
|
12
|
+
case $opt in
|
13
|
+
F ) ssh_config_file=$OPTARG ;;
|
14
|
+
D ) remote_dir=$OPTARG ;;
|
15
|
+
S ) remote_script=$OPTARG ;;
|
16
|
+
h ) printf "$usage" $0
|
17
|
+
printf "$option" "-F" "the ssh config file"
|
18
|
+
printf "$option" "-D" "the remote package dir"
|
19
|
+
printf "$option" "-S" "the remote script"
|
20
|
+
printf "$option" "-h" "prints this help"
|
21
|
+
exit 0 ;;
|
22
|
+
\? ) printf "$usage" $0
|
23
|
+
exit 2 ;;
|
24
|
+
esac
|
25
|
+
done
|
26
|
+
shift $(($OPTIND - 1))
|
27
|
+
|
28
|
+
################################### run ####################################
|
29
|
+
|
30
|
+
for package_dir in "$@"
|
31
|
+
do
|
32
|
+
host=$(basename -- "$package_dir")
|
33
|
+
|
34
|
+
ssh -q -t -t -F "$ssh_config_file" "$host" -- "$remote_dir/$remote_script" 2>/dev/null </dev/null
|
35
|
+
|
36
|
+
status=$?
|
37
|
+
if [ $status -ne 0 ]
|
38
|
+
then
|
39
|
+
echo "[$status] $remote_dir/$remote_script" >&2
|
40
|
+
exit 1
|
41
|
+
fi
|
42
|
+
|
43
|
+
done
|
44
|
+
|
45
|
+
################################## (run) ###################################
|
data/bin/linecook_scp
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
############################################################################
|
3
|
+
|
4
|
+
ssh_config_file=${SSH_CONFIG_FILE:-config/ssh}
|
5
|
+
remote_dir=${REMOTE_DIR:-\$(pwd)/linecook}
|
6
|
+
|
7
|
+
usage="usage: %s [-D REMOTE_DIR] [-F SSH_CONFIG_FILE] [-h] PACKAGE_DIRS...\n"
|
8
|
+
option=" %s %s\n"
|
9
|
+
while getopts "F:D:h" opt
|
10
|
+
do
|
11
|
+
case $opt in
|
12
|
+
F ) ssh_config_file=$OPTARG ;;
|
13
|
+
D ) remote_dir=$OPTARG ;;
|
14
|
+
h ) printf "$usage" $0
|
15
|
+
printf "$option" "-F" "the ssh config file"
|
16
|
+
printf "$option" "-D" "the remote package dir"
|
17
|
+
printf "$option" "-h" "prints this help"
|
18
|
+
exit 0 ;;
|
19
|
+
\? ) printf "$usage" $0
|
20
|
+
exit 2 ;;
|
21
|
+
esac
|
22
|
+
done
|
23
|
+
shift $(($OPTIND - 1))
|
24
|
+
|
25
|
+
################################### scp ####################################
|
26
|
+
|
27
|
+
for package_dir in "$@"
|
28
|
+
do
|
29
|
+
host=$(basename -- "$package_dir")
|
30
|
+
|
31
|
+
ssh -q -T -F "$ssh_config_file" "$host" -- <<SCRIPT
|
32
|
+
rm -rf "$remote_dir"
|
33
|
+
if [ "\$(dirname "$remote_dir")" != "" ]
|
34
|
+
then
|
35
|
+
mkdir -p "\$(dirname "$remote_dir")"
|
36
|
+
fi
|
37
|
+
SCRIPT
|
38
|
+
|
39
|
+
scp -q -r -p -F "$ssh_config_file" "$package_dir" "$host:$remote_dir"
|
40
|
+
|
41
|
+
status=$?
|
42
|
+
if [ $status -ne 0 ]
|
43
|
+
then
|
44
|
+
echo "[$status] $remote_dir/$script_name " >&2
|
45
|
+
exit 1
|
46
|
+
fi
|
47
|
+
done
|
48
|
+
|
49
|
+
################################## (scp) ###################################
|
50
|
+
|