phper 0.0.0 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +6 -0
- data/Gemfile.lock +17 -0
- data/README.md +64 -0
- data/VERSION +1 -1
- data/bin/phper +86 -0
- data/lib/phper.rb +48 -0
- data/lib/phper/agent.rb +142 -0
- data/lib/phper/cli.rb +14 -0
- data/lib/phper/commands.rb +326 -0
- data/phper.gemspec +86 -0
- metadata +105 -13
- data/README.rdoc +0 -19
data/Gemfile
CHANGED
@@ -2,6 +2,12 @@ source "http://rubygems.org"
|
|
2
2
|
# Add dependencies required to use your gem here.
|
3
3
|
# Example:
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
5
|
+
gem "rest-client"
|
6
|
+
gem 'keystorage', '> 0.1'
|
7
|
+
gem 'highline', '> 1.6'
|
8
|
+
gem 'command-line-utils' , '>= 0.0.1'
|
9
|
+
gem 'launchy'
|
10
|
+
gem 'json'
|
5
11
|
|
6
12
|
# Add dependencies to develop your gem here.
|
7
13
|
# Include everything needed to run rake, tests, features, etc.
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,24 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
command-line-utils (0.0.2)
|
5
|
+
configuration (1.2.0)
|
4
6
|
git (1.2.5)
|
7
|
+
highline (1.6.1)
|
5
8
|
jeweler (1.5.2)
|
6
9
|
bundler (~> 1.0.0)
|
7
10
|
git (>= 1.2.5)
|
8
11
|
rake
|
12
|
+
json (1.5.1)
|
13
|
+
keystorage (0.4.3)
|
14
|
+
launchy (0.3.7)
|
15
|
+
configuration (>= 0.0.5)
|
16
|
+
rake (>= 0.8.1)
|
17
|
+
mime-types (1.16)
|
9
18
|
rake (0.8.7)
|
10
19
|
rcov (0.9.9)
|
20
|
+
rest-client (1.6.1)
|
21
|
+
mime-types (>= 1.16)
|
11
22
|
shoulda (2.11.3)
|
12
23
|
|
13
24
|
PLATFORMS
|
@@ -15,6 +26,12 @@ PLATFORMS
|
|
15
26
|
|
16
27
|
DEPENDENCIES
|
17
28
|
bundler (~> 1.0.0)
|
29
|
+
command-line-utils (>= 0.0.1)
|
30
|
+
highline (> 1.6)
|
18
31
|
jeweler (~> 1.5.2)
|
32
|
+
json
|
33
|
+
keystorage (> 0.1)
|
34
|
+
launchy
|
19
35
|
rcov
|
36
|
+
rest-client
|
20
37
|
shoulda
|
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
phper
|
2
|
+
=====
|
3
|
+
|
4
|
+
A CLI utility for PHPer.jp.
|
5
|
+
|
6
|
+
PHPer.jp is a Platform As a Service of PHP.
|
7
|
+
|
8
|
+
Requirements
|
9
|
+
------------
|
10
|
+
|
11
|
+
* Ruby 1.8.7 or later
|
12
|
+
* git
|
13
|
+
|
14
|
+
|
15
|
+
Install
|
16
|
+
-------
|
17
|
+
|
18
|
+
`gem install phper`
|
19
|
+
|
20
|
+
|
21
|
+
Usage
|
22
|
+
-----
|
23
|
+
|
24
|
+
### Usage: phper [options]
|
25
|
+
--version show version
|
26
|
+
--help show this message
|
27
|
+
--debug debug mode
|
28
|
+
|
29
|
+
### Commands:
|
30
|
+
|
31
|
+
* help
|
32
|
+
* login
|
33
|
+
* logout
|
34
|
+
* list
|
35
|
+
* create
|
36
|
+
* destroy
|
37
|
+
* info
|
38
|
+
* keys
|
39
|
+
* keys:add
|
40
|
+
* keys:remove
|
41
|
+
* keys:clear
|
42
|
+
* servers
|
43
|
+
* servers:add
|
44
|
+
* servers:remove
|
45
|
+
* open
|
46
|
+
* mysql:init
|
47
|
+
* deploy
|
48
|
+
|
49
|
+
Contributing to phper
|
50
|
+
---------------------
|
51
|
+
|
52
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
53
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
54
|
+
* Fork the project
|
55
|
+
* Start a feature/bugfix branch
|
56
|
+
* Commit and push until you are happy with your contribution
|
57
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
58
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
59
|
+
|
60
|
+
Copyright
|
61
|
+
---------
|
62
|
+
|
63
|
+
Copyright (c) 2011 Yoshihiro TAKAHARA. See LICENSE.txt for further details.
|
64
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.3
|
data/bin/phper
CHANGED
@@ -1,2 +1,88 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__),'..','lib'))
|
4
|
+
require 'phper'
|
5
|
+
Phper::CLI::run(ARGV)
|
6
|
+
exit
|
2
7
|
|
8
|
+
|
9
|
+
def urlroot
|
10
|
+
"http://tumf:hogehoge@localhost:3000"
|
11
|
+
end
|
12
|
+
|
13
|
+
def url res
|
14
|
+
format = "json"
|
15
|
+
urlroot + res + "." + format
|
16
|
+
end
|
17
|
+
|
18
|
+
# RestClient.get(url("/projects"))
|
19
|
+
# puts RestClient.post url("/projects"),:project => {:name => "fuga6"}
|
20
|
+
# puts RestClient.delete url("/projects/tumf-fuga6")
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
=begin
|
28
|
+
|
29
|
+
phper register
|
30
|
+
|
31
|
+
$ phper login [<username>]
|
32
|
+
|
33
|
+
$ phper logout
|
34
|
+
|
35
|
+
$ phper keys
|
36
|
+
$ phper keys:add <file>
|
37
|
+
$ phper keys:remove <name>
|
38
|
+
$ phper keys:clear
|
39
|
+
|
40
|
+
== git リポジトリを作る
|
41
|
+
|
42
|
+
$ phper create <project>
|
43
|
+
--> gitosis@git.phper.jp:<user>/<project>.git
|
44
|
+
|
45
|
+
== coding
|
46
|
+
|
47
|
+
$ git clone gitosis@git.phper.jp:tumf/<project>.git
|
48
|
+
|
49
|
+
== deploy
|
50
|
+
|
51
|
+
$ git push phper master
|
52
|
+
|
53
|
+
* hostが未割り当てならhostを割り当て
|
54
|
+
* hostにデプロイ
|
55
|
+
--> /var/phper/project
|
56
|
+
--> cap
|
57
|
+
|
58
|
+
== server
|
59
|
+
|
60
|
+
$ phper server [<docroot>] [--port=<port>] []
|
61
|
+
|
62
|
+
|
63
|
+
* <docroot>をドキュメントルートにしてサーバを構築
|
64
|
+
--> /var/phper/project/<docroot>
|
65
|
+
|
66
|
+
$ phper server [<docroot>] [--name=<fqdn>]
|
67
|
+
|
68
|
+
* proxyの`/etc/hosts`を更新
|
69
|
+
* proxyのnginx設定を更新
|
70
|
+
* Apache VirtualHostを設定
|
71
|
+
* nameが指定されていなかったら適当に決められる
|
72
|
+
|
73
|
+
== サーバの設定
|
74
|
+
|
75
|
+
$ phper server:config
|
76
|
+
$ phper server:config:add
|
77
|
+
$ phper server:config:clear
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
== メンテナンス
|
82
|
+
|
83
|
+
$ phper server:maintenance <on|off>
|
84
|
+
|
85
|
+
$ phper server:stop
|
86
|
+
$ phper server:start
|
87
|
+
$ phper server:restart
|
88
|
+
=end
|
data/lib/phper.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module Phper
|
3
|
+
def name_of_key key
|
4
|
+
if key =~ / (\S+)$/
|
5
|
+
return $1
|
6
|
+
end
|
7
|
+
return nil
|
8
|
+
end
|
9
|
+
|
10
|
+
# git remoteの結果からプロジェクトを推測する
|
11
|
+
def git_remote(base_dir)
|
12
|
+
%x{git remote -v 2> /dev/null }.each_line{ |line|
|
13
|
+
if line =~ /\sgitosis@git\.phper\.jp:(.+)\/(.+)\.git\s/
|
14
|
+
return [$1,$2].join("-")
|
15
|
+
end
|
16
|
+
}
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def git_remotes(git)
|
21
|
+
# %x{git remote add phper #{project["project"]["git"]}}
|
22
|
+
r = []
|
23
|
+
%x{git remote -v 2> /dev/null }.each_line{ |line|
|
24
|
+
if line.include?(git)
|
25
|
+
r << $1 if line =~ /^(\S+)/
|
26
|
+
end
|
27
|
+
}
|
28
|
+
r.uniq
|
29
|
+
end
|
30
|
+
|
31
|
+
def in_git?
|
32
|
+
%x{git status 2>/dev/null }
|
33
|
+
$?.to_i == 0
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
require "rubygems"
|
38
|
+
require "json"
|
39
|
+
require "highline/import"
|
40
|
+
require "keystorage"
|
41
|
+
require 'rest-client'
|
42
|
+
require 'highline'
|
43
|
+
require 'launchy'
|
44
|
+
require 'command-line-utils'
|
45
|
+
require 'phper/commands'
|
46
|
+
require 'phper/cli'
|
47
|
+
require 'phper/agent'
|
48
|
+
|
data/lib/phper/agent.rb
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
require 'phper'
|
4
|
+
class Phper::Agent
|
5
|
+
include Phper
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@login = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def log dest
|
12
|
+
RestClient.log = dest
|
13
|
+
end
|
14
|
+
|
15
|
+
def login(u,p)
|
16
|
+
@auth = {:user => u, :password => p}
|
17
|
+
begin
|
18
|
+
projects
|
19
|
+
@login = true
|
20
|
+
rescue => e
|
21
|
+
puts e
|
22
|
+
@login = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def login?
|
27
|
+
@login
|
28
|
+
end
|
29
|
+
|
30
|
+
def projects id = nil
|
31
|
+
if id
|
32
|
+
get("/projects/%s" % id)
|
33
|
+
else
|
34
|
+
get("/projects")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def projects_create name
|
39
|
+
param = {}
|
40
|
+
param[:name] = name if name
|
41
|
+
post("/projects",{:project => param})
|
42
|
+
end
|
43
|
+
|
44
|
+
def projects_delete name
|
45
|
+
delete("/projects/#{name}")
|
46
|
+
end
|
47
|
+
|
48
|
+
def keys
|
49
|
+
get("/keys")
|
50
|
+
end
|
51
|
+
|
52
|
+
def keys_create key
|
53
|
+
param = {}
|
54
|
+
param[:public_key] = key if key
|
55
|
+
post("/keys",{:key => param})
|
56
|
+
end
|
57
|
+
|
58
|
+
def keys_delete name
|
59
|
+
count = 0
|
60
|
+
keys.each { |key|
|
61
|
+
if name == name_of_key(key["key"]["public_key"])
|
62
|
+
delete("/keys/%i" % key["key"]["id"])
|
63
|
+
count += 1
|
64
|
+
end
|
65
|
+
}
|
66
|
+
count
|
67
|
+
end
|
68
|
+
|
69
|
+
def keys_delete_all
|
70
|
+
count = 0
|
71
|
+
keys.each { |key|
|
72
|
+
delete("/keys/%i" % key["key"]["id"])
|
73
|
+
count += 1
|
74
|
+
}
|
75
|
+
count
|
76
|
+
end
|
77
|
+
|
78
|
+
def servers project
|
79
|
+
get("/projects/%s/servers" % project)
|
80
|
+
end
|
81
|
+
|
82
|
+
def servers_create project,param
|
83
|
+
defaults = get("/projects/%s/servers/new" % project)["server"]
|
84
|
+
param[:name] = defaults["name"] unless param.has_key?(:name)
|
85
|
+
param[:fqdn] = defaults["fqdn"] unless param.has_key?(:fqdn)
|
86
|
+
post("/projects/%s/servers" % project ,{:server => param})
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def servers_delete project,name
|
91
|
+
count = 0;
|
92
|
+
servers(project).each { |s|
|
93
|
+
if s["server"]["fqdn"] == name or s["server"]["name"] == name
|
94
|
+
delete("/projects/%s/servers/%s"%[project,s["server"]["id"]])
|
95
|
+
count += 1
|
96
|
+
end
|
97
|
+
}
|
98
|
+
count
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
def post(url,data = {},format=:json)
|
107
|
+
call(:post,url,data,format)
|
108
|
+
end
|
109
|
+
|
110
|
+
def get(url,data = {},format=:json)
|
111
|
+
call(:get,url,data,format)
|
112
|
+
end
|
113
|
+
|
114
|
+
def put(url,data = {},format=:json)
|
115
|
+
call(:put,url,data,format)
|
116
|
+
end
|
117
|
+
|
118
|
+
def delete(url,data = {},format=:json)
|
119
|
+
call(:delete,url,data,format)
|
120
|
+
end
|
121
|
+
|
122
|
+
def base_url
|
123
|
+
ENV["PHPERJP_URL"] || "https://phper.jp"
|
124
|
+
end
|
125
|
+
|
126
|
+
protected
|
127
|
+
def call(method,url,data,format)
|
128
|
+
url = "%s%s.%s" % [base_url,url,format.to_s]
|
129
|
+
resource = RestClient::Resource.new(url,:user => @auth[:user], :password => @auth[:password])
|
130
|
+
parse(resource.send(method.to_s,data),format)
|
131
|
+
end
|
132
|
+
|
133
|
+
def parse(data,format)
|
134
|
+
return "" if data.length == 0
|
135
|
+
if format == :json
|
136
|
+
data = "{}" if data.length < 2
|
137
|
+
return JSON.parse(data)
|
138
|
+
end
|
139
|
+
raise format + "is not support formats."
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
data/lib/phper/cli.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
require 'phper'
|
4
|
+
class Phper::CLI < CommandLineUtils::CLI
|
5
|
+
include Phper
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
@commands = Commands.new
|
9
|
+
yield self if block_given?
|
10
|
+
end
|
11
|
+
def dispatch(cmd,cmd_argv)
|
12
|
+
@commands.send(cmd.sub(/:/,"_"))
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,326 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
require 'phper'
|
4
|
+
|
5
|
+
class Phper::Commands < CommandLineUtils::Commands
|
6
|
+
include Phper
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
@commands += ["login","logout","list","create","destroy","info"]
|
10
|
+
@commands += ["keys","keys:add","keys:remove","keys:clear"]
|
11
|
+
@commands += ["servers","servers:add","servers:remove"]
|
12
|
+
@commands += ["open","mysql:init","deploy"]
|
13
|
+
|
14
|
+
@agent = Agent.new
|
15
|
+
# @cache_file = homedir + "/.phper.cache"
|
16
|
+
# @cache = Cache.new(@cache_file)
|
17
|
+
yield self if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def homedir
|
21
|
+
ENV['HOME']
|
22
|
+
end
|
23
|
+
|
24
|
+
def login
|
25
|
+
opt = OptionParser.new
|
26
|
+
opt.parse!(@command_options)
|
27
|
+
@summery = "Login to phper.jp."
|
28
|
+
@banner = ""
|
29
|
+
return opt if @help
|
30
|
+
|
31
|
+
user = ask('Enter user: ') do |q|
|
32
|
+
q.validate = /\w+/
|
33
|
+
end
|
34
|
+
|
35
|
+
ok = false
|
36
|
+
while(!ok)
|
37
|
+
password = ask("Enter your password: ") do |q|
|
38
|
+
q.validate = /\w+/
|
39
|
+
q.echo = false
|
40
|
+
end
|
41
|
+
|
42
|
+
@agent.login(user,password)
|
43
|
+
if @agent.login? # => OK
|
44
|
+
ok = true
|
45
|
+
Keystorage.set("phper.jp",user,password)
|
46
|
+
puts "login OK"
|
47
|
+
else
|
48
|
+
puts "password mismatch"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def logout
|
54
|
+
opt = OptionParser.new
|
55
|
+
opt.parse!(@command_options)
|
56
|
+
@summery = "Logout from phper.jp ."
|
57
|
+
@banner = ""
|
58
|
+
return opt if @help
|
59
|
+
Keystorage.delete("phper.jp")
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def list
|
64
|
+
opt = OptionParser.new
|
65
|
+
opt.parse!(@command_options)
|
66
|
+
@summery = "get project list"
|
67
|
+
@banner = ""
|
68
|
+
return opt if @help
|
69
|
+
|
70
|
+
start
|
71
|
+
@agent.projects.each { |pj|
|
72
|
+
puts pj["project"]["id"]
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def create
|
77
|
+
OptionParser.new { |opt|
|
78
|
+
opt.parse!(@command_options)
|
79
|
+
@summery = "craete project"
|
80
|
+
@banner = "[<name>]"
|
81
|
+
return opt if @help
|
82
|
+
}
|
83
|
+
name = @command_options.shift
|
84
|
+
|
85
|
+
start
|
86
|
+
project = @agent.projects_create name
|
87
|
+
|
88
|
+
puts "Created %s" % project["project"]["id"]
|
89
|
+
puts "--> %s" % project["project"]["git"]
|
90
|
+
puts "--> mysql://%s:%s@%s/%s" % [project["project"]["dbuser"],
|
91
|
+
project["project"]["dbpassword"],
|
92
|
+
project["project"]["dbhost"],
|
93
|
+
project["project"]["dbname"]]
|
94
|
+
# if here
|
95
|
+
if in_git? and project["project"]["id"] != git_remote(Dir.pwd)
|
96
|
+
%x{git remote add phper #{project["project"]["git"]}}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def destroy
|
101
|
+
project = nil
|
102
|
+
yes = false
|
103
|
+
OptionParser.new { |opt|
|
104
|
+
opt.on('-y','--yes', 'answer yes for all questions') { |v|
|
105
|
+
yes = true
|
106
|
+
}
|
107
|
+
project = extract_project(opt)
|
108
|
+
@summery = "destroy project"
|
109
|
+
return opt if @help
|
110
|
+
}
|
111
|
+
raise "project is not specified." unless project
|
112
|
+
yes = true if yes or ask("Destroy #{project}? ",["yes","no"]) == "yes"
|
113
|
+
if yes
|
114
|
+
start
|
115
|
+
@agent.projects_delete project
|
116
|
+
puts "Destroyed #{project}"
|
117
|
+
# if here
|
118
|
+
if in_git? and project["project"]["id"] == git_remote(Dir.pwd)
|
119
|
+
git_remotes(project["project"]["git"]){ |name|
|
120
|
+
cmd = "git remote rm #{name}"
|
121
|
+
%x{#{cmd}}
|
122
|
+
puts cmd
|
123
|
+
}
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def keys
|
129
|
+
OptionParser.new { |opt|
|
130
|
+
opt.parse!(@command_options)
|
131
|
+
@summery = "list keys"
|
132
|
+
@banner = ""
|
133
|
+
return opt if @help
|
134
|
+
}
|
135
|
+
start
|
136
|
+
@agent.keys.each { |key|
|
137
|
+
name = name_of_key(key["key"]["public_key"])
|
138
|
+
puts name if name
|
139
|
+
}
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
def keys_add
|
144
|
+
OptionParser.new { |opt|
|
145
|
+
opt.parse!(@command_options)
|
146
|
+
@summery = "add keys"
|
147
|
+
@banner = "<public key file>"
|
148
|
+
return opt if @help
|
149
|
+
}
|
150
|
+
file = @command_options.shift
|
151
|
+
raise "file is not specified." unless file
|
152
|
+
key = ""
|
153
|
+
File.open(file) { |f|
|
154
|
+
key = f.read
|
155
|
+
}
|
156
|
+
name = name_of_key(key)
|
157
|
+
raise "invalid key" unless name
|
158
|
+
start
|
159
|
+
@agent.keys_create(key)
|
160
|
+
puts "key of %s added" % name
|
161
|
+
end
|
162
|
+
|
163
|
+
def keys_remove
|
164
|
+
OptionParser.new { |opt|
|
165
|
+
opt.parse!(@command_options)
|
166
|
+
@summery = "remove key"
|
167
|
+
@banner = "<user@host>"
|
168
|
+
return opt if @help
|
169
|
+
}
|
170
|
+
name = @command_options.shift
|
171
|
+
raise "key name is not specified." unless name
|
172
|
+
start
|
173
|
+
count = @agent.keys_delete(name)
|
174
|
+
puts "%i key(s) named %s removed" % [count,name]
|
175
|
+
end
|
176
|
+
|
177
|
+
def keys_clear
|
178
|
+
OptionParser.new { |opt|
|
179
|
+
opt.parse!(@command_options)
|
180
|
+
@summery = "remove all keys"
|
181
|
+
@banner = ""
|
182
|
+
return opt if @help
|
183
|
+
}
|
184
|
+
start
|
185
|
+
count = @agent.keys_delete_all
|
186
|
+
puts "%i key(s) removed" % [count]
|
187
|
+
end
|
188
|
+
|
189
|
+
def extract_project opt
|
190
|
+
@banner = [@banner,"[--project=<project>]"].join(" ")
|
191
|
+
project = nil
|
192
|
+
opt.on('--project=PROJECT', 'project') { |v|
|
193
|
+
project = full_project_name(v)
|
194
|
+
}
|
195
|
+
opt.parse!(@command_options)
|
196
|
+
return project if project
|
197
|
+
git_remote(Dir.pwd)
|
198
|
+
end
|
199
|
+
|
200
|
+
def servers
|
201
|
+
project = nil
|
202
|
+
OptionParser.new { |opt|
|
203
|
+
project = extract_project(opt)
|
204
|
+
@summery = "list servers"
|
205
|
+
return opt if @help
|
206
|
+
}
|
207
|
+
raise "project is not specified." unless project
|
208
|
+
start
|
209
|
+
@agent.servers(project).each { |server|
|
210
|
+
puts "%s\thttp://%s" % [server["server"]["name"],server["server"]["fqdn"]]
|
211
|
+
}
|
212
|
+
end
|
213
|
+
|
214
|
+
def servers_add
|
215
|
+
param = {}
|
216
|
+
project = nil
|
217
|
+
name = nil
|
218
|
+
OptionParser.new { |opt|
|
219
|
+
opt.on('--name=NAME', 'Name of this server') { |v|
|
220
|
+
param[:name] = v
|
221
|
+
}
|
222
|
+
opt.on('--root=ROOT', 'Document Root') { |v|
|
223
|
+
param[:root] = v
|
224
|
+
}
|
225
|
+
project = extract_project(opt)
|
226
|
+
@banner = "[<host>]"
|
227
|
+
@summery = "add server"
|
228
|
+
return opt if @help
|
229
|
+
}
|
230
|
+
raise "project is not specified." unless project
|
231
|
+
host = @command_options.shift
|
232
|
+
if host
|
233
|
+
param[:fqdn] = host
|
234
|
+
param[:name] = host unless param.has_key?(:name)
|
235
|
+
end
|
236
|
+
|
237
|
+
start
|
238
|
+
server = @agent.servers_create(project,param)["server"]
|
239
|
+
puts "Created %s" % server["name"]
|
240
|
+
puts "--> http://%s" % server["fqdn"]
|
241
|
+
end
|
242
|
+
|
243
|
+
def servers_remove
|
244
|
+
param = {}
|
245
|
+
project = nil
|
246
|
+
name = nil
|
247
|
+
OptionParser.new { |opt|
|
248
|
+
project = extract_project(opt)
|
249
|
+
@banner = "[<host or name>]"
|
250
|
+
@summery = "remove server"
|
251
|
+
return opt if @help
|
252
|
+
}
|
253
|
+
raise "project is not specified." unless project
|
254
|
+
name = @command_options.shift
|
255
|
+
|
256
|
+
start
|
257
|
+
count = @agent.servers_delete(project,name)
|
258
|
+
puts "%i server(s) named %s removed" % [count,name]
|
259
|
+
end
|
260
|
+
|
261
|
+
def servers_clear
|
262
|
+
OptionParser.new { |opt|
|
263
|
+
project = extract_project(opt)
|
264
|
+
@summery = "remove all servers"
|
265
|
+
return opt if @help
|
266
|
+
}
|
267
|
+
raise "project is not specified." unless project
|
268
|
+
|
269
|
+
end
|
270
|
+
|
271
|
+
def open
|
272
|
+
project = nil
|
273
|
+
OptionParser.new { |opt|
|
274
|
+
project = extract_project(opt)
|
275
|
+
@banner = "[<host or name pattern>]"
|
276
|
+
@summery = "Open URL"
|
277
|
+
return opt if @help
|
278
|
+
}
|
279
|
+
raise "project is not specified." unless project
|
280
|
+
start
|
281
|
+
servers = @agent.servers(project)
|
282
|
+
raise "project #{project} has no servers." if servers.length == 0
|
283
|
+
name = @command_options.shift
|
284
|
+
|
285
|
+
server = nil
|
286
|
+
if name
|
287
|
+
server = servers.find { |s|
|
288
|
+
s["server"]["name"] =~ /^#{name}/ or s["server"]["fqdn"] =~ /^#{name}/
|
289
|
+
}
|
290
|
+
end
|
291
|
+
server = servers.shift unless server
|
292
|
+
url = "http://#{server["server"]["fqdn"]}"
|
293
|
+
puts "Opening #{url}"
|
294
|
+
Launchy.open url
|
295
|
+
end
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
|
302
|
+
private
|
303
|
+
|
304
|
+
def user
|
305
|
+
Keystorage.list("phper.jp").shift
|
306
|
+
end
|
307
|
+
|
308
|
+
def password
|
309
|
+
Keystorage.get("phper.jp",user)
|
310
|
+
end
|
311
|
+
|
312
|
+
def full_project_name(v)
|
313
|
+
return v if v =~ /\-/
|
314
|
+
[user,v].join("-")
|
315
|
+
end
|
316
|
+
|
317
|
+
def start
|
318
|
+
@agent.log(STDERR) if @options[:debug]
|
319
|
+
return true if @agent.login?
|
320
|
+
login unless user
|
321
|
+
if user
|
322
|
+
@agent.login(user,password)
|
323
|
+
login unless @agent.login?
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
data/phper.gemspec
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{phper}
|
8
|
+
s.version = "0.2.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Yoshihiro TAKAHARA"]
|
12
|
+
s.date = %q{2011-02-21}
|
13
|
+
s.default_executable = %q{phper}
|
14
|
+
s.description = %q{phper}
|
15
|
+
s.email = %q{y.takahara@gmail.com}
|
16
|
+
s.executables = ["phper"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.md",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/phper",
|
29
|
+
"lib/phper.rb",
|
30
|
+
"lib/phper/agent.rb",
|
31
|
+
"lib/phper/cli.rb",
|
32
|
+
"lib/phper/commands.rb",
|
33
|
+
"phper.gemspec",
|
34
|
+
"test/helper.rb",
|
35
|
+
"test/test_phper.rb"
|
36
|
+
]
|
37
|
+
s.homepage = %q{http://github.com/tumf/phper}
|
38
|
+
s.licenses = ["MIT"]
|
39
|
+
s.require_paths = ["lib"]
|
40
|
+
s.rubygems_version = %q{1.5.0}
|
41
|
+
s.summary = %q{phper}
|
42
|
+
s.test_files = [
|
43
|
+
"test/helper.rb",
|
44
|
+
"test/test_phper.rb"
|
45
|
+
]
|
46
|
+
|
47
|
+
if s.respond_to? :specification_version then
|
48
|
+
s.specification_version = 3
|
49
|
+
|
50
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_runtime_dependency(%q<rest-client>, [">= 0"])
|
52
|
+
s.add_runtime_dependency(%q<keystorage>, ["> 0.1"])
|
53
|
+
s.add_runtime_dependency(%q<highline>, ["> 1.6"])
|
54
|
+
s.add_runtime_dependency(%q<command-line-utils>, [">= 0.0.1"])
|
55
|
+
s.add_runtime_dependency(%q<launchy>, [">= 0"])
|
56
|
+
s.add_runtime_dependency(%q<json>, [">= 0"])
|
57
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
59
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
60
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
61
|
+
else
|
62
|
+
s.add_dependency(%q<rest-client>, [">= 0"])
|
63
|
+
s.add_dependency(%q<keystorage>, ["> 0.1"])
|
64
|
+
s.add_dependency(%q<highline>, ["> 1.6"])
|
65
|
+
s.add_dependency(%q<command-line-utils>, [">= 0.0.1"])
|
66
|
+
s.add_dependency(%q<launchy>, [">= 0"])
|
67
|
+
s.add_dependency(%q<json>, [">= 0"])
|
68
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
69
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
70
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
71
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
72
|
+
end
|
73
|
+
else
|
74
|
+
s.add_dependency(%q<rest-client>, [">= 0"])
|
75
|
+
s.add_dependency(%q<keystorage>, ["> 0.1"])
|
76
|
+
s.add_dependency(%q<highline>, ["> 1.6"])
|
77
|
+
s.add_dependency(%q<command-line-utils>, [">= 0.0.1"])
|
78
|
+
s.add_dependency(%q<launchy>, [">= 0"])
|
79
|
+
s.add_dependency(%q<json>, [">= 0"])
|
80
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
81
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
82
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
83
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Yoshihiro TAKAHARA
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-21 00:00:00 +09:00
|
19
19
|
default_executable: phper
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -29,11 +29,99 @@ dependencies:
|
|
29
29
|
- 0
|
30
30
|
version: "0"
|
31
31
|
version_requirements: *id001
|
32
|
+
name: rest-client
|
33
|
+
prerelease: false
|
34
|
+
type: :runtime
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
hash: 9
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
- 1
|
45
|
+
version: "0.1"
|
46
|
+
version_requirements: *id002
|
47
|
+
name: keystorage
|
48
|
+
prerelease: false
|
49
|
+
type: :runtime
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 1
|
59
|
+
- 6
|
60
|
+
version: "1.6"
|
61
|
+
version_requirements: *id003
|
62
|
+
name: highline
|
63
|
+
prerelease: false
|
64
|
+
type: :runtime
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 29
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
- 0
|
75
|
+
- 1
|
76
|
+
version: 0.0.1
|
77
|
+
version_requirements: *id004
|
78
|
+
name: command-line-utils
|
79
|
+
prerelease: false
|
80
|
+
type: :runtime
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
version_requirements: *id005
|
92
|
+
name: launchy
|
93
|
+
prerelease: false
|
94
|
+
type: :runtime
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
version_requirements: *id006
|
106
|
+
name: json
|
107
|
+
prerelease: false
|
108
|
+
type: :runtime
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
version_requirements: *id007
|
32
120
|
name: shoulda
|
33
121
|
prerelease: false
|
34
122
|
type: :development
|
35
123
|
- !ruby/object:Gem::Dependency
|
36
|
-
requirement: &
|
124
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
37
125
|
none: false
|
38
126
|
requirements:
|
39
127
|
- - ~>
|
@@ -44,12 +132,12 @@ dependencies:
|
|
44
132
|
- 0
|
45
133
|
- 0
|
46
134
|
version: 1.0.0
|
47
|
-
version_requirements: *
|
135
|
+
version_requirements: *id008
|
48
136
|
name: bundler
|
49
137
|
prerelease: false
|
50
138
|
type: :development
|
51
139
|
- !ruby/object:Gem::Dependency
|
52
|
-
requirement: &
|
140
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
53
141
|
none: false
|
54
142
|
requirements:
|
55
143
|
- - ~>
|
@@ -60,12 +148,12 @@ dependencies:
|
|
60
148
|
- 5
|
61
149
|
- 2
|
62
150
|
version: 1.5.2
|
63
|
-
version_requirements: *
|
151
|
+
version_requirements: *id009
|
64
152
|
name: jeweler
|
65
153
|
prerelease: false
|
66
154
|
type: :development
|
67
155
|
- !ruby/object:Gem::Dependency
|
68
|
-
requirement: &
|
156
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
69
157
|
none: false
|
70
158
|
requirements:
|
71
159
|
- - ">="
|
@@ -74,7 +162,7 @@ dependencies:
|
|
74
162
|
segments:
|
75
163
|
- 0
|
76
164
|
version: "0"
|
77
|
-
version_requirements: *
|
165
|
+
version_requirements: *id010
|
78
166
|
name: rcov
|
79
167
|
prerelease: false
|
80
168
|
type: :development
|
@@ -86,16 +174,20 @@ extensions: []
|
|
86
174
|
|
87
175
|
extra_rdoc_files:
|
88
176
|
- LICENSE.txt
|
89
|
-
- README.
|
177
|
+
- README.md
|
90
178
|
files:
|
91
179
|
- Gemfile
|
92
180
|
- Gemfile.lock
|
93
181
|
- LICENSE.txt
|
94
|
-
- README.
|
182
|
+
- README.md
|
95
183
|
- Rakefile
|
96
184
|
- VERSION
|
97
185
|
- bin/phper
|
98
186
|
- lib/phper.rb
|
187
|
+
- lib/phper/agent.rb
|
188
|
+
- lib/phper/cli.rb
|
189
|
+
- lib/phper/commands.rb
|
190
|
+
- phper.gemspec
|
99
191
|
- test/helper.rb
|
100
192
|
- test/test_phper.rb
|
101
193
|
has_rdoc: true
|
data/README.rdoc
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
= phper
|
2
|
-
|
3
|
-
Description goes here.
|
4
|
-
|
5
|
-
== Contributing to phper
|
6
|
-
|
7
|
-
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
8
|
-
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
9
|
-
* Fork the project
|
10
|
-
* Start a feature/bugfix branch
|
11
|
-
* Commit and push until you are happy with your contribution
|
12
|
-
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
13
|
-
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
14
|
-
|
15
|
-
== Copyright
|
16
|
-
|
17
|
-
Copyright (c) 2011 Yoshihiro TAKAHARA. See LICENSE.txt for
|
18
|
-
further details.
|
19
|
-
|