-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconsole.py
More file actions
198 lines (161 loc) · 6.2 KB
/
console.py
File metadata and controls
198 lines (161 loc) · 6.2 KB
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
#coding=utf8
import sys, os, getopt
from sc.parser import SCParser
from sim_analyzer.detailed import DetailedAnalyzer
from sim_analyzer.fast import FastAnalyzer
from detector import PlagiarismDetector
from logger import Logger
from repository import Repository
import time
#####################################
find_funcs = False
find_progs = False
save_program = False
output = False
out_dir = 'out'
in_dir_prefix = 'c_files/'
in_dir = None
target_progs = None
db_clear= False
db_info = False
#####################################
def usage():
print u"""
Возможные параметры:
[-h|--help] - вызов справки
[-m] - режим поиска плагиата [f|p|a]:
f - поиск схожих функций
p - поиск схожих программ
b - поиск сходих функций и программ
[-s] - флаг для сохранения найденных программ в базе данных
[-o] - флаг для выгрузки найденных схожих исходных кодов в папку %s'
[-i [dir]] - установка папки, для поиска исходных кодов (поиск в папке с_files/[dir])
[--db-info] - информация о базе данных
[--db-clear] - удаление всех имеющихся в базе данных программ
""" % out_dir
#####################################
try:
opts, args = getopt.getopt(sys.argv[1:], 'i:om:sh', ['db-clear', 'db-info', 'help'])
except:
print u'Неверные параметры'
usage()
sys.exit(0)
for opt,arg in opts:
if opt == '-m':
if arg == 'f':
find_funcs = True
elif arg == 'p':
find_progs = True
elif arg == 'b':
find_funcs = True
find_progs = True
else:
print u'Неправильный режим -m=[f|p|a]'
elif opt == '-s':
save_program = True
elif opt == '-o':
output = True
elif opt == '-i':
in_dir = in_dir_prefix + arg
if os.path.exists(in_dir) == False:
print u'Невозможно открыть папку [%s] с исходными кодами программ.' % in_dir
sys.exit(0)
else:
print u'Поиск исходных текстов в папке [%s]...' % in_dir
target_progs = SCParser.scan_for_programs(in_dir, in_dir_prefix)
print u'Найдено %d программ.\r\n' % (len(target_progs))
elif opt == '--db-clear':
db_clear = True
elif opt == '--db-info':
db_info = True
elif opt in ('-h', '--help'):
usage()
sys.exit(0)
#####################################
logger = Logger('data/log.log')
fast_analizer = FastAnalyzer()
fast_analizer.set_logger(logger)
detailed_analizer = DetailedAnalyzer()
detailed_analizer.set_logger(logger)
repo = Repository('data/db.db')
detector = PlagiarismDetector(fast_analizer, detailed_analizer, repo)
detector.set_logger(logger)
detector.set_minimal_sim_values(0.5, 0.8)
#####################################
sim_progs = []
if find_progs and target_progs:
start = time.time()
print u'Поиск схожих программ:'
for target in target_progs:
print u'Поиск для программы [%s]...' % target.name
data = detector.find_sim_progs(target)
if data:
print u'Схожые программы:'
for prog,fast,detail in data:
print u'Программа [%s], схожесть = %.2f.' % (prog.name, detail)
sim_progs.append({
'p1': target.name,
'p2': prog.name,
'sim': detail,
})
if output:
print detector.extract_programs(target, data, out_dir)
else:
print u'Не найдено.'
print ''
print u'Завершено.\r\n'
find_progs_time = time.time() - start
sim_funcs = []
if find_funcs and target_progs:
start = time.time()
print u'Поиск схожих функций:'
for target_prog in target_progs:
for target in target_prog.functions:
print u'Поиск для функции [%s][%s]...' % (target_prog.name, target.name)
data = detector.find_sim_funcs(target)
if data:
print u'Схожие функции:'
for prog,func,fast,detail in data:
print u'Функция [%s][%s], схожесть = %.2f.' % (prog.name, func.name, detail)
sim_funcs.append({
'p1': target_prog.name,
'f1': target.name,
'p2': prog.name,
'f2': func.name,
'sim': detail,
})
if output:
print detector.extract_functions(target_prog, target, data, out_dir)
else:
print u'Не найдено.'
print ''
print u'Завершено.\r\n'
find_funcs_time = time.time() - start
if save_program and target_progs:
print u'Сохранение программ в базе данных...'
detector.save_progs(target_progs)
print u'Завершено.\r\n'
if db_clear:
print u'Опустошение базы данных...'
detector.clear()
print u'Завершено.\r\n'
if db_info:
print u'Информация о базе данных:'
print detector.info()
print u'Завершено.\r\n'
if find_progs or find_funcs:
print u'Вывод:'
if sim_progs or sim_funcs:
if sim_progs:
print u'Схожие программы: %f' % (find_progs_time)
for d in sim_progs:
print u'[%s] и [%s] на %0.2d%%' % (d['p1'], d['p2'], d['sim'] * 100)
print u''
if sim_funcs:
print u'Схожие функции: %f' % (find_funcs_time)
for d in sim_funcs:
print u'[%s][%s] и [%s][%s] на %0.2d%%' % (d['p1'], d['f1'], d['p2'], d['f2'], d['sim'] * 100)
print u''
else:
print u'Сходств не обнаружено'
print u'Завершено.\r\n'