Class: Narou::AppServer

Inherits:
Sinatra::Base
  • Object
show all
Defined in:
lib/web/appserver.rb

Constant Summary collapse

BOOKMARKLET_MODE =

ウィジット関係


%w(download insert_button)
ALLOW_HOSTS =
[].tap do |hosts|
  Downloader.load_settings.each do |s|
    hosts << s["domain"]
  end
  hosts.freeze
end
@@request_reboot =
false
@@already_update_system =
false
@@gem_update_last_log =
""

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAppServer

Returns a new instance of AppServer.



229
230
231
232
233
234
# File 'lib/web/appserver.rb', line 229

def initialize
  super
  puts_hello_messages
  start_device_ejectable_event
  fill_general_all_no_in_database
end

Class Method Details

.create_address(user_port = nil) ⇒ Object

サーバのアドレスを生成

portは初回起動時にランダムで設定する。次回からは同じ設定を引き継ぐ。 bindは自分で設定する場合は narou s server-bind=address で行う。 bindは設定しなかった場合は起動したPCのプライベートIPアドレスが設定される。 この場合はLAN内からアクセス出来る。 bindがlocalhostの場合は実際には127.0.0.1で処理される。(起動したPCでしか アクセス出来ない) 0.0.0.0 を指定した場合はアクセスに制限がかからない(外部からアクセス可能) セキュリティ上オススメ出来ない。



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/web/appserver.rb', line 188

def self.create_address(user_port = nil)
  global_setting = Inventory.load("global_setting", :global)
  port, bind = global_setting["server-port"], global_setting["server-bind"]
  port = user_port if user_port
  ipaddress = my_ipaddress
  unless port
    port = rand(4000..65000)
    global_setting["server-port"] = port
    global_setting.save
  end
  bind = "127.0.0.1" if bind == "localhost"
  host = bind ? bind : ipaddress
  set :port, port
  set :bind, host
  {
    host: host,
    port: port
  }
end

.my_ipaddressObject

自分のIPアドレス取得

参考:qiita.com/saltheads/items/cc49fcf2af37cb277c4f



213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/web/appserver.rb', line 213

def self.my_ipaddress
  @@__ipaddress ||= -> {
    udp = UDPSocket.new
    begin
      # 128.0.0.0 への送信に使用されるNICのアドレスを取得
      udp.connect("128.0.0.0", 7)
      Socket.unpack_sockaddr_in(udp.getsockname)[1]
    rescue Errno::ENETUNREACH
      # 128.0.0.0 へのルーティングがないとき
      "127.0.0.1"
    ensure
      udp.close
    end
  }.call
end

.push_serverObject



164
165
166
# File 'lib/web/appserver.rb', line 164

def self.push_server
  @@push_server
end

.push_server=(server) ⇒ Object



160
161
162
# File 'lib/web/appserver.rb', line 160

def self.push_server=(server)
  @@push_server = server
end

.request_rebootObject



168
169
170
# File 'lib/web/appserver.rb', line 168

def self.request_reboot
  @@request_reboot = true
end

.request_reboot?Boolean

Returns:

  • (Boolean)


172
173
174
# File 'lib/web/appserver.rb', line 172

def self.request_reboot?
  @@request_reboot
end

Instance Method Details

#fill_general_all_no_in_databaseObject

話数の設定されていない小説の話数を取得して埋める



261
262
263
264
265
266
267
268
269
# File 'lib/web/appserver.rb', line 261

def fill_general_all_no_in_database
  modified = false
  Database.instance.each do |id, data|
    next if data["general_all_no"]
    data["general_all_no"] = general_all_no_by_toc(id)
    modified = true
  end
  Database.instance.save_database if modified
end

#general_all_no_by_toc(id) ⇒ Object



254
255
256
257
258
# File 'lib/web/appserver.rb', line 254

def general_all_no_by_toc(id)
  toc = Downloader.new(id).load_toc_file
  return nil unless toc
  toc["subtitles"].size
end

#puts_hello_messagesObject



236
237
238
# File 'lib/web/appserver.rb', line 236

def puts_hello_messages
  puts "<white>Narou.rb version #{::Version}</white>".termcolor
end

#start_device_ejectable_eventObject



240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/web/appserver.rb', line 240

def start_device_ejectable_event
  return unless Device.support_eject?
  Thread.new do
    loop do
      if @@push_server.connections.count > 0
        device = Narou.get_device
        @@push_server.send_all(:"device.ejectable" => device && device.ejectable?)
      end

      sleep 2
    end
  end
end