· 8 years ago · Oct 04, 2017, 12:54 PM
1@Echo Off
2SetLocal EnableDelayedExpansion
3:: Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ проверки
4Set StartedAt=%Time%
5Set Data=%*
6:Next
7For /F "tokens=1,* delims=;" %%A In ("%Data%") Do (
8 For /F "tokens=1,2 delims==" %%C In ("%%A") Do (Set $%%C=%%D)
9 If Not "%%B"=="" Set Data=%%B&GoTo :Next
10)
11If Not Defined H-Cookie Set "H-Cookie=dummy"
12Set H-Cookie|Findstr /C:"<" /C:">" /C:"&" /C:"|" /C:^"\^"^" /C:"(" /C:")" /C:"\^">nul&&(Call HTTP302Header err_badcookie&Exit)
13For %%A In ("%H-Cookie:;=" "%") Do For /F "tokens=1,* delims== " %%A In ("%%~A") Do Set "C-%%A=%%B"
14If Not Defined C-Code Set "LoginStatus=err_nosession" & GoTo :Back
15For %%A In (User Access LastSeen) Do Set "%%A="
16For /F "tokens=1-3 delims=|" %%A In ('Call GetUserInfo %H-REMOTE_ADDR% %C-Code%') Do (
17 Set "User=%%A"
18 Set "Access=%%B"
19 Set "LastSeen=%%C"
20)
21If Not Defined Access Set "LoginStatus=err_nosession" & GoTo :Back
22If %Access% LSS 5 Set "LoginStatus=err_noaccess" & GoTo :Back
23
24Set RDPUser=Username
25Set RDPPassword=Password
26Set PrintServerIP=192.168.0.201
27Set DB=%__ServerRoot%\data\printlog.db
28Set Table=printlog-%date:~3%
29Set Logs=%__ServerRoot%\data\printlogs
30Set Names[]="ВаÑÑ ÐŸÑƒÐ¿ÐºÐ¸Ð½","Ðнтон БезымÑнный","Иван Иванов","ВаÑиÑуалий Шишкин","John Doe"
31rem NetBIOS, IPv4 или IPv6
32Set Fingerprints[]="PC-1=ВаÑÑ ÐŸÑƒÐ¿ÐºÐ¸Ð½",^
33 "192.168.0.201=ВаÑÑ ÐŸÑƒÐ¿ÐºÐ¸Ð½",^
34 "PC-2=Ðнтон БезымÑнный",^
35 "[fe80::b42b:9127:da45:f59a]=Ðнтон БезымÑнный",^
36 "192.168.0.202=Ðнтон БезымÑнный",^
37 "PC-3=Иван Иванов",^
38 "[fe80::54c9:58d0:96c0:d848]=Иван Иванов",^
39 "[fe80::d82c:38a3:8667:9eb]=Иван Иванов",^
40 "192.168.0.203=Иван Иванов",^
41 "PC-4=ВаÑиÑуалий Шишкин",^
42 "[fe80::3c4c:209a:9b62:56ad]=ВаÑиÑуалий Шишкин",^
43 "192.168.0.204=ВаÑиÑуалий Шишкин",^
44 "DIRECTOR=John Doe",^
45 "[fe80::d92f:f9a6:10b9:fcbd]=John Doe",^
46 "192.168.0.200=John Doe"
47
48
49rem КлиентÑкий Ñкрипт копирует логи через $D
50psexec -accepteula -n 3 -u %RDPUser% -p %RDPPassword% -s \\%PrintServerIP% cmd /c printlog >nul 2>nul
51
52Call :CheckDatabase
53Call :GetDatabaseTables
54Call :GetLastTimestamp
55If Defined $page If Defined table[%$page%] (
56 Set Table=!table[%$page%]!
57 Set active_table=%$page%
58)
59For /F "tokens=2 delims=-" %%A In ("%Table%") Do Set LogVisibleDate=%%A
60
61:AddLogsToDB
62For /F "skip=2 tokens=1,3-4,6-7 delims=," %%A In ('type "%Logs%\monthly.log"^|sort /R') Do (
63 For /F "delims=" %%T In ('Call TimeToUnix %%A') Do Set timestamp=%%T
64 If !timestamp! LEQ !Last! GoTo :break
65 rem Set "author=%%E"
66 Set docname=%%~D
67 Set docname=!docname:^|=!
68 Set docname=!docname:^<=!
69 Set docname=!docname:^>=!
70 Set docname=!docname:^&=!
71 For /F "delims=" %%N In ('Echo !docname!^|recode cp1251..utf-8') Do Set document=%%N
72 For %%X In (%Fingerprints[]%) Do (
73 For /F "tokens=1,* delims==" %%M In ("%%~X") Do (
74 If "%%E" == "%%~M" Set "author=%%~N"
75 )
76 )
77 Echo INSERT INTO `%Table%` ^(timestamp, time, pages, copies, document, author^) VALUES ^(!timestamp!, "%%A", %%B, %%C, "!document!", "!author!"^);|sqlite3 "%DB%"
78)
79:break
80
81:Stats
82Set Users=0
83Set Total.pages=0
84For %%N In (%Names[]%) Do (
85 Set /A Users+=1
86 Set User_!Users!.name=%%~N
87 Set User_!Users!.documents=0
88 Set User_!Users!.pages=0
89 For /F "tokens=1-2 delims=|" %%A In ('Echo SELECT `pages`^, `copies` FROM `%Table%` WHERE `author` like "%%~N"^;^|sqlite3 "%DB%"') Do (
90 Set /A User_!Users!.documents+=1
91 Set /A User_!Users!.pages+=%%A*%%B
92 Set /A Total.pages+=%%A*%%B
93 )
94)
95
96For /F "delims=" %%A In ('GetLocalPath "%~dp0"') Do Set "LocalPath=%%A"
97rem Call RecompileTemplates
98Call HTTP200Header
99Call Include HTMLHeader "Title:СтатиÑтика печати за %LogVisibleDate%"
100Call Include Menu "cpanel:true;login:true;Username:%User%;Self:%LocalPath%;Code:%C-Code%"
101Call :MakeJSON
102Call Include-rawJSON PrintLog "%JSONFile%"
103For /F "delims=" %%A In ('LoadTimer %StartedAt%') Do (Set ExecTime=%%A)
104Call Include Footer "PerformanceData:%ExecTime%;ExecutableName:%~nx0;ServerVersion:%__OWS_version%"
105Call Include HTMLEnd
106Exit
107
108:MakeJSON
109Set JSONFile=%Temp%\printlog_%random%%C-Code%.json
110<Nul Set /P Echo="{"Users":[">"%JSONFile%"
111For /L %%X In (1,1,!Users!) Do (
112 <Nul Set /P Echo="{"
113 <Nul Set /P Echo=""ID":"%%X","Name":"!User_%%X.name!","Docs":"!User_%%X.documents!","Pages":"!User_%%X.pages!""
114 If "!Users!"=="%%X" (<Nul Set /P Echo="}") Else (<Nul Set /P Echo="},")
115)>>"%JSONFile%"
116<Nul Set /P Echo="],"TotalPages":"!Total.pages!",">>"%JSONFile%"
117
118Set i=0
119Set Docs=0
120For /F "delims=" %%X In ('Echo SELECT `id` FROM `%Table%`^;^|sqlite3 "%DB%"') Do (Set /A Docs+=1)
121<Nul Set /P Echo=""Documents":[">>"%JSONFile%"
122For /F "tokens=1-5 delims=|" %%A In ('Echo SELECT `time`^, `author`^, `pages`^, `copies`^, `document` FROM `%Table%` ORDER BY `timestamp` DESC^;^|sqlite3 "%DB%"') Do (
123 Set /A i+=1
124 <Nul Set /P Echo="{"
125 <Nul Set /P Echo=""Timestamp":"%%A","User":"%%B","Pages":"%%C","Copies":"%%D","Filename":"%%E""
126 If "!Docs!"=="!i!" (<Nul Set /P Echo="}") Else (<Nul Set /P Echo="},")
127)>>"%JSONFile%"
128<Nul Set /P Echo="],"LogPages":"%table[index]%","ActiveLogPage":"%active_table%","LogVisibleDate":"%LogVisibleDate%","Session":"%C-Code%"}">>"%JSONFile%"
129Exit /B
130
131
132
133:CheckDatabase
134:: ПроверÑем наличие БД и Ñоздаём при надобноÑти
135Echo CREATE TABLE IF NOT EXISTS `%Table%` (^
136 `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,^
137 `timestamp` BIGINT,^
138 `time` TEXT,^
139 `pages` INT,^
140 `copies` INT,^
141 `document` TEXT,^
142 `author` TEXT^
143);|sqlite3 "%DB%"
144Exit /B
145
146:GetDatabaseTables
147Set table[index]=0
148Set active_table=1
149For /F "delims= tokens=*" %%A In ('Echo SELECT name FROM sqlite_master WHERE name LIKE "printlog-%%" AND type ^= "table" ORDER BY name ASC^;^|sqlite3 "%DB%"') Do (
150 Set /A table[index]+=1
151 Set table[!table[index]!]=%%A
152 If "%%A" == "%Table%" Set active_table=!table[index]!
153)
154Exit /B
155
156:GetLastTimestamp
157Set "Last="
158For /F "delims=" %%A In ('Echo SELECT `timestamp` FROM `%Table%` ORDER BY `timestamp` DESC LIMIT 1^;^|sqlite3 "%DB%"') Do (Set Last=%%A)
159If Not Defined Last Set Last=1400000000
160Exit /B
161
162:Back
163:: Логгируем ошибки и редиректим
164If "%LoginStatus%"=="err_noaccess" Echo [%Date% %Time:~,8%] [IP:%H-REMOTE_ADDR%] tried to execute "%~nx0" with access level "%Access%">>"%__ServerRoot%\%__AccessLogFile%"
165If "%LoginStatus%"=="err_nosession" Echo [%Date% %Time:~,8%] Can't validate session token [Code:"%C-Code%"] for access [IP:%H-REMOTE_ADDR%] to "%~nx0">>"%__ServerRoot%\%__AccessLogFile%"
166If "%LoginStatus%"=="err_nosession" Call HTTP302Header-nosession
167If "%LoginStatus%"=="err_noaccess" Call HTTP302Header err_noaccess
168Exit