luna_scanner 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +18 -0
- data/Changelog.txt +10 -0
- data/Gemfile +4 -0
- data/INSTALL +21 -0
- data/LICENSE.txt +22 -0
- data/README.md +99 -0
- data/Rakefile +14 -0
- data/bin/luna_scanner +7 -0
- data/lib/luna_scanner.rb +66 -0
- data/lib/luna_scanner/cli.rb +159 -0
- data/lib/luna_scanner/device.rb +132 -0
- data/lib/luna_scanner/logger.rb +32 -0
- data/lib/luna_scanner/rcommand.rb +128 -0
- data/lib/luna_scanner/scanner.rb +156 -0
- data/lib/luna_scanner/update_firmware.sh +273 -0
- data/lib/luna_scanner/util.rb +64 -0
- data/lib/luna_scanner/version.rb +3 -0
- data/lib/luna_scanner/web.rb +98 -0
- data/luna_scanner.gemspec +29 -0
- data/test/device_test.rb +77 -0
- data/test/local_ip_test.rb +14 -0
- data/test/logger_test.rb +16 -0
- data/test/luna_scanner_test.rb +21 -0
- data/test/test_helper.rb +11 -0
- data/test/web_test.rb +2 -0
- metadata +147 -0
@@ -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,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
|