15
15
import requests
16
16
import re
17
17
import threading
18
+ import argparse
18
19
from cobra .log import logger
19
20
from cobra .config import code_path , Config
21
+ from cobra .__version__ import __epilog_git__ , __introduction_git__
20
22
21
23
try :
22
24
# Python 3
25
27
# Python 2
26
28
import Queue as queue
27
29
28
-
29
30
git_urls = []
30
31
31
32
32
- def start ():
33
+ def start (target , format , output , rules , dels , all ):
34
+ """
35
+ start push target to api
36
+ :param target:
37
+ :param format:
38
+ :param output:
39
+ :param rules:
40
+ :param dels:
41
+ :param all:
42
+ :return:
43
+ """
33
44
url = Config ('git' , 'gitlab_url' ).value
34
45
private_token = Config ('git' , 'private_token' ).value
35
46
cobra_ip = Config ('git' , 'cobra_ip' ).value
36
47
key = Config ('cobra' , 'secret_key' ).value
37
48
threads = []
38
- pages = get_pages (url , private_token )
39
- q_pages = queue .Queue (pages )
40
49
result_path = code_path + '/result_sid'
41
- fi = open (result_path , 'w+' )
42
- for i in range (int (pages )):
43
- q_pages .put (i + 1 )
50
+ fi = open (result_path , 'a+' )
44
51
45
- for i in range (10 ):
46
- thread = threading .Thread (target = get_git_urls , args = (url , private_token , q_pages , fi ))
47
- thread .start ()
48
- threads .append (thread )
52
+ try :
53
+ if all is False and target is not '' :
54
+ if isinstance (target , list ):
55
+ for tar in target :
56
+ fi .write (tar + '\n ' )
57
+ else :
58
+ fi .write (target + '\n ' )
49
59
50
- for thread in threads :
51
- thread .join ()
60
+ res = push_to_api (target , cobra_ip , key , fi , format , output , rules , dels )
52
61
53
- res = push_to_api (git_urls , cobra_ip , key , fi )
62
+ elif all is True and target is '' :
63
+ pages = get_pages (url , private_token )
64
+ q_pages = queue .Queue (pages )
54
65
55
- if res :
56
- logger .info ("Git push success: {}" .format (len (git_urls )))
57
- else :
58
- logger .info ("Git push fail" )
66
+ for i in range (int (pages )):
67
+ q_pages .put (i + 1 )
68
+
69
+ for i in range (10 ):
70
+ thread = threading .Thread (target = get_git_urls , args = (url , private_token , q_pages , fi ))
71
+ thread .start ()
72
+ threads .append (thread )
73
+
74
+ for thread in threads :
75
+ thread .join ()
76
+
77
+ res = push_to_api (git_urls , cobra_ip , key , fi , format , output , rules , dels )
78
+
79
+ else :
80
+ res = False
81
+
82
+ if res :
83
+ logger .info ("[GIT-PRO] Git push success" )
84
+ logger .info ("[GIT-PRO] All projects have been pushed" )
85
+ else :
86
+ logger .warning ("[GIT-PRO] Git push fail" )
87
+
88
+ fi .close ()
89
+
90
+ except requests .exceptions .MissingSchema :
91
+ logger .warning ('[GIT-PRO] Please write gitlab_url and private_token in config file' )
59
92
60
- fi .close ()
61
- logger .info ("All projects have been pushed" )
93
+ except requests .exceptions .ConnectionError :
94
+ logger .warning ('[GIT-PRO] Please check the cobra_ip or gitlab_url is right' )
95
+
96
+ except requests .exceptions .InvalidSchema :
97
+ logger .warning ('[GIT-PRO] Please add http:// before the cobra_ip or gitlab_url' )
98
+
99
+ except Exception as e :
100
+ logger .warning ('[GIT-PRO] {}' .format (e .message ))
62
101
63
102
64
103
def get_git_urls (url , private_token , q_pages , fi ):
@@ -90,39 +129,69 @@ def get_git_urls(url, private_token, q_pages, fi):
90
129
git_urls .append (request_url )
91
130
92
131
elif r .status_code == 404 :
93
- logger .warning ("page %d 404" % page )
132
+ logger .warning ("[GIT-PRO] page %d 404" % page )
94
133
95
134
else :
96
- logger .warning ("page %d is %d" % page , r .status_code )
135
+ logger .warning ("[GIT-PRO] page %d is %d" % page , r .status_code )
97
136
q_pages .task_done ()
98
137
99
138
100
139
def request_target (target_url , params = None , header = None , method = "get" ):
140
+ """
141
+ start request
142
+ :param target_url:
143
+ :param params:
144
+ :param header:
145
+ :param method:
146
+ :return:
147
+ """
101
148
if method == "get" :
102
149
response = requests .get (url = target_url , params = params , headers = header )
103
150
return response
151
+
104
152
if method == "post" :
105
153
response = requests .post (url = target_url , data = json .dumps (params ), headers = header )
106
154
return response
107
155
108
156
109
- def push_to_api (urls , cobra_ip , key , fi ):
157
+ def push_to_api (urls , cobra_ip , key , fi , format , output , rules , dels ):
158
+ """
159
+ :param urls:
160
+ :param cobra_ip:
161
+ :param key:
162
+ :param fi:
163
+ :param format:
164
+ :param output:
165
+ :param rules:
166
+ :param dels:
167
+ :return:
168
+ """
110
169
headers = {"Content-Type" : "application/json" }
111
170
url = cobra_ip + "/api/add"
112
- payload = {"key" : key , "target" : urls , "dels" : True , "rule" : "cvi-190009" }
171
+ payload = {"key" : key , "target" : urls , "dels" : dels , "formatter" : format , "output" : output ,
172
+ "rule" : rules }
113
173
r = request_target (url , payload , headers , method = "post" )
174
+
114
175
if r .status_code == 200 :
115
176
fi .write (str (r .json ()) + '\n ' )
116
- logger .info (r .json ())
177
+ logger .info ('[GIT-PRO] ' + str ( r .json () ))
117
178
return True
179
+
118
180
elif r .status_code == 404 :
119
- logger .info ("The page is 404" )
181
+ logger .info ("[GIT-PRO] The page is 404" )
182
+
120
183
else :
121
- logger .info (r .json ())
184
+ logger .info ('[GIT-PRO] ' + str ( r .json () ))
122
185
return False
123
186
124
187
125
188
def get_pages (url , private_token ):
189
+ """
190
+ get the pages num
191
+ :param url:
192
+ :param private_token:
193
+ :return:
194
+ """
126
195
params = {"private_token" : private_token }
127
196
response = request_target (url , params )
128
197
res = response .headers ['link' ].split ("," )
@@ -132,5 +201,42 @@ def get_pages(url, private_token):
132
201
return pages
133
202
134
203
204
+ def _check_rule_name (name ):
205
+ return re .match (r'^(cvi|CVI)-\d{6}(\.xml)?' , name .strip ()) is not None
206
+
207
+
135
208
if __name__ == '__main__' :
136
- start ()
209
+ special_rules = []
210
+
211
+ parser = argparse .ArgumentParser (prog = 'git_projects' , epilog = __epilog_git__ , description = __introduction_git__ , formatter_class = argparse .RawDescriptionHelpFormatter )
212
+ parser .add_argument ('-t' , '--target' , dest = 'target' , action = 'store' , default = '' , metavar = '<target>' , help = 'The git address or git list, e.g: test/vul/v.php,test/vul/v.java' )
213
+ parser .add_argument ('-f' , '--format' , dest = 'format' , action = 'store' , default = 'json' , metavar = '<format>' , choices = ['json' , 'csv' , 'xml' ], help = 'report output format' )
214
+ parser .add_argument ('-o' , '--output' , dest = 'output' , action = 'store' , default = '' , metavar = '<output>' , help = 'report output STREAM, FILE, HTTP API URL, MAIL' )
215
+ parser .add_argument ('-r' , '--rule' , dest = 'rules' , action = 'store' , default = None , metavar = '<rule_id>' , help = 'specifies rules e.g: CVI-100001,cvi-190001' )
216
+ parser .add_argument ('-d' , '--dels' , dest = 'dels' , action = 'store_true' , default = False , help = 'del target directory True or False' )
217
+ parser .add_argument ('-a' , '--all' , dest = 'all' , action = 'store_true' , default = False , help = 'Git push all git-projects from gitlab' )
218
+ args = parser .parse_args ()
219
+
220
+ if args .target == '' and args .all is False :
221
+ parser .print_help ()
222
+ exit ()
223
+
224
+ if ',' in args .target :
225
+ targets = args .target .split (',' )
226
+ else :
227
+ targets = args .target
228
+
229
+ try :
230
+ if ',' in args .rules :
231
+ rules = args .rules .split (',' )
232
+ for rule in rules :
233
+ if _check_rule_name (rule ) is False :
234
+ logger .critical ('[GIT-PRO] Exception special rule name(e.g: CVI-110001): {sr}' .format (sr = rule ))
235
+ else :
236
+ if _check_rule_name (args .rules ) is False :
237
+ logger .critical ('[GIT-PRO] Exception special rule name(e.g: CVI-110001): {sr}' .format (sr = args .rules ))
238
+
239
+ except TypeError :
240
+ logger .info ('[GIT-PRO] The rules is None, Cobra will use all rules to scan' )
241
+
242
+ start (targets , args .format , args .output , args .rules , args .dels , args .all )
0 commit comments