-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
256 lines (189 loc) · 7.05 KB
/
main.py
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
import os
import subprocess
import random
import socket
from flask import *
app = Flask(__name__,static_folder="./static")
#コマンドのidとその時に実行する関数を紐づける
#$(spl%)はメタ文字
#[コマンドid]$(spl%)[その時に実行する機能など]$(cmd%)その機能の中で実行する機能
#command_id$(spl%)function(cmd%)content/command
#例
#cmd1$(spl%)os_cmd$(cmd%)start chrome
#id&コマンドは改行で区切られる
id_list_path = "./id_list.csv"
#id_list.csvがなかったら作成
if os.path.isfile(id_list_path) == False:
f = open(id_list_path,"w")
f.write("")
f.close()
pass
@app.route("/")
def main():
return redirect("/static/main/index.html")
#id_list.csvを返す
@app.route("/id_list")
def id_list_csv():
f = open("./id_list.csv","r")
f_content = str(f.read())
f.close()
response = make_response(f_content)
response.headers["Content-Type"] = "text/plain"
return response
#コマンド登録ページ(仮) http://localhost:5000/static/register/index.html
#メインページ http://localhost:5000/static/main/index.html
#コマンドを登録(post)
@app.route("/reg/post/", methods=["GET", "POST"])
def make_command():
cmd_id = str(request.form["id"]) #command id
cmd_func = str(request.form["func"]) #function
cmd_content = str(request.form["cmd"]).replace("\n","$(n%)").replace("\r","") #command #改行を$(n%)に変換
this_id = add_id(cmd_id,cmd_func+"$(cmd%)"+cmd_content) #ファイルに追加
return redirect("/static/main/index.html")
#コマンドを編集(post)
#そのコマンドを一旦削除→
#新規作成を行う
@app.route("/edit/post/", methods=["GET", "POST"])
def edit_command():
cmd_id = str(request.form["id"]) #command id
cmd_func = str(request.form["func"]) #function
cmd_content = str(request.form["cmd"]).replace("\n","$(n%)").replace("\r","") #command
del_id(cmd_id)
this_id = add_id(cmd_id,cmd_func+"$(cmd%)"+cmd_content) #ファイルに追加
return redirect("/static/main/index.html")
#コマンドを消す
@app.route("/del/post/<cmd_id>")
def delete_command(cmd_id):
del_id(cmd_id)
return "succeed!"
#コマンド実行についてのメタ文字
# ^^param_name^^ urlのクエリparam_nameを取得してそこに入れる
#例
#cmd1$(spl%)os_cmd$(cmd%)start ^^p1^^
#/run/cmd1?p1=explorer にアクセスした場合
#os_cmd$(cmd%)start ^^p1^^ から
#os_cmd$(cmd%)start explorer に変換
#start explorer が実行される
#/run/[command_id]
#コマンド実行
@app.route("/run/<cmd_id>",methods=["GET"])
def run_command(cmd_id):
f = open(id_list_path,"r")
list_line = f.readlines() #一行ずつ読む
f.close()
ret_msg = ""
for i in list_line:
if cmd_id == i.split("$(spl%)")[0]:
#cmd_idと関連付けされた機能が見つかったら
#関連付けされた機能を実行
ret_msg = run_function(i.split("$(spl%)")[1],request.args)
break;
pass
pass
return ret_msg
#commandを消す
#消したいcommand id
def del_id(cmd_id):
global id_list_path
#重複していたら削除
f = open(id_list_path,"r")
list_line = f.readlines() #一行ずつ読む
f.close()
for i in range(len(list_line)):
if cmd_id == list_line[i].split("$(spl%)")[0]:
list_line.pop(i)
break;
pass
pass
write_file = ""
for i in list_line:
write_file += i+"\n"
pass
f = open(id_list_path,"w")
f.write(write_file)
f.close()
pass
#csvファイルにidと機能の関連付けを追加
#idが重複しているときはやめる return "filename_error"
#idに何も入力されていない場合はランダム
def add_id(cmd_id,cmd_func):
global id_list_path
#空白の場合はランダムにidを作成
if cmd_id == "":
ab_list = [chr(ord("A")+i) for i in range(26)] #A~Zが並べられたリストを作成
for i in range(26):
ab_list.append(chr(ord("a")+i))
pass
#20文字のidをA~Zでランダムに作成
for i in range(20):
cmd_id += ab_list[random.randint(0,51)]
pass
pass
#重複していたらやめる
f = open(id_list_path,"r")
list_line = f.readlines() #一行ずつ読む
f.close()
ret_msg = ""
for i in list_line:
if cmd_id == i.split("$(spl%)")[0]:
return "filename_error" #ファイル名が重複した場合filename_errorを返す
break;
pass
pass
#追加
f = open(id_list_path,"a")
f.write("{0}$(spl%){1}\n".format(cmd_id,cmd_func))
f.close()
this_id = "{0}".format(cmd_id)
return this_id #idを返す
#機能を実行
#funcはコマンド, paramはコマンド実行についてのメタ文字を参照
#$(cmd%)でそれぞれを区切る
#command_name$(cmd%)contents$(cmd%)param1$(cmd%)param2
#例
#os_cmd$(cmd%)python main.py
def run_function(func,param):
print(func)
print("succeed!")
#^^param^^ のメタ文字をクエリから取得した文字に変換
#param.get("クエリの名前","")
func_meta = func.split("^^")
func = ""
print(param)
for i in range(len(func_meta)):
if i % 2 == 1: #奇数ならメタ文字
print(func_meta[i])
func += param.get(func_meta[i],"")
pass
else:
func += func_meta[i]
pass
#コマンドを実行する処理
func_list = func.split("$(cmd%)")
return_text = ""
#コマンド名を判断し、実行
if func_list[0].find("os_cmd") != -1: #osコマンド(cmd bashなど)
run_text = func_list[1].split("$(n%)") #改行で区切って実行
for run_cmd in run_text: #一行ずつコマンド実行
return_text = subprocess.run(run_cmd,shell=True,check=True,stdout=subprocess.PIPE).stdout.decode('utf-8')
pass
pass
elif func_list[0].find("open") != -1: #open application
subprocess.Popen(["start", func_list[1]], shell=True)
pass
elif func_list[0].find("write_file") != -1:#write file
run_text = func_list[1].split("$(n%)") #$(n%) は改行なので区切る
file_text = ""
for i in range(len(run_text)-1): #2行目以降はファイルの内容
file_text += run_text[i+1]+"\n"
pass
f = open(run_text[0],"w") #1行目はfile path
f.write(file_text)
f.close()
pass
##############
print("function: "+func+" succeed!")
response = make_response(return_text)
response.headers["Content-Type"] = "text/plain"
return response
app.run(host="0.0.0.0",port=5000)