-
Notifications
You must be signed in to change notification settings - Fork 0
/
functions.rb
323 lines (289 loc) · 6.66 KB
/
functions.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'json'
require 'docker'
Docker.url='unix:///var/run/docker.sock'
Dir.glob( File.dirname(__FILE__) + "/functions/*.rb" ).each { |file|
require file
}
# 写入到config文件
# field key
# value 覆盖值
def write_json(key, value)
file = File.dirname(__FILE__)+"/db/config"
json = parse_json_file("config")
json[key] = value
File.open(file, 'w') do |f|
f.puts json.to_json
end
end
def write_to_file (file, txt)
if File.exists?(file) then
puts "文件:#{file}已存在,写入失败"
false
else
File.open(file, "w") do |f|
f.puts txt
end
true
end
end
# 获取项目数量
def get_project_count
file = db_file("project_count")
File.read(file).to_i
end
# 获取序列id
def get_sequence
file = db_file("sequence")
# 默认为0
unless File.file?(file) then system("echo '0'> #{file}") end
seq = File.read(file).to_i + 1
File.open(file, "w") { |f| f.puts seq }
seq
end
# 解析json文件,如果不存在则自动创建
def parse_json_file(name)
file = db_file(name)
unless File.file?(file) then system("echo '[]'> #{file}") end
return JSON.parse(File.read(file))
end
# 项目数量增加1
def inc_project_count
file = File.dirname(__FILE__)+"/db/project_count"
count = File.read(file).to_i
count += 1
File.open(file, "w") { |f| f.puts count }
end
# 打印项目更新地址
def project_update_url(name)
file = File.dirname(__FILE__)+"/db/server_ip"
ip = File.read(file).rstrip
"http://#{ip}:9999/update/#{name}"
end
# 获取所有项目
def get_projects
parse_json_file("projects")
end
# 根据name获取项目
def get_project(name)
projects = get_projects
projects.each do |p|
if p['name'] == name then return p end
end
nil
end
# 根据id获取项目信息
def get_project_by_id(id)
if id!=nil then
projects = get_projects
projects.each do |p|
if p['id'] == id then return p end
end
end
end
# 添加项目
def add_project(data)
file = File.dirname(__FILE__)+"/db/projects"
json = get_projects
json.push data
File.open(file, 'w') do |f|
f.puts json.to_json
end
end
def del_project(id)
proj = get_project_by_id(id)
if proj != nil then
# 删除nginx配置文件
system("rm -rf /etc/nginx/conf.d/#{proj['name']}.conf")
# 删除容器
system("docker rm -f #{proj['container']}")
# 删除本地文件
system("rm -rf #{proj['app_dir']}")
# 删除数据库
if proj["db_name"] then
puts "是否删除项目关联用户(y/n)"
y_or_n = STDIN.gets.rstrip
delete_user(proj["db_user"], "%") if y_or_n=="y" || y_or_n == "Y"
puts "是否删除项目关联数据库(y/n)"
y_or_n = STDIN.gets.rstrip
delete_db(proj["db_name"]) if y_or_n=="y" || y_or_n == "Y"
end
# 删除项目记录
projects = get_projects
projects.delete_if { |proj| proj['id'] == id }
file = db_file("projects")
File.open(file, 'w') do |f|
f.puts projects.to_json
end
end
end
# 更新project信息
def update_project_info(data)
change_keys = {}
change = false
projects = get_projects
project_name = ""
projects.each do |proj|
if proj['id'] == data['id'] then
project_name = proj["name"]
change = true
data.each do |k, v|
if proj[k] != v then
change_keys[k] = 1
end
proj[k] = v
end
break
end
end
# save change
if change then
# 修改项目git地址
if change_keys.has_key?("git") then
command = "cd /www/#{project_name};"
command+= "git remote rm origin;"
command+= "git remote add origin " + data["git"]
system(command)
end
file = db_file("projects")
File.open(file, 'w') do |f|
f.puts projects.to_json
end
end
end
def db_file(file)
File.dirname(__FILE__)+"/db/" + file
end
def get_auth_ip
file = db_file("auth_ip")
unless File.file?(file) then system("echo '[]'> #{file}") end
return JSON.parse(File.read(file))
end
def add_auth_ip(ip)
file = db_file("auth_ip")
json = get_auth_ip
if json.index(ip)==nil then
json.push ip
File.open(file,"w") do |f|
f.puts json.to_json
end
end
end
# 选择项目并返回项目信息,不存在返回nil
def project_select
projects = get_projects
projects.each do |proj|
printf("%-2s %-15s\n", proj['id'], proj['name'])
end
puts "请选择项目 (0取消)"
id = STDIN.gets.to_i
if id==0 then
nil
else
id
end
end
# 选择镜像,不存在返回nil
def image_select
hash = Hash.new
images = Docker::Image.all
index = 0
images.each do |img|
image = img.info['RepoTags'][0].to_s
if image != "<none>:<none>" then
index += 1
hash[index] = image
printf("%-2s %-15s\n", index, image);
end
end
puts "请选择镜像 (0取消)"
id = STDIN.gets.to_i
if id==0 then
nil
else
hash[id]
end
end
def redeploy(id)
project = get_project_by_id(id)
if project then
system("docker rm -f #{project['container']}")
command = "docker run -d --restart=always --name #{project['container']}"
command+= " -p #{project['port']}:80"
command+= " -v #{project['volume']}"
command+= " #{project['limit']}"
command+= " #{project['image']}"
system(command)
end
end
def color_print(text, color)
if color == "white" then
puts "\033[1m#{text}\033[0m"
elsif color == "yellow"
puts "\033[33m#{text}\033[0m"
elsif color == "green"
puts "\033[32m#{text}\033[0m"
end
end
# 备份仙姑
def backup(id)
proj = get_project_by_id(id)
time = Time.new
filename = proj["name"] + "_" + time.strftime("%y%m%d-%H%M%S") + ".tar.gz"
success = system("tar -C /www -czf backups/#{filename} #{proj['name']} 2>/dev/null")
if success then
# 添加备份记录
id = get_sequence
data = Hash.new
data["id"] = get_sequence
data["pid"] = proj['id']
data["filename"] = filename
data["time"] = time.strftime("%Y-%m-%d %H:%M:%S")
#data["size"] = File.size("backups/"+filename)
data["size"] = `du -h backups/#{filename}|awk '{print $1}'`.rstrip
add_backup_redord(data)
else
# 失败后删除备份文件
system("rm -f backups/#{filename}")
end
end
def get_backup_records
parse_json_file("backups")
end
def get_backup_record_by_id(id)
if id!=nil then
backups = get_backup_records
backups.each do |b|
if b['id'] == id then
return b
end
end
end
end
# 添加备份记录
def add_backup_redord(data)
json = parse_json_file("backups")
file = db_file("backups")
if data then
json.push data
File.open(file, 'w') do |f|
f.puts json.to_json
end
end
end
# 删除备份
def del_backup(id)
b = get_backup_record_by_id(id)
if b then
success = system("rm backups/#{b['filename']}")
if success then
bs = get_backup_records
bs.delete_if { |back| back['id'] == id }
file = db_file("backups")
File.open(file, 'w') do |f|
f.puts bs.to_json
end
end
end
end