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.
- 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
|