sakura-cli 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: efd5e983753789e52601e9ac4a964b12126a4332
4
+ data.tar.gz: 738d21ce3ec8ead5bbc4a299cc2facb31d01c780
5
+ SHA512:
6
+ metadata.gz: 1e0ff298884e5271b0b22a4b30d9500c603fa0597b6db756546a225b77ce0f64d17efd72c58f19d0c59bc95a23b22cc30e021f9b67bb422dbc1dd1cb649a3f4a
7
+ data.tar.gz: 7ea1e26078515dc5bffd37667870683d1a9c2380c0a6fa0f6da8b452fbf9a022d3903f6c0fdcf91d65b2e97335675f258c4517101530c49e2986487672bddfad
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sakura-cli.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Shintaro Kojima
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,170 @@
1
+ # Sakura CLI
2
+
3
+ Sakura CLI は, [さくらのレンタルサーバー](http://www.sakura.ne.jp/)のコントロールパネルをコマンドラインから制御するためのツールです.
4
+
5
+ :construction: このバージョンでは, ライト/スタンダード/プレミアムに共通する **メールアドレス管理** 機能のみサポートします
6
+
7
+ ## セットアップ
8
+
9
+ Sakura CLI をインストールします.
10
+
11
+ ```zsh
12
+ gem install sakura-cli
13
+ ```
14
+
15
+ Sakura CLI は[PhantomJS](http://phantomjs.org/download.html) に依存しています.
16
+ お使いのOS に合った方法でインストールしてください.
17
+
18
+ Mac の場合は
19
+
20
+ ```zsh
21
+ brew install phantomjs
22
+ ```
23
+
24
+ でもインストールできます.
25
+
26
+ ### 環境設定
27
+
28
+ ログイン情報を環境変数に設定します.
29
+
30
+ ```zsh
31
+ export SAKURA_DOMAIN='example.com'
32
+ export SAKURA_PASSWD='your_password'
33
+ ```
34
+
35
+ [dotenv](https://github.com/bkeepers/dotenv) を使うと便利かもしれません.
36
+
37
+ ```zsh
38
+ # ~/.sakura.env (dotenv の場合)
39
+
40
+ SAKURA_DOMAIN='example.com'
41
+ SAKURA_PASSWD='your_password'
42
+ ```
43
+
44
+ 場合によっては[direnv](https://github.com/zimbatm/direnv) もいいでしょう.
45
+
46
+
47
+ ## 使いかた
48
+
49
+ ```sakura help``` や ```sakura mail help``` コマンドでヘルプが表示できます.
50
+
51
+ ```zsh
52
+ $ sakura help
53
+ Commands:
54
+ sakura help [COMMAND] # Describe available commands or one specific command
55
+ sakura mail # Manage mail addresses
56
+
57
+ $ sakura mail help
58
+ Commands:
59
+ sakura mail create LOCAL_PART [PASSWORD] # Create a mail address
60
+ sakura mail delete LOCAL_PART # Delete a mail address
61
+ sakura mail forward LOCAL_PART [{add|remove} EMAIL] # Add, remove or show mail address(es) to forward
62
+ sakura mail help [COMMAND] # Describe subcommands or one specific subcommand
63
+ sakura mail keep LOCAL_PART [enable|disable] # Switch keep or flush mails
64
+ sakura mail list # List all mail addresses of the domain
65
+ sakura mail password LOCAL_PART [PASSWORD] # Update password of a mail address
66
+ sakura mail quota LOCAL_PART [VALUE] # Update or show quota of a mail address
67
+ sakura mail scan LOCAL_PART [enable|disable] # Switch virus scan
68
+ ```
69
+
70
+ ### メールアドレス一覧
71
+
72
+ ```sakura mail list``` コマンドで, メールアドレス一覧とその概要を表示できます.
73
+
74
+ ```zsh
75
+ $ sakura mail list
76
+ # domain: example.com
77
+ address virus_scan usage / quota
78
+ ---------------------------------------------------------
79
+ dummy true 379.13KB / 200MB
80
+ dummy001 true 1.79MB / 2GB
81
+ dummy002 true 6.28KB / 2GB
82
+ postmaster true 0B / 2GB
83
+ ```
84
+
85
+ ### メールアドレス作成
86
+
87
+ ```sakura mail create``` コマンドで, メールアドレスを作成できます.
88
+
89
+ ```zsh
90
+ $ sakura mail create dummy
91
+ password?
92
+ password(confirm)?
93
+ ```
94
+
95
+ コマンド引数に初期パスワードを指定することもできます.
96
+
97
+ ### メールアドレス削除
98
+
99
+ ```sakura mail delete``` コマンドで, メールアドレスを削除できます.
100
+
101
+ ### クォータ表示・変更
102
+
103
+ ```sakura mail quota``` コマンドで, 現在のクォータを表示・変更できます.
104
+
105
+ ```zsh
106
+ $ sakura mail quota dummy # 現在のクォータを表示
107
+ 200MB
108
+
109
+ $ sakura mail quota dummy 300 # 300MB に変更
110
+ ```
111
+
112
+ 変更する場合, 単位はMB です.
113
+
114
+ ### パスワード変更
115
+
116
+ ```sakura mail password``` コマンドで, パスワードをリセットできます.
117
+
118
+ ```zsh
119
+ $ sakura mail password dummy
120
+ password?
121
+ password(confirm)?
122
+ ```
123
+
124
+ コマンド引数に初期パスワードを指定することもできます.
125
+
126
+ ### メール転送
127
+
128
+ ```sakura mail forward``` コマンドで, 転送先リストを表示・編集できます.
129
+
130
+ ```zsh
131
+ $ sakura mail forward dummy # 転送先リストを表示
132
+ foo@example.com
133
+ $ sakura mail forward dummy add bar@example.com # 転送先に追加
134
+ $ sakura mail forward dummy remove bar@example.com # 転送先から削除
135
+ ```
136
+
137
+ ```sakura mail keep``` コマンドで, メールをメールボックスに残すか/転送専用にするか の設定を表示・変更できます.
138
+
139
+ ```zsh
140
+ $ sakura mail keep dummy # 設定を表示
141
+ true
142
+ $ sakura mail keep dummy disable # メールボックスに残す
143
+ ```
144
+
145
+ ### ウィルスチェック
146
+
147
+ ```sakura mail scan``` コマンドで, ウィルスチェックの設定を表示・変更できます.
148
+
149
+ ```zsh
150
+ $ sakura mail scan dummy # ウィルスチェックの設定を表示
151
+ false
152
+ $ sakura mail scan dummy enable # 有効にする
153
+ ```
154
+
155
+ ## その他
156
+
157
+ ### dotenv から起動
158
+
159
+ ```~/.sakura.env``` に環境変数一覧がある場合
160
+
161
+ ```zsh
162
+ dotenv -f ~/.sakura.env sakura
163
+ ```
164
+
165
+ のように実行します.
166
+
167
+
168
+ ## Copyright and License
169
+
170
+ Copyright (c) 2015 Shintaro Kojima. Code released under the [MIT license](LICENSE).
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.verbose = true
7
+ end
8
+
9
+ desc 'Run tests'
10
+ task :default => :test
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pathname'
4
+
5
+ $: << File.expand_path('../../lib', Pathname.new(__FILE__).realpath)
6
+
7
+ require 'sakura/cli/root'
8
+ Sakura::Cli::Root.start
@@ -0,0 +1,5 @@
1
+ require 'uri'
2
+
3
+ module Sakura
4
+ BASE_URL = URI('https://secure.sakura.ad.jp/rscontrol/')
5
+ end
@@ -0,0 +1,153 @@
1
+ require 'thor'
2
+ require 'sakura'
3
+ require 'sakura/client'
4
+ require 'sakura/mail_address'
5
+
6
+ module Sakura
7
+ module Cli
8
+ class Mail < Thor
9
+ desc 'list', 'List all mail addresses of the domain'
10
+ def list
11
+ addrs = MailAddress.all
12
+
13
+ puts "# domain: #{Client.current_session.domain}"
14
+ puts MailAddress.header
15
+ addrs.each {|addr| puts addr.to_s }
16
+ end
17
+
18
+ desc 'create LOCAL_PART [PASSWORD]', 'Create a mail address'
19
+ def create(local_part, password=nil)
20
+ password ||= ask_password
21
+
22
+ begin
23
+ MailAddress.create local_part, password
24
+ rescue
25
+ abort $!
26
+ end
27
+ end
28
+
29
+ desc 'delete LOCAL_PART', 'Delete a mail address'
30
+ def delete(local_part)
31
+ mail = MailAddress.find(local_part)
32
+ abort %(No mail address: "#{local_part}") unless mail
33
+
34
+ begin
35
+ mail.delete
36
+ rescue
37
+ abort $!
38
+ end
39
+ end
40
+
41
+ desc 'quota LOCAL_PART [VALUE]', 'Update or show quota of a mail address'
42
+ def quota(local_part, value=nil)
43
+ mail = MailAddress.find(local_part)
44
+ abort %(No mail address: "#{local_part}") unless mail
45
+
46
+ begin
47
+ if value
48
+ mail.quota = value
49
+ else
50
+ puts mail.quota
51
+ end
52
+ rescue
53
+ abort $!
54
+ end
55
+ end
56
+
57
+ desc 'password LOCAL_PART [PASSWORD]', 'Update password of a mail address'
58
+ def password(local_part, password=nil)
59
+ password ||= ask_password
60
+ mail = MailAddress.find(local_part)
61
+ abort %(No mail address: "#{local_part}") unless mail
62
+
63
+ begin
64
+ mail.password = password
65
+ rescue
66
+ abort $!
67
+ end
68
+ end
69
+
70
+ desc 'scan LOCAL_PART [enable|disable]', 'Switch virus scan'
71
+ def scan(local_part, value=nil)
72
+ self.class.handle_argument_error if value && value !~ /enable|disable/
73
+
74
+ mail = MailAddress.find(local_part)
75
+ abort %(No mail address: "#{local_part}") unless mail
76
+
77
+ begin
78
+ case value
79
+ when 'enable'
80
+ mail.virus_scan = true
81
+ when 'disable'
82
+ mail.virus_scan = false
83
+ when nil
84
+ puts mail.virus_scan
85
+ end
86
+ rescue
87
+ abort $!
88
+ end
89
+ end
90
+
91
+ desc 'forward LOCAL_PART [{add|remove} EMAIL]', 'Add, remove or show mail address(es) to forward'
92
+ def forward(local_part, operation=nil, mail_to_forward=nil)
93
+ if (operation && operation !~ /add|remove/) || (!mail_to_forward && operation)
94
+ self.class.handle_argument_error
95
+ end
96
+
97
+ mail = MailAddress.find(local_part)
98
+ abort %(No mail address: "#{local_part}") unless mail
99
+
100
+ begin
101
+ case operation
102
+ when 'add'
103
+ mail.forward_to mail_to_forward
104
+ when 'remove'
105
+ mail.delete_forward_to mail_to_forward
106
+ when nil
107
+ mail.forward_list.each {|m| puts m }
108
+ end
109
+ rescue
110
+ abort $!
111
+ end
112
+ end
113
+
114
+ desc 'keep LOCAL_PART [enable|disable]', 'Switch keep or flush mails'
115
+ def keep(local_part, value=nil)
116
+ self.class.handle_argument_error if value && value !~ /enable|disable/
117
+
118
+ mail = MailAddress.find(local_part)
119
+ abort %(No mail address: "#{local_part}") unless mail
120
+
121
+ begin
122
+ case value
123
+ when 'enable'
124
+ mail.keep = true
125
+ when 'disable'
126
+ mail.keep = false
127
+ when nil
128
+ puts mail.keep
129
+ end
130
+ rescue
131
+ abort $!
132
+ end
133
+ end
134
+
135
+
136
+ private
137
+
138
+ def ask_password
139
+ password = ask('password?', echo: false)
140
+ puts
141
+ confirm = ask('password(confirm)?', echo: false)
142
+ puts
143
+ abort "password doesn't match" unless password == confirm
144
+
145
+ password
146
+ end
147
+
148
+ def abort(message)
149
+ super "\nERROR: #{message}"
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,11 @@
1
+ require 'thor'
2
+ require 'sakura/cli/mail'
3
+
4
+ module Sakura
5
+ module Cli
6
+ class Root < Thor
7
+ desc 'mail', 'Manage mail addresses'
8
+ subcommand 'mail', Mail
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module Sakura
2
+ module Cli
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,73 @@
1
+ require 'capybara/poltergeist'
2
+ require 'sakura'
3
+ require 'sakura/cli/version'
4
+
5
+ Capybara.default_driver = :poltergeist
6
+ Capybara.current_session.driver.headers = {'User-Agent' => "sakura-cli/#{Sakura::Cli::VERSION}"}
7
+
8
+ module Sakura
9
+ class Client
10
+ include Capybara::DSL
11
+
12
+ attr_reader :domain
13
+
14
+ def self.current_session
15
+ @current_session ||= new
16
+ end
17
+
18
+
19
+ def initialize
20
+ @domain, @passwd = credentials
21
+ end
22
+
23
+ def login?
24
+ !@last_login.nil?
25
+ end
26
+
27
+ def login
28
+ visit BASE_URL
29
+ fill_in 'domain', with: @domain
30
+ fill_in 'password', with: @passwd
31
+ find('form input[type=image]').click
32
+
33
+ @last_login = Time.now if page.text =~ /ログインドメイン: #{@domain}/
34
+
35
+ raise_when_error
36
+ login?
37
+ end
38
+
39
+ def get(url)
40
+ login unless login?
41
+ visit url
42
+ page
43
+ end
44
+
45
+ def process(url, &block)
46
+ login unless login?
47
+ visit url
48
+ instance_eval &block
49
+
50
+ raise_when_error
51
+ page
52
+ end
53
+
54
+
55
+ private
56
+
57
+ def credentials
58
+ warn 'SAKURA_DOMAIN is not set' unless ENV['SAKURA_DOMAIN']
59
+ warn 'SAKURA_PASSWD is not set' unless ENV['SAKURA_PASSWD']
60
+
61
+ if ENV['SAKURA_DOMAIN'] && ENV['SAKURA_PASSWD']
62
+ [ENV['SAKURA_DOMAIN'], ENV['SAKURA_PASSWD']]
63
+ else
64
+ exit 1
65
+ end
66
+ end
67
+
68
+ def raise_when_error
69
+ error = page.all('.error-message')
70
+ raise error.first.text unless error.empty?
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,164 @@
1
+ require 'sakura/client'
2
+
3
+ module Sakura
4
+ class MailAddress
5
+ MAIL_URL = BASE_URL + 'rs/mail'
6
+
7
+ attr_reader :address, :virus_scan, :usage, :quota, :link, :link_to_delete
8
+
9
+ class << self
10
+ def create(local_part, password)
11
+ Client.current_session.process(MAIL_URL) do
12
+ fill_in 'NewUsername', with: local_part
13
+ fill_in 'Password1', with: password
14
+ fill_in 'Password2', with: password
15
+ find('input[name="Submit_useradd"]').click
16
+ end
17
+
18
+ true
19
+ end
20
+
21
+ def all
22
+ page = Client.current_session.get(MAIL_URL)
23
+
24
+ page.all(:xpath, '//a[contains(@href, "mail?Username=")]/../..').map{|element|
25
+ arguments = element.all('td').map(&:text)[0..-2] + element.all('a').map{|i| i[:href] }
26
+ MailAddress.new(*arguments)
27
+ }
28
+ end
29
+
30
+ def find(local_part)
31
+ all.find {|m| m.address == local_part }
32
+ end
33
+
34
+ def header
35
+ str = tabularize('address', 'virus_scan', 'usage', 'quota')
36
+ "#{str}\n#{'-' * (str.size+1)}"
37
+ end
38
+
39
+ def tabularize(*args)
40
+ args[0].ljust(20) <<
41
+ args[1].to_s.rjust(11) <<
42
+ "#{args[2]} /".to_s.rjust(15) <<
43
+ args[3].to_s.rjust(10)
44
+ end
45
+ end
46
+
47
+
48
+ def initialize(address, virus_scan, usage, quota, link, link_to_delete=nil)
49
+ @address = address
50
+ @virus_scan = virus_scan == '○'
51
+ @usage = usage
52
+ @quota = quota
53
+ @link = link
54
+ @link_to_delete = link_to_delete
55
+ end
56
+
57
+ def delete
58
+ link = @link_to_delete
59
+ Client.current_session.process(MAIL_URL) do
60
+ find("a[href=\"#{link}\"]").click
61
+ end
62
+
63
+ true
64
+ end
65
+
66
+ def quota=(value)
67
+ page = Client.current_session.process(MAIL_URL + @link) {
68
+ fill_in 'MailQuota', with: value
69
+ find('input[name="Submit_quotaedit"]').click
70
+ }
71
+
72
+ page.text =~ /利用中のディスク領域: \S+ \/ (\S+)/
73
+ @quota = $1
74
+ end
75
+
76
+ def password=(value)
77
+ Client.current_session.process(MAIL_URL + @link) do
78
+ fill_in 'Password1', with: value
79
+ fill_in 'Password2', with: value
80
+ find('input[name="Submit_password"]').click
81
+ end
82
+ end
83
+
84
+ def virus_scan=(value)
85
+ value = value ? 1 : 0
86
+ Client.current_session.process(MAIL_URL + @link) do
87
+ find("input[name='VirusScan'][value='#{value}']").click
88
+ end
89
+
90
+ @virus_scan = value == 1
91
+ end
92
+
93
+ def enable_virus_scan
94
+ virus_scan = true
95
+ end
96
+
97
+ def disable_virus_scan
98
+ virus_scan = false
99
+ end
100
+
101
+ def keep
102
+ if @keep.nil?
103
+ page = Client.current_session.get(MAIL_URL + @link)
104
+ @keep = page.find('input[name="Save"]:checked').value == '1'
105
+ end
106
+
107
+ @keep
108
+ end
109
+
110
+ def keep=(value)
111
+ value = value ? 1 : 0
112
+ Client.current_session.process(MAIL_URL + @link) do
113
+ find("input[name='Save'][value='#{value}']").click
114
+ end
115
+
116
+ @keep = value == 1
117
+ end
118
+
119
+ def enable_keep
120
+ keep = true
121
+ end
122
+
123
+ def disable_keep
124
+ keep = false
125
+ end
126
+
127
+ def forward_list
128
+ if @forward_list.nil?
129
+ page = Client.current_session.get(MAIL_URL + @link)
130
+ @forward_list = page.all('select[name="DeleteAddress[]"] option').map(&:text)
131
+ end
132
+
133
+ @forward_list
134
+ end
135
+
136
+ def forward_to(mail)
137
+ Client.current_session.process(MAIL_URL + @link) do
138
+ execute_script <<-JS
139
+ var f = document.Transfer;
140
+ f.Address.value = '#{mail}';
141
+ f.SubAction.value = 'add';
142
+ f.submit();
143
+ JS
144
+ end
145
+
146
+ @forward_list ||= []
147
+ @forward_list << mail
148
+ end
149
+
150
+ def delete_forward_to(mail)
151
+ Client.current_session.process(MAIL_URL + @link) do
152
+ find_field('DeleteAddress[]').select(mail)
153
+ find('a[href="javascript:tr_delete();"]').click
154
+ end
155
+
156
+ @forward_list ||= []
157
+ @forward_list.delete mail
158
+ end
159
+
160
+ def to_s
161
+ self.class.tabularize(@address, @virus_scan, @usage, @quota)
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sakura/cli/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sakura-cli"
8
+ spec.version = Sakura::Cli::VERSION
9
+ spec.authors = ["Shintaro Kojima"]
10
+ spec.email = ["goodies@codeout.net"]
11
+
12
+ spec.summary = %q{Command-line tool for Sakura's Rental Server.}
13
+ spec.description = %q{Command-line tool and client library to control the dashboard of Sakura Rental Server.}
14
+ spec.homepage = "https://github.com/codeout/sakura-cli"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(bin|test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_runtime_dependency "poltergeist"
23
+ spec.add_runtime_dependency "thor"
24
+ spec.add_development_dependency "bundler", "~> 1.9"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.required_ruby_version = '>= 2.0.0'
27
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sakura-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Shintaro Kojima
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-05-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: poltergeist
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description: Command-line tool and client library to control the dashboard of Sakura
70
+ Rental Server.
71
+ email:
72
+ - goodies@codeout.net
73
+ executables:
74
+ - sakura
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - exe/sakura
84
+ - lib/sakura.rb
85
+ - lib/sakura/cli/mail.rb
86
+ - lib/sakura/cli/root.rb
87
+ - lib/sakura/cli/version.rb
88
+ - lib/sakura/client.rb
89
+ - lib/sakura/mail_address.rb
90
+ - sakura-cli.gemspec
91
+ homepage: https://github.com/codeout/sakura-cli
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 2.0.0
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.4.5
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Command-line tool for Sakura's Rental Server.
115
+ test_files: []
116
+ has_rdoc: