luna_scanner 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,273 @@
1
+ #!/bin/bash
2
+
3
+ NOW=`date '+%Y-%m-%d %H:%M'`
4
+
5
+ echo "Start at ${NOW}"
6
+
7
+ UPDATE_HOST=http://10.0.4.48
8
+ LIMIT_SPEED=900k
9
+
10
+ if [ $# -ge 1 ]; then
11
+ echo "Use update host $1"
12
+ UPDATE_HOST=$1
13
+ else
14
+ echo "Use default update host ${UPDATE_HOST}"
15
+ fi
16
+
17
+ if [ $# -ge 2 ]; then
18
+ LIMIT_SPEED=$2
19
+ echo "Use download speed ${LIMIT_SPEED}"
20
+ else
21
+ echo "Use default download speed ${LIMIT_SPEED}"
22
+ fi
23
+
24
+ if [ ! -d /root ]; then
25
+ echo "/root directory not exist! Exit"
26
+ exit 1
27
+ fi
28
+
29
+ if [ ! -f /proc/itc_sn/sn ]; then
30
+ echo "/proc/itc_sn/sn file not exist! Exit"
31
+ exit 1
32
+ fi
33
+
34
+ if [ ! -f /boot/uboot/uEnv.txt ]; then
35
+ echo "/boot/uboot/uEnv.txt file not exist! Exit"
36
+ exit 1
37
+ fi
38
+
39
+ which wget
40
+ if [ ! $? -eq 0 ]; then
41
+ echo "wget tool not installed. Exit"
42
+ exit 1
43
+ fi
44
+
45
+ which md5sum
46
+ if [ ! $? -eq 0 ]; then
47
+ echo "md5sum tool not installed. Exit"
48
+ exit 1
49
+ fi
50
+
51
+ which awk
52
+ if [ ! $? -eq 0 ]; then
53
+ echo "awk tool not installed. Exit"
54
+ exit 1
55
+ fi
56
+
57
+ SN=`cat /proc/itc_sn/sn`
58
+ echo "Serial NO. ${SN}"
59
+
60
+
61
+ echo "Start download firmware.md5 file."
62
+ # tell server I have started.
63
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=1 &> /dev/null
64
+ sleep 1
65
+ wget -O /root/firmware.md5 ${UPDATE_HOST}/static/firmwares/firmware.md5 --limit-rate=${LIMIT_SPEED}
66
+ ret=$?
67
+ if [ ! $ret -eq 0 ]; then
68
+ echo "firmware.md5 file downlaod failed! ${ret}"
69
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=401\&reason=firmware.md5_download_failed &> /dev/null
70
+ exit 1
71
+ fi
72
+
73
+ echo "Start download package 1 -> vardir ..."
74
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=2 &> /dev/null
75
+ sleep 1
76
+ wget -O /root/vardir.tar.xz ${UPDATE_HOST}/static/firmwares/vardir.tar.xz --limit-rate=${LIMIT_SPEED}
77
+ ret=$?
78
+ if [ ! $ret -eq 0 ]; then
79
+ echo "Package vardir.tar.xz download failed! ${ret}"
80
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=402\&reason=vardir.tar.xz_download_failed &> /dev/null
81
+ exit 1
82
+ fi
83
+
84
+ echo "Start download package 2 -> rootfs.tar.xz ..."
85
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=3 &> /dev/null
86
+ sleep 1
87
+ wget -O /root/rootfs.tar.xz ${UPDATE_HOST}/static/firmwares/rootfs.tar.xz --limit-rate=${LIMIT_SPEED}
88
+ ret=$?
89
+ if [ ! $ret -eq 0 ]; then
90
+ echo "Package rootfs.tar.xz download failed! ${ret}"
91
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=403\&reason=rootfs.tar.xz_download_failed &> /dev/null
92
+ exit 1
93
+ fi
94
+
95
+ echo "Start download uImage ..."
96
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=4 &> /dev/null
97
+ sleep 1
98
+ wget -O /root/uImage ${UPDATE_HOST}/static/firmwares/uImage --limit-rate=${LIMIT_SPEED}
99
+ ret=$?
100
+ if [ ! $ret -eq 0 ]; then
101
+ echo "Package uImage download failed! ${ret}"
102
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=404\&reason=uImage_download_failed &> /dev/null
103
+ exit 1
104
+ fi
105
+
106
+ echo "Finished download. Start validate firmware."
107
+
108
+ if [ ! -f /root/firmware.md5 ]; then
109
+ echo "/root/firmware.md5 not exist. Exit"
110
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=401\&reason=firmware.md5_not_exist &> /dev/null
111
+ exit 1
112
+ fi
113
+
114
+ if [ ! -f /root/vardir.tar.xz ]; then
115
+ echo "/root/vardir.tar.xz not exist. Exit"
116
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=402\&reason=vardir.tar.xz_not_exist &> /dev/null
117
+ exit 1
118
+ fi
119
+
120
+ if [ ! -f /root/rootfs.tar.xz ]; then
121
+ echo "/root/rootfs.tar.xz not exist. Exit"
122
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=403\&reason=rootfs.tar.xz_not_exist &> /dev/null
123
+ exit 1
124
+ fi
125
+
126
+ if [ ! -f /root/uImage ]; then
127
+ echo "/root/uImage not exist. Exit"
128
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=404\&reason=uImage_not_exist &> /dev/null
129
+ exit 1
130
+ fi
131
+
132
+ cd /root
133
+
134
+ Vardir_md5=`md5sum vardir.tar.xz | awk -F' ' '{print $1}'`
135
+ Vardir_md5_download=`grep vardir firmware.md5 | awk -F' ' '{print $1}'`
136
+
137
+ if test "${Vardir_md5}" != "${Vardir_md5_download}" ; then
138
+ echo "vardir.tar.xz's md5 isn't matched"
139
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=422\&reason=vardir.tar.xz_md5_not_matched &> /dev/null
140
+ exit 2
141
+ fi
142
+
143
+ Root_md5=`md5sum rootfs.tar.xz | awk -F' ' '{print $1}'`
144
+ Root_md5_download=`grep rootfs firmware.md5 | awk -F' ' '{print $1}'`
145
+
146
+ if test "${Root_md5}" != "${Root_md5_download}" ; then
147
+ echo "rootfs.tar.xz's md5 isn't matched"
148
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=423\&reason=rootfs.tar.xz_md5_not_matched &> /dev/null
149
+ exit 2
150
+ fi
151
+
152
+ UImage_md5=`md5sum uImage | awk -F' ' '{print $1}'`
153
+ UImage_md5_download=`grep uImage firmware.md5 | awk -F' ' '{print $1}'`
154
+
155
+ if test "${UImage_md5}" != "${UImage_md5_download}" ; then
156
+ echo "uImage's md5 isn't matched"
157
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=424\&reason=uImage_md5_not_matched &> /dev/null
158
+ exit 2
159
+ fi
160
+
161
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=13 &> /dev/null
162
+
163
+ echo "Validation passed. Start setup ..."
164
+ sleep 1
165
+
166
+ echo "Updating kernel ..."
167
+ sleep 1
168
+ cp -rf /root/uImage /boot/uboot/uImage
169
+ ret=$?
170
+ if [ ! $ret -eq 0 ]; then
171
+ echo "Updating uImage failed: #{ret}"
172
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=443\&reason=uImage_copy_failed &> /dev/null
173
+ exit 1
174
+ fi
175
+ echo "kernel updated success"
176
+
177
+ cat - <<'EOF' > /boot/uboot/update_rootfs.sh
178
+ #!/bin/bash
179
+
180
+ set -xe
181
+
182
+ DIR=`pwd`
183
+ MMC_DEV=/dev/mmcblk0
184
+ ROOTFS_PART=${MMC_DEV}p2
185
+ ROOTDIR_PART=${MMC_DEV}p5
186
+ VARDIR_PART=${MMC_DEV}p6
187
+
188
+ ROOTFS_PATH=/rootfs
189
+ ROOTDIR_PATH=/rootdir
190
+ VARDIR_PATH=/vardir
191
+
192
+ #ROOTFS_URL="http://192.168.8.80/rootfs-release.tar.xz"
193
+ #ROOTDIR_URL=
194
+ #VARDIR_URL=
195
+
196
+ mount_parts(){
197
+ ## make dir if missing
198
+ mkdir -p ${ROOTFS_PATH}
199
+ mkdir -p ${ROOTDIR_PATH} #not updating this at the moment.
200
+ mkdir -p ${VARDIR_PATH}
201
+
202
+ ## mount to correct dir
203
+ mount ${ROOTFS_PART} ${ROOTFS_PATH}
204
+ mount ${ROOTDIR_PART} ${ROOTDIR_PATH}
205
+ mount ${VARDIR_PART} ${VARDIR_PATH}
206
+ }
207
+
208
+ update_parts(){
209
+ ##get parts
210
+ if [ -f ${ROOTDIR_PATH}/rootfs.tar.xz ]; then
211
+ echo "Already dl'ed."
212
+ else
213
+ echo "No update packages, skipping."
214
+ # wget -O ${ROOTDIR_PATH}/rootfs.tar.xz ${ROOTFS_URL}
215
+ # wget -O ${ROOTDIR_PATH}/rootdir.tar.xz ${ROOTDIR_URL}
216
+ # wget -O ${ROOTDIR_PATH}/vardir.tar.xz ${VARDIR_URL}
217
+ fi
218
+
219
+ #flash parts
220
+ cd ${ROOTFS_PATH}
221
+ cp ${ROOTFS_PATH}/etc/network/interfaces /root/interfaces
222
+ rm -rf *
223
+ xzcat ${ROOTDIR_PATH}/rootfs.tar.xz | tar xv
224
+
225
+ #cd ${ROOTDIR_PATH}
226
+ #rm -rf *
227
+ #xzcat ${ROOTDIR_PATH}/rootdir.tar.xz | tar xv
228
+
229
+ cd ${VARDIR_PATH}
230
+ cp ${VARDIR_PATH}/lib/luna/luna_client.sqlite3 /root/ || true
231
+ rm -rf *
232
+ xzcat ${ROOTDIR_PATH}/vardir.tar.xz | tar xv
233
+ mv /root/luna_client.sqlite3 ${VARDIR_PATH}/lib/luna/ || true
234
+ # make sure to copy authorized_keys
235
+ mkdir -p ${ROOTDIR_PATH}/.ssh || true
236
+ cp -f ${ROOTFS_PATH}/root/.ssh/authorized_keys ${ROOTDIR_PATH}/.ssh/ || true
237
+ mv /root/interfaces ${ROOTFS_PATH}/etc/network/interfaces || true
238
+ }
239
+
240
+ cleaning(){
241
+ rm -rf ${ROOTDIR_PATH}/rootfs.tar.xz || true
242
+ rm -rf ${ROOTDIR_PATH}/rootdir.tar.xz || true
243
+ rm -rf ${ROOTDIR_PATH}/vardir.tar.xz || true
244
+ }
245
+
246
+ verify(){
247
+ sed -i "s/mmcblk0p3/mmcblk0p2/g" ${BOOTFS_PATH}/uEnv.txt
248
+ }
249
+
250
+ umount_parts(){
251
+ cd ${DIR}
252
+ umount ${ROOTFS_PART} || true
253
+ umount ${ROOTDIR_PART} || true
254
+ umount ${VARDIR_PART} || true
255
+ }
256
+
257
+
258
+ #do the job
259
+ umount_parts
260
+ mount_parts
261
+ update_parts
262
+ #verify
263
+ cleaning
264
+ umount_parts
265
+ EOF
266
+
267
+ chmod 770 /boot/uboot/update_rootfs.sh
268
+
269
+ sed -i "s/mmcblk0p2/mmcblk0p3/g" /boot/uboot/uEnv.txt
270
+ echo "Finished. Restarting device."
271
+
272
+ wget -qO- ${UPDATE_HOST}/v3/update/report_progress?sn=${SN}\&status=20 &> /dev/null
273
+ reboot
@@ -0,0 +1,64 @@
1
+ module LunaScanner
2
+ class Util
3
+ class << self
4
+
5
+ def ip_valid?(ip)
6
+ ip_array = ip.to_s.split(".")
7
+ return false if ip_array.size != 4
8
+
9
+ return false if ip_array[3].to_i <= 0 || ip_array[3].to_i > 255
10
+
11
+ true
12
+ end
13
+
14
+ def begin_ip(ip)
15
+ ip_array = ip.to_s.split(".")
16
+ raise "IP Error." if ip_array.size != 4
17
+
18
+ "#{ip_array[0]}.#{ip_array[1]}.#{ip_array[2]}.1"
19
+ end
20
+
21
+ def end_ip(ip)
22
+ ip_array = ip.to_s.split(".")
23
+ raise "IP Error." if ip_array.size != 4
24
+
25
+ "#{ip_array[0]}.#{ip_array[1]}.#{ip_array[2]}.255"
26
+ end
27
+
28
+ def ip_range(begin_ip, end_ip)
29
+ start_ip_array = begin_ip.split(".")
30
+ end_ip_array = end_ip.split(".")
31
+ raise "IP not valid." if start_ip_array.size != 4 || end_ip_array.size != 4
32
+ raise "IP not valid." if start_ip_array[3].to_i > 255 || end_ip_array[3].to_i > 255
33
+ raise "Start ip and end ip must be in same range." if start_ip_array[0] != end_ip_array[0] || start_ip_array[1] != end_ip_array[1]
34
+ raise "IP range not valid" if start_ip_array[2].to_i > end_ip_array[2].to_i
35
+ raise "IP range not valid" if (start_ip_array[2].to_i == end_ip_array[2].to_i) && start_ip_array[3].to_i > end_ip_array[3].to_i
36
+
37
+ ip_array = []
38
+ if start_ip_array[2].to_i == end_ip_array[2].to_i # 192.168.1.1 ~ 192.168.1.10
39
+ (start_ip_array[3].to_i..end_ip_array[3].to_i).step do |i|
40
+ ip_array << start_ip_array[0] + "." + start_ip_array[1] + "." + start_ip_array[2] + ".#{i}"
41
+ end
42
+ else # 192.168.1.1 ~ 192.168.3.10
43
+ (start_ip_array[2].to_i..end_ip_array[2].to_i).step do |i|
44
+ if start_ip_array[2].to_i == i
45
+ (start_ip_array[3].to_i..255).step do |j|
46
+ ip_array << start_ip_array[0] + "." + start_ip_array[1] + "." + start_ip_array[2] + ".#{j}"
47
+ end
48
+ elsif end_ip_array[2].to_i == i
49
+ (1..end_ip_array[3].to_i).step do |j|
50
+ ip_array << start_ip_array[0] + "." + start_ip_array[1] + "." + end_ip_array[2] + ".#{j}"
51
+ end
52
+ else
53
+ (1..255).step do |j|
54
+ ip_array << start_ip_array[0] + "." + start_ip_array[1] + ".#{i}.#{j}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ ip_array
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ module LunaScanner
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,98 @@
1
+ require "sinatra/base"
2
+
3
+ module LunaScanner
4
+ class Web < Sinatra::Base
5
+ $scan_hosts = Array.new
6
+
7
+ enable :inline_templates
8
+
9
+ not_found do
10
+ "Sir, I don't understand what you mean."
11
+ end
12
+
13
+ before do
14
+ @local_ip ||= LunaScanner.local_ip
15
+ end
16
+
17
+ get '/' do
18
+ @start_ip = Util.begin_ip @local_ip if params[:start_ip].to_s.length == 0
19
+ @end_ip = Util.end_ip @local_ip if params[:end_ip].to_s.length == 0
20
+ erb :index
21
+ end
22
+
23
+ post '/scan' do
24
+ redirect "/" if !Util.ip_valid?(params[:start_ip]) || !Util.ip_valid?(params[:end_ip])
25
+
26
+ @start_ip = params[:start_ip]
27
+ @end_ip = params[:end_ip]
28
+
29
+ @ip_range = Util.ip_range(params[:start_ip], params[:end_ip])
30
+
31
+ scanner = LunaScanner::Scanner.new(100, params[:start_ip], params[:end_ip])
32
+
33
+
34
+ 100.times do
35
+
36
+ end
37
+ erb :index
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ __END__
44
+
45
+ @@ layout
46
+ <html>
47
+ <head>
48
+ <title>Luna scanner</title>
49
+ <style type='text/css'>
50
+ .table td {
51
+ border:1px solid #BDBDBD;
52
+ }
53
+ </style>
54
+ </head>
55
+ <body>
56
+ <h1>Luna scanner</h1>
57
+ Local IP: <%= @local_ip %>
58
+ <%= yield %>
59
+ <footer></footer>
60
+ </body>
61
+ </html>
62
+
63
+ @@ index
64
+ <div id='scan_form'>
65
+ <form action='/scan' method='POST'>
66
+ From <input type='text' name='start_ip' value="<%= @start_ip %>" /> to <input type='text' name='end_ip' value="<%= @end_ip %>" />
67
+ <input type='submit' class='btn'/>
68
+ </form>
69
+ </div>
70
+
71
+ <div id='scan_result'>
72
+ <% if @ip_range && @ip_range.size > 0 %>
73
+ <table class='table'>
74
+ <thead>
75
+ <tr>
76
+ <th>Select</th>
77
+ <th>Sequence</th>
78
+ <th>IP</th>
79
+ <th>Status</th>
80
+ <th>Operation</th>
81
+ </tr>
82
+ </thead>
83
+ <tbody>
84
+ <% @ip_range.each_with_index do |ip, index| %>
85
+ <tr>
86
+ <td style='text-align:center'>
87
+ <input type='checkbox' />
88
+ </td>
89
+ <td style='text-align:center'><%= index + 1 %></td>
90
+ <td><%= ip %></td>
91
+ <td></td>
92
+ <td></td>
93
+ </tr>
94
+ <% end %>
95
+ </tbody>
96
+ </table>
97
+ <% end %>
98
+ </div>
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'luna_scanner/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "luna_scanner"
8
+ spec.version = LunaScanner::VERSION
9
+ spec.authors = ["qichunren"]
10
+ spec.email = ["whyruby@gmail.com"]
11
+ spec.description = %q{Discover luna-client devices in LAN}
12
+ spec.summary = %q{Discover luna-clinet devices in LAN, batch config them.}
13
+ spec.homepage = "https://github.com/qichunren/luna-scanner"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.bindir = 'bin'
22
+
23
+ spec.add_runtime_dependency "net-ssh", "~> 2.7.0"
24
+ spec.add_runtime_dependency "net-scp", "~> 1.1.2"
25
+ spec.add_runtime_dependency "sinatra", "~> 1.4.4"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.3"
28
+ spec.add_development_dependency "rake"
29
+ end