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|
  SiteSetting.settings.each_value 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.



121
122
123
124
125
126
127
# File 'lib/web/appserver.rb', line 121

def initialize
  super
  puts_hello_messages
  start_device_ejectable_event
  fill_general_all_no_in_database
  setup_server_authentication
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 を指定した場合はアクセスに制限がかからない(外部からアクセス可能) セキュリティ上オススメ出来ない。



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/web/appserver.rb', line 80

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



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/web/appserver.rb', line 105

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



56
57
58
# File 'lib/web/appserver.rb', line 56

def self.push_server
  @@push_server
end

.push_server=(server) ⇒ Object



52
53
54
# File 'lib/web/appserver.rb', line 52

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

.request_rebootObject



60
61
62
# File 'lib/web/appserver.rb', line 60

def self.request_reboot
  @@request_reboot = true
end

.request_reboot?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/web/appserver.rb', line 64

def self.request_reboot?
  @@request_reboot
end

Instance Method Details

#fill_general_all_no_in_databaseObject

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



154
155
156
157
158
159
160
161
162
# File 'lib/web/appserver.rb', line 154

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



147
148
149
150
151
# File 'lib/web/appserver.rb', line 147

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



129
130
131
# File 'lib/web/appserver.rb', line 129

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

#setup_server_authenticationObject

サーバーの認証の設定 とりあえずDigest認証のみ



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/web/appserver.rb', line 166

def setup_server_authentication
  auth = Inventory.load("global_setting", :global).group("server-digest-auth")
  user = auth.user
  hashed = auth.hashed_password
  passwd = hashed || auth.password

  # enableかつユーザー名とパスワードが設定されている時のみ認証を有効にする
  return unless auth.enable && user && passwd

  self.class.class_exec do
    use Rack::Auth::Digest::MD5, { realm: "narou.rb", opaque: "", passwords_hashed: hashed } do |username|
      passwd if username == user
    end
  end
end

#start_device_ejectable_eventObject



133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/web/appserver.rb', line 133

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