ResourceWatcherFSM.cpp 183 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961
  1. #include "stdafx.h"
  2. #include "ResourceWatcherFSM.h"
  3. #include "DeviceBaseClass.h"
  4. #include <string.h>
  5. #include <string>
  6. #include <assert.h>
  7. #include <algorithm>
  8. #include "fileutil.h"
  9. #include <ctime>
  10. #include "CommEntityUtil.hpp"
  11. #include "SpUtility.h"
  12. #include "RestfulFunc.h"
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <vector>
  16. #include "ResourceWatcher_UserCode.h"
  17. #ifdef RVC_OS_LINUX
  18. #include <vector>
  19. #include <dirent.h>
  20. #include <sstream>
  21. #include <fstream>
  22. #include <iostream>
  23. #include "publicFunExport.h"
  24. #include "toolkit.h"
  25. #include "iniutil.h"
  26. #include "osutil.h"
  27. #else
  28. #include <intrin.h>
  29. #include <ShlObj.h>
  30. #include <ShellAPI.h>
  31. #include <Pdh.h>
  32. #include <io.h>
  33. #include <direct.h>
  34. #include "memutil.h"
  35. #include "array.h"
  36. #include <Windows.h>
  37. #include <wintrust.h>
  38. #include <direct.h>
  39. #include <Mscat.h>
  40. #include <Softpub.h>
  41. #include <wlanapi.h>
  42. #include <Netlistmgr.h> //网络检测添加
  43. #include <psapi.h>
  44. #include <tlhelp32.h>
  45. #include "Mmdeviceapi.h"
  46. #include "Propidl.h"
  47. #include "Functiondiscoverykeys_devpkey.h"
  48. #pragma comment(lib, "pdh.lib")
  49. #pragma comment(lib,"winmm.lib" )
  50. #pragma comment(lib, "shell32.lib")
  51. #pragma comment(lib, "Wintrust.lib")
  52. #pragma comment(lib, "crypt32.lib")
  53. #pragma comment(lib, "wlanapi.lib")
  54. #endif
  55. //硬件信息搜集参数
  56. #define DEFAULT_HARDWARE_CHECK_TIME 60 * 1000 //CPU、内存扫描默认间隔,1分钟
  57. #define TIMER_HARDWARE_CHECK 2
  58. //硬盘扫描
  59. #define DEFAULT_DISK_CHECK_TIME 4 * 60 * 60 * 1000 //硬盘默认4小时扫描一次
  60. #define TIMER_DISK_CHECK 3
  61. //保留版本数目
  62. #define DEFAULT_VERSION_SAVED_COUNT 5
  63. #define MAX_VERSION_PATH 256
  64. //一天的秒数,用于计算文件时间
  65. const int SECONDS_OF_DAY = 60 * 60 * 24;
  66. const int VIDEO_DEFAULT_BACKDAYS = 30;
  67. #ifdef RVC_OS_LINUX
  68. #define PROCESS_ITEM 14 //进程CPU信息读取位置参数
  69. const int MAX_MAINLINK_CHECK_TIME = 5000;
  70. const int TIMER_MAINLINK_CHECK = 4;
  71. #else
  72. const int TIMER_ID_CLEARVIDEO_ENHANCE = 1;
  73. const int THOUSAND = 1024;
  74. const int MILLION = 1048576;
  75. #endif // RVC_OS_LINUX
  76. static int hardwareCheckTime = 60 * 1000; //初始化硬件检测间隔
  77. static int hardwareCheckFlag = 1;
  78. static int cpuWarnTime = 0;
  79. static int cpuWarnThreshold = 10;
  80. static int memWarnTime = 0;
  81. static int memWarnThreshold = 10; //初始化CUP、内存告警阈值次数
  82. static int diskCheckTime = 4 * 60 * 60 * 1000; //初始化硬盘检测间隔
  83. static int diskCheckFlag = 1;
  84. #define DIV (1024 * 1024)
  85. #define DAY_DIV (24 * 60 * 60)
  86. #define HOURS_DIV (60 * 60)
  87. #define MINUS_DIV (60)
  88. #ifndef RVC_OS_LINUX
  89. #define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
  90. #define SafeDeleteArraySize(pData) { if(pData){delete []pData;pData=NULL;} }
  91. #endif // !RVC_OS_LINUX
  92. #define STARTUP_DIR_FULL_PATH "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp"
  93. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  94. const char* CMB_LINK_FILE_NAME = "招商银行可视柜台(ST测试).lnk";
  95. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  96. const char* CMB_LINK_FILE_NAME = "招商银行可视柜台(UAT测试).lnk";
  97. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  98. const char* CMB_LINK_FILE_NAME = "招商银行可视柜台.lnk";
  99. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  100. const char* CMB_LINK_FILE_NAME = "招商银行可视柜台(开发).lnk";
  101. #else/*本地编译等非DevOps环境编译的版本*/
  102. const char* CMB_LINK_FILE_NAME = "招商银行可视柜台.lnk";
  103. #endif
  104. const char* STRATUP_FILENAME_FROM_SCRIPTS = "spexplorerauto.lnk";
  105. #if defined(RVC_OS_WIN)
  106. void GetCurUserName(CSimpleStringA& strUserName)
  107. {
  108. strUserName.Clear();
  109. const DWORD INFO_BUFFER_SIZE = 128;
  110. char infoBuf[INFO_BUFFER_SIZE];
  111. ZeroMemory(infoBuf, INFO_BUFFER_SIZE);
  112. DWORD bufCharCount = INFO_BUFFER_SIZE;
  113. if (!GetUserName(infoBuf, &bufCharCount)) {
  114. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetUserName failed, GLE=%u", GetLastError());
  115. }
  116. else {
  117. strUserName = infoBuf;
  118. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("User name:%s", strUserName.GetData());
  119. }
  120. }
  121. static void GetUserDesktopDirectory(CSimpleStringA& outDir)
  122. {
  123. LPITEMIDLIST lp;
  124. SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &lp);
  125. CHAR lstr[128] = "";
  126. SHGetPathFromIDList(lp, lstr);
  127. outDir = lstr;
  128. return;
  129. }
  130. void GetAutoStartFile(std::string& userDirPath, std::vector<std::string>& userDirFiles, std::string& pubDirPath, std::vector<std::string>& pubDirFiles)
  131. {
  132. CSimpleStringA startMenuPublicPath(STARTUP_DIR_FULL_PATH);
  133. auto arr = fileutil_get_sub_files(startMenuPublicPath);
  134. pubDirPath = startMenuPublicPath.GetData();
  135. if (arr != NULL) {
  136. for (int i = 0; i < arr->nelts; ++i) {
  137. char* file = ARRAY_IDX(arr, i, char*);
  138. char* filename = strrchr(file, '\\');
  139. if (filename != NULL) { filename += 1; }
  140. else { filename = file; }
  141. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
  142. pubDirFiles.push_back(std::string(filename));
  143. }
  144. toolkit_array_free2(arr);
  145. }
  146. CSimpleStringA strUserName(true);
  147. GetCurUserName(strUserName);
  148. if (!strUserName.IsNullOrEmpty()) {
  149. CSimpleStringA startMenuFullPath = CSimpleStringA::Format("C:\\Users\\%s\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", strUserName.GetData());
  150. arr = fileutil_get_sub_files(startMenuFullPath);
  151. userDirPath = startMenuFullPath.GetData();
  152. if (arr != NULL) {
  153. for (int i = 0; i < arr->nelts; ++i) {
  154. char* file = ARRAY_IDX(arr, i, char*);
  155. char* filename = strrchr(file, '\\');
  156. if (filename != NULL) { filename += 1; }
  157. else { filename = file; }
  158. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
  159. userDirFiles.push_back(std::string(filename));
  160. }
  161. toolkit_array_free2(arr);
  162. }
  163. }
  164. }
  165. #endif //RVC_OS_WIN
  166. template<class T>
  167. class TimerOutHelper : public ITimerListener
  168. {
  169. public:
  170. typedef void (T::* FuncTimer)(void* pUserdata);
  171. TimerOutHelper(T* p, FuncTimer pTimerFunc, void* pData, bool bDeleteSelf = false)
  172. : m_pObject(p), m_pUserData(pData), m_pTimer(pTimerFunc), m_bDeleteSelf(bDeleteSelf)
  173. {
  174. }
  175. virtual void OnTimeout(DWORD dwTimerID)
  176. {
  177. (m_pObject->*m_pTimer)(m_pUserData);
  178. if (m_bDeleteSelf)
  179. delete this;
  180. }
  181. private:
  182. void* m_pUserData;
  183. T* m_pObject;
  184. FuncTimer m_pTimer;
  185. bool m_bDeleteSelf;
  186. };
  187. ResourceWatcherFSM::ResourceWatcherFSM(void)
  188. :m_strTerminalNo(true),
  189. m_bFirstRunAfterBoot(FALSE),
  190. m_cpuTop(0), flag4DeleteKeyAutoStartFile(false), flag4DoAutoStartTaskIgnoreBoot(FALSE)
  191. {
  192. #ifdef RVC_OS_WIN
  193. m_forceStartupWithExeFlag = 0;
  194. m_iNonSignedTotal = 0;
  195. m_bNeedForceDiskCheck = false;
  196. m_DoneDetectAutostart = true;
  197. #endif // RVC_OS_WIN
  198. }
  199. ResourceWatcherFSM::~ResourceWatcherFSM(void)
  200. {
  201. }
  202. void ResourceWatcherFSM::s0_on_entry()
  203. {
  204. #if defined(RVC_OS_WIN)
  205. this->PostEventFIFO(new RunEvent());
  206. BOOL fInstallBySetup(FALSE);
  207. ErrorCodeEnum rc = DetectVTMInstalledBySetup(fInstallBySetup);
  208. #endif //RVC_OS_WIN
  209. }
  210. unsigned int ResourceWatcherFSM::s0_on_event(FSMEvent* e)
  211. {
  212. unsigned int unRes = 0;
  213. switch (e->iEvt)
  214. {
  215. case USER_EVT_RUN:
  216. {
  217. e->SetHandled();
  218. }
  219. break;
  220. default:
  221. {
  222. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unexpecetd Event(%d)", e->iEvt);
  223. }
  224. break;
  225. }
  226. return unRes;
  227. }
  228. void ResourceWatcherFSM::s0_on_exit()
  229. {
  230. }
  231. void ResourceWatcherFSM::s1_on_entry()
  232. {
  233. }
  234. unsigned int ResourceWatcherFSM::s1_on_event(FSMEvent* e)
  235. {
  236. unsigned int unRes = 0;
  237. e->SetHandled();
  238. return unRes;
  239. }
  240. void ResourceWatcherFSM::s1_on_exit()
  241. {
  242. }
  243. void ResourceWatcherFSM::s2_on_entry()
  244. {
  245. }
  246. unsigned int ResourceWatcherFSM::s2_on_event(FSMEvent* e)
  247. {
  248. unsigned int unRes = 0;
  249. switch (e->iEvt)
  250. {
  251. case USER_EVT_RUN:
  252. {
  253. e->SetHandled();
  254. }
  255. break;
  256. }
  257. return unRes;
  258. }
  259. void ResourceWatcherFSM::s2_on_exit()
  260. {
  261. }
  262. void ResourceWatcherFSM::s3_on_entry()
  263. {
  264. }
  265. unsigned int ResourceWatcherFSM::s3_on_event(FSMEvent* e)
  266. {
  267. unsigned int unRes = 0;
  268. switch (e->iEvt)
  269. {
  270. case USER_EVT_RUN:
  271. {
  272. e->SetHandled();
  273. }
  274. break;
  275. }
  276. return unRes;
  277. }
  278. void ResourceWatcherFSM::s3_on_exit()
  279. {
  280. }
  281. #ifdef RVC_OS_LINUX
  282. bool ResourceWatcherFSM::GetMonitorInfo(CSimpleStringA& outInfo)
  283. {
  284. std::string sucContent, failedContent;
  285. CSimpleStringA strCmd("xrandr | grep \" connected\" | sed -e \"s/\([A-Z0-9]\+\) connected.*/\1/\"");
  286. bool ret = SP::Module::Util::ShellExecute(strCmd.GetData(), sucContent, failedContent);
  287. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("{%s}:{%s}{%s}", strCmd.GetData(), sucContent.c_str(), failedContent.c_str());
  288. std::string msg = SP::Utility::ToTrim(sucContent);
  289. SP::Utility::replaceInPlace(msg, "\n", "|");
  290. outInfo = msg.c_str();
  291. return ret;
  292. }
  293. bool ResourceWatcherFSM::GetSysActiveStatus(CSimpleStringA& outInfo)
  294. {
  295. std::string sucContent, failedContent;
  296. CSimpleStringA strCmd("uos-activator-cmd -q");
  297. bool ret = SP::Module::Util::ShellExecute(strCmd.GetData(), sucContent, failedContent);
  298. std::string msg = SP::Utility::ToTrim(sucContent);
  299. SP::Utility::replaceInPlace(msg, "\n", "|");
  300. outInfo = msg.c_str();
  301. return ret;
  302. }
  303. #endif // RVC_OS_LINUX
  304. //首页状态变化时触发的功能
  305. void ResourceWatcherFSM::TriggerAtStatusChanged(bool bMStatus)
  306. {
  307. if (firstMpage)//首次进入首页
  308. {
  309. firstMpage = false;
  310. CSmartPointer<IConfigInfo> spRunConfig;
  311. CSmartPointer<IConfigInfo> spCtSettingConfig;
  312. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
  313. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  314. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "HardwareCheckTime", hardwareCheckTime);
  315. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "HardwareCheckFlag", hardwareCheckFlag);
  316. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "DiskCheckTime", diskCheckTime);
  317. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "DiskCheckFlag", diskCheckFlag);
  318. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "CpuTooHighPercent", m_cpuHighPercent);
  319. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "CpuWarnThreshold", cpuWarnThreshold);
  320. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "MemoryTooHighPercent", m_memHighPercent);
  321. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "MemWarnThreshold", memWarnThreshold);
  322. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "HardDiskTooHighPercent", m_diskHighPercent);
  323. spCtSettingConfig->ReadConfigValueInt(m_pEntity->GetEntityName(), "VerifySignature", m_iVerify);
  324. #if defined(RVC_OS_WIN)
  325. if (m_iVerify == 1) {//文件签名校验
  326. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Verify digitsign...");
  327. VerifyDigitSignTask* task = new VerifyDigitSignTask(this);
  328. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  329. }
  330. #endif //RVC_OS_WIN
  331. if (hardwareCheckTime <= 0) { //非法数值情况下设置为默认一分钟
  332. hardwareCheckTime = DEFAULT_HARDWARE_CHECK_TIME;
  333. }
  334. void* pTmpData = NULL;
  335. ITimerListener* pListener = new TimerOutHelper<ResourceWatcherFSM>(this, &ResourceWatcherFSM::HardwareInfoTimer, pTmpData);
  336. GetEntityBase()->GetFunction()->SetTimer(TIMER_HARDWARE_CHECK, pListener, hardwareCheckTime);
  337. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Set Hardware Timer!");
  338. if (diskCheckFlag > 0) {
  339. GetSystemDiskStatus(); //仅启动时检测一次硬盘状态即可
  340. }
  341. if (diskCheckTime <= 0) {
  342. diskCheckTime = DEFAULT_DISK_CHECK_TIME;
  343. }
  344. void* pTmpData2 = NULL;
  345. ITimerListener* pListener2 = new TimerOutHelper<ResourceWatcherFSM>(this, &ResourceWatcherFSM::DiskCheckTimer, pTmpData2);
  346. GetEntityBase()->GetFunction()->SetTimer(TIMER_DISK_CHECK, pListener2, diskCheckTime);
  347. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Set DISK CHECK Timer!");
  348. //集中配置额外加的清理逻辑
  349. CenterSettingDeleteTask* centerSettingDeleteTask = new CenterSettingDeleteTask(this);
  350. GetEntityBase()->GetFunction()->PostThreadPoolTask(centerSettingDeleteTask);
  351. //终端默认的自动清理逻辑
  352. AutoDeleteFilesTask* autoDeleteTask = new AutoDeleteFilesTask(this);
  353. GetEntityBase()->GetFunction()->PostThreadPoolTask(autoDeleteTask);
  354. #if defined(RVC_OS_LINUX)
  355. if (m_bFirstRunAfterBoot) {
  356. UINT sysVer = 0;
  357. UploadSysVersionInfo(sysVer);
  358. ConfirmWindowEffectHasBeenOpen();
  359. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("fetch os version: %u", sysVer);
  360. if (1031 < sysVer) {
  361. ConfirmDDEClipboardDisable();
  362. ConfirmNotificationCenterDisable();
  363. }
  364. else {
  365. RecoverDDEClipboardEnable();
  366. }
  367. GetEntityBase()->GetFunction()->PostThreadPoolTask(new DetectSoftwareInstallStatusTask(this));
  368. GetEntityBase()->GetFunction()->PostThreadPoolTask(new UploadMonitorInfoTask(this));
  369. AlarmSystemBasicInfo();
  370. }
  371. #endif //RVC_OS_LINUX
  372. }
  373. }
  374. ErrorCodeEnum ResourceWatcherFSM::OnInit()
  375. {
  376. firstMpage = true; //是否首次进入首页
  377. ErrorCodeEnum erroCode = Error_Succeed;
  378. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Complied at: %s %s", __DATE__, __TIME__);
  379. CSmartPointer<IConfigInfo> spRunConfig;
  380. CSmartPointer<IConfigInfo> spCtSettingConfig;
  381. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
  382. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  383. erroCode = GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_RvcSysinfo);
  384. m_strTerminalNo = m_RvcSysinfo.strTerminalID;
  385. m_bFirstRunAfterBoot = DetectIsFirstRunAtBoot();
  386. if (m_bFirstRunAfterBoot) {
  387. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("First time to run after system boot.");
  388. }
  389. if (m_bFirstRunAfterBoot) {
  390. #if defined(RVC_OS_WIN)
  391. //GetSystemMetrics (SM_CMONITORS) 计数仅显示可见的显示器
  392. const int screenNums = GetSystemMetrics(SM_CMONITORS);
  393. const int aimScreenNums4Stand2S = 2;
  394. const int aimScreenNums4Other = 1;
  395. if (0 == m_RvcSysinfo.strMachineType.Compare("RVC.Stand2S", true) && screenNums != aimScreenNums4Stand2S) {
  396. LogWarn(Severity_Low, Error_Unexpect, LOG_RESOURCEWATCHER_LACK_OF_MONITOR
  397. , CSimpleStringA::Format("{\"subject\":\"screen_count\",\"machine_type\":\"%s\",\"expect\":%d,\"actual\":%d}"
  398. , m_RvcSysinfo.strMachineType.GetData(), aimScreenNums4Stand2S, screenNums));
  399. }
  400. else if (0 != m_RvcSysinfo.strMachineType.Compare("RVC.Stand2S", true) && screenNums != aimScreenNums4Other) {
  401. LogWarn(Severity_Low, Error_Unexpect, LOG_RESOURCEWATCHER_LACK_OF_MONITOR
  402. , CSimpleStringA::Format("{\"subject\":\"screen_count\",\"machine_type\":\"%s\",\"expect\":%d,\"actual\":%d}"
  403. , m_RvcSysinfo.strMachineType.GetData(), aimScreenNums4Other, screenNums));
  404. }
  405. #endif //RVC_OS_WIN
  406. }
  407. spCtSettingConfig->ReadConfigValueInt(m_pEntity->GetEntityName(), "DisplayCnt", m_iNonSignedDisplay);
  408. if (m_iNonSignedDisplay <= 0)
  409. m_iNonSignedDisplay = 10;
  410. int nValue(0);
  411. spCtSettingConfig->ReadConfigValueInt(m_pEntity->GetEntityName(), "DoAutoStartTaskFlag", nValue);
  412. if (!!nValue) {
  413. flag4DoAutoStartTaskIgnoreBoot = TRUE;
  414. }
  415. spRunConfig->ReadConfigValueInt("WarnRecord", "disk", m_diskLastWarnHour);
  416. return Error_Succeed;
  417. }
  418. ErrorCodeEnum ResourceWatcherFSM::OnExit()
  419. {
  420. #ifdef RVC_OS_LINUX
  421. GetEntityBase()->GetFunction()->KillTimer(TIMER_HARDWARE_CHECK);
  422. #endif // RVC_OS_LINUX
  423. return Error_Succeed;
  424. }
  425. void ResourceWatcherFSM::AfterInit()
  426. {
  427. #if defined(RVC_OS_WIN)
  428. if (m_bFirstRunAfterBoot) {
  429. InitCustomAutoStartFileSheet();
  430. AggerateAutoStatTask* task = new AggerateAutoStatTask(this);
  431. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  432. }
  433. else if(flag4DoAutoStartTaskIgnoreBoot){
  434. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Do AutoStart Job from CenterSettings");
  435. InitCustomAutoStartFileSheet();
  436. AggerateAutoStatTask* task = new AggerateAutoStatTask(this);
  437. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  438. }
  439. DetectVersionHasChangedAndWarnCover();
  440. #else
  441. if (m_bFirstRunAfterBoot) {
  442. //获取系统激活状态
  443. CSimpleStringA value(true);
  444. CSimpleStringA warnMsg(true);
  445. bool res = GetSysActiveStatus(value);
  446. if (!value.IsNullOrEmpty()) {
  447. auto elems = value.Split('|');
  448. std::map<std::string, std::string> info;
  449. info["subject"] = "system_activation";
  450. if (elems.GetCount() > 0) {
  451. for (int i = 0; i < elems.GetCount(); ++i) {
  452. auto sub_elems = elems[i].Split(':');
  453. if (sub_elems.GetCount() == 2) {
  454. CSimpleStringA val = sub_elems[1].GetData();
  455. CSimpleStringA key(true);
  456. //因为UOS内容用了中文的冒号,而Split函数无法拆分中文冒号(拆出来前面的内容有乱码),只能这样去操作
  457. if (sub_elems[0].IndexOf("服务器") != -1) {
  458. key = "server_addr";
  459. } else if (sub_elems[0].IndexOf("激活状") != -1) {
  460. key = "activation_status";
  461. }
  462. else if(sub_elems[0].IndexOf("授权状") != -1) {
  463. key = "authorization_status";
  464. }
  465. else if(sub_elems[0].IndexOf("到期时") != -1) {
  466. key = "deadline_status";
  467. }
  468. else if (sub_elems[0].IndexOf("序列") != -1) {
  469. key = "serial_number";
  470. if (val.GetLength() >= 23) {
  471. //NNAAA-7AAAY-*****-*****-MT6SK
  472. val[12] = val[13] = val[14] = val[15] = val[16] = '*';
  473. val[18] = val[19] = val[20] = val[21] = val[22] = '*';
  474. }
  475. }
  476. else {
  477. key = CSimpleStringA::Format("other%02d", i);
  478. }
  479. info[key.GetData()] = val.GetData();
  480. }
  481. }
  482. }
  483. info["fetch_status"] = "succ";
  484. std::pair<bool, std::string> strResult;
  485. strResult = generateJsonStr(info);
  486. value = strResult.second.c_str();
  487. }
  488. else {
  489. warnMsg = CSimpleStringA::Format("{\"subject\":\"system_activation\", \"fetch_status\":\"failed\"}");
  490. }
  491. LogWarn(Severity_Low, Error_Debug, LOG_INFO_SYSTEM_ACTIVATION_INFO, value);
  492. }
  493. #endif //RVC_OS_WIN
  494. }
  495. void ResourceWatcherFSM::LinkDetect(int detectType, const char* url, bool& status, unsigned int& delay, int warnFlag)
  496. {
  497. string tUrl = url;
  498. string host = "http://";
  499. int flag = 0;
  500. unsigned int tInterval = 0;
  501. string msg;
  502. if (tUrl.find("http") == string::npos) {
  503. tUrl = host + tUrl;
  504. }
  505. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Check url:[%s].", tUrl.c_str());
  506. ULLINT begin, end;
  507. begin = SP::Module::Comm::RVCGetTickCount();
  508. int curFlag = HttpProbe(tUrl, msg, 5);
  509. end = SP::Module::Comm::RVCGetTickCount();
  510. tInterval = end - begin;
  511. if (curFlag > 0 && curFlag < 400) {
  512. flag = true;
  513. }
  514. else {
  515. flag = false;
  516. }
  517. if (flag == false) {
  518. status = false;
  519. }
  520. else {
  521. status = true;
  522. }
  523. delay = tInterval > 0 ? tInterval:1;
  524. }
  525. ErrorCodeEnum ResourceWatcherFSM::BizLinkDetect(
  526. SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req, ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx)
  527. {
  528. LOG_FUNCTION();
  529. ErrorCodeEnum ec = Error_Succeed;
  530. int detectType = ctx->Req.protocol;
  531. CSimpleStringA url = ctx->Req.bizLink;
  532. bool linkStatus = false;
  533. unsigned int delay = 0;
  534. LinkDetect(detectType, url.GetData(), linkStatus, delay);
  535. ctx->Ans.bizLinkStatus = linkStatus;
  536. ctx->Ans.bizLinkDelayMS = delay;
  537. ctx->Ans.intParam = 0;
  538. CSimpleStringA warn;
  539. if (!linkStatus) {
  540. warn = CSimpleStringA::Format("BizLink disconnected[%s].", url.GetData());
  541. }
  542. else
  543. {
  544. warn = CSimpleStringA::Format("BizLink connected[%s], Delay time [%d]ms.", url.GetData(), delay);
  545. }
  546. LogWarn(Severity_Low, Error_Param, LOG_WARN_BIZLINK_CONNECT_CHECK, warn.GetData());
  547. if (ctx != NULL) {
  548. ctx->Answer(ec);
  549. }
  550. return ec;
  551. }
  552. //通过集中配置额外执行的清理策略
  553. void ResourceWatcherFSM::CenterSettingDelete()
  554. {
  555. string p;
  556. CSmartPointer<IConfigInfo> spCtSettingConfig;
  557. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  558. CSimpleStringA upPath(""), tempPath(""), tPath(""), upgradePath("");
  559. spCtSettingConfig->ReadConfigValue("ResourceWatcher", "DocumentCleanPath", tempPath);
  560. if (tempPath.GetLength() == 0) {
  561. return;
  562. }
  563. ErrorCodeEnum erroCode = Error_Succeed;
  564. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  565. CSmartPointer<IConfigInfo> spConfigRun;
  566. //判断是否需要被清理
  567. erroCode = pFunc->OpenConfig(Config_Run, spConfigRun);
  568. if (erroCode != Error_Succeed) {
  569. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Open Run Config failed");
  570. return;
  571. }
  572. int nLastTaskTime = 0;
  573. int nLstFlag = 0;
  574. bool bFailFlag = false;
  575. CSimpleStringA optFileName("");
  576. UINT64 utVersion = 0;
  577. spConfigRun->ReadConfigValueHexInt("DeleteDocumentTask", "OptVer", utVersion);
  578. spConfigRun->ReadConfigValue("DeleteDocumentTask", "DocumentName", optFileName);
  579. spConfigRun->ReadConfigValueInt("DeleteDocumentTask", "LastCondi", nLstFlag);
  580. spConfigRun->ReadConfigValueInt("DeleteDocumentTask", "LastTime", nLastTaskTime);
  581. CVersion optVer(utVersion);
  582. SYSTEMTIME stTaskTime = CSmallDateTime(nLastTaskTime).ToSystemTime();
  583. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("LastTime<%04d-%02d-%02d %02d:%02d:%02d>: OptVer: %s, LastCondi: %d",
  584. stTaskTime.wYear, stTaskTime.wMonth, stTaskTime.wDay,
  585. stTaskTime.wHour, stTaskTime.wMinute, stTaskTime.wSecond,
  586. (LPCTSTR)optVer.ToString(), nLstFlag);
  587. if (optVer.IsValid() && optVer == m_RvcSysinfo.InstallVersion && !nLstFlag && optFileName == tempPath)
  588. {
  589. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Certain document cleaning has been done before.");
  590. return;
  591. }
  592. //执行清理逻辑
  593. upPath = tempPath;
  594. int nDelSuc = 0, nDelFail = 0, nFileCount = 0;
  595. nFileCount = ProcessFileDelete(upPath.GetData(), nDelSuc, nDelFail, false);
  596. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Process result(%s): count(%d), suc(%d), failed(%d).", upPath.GetData(), nFileCount, nDelSuc, nDelFail);
  597. if (nDelFail != 0) {
  598. bFailFlag = true;
  599. //break;
  600. }
  601. nLstFlag = bFailFlag ? 1 : 0;
  602. spConfigRun->WriteConfigValueHexInt("DeleteDocumentTask", "OptVer", m_RvcSysinfo.InstallVersion.GetVersion64());
  603. spConfigRun->WriteConfigValue("DeleteDocumentTask", "DocumentName", tempPath);
  604. spConfigRun->WriteConfigValueInt("DeleteDocumentTask", "LastCondi", nLstFlag);
  605. spConfigRun->WriteConfigValue("DeleteDocumentTask", "LastTime",
  606. (LPCTSTR)CSimpleStringA::Format("0x%08X", (DWORD)CSmallDateTime::GetNow()));
  607. if (!bFailFlag)
  608. {
  609. LogWarn(Severity_Low, Error_Debug, LOG_WARN_FILE_DELETE_SUC, CSimpleStringA::Format("Delete files in [%s] success", tempPath.GetData()));
  610. }
  611. }
  612. time_t ResourceWatcherFSM::GetPathTimeSeconds(const char* inPath)
  613. {
  614. if (!inPath)
  615. {
  616. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetPathFileDays PATH = NULL.", inPath);
  617. return 0;
  618. }
  619. time_t lCreateTime = 0;
  620. //int reTimes = 0;
  621. #ifdef RVC_OS_WIN
  622. struct _finddata_t fileinfo;//文件信息读取结构
  623. string p;
  624. long hFile = _findfirst(inPath, &fileinfo);
  625. if (hFile == -1L)
  626. {
  627. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get [%s] fileinfo failed. GLE = %u.", inPath, GetLastError());
  628. return 0;
  629. }
  630. lCreateTime = fileinfo.time_write; //文件最后修改时间
  631. _findclose(hFile);
  632. #else
  633. struct stat stFile;
  634. if (stat(inPath, &stFile) == -1)
  635. {
  636. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%s] Failed to get file stats. GLE=%d.", inPath, GetLastError());
  637. return 0;
  638. }
  639. lCreateTime = stFile.st_mtime; //文件状态最后修改时间
  640. #endif // RVC_OS_WIN
  641. //reTimes = lCreateTime; //文件时间
  642. return lCreateTime;
  643. }
  644. //所有文件删除功能都用这个函数来处理
  645. //bool delDir:控制是否将目录也一并删除,false 保留目录, true 删除目录
  646. //int saveBackDay:保存多少天内的文件, 默认参数,默认值为0,即不保存。(delDir = true时,该参数强制为0)
  647. int ResourceWatcherFSM::ProcessFileDelete(LPCTSTR lpszPath, int& nDelSucCnt, int& nDelFailedCnt, bool delDir, unsigned int saveBackDay)
  648. {
  649. if (delDir == true) //若要删除目录,则不保留任何文件
  650. {
  651. saveBackDay = 0;
  652. }
  653. int fileCnt = 0;
  654. char* searchFilePath = new char[MAX_PATH];
  655. char* tempFilePath = new char[MAX_PATH];
  656. if (searchFilePath == NULL || tempFilePath == NULL)
  657. {
  658. if (searchFilePath) delete[] searchFilePath;
  659. if (tempFilePath) delete[] tempFilePath;
  660. searchFilePath = NULL;
  661. tempFilePath = NULL;
  662. return fileCnt;
  663. }
  664. ZeroMemory(searchFilePath, MAX_PATH);
  665. ZeroMemory(tempFilePath, MAX_PATH);
  666. #ifdef RVC_OS_LINUX
  667. int fileLength = strlen(lpszPath);
  668. struct stat st;
  669. if (stat(lpszPath, &st) == -1)
  670. {
  671. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%s] Failed to get file stats.", lpszPath);
  672. nDelSucCnt++;
  673. return fileCnt;
  674. }
  675. if (!S_ISDIR(st.st_mode))
  676. {//单文件处理
  677. if (saveBackDay != 0)
  678. {
  679. time_t lSystemTime;
  680. time(&lSystemTime);
  681. time_t fileTime = GetPathTimeSeconds(lpszPath); //获取文件的最后改动时间
  682. int delDays = (lSystemTime - fileTime) / SECONDS_OF_DAY;
  683. if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
  684. {
  685. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Files 存留天数[%d], 删除阈值[%u],无需清理.", (int)delDays, saveBackDay);
  686. return fileCnt;
  687. }
  688. }
  689. if (RemoveFileA(lpszPath) == true) {
  690. nDelSucCnt++;
  691. fileCnt++;
  692. }
  693. else {
  694. nDelFailedCnt++;
  695. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A08").setAPI("DeleteFiles")("RemoveFileA [%s] failed, GLE = %u.", tempFilePath, errno);
  696. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_FILE_DELETE_FAILED, CSimpleStringA::Format("RemoveFileA [%s] failed, GLE = %u.", tempFilePath, errno));
  697. }
  698. if (searchFilePath) delete[] searchFilePath;
  699. if (tempFilePath) delete[] tempFilePath;
  700. searchFilePath = NULL;
  701. tempFilePath = NULL;
  702. return fileCnt;
  703. }
  704. DIR* d = opendir(lpszPath);
  705. if (!d) {
  706. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("opendir failed: %d.", errno);
  707. if (searchFilePath) delete[] searchFilePath;
  708. if (tempFilePath) delete[] tempFilePath;
  709. searchFilePath = NULL;
  710. tempFilePath = NULL;
  711. nDelFailedCnt++;
  712. return fileCnt;
  713. }
  714. struct dirent* dp = NULL;
  715. while ((dp = readdir(d)) != NULL) {
  716. if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, ".."))) {
  717. continue;
  718. }
  719. strcpy(tempFilePath, lpszPath);
  720. if (strlen(tempFilePath) + strlen(dp->d_name) + 3 >= MAX_PATH) {
  721. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("filePath is too long for current.");
  722. continue;
  723. }
  724. strcat(tempFilePath, "/");
  725. strcat(tempFilePath, dp->d_name);
  726. stat(tempFilePath, &st);
  727. if (saveBackDay != 0)
  728. {
  729. time_t lSystemTime;
  730. time(&lSystemTime);
  731. time_t fileTime = GetPathTimeSeconds(tempFilePath); //获取文件的最后改动时间
  732. int delDays = (lSystemTime - fileTime) / SECONDS_OF_DAY;
  733. if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
  734. {
  735. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Dir[%s], 存留天数[%d], 删除阈值[%u],无需清理.", tempFilePath, (int)delDays, saveBackDay);
  736. continue;
  737. }
  738. }
  739. int tDelSucCnt = 0, tDelFailedCnt = 0;
  740. fileCnt += ProcessFileDelete((LPCTSTR)tempFilePath, tDelSucCnt, tDelFailedCnt, true); //子目录要清理
  741. if (tDelFailedCnt != 0) {
  742. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A08").setAPI("DeleteFiles")("rm(%s) failed, GLE = %u.", (LPCTSTR)tempFilePath, errno);
  743. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_FILE_DELETE_FAILED, CSimpleStringA::Format("rm(%s) failed, GLE = %u.", (LPCTSTR)tempFilePath, errno));
  744. nDelSucCnt += tDelSucCnt;
  745. nDelFailedCnt += tDelFailedCnt;
  746. return fileCnt;
  747. }
  748. nDelSucCnt += tDelSucCnt;
  749. }
  750. closedir(d);
  751. #else
  752. CSimpleStringA inPath = lpszPath;
  753. inPath.Append("\\*"); // "D:aaa\bbb\ccc\* " 匹配目录下的所有文件和文件夹
  754. int fileLength = inPath.GetLength();
  755. WIN32_FIND_DATA wfd;
  756. HANDLE hFind;
  757. hFind = FindFirstFile(inPath.GetData(), &wfd);
  758. //单文件操作
  759. if (hFind == INVALID_HANDLE_VALUE) // 非文件夹 (inPath "D:aaa\bbb\ccc\* "格式的情况下,如果前面是文件,会找不到匹配)
  760. {
  761. if (saveBackDay != 0)
  762. {
  763. //读取文件时间
  764. time_t lSystemTime;
  765. time(&lSystemTime);
  766. time_t fileTime = GetPathTimeSeconds(lpszPath); //获取文件的最后改动时间
  767. int delDays = (lSystemTime - fileTime) / SECONDS_OF_DAY;
  768. if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
  769. {
  770. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("存留天数[%d], 删除阈值[%u],无需清理.", (int)delDays, saveBackDay);
  771. return fileCnt;
  772. }
  773. }
  774. if (DeleteFile(lpszPath) == true)
  775. {
  776. nDelSucCnt++;
  777. fileCnt++;
  778. }
  779. else
  780. {
  781. nDelFailedCnt++;
  782. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A08").setAPI("DeleteFiles")
  783. ("Delete [%s] failed, GLE = %u.", lpszPath, GetLastError());
  784. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_FILE_DELETE_FAILED, CSimpleStringA::Format("RemoveFileA [%s] failed, GLE = %u.", lpszPath, errno));
  785. }
  786. if (searchFilePath) delete[] searchFilePath;
  787. if (tempFilePath) delete[] tempFilePath;
  788. searchFilePath = NULL;
  789. tempFilePath = NULL;
  790. return fileCnt;
  791. }
  792. //文件夹操作
  793. do
  794. {
  795. if (wfd.cFileName[0] != '.')
  796. {
  797. strcpy_s(tempFilePath, MAX_PATH, inPath.GetData());
  798. tempFilePath[fileLength - 1] = '\0';
  799. if (strlen(tempFilePath) + strlen(wfd.cFileName) + 3 >= MAX_PATH)
  800. {
  801. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("filePath is too long for current.");
  802. }
  803. else
  804. {
  805. strcat_s(tempFilePath, MAX_PATH, wfd.cFileName); //"D:aaa\bbb\ccc\fileName"
  806. if (saveBackDay != 0)
  807. {
  808. time_t lSystemTime;
  809. time(&lSystemTime);
  810. time_t fileTime = GetPathTimeSeconds(tempFilePath); //获取文件的最后改动时间
  811. if (fileTime == 0)
  812. {
  813. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get file time (%s) failed. skip clean", (LPCTSTR)tempFilePath);
  814. nDelFailedCnt++;
  815. continue;
  816. }
  817. int delDays = (lSystemTime - fileTime) / SECONDS_OF_DAY;
  818. if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
  819. {
  820. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Dir[%s], 存留天数[%d], 删除阈值[%u],无需清理.", tempFilePath, (int)delDays, saveBackDay);
  821. continue;
  822. }
  823. }
  824. int tDelSucCnt = 0, tDelFailedCnt = 0;
  825. fileCnt += ProcessFileDelete((LPCTSTR)tempFilePath, tDelSucCnt, tDelFailedCnt, true); //子目录要删除
  826. if (tDelFailedCnt != 0)
  827. {
  828. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A08").setAPI("DeleteFiles")
  829. ("rm(%s) failed, GLE = %u.", (LPCTSTR)tempFilePath, GetLastError());
  830. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_FILE_DELETE_FAILED, CSimpleStringA::Format("RemoveFileA [%s] failed, GLE = %u.", (LPCTSTR)tempFilePath, errno));
  831. nDelFailedCnt += tDelFailedCnt;
  832. return fileCnt;
  833. }
  834. nDelFailedCnt += tDelFailedCnt;
  835. nDelSucCnt += tDelSucCnt;
  836. }
  837. }
  838. } while (FindNextFileA(hFind, &wfd));
  839. FindClose(hFind);
  840. #endif // RVC_OS_LINUX
  841. if (delDir) //删除目录
  842. {
  843. #ifdef RVC_OS_WIN
  844. RemoveDirectoryA(lpszPath);
  845. #else
  846. RemoveDirRecursive(lpszPath);
  847. #endif
  848. }
  849. if (searchFilePath) delete[] searchFilePath;
  850. if (tempFilePath) delete[] tempFilePath;
  851. searchFilePath = NULL;
  852. tempFilePath = NULL;
  853. return fileCnt;
  854. }
  855. //终端默认执行的终端清理策略
  856. void ResourceWatcherFSM::AutoDeleteFiles()
  857. {
  858. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  859. CSmartPointer<IConfigInfo> spConfig;
  860. pFunc->OpenConfig(Config_CenterSetting, spConfig);
  861. //判断是否升级完毕,未完成升级不进行删除任务
  862. CSimpleStringA strRunInfo, strStartTime;
  863. if (m_pEntity->GetFunction()->GetPath("RunInfo", strRunInfo) == Error_Succeed) {
  864. strStartTime = strRunInfo + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "starttime.dat";
  865. if (!ExistsFileA(strStartTime.GetData())) {
  866. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("upgrade prpcess done, try to delete version files.");//完成升级过程,通过
  867. }
  868. else
  869. {
  870. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("upgrade process is not end ,should not delete files.");
  871. return;//升级未完成,不进行删除
  872. }
  873. }
  874. else
  875. {
  876. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("upgrade process is not end ,get runinfo path error, should not version files.");
  877. return;//失败,继续等待
  878. }
  879. //清理版本相关文件
  880. DeleteVersionPackage();
  881. //清理录像文件
  882. DeleteVideoFiles();
  883. return;
  884. }
  885. //终端升级后会执行版本清理功能 包含dump和 upgaraded清理
  886. BOOL ResourceWatcherFSM::DeleteVersionPackage()
  887. {
  888. ErrorCodeEnum erroCode = Error_Succeed;
  889. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  890. CSmartPointer<IConfigInfo> spConfigRun;
  891. CSmartPointer<IConfigInfo> spConfig;
  892. CSystemStaticInfo info;
  893. if (pFunc->GetSystemStaticInfo(info) != Error_Succeed) {
  894. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get system static info error");
  895. return FALSE;
  896. }
  897. //清理执行成功与否的判断变量
  898. int nLastTaskTime = 0;
  899. int nLstFailed = 0;
  900. int nDelCount = 0;
  901. UINT64 utVersion = 0;
  902. pFunc->OpenConfig(Config_CenterSetting, spConfig);
  903. pFunc->OpenConfig(Config_Run, spConfigRun);
  904. spConfigRun->ReadConfigValueHexInt("VersionClear", "OptVer", utVersion);
  905. spConfigRun->ReadConfigValueInt("VersionClear", "DelVerCnt", nDelCount);
  906. spConfigRun->ReadConfigValueInt("VersionClear", "LastCondi", nLstFailed); //失败标志
  907. spConfigRun->ReadConfigValueInt("VersionClear", "LastTime", nLastTaskTime);
  908. CVersion optVer(utVersion);
  909. SYSTEMTIME stTaskTime = CSmallDateTime(nLastTaskTime).ToSystemTime();
  910. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("LastTime<%04d-%02d-%02d %02d:%02d:%02d>: OptVer: %s, LastFailed: %d",
  911. stTaskTime.wYear, stTaskTime.wMonth, stTaskTime.wDay,
  912. stTaskTime.wHour, stTaskTime.wMinute, stTaskTime.wSecond,
  913. (LPCTSTR)optVer.ToString(), nLstFailed);
  914. //判断是否需要执行清理任务,若此版本之前成功清理过则不再继续执行后续操作
  915. if (optVer.IsValid() && optVer == info.InstallVersion && !nLstFailed) {
  916. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("VersionPackage cleaning has been done before.");
  917. return TRUE;
  918. }
  919. //--------------------------------------------------------------------------------------------
  920. //版本清理中默认进行upgrade清理
  921. int closeUpgradeClear = 0;
  922. spConfig->ReadConfigValueInt("ResourceWatcher", "CloseUpgradeClear", closeUpgradeClear);
  923. if (!closeUpgradeClear)
  924. {
  925. //删除rvc/Upgraded目录下的文件
  926. CSimpleStringA upPath;
  927. ErrorCodeEnum upError = pFunc->GetPath("Upgraded", upPath);
  928. if (Error_Succeed != upError) {
  929. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Try to clean Upgraded Dir. But get Upgraded path error = %u.", upError);
  930. return FALSE;
  931. }
  932. int nDelSuc = 0, nDelFail = 0, nFileCount = 0;
  933. nFileCount = ProcessFileDelete(upPath.GetData(), nDelSuc, nDelFail, false);
  934. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete [Upgraded] result(%s): count(%d), suc(%d), failed(%d).", upPath.GetData(), nFileCount, nDelSuc, nDelFail);
  935. }
  936. //--------------------------------------------------------------------------------------------
  937. //版本清理中默认进行dump清理
  938. int closeDmpClear = 0;
  939. spConfig->ReadConfigValueInt("ResourceWatcher", "CloseDmpClear", closeDmpClear);
  940. if (!closeDmpClear)
  941. { //执行删除流程rvc/dmp
  942. CSimpleStringA dmpPath;
  943. ErrorCodeEnum dmpError = pFunc->GetPath("Temp", dmpPath);
  944. if (Error_Succeed != dmpError) {
  945. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Try to clean Dump Dir. But get Temp path error = %u.", dmpError);
  946. return FALSE;
  947. }
  948. #ifdef RVC_OS_LINUX
  949. dmpPath = dmpPath + SPLIT_SLASH_STR + ".." + SPLIT_SLASH_STR + "dmp"; // +"/../dmp"
  950. #else
  951. dmpPath = dmpPath + CSimpleStringA::Format("\\..\\dmp");
  952. #endif // RVC_OS_LINUX
  953. int nDelSuc = 0, nDelFail = 0, nFileCount = 0;
  954. nFileCount = ProcessFileDelete(dmpPath.GetData(), nDelSuc, nDelFail, false);
  955. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete [Dump] result(%s): count(%d), suc(%d), failed(%d).", dmpPath.GetData(), nFileCount, nDelSuc, nDelFail);
  956. }
  957. //--------------------------------------------------------------------------------------------
  958. //清理ver文件夹
  959. int closeVerClear = 0;
  960. spConfig->ReadConfigValueInt("ResourceWatcher", "CloseVerClear", closeVerClear);
  961. if (!closeVerClear)
  962. {
  963. int verSaved = DEFAULT_VERSION_SAVED_COUNT;
  964. int tmpSaved = 0;
  965. vector<CVersion> intallInfoVects;
  966. vector<string> files;
  967. spConfig->ReadConfigValueInt("ResourceWatcher", "VerSaveCnt", tmpSaved);
  968. if (tmpSaved > DEFAULT_VERSION_SAVED_COUNT) {
  969. verSaved = tmpSaved;
  970. }
  971. //获取当前目录下的文件夹名称, 将符合命名规则的终端版本名称push_back
  972. CSimpleStringA csPath, verPath;
  973. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("RootVer", csPath); //获取当前版本路劲 例如:C:\Run
  974. if (Error_Succeed == Error) {
  975. if (csPath.IsNullOrEmpty()) {
  976. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("get currVer path is null");
  977. return FALSE;
  978. }
  979. else
  980. {
  981. verPath = csPath; //csPath在后面被用了,还需要个存储version路径变量
  982. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CUR VERSION PATH = %s.", csPath.GetData());
  983. }
  984. }
  985. else
  986. {
  987. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get Ver path error = %u.", Error);
  988. return FALSE;
  989. }
  990. //判断哪些是版本文件夹
  991. #ifdef RVC_OS_LINUX
  992. DIR* dp;
  993. struct dirent* dirp;
  994. //过滤非目标版本文件夹
  995. if ((dp = opendir(csPath.GetData())) != NULL) {
  996. while ((dirp = readdir(dp)) != NULL) {
  997. //files.push_back(string(dirp->d_name));
  998. CInstallInfo verInfo = {};
  999. DWORD dwMajor(0), dwMinor(0), dwRevision(0), dwBuild(0);
  1000. int n = sscanf(dirp->d_name, "%d.%d.%d.%d", &dwMajor, &dwMinor, &dwRevision, &dwBuild);
  1001. if (n != 4)
  1002. {
  1003. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not version file.[%s]", dirp->d_name);
  1004. continue;
  1005. }
  1006. else {
  1007. CVersion verName(dwMajor, dwMinor, dwRevision, dwBuild);
  1008. if (verName.IsValid() && verName < info.InstallVersion) //对高于自身版本的文件不予删除
  1009. {
  1010. intallInfoVects.push_back(verName);
  1011. }
  1012. else {
  1013. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not version file.[%s]", dirp->d_name);
  1014. }
  1015. }
  1016. }
  1017. closedir(dp);
  1018. }
  1019. #else
  1020. long hFile = 0;
  1021. struct _finddata_t fileinfo;//文件信息读取结构
  1022. string p;
  1023. if ((hFile = _findfirst(p.assign(string(csPath.GetData())).append("\\*").c_str(), &fileinfo)) != -1) {
  1024. do {
  1025. CInstallInfo verInfo = {};
  1026. DWORD dwMajor(0), dwMinor(0), dwRevision(0), dwBuild(0);
  1027. int n = sscanf(fileinfo.name, "%d.%d.%d.%d", &dwMajor, &dwMinor, &dwRevision, &dwBuild);
  1028. if (n != 4)
  1029. {
  1030. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not version file.[%s]", fileinfo.name);
  1031. continue;
  1032. }
  1033. else {
  1034. CVersion verName(dwMajor, dwMinor, dwRevision, dwBuild);
  1035. if (verName.IsValid() && verName < info.InstallVersion)
  1036. {
  1037. intallInfoVects.push_back(verName);
  1038. }
  1039. else {
  1040. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not version file.[%s]", fileinfo.name);
  1041. }
  1042. }
  1043. } while (_findnext(hFile, &fileinfo) == 0);
  1044. _findclose(hFile);
  1045. }
  1046. #endif // RVC_OS_LINUX
  1047. int nPackCount = intallInfoVects.size();
  1048. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Install Package's count: %d", nPackCount);
  1049. bool bFailFlag = false;
  1050. int nDelVersionCnt = 0;
  1051. std::string tInfo("");
  1052. //执行版本删除流程
  1053. if (nPackCount != 0) {
  1054. int nSavedCount = 0;
  1055. sort(intallInfoVects.begin(), intallInfoVects.end());
  1056. vector<CVersion>::reverse_iterator riter = intallInfoVects.rbegin();
  1057. while (riter != intallInfoVects.rend()) {
  1058. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("InstallPackage Info: %s", (LPCTSTR)(*riter).ToString());
  1059. if (++nSavedCount <= verSaved) {
  1060. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Save above version");
  1061. riter++;
  1062. continue;
  1063. }
  1064. CSimpleStringA tVerPath;
  1065. int nDelSuc = 0, nDelFail = 0, nFileCount = 0;
  1066. #ifdef RVC_OS_LINUX
  1067. tVerPath = verPath + SPLIT_SLASH_STR + (*riter).ToString();
  1068. #else
  1069. tVerPath = verPath + "\\" + (*riter).ToString();
  1070. #endif // RVC_OS_LINUX
  1071. nFileCount = ProcessFileDelete(tVerPath.GetData(), nDelSuc, nDelFail, true); //版本文件夹连目录一起清理
  1072. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete Version result(%s): count(%d), suc(%d), failed(%d).",
  1073. tVerPath.GetData(), nFileCount, nDelSuc, nDelFail);
  1074. if (nDelFail)
  1075. {
  1076. bFailFlag = true;
  1077. }
  1078. else
  1079. {
  1080. nDelVersionCnt++;
  1081. tInfo = tInfo + "|" + std::string((*riter).ToString().GetData());
  1082. }
  1083. riter++;
  1084. }
  1085. }
  1086. nLstFailed = bFailFlag ? 1 : 0;
  1087. spConfigRun->WriteConfigValueHexInt("VersionClear", "OptVer", info.InstallVersion.GetVersion64());
  1088. spConfigRun->WriteConfigValueInt("VersionClear", "DelVerCnt", nDelCount + nDelVersionCnt);
  1089. spConfigRun->WriteConfigValueInt("VersionClear", "LastCondi", nLstFailed);
  1090. spConfigRun->WriteConfigValue("VersionClear", "LastTime",
  1091. (LPCTSTR)CSimpleStringA::Format("0x%08X", (DWORD)CSmallDateTime::GetNow()));
  1092. if (nDelVersionCnt > 0) {
  1093. std::string warn = "Delete Vesion file count : " + std::to_string((long long)nDelVersionCnt) + ". ----- " + tInfo + ".";
  1094. LogWarn(Severity_Low, Error_Debug, LOG_WARN_VER_DELETE, CSimpleStringA::Format("%s", warn.c_str()));
  1095. }
  1096. }
  1097. return TRUE;
  1098. }
  1099. void ResourceWatcherFSM::DeleteVideoFiles()
  1100. {
  1101. int backDays = 0, closeVideoClear = 0;
  1102. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1103. CSmartPointer<IConfigInfo> spConfig;
  1104. pFunc->OpenConfig(Config_CenterSetting, spConfig);
  1105. spConfig->ReadConfigValueInt("ResourceWatcher", "CloseVideoClear", closeVideoClear);
  1106. if (closeVideoClear)
  1107. {
  1108. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CenterSetting no need video clear.");
  1109. return;
  1110. }
  1111. spConfig->ReadConfigValueInt("ResourceWatcher", "VideoBackDays", backDays);
  1112. if (backDays <= 0)
  1113. {
  1114. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video default backdays:30 days.");
  1115. backDays = VIDEO_DEFAULT_BACKDAYS;
  1116. }
  1117. CSimpleStringA videoPath, verPath;
  1118. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("LocalVideo", videoPath); //获取Video路径
  1119. if (Error_Succeed == Error) {
  1120. if (videoPath.IsNullOrEmpty()) {
  1121. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get LocalVideo path NULL");
  1122. return;
  1123. }
  1124. else
  1125. {
  1126. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("VIDEO PATH = %s.", videoPath.GetData());
  1127. }
  1128. }
  1129. else
  1130. {
  1131. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get LocalVideo error. error = %u.", Error);
  1132. return;
  1133. }
  1134. int nDelSuc = 0, nDelFail = 0, nFileCount = 0;
  1135. nFileCount = ProcessFileDelete(videoPath.GetData(), nDelSuc, nDelFail, false, backDays);
  1136. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete [Video] result(%s): count(%d), suc(%d), failed(%d).", videoPath.GetData(), nFileCount, nDelSuc, nDelFail);
  1137. }
  1138. void ResourceWatcherFSM::SelfTest(EntityTestEnum eTestType,
  1139. CSmartPointer<ITransactionContext> pTransactionContext)
  1140. {
  1141. if (Test_ShakeHand == eTestType)
  1142. {
  1143. pTransactionContext->SendAnswer(Error_Succeed);
  1144. }
  1145. }
  1146. void ResourceWatcherFSM::HardwareInfoTimer(void* pData)
  1147. {
  1148. if (hardwareCheckFlag > 0) {
  1149. GetSystemCPUStatus();
  1150. GetSystemMemoryStatus();
  1151. }
  1152. GetEntityBase()->GetFunction()->ResetTimer(TIMER_HARDWARE_CHECK, hardwareCheckTime);
  1153. }
  1154. void ResourceWatcherFSM::DiskCheckTimer(void* pData)
  1155. {
  1156. if (diskCheckFlag > 0) {
  1157. GetSystemDiskStatus();
  1158. }
  1159. GetEntityBase()->GetFunction()->ResetTimer(TIMER_DISK_CHECK, diskCheckTime);
  1160. }
  1161. ErrorCodeEnum ResourceWatcherFSM::CheckNetType(
  1162. SpReqAnsContext<ResourceWatcherService_CheckNetType_Req, ResourceWatcherService_CheckNetType_Ans>::Pointer ctx)
  1163. {
  1164. ErrorCodeEnum ec = Error_Succeed;
  1165. int netType = 0; //默认未知
  1166. #ifdef RVC_OS_LINUX
  1167. int i = 0;
  1168. int sockfd;
  1169. struct ifconf ifconf;
  1170. struct ifreq* ifreq;
  1171. char buf[1024];
  1172. //初始化ifconf
  1173. ifconf.ifc_len = 1024;
  1174. ifconf.ifc_buf = buf;
  1175. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  1176. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("socket error");
  1177. }
  1178. //获取所有接口信息
  1179. ioctl(sockfd, SIOCGIFCONF, &ifconf);
  1180. //逐个获取Ip地址
  1181. int size = ifconf.ifc_len / sizeof(struct ifreq);
  1182. ifreq = (struct ifreq*)buf;
  1183. string netName(ifreq->ifr_name);
  1184. if (size == 1 && netName == "lo") //只有逻辑地址 -- 网线被拔出
  1185. {
  1186. netType = 1;
  1187. }
  1188. else
  1189. {
  1190. for (i = size; i > 0; i--) {
  1191. string netName(ifreq->ifr_name); //有其他网卡 -- 有线
  1192. if (netName != "lo") {
  1193. netType = 2;
  1194. }
  1195. ifreq++;
  1196. }
  1197. }
  1198. #else
  1199. CoInitialize(NULL);
  1200. // 通过NLA接口获取网络状态
  1201. IUnknown* pUnknown = NULL;
  1202. bool bOnline = true;//是否在线
  1203. HRESULT Result = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL,
  1204. IID_IUnknown, (void**)&pUnknown);
  1205. if (SUCCEEDED(Result)) {
  1206. INetworkListManager* pNetworkListManager = NULL;
  1207. if (pUnknown)
  1208. Result = pUnknown->QueryInterface(IID_INetworkListManager, (void
  1209. **)&pNetworkListManager);
  1210. if (SUCCEEDED(Result)) {
  1211. VARIANT_BOOL IsConnect = VARIANT_FALSE;
  1212. if (pNetworkListManager) {
  1213. //Result = pNetworkListManager->get_IsConnectedToInternet(&IsConnect); //检测互联网连接
  1214. Result = pNetworkListManager->get_IsConnected(&IsConnect); //检测本地网络
  1215. }
  1216. if (SUCCEEDED(Result)) {
  1217. bOnline = (IsConnect == VARIANT_TRUE) ? true : false;
  1218. }
  1219. }
  1220. if (pNetworkListManager)
  1221. pNetworkListManager->Release();
  1222. }
  1223. if (pUnknown)
  1224. pUnknown->Release();
  1225. if (bOnline == true) {
  1226. netType = 2;
  1227. }
  1228. else
  1229. {
  1230. netType = 1;
  1231. }
  1232. #endif // RVC_OS_LINUX
  1233. if (ctx != NULL) {
  1234. ctx->Ans.netType = netType;
  1235. ctx->Answer(ec);
  1236. }
  1237. return ec;
  1238. }
  1239. ErrorCodeEnum ResourceWatcherFSM::GetBizLinks(
  1240. SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req, ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx)
  1241. {
  1242. ErrorCodeEnum ec = Error_Succeed;
  1243. int filter = ctx->Req.filter; //后续过滤使用
  1244. CAutoArray<CSimpleStringA> bizLinks;
  1245. CAutoArray<CSimpleStringA> bizNames;
  1246. CSmartPointer<IConfigInfo> spCtSettingConfig;
  1247. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  1248. if (filter == 0) //用户管理桌面业务网址
  1249. {
  1250. CSimpleStringA mLink(""), adLink(""), tLink("");
  1251. spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrUrlFulture", mLink);
  1252. if (mLink.GetLength() != 0) {
  1253. CSimpleStringA tName = CSimpleStringA("主站点");
  1254. bizNames.Append(&tName, 0, 1);
  1255. bizLinks.Append(&mLink, 0, 1);
  1256. }
  1257. spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrAd", adLink);
  1258. if (adLink.GetLength() != 0) {
  1259. CSimpleStringA tName = CSimpleStringA("广告站点");
  1260. bizNames.Append(&tName, 0, 1);
  1261. bizLinks.Append(&adLink, 0, 1);
  1262. }
  1263. int bizCnt = 0;
  1264. CSimpleStringA info(""), getLink("");
  1265. do {// 主站点|www.test.com
  1266. bizCnt++;
  1267. CSimpleStringA chineseName("");
  1268. CSimpleStringA url("");
  1269. getLink = CSimpleStringA("DesktopDetectUrl").Append(std::to_string(bizCnt).c_str());
  1270. spCtSettingConfig->ReadConfigValue("ResourceWatcher", getLink.GetData(), info);
  1271. if (info.GetLength() != 0) {
  1272. CAutoArray<CSimpleStringA> arr = info.Split('|');
  1273. int len = arr.GetCount();
  1274. if (len != 2) {
  1275. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s]Not Detect Url", info.GetData());
  1276. }
  1277. else
  1278. {
  1279. chineseName = arr[0];
  1280. url = arr[1];
  1281. bizNames.Append(&chineseName, 0, 1);
  1282. bizLinks.Append(&url, 0, 1);
  1283. }
  1284. }
  1285. } while (info.GetLength() != 0);
  1286. }
  1287. else if (filter == 1) //错误页集中配置、准入网址
  1288. {
  1289. int bizCnt = 0;
  1290. CSimpleStringA info(""), getLink("");
  1291. do {// 准入服务|AccessAuth|accessUrl
  1292. bizCnt++;
  1293. CSimpleStringA chineseName(""), entityName(""), key("");
  1294. CSimpleStringA url("");
  1295. getLink = CSimpleStringA("ErrPageDetectUrl").Append(std::to_string(bizCnt).c_str());
  1296. spCtSettingConfig->ReadConfigValue("ResourceWatcher", (LPCTSTR)getLink, info);
  1297. if (info.GetLength() != 0) {
  1298. CAutoArray<CSimpleStringA> arr = info.Split('|');
  1299. int len = arr.GetCount();
  1300. if (len != 3) {
  1301. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s]Not errPage Check config info.", info.GetData());
  1302. }
  1303. else
  1304. {
  1305. chineseName = arr[0];
  1306. entityName = arr[1];
  1307. key = arr[2];
  1308. spCtSettingConfig->ReadConfigValue(entityName.GetData(), key.GetData(), url);
  1309. if (url.GetLength() != 0) {
  1310. bizNames.Append(&chineseName, 0, 1);
  1311. bizLinks.Append(&url, 0, 1);
  1312. }
  1313. else
  1314. {
  1315. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get errPage detecet url failed. EntityName:(%s), Key:(%s).",
  1316. entityName.GetData(), key.GetData());
  1317. }
  1318. }
  1319. }
  1320. } while (info.GetLength() != 0);
  1321. }
  1322. ctx->Ans.bizLinks = bizLinks;
  1323. ctx->Ans.bizNames = bizNames;
  1324. if (ctx != NULL) {
  1325. ctx->Answer(ec);
  1326. }
  1327. return ec;
  1328. }
  1329. #ifdef _MSC_VER
  1330. bool ResourceWatcherFSM::CreateLinkFile(const CSimpleStringA& szStartAppPath, const CSimpleStringA& szAddCmdLine,
  1331. const CSimpleStringA& szDestLnkPath, const CSimpleStringA& szIconPath)
  1332. {
  1333. HRESULT hr = CoInitialize(NULL);
  1334. bool bRet = false;
  1335. if (SUCCEEDED(hr))
  1336. {
  1337. IShellLink* pShellLink;
  1338. hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pShellLink);
  1339. if (SUCCEEDED(hr))
  1340. {
  1341. pShellLink->SetPath(szStartAppPath);
  1342. string strTmp = szStartAppPath;
  1343. int nStart = strTmp.find_last_of("/\\");
  1344. pShellLink->SetWorkingDirectory(strTmp.substr(0, nStart).c_str());
  1345. pShellLink->SetArguments(szAddCmdLine);
  1346. if (szIconPath)
  1347. {
  1348. pShellLink->SetIconLocation(szIconPath, 0);
  1349. }
  1350. IPersistFile* pPersistFile;
  1351. hr = pShellLink->QueryInterface(IID_IPersistFile, (void**)&pPersistFile);
  1352. if (SUCCEEDED(hr))
  1353. {
  1354. hr = pPersistFile->Save(CSimpleStringA2W(szDestLnkPath).GetData(), FALSE);
  1355. if (SUCCEEDED(hr))
  1356. {
  1357. bRet = true;
  1358. }
  1359. pPersistFile->Release();
  1360. }
  1361. pShellLink->Release();
  1362. }
  1363. CoUninitialize();
  1364. }
  1365. return bRet;
  1366. }
  1367. bool ResourceWatcherFSM::CreateLink(int nType, const CSimpleStringA& exePath)
  1368. {
  1369. bool result(false);
  1370. CSimpleStringA icoPath;
  1371. ErrorCodeEnum Error = GetEntityBase()->GetFunction()->GetPath("Bin", icoPath);
  1372. icoPath = icoPath + "\\" + "VTM.ico";
  1373. CSimpleStringA strRvc(true);
  1374. GetEntityBase()->GetFunction()->GetPath("rvc", strRvc);
  1375. if (!strRvc.IsNullOrEmpty()) {
  1376. strRvc += "\\Resources";
  1377. if (!ExistsDirA(strRvc)) {
  1378. CreateDirA(strRvc, TRUE);
  1379. }
  1380. strRvc += "\\VTM.ico";
  1381. if (!ExistsFileA(strRvc) && ExistsFileA(icoPath)) {
  1382. CopyFileA(icoPath, strRvc, FALSE);
  1383. }
  1384. if (ExistsFileA(strRvc)) {
  1385. icoPath = strRvc.GetData();
  1386. }
  1387. }
  1388. if (!ExistsFileA(icoPath)) {
  1389. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s is not exist", icoPath.GetData());
  1390. return result;
  1391. }
  1392. LPITEMIDLIST lp;
  1393. CHAR lstr[MAX_PATH] = "";
  1394. if (nType == 0) {
  1395. CSimpleStringA s(true);
  1396. GetUserDesktopDirectory(s);
  1397. s += "\\可视柜台.lnk";
  1398. if (!(result = CreateLinkFile(exePath, "", s, icoPath))) {
  1399. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Create link file for DESKTOP fail");
  1400. }
  1401. }
  1402. else if (nType == 1) {
  1403. SHGetSpecialFolderLocation(0, CSIDL_PROGRAMS, &lp);
  1404. memset(lstr, 0, strlen(lstr));
  1405. SHGetPathFromIDList(lp, lstr);
  1406. CSimpleStringA s = lstr;
  1407. s += "\\可视柜台.lnk";
  1408. if (!(result = CreateLinkFile(exePath, "", s, icoPath)))
  1409. {
  1410. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Create link file for PROGRAMS fail");
  1411. }
  1412. }
  1413. else if (nType == 2) {
  1414. SHGetSpecialFolderLocation(0, CSIDL_STARTUP /*CSIDL_COMMON_STARTUP*/, &lp);
  1415. memset(lstr, 0, strlen(lstr));
  1416. SHGetPathFromIDList(lp, lstr);
  1417. CSimpleStringA s = lstr;
  1418. s += "\\";
  1419. s += STRATUP_FILENAME_FROM_SCRIPTS;
  1420. if (!(result = CreateLinkFile(exePath, "", s, icoPath)))
  1421. {
  1422. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Create link file for STARTUP fail");
  1423. }
  1424. }
  1425. else {
  1426. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot support link create type: %d", nType);
  1427. }
  1428. return result;
  1429. }
  1430. bool ResourceWatcherFSM::GetVTMExePath(CSimpleStringA& strValue, bool FailIfNotExist)
  1431. {
  1432. bool result(false);
  1433. CSimpleStringA exePath(true);
  1434. strValue = "";
  1435. ErrorCodeEnum rc = GetEntityBase()->GetFunction()->GetPath("RootVer", exePath);
  1436. if (exePath.IsNullOrEmpty() || rc != Error_Succeed) {
  1437. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get RootVer path failed: %s", SpStrError(rc));
  1438. }
  1439. else {
  1440. exePath.Append("\\VTM.exe");
  1441. if (FailIfNotExist && !ExistsFileA(exePath)) {
  1442. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[% s] is not existed!", exePath.GetData());
  1443. }
  1444. else {
  1445. result = true;
  1446. }
  1447. strValue = exePath;
  1448. }
  1449. return result;
  1450. }
  1451. bool ResourceWatcherFSM::CopyExeToRoot(const CSimpleStringA& csVersion, const CSimpleStringA& aimExePath)
  1452. {
  1453. CSimpleStringA rootVerPath(true), exePath(true);
  1454. ErrorCodeEnum rc = GetEntityBase()->GetFunction()->GetPath("RootVer", rootVerPath);
  1455. if (rc == Error_Succeed)
  1456. {
  1457. CSimpleStringA srcExePath, csPath = rootVerPath;
  1458. srcExePath = rootVerPath + "\\" + csVersion.GetData() + "\\bin\\VTM.exe";
  1459. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("srcExePath:%s exePath:%s", srcExePath.GetData());
  1460. if (!ExistsFileA(srcExePath)) {
  1461. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s is not exist!", srcExePath.GetData());
  1462. return false;
  1463. }
  1464. if (!CopyFileA(srcExePath.GetData(), aimExePath.GetData(), FALSE))
  1465. {
  1466. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CopyFileA Fail error :%d ", GetLastError());
  1467. return false;
  1468. }
  1469. }
  1470. else {
  1471. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetPath 4 RootVer failed: %s", SpStrError(rc));
  1472. return false;
  1473. }
  1474. return true;
  1475. }
  1476. bool ResourceWatcherFSM::GetVtmVersionFromActiveTxt(CSimpleStringA& csVersion)
  1477. {
  1478. bool bRet = false;
  1479. CSimpleStringA rootVerPath;
  1480. ErrorCodeEnum rc = GetEntityBase()->GetFunction()->GetPath("RootVer", rootVerPath);//获取version根路径
  1481. if (rc != Error_Succeed) {
  1482. LogWarn(Severity_Middle, Error_Exception, LOG_RESOURCEWATCHER_OPEN_ACTIVE_FAIL, "testActive fail , get RootVer path is failed");
  1483. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A06")("testActive fail , get RootVer path is failed!");
  1484. return false;
  1485. }
  1486. CSimpleStringA strActiveFile = CSimpleStringA::Format("%s\\active.txt", rootVerPath.GetData());
  1487. FILE* pFile = fopen(strActiveFile.GetData(), "rb+");
  1488. if (pFile != NULL)
  1489. {
  1490. char szTemp[256] = {};
  1491. char szVersion[32] = {};
  1492. int n = fread(szTemp, 1, 256, pFile);
  1493. strncpy_s(szVersion, sizeof(szVersion), szTemp, _TRUNCATE);
  1494. csVersion = szVersion;
  1495. fclose(pFile);
  1496. bRet = true;
  1497. }
  1498. else
  1499. {
  1500. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open active.txt failed.");
  1501. bRet = false;
  1502. }
  1503. return bRet;
  1504. }
  1505. bool ResourceWatcherFSM::GetRegValue(HKEY hKey, LPCTSTR lpcszParam, CSimpleStringA& strValue)
  1506. {
  1507. DWORD dwType = REG_SZ;
  1508. TCHAR szValue[MAX_PATH + 1] = { 0 };
  1509. DWORD dwSize = MAX_PATH * sizeof(CHAR);
  1510. memset(szValue, '\0', MAX_PATH + 1);
  1511. LONG lResult = RegQueryValueExA(hKey, lpcszParam, NULL, &dwType, (LPBYTE)szValue, &dwSize);
  1512. if (lResult == ERROR_SUCCESS) {
  1513. strValue = szValue;
  1514. return true;
  1515. }
  1516. else {
  1517. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("RegQueryValueEx for \"%s\" error, result=%ld.", lpcszParam, lResult);
  1518. return false;
  1519. }
  1520. }
  1521. /** 方案设计见:https://processon.paas.cmbchina.com/home/view/link/66d12df48139570821109ecf#WIN端应用开机自启动方式优化(实体实现) [Gifur@2024830]*/
  1522. void ResourceWatcherFSM::DetectAutoStartupCover()
  1523. {
  1524. CSimpleStringA strStartupPath(true);
  1525. const int nStartupType = DetectAutoStartupType(strStartupPath);
  1526. ErrorCodeEnum rc = Error_InvalidState;
  1527. const int setType = InitialAutoStartupSetType();
  1528. /** 是否去移除开始自启动菜单中对应的文件 [Gifur@2024830]*/
  1529. bool toDeleteAutoStartFile(false);
  1530. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("current startup type:%d, aim start type:%d", nStartupType, setType);
  1531. switch (setType)
  1532. {
  1533. case 1://将VBS改成EXE,前提是VBS必须已在注册表
  1534. if (nStartupType == 1) {
  1535. rc = ChangeAutoStartupWithExe();
  1536. }
  1537. break;
  1538. case 2: //设置使用EXE注册表自启动,包括之前VBS、没设置、老安装的开机自启动
  1539. if (nStartupType == 1 || nStartupType == 0 || nStartupType == 3) {
  1540. rc = ChangeAutoStartupWithExe();
  1541. if (rc == Error_Succeed && nStartupType == 3) {
  1542. toDeleteAutoStartFile = true;
  1543. }
  1544. }
  1545. break;
  1546. case 5: //设置使用EXE注册表自启动(涵盖所有类型)
  1547. if (nStartupType == 1 || nStartupType == 0 || nStartupType == 3 || nStartupType == 4 || nStartupType == 5) {
  1548. rc = ChangeAutoStartupWithExe();
  1549. if (rc == Error_Succeed && (nStartupType == 3 || nStartupType == 4 || nStartupType == 5)) {
  1550. toDeleteAutoStartFile = true;
  1551. //这里不做清理,因为以前也没有问题
  1552. }
  1553. }
  1554. break;
  1555. case 3: //不设置开机自启动
  1556. if (nStartupType == 1 || nStartupType == 2) {
  1557. rc = ChangeAutoStartupWithExe(false, true);
  1558. }
  1559. else if (nStartupType == 3 || nStartupType == 4 || nStartupType == 5) {
  1560. toDeleteAutoStartFile = true;
  1561. //这里不做清理,因为可以自动的一个一个删除
  1562. }
  1563. break;
  1564. case 4: //恢复VBS启动(防止EXE启动失败),几乎不会用到
  1565. if (nStartupType == 2 || nStartupType == 0) {
  1566. rc = ChangeAutoStartupWithExe(true);
  1567. }
  1568. break;
  1569. case 6: //设置为开机后开始菜单自启动(涵盖所有类型)
  1570. {
  1571. CSimpleStringA exePath(true);
  1572. if (nStartupType == 1 || nStartupType == 2 || nStartupType == 3 || nStartupType == 5) {
  1573. if (GetVTMExePath(exePath, true)) {
  1574. if (nStartupType == 1 || nStartupType == 2) {
  1575. //TODO: 如果出现修改注册表成功但是设置自启动图标失败的情况 [Gifur@202492]
  1576. rc = ChangeAutoStartupWithExe(false, true);
  1577. }
  1578. else if (nStartupType == 3 || nStartupType == 5) {
  1579. rc = Error_Succeed;
  1580. }
  1581. if (rc == Error_Succeed) {
  1582. rc = CreateLink(2, exePath) ? Error_Succeed : Error_Unexpect;
  1583. if (rc != Error_Succeed) {
  1584. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_FAILED,
  1585. CSimpleStringA::Format("Create autostart lnk failed, old start type: %d", nStartupType));
  1586. }
  1587. else {
  1588. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_SUCC,
  1589. CSimpleStringA::Format("Create autostart lnk succ, old start type: %d", nStartupType));
  1590. if ((nStartupType == 3 || nStartupType == 5)) { toDeleteAutoStartFile = true; }
  1591. DeleteDuplicateAutoStartFile(true);
  1592. }
  1593. }
  1594. }
  1595. else {
  1596. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_FAILED,
  1597. CSimpleStringA::Format("[%d][%s] is not exist", setType, exePath.GetData()));
  1598. }
  1599. }
  1600. }
  1601. case 7: //设置为开机后开始菜单自启动(针对仅有桌面开机自启动的)
  1602. {
  1603. CSimpleStringA exePath(true);
  1604. if ((nStartupType == 3 || nStartupType == 5)) {
  1605. if (GetVTMExePath(exePath, true)) {
  1606. rc = CreateLink(2, exePath) ? Error_Succeed : Error_Unexpect;
  1607. if (rc != Error_Succeed) {
  1608. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_FAILED,
  1609. CSimpleStringA::Format("Create autostart lnk failed, old start type: %d", nStartupType));
  1610. }
  1611. else {
  1612. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_SUCC,
  1613. CSimpleStringA::Format("Create autostart lnk succ, old start type: %d", nStartupType));
  1614. toDeleteAutoStartFile = true;
  1615. DeleteDuplicateAutoStartFile(true);
  1616. }
  1617. }
  1618. else {
  1619. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_FAILED,
  1620. CSimpleStringA::Format("[%d][%s] is not exist", setType, exePath.GetData()));
  1621. }
  1622. }
  1623. }
  1624. break;
  1625. default:
  1626. break;
  1627. }
  1628. if (toDeleteAutoStartFile) {
  1629. if (!strStartupPath.IsNullOrEmpty() && ExistsFileA(strStartupPath)) {
  1630. BOOL rmRet = RemoveFileA(strStartupPath);
  1631. if (!rmRet && ExistsFileA(strStartupPath)) {
  1632. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("remove auto start lnk file failed: %s, GLE=%u", strStartupPath.GetData(), GetLastError());
  1633. }
  1634. else {
  1635. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remove auto start lnk file: %s", strStartupPath.GetData());
  1636. }
  1637. }
  1638. }
  1639. }
  1640. static int Is32R64Platform()
  1641. {
  1642. static int isWow64 = -1;
  1643. typedef BOOL(WINAPI* LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
  1644. if (isWow64 == -1) {
  1645. BOOL bIsWow64 = FALSE;
  1646. LPFN_ISWOW64PROCESS fnIsWow64Process =
  1647. (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process");
  1648. if (NULL != fnIsWow64Process) {
  1649. if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) {
  1650. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("detect is running with 64bit or not failed: %u", GetLastError());
  1651. return -1;
  1652. }
  1653. else
  1654. {
  1655. isWow64 = bIsWow64 ? 1 : 0;
  1656. }
  1657. }
  1658. }
  1659. return isWow64;
  1660. }
  1661. int ResourceWatcherFSM::DetectAutoStartupType(CSimpleStringA& strValue)
  1662. {
  1663. LOG_FUNCTION();
  1664. int vbsType = -1;
  1665. DWORD dwFlag = KEY_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS;
  1666. if (Is32R64Platform() != 0) {
  1667. dwFlag |= KEY_WOW64_64KEY;
  1668. }
  1669. bool explorerSet = false;
  1670. CSimpleStringA regeditValue(true);
  1671. HKEY hKey;
  1672. LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  1673. TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
  1674. 0, dwFlag, &hKey);
  1675. if (lResult == ERROR_SUCCESS) {
  1676. DWORD dwType = REG_SZ;
  1677. DWORD dwSize = MAX_PATH * sizeof(TCHAR);
  1678. TCHAR szValue[MAX_PATH + 1] = { 0 };
  1679. memset(szValue, '\0', MAX_PATH + 1);
  1680. lResult = RegQueryValueExA(hKey, "Shell", NULL, &dwType, (LPBYTE)szValue, &dwSize);
  1681. if (lResult == ERROR_SUCCESS) {
  1682. std::string strValue(szValue);
  1683. regeditValue = szValue;
  1684. strValue = SP::Utility::ToLower(strValue);
  1685. CSimpleStringA value(strValue.c_str());
  1686. if (value.IsStartWith("wscript", true) && value.IsEndWith(".vbs", true)) {
  1687. LogWarn(Severity_Low, Error_Debug, LOG_WARN_AUTO_STARTUP_FROM_REGIST, regeditValue);
  1688. vbsType = 1;
  1689. }
  1690. else if (value.IsEndWith("vtm.exe", true)) {
  1691. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHECK_AUTO_STARTUP_WITH_EXE, regeditValue);
  1692. vbsType = 2;
  1693. }
  1694. else if (value.Compare("explorer.exe") == 0) {
  1695. vbsType = 0;
  1696. explorerSet = true;
  1697. }
  1698. else {
  1699. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHECK_AUTO_STARTUP_UNKNOWN, regeditValue);
  1700. vbsType = 0;
  1701. }
  1702. }
  1703. else {
  1704. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_CHECK_AUTO_STARTUP_FROM_REGIST_FAILED,
  1705. CSimpleStringA::Format("RegQueryValueEx error returned %u, GLE=%u.", lResult, GetLastError()));
  1706. }
  1707. }
  1708. else {
  1709. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_CHECK_AUTO_STARTUP_FROM_REGIST_FAILED,
  1710. CSimpleStringA::Format("RegOpenKeyEx error, GLE=%u.", GetLastError()));
  1711. }
  1712. RegCloseKey(hKey);
  1713. if (vbsType == 0 || vbsType == -1) {
  1714. CSimpleStringA strLnkPath(true);
  1715. int scriptType;
  1716. if (IsHasSetAutoStartupByFolder(strLnkPath, scriptType)) {
  1717. if (0 == scriptType) {
  1718. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHECK_AUTO_STARTUP_WITH_STARTMENU_FROMSETUP, strLnkPath);
  1719. vbsType = 3;
  1720. }
  1721. else if(1 == scriptType){
  1722. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHECK_AUTO_STARTUP_WITH_STARTMENU_FROMSCRIPT, strLnkPath);
  1723. vbsType = 4;
  1724. }
  1725. else {
  1726. LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHECK_AUTO_STARTUP_WITH_STARTMENU_FROMCUSTOM, strLnkPath);
  1727. vbsType = 5;
  1728. }
  1729. regeditValue = strLnkPath;
  1730. }
  1731. else if (vbsType == 0 && explorerSet) {
  1732. LogWarn(Severity_Low, Error_Debug, LOG_WARN_NOT_AUTO_STARTUP_FROM_REGIST, regeditValue);
  1733. }
  1734. }
  1735. strValue = regeditValue;
  1736. return vbsType;
  1737. }
  1738. ErrorCodeEnum ResourceWatcherFSM::ChangeAutoStartupWithExe(bool resetVBS, bool resetExplorer)
  1739. {
  1740. const char* exploreExe = "explorer.exe";
  1741. ErrorCodeEnum result(Error_Succeed);
  1742. CSimpleStringA exePath(true);
  1743. if (resetExplorer) {
  1744. exePath = exploreExe;
  1745. }
  1746. else
  1747. {
  1748. result = GetEntityBase()->GetFunction()->GetPath("RootVer", exePath);
  1749. if (exePath.IsNullOrEmpty() || result != Error_Succeed) {
  1750. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A09").setAPI("ChangeAutoStartupWithExe")("Get RootVer path failed: %d", result);
  1751. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_UPDATE_AUTO_STARTUP_WITH_EXE_FAILED, CSimpleStringA::Format("Get RootVer path failed: %d", result));
  1752. return Error_Unexpect;
  1753. }
  1754. if (!resetVBS)
  1755. exePath.Append("\\VTM.exe");
  1756. else
  1757. exePath.Append("\\spexplorerfast.vbs");
  1758. if (!ExistsFileA(exePath)) {
  1759. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A09").setAPI("ChangeAutoStartupWithExe")("[%s] is not existed!", exePath.GetData());
  1760. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_UPDATE_AUTO_STARTUP_WITH_EXE_FAILED, CSimpleStringA::Format("[%s] is not existed!", exePath.GetData()));
  1761. return Error_NotExist;
  1762. }
  1763. }
  1764. DWORD dwFlag = KEY_WRITE;
  1765. if (Is32R64Platform() != 0) {
  1766. dwFlag |= KEY_WOW64_64KEY;
  1767. }
  1768. HKEY hKey;
  1769. LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  1770. TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), 0, dwFlag, &hKey);
  1771. if (lResult == ERROR_SUCCESS) {
  1772. lResult = RegSetValueExA(hKey, "Shell", 0, REG_SZ, (const BYTE*)exePath.GetData(), exePath.GetLength());
  1773. if (lResult == ERROR_SUCCESS) {
  1774. LogWarn(Severity_Low, Error_Debug, LOG_WARN_UPDATE_AUTO_STARTUP_WITH_EXE_SUCC
  1775. , CSimpleStringA::Format("RegSetValueExA for Shell with %s succ!", exePath.GetData()));
  1776. result = Error_Succeed;
  1777. }
  1778. else
  1779. {
  1780. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A09").setAPI("ChangeAutoStartupWithExe")
  1781. ("RegSetValueExA for Shell with %s failed: %d", exePath.GetData(), lResult);
  1782. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_UPDATE_AUTO_STARTUP_WITH_EXE_FAILED
  1783. , CSimpleStringA::Format("RegSetValueExA for Shell with %s failed: %d", exePath.GetData(), lResult));
  1784. result = Error_Unexpect;
  1785. }
  1786. }
  1787. else
  1788. {
  1789. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A09").setAPI("ChangeAutoStartupWithExe")
  1790. ("RegOpenKeyEx for write %s failed: %d", exePath.GetData(), lResult);
  1791. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_UPDATE_AUTO_STARTUP_WITH_EXE_FAILED
  1792. , CSimpleStringA::Format("RegOpenKeyEx for write %s failed: %d", exePath.GetData(), lResult));
  1793. result = Error_Unexpect;
  1794. }
  1795. RegCloseKey(hKey);
  1796. return result;
  1797. }
  1798. int ResourceWatcherFSM::InitialAutoStartupSetType()
  1799. {
  1800. int ret = 0;
  1801. CSmartPointer<IConfigInfo> spConfig;
  1802. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
  1803. int value(0);
  1804. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "AutoStartCMD", value);
  1805. if (value != 0) {
  1806. ret = value;
  1807. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get AutoStartCMD from CenterSettings: %d", ret);
  1808. }
  1809. return ret;
  1810. }
  1811. void ResourceWatcherFSM::DeleteDuplicateAutoStartFile(bool toDeleteLastLegity)
  1812. {
  1813. std::vector<std::string> userlist;
  1814. std::vector<std::string> publist;
  1815. std::string userPath(""), pubPath("");
  1816. std::vector<std::string> autolist;
  1817. autolist.push_back(CMB_LINK_FILE_NAME);
  1818. GetAutoStartFile(userPath, userlist, pubPath, publist);
  1819. if (!keyPublist.empty() || !keyUserlist.empty()) {
  1820. for (auto it = userlist.cbegin(); keyUserlist.size() > 0 && it != userlist.cend(); ++it) {
  1821. for (auto kt = keyUserlist.cbegin(); kt != keyUserlist.cend(); ++kt) {
  1822. CSimpleStringA strfilename(it->c_str());
  1823. if (strfilename.Compare(kt->c_str()) == 0) {
  1824. CSimpleStringA fullStartFileNameFromScripts(userPath.c_str());
  1825. fullStartFileNameFromScripts += "\\";
  1826. fullStartFileNameFromScripts += strfilename;
  1827. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1828. const auto r = DeleteFileA(fullStartFileNameFromScripts);
  1829. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete AutoStart File:[%s]", fullStartFileNameFromScripts);
  1830. }
  1831. }
  1832. }
  1833. if (toDeleteLastLegity) {
  1834. for (auto kt = autolist.cbegin(); kt != autolist.cend(); ++kt) {
  1835. CSimpleStringA strfilename(it->c_str());
  1836. if (strfilename.Compare(kt->c_str()) == 0) {
  1837. CSimpleStringA fullStartFileNameFromScripts(userPath.c_str());
  1838. fullStartFileNameFromScripts += "\\";
  1839. fullStartFileNameFromScripts += strfilename;
  1840. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1841. const auto r = DeleteFileA(fullStartFileNameFromScripts);
  1842. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete AutoStart from autolist File:[%s]", fullStartFileNameFromScripts);
  1843. }
  1844. }
  1845. }
  1846. }
  1847. }
  1848. for (auto it = publist.cbegin(); keyPublist.size() > 0 && it != publist.cend(); ++it) {
  1849. for (auto kt = keyPublist.cbegin(); kt != keyPublist.cend(); ++kt) {
  1850. CSimpleStringA strfilename(it->c_str());
  1851. if (strfilename.Compare(kt->c_str()) == 0) {
  1852. CSimpleStringA fullStartFileNameFromScripts(pubPath.c_str());
  1853. fullStartFileNameFromScripts += "\\";
  1854. fullStartFileNameFromScripts += strfilename;
  1855. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1856. const auto r = DeleteFileA(fullStartFileNameFromScripts);
  1857. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete AutoStart File:[%s]", fullStartFileNameFromScripts);
  1858. }
  1859. }
  1860. }
  1861. if (toDeleteLastLegity) {
  1862. for (auto kt = autolist.cbegin(); kt != autolist.cend(); ++kt) {
  1863. CSimpleStringA strfilename(it->c_str());
  1864. if (strfilename.Compare(kt->c_str()) == 0) {
  1865. CSimpleStringA fullStartFileNameFromScripts(pubPath.c_str());
  1866. fullStartFileNameFromScripts += "\\";
  1867. fullStartFileNameFromScripts += strfilename;
  1868. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1869. const auto r = DeleteFileA(fullStartFileNameFromScripts);
  1870. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete AutoStart from autolist File:[%s]", fullStartFileNameFromScripts);
  1871. }
  1872. }
  1873. }
  1874. }
  1875. }
  1876. }
  1877. }
  1878. BOOL ResourceWatcherFSM::IsHasSetAutoStartupByFolder(CSimpleStringA& strPath, int& setType)
  1879. {
  1880. BOOL result(FALSE);
  1881. strPath.Clear();
  1882. setType = -1;
  1883. std::vector<std::string> userlist;
  1884. std::vector<std::string> publist;
  1885. std::string userPath(""), pubPath("");
  1886. GetAutoStartFile(userPath, userlist, pubPath, publist);
  1887. //检查是否由用户自定义的开机自启动快捷键
  1888. if (!result && (!keyPublist.empty() || !keyUserlist.empty())) {
  1889. for (auto it = userlist.cbegin(); !result && keyUserlist.size() > 0 && it != userlist.cend(); ++it) {
  1890. for (auto kt = keyUserlist.cbegin(); kt != keyUserlist.cend(); ++kt) {
  1891. CSimpleStringA strfilename(it->c_str());
  1892. if (strfilename.Compare(kt->c_str()) == 0) {
  1893. CSimpleStringA fullStartFileNameFromScripts(userPath.c_str());
  1894. fullStartFileNameFromScripts += "\\";
  1895. fullStartFileNameFromScripts += strfilename;
  1896. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1897. setType = 2;
  1898. strPath = fullStartFileNameFromScripts;
  1899. result = TRUE;
  1900. break;
  1901. }
  1902. else {
  1903. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%d]file is not exist:%s", __LINE__, fullStartFileNameFromScripts.GetData());
  1904. }
  1905. }
  1906. }
  1907. }
  1908. for (auto it = publist.cbegin(); !result && keyPublist.size() > 0 && it != publist.cend(); ++it) {
  1909. for (auto kt = keyPublist.cbegin(); kt != keyPublist.cend(); ++kt) {
  1910. CSimpleStringA strfilename(it->c_str());
  1911. if (strfilename.Compare(kt->c_str()) == 0) {
  1912. CSimpleStringA fullStartFileNameFromScripts(pubPath.c_str());
  1913. fullStartFileNameFromScripts += "\\";
  1914. fullStartFileNameFromScripts += strfilename;
  1915. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1916. setType = 2;
  1917. strPath = fullStartFileNameFromScripts;
  1918. result = TRUE;
  1919. break;
  1920. }
  1921. else {
  1922. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%d]file is not exist:%s", __LINE__, fullStartFileNameFromScripts.GetData());
  1923. }
  1924. }
  1925. }
  1926. }
  1927. }
  1928. if (!result) {
  1929. //检查是否旧安装向导安装的脚本
  1930. for (auto it = publist.cbegin(); !result && it != publist.cend(); ++it) {
  1931. CSimpleStringA strfilename(it->c_str());
  1932. const int tmpType = (strfilename.Compare(CMB_LINK_FILE_NAME) == 0 || (strfilename.IsStartWith("招商银行可视柜台") && strfilename.IsEndWith(".lnk"))) ? 0 : -1;
  1933. if (tmpType == 0) {
  1934. CSimpleStringA fullStartFileNameFromScripts(pubPath.c_str());
  1935. fullStartFileNameFromScripts += "\\";
  1936. fullStartFileNameFromScripts += strfilename;
  1937. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1938. setType = tmpType;
  1939. strPath = fullStartFileNameFromScripts;
  1940. result = TRUE;
  1941. break;
  1942. }
  1943. else {
  1944. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%d]file is not exist:%s", __LINE__, fullStartFileNameFromScripts.GetData());
  1945. }
  1946. }
  1947. }
  1948. for (auto it = userlist.cbegin(); !result && it != userlist.cend(); ++it) {
  1949. CSimpleStringA strfilename(it->c_str());
  1950. const int tmpType = (strfilename.Compare(CMB_LINK_FILE_NAME) == 0 || (strfilename.IsStartWith("招商银行可视柜台") && strfilename.IsEndWith(".lnk"))) ? 0 : -1;
  1951. if (tmpType == 0) {
  1952. CSimpleStringA fullStartFileNameFromScripts(userPath.c_str());
  1953. fullStartFileNameFromScripts += "\\";
  1954. fullStartFileNameFromScripts += strfilename;
  1955. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1956. setType = tmpType;
  1957. strPath = fullStartFileNameFromScripts;
  1958. result = TRUE;
  1959. break;
  1960. }
  1961. else {
  1962. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%d]file is not exist:%s", __LINE__, fullStartFileNameFromScripts.GetData());
  1963. }
  1964. }
  1965. }
  1966. }
  1967. if (!result) {
  1968. //最终再检查是否由安装脚本执行的安装向导
  1969. for (auto it = publist.cbegin(); !result && it != publist.cend(); ++it) {
  1970. CSimpleStringA strfilename(it->c_str());
  1971. if (strfilename.Compare(STRATUP_FILENAME_FROM_SCRIPTS) == 0) {
  1972. CSimpleStringA fullStartFileNameFromScripts(pubPath.c_str());
  1973. fullStartFileNameFromScripts += "\\";
  1974. fullStartFileNameFromScripts += strfilename;
  1975. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1976. setType = 1;
  1977. strPath = fullStartFileNameFromScripts;
  1978. result = TRUE;
  1979. break;
  1980. }
  1981. else {
  1982. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%d]file is not exist:%s", __LINE__, fullStartFileNameFromScripts.GetData());
  1983. }
  1984. }
  1985. }
  1986. for (auto it = userlist.cbegin(); !result && it != userlist.cend(); ++it) {
  1987. CSimpleStringA strfilename(it->c_str());
  1988. if (strfilename.Compare(STRATUP_FILENAME_FROM_SCRIPTS) == 0) {
  1989. CSimpleStringA fullStartFileNameFromScripts(userPath.c_str());
  1990. fullStartFileNameFromScripts += "\\";
  1991. fullStartFileNameFromScripts += strfilename;
  1992. if (ExistsFileA(fullStartFileNameFromScripts)) {
  1993. setType = 1;
  1994. strPath = fullStartFileNameFromScripts;
  1995. result = TRUE;
  1996. break;
  1997. }
  1998. else {
  1999. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[%d]file is not exist:%s", __LINE__, fullStartFileNameFromScripts.GetData());
  2000. }
  2001. }
  2002. }
  2003. }
  2004. return result;
  2005. }
  2006. void ResourceWatcherFSM::DetectVersionHasChangedAndWarn()
  2007. {
  2008. CSmartPointer<IConfigInfo> spRunConfig;
  2009. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
  2010. UINT64 utVersion = 0;
  2011. spRunConfig->ReadConfigValueHexInt("VersionMonitor", "LastVer", utVersion);
  2012. CVersion lastVer(utVersion);
  2013. if (lastVer.IsValid() && lastVer > m_RvcSysinfo.InstallVersion) {
  2014. CSimpleStringA rootVerPath;
  2015. CSimpleStringA warnInfo = CSimpleStringA::Format("version changed from %s to %s", lastVer.ToString().GetData(), m_RvcSysinfo.InstallVersion.ToString().GetData());
  2016. GetEntityBase()->GetFunction()->GetPath("RootVer", rootVerPath);
  2017. CSimpleStringA csPath = rootVerPath + SPLIT_SLASH_STR + "active.txt";
  2018. if (!ExistsFileA(csPath)) {
  2019. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A0A").setAPI(__FUNCTION__)
  2020. ("%s: active.txt not exist!", warnInfo.GetData());
  2021. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_ACTIVE_FILE_CHANGE, CSimpleStringA::Format("%s: active.txt not exist!", warnInfo.GetData()));
  2022. }
  2023. else
  2024. {
  2025. CSimpleFileComponent activeFileInfo;
  2026. HANDLE hFile = CreateFileA(
  2027. csPath,
  2028. GENERIC_READ,
  2029. FILE_SHARE_READ,
  2030. NULL,
  2031. OPEN_EXISTING,
  2032. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
  2033. NULL);
  2034. if (hFile == INVALID_HANDLE_VALUE) {
  2035. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A0A").setAPI(__FUNCTION__)
  2036. ("%s: active.txt open failed %u", warnInfo.GetData(), GetLastError());
  2037. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_ACTIVE_FILE_CHANGE, CSimpleStringA::Format("%s: active.txt open failed %u", warnInfo.GetData(), GetLastError()));
  2038. }
  2039. else
  2040. {
  2041. GetFileTime(hFile, (LPFILETIME)&activeFileInfo.mftCreate,
  2042. (LPFILETIME)&activeFileInfo.mftAccess, (LPFILETIME)&activeFileInfo.mftModified);
  2043. CloseHandle(hFile);
  2044. char szFormat1[128] = { 0 };
  2045. GetTimeFormatStr(szFormat1, 128, (FILETIME*)&activeFileInfo.mftCreate);
  2046. char szFormat2[128] = { 0 };
  2047. GetTimeFormatStr(szFormat2, 128, (FILETIME*)&activeFileInfo.mftAccess);
  2048. char szFormat3[128] = { 0 };
  2049. GetTimeFormatStr(szFormat3, 128, (FILETIME*)&activeFileInfo.mftModified);
  2050. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A0A").setAPI(__FUNCTION__)
  2051. ("%s: active.txt create at %s, access at %s, modified at %s", warnInfo.GetData(), szFormat1, szFormat2, szFormat3);
  2052. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_ACTIVE_FILE_CHANGE, CSimpleStringA::Format(
  2053. "%s: active.txt create at %s, access at %s, modified at %s", warnInfo.GetData(), szFormat1, szFormat2, szFormat3));
  2054. }
  2055. }
  2056. }
  2057. if (!lastVer.IsValid() || lastVer != m_RvcSysinfo.InstallVersion) {
  2058. spRunConfig->WriteConfigValueHexInt("VersionMonitor", "LastVer", m_RvcSysinfo.InstallVersion.GetVersion64());
  2059. }
  2060. }
  2061. void ResourceWatcherFSM::DetectDestopFileAndWarn(bool bClear, CSimpleStringA& strFileSaveList)
  2062. {
  2063. CSimpleStringA strUserName(true);
  2064. GetCurUserName(strUserName);
  2065. if (!strUserName.IsNullOrEmpty()) {
  2066. CSimpleStringA filelist(true);
  2067. int dirCount(0), fileCount(0);
  2068. CSimpleStringA desktopFullPath = CSimpleStringA::Format("C:\\Users\\%s\\Desktop", strUserName.GetData());
  2069. CSimpleStringA desktopPublicPath("C:\\Users\\Public\\Desktop");
  2070. CAutoArray<CSimpleStringA> desktopPaths;
  2071. desktopPaths.Init(2);
  2072. desktopPaths[0] = desktopFullPath;
  2073. desktopPaths[1] = desktopPublicPath;
  2074. for (int k = 0; k < desktopPaths.GetCount(); ++k) {
  2075. CSimpleStringA& curPath = desktopPaths[k];
  2076. auto arr = fileutil_get_sub_files(curPath);
  2077. if (arr != NULL) {
  2078. for (int i = 0; i < arr->nelts; ++i) {
  2079. char* file = ARRAY_IDX(arr, i, char*);
  2080. char* filename = strrchr(file, '\\');
  2081. if (filename != NULL) { filename += 1; }
  2082. else { filename = file; }
  2083. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
  2084. bool toRecord = true;
  2085. if (bClear) {
  2086. std::string strLowFileName = SP::Utility::ToLower(std::string(filename));
  2087. if (strFileSaveList.IsNullOrEmpty() || strFileSaveList.IndexOf(strLowFileName.c_str()) == -1) {
  2088. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete desktop file:%s", filename);
  2089. RemoveFileA(file);
  2090. if (!ExistsFileA(file)) {
  2091. toRecord = false;
  2092. }
  2093. }
  2094. else {
  2095. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("skip to delete: %s", filename);
  2096. }
  2097. }
  2098. if (toRecord) {
  2099. fileCount++;
  2100. if (!filelist.IsNullOrEmpty()) {
  2101. filelist += "|";
  2102. }
  2103. filelist += filename;
  2104. }
  2105. }
  2106. if (arr->nelts > 0) {
  2107. filelist += ";";
  2108. }
  2109. toolkit_array_free2(arr);
  2110. }
  2111. arr = fileutil_get_sub_dirs(curPath);
  2112. if (arr != NULL) {
  2113. for (int i = 0; i < arr->nelts; ++i) {
  2114. char* dir = ARRAY_IDX(arr, i, char*);
  2115. char* dirname = strrchr(dir, '\\');
  2116. if (dirname != NULL) { dirname += 1; }
  2117. else { dirname = dir; }
  2118. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dir name:%s", dirname);
  2119. bool toRecord = true;
  2120. if (bClear) {
  2121. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("remove desktop dir:%s", dirname);
  2122. RemoveDirRecursiveA(dir);
  2123. if (!ExistsDirA(dir)) {
  2124. toRecord = false;
  2125. }
  2126. }
  2127. if (toRecord) {
  2128. dirCount++;
  2129. if (!filelist.IsNullOrEmpty() && i != 0) {
  2130. filelist += "|";
  2131. }
  2132. filelist += dirname;
  2133. }
  2134. }
  2135. if (arr->nelts > 0) {
  2136. filelist += ";";
  2137. }
  2138. toolkit_array_free2(arr);
  2139. }
  2140. }
  2141. LogWarn(Severity_Low, Error_Debug, LOG_INFO_DESKTOP_FILESTATUS
  2142. ,CSimpleStringA::Format("{\"subject\":\"desktop_file\",\"clear_flag\":\"%d\",\"username\":\"%s\",\"file_count\":%d,\"dir_count\":%d,\"content\":\"%s\"}"
  2143. , bClear ? 1 : 0, strUserName.GetData(), fileCount, dirCount, filelist.GetLength() < 950 ? filelist.GetData() : (filelist.SubString(0, 950) + "....").GetData()));
  2144. }
  2145. }
  2146. bool ResourceWatcherFSM::SetDesktopSysIcon2Registry(const std::string& key, bool toDisplay)
  2147. {
  2148. bool result(true);
  2149. DWORD dwFlag = KEY_READ | KEY_WRITE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS;
  2150. if (Is32R64Platform() != 0) {
  2151. dwFlag |= KEY_WOW64_64KEY;
  2152. }
  2153. HKEY hKey4Panel;
  2154. HKEY hKey4StartMenu;
  2155. DWORD dwCurValue4Panel = (DWORD)-1;
  2156. DWORD dwCurValue4StartMenu = (DWORD)-1;
  2157. LONG lResult = RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel", 0, dwFlag, &hKey4Panel);
  2158. if (lResult == ERROR_SUCCESS) {
  2159. DWORD dwType = REG_DWORD;
  2160. DWORD dwValue = 0;
  2161. DWORD dwSize = sizeof(DWORD);
  2162. lResult = RegQueryValueExA(hKey4Panel, key.c_str(), NULL, &dwType, (LPBYTE)&dwValue, &dwSize);
  2163. if (lResult == ERROR_SUCCESS) {
  2164. dwCurValue4Panel = dwValue;
  2165. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("NewStartPanel Value of %s: %d", key.c_str(), dwCurValue4Panel);
  2166. }
  2167. else {
  2168. result = false;
  2169. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegQueryValueEx for \"%s\" in NewStartPanel error, result=%ld.", key.c_str(), lResult);
  2170. }
  2171. }
  2172. lResult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\ClassicStartMenu", 0, dwFlag, &hKey4StartMenu);
  2173. if (lResult == ERROR_SUCCESS) {
  2174. DWORD dwType = REG_DWORD;
  2175. DWORD dwValue = 0;
  2176. DWORD dwSize = sizeof(DWORD);
  2177. lResult = RegQueryValueExA(hKey4StartMenu, key.c_str(), NULL, &dwType, (LPBYTE)&dwValue, &dwSize);
  2178. if (lResult == ERROR_SUCCESS) {
  2179. dwCurValue4StartMenu = dwValue;
  2180. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ClassicStartMenu Value of %s: %d", key.c_str(), dwCurValue4StartMenu);
  2181. }
  2182. else {
  2183. result = false;
  2184. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegQueryValueEx for \"%s\" in ClassicStartMenu error, result=%ld.", key.c_str(), lResult);
  2185. }
  2186. }
  2187. const DWORD dwAimValue = toDisplay ? 0 : 1;
  2188. if (dwCurValue4Panel != (DWORD)(-1) && dwCurValue4Panel != dwAimValue) {
  2189. DWORD dwType = REG_DWORD;
  2190. DWORD dwValue = dwAimValue;
  2191. DWORD dwSize = sizeof(DWORD);
  2192. lResult = RegSetValueExA(hKey4Panel, key.c_str(), 0, dwType, (BYTE*)&dwValue, dwSize);
  2193. if (lResult == ERROR_SUCCESS) {
  2194. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set Value with %d for %s in NewStartPanel succ.", dwValue, key.c_str());
  2195. }
  2196. else {
  2197. result = false;
  2198. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set Value with %d for %s in NewStartPanel error, result=%ld.", dwValue, key.c_str(), lResult);
  2199. }
  2200. }
  2201. if (dwCurValue4StartMenu != (DWORD)(-1) && dwCurValue4StartMenu != dwAimValue) {
  2202. DWORD dwType = REG_DWORD;
  2203. DWORD dwValue = dwAimValue;
  2204. DWORD dwSize = sizeof(DWORD);
  2205. lResult = RegSetValueExA(hKey4StartMenu, key.c_str(), 0, dwType, (BYTE*)&dwValue, dwSize);
  2206. if (lResult == ERROR_SUCCESS) {
  2207. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set Value with %d for %s in ClassicStartMenu succ.", dwValue, key.c_str());
  2208. }
  2209. else {
  2210. result = false;
  2211. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set Value with %d for %s in ClassicStartMenu error, result=%ld.", dwValue, key.c_str(), lResult);
  2212. }
  2213. }
  2214. RegCloseKey(hKey4Panel);
  2215. RegCloseKey(hKey4StartMenu);
  2216. return result;
  2217. }
  2218. void ResourceWatcherFSM::MakeSureWin8IntoDesktopPageAtLogon()
  2219. {
  2220. DWORD dwFlag = KEY_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS;
  2221. if (Is32R64Platform() != 0) {
  2222. dwFlag |= KEY_WOW64_64KEY;
  2223. }
  2224. bool isWin8(false);
  2225. bool toSetOpenAtLogon(false);
  2226. HKEY hKey;
  2227. LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, dwFlag, &hKey);
  2228. if (lResult == ERROR_SUCCESS) {
  2229. CSimpleStringA strValue(true);
  2230. if (GetRegValue(hKey, "ProductName", strValue)) {
  2231. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Current Windows version:%s", strValue.GetData());
  2232. if (!strValue.IsNullOrEmpty() && strValue.IndexOf("8.1") != -1) {
  2233. isWin8 = true;
  2234. }
  2235. }
  2236. RegCloseKey(hKey);
  2237. }
  2238. if (isWin8) {
  2239. lResult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage", 0, dwFlag, &hKey);
  2240. if (lResult == ERROR_SUCCESS) {
  2241. DWORD dwValue(0);
  2242. if (GetRegValueInt(hKey, "OpenAtLogon", dwValue)) {
  2243. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Current OpenAtLogon value:%d", dwValue);
  2244. if (dwValue != 0) {
  2245. toSetOpenAtLogon = true;
  2246. }
  2247. }
  2248. RegCloseKey(hKey);
  2249. }
  2250. }
  2251. if (toSetOpenAtLogon) {
  2252. dwFlag = KEY_WRITE;
  2253. if (Is32R64Platform() != 0) {
  2254. dwFlag |= KEY_WOW64_64KEY;
  2255. }
  2256. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to Set OpenAtLogon");
  2257. lResult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage", 0, dwFlag, &hKey);
  2258. if (lResult == ERROR_SUCCESS) {
  2259. DWORD dwType = REG_DWORD;
  2260. DWORD dwValue = 0;
  2261. DWORD dwSize = sizeof(DWORD);
  2262. lResult = RegSetValueExA(hKey, "OpenAtLogon", 0, dwType, (BYTE*)&dwValue, dwSize);
  2263. if (lResult == ERROR_SUCCESS) {
  2264. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set Value with %d for OpenAtLogon in NewStartPanel succ.", dwValue);
  2265. }
  2266. else {
  2267. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set Value with %d for OpenAtLogon error, result=%ld.", dwValue, lResult);
  2268. }
  2269. RegCloseKey(hKey);
  2270. }
  2271. }
  2272. }
  2273. void ResourceWatcherFSM::DetectAutoStartFileAndWarn()
  2274. {
  2275. std::vector<std::string> userlist;
  2276. std::vector<std::string> publist;
  2277. std::string r1, r2;
  2278. GetAutoStartFile(r1, userlist, r2, publist);
  2279. std::string strUserList = "";
  2280. std::string strPubList = "";
  2281. std::string strUserAutoList = "";
  2282. std::string strPubAutoList = "";
  2283. int userAutoCnt = 0, pubAutoCnt = 0;
  2284. int userAutoPureCnt = 0, pubAutoPureCnt = 0;
  2285. int catchLegitCnt = 0;
  2286. std::vector<std::string> autolist;
  2287. autolist.push_back(CMB_LINK_FILE_NAME);
  2288. autolist.push_back(STRATUP_FILENAME_FROM_SCRIPTS);
  2289. for (auto it = userlist.cbegin(); it != userlist.cend(); ++it) {
  2290. if (!strUserList.empty()) { strUserList += "|"; }
  2291. strUserList += it->c_str();
  2292. for (auto kt = keyUserlist.cbegin(); kt != keyUserlist.cend(); ++kt) {
  2293. if (it->compare(*kt) == 0) {
  2294. if (!strUserAutoList.empty()) { strUserAutoList += "|"; }
  2295. strUserAutoList += it->c_str();
  2296. userAutoCnt++;
  2297. userAutoPureCnt++;
  2298. break;
  2299. }
  2300. }
  2301. for (auto kt = autolist.cbegin(); kt != autolist.cend(); ++kt) {
  2302. if (it->compare(*kt) == 0) {
  2303. if (!strUserAutoList.empty()) { strUserAutoList += "|"; }
  2304. strUserAutoList += it->c_str();
  2305. userAutoCnt++;
  2306. catchLegitCnt++;
  2307. break;
  2308. }
  2309. }
  2310. }
  2311. for (auto it = publist.cbegin(); it != publist.cend(); ++it) {
  2312. if (!strPubList.empty()) { strPubList += "|"; }
  2313. strPubList += it->c_str();
  2314. for (auto kt = keyPublist.cbegin(); kt != keyPublist.cend(); ++kt) {
  2315. if (it->compare(*kt) == 0) {
  2316. if (!strPubAutoList.empty()) { strPubAutoList += "|"; }
  2317. strPubAutoList += it->c_str();
  2318. pubAutoCnt++;
  2319. pubAutoPureCnt++;
  2320. break;
  2321. }
  2322. }
  2323. for (auto kt = autolist.cbegin(); kt != autolist.cend(); ++kt) {
  2324. if (it->compare(*kt) == 0) {
  2325. if (!strPubAutoList.empty()) { strPubAutoList += "|"; }
  2326. strPubAutoList += it->c_str();
  2327. pubAutoCnt++;
  2328. catchLegitCnt++;
  2329. break;
  2330. }
  2331. }
  2332. }
  2333. LogWarn(Severity_Low, Error_Debug, LOG_INFO_AUTOSTART_FILESTATUS
  2334. , CSimpleStringA::Format("{\"subject\":\"autostart_file\", \"file_count\":%d, \"user\":\"%s\",\"public\":\"%s\"}"
  2335. , userlist.size() + publist.size(), strUserList.c_str(), strPubList.c_str()));
  2336. if (pubAutoCnt + userAutoCnt > 1) {
  2337. LogWarn(Severity_Low, Error_Debug, LOG_INFO_AUTOSTART_INTEREST_FILESTATUS
  2338. , CSimpleStringA::Format("{\"subject\":\"duplicate_vtm_autostart_file\", \"user_count\":%d, \"pub_count\":%d, \"user\":\"%s\",\"public\":\"%s\", \"legal_count\":%d, \"delete_flag\":%d}"
  2339. , userAutoCnt, pubAutoCnt, strUserAutoList.c_str(), strPubAutoList.c_str(), catchLegitCnt, flag4DeleteKeyAutoStartFile));
  2340. }
  2341. if (catchLegitCnt > 0 && flag4DeleteKeyAutoStartFile && (pubAutoPureCnt > 0 || userAutoPureCnt > 0)) {
  2342. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to delete duplicate auto start file.");
  2343. DeleteDuplicateAutoStartFile();
  2344. }
  2345. }
  2346. ErrorCodeEnum ResourceWatcherFSM::DetectVTMInstalledBySetup(BOOL& fYes)
  2347. {
  2348. HKEY key;
  2349. ErrorCodeEnum result(Error_Succeed);
  2350. fYes = FALSE;
  2351. CSimpleStringA regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{123BBC1D-8555-4E90-96CA-70E678FF5C24}_is1";
  2352. LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS, &key);
  2353. if (ERROR_SUCCESS == lResult) {
  2354. fYes = TRUE;
  2355. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Found {123BBC1D-8555-4E90-96CA-70E678FF5C24}");
  2356. LogWarn(Severity_Low, Error_Debug, LOG_INFO_INSTALL_BY_SETUP, "Intalled by Setup");
  2357. }
  2358. else if (ERROR_FILE_NOT_FOUND == lResult)
  2359. {
  2360. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not Found {123BBC1D-8555-4E90-96CA-70E678FF5C24}");
  2361. fYes = FALSE;
  2362. }
  2363. else
  2364. {
  2365. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("RegOpenKeyEx For{123BBC1D-8555-4E90-96CA-70E678FF5C24} error, Result=%ld.", lResult);
  2366. fYes = FALSE;
  2367. result = Error_Unexpect;
  2368. }
  2369. RegCloseKey(key);
  2370. return result;
  2371. }
  2372. bool ResourceWatcherFSM::RegRdVtmVersion(CSimpleStringA& VTMpath, CSimpleStringA& vtmVersion, CSimpleStringA& verPath)
  2373. {
  2374. bool bRet = false;
  2375. HKEY key;
  2376. CSimpleStringA regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\vtm.exe";
  2377. CSimpleStringA regParaPath = "path";
  2378. CSimpleStringA regParaVersion = "version";
  2379. LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS, &key);
  2380. if (ERROR_SUCCESS == lResult)
  2381. {
  2382. bool res1 = GetRegValue(key, NULL, VTMpath);
  2383. if (res1) {
  2384. bRet = true;
  2385. }
  2386. else {
  2387. bRet = false;
  2388. RegCloseKey(key);
  2389. return bRet;
  2390. }
  2391. bool res2 = GetRegValue(key, regParaPath, verPath);
  2392. if (res2) {
  2393. bRet = true;
  2394. }
  2395. else {
  2396. bRet = false;
  2397. RegCloseKey(key);
  2398. return bRet;
  2399. }
  2400. bool res3 = GetRegValue(key, regParaVersion, vtmVersion);
  2401. if (res3) {
  2402. bRet = true;
  2403. }
  2404. else {
  2405. bRet = false;
  2406. RegCloseKey(key);
  2407. return bRet;
  2408. }
  2409. }
  2410. else
  2411. {
  2412. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s::RegOpenKeyEx error, Result=%ld.", __FUNCTION__, lResult);
  2413. bRet = false;
  2414. }
  2415. RegCloseKey(key);
  2416. return bRet;
  2417. }
  2418. bool ResourceWatcherFSM::RegWtVtmPath(const CSimpleStringA& vtmExtPath, const CSimpleStringA& rootPath)
  2419. {
  2420. bool bRet = true;
  2421. HKEY key;
  2422. CSimpleStringA regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths";
  2423. if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS, &key))
  2424. {
  2425. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open Reg failed.");
  2426. bRet = false;
  2427. }
  2428. DWORD dwDisposition;
  2429. regPath += "\\vtm.exe";
  2430. if (ERROR_SUCCESS != RegCreateKeyExA(HKEY_LOCAL_MACHINE, regPath.GetData(), 0, NULL,
  2431. REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dwDisposition))
  2432. {
  2433. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Create key failed");
  2434. bRet = false;
  2435. }
  2436. if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath.GetData(), 0, KEY_ALL_ACCESS, &key))
  2437. {
  2438. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set value failed");
  2439. bRet = false;
  2440. }
  2441. CSimpleStringA exePath = vtmExtPath.GetData();
  2442. if (!exePath.IsNullOrEmpty())
  2443. {
  2444. if (ERROR_SUCCESS != RegSetValueExA(key, NULL, 0, REG_SZ, (BYTE*)exePath.GetData(), exePath.GetLength()+1))
  2445. {
  2446. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set path value failed");
  2447. bRet = false;
  2448. }
  2449. }
  2450. else
  2451. {
  2452. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Vtm.exe path is failed");
  2453. }
  2454. if (bRet)
  2455. {
  2456. CSimpleStringA para = "path";
  2457. if (ERROR_SUCCESS != RegSetValueExA(key, para, 0, REG_SZ, (BYTE*)rootPath.GetData(), rootPath.GetLength() + 1))
  2458. {
  2459. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set path value failed");
  2460. bRet = false;
  2461. }
  2462. }
  2463. else
  2464. {
  2465. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set path for %s failed", rootPath.GetData());
  2466. }
  2467. ::RegCloseKey(key);
  2468. return bRet;
  2469. }
  2470. bool ResourceWatcherFSM::RegWtVtmVersion(const CSimpleStringA& vtmVer)
  2471. {
  2472. bool bRet = true;
  2473. HKEY key;
  2474. CSimpleStringA regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths";
  2475. if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS, &key))
  2476. {
  2477. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open Reg failed.");
  2478. bRet = false;
  2479. }
  2480. DWORD dwDisposition;
  2481. regPath += "\\vtm.exe";
  2482. if (ERROR_SUCCESS != RegCreateKeyExA(HKEY_LOCAL_MACHINE, regPath.GetData(), 0, NULL,
  2483. REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dwDisposition))
  2484. {
  2485. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Create key failed");
  2486. bRet = false;
  2487. }
  2488. if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath.GetData(), 0, KEY_ALL_ACCESS, &key))
  2489. {
  2490. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set value failed");
  2491. bRet = false;
  2492. }
  2493. CSimpleStringA para = "version";
  2494. CSimpleStringA csVersion = vtmVer.GetData();
  2495. if (!csVersion.IsNullOrEmpty())
  2496. {
  2497. //RegSetValueEx(key, para.GetData(), 0, REG_SZ, (BYTE*)csVersion.GetData(), MAX_PATH);
  2498. if (ERROR_SUCCESS != RegSetValueExA(key, para.GetData(), 0, REG_SZ, (BYTE*)csVersion.GetData(), csVersion.GetLength()+1))
  2499. {
  2500. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set value failed");
  2501. bRet = false;
  2502. }
  2503. }
  2504. else
  2505. {
  2506. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get version of VTM.exe failed.");
  2507. }
  2508. ::RegCloseKey(key);
  2509. return bRet;
  2510. }
  2511. bool ResourceWatcherFSM::RegOperation4LnkFile()
  2512. {
  2513. bool bRet = true;
  2514. CSimpleStringA csVersion(true), VtmRegPath(true), VtmRegVersion(true), VtmRegVerPath(true);
  2515. bool bGetActive = GetVtmVersionFromActiveTxt(csVersion);
  2516. bool bRegRead = RegRdVtmVersion(VtmRegPath, VtmRegVersion, VtmRegVerPath);
  2517. CSimpleStringA rootVerPath(true), exePath(true);
  2518. ErrorCodeEnum rc = GetEntityBase()->GetFunction()->GetPath("RootVer", rootVerPath);
  2519. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("csVersion :%s ,VtmRegVersion:%s, %d", csVersion.GetData(), VtmRegVersion.GetData(), bRegRead);
  2520. if (GetVTMExePath(exePath, false) && !ExistsFileA(exePath) && !CopyExeToRoot(csVersion, exePath))
  2521. {
  2522. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Copy VTM.exe to version root fail.");
  2523. bRet = false;
  2524. }
  2525. CSimpleStringA fullregVersionPath = VtmRegVerPath + "\\" + VtmRegVersion;
  2526. CSimpleStringA curVersionPath = rootVerPath + "\\" + csVersion;
  2527. if(bRet && !rootVerPath.IsNullOrEmpty() && !csVersion.IsNullOrEmpty() && (!bRegRead || 0 != curVersionPath.Compare(fullregVersionPath, true))) {
  2528. if (!RegWtVtmPath(exePath, rootVerPath))
  2529. {
  2530. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("RegWtVtmPath failed.");
  2531. }
  2532. if (!RegWtVtmVersion(csVersion))
  2533. {
  2534. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("RegWtVtmVersion failed.");
  2535. }
  2536. }
  2537. CSimpleStringA s(true);
  2538. GetUserDesktopDirectory(s);
  2539. s += "\\可视柜台.lnk";
  2540. if (bRet && !ExistsFileA(s)) {
  2541. bRet = CreateLink(0, exePath);
  2542. }
  2543. return bRet;
  2544. }
  2545. bool ResourceWatcherFSM::UpdateExe()
  2546. {
  2547. int updateExe = 0;
  2548. CSmartPointer<IConfigInfo> spCtSettingConfig;
  2549. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  2550. spCtSettingConfig->ReadConfigValueInt("NonExclusive", "UpdateExe", updateExe);
  2551. if (updateExe == 1)
  2552. return true;
  2553. return false;
  2554. }
  2555. bool ResourceWatcherFSM::GetRegValueInt(HKEY hKey, LPCTSTR lpcszParam, DWORD& dwValue)
  2556. {
  2557. DWORD dwType = REG_DWORD;
  2558. DWORD dwValue1 = 0;
  2559. DWORD dwSize = sizeof(DWORD);
  2560. LONG lResult = RegQueryValueExA(hKey, lpcszParam, NULL, &dwType, (LPBYTE)&dwValue1, &dwSize);
  2561. if (lResult == ERROR_SUCCESS) {
  2562. dwValue = dwValue1;
  2563. return true;
  2564. }
  2565. else {
  2566. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RegQueryValueEx for \"%s\" error, result=%ld.", lpcszParam, lResult);
  2567. return false;
  2568. }
  2569. }
  2570. void ResourceWatcherFSM::VerifySignature()
  2571. {
  2572. LOG_FUNCTION();
  2573. CSimpleStringA strMsg(true);
  2574. char* buffer = new char[MAX_PATH];
  2575. getcwd(buffer, MAX_PATH);
  2576. strcat(buffer, "\\*");
  2577. DWORD elapsed = 0;
  2578. DWORD dwStart = GetTickCount();
  2579. DWORD dwEnd = GetTickCount();
  2580. VerifySignature(buffer);
  2581. if (m_nonSignedFiles.size() > 0)
  2582. {
  2583. CSimpleStringA fileList = "";
  2584. for (size_t i = 0; i < m_nonSignedFiles.size(); i++)
  2585. {
  2586. fileList += GetFileName(m_nonSignedFiles[i]);
  2587. if (i < m_nonSignedFiles.size() - 1)
  2588. fileList += ",";
  2589. }
  2590. int toDisplay = m_iNonSignedTotal < m_iNonSignedDisplay ? m_iNonSignedTotal : m_iNonSignedDisplay;
  2591. strMsg = CSimpleStringA::Format("共有%d个文件未签名,其中%d个为:%s.",
  2592. m_iNonSignedTotal, toDisplay, fileList.GetData());
  2593. }
  2594. dwEnd = GetTickCount();
  2595. elapsed = dwEnd - dwStart;
  2596. strMsg = strMsg + CSimpleStringA::Format("签名耗时:%dms", elapsed);
  2597. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_FILE_NOT_TRUSTED, (LPCTSTR)strMsg);
  2598. delete buffer;
  2599. }
  2600. void ResourceWatcherFSM::VerifySignature(const CSimpleStringA& filePath)
  2601. {
  2602. HANDLE hFind = NULL;
  2603. WIN32_FIND_DATA fileInfo;
  2604. DWORD64 dwSize = 0;
  2605. hFind = FindFirstFile(filePath, &fileInfo);
  2606. if (hFind == INVALID_HANDLE_VALUE)
  2607. return;
  2608. string strDirPath = filePath;
  2609. do
  2610. {
  2611. if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  2612. {
  2613. if (!strcmp(fileInfo.cFileName, ".") || !strcmp(fileInfo.cFileName, ".."))
  2614. {
  2615. //Do nothing for "." and ".." folders
  2616. }
  2617. else
  2618. {
  2619. strDirPath.insert(strDirPath.find("*"), string(fileInfo.cFileName) + "\\");
  2620. VerifySignature(strDirPath.c_str());
  2621. strDirPath = filePath;
  2622. }
  2623. }
  2624. else
  2625. {
  2626. CSimpleStringA fileName = fileInfo.cFileName;
  2627. string strFileName = fileName;
  2628. string strFilePath;
  2629. if(strFileName.empty()
  2630. || (strFileName.rfind(".dll") != strFileName.length() - 4
  2631. && strFileName.rfind(".exe") != strFileName.length() - 4))
  2632. continue;
  2633. strFilePath = strDirPath;
  2634. strFilePath.replace(strFilePath.find("*"), strFilePath.length(), string(fileInfo.cFileName));
  2635. if (!RetrieveDigitalSignatureInfo(strFilePath.c_str()))
  2636. {
  2637. if (m_iNonSignedTotal < m_iNonSignedDisplay)
  2638. {
  2639. m_nonSignedFiles.push_back(strFilePath.c_str());
  2640. }
  2641. m_iNonSignedTotal++;
  2642. }
  2643. }
  2644. } while (FindNextFile(hFind, &fileInfo));
  2645. FindClose(hFind);
  2646. }
  2647. void ResourceWatcherFSM::DetectAndClearDesktopFile()
  2648. {
  2649. #if defined(RVC_OS_WIN)
  2650. CSmartPointer<IConfigInfo> spCtSettingConfig;
  2651. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  2652. int clearDesktopFlag(0);
  2653. CSimpleStringA strFileWhiteSheet(true);
  2654. spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ClearDesktopSwitch", clearDesktopFlag);
  2655. if (!!clearDesktopFlag) {
  2656. spCtSettingConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "DesktopWhiteSheet", strFileWhiteSheet);
  2657. if (!strFileWhiteSheet.IsNullOrEmpty()) {
  2658. std::string strLowFileName = SP::Utility::ToLower(std::string(strFileWhiteSheet.GetData()));
  2659. strFileWhiteSheet = strLowFileName.c_str();
  2660. }
  2661. }
  2662. DetectDestopFileAndWarn(!!clearDesktopFlag, strFileWhiteSheet);
  2663. /** 如果白名单中有{SysIcon}则不清理桌面系统图标 [Gifur@2024830]*/
  2664. if (!!clearDesktopFlag && (strFileWhiteSheet.IsNullOrEmpty() || strFileWhiteSheet.IndexOf("{sysicon}") == -1)) {
  2665. SetDesktopSysIcon2Registry("{20D04FE0-3AEA-1069-A2D8-08002B30309D}", false); //此电脑 图标
  2666. SetDesktopSysIcon2Registry("{645FF040-5081-101B-9F08-00AA002F954E}", false); //回收站 图标
  2667. SetDesktopSysIcon2Registry("{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}", false); //网络 图标
  2668. SetDesktopSysIcon2Registry("{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}", false); //控制面板 图标
  2669. SetDesktopSysIcon2Registry("{59031a47-3f72-44a7-89c5-5595fe6b30ee}", false); //用户的文件 图标
  2670. }
  2671. #endif //RVC_OS_WIN
  2672. }
  2673. CSimpleStringA ResourceWatcherFSM::GetFileName(const CSimpleStringA& filePath)
  2674. {
  2675. CSimpleStringA tmp = filePath;
  2676. auto arrPath = tmp.Split('\\');
  2677. int size = arrPath.GetCount();
  2678. return arrPath[size - 1];
  2679. }
  2680. bool ResourceWatcherFSM::RetrieveDigitalSignatureInfo(const char* pFilePath)
  2681. {
  2682. HCERTSTORE hStore = NULL;
  2683. HCRYPTMSG hMsg = NULL;
  2684. WCHAR* wpFilePath = NULL;
  2685. int len = ::MultiByteToWideChar(CP_ACP, 0, pFilePath, -1, NULL, 0);
  2686. if (len > 0) {
  2687. wpFilePath = new wchar_t[len + 1];
  2688. std::memset(wpFilePath, 0, (len + 1) * sizeof(wchar_t));
  2689. ::MultiByteToWideChar(CP_ACP, 0, pFilePath, -1, &wpFilePath[0], len);
  2690. }
  2691. if (CryptQueryObject(CERT_QUERY_OBJECT_FILE,
  2692. wpFilePath,
  2693. CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
  2694. CERT_QUERY_FORMAT_FLAG_BINARY,
  2695. 0,
  2696. NULL,
  2697. NULL,
  2698. NULL,
  2699. &hStore,
  2700. &hMsg,
  2701. NULL))
  2702. {
  2703. DWORD dwCountSigners = 0;
  2704. DWORD dwcbSz = sizeof(dwCountSigners);
  2705. if (CryptMsgGetParam(hMsg, CMSG_SIGNER_COUNT_PARAM, 0, &dwCountSigners, &dwcbSz))
  2706. {
  2707. if (dwCountSigners != 0)
  2708. {
  2709. dwcbSz = 0;
  2710. CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &dwcbSz);
  2711. if (dwcbSz)
  2712. {
  2713. PCMSG_SIGNER_INFO pSignerInfo = (PCMSG_SIGNER_INFO)new (std::nothrow) BYTE[dwcbSz];
  2714. if (pSignerInfo)
  2715. {
  2716. DWORD dwcbSz2 = dwcbSz;
  2717. if (CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, pSignerInfo, &dwcbSz) &&
  2718. dwcbSz == dwcbSz2)
  2719. {
  2720. if (VerifyFirstCertificate(hStore, pSignerInfo)
  2721. || VerifyOtherCertificate(pSignerInfo))
  2722. return true;
  2723. }
  2724. delete[] pSignerInfo;
  2725. pSignerInfo = NULL;
  2726. }
  2727. }
  2728. }
  2729. }
  2730. }
  2731. if (hStore != NULL)
  2732. {
  2733. CertCloseStore(hStore, 0);
  2734. hStore = NULL;
  2735. }
  2736. if (hMsg != NULL)
  2737. {
  2738. CryptMsgClose(hMsg);
  2739. hMsg = NULL;
  2740. }
  2741. return false;
  2742. }
  2743. bool ResourceWatcherFSM::VerifyFirstCertificate(HCERTSTORE hStore, PCMSG_SIGNER_INFO pSignerInfo)
  2744. {
  2745. CERT_INFO ci = { 0 };
  2746. ci.Issuer = pSignerInfo->Issuer;
  2747. ci.SerialNumber = pSignerInfo->SerialNumber;
  2748. PCCERT_CONTEXT pCertContext = NULL;
  2749. int c = 0;
  2750. bool ret = false;
  2751. for (;; c++)
  2752. {
  2753. pCertContext = CertFindCertificateInStore(hStore,
  2754. ENCODING, 0, CERT_FIND_SUBJECT_CERT,
  2755. (PVOID)&ci, pCertContext);
  2756. if (!pCertContext)
  2757. {
  2758. break;
  2759. }
  2760. DWORD dwcbSz;
  2761. char* pBuff;
  2762. dwcbSz = CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0);
  2763. if (dwcbSz != 0)
  2764. {
  2765. pBuff = new (std::nothrow) char[dwcbSz];
  2766. if (pBuff)
  2767. {
  2768. if (CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, pBuff, dwcbSz) == dwcbSz)
  2769. {
  2770. if (!strcmp(pBuff, "China Merchants Bank Co., Ltd") || !strcmp(pBuff, "Microsoft Corporation"))
  2771. ret = true;
  2772. }
  2773. delete[] pBuff;
  2774. pBuff = NULL;
  2775. }
  2776. }
  2777. }
  2778. if (pCertContext)
  2779. {
  2780. CertFreeCertificateContext(pCertContext);
  2781. pCertContext = NULL;
  2782. }
  2783. return ret;
  2784. }
  2785. bool ResourceWatcherFSM::VerifyOtherCertificate(PCMSG_SIGNER_INFO pSignerInfo)
  2786. {
  2787. int ret = false;
  2788. for (DWORD a = 0; a < pSignerInfo->UnauthAttrs.cAttr; a++)
  2789. {
  2790. #ifndef szOID_NESTED_SIGNATURE
  2791. #define szOID_NESTED_SIGNATURE "1.3.6.1.4.1.311.2.4.1"
  2792. #endif
  2793. if (pSignerInfo->UnauthAttrs.rgAttr[a].pszObjId &&
  2794. lstrcmpA(pSignerInfo->UnauthAttrs.rgAttr[a].pszObjId, szOID_NESTED_SIGNATURE) == 0)
  2795. {
  2796. HCRYPTMSG hMsg = ::CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, NULL, NULL, NULL);
  2797. if (hMsg)
  2798. {
  2799. if (::CryptMsgUpdate(hMsg,
  2800. pSignerInfo->UnauthAttrs.rgAttr[a].rgValue->pbData,
  2801. pSignerInfo->UnauthAttrs.rgAttr[a].rgValue->cbData,
  2802. TRUE))
  2803. {
  2804. DWORD dwSignerInfo = 0;
  2805. ::CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &dwSignerInfo);
  2806. if (dwSignerInfo != 0)
  2807. {
  2808. PCMSG_SIGNER_INFO pSignerInfo2 = (PCMSG_SIGNER_INFO)new (std::nothrow) BYTE[dwSignerInfo];
  2809. if (pSignerInfo2)
  2810. {
  2811. if (::CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM,
  2812. 0, (PVOID)pSignerInfo2, &dwSignerInfo))
  2813. {
  2814. CRYPT_DATA_BLOB c7Data;
  2815. c7Data.cbData = pSignerInfo->UnauthAttrs.rgAttr[a].rgValue->cbData;
  2816. c7Data.pbData = pSignerInfo->UnauthAttrs.rgAttr[a].rgValue->pbData;
  2817. //ret = FindAppropriateStoreAndVerifyFirstCertificate(pSignerInfo2, &c7Data);
  2818. HCERTSTORE hStore = NULL;
  2819. hStore = CertOpenStore(CERT_STORE_PROV_PKCS7, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, NULL, 0, &c7Data);
  2820. ret = hStore && VerifyFirstCertificate(hStore, pSignerInfo2);
  2821. if (hStore)
  2822. {
  2823. ::CertCloseStore(hStore, CERT_CLOSE_STORE_FORCE_FLAG);
  2824. hStore = NULL;
  2825. }
  2826. }
  2827. delete[] pSignerInfo2;
  2828. pSignerInfo2 = NULL;
  2829. }
  2830. }
  2831. }
  2832. ::CryptMsgClose(hMsg);
  2833. }
  2834. }
  2835. }
  2836. return ret;
  2837. }
  2838. long long GetDirSizeFsm(string dirPath)
  2839. {
  2840. long long fileLen = 0;
  2841. long hFile = 0;
  2842. //文件信息
  2843. struct _finddata_t fileinfo;
  2844. string p;
  2845. if ((hFile = _findfirst(p.assign(dirPath).append("\\*").c_str(), &fileinfo)) != -1)
  2846. {
  2847. do
  2848. {
  2849. //如果是目录,迭代之
  2850. //如果不是,加入列表
  2851. if ((fileinfo.attrib & _A_SUBDIR))
  2852. {
  2853. if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
  2854. fileLen += GetDirSizeFsm(p.assign(dirPath).append("\\").append(fileinfo.name));
  2855. }
  2856. else
  2857. {
  2858. fileLen += fileinfo.size;
  2859. }
  2860. } while (_findnext(hFile, &fileinfo) == 0);
  2861. _findclose(hFile);
  2862. }
  2863. return fileLen;
  2864. }
  2865. struct CmpByValueFromBiggest //从最大的排起
  2866. {
  2867. bool operator()(const pair<string, long>& l, const pair<string, long>& r) {
  2868. return l.second > r.second;
  2869. }
  2870. };
  2871. //unordered_map<string, long> fileSpace;
  2872. unordered_map<string, long> fileIncreasedSpace;
  2873. vector<pair<string, long>> sortFileIncreasedSpace;
  2874. unordered_map<string, long> fileSpace;
  2875. vector<pair<string, long>> sortFileSpace;
  2876. static bool spaceLock = false;
  2877. void ResourceWatcherFSM::CheckDiskFileSpace()
  2878. {
  2879. if (spaceLock)
  2880. {
  2881. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("当前已有硬盘扫描进行中,跳过。");
  2882. return;
  2883. }
  2884. else
  2885. {
  2886. spaceLock = true; //加锁
  2887. }
  2888. CSmartPointer<IConfigInfo> spConfigRun;
  2889. CSmartPointer<IConfigInfo> spCtSettingConfig;
  2890. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2891. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  2892. int lastDiskUsed = 0;
  2893. unsigned long long lastVer = 0;
  2894. int spaceIncrease = 0; //硬盘增长阈值
  2895. spConfigRun->ReadConfigValueHexInt("SpaceInfo", "OptVer", lastVer);
  2896. spConfigRun->ReadConfigValueInt("SpaceInfo", "DiskTotalUsed(GB)", lastDiskUsed);
  2897. spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "DiskUsedIncreaseInt(GB)", spaceIncrease);
  2898. if (spaceIncrease == 0)
  2899. {
  2900. spaceIncrease = 5; //默认阈值5GB
  2901. }
  2902. if (!m_bNeedForceDiskCheck) //是否需要强制全盘扫描 - 硬盘使用过高是会强制
  2903. {
  2904. if (lastVer == m_RvcSysinfo.InstallVersion.GetVersion64())
  2905. {
  2906. if (lastDiskUsed != 0 && ((int)(GetDiskUsedByte() / (1024 * 1024 * 1024)) - lastDiskUsed) < spaceIncrease) //增长值判定
  2907. {
  2908. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("硬盘空间增长未超过阈值,无需扫描。");
  2909. if (spaceLock)
  2910. {
  2911. spaceLock = false; //释放锁
  2912. }
  2913. return;
  2914. }
  2915. else
  2916. {
  2917. //降低磁盘扫描频率
  2918. SYSTEMTIME localTime;
  2919. GetLocalTime(&localTime);
  2920. if (m_diskLastWarnHour != localTime.wHour)
  2921. {
  2922. m_diskLastWarnHour = localTime.wHour;
  2923. CSmartPointer<IConfigInfo> spConfigRun;
  2924. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2925. if (eErr == Error_Succeed) {
  2926. spConfigRun->WriteConfigValueInt("WarnRecord", "disk", m_diskLastWarnHour);
  2927. }
  2928. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("硬盘增长超过阈值,重点目录扫描!");
  2929. }
  2930. else
  2931. {
  2932. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("磁盘增长最近1小时已扫描一次,暂不扫描。");
  2933. if (spaceLock)
  2934. {
  2935. spaceLock = false; //释放锁
  2936. }
  2937. return;
  2938. }
  2939. }
  2940. }
  2941. else
  2942. {
  2943. spConfigRun->WriteConfigValueHexInt("SpaceInfo", "OptVer", m_RvcSysinfo.InstallVersion.GetVersion64());
  2944. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("新版本,重点目录扫描");
  2945. }
  2946. }
  2947. else
  2948. {
  2949. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("强制扫描。");
  2950. }
  2951. string path = "D:";
  2952. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("扫描D盘。");
  2953. long long fileLen = 0;
  2954. long hFile = 0;
  2955. //文件信息
  2956. struct _finddata_t fileinfo;
  2957. string p;
  2958. if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
  2959. {
  2960. do
  2961. {
  2962. //如果是目录,迭代之
  2963. //如果不是,加入列表
  2964. if ((fileinfo.attrib & _A_SUBDIR))
  2965. {
  2966. if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
  2967. fileLen = GetDirSizeFsm(p.assign(path).append("\\").append(fileinfo.name));
  2968. else
  2969. {
  2970. continue;
  2971. }
  2972. }
  2973. else
  2974. {
  2975. fileLen = fileinfo.size;
  2976. }
  2977. CSimpleStringA resLen = CSimpleStringA::Format("%lld B", fileLen);
  2978. if (fileLen >= 1024 && fileLen < (1024 * 1024))
  2979. {
  2980. DOUBLE len = (DOUBLE)fileLen / 1024;
  2981. resLen = CSimpleStringA::Format("%.2f KB", len);
  2982. }
  2983. else if (fileLen >= (1024 * 1024) && fileLen < (1024 * 1024 * 1024))
  2984. {
  2985. DOUBLE len = (DOUBLE)fileLen / (1024 * 1024);
  2986. resLen = CSimpleStringA::Format("%.2f MB", len);
  2987. }
  2988. else if (fileLen >= (1024 * 1024 * 1024))
  2989. {
  2990. DOUBLE len = (DOUBLE)fileLen / (1024 * 1024 * 1024);
  2991. resLen = CSimpleStringA::Format("%.2f GB", len);
  2992. }
  2993. CSimpleStringA oldLenStr("");
  2994. long oldLen = 0;
  2995. spConfigRun->ReadConfigValue("SpaceInfo",
  2996. p.assign(path).append("\\").append(fileinfo.name).c_str(), oldLenStr);
  2997. oldLen = atol(oldLenStr.GetData());
  2998. fileIncreasedSpace[p.assign(path).append("\\").append(fileinfo.name)] = (long)(fileLen / (1024 * 1024)) - oldLen; //保存在unordered_map中
  2999. fileSpace[p.assign(path).append("\\").append(fileinfo.name)] = (long)(fileLen / (1024 * 1024));
  3000. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%s] 大小为 [%s]",
  3001. p.assign(path).append("\\").append(fileinfo.name).c_str(), resLen.GetData());
  3002. if (lastVer != m_RvcSysinfo.InstallVersion.GetVersion64())
  3003. {
  3004. spConfigRun->WriteConfigValue("SpaceInfo", p.assign(path).append("\\").append(fileinfo.name).c_str(),
  3005. CSimpleStringA::Format("%ld MB", (long)(fileLen / (1024 * 1024))));
  3006. }
  3007. } while (_findnext(hFile, &fileinfo) == 0);
  3008. _findclose(hFile);
  3009. }
  3010. //获取version目录下的文件夹大小
  3011. CSimpleStringA csPath;
  3012. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("RootVer", csPath); //获取当前版本路劲 例如:C:\Run
  3013. fileLen = 0;
  3014. hFile = 0;
  3015. p = "";
  3016. if ((hFile = _findfirst(p.assign(csPath.GetData()).append("\\*").c_str(), &fileinfo)) != -1)
  3017. {
  3018. do
  3019. {
  3020. //如果是目录,迭代之
  3021. //如果不是,加入列表
  3022. if ((fileinfo.attrib & _A_SUBDIR))
  3023. {
  3024. if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
  3025. fileLen = GetDirSizeFsm(p.assign(csPath.GetData()).append("\\").append(fileinfo.name));
  3026. else
  3027. {
  3028. continue;
  3029. }
  3030. }
  3031. else
  3032. {
  3033. fileLen = fileinfo.size;
  3034. }
  3035. CSimpleStringA resLen = CSimpleStringA::Format("%lld B", fileLen);
  3036. if (fileLen >= 1024 && fileLen < (1024 * 1024))
  3037. {
  3038. DOUBLE len = (DOUBLE)fileLen / 1024;
  3039. resLen = CSimpleStringA::Format("%.2f KB", len);
  3040. }
  3041. else if (fileLen >= (1024 * 1024) && fileLen < (1024 * 1024 * 1024))
  3042. {
  3043. DOUBLE len = (DOUBLE)fileLen / (1024 * 1024);
  3044. resLen = CSimpleStringA::Format("%.2f MB", len);
  3045. }
  3046. else if (fileLen >= (1024 * 1024 * 1024))
  3047. {
  3048. DOUBLE len = (DOUBLE)fileLen / (1024 * 1024 * 1024);
  3049. resLen = CSimpleStringA::Format("%.2f GB", len);
  3050. }
  3051. CSimpleStringA oldLenStr(""); //MB
  3052. long oldLen = 0;
  3053. spConfigRun->ReadConfigValue("SpaceInfo",
  3054. p.assign(csPath.GetData()).append("\\").append(fileinfo.name).c_str(), oldLenStr);
  3055. oldLen = atol(oldLenStr.GetData());
  3056. fileIncreasedSpace[p.assign(csPath.GetData()).append("\\").append(fileinfo.name)] = (long)(fileLen / (1024 * 1024)) - oldLen; //保存在unordered_map中
  3057. fileSpace[p.assign(csPath.GetData()).append("\\").append(fileinfo.name)] = (long)(fileLen / (1024 * 1024));
  3058. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%s] 大小为 [%s]",
  3059. p.assign(csPath.GetData()).append("\\").append(fileinfo.name).c_str(), resLen.GetData());
  3060. if (lastVer != m_RvcSysinfo.InstallVersion.GetVersion64())
  3061. {
  3062. spConfigRun->WriteConfigValue("SpaceInfo", p.assign(csPath.GetData()).append("\\").append(fileinfo.name).c_str(),
  3063. CSimpleStringA::Format("%ld MB", (long)(fileLen / (1024 * 1024))));
  3064. }
  3065. } while (_findnext(hFile, &fileinfo) == 0);
  3066. _findclose(hFile);
  3067. }
  3068. //获取rvc目录下的文件夹大小
  3069. fileLen = 0;
  3070. hFile = 0;
  3071. p = "";
  3072. if ((hFile = _findfirst(p.assign(path).append("\\rvc\\*").c_str(), &fileinfo)) != -1)
  3073. {
  3074. do
  3075. {
  3076. //如果是目录,迭代之
  3077. //如果不是,加入列表
  3078. if ((fileinfo.attrib & _A_SUBDIR))
  3079. {
  3080. if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
  3081. fileLen = GetDirSizeFsm(p.assign(path).append("\\rvc\\").append(fileinfo.name));
  3082. else
  3083. {
  3084. continue;
  3085. }
  3086. }
  3087. else
  3088. {
  3089. fileLen = fileinfo.size;
  3090. }
  3091. CSimpleStringA resLen = CSimpleStringA::Format("%lld B", fileLen);
  3092. if (fileLen >= 1024 && fileLen < (1024 * 1024))
  3093. {
  3094. DOUBLE len = (DOUBLE)fileLen / 1024;
  3095. resLen = CSimpleStringA::Format("%.2f KB", len);
  3096. }
  3097. else if (fileLen >= (1024 * 1024) && fileLen < (1024 * 1024 * 1024))
  3098. {
  3099. DOUBLE len = (DOUBLE)fileLen / (1024 * 1024);
  3100. resLen = CSimpleStringA::Format("%.2f MB", len);
  3101. }
  3102. else if (fileLen >= (1024 * 1024 * 1024))
  3103. {
  3104. DOUBLE len = (DOUBLE)fileLen / (1024 * 1024 * 1024);
  3105. resLen = CSimpleStringA::Format("%.2f GB", len);
  3106. }
  3107. CSimpleStringA oldLenStr("");
  3108. long oldLen = 0;
  3109. spConfigRun->ReadConfigValue("SpaceInfo",
  3110. p.assign(path).append("\\rvc\\").append(fileinfo.name).c_str(), oldLenStr);
  3111. oldLen = atol(oldLenStr.GetData());
  3112. fileIncreasedSpace[p.assign(path).append("\\rvc\\").append(fileinfo.name)] = (long)(fileLen / (1024 * 1024)) - oldLen; //保存在unordered_map中
  3113. fileSpace[p.assign(path).append("\\rvc\\").append(fileinfo.name)] = (long)(fileLen / (1024 * 1024));
  3114. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%s] 大小为 [%s]",
  3115. p.assign(path).append("\\rvc\\").append(fileinfo.name).c_str(), resLen.GetData());
  3116. if (lastVer != m_RvcSysinfo.InstallVersion.GetVersion64())
  3117. {
  3118. spConfigRun->WriteConfigValue("SpaceInfo", p.assign(path).append("\\rvc\\").append(fileinfo.name).c_str(),
  3119. CSimpleStringA::Format("%ld MB", (long)(fileLen / (1024 * 1024))));
  3120. }
  3121. } while (_findnext(hFile, &fileinfo) == 0);
  3122. _findclose(hFile);
  3123. }
  3124. if (lastVer != m_RvcSysinfo.InstallVersion.GetVersion64())
  3125. {
  3126. //写入硬盘量
  3127. spConfigRun->WriteConfigValueInt("SpaceInfo", "DiskTotalUsed(GB)", GetDiskUsedByte() / (1024 * 1024 * 1024));
  3128. if (spaceLock)
  3129. {
  3130. spaceLock = false; //释放锁
  3131. }
  3132. return; //新版本无需上报文件信息,更新完运行时文件后即可结束
  3133. }
  3134. //获取增量最大的前十文件夹信息
  3135. sortFileIncreasedSpace = vector<pair<string, long>>(fileIncreasedSpace.begin(), fileIncreasedSpace.end());
  3136. sort(sortFileIncreasedSpace.begin(), sortFileIncreasedSpace.end(), CmpByValueFromBiggest());
  3137. int topFileNum = sortFileIncreasedSpace.size();
  3138. if (topFileNum > 10)
  3139. {
  3140. topFileNum = 10;
  3141. }
  3142. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("变化最大的%d个文件夹信息。", topFileNum);
  3143. fileLen = 0;
  3144. for (int i = 0; i < topFileNum; i++)
  3145. {
  3146. fileLen = sortFileIncreasedSpace[i].second;
  3147. if (fileLen == 0) break;
  3148. CSimpleStringA warn1 = CSimpleStringA::Format("TOP %d: [%s], 增量[%ld]MB",
  3149. i + 1, sortFileIncreasedSpace[i].first.c_str(), sortFileIncreasedSpace[i].second);
  3150. LogWarn(Severity_Low, Error_Resource, LOG_RESOURCEWATCHER_FILE_TOPINCREASED_SPACE, warn1.GetData());
  3151. }
  3152. if (m_bNeedForceDiskCheck)
  3153. {
  3154. //获取空间占用最大前十文件夹信息
  3155. sortFileSpace = vector<pair<string, long>>(fileSpace.begin(), fileSpace.end());
  3156. sort(sortFileSpace.begin(), sortFileSpace.end(), CmpByValueFromBiggest());
  3157. int topFileSize = sortFileSpace.size();
  3158. if (topFileSize > 10)
  3159. {
  3160. topFileSize = 10;
  3161. }
  3162. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("空间占用最大的%d个文件夹信息。", topFileSize);
  3163. fileLen = 0;
  3164. for (int i = 0; i < topFileSize; i++)
  3165. {
  3166. fileLen = sortFileSpace[i].second;
  3167. if (fileLen == 0) break;
  3168. CSimpleStringA warn2 = CSimpleStringA::Format("空间占用排名 %d: [%s], 大小[%ld]MB",
  3169. i + 1, sortFileSpace[i].first.c_str(), sortFileSpace[i].second);
  3170. LogWarn(Severity_Low, Error_Resource, LOG_RESOURCEWATCHER_FILE_TOPUSED_SPACE, warn2.GetData());
  3171. }
  3172. m_bNeedForceDiskCheck = false;
  3173. }
  3174. if (spaceLock)
  3175. {
  3176. spaceLock = false; //释放锁
  3177. }
  3178. }
  3179. void ResourceWatcherFSM::GetSystemDiskStatus()
  3180. {
  3181. if (m_diskHighPercent <= 0)
  3182. {
  3183. m_diskHighPercent = 90; //默认硬盘告警百分比90%
  3184. }
  3185. ULARGE_INTEGER ulAvailFree, ulTotalBytes, ulTotalFree;
  3186. BOOL ret = GetDiskFreeSpaceEx(NULL, &ulAvailFree, &ulTotalBytes, &ulTotalFree);
  3187. if (ret == 0)
  3188. {
  3189. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetSystemDiskStatus.GetDiskFreeSpaceEx failed(%d).", GetLastError());
  3190. return;
  3191. }
  3192. CSimpleStringA csBinPath;
  3193. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("Bin", csBinPath); //获取当前终端运行磁盘位置
  3194. DWORD dwAvFree = ulAvailFree.QuadPart / MILLION;
  3195. DWORD dwTotal = ulTotalBytes.QuadPart / MILLION;
  3196. DWORD dwTotalFree = ulTotalFree.QuadPart / MILLION;
  3197. int ratio = dwTotalFree * 100 / dwTotal;
  3198. if ((100 - ratio) > m_diskHighPercent)
  3199. {
  3200. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("The disk has %d MB(%d%%) available.\n", dwTotalFree, ratio);
  3201. string test(csBinPath.GetData());
  3202. char diskMessage[1024];
  3203. sprintf(diskMessage, "{\"Disk\":\"%c:\",\"total\":\"%0.2f GByte\",\"free ratio\":\"%d%%\"}",
  3204. csBinPath.GetData()[0], (double)dwTotal / 1024, ratio);
  3205. //oilyang@20200526 根据wq建议,降低磁盘空间偏少的告警频率
  3206. //SYSTEMTIME localTime;
  3207. //GetLocalTime(&localTime);
  3208. //if (m_diskLastWarnHour != localTime.wHour) //需要告警时才强制全盘扫描
  3209. //{
  3210. // m_diskLastWarnHour = localTime.wHour;
  3211. // CSmartPointer<IConfigInfo> spConfigRun;
  3212. // ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  3213. // if (eErr == Error_Succeed) {
  3214. // spConfigRun->WriteConfigValueInt("WarnRecord", "disk", m_diskLastWarnHour);
  3215. // }
  3216. // //LogWarn(Severity_Low, Error_Resource, LOG_EVT_SELFCHECK_HARDDISK_TOO_HIGH, "Harddisk free space is few.");
  3217. // LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_HARDDISK_TOO_HIGH, diskMessage);
  3218. // m_bNeedForceDiskCheck = true;
  3219. //}
  3220. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_HARDDISK_TOO_HIGH, diskMessage);
  3221. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A05").setAPI("DiskUsedCheck")(diskMessage);
  3222. m_bNeedForceDiskCheck = true;
  3223. }
  3224. else
  3225. {
  3226. m_bNeedForceDiskCheck = false;
  3227. }
  3228. CheckDiskFileSpaceTask* task4 = new CheckDiskFileSpaceTask(this);
  3229. GetEntityBase()->GetFunction()->PostThreadPoolTask(task4);
  3230. }
  3231. ULONGLONG ResourceWatcherFSM::GetDiskUsedByte()
  3232. {
  3233. ULARGE_INTEGER ulAvailFree, ulTotalBytes, ulTotalFree;
  3234. BOOL ret = GetDiskFreeSpaceEx(NULL, &ulAvailFree, &ulTotalBytes, &ulTotalFree);
  3235. if (ret == 0)
  3236. {
  3237. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetSystemDiskStatus.GetDiskFreeSpaceEx failed(%d).", GetLastError());
  3238. return -1;
  3239. }
  3240. CSimpleStringA csBinPath;
  3241. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("Bin", csBinPath); //获取当前终端运行磁盘位置
  3242. return ulTotalBytes.QuadPart - ulTotalFree.QuadPart;
  3243. }
  3244. __int64 Filetime2Int64(const FILETIME& ftime)
  3245. {
  3246. LARGE_INTEGER li;
  3247. li.LowPart = ftime.dwLowDateTime;
  3248. li.HighPart = ftime.dwHighDateTime;
  3249. return li.QuadPart;
  3250. }
  3251. __int64 CompareFileTime2(const FILETIME& preTime, const FILETIME& nowTime)
  3252. {
  3253. return Filetime2Int64(nowTime) - Filetime2Int64(preTime);
  3254. }
  3255. unordered_map<int, long long> oldProcessTime;
  3256. unordered_map<int, long long> newProcessTime;
  3257. unordered_map<int, CSimpleStringA> processName;
  3258. unordered_map<int, double> processCpu;
  3259. string sysProcName = "[System Process]|System|Registry|smss.exe|csrss.exe|services.exe|wininit.exe";
  3260. bool cmp(const pair<int, double>& a, const pair<int, double>& b) {
  3261. return a.second > b.second;
  3262. }
  3263. void ResourceWatcherFSM::GetSystemCPUStatus()
  3264. {
  3265. oldProcessTime.clear();
  3266. newProcessTime.clear();
  3267. processName.clear();
  3268. processCpu.clear();
  3269. FILETIME preIdleTime;
  3270. FILETIME preKernelTime;
  3271. FILETIME preUserTime;
  3272. FILETIME preProcCreateTime;
  3273. FILETIME preProcExitTime;
  3274. FILETIME preProcKernelTime;
  3275. FILETIME preProcUserTime;
  3276. GetSystemTimes(&preIdleTime, &preKernelTime, &preUserTime);
  3277. PROCESSENTRY32 pe32Old;
  3278. pe32Old.dwSize = sizeof(pe32Old);
  3279. //获得系统进程快照的句柄
  3280. HANDLE hProcessSnapOld = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  3281. if (hProcessSnapOld == INVALID_HANDLE_VALUE)
  3282. {
  3283. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("CreateToolhelp32Snapshot error.");
  3284. return;
  3285. }
  3286. //首先获得第一个进程
  3287. BOOL bProcessOld = Process32First(hProcessSnapOld, &pe32Old);
  3288. //循环获得所有进程
  3289. while (bProcessOld)
  3290. {
  3291. //进程名和进程ID
  3292. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pe32Old.th32ProcessID);
  3293. GetProcessTimes(hProcess, &preProcCreateTime, &preProcExitTime, &preProcKernelTime, &preProcUserTime);
  3294. oldProcessTime[pe32Old.th32ProcessID] = Filetime2Int64(preProcKernelTime) + Filetime2Int64(preProcUserTime);
  3295. bProcessOld = Process32Next(hProcessSnapOld, &pe32Old);
  3296. }
  3297. CloseHandle(hProcessSnapOld);
  3298. // 等待一段时间
  3299. Sleep(1000); // 1000毫秒
  3300. FILETIME idleTime;
  3301. FILETIME kernelTime;
  3302. FILETIME userTime;
  3303. FILETIME ProcCreateTime;
  3304. FILETIME ProcExitTime;
  3305. FILETIME procKernelTime;
  3306. FILETIME procUserTime;
  3307. GetSystemTimes(&idleTime, &kernelTime, &userTime);
  3308. PROCESSENTRY32 pe32New;
  3309. pe32New.dwSize = sizeof(pe32New);
  3310. //获得系统进程快照的句柄
  3311. HANDLE hProcessSnapNew = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  3312. if (hProcessSnapNew == INVALID_HANDLE_VALUE)
  3313. {
  3314. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("CreateToolhelp32Snapshot error.");
  3315. return;
  3316. }
  3317. //首先获得第一个进程
  3318. BOOL bProcessNew = Process32First(hProcessSnapNew, &pe32New);
  3319. //循环获得所有进程
  3320. while (bProcessNew)
  3321. {
  3322. //进程名和进程ID
  3323. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pe32New.th32ProcessID);
  3324. GetProcessTimes(hProcess, &ProcCreateTime, &ProcExitTime, &procKernelTime, &procUserTime);
  3325. newProcessTime[pe32New.th32ProcessID] = Filetime2Int64(procKernelTime) + Filetime2Int64(procUserTime);
  3326. processName[pe32New.th32ProcessID] = CSimpleStringA(pe32New.szExeFile);
  3327. bProcessNew = Process32Next(hProcessSnapNew, &pe32New);
  3328. }
  3329. CloseHandle(hProcessSnapNew);
  3330. auto idle = CompareFileTime2(preIdleTime, idleTime);
  3331. auto kernel = CompareFileTime2(preKernelTime, kernelTime);
  3332. auto user = CompareFileTime2(preUserTime, userTime);
  3333. if (kernel + user == 0)
  3334. return;
  3335. CSystemRunInfo runInfo = { 0 };
  3336. GetEntityBase()->GetFunction()->GetSystemRunInfo(runInfo);
  3337. for (int i = 0; i < runInfo.strRunningEntityNames.GetCount(); i++) //实体进程的名称默认全为sphost,需转换为对应实体名
  3338. {
  3339. runInfo.strRunningEntityNames[i];
  3340. CEntityRunInfo entityInfo = { 0 };
  3341. GetEntityBase()->GetFunction()->GetEntityRunInfo(runInfo.strRunningEntityNames[i].GetData(), entityInfo);
  3342. processName[entityInfo.dwProcessID] = runInfo.strRunningEntityNames[i];
  3343. }
  3344. unordered_map<int, long long>::iterator it;
  3345. for (it = newProcessTime.begin(); it != newProcessTime.end(); ++it)
  3346. {
  3347. int tPid = it->first;
  3348. //进程的占用率 = 单位时间间隔里进程的CPU时间片占用 / 单位时间间隔里CPU的整体时间片
  3349. if (oldProcessTime.find(tPid) == oldProcessTime.end())
  3350. {
  3351. continue;
  3352. }
  3353. if (sysProcName.find(processName[tPid].GetData()) != std::string::npos)
  3354. {
  3355. continue;
  3356. }
  3357. // 转换为百分比
  3358. double tRatio = 100.0 * (newProcessTime[tPid] - oldProcessTime[tPid]) / (kernel + user);
  3359. if (tRatio > 0.0);
  3360. {
  3361. processCpu[tPid] = tRatio;
  3362. }
  3363. }
  3364. vector<pair<int, double>> vec(processCpu.begin(), processCpu.end());
  3365. sort(vec.begin(), vec.end(), cmp); //根据CPU使用率从大到小进行排序
  3366. int len = min(10, vec.size());
  3367. CSimpleStringA procWarn = "";
  3368. for (int i = 0; i < len; ++i) //构建进程的CPU使用告警信息
  3369. {
  3370. procWarn = procWarn + ",\"" + processName[vec[i].first] + "\":\"" + CSimpleStringA::Format("%.2f", vec[i].second) + "%\"";
  3371. }
  3372. double cpuRatio = 100.0 * (kernel + user - idle) / (kernel + user);
  3373. if (m_cpuHighPercent <= 0)
  3374. {
  3375. m_cpuHighPercent = 80; //默认告警百分比80%
  3376. }
  3377. if (cpuWarnThreshold <= 0)
  3378. {
  3379. cpuWarnThreshold = 10; //默认满10次告一次警
  3380. }
  3381. if (cpuRatio > (double)m_cpuHighPercent)
  3382. {
  3383. cpuWarnTime = cpuWarnTime % cpuWarnThreshold;
  3384. if (cpuWarnTime == 0) //每达到一次阈值告警一次
  3385. {
  3386. CSimpleStringA warn = CSimpleStringA::Format("{\"type\":\"cpu\", \"total_used\":\" %.2f", cpuRatio);
  3387. warn = warn + "%\"" + procWarn + "}";
  3388. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_TOO_HIGH, warn.GetData());
  3389. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A03").setAPI("CpuUsedCheck")(warn.GetData());
  3390. if (cpuRatio > 98) //cpu极端异常情况
  3391. {
  3392. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_ERROR, warn.GetData());
  3393. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A02")(warn.GetData());
  3394. }
  3395. }
  3396. cpuWarnTime++;
  3397. }
  3398. }
  3399. unsigned long long convert_time_format(const FILETIME* ftime)
  3400. {
  3401. LARGE_INTEGER li;
  3402. li.LowPart = ftime->dwLowDateTime;
  3403. li.HighPart = ftime->dwHighDateTime;
  3404. return li.QuadPart;
  3405. }
  3406. /// 时间转换
  3407. static uint64_t file_time_2_utc(const FILETIME* ftime)
  3408. {
  3409. LARGE_INTEGER li;
  3410. li.LowPart = ftime->dwLowDateTime;
  3411. li.HighPart = ftime->dwHighDateTime;
  3412. return li.QuadPart;
  3413. }
  3414. /// 获得CPU的核数
  3415. static int get_processor_number()
  3416. {
  3417. SYSTEM_INFO info;
  3418. GetSystemInfo(&info);
  3419. return (int)info.dwNumberOfProcessors;
  3420. }
  3421. int ResourceWatcherFSM::GetCpuUsageRatio(int pid)
  3422. {
  3423. //cpu数量
  3424. static int processor_count_ = -1;
  3425. //上一次的时间
  3426. static int64_t last_time_ = 0;
  3427. static int64_t last_system_time_ = 0;
  3428. FILETIME now;
  3429. FILETIME creation_time;
  3430. FILETIME exit_time;
  3431. FILETIME kernel_time;
  3432. FILETIME user_time;
  3433. int64_t system_time;
  3434. int64_t time;
  3435. int64_t system_time_delta;
  3436. int64_t time_delta;
  3437. int cpu = -1;
  3438. if (processor_count_ == -1)
  3439. {
  3440. processor_count_ = get_processor_number();
  3441. }
  3442. GetSystemTimeAsFileTime(&now);
  3443. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
  3444. if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time))
  3445. {
  3446. return -1;
  3447. }
  3448. system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time))
  3449. / processor_count_;
  3450. time = file_time_2_utc(&now);
  3451. if ((last_system_time_ == 0) || (last_time_ == 0))
  3452. {
  3453. last_system_time_ = system_time;
  3454. last_time_ = time;
  3455. return -1;
  3456. }
  3457. system_time_delta = system_time - last_system_time_;
  3458. time_delta = time - last_time_;
  3459. if (time_delta == 0)
  3460. return -1;
  3461. cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
  3462. last_system_time_ = system_time;
  3463. last_time_ = time;
  3464. return cpu;
  3465. }
  3466. double GetMemoryUsageGB(int pid)
  3467. {
  3468. #ifdef WIN32
  3469. DWORDLONG mem = 0, vmem = 0;
  3470. PROCESS_MEMORY_COUNTERS pmc;
  3471. // get process hanlde by pid
  3472. HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
  3473. if (GetProcessMemoryInfo(process, &pmc, sizeof(pmc)))
  3474. {
  3475. mem = pmc.WorkingSetSize;
  3476. vmem = pmc.PagefileUsage;
  3477. }
  3478. CloseHandle(process);
  3479. // use GetCurrentProcess() can get current process and no need to close handle
  3480. // convert mem from B to GB
  3481. double memGB = mem / (1024.0 * 1024.0 * 1024.0);
  3482. return memGB;
  3483. #else
  3484. char file_name[64] = { 0 };
  3485. FILE* fd;
  3486. char line_buff[512] = { 0 };
  3487. sprintf(file_name, "/proc/%d/status", pid);
  3488. fd = fopen(file_name, "r");
  3489. if (nullptr == fd)
  3490. return 0;
  3491. char name[64];
  3492. int vmrss = 0;
  3493. for (int i = 0; i < VMRSS_LINE - 1; i++)
  3494. fgets(line_buff, sizeof(line_buff), fd);
  3495. fgets(line_buff, sizeof(line_buff), fd);
  3496. sscanf(line_buff, "%s %d", name, &vmrss);
  3497. fclose(fd);
  3498. // cnvert VmRSS from KB to MB
  3499. return vmrss / 1024.0;
  3500. #endif
  3501. }
  3502. unordered_map<int, double> processMem;
  3503. void ResourceWatcherFSM::GetSystemMemoryStatus()
  3504. {
  3505. MEMORYSTATUSEX statex;
  3506. statex.dwLength = sizeof(statex);
  3507. GlobalMemoryStatusEx(&statex);
  3508. double totalMem = statex.ullTotalPhys / (1024.0 * 1024.0 * 1024.0); //GB
  3509. unordered_map<int, CSimpleStringA>::iterator it;
  3510. for (it = processName.begin(); it != processName.end(); ++it)
  3511. {
  3512. int tPid = it->first;
  3513. double tmp = GetMemoryUsageGB(it->first);
  3514. if (tmp > 0.0 && tmp < 100)
  3515. {
  3516. processMem[tPid] = 100 * (tmp / totalMem);
  3517. }
  3518. }
  3519. //return;
  3520. vector<pair<int, double>> vec(processMem.begin(), processMem.end());
  3521. sort(vec.begin(), vec.end(), cmp); //根据CPU使用率从大到小进行排序
  3522. int len = min(10, vec.size());
  3523. CSimpleStringA procWarn = "";
  3524. for (int i = 0; i < len; ++i) //构建进程的CPU使用告警信息
  3525. {
  3526. procWarn = procWarn + ",\"" + processName[vec[i].first] + "\":\"" + CSimpleStringA::Format("%.1f", vec[i].second) + "%\"";
  3527. }
  3528. if (m_memHighPercent <= 0)
  3529. {
  3530. m_memHighPercent = 80; //默认告警百分比80%
  3531. }
  3532. if (memWarnThreshold <= 0)
  3533. {
  3534. memWarnThreshold = 10; //默认告警阈值10次
  3535. }
  3536. if (statex.dwMemoryLoad > m_memHighPercent)
  3537. {
  3538. memWarnTime = memWarnTime % memWarnThreshold;
  3539. if (memWarnTime == 0) //每达到阈值告警一次
  3540. {
  3541. CSimpleStringA warn = CSimpleStringA::Format("{\"type\":\"mem\", \"total\":\"%.1f GByte\",\"total_used\":\" %d%%\"", totalMem, statex.dwMemoryLoad);
  3542. warn = warn + procWarn + "}";
  3543. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_MEMORY_TOO_HIGH, warn.GetData());
  3544. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A04").setAPI("MemUsedCheck")(warn.GetData());
  3545. }
  3546. memWarnTime++;
  3547. }
  3548. }
  3549. void ResourceWatcherFSM::DetectWallpaperAndWarn()
  3550. {
  3551. DWORD dwFlag = KEY_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS;
  3552. if (Is32R64Platform() != 0) {
  3553. dwFlag |= KEY_WOW64_64KEY;
  3554. }
  3555. bool wallpapaerSetCMD = false;
  3556. bool wellDone = false;
  3557. CSimpleStringA regeditValue(true);
  3558. HKEY hKey;
  3559. LONG lResult = RegOpenKeyEx(HKEY_CURRENT_USER,"Control Panel\\Desktop", 0, dwFlag, &hKey);
  3560. if (lResult == ERROR_SUCCESS) {
  3561. DWORD dwType = REG_SZ;
  3562. DWORD dwSize = MAX_PATH * sizeof(TCHAR);
  3563. TCHAR szValue[MAX_PATH + 1] = { 0 };
  3564. memset(szValue, '\0', MAX_PATH + 1);
  3565. lResult = RegQueryValueEx(hKey, "Wallpaper", NULL, &dwType, (LPBYTE)szValue, &dwSize);
  3566. if (lResult == ERROR_SUCCESS) {
  3567. CSimpleStringA strMsg = CSimpleStringA::Format("{\"subject\":\"wallpaper_path\",\"value\":\"%s\"}", szValue);
  3568. LogWarn(Severity_Low, Error_Debug, LOG_INFO_DESKTOP_WALLPAPER_PATH, strMsg);
  3569. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("WallpaperSettings")(strMsg.GetData());
  3570. regeditValue = szValue;
  3571. wellDone = true;
  3572. }
  3573. else {
  3574. CSimpleStringA strMsg = CSimpleStringA::Format("{\"subject\":\"wallpaper_path\",\"error\":\"RegQueryValueEx for Wallpaper returned %u, GLE=%u\"}", lResult, GetLastError());
  3575. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_DESKTOP_WALLPAPER_PATH_FETCHFAILE, strMsg);
  3576. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("WallpaperSettings").setResultCode("RTA5A0E")(strMsg.GetData());
  3577. }
  3578. }
  3579. else {
  3580. CSimpleStringA strMsg = CSimpleStringA::Format("{\"subject\":\"wallpaper_path\",\"error\":\"RegOpenKeyEx for Desktop returned %u, GLE=%u\"}", lResult, GetLastError());
  3581. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_DESKTOP_WALLPAPER_PATH_FETCHFAILE, strMsg);
  3582. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("WallpaperSettings").setResultCode("RTA5A0E")(strMsg.GetData());
  3583. }
  3584. RegCloseKey(hKey);
  3585. //////////////////////////////////////////////////////////////////////////
  3586. CSmartPointer<IConfigInfo> spCtSettingConfig;
  3587. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  3588. int value(0);
  3589. spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MakeSureCMBWallPaper", value);
  3590. if (!!value) {
  3591. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get MakeSureCMBWallPaper active flag from CenterSettings");
  3592. wallpapaerSetCMD = true;
  3593. }
  3594. CSimpleStringA RVCWallpaperName("WallPaper1920.png");
  3595. if (wellDone && !regeditValue.IsNullOrEmpty() && regeditValue.IndexOf(RVCWallpaperName) != -1 && ExistsFileA(regeditValue)) {
  3596. wallpapaerSetCMD = false;
  3597. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("alreay set wallpaper.");
  3598. }
  3599. if (wallpapaerSetCMD && wellDone) {
  3600. CSimpleStringA resWallPaper(true), rvcWallPaper(true);
  3601. this->GetEntityBase()->GetFunction()->GetPath("Base", resWallPaper);
  3602. this->GetEntityBase()->GetFunction()->GetPath("rvc", rvcWallPaper);
  3603. if (!resWallPaper.IsNullOrEmpty()) {
  3604. resWallPaper += SPLIT_SLASH_STR;
  3605. resWallPaper += "res\\Media\\";
  3606. resWallPaper += RVCWallpaperName;
  3607. }
  3608. if (!rvcWallPaper.IsNullOrEmpty()) {
  3609. rvcWallPaper += SPLIT_SLASH_STR;
  3610. rvcWallPaper += "Resources";
  3611. if (!ExistsDirA(rvcWallPaper)) { CreateDirA(rvcWallPaper, TRUE); }
  3612. rvcWallPaper += "\\";
  3613. rvcWallPaper += RVCWallpaperName;
  3614. }
  3615. CSimpleStringA sysWallPaper("C:\\Windows\\Web\Wallpaper");
  3616. if (!ExistsDirA(sysWallPaper)) { CreateDirA(sysWallPaper, TRUE); }
  3617. sysWallPaper += "\\";
  3618. sysWallPaper += RVCWallpaperName;
  3619. if (ExistsFileA(resWallPaper)) {
  3620. if (!ExistsFileA(rvcWallPaper)) { CopyFileA(resWallPaper, rvcWallPaper, TRUE); }
  3621. if (!ExistsFileA(sysWallPaper)) { CopyFileA(resWallPaper, sysWallPaper, TRUE); }
  3622. }
  3623. CSimpleStringA aimWallPaper(sysWallPaper);
  3624. if (!ExistsFileA(aimWallPaper) && ExistsFileA(rvcWallPaper)) { aimWallPaper = rvcWallPaper; }
  3625. if (ExistsFileA(aimWallPaper)) {
  3626. dwFlag = KEY_WRITE;
  3627. if (Is32R64Platform() != 0) {
  3628. dwFlag |= KEY_WOW64_64KEY;
  3629. }
  3630. lResult = RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, dwFlag, &hKey);
  3631. if (lResult == ERROR_SUCCESS) {
  3632. lResult = RegSetValueExA(hKey, "Wallpaper", 0, REG_SZ, (const BYTE*)aimWallPaper.GetData(), aimWallPaper.GetLength()+1);
  3633. if (lResult == ERROR_SUCCESS) {
  3634. LogWarn(Severity_Low, Error_Debug, LOG_WARN_DESKTOP_WALLPAPER_PATH_SET_SUCC
  3635. , CSimpleStringA::Format("RegSetValueExA for Wallpaper with %s succ!", aimWallPaper.GetData()));
  3636. }
  3637. else
  3638. {
  3639. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A0F").setAPI(__FUNCTION__)
  3640. ("RegSetValueExA for Shell with %s failed: %d", aimWallPaper.GetData(), lResult);
  3641. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_DESKTOP_WALLPAPER_PATH_SET_FAILED
  3642. , CSimpleStringA::Format("RegSetValueExA for Wallpaper with %s failed: %d", aimWallPaper.GetData(), lResult));
  3643. }
  3644. }
  3645. else
  3646. {
  3647. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A0F").setAPI(__FUNCTION__)
  3648. ("RegOpenKeyEx for write %s failed: %d", aimWallPaper.GetData(), lResult);
  3649. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_DESKTOP_WALLPAPER_PATH_SET_FAILED
  3650. , CSimpleStringA::Format("RegOpenKeyEx for write %s failed: %d", aimWallPaper.GetData(), lResult));
  3651. }
  3652. RegCloseKey(hKey);
  3653. }
  3654. else {
  3655. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_DESKTOP_WALLPAPER_PATH_SET_FAILED
  3656. , CSimpleStringA::Format("WallPaper file %s is not exist", aimWallPaper.GetData()));
  3657. }
  3658. }
  3659. }
  3660. void ResourceWatcherFSM::InitCustomAutoStartFileSheet()
  3661. {
  3662. CSmartPointer<IConfigInfo> spCtSettingConfig;
  3663. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  3664. CSimpleStringA strFileInterestSheet(true);
  3665. spCtSettingConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "AutoStartUserFileSheet", strFileInterestSheet);
  3666. if (!strFileInterestSheet.IsNullOrEmpty()) {
  3667. auto fileNames = strFileInterestSheet.Split('|');
  3668. if (fileNames.GetCount() > 0) {
  3669. for (int i = 0; i < fileNames.GetCount(); ++i) {
  3670. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AutoStartUserFileSheet[%s]", fileNames[i].GetData());
  3671. keyUserlist.push_back(fileNames[i].GetData());
  3672. }
  3673. }
  3674. }
  3675. strFileInterestSheet.Clear();
  3676. spCtSettingConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "AutoStartPubFileSheet", strFileInterestSheet);
  3677. if (!strFileInterestSheet.IsNullOrEmpty()) {
  3678. auto fileNames = strFileInterestSheet.Split('|');
  3679. if (fileNames.GetCount() > 0) {
  3680. for (int i = 0; i < fileNames.GetCount(); ++i) {
  3681. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AutoStartPubFileSheet[%s]", fileNames[i].GetData());
  3682. keyPublist.push_back(fileNames[i].GetData());
  3683. }
  3684. }
  3685. }
  3686. int value(0);
  3687. spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "DeleteCustomAutoStartFile", value);
  3688. if (!!value) {
  3689. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get DeleteCustomAutoStartFile execute flag from CenterSettings");
  3690. flag4DeleteKeyAutoStartFile = !!value;
  3691. }
  3692. // if (flag4DeleteKeyAutoStartFile) {
  3693. //strFileInterestSheet.Clear();
  3694. //spCtSettingConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "DeleteAutoStartFileSheet", strFileInterestSheet);
  3695. //if (!strFileInterestSheet.IsNullOrEmpty()) {
  3696. // auto fileNames = strFileInterestSheet.Split('|');
  3697. // if (fileNames.GetCount() > 0) {
  3698. // for (int i = 0; i < fileNames.GetCount(); ++i) {
  3699. // DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DeleteAutoStartFileSheet[%s]", fileNames[i].GetData());
  3700. // delKeylist.push_back(fileNames[i].GetData());
  3701. // }
  3702. // }
  3703. //}
  3704. // }
  3705. }
  3706. #endif // _MSC_VER end硬件资源监控相关系统功能 CPU、内存、硬盘、网络wifi
  3707. #ifdef RVC_OS_LINUX
  3708. static bool spaceLock = false;
  3709. void ResourceWatcherFSM::CheckDiskFileSpace()
  3710. {
  3711. if (spaceLock)
  3712. {
  3713. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("当前已有硬盘扫描进行中,跳过。");
  3714. return;
  3715. }
  3716. else
  3717. {
  3718. spaceLock = true; //加锁
  3719. }
  3720. //获取opt文件夹下的文件占用信息
  3721. FILE* fp = NULL;
  3722. CSimpleStringA cmd = "du -h -s /opt/* | sort -rn | head";
  3723. if ((fp = popen(cmd.GetData(), "r")) == NULL) {
  3724. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("popen failed:%d", GetLastError());
  3725. return;
  3726. }
  3727. char buf[1024] = { 0 };
  3728. CSimpleStringA warnMsg(true);
  3729. while (fgets(buf, sizeof(buf), fp))
  3730. {
  3731. warnMsg = warnMsg + "|" + buf;
  3732. }
  3733. if (warnMsg.GetLength() > 0)
  3734. {
  3735. LogWarn(Severity_Low, Error_Resource, LOG_RESOURCEWATCHER_FILE_TOPUSED_SPACE, warnMsg.GetData()); //告警opt下的文件夹
  3736. }
  3737. pclose(fp);
  3738. //获取opt/rvc文件夹下的文件占用信息
  3739. FILE* fp2 = NULL;
  3740. CSimpleStringA cmd2 = "du -h -s /opt/rvc/* | sort -rn | head";
  3741. if ((fp2 = popen(cmd2.GetData(), "r")) == NULL) {
  3742. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("popen failed:%d", GetLastError());
  3743. return;
  3744. }
  3745. CSimpleStringA warnMsg2(true);
  3746. char buf2[1024] = { 0 };
  3747. while (fgets(buf2, sizeof(buf2), fp2))
  3748. {
  3749. warnMsg2 = warnMsg2 + "|" + buf2;
  3750. }
  3751. if (warnMsg2.GetLength() > 0)
  3752. {
  3753. LogWarn(Severity_Low, Error_Resource, LOG_RESOURCEWATCHER_FILE_TOPUSED_SPACE, warnMsg2.GetData()); //告警opt/rvc下的文件夹
  3754. }
  3755. pclose(fp2);
  3756. if (spaceLock)
  3757. {
  3758. spaceLock = false; //释放锁
  3759. }
  3760. }
  3761. #endif // RVC_OS_LINUX
  3762. ErrorCodeEnum ResourceWatcherFSM::CatchSystemBasicInfo(SystemBasicInfo& info)
  3763. {
  3764. #if defined(RVC_OS_WIN)
  3765. ///**TODO(Gifur@10/10/2023): 待实现 */
  3766. return Error_NotImpl;
  3767. #else
  3768. CSimpleStringA runCfgPath;
  3769. ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetPath("RunCfg", runCfgPath);
  3770. if (runCfgPath.IsNullOrEmpty()) return Error_Null;
  3771. CSimpleStringA storeFilePath = runCfgPath + SPLIT_SLASH_STR + "SMBIOSData.txt";
  3772. if (!ExistsFileA(storeFilePath)) {
  3773. RemoveFileA(storeFilePath);
  3774. }
  3775. std::string succStr, errStr;
  3776. std::string runStr("dmidecode -t system > ");
  3777. runStr += storeFilePath.GetData();
  3778. if (!SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  3779. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("execute '%s' failed!", runStr.c_str());
  3780. if (!ExistsFileA(storeFilePath)) {
  3781. RemoveFileA(storeFilePath);
  3782. }
  3783. return Error_Unexpect;
  3784. }
  3785. do {
  3786. std::string succStr, errStr;
  3787. std::string runStr("awk -F ':' '(NR>=7)&&(NR<=14)&&($0~\"Manufacturer\"){print$2}' ");
  3788. runStr += storeFilePath.GetData();
  3789. if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  3790. info.strManufacturer = SP::Utility::ToTrim(succStr).c_str();
  3791. }
  3792. else
  3793. {
  3794. succStr = "";
  3795. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("fetch 'Manufacturer' failed!");
  3796. }
  3797. } while (false);
  3798. do {
  3799. std::string succStr, errStr;
  3800. std::string runStr("awk -F ':' '(NR>=7)&&(NR<=14)&&($0~\"Product Name\"){print$2}' ");
  3801. runStr += storeFilePath.GetData();
  3802. if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  3803. info.strProductName = SP::Utility::ToTrim(succStr).c_str();
  3804. }
  3805. else
  3806. {
  3807. succStr = "";
  3808. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("fetch 'Product Name' failed!");
  3809. }
  3810. } while (false);
  3811. do {
  3812. std::string succStr, errStr;
  3813. std::string runStr("awk -F ':' '(NR>=7)&&(NR<=14)&&($0~\"Serial Number\"){print$2}' ");
  3814. runStr += storeFilePath.GetData();
  3815. if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  3816. info.strSerialNumber = SP::Utility::ToTrim(succStr).c_str();
  3817. }
  3818. else
  3819. {
  3820. succStr = "";
  3821. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("fetch 'Serial Number' failed!");
  3822. }
  3823. } while (false);
  3824. if (!ExistsFileA(storeFilePath)) {
  3825. RemoveFileA(storeFilePath);
  3826. }
  3827. return Error_Succeed;
  3828. #endif //RVC_OS_WIN
  3829. }
  3830. void ResourceWatcherFSM::AlarmSystemBasicInfo()
  3831. {
  3832. SystemBasicInfo info;
  3833. if (Error_Succeed == CatchSystemBasicInfo(info)) {
  3834. CSimpleStringA strResult("{");
  3835. if (!info.strManufacturer.IsNullOrEmpty()) {
  3836. strResult += CSimpleStringA::Format("\"Manufacturer\":\"%s\"", info.strManufacturer.GetData());
  3837. }
  3838. if (!info.strProductName.IsNullOrEmpty()) {
  3839. if (strResult.GetLength() > 1) {
  3840. strResult += ", ";
  3841. }
  3842. strResult += CSimpleStringA::Format("\"Product Name\":\"%s\"", info.strProductName.GetData());
  3843. }
  3844. if (!info.strSerialNumber.IsNullOrEmpty()) {
  3845. if (strResult.GetLength() > 1) {
  3846. strResult += ", ";
  3847. }
  3848. strResult += CSimpleStringA::Format("\"Serial Number\":\"%s\"", info.strSerialNumber.GetData());
  3849. }
  3850. strResult += "}";
  3851. LogWarn(Severity_Low, Error_Debug, LOG_INFO_DEVICE_SMBIOS_GET, strResult);
  3852. }
  3853. }
  3854. BOOL ResourceWatcherFSM::DetectIsFirstRunAtBoot()
  3855. {
  3856. const BOOL bSet = SP::Module::Comm::IsFirsRunAppAfterSystemBoot(GetEntityBase(), LOG_RESOURCEWATCHER_FIRST_RUN_AFTER_BOOT);
  3857. if (bSet) {
  3858. ErrorCodeEnum eRet = GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_FRAMEWORK_FIRST_BOOT, SYSVAR_FRAMEWORK_FIRST_BOOT_YES);
  3859. if (eRet != Error_Succeed) {
  3860. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Set %s with %s failed: %d", SYSVAR_FRAMEWORK_FIRST_BOOT, SYSVAR_FRAMEWORK_FIRST_BOOT_YES, eRet);
  3861. }
  3862. }
  3863. else {
  3864. GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_FRAMEWORK_FIRST_BOOT, SYSVAR_FRAMEWORK_FIRST_BOOT_NO);
  3865. }
  3866. return bSet;
  3867. }
  3868. #ifdef RVC_OS_LINUX
  3869. void ResourceWatcherFSM::UploadMonitorSettings()
  3870. {
  3871. CSmartPointer<IConfigInfo> spCtSettingConfig;
  3872. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  3873. int nSwitchOff(0);
  3874. spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MonitorListenOFF", nSwitchOff);
  3875. if (!!nSwitchOff) {
  3876. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Cancel monitor change listen!");
  3877. if (m_bFirstRunAfterBoot) {
  3878. CSimpleStringA value(true);
  3879. bool res = GetMonitorInfo(value);
  3880. LogWarn(Severity_Low, Error_Debug, LOG_INFO_MONITOR_SETTINGS, value);
  3881. }
  3882. }
  3883. else
  3884. {
  3885. int nInterval(10000);
  3886. int nValue(0);
  3887. spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MonitorListenInterval", nValue);
  3888. if (nValue >= 10000) {
  3889. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Update monitor listen interval from %d to %d", nInterval, nValue);
  3890. nInterval = nValue;
  3891. }
  3892. CSimpleStringA strLastMonitor(true);
  3893. bool readFromCfgFalg(true);
  3894. CSmartPointer<IConfigInfo> spRunConfig;
  3895. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
  3896. spRunConfig->ReadConfigValue("MonitorAttribute", "LastInfo", strLastMonitor);
  3897. do
  3898. {
  3899. CSimpleStringA value(true);
  3900. bool res = GetMonitorInfo(value);
  3901. if (!value.IsNullOrEmpty() && (strLastMonitor.IsNullOrEmpty() || (strLastMonitor.Compare(value) != 0))) {
  3902. LogWarn(Severity_Low, Error_Debug, LOG_INFO_MONITOR_SETTINGS, value);
  3903. CSmartPointer<IConfigInfo> spRunConfig;
  3904. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
  3905. spRunConfig->WriteConfigValue("MonitorAttribute", "LastInfo", value);
  3906. strLastMonitor = value;
  3907. if (readFromCfgFalg) {
  3908. readFromCfgFalg = false;
  3909. }
  3910. }
  3911. else if (readFromCfgFalg && !strLastMonitor.IsNullOrEmpty() && strLastMonitor.Compare(value) == 0)
  3912. {
  3913. LogWarn(Severity_Low, Error_Debug, LOG_INFO_MONITOR_SETTINGS, value);
  3914. readFromCfgFalg = false;
  3915. }
  3916. Sleep(nInterval);
  3917. } while (true);
  3918. }
  3919. }
  3920. void ResourceWatcherFSM::DetectSoftwareInstallStatus()
  3921. {
  3922. CSmartPointer<IConfigInfo> spCtSettingConfig;
  3923. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  3924. CSimpleStringA strSoftwaresNames[MAX_SOFTWARE_INSTALLED_DETECT_COUNT];
  3925. CSimpleStringA strSoftwaresVers[MAX_SOFTWARE_INSTALLED_DETECT_COUNT];
  3926. int nNameCounts = 0;
  3927. for (int i = 0; i < MAX_SOFTWARE_INSTALLED_DETECT_COUNT; i++) {
  3928. strSoftwaresNames[i] = "";
  3929. strSoftwaresVers[i] = "";
  3930. CSimpleStringA item = CSimpleStringA::Format("SoftwareInstallDetect%d", i);
  3931. CSimpleStringA value(true);
  3932. spCtSettingConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), item, value);
  3933. if (value.IsNullOrEmpty()) {
  3934. break;
  3935. }
  3936. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CenterSettings:[%s]", value.GetData());
  3937. if (value.IndexOf("#") != -1) {
  3938. /** CSimpleString会带Trim操作,在这里不适用 [Gifur@202485]*/
  3939. auto items = SP::Utility::Split(std::string(value.GetData()), '#');
  3940. strSoftwaresNames[i] = items[0].c_str();
  3941. strSoftwaresVers[i] = items[1].c_str();
  3942. }
  3943. else
  3944. {
  3945. strSoftwaresNames[i] = value;
  3946. }
  3947. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Detect SoftDetect from CentralSetting, %d: [%s],[%s],[%s]"
  3948. , i, item.GetData(), strSoftwaresNames[i].GetData(), strSoftwaresVers[i].GetData());
  3949. nNameCounts++;
  3950. }
  3951. if (nNameCounts > 0) {
  3952. for (int i = 0; i < nNameCounts; ++i) {
  3953. CSimpleStringA runItem = CSimpleStringA::Format("dpkg -l | grep \"%s\" | awk '{print $3}'", strSoftwaresNames[i].GetData());
  3954. std::string additional("");
  3955. std::string succStr, errStr;
  3956. std::string runStr(runItem.GetData());
  3957. if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  3958. if (succStr.empty()) {
  3959. CSimpleStringA strMsg = CSimpleStringA::Format("{\"software_name\":\"%s\", \"version_status\":\"not installed\",\"detect_flag\":0}", strSoftwaresNames[i].GetData());
  3960. LogWarn(Severity_Low, Error_Debug, LOG_WARN_SOFTWARE_DETECT_NOT_EXISTS_BASE + i, strMsg);
  3961. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SoftwareInstallStatus")(strMsg.GetData());
  3962. }
  3963. else
  3964. {
  3965. succStr = SP::Utility::ToTrim(succStr);
  3966. if (strSoftwaresVers[i].IsNullOrEmpty() || strSoftwaresVers[i].Compare(succStr.c_str()) == 0) {
  3967. CSimpleStringA strMsg = CSimpleStringA::Format("{\"software_name\":\"%s\", \"version_status\":\"%s\",\"detect_flag\":1}"
  3968. , strSoftwaresNames[i].GetData(), succStr.c_str(), strSoftwaresVers[i].GetData());
  3969. LogWarn(Severity_Low, Error_Debug, LOG_WARN_SOFTWARE_DETECT_EXISTS_BASE + i, strMsg);
  3970. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SoftwareInstallStatus")(strMsg.GetData());
  3971. }
  3972. else
  3973. {
  3974. CSimpleStringA strMsg = CSimpleStringA::Format("{\"software_name\":\"%s\", \"version_status\":\"%s\", \"expected\":\"%s\",\"detect_flag\":0}"
  3975. , strSoftwaresNames[i].GetData(), succStr.c_str(), strSoftwaresVers[i].GetData());
  3976. LogWarn(Severity_Low, Error_Debug, LOG_WARN_SOFTWARE_DETECT_NOT_EXISTS_BASE + i, strMsg);
  3977. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SoftwareInstallStatus")(strMsg.GetData());
  3978. }
  3979. }
  3980. }
  3981. else
  3982. {
  3983. CSimpleStringA strMsg = CSimpleStringA::Format("{\"software_name\":\"%s\", \"version_status\":\"detect failed\", \"expected\":\"%s\",\"detect_flag\":0}"
  3984. , strSoftwaresNames[i].GetData(), strSoftwaresVers[i].GetData());
  3985. LogWarn(Severity_Low, Error_Debug, LOG_WARN_SOFTWARE_DETECT_EXISTS_STATUS_FAILED, strMsg);
  3986. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("SoftwareInstallStatus").setResultCode("RTA5A0D")(strMsg.GetData());
  3987. }
  3988. }
  3989. }
  3990. }
  3991. UINT ResourceWatcherFSM::GetSystemDisplayVersion(CSimpleStringA& strVersion)
  3992. {
  3993. UINT result = 0;
  3994. const char filePath[] = "/etc/os-version";
  3995. strVersion.Clear();
  3996. char tmp[33];
  3997. memset(tmp, 0, 33);
  3998. inifile_read_str_s("Version", "MajorVersion", "unknown", tmp, 32, filePath);
  3999. strVersion = tmp;
  4000. strVersion += ".";
  4001. memset(tmp, 0, 33);
  4002. inifile_read_str_s("Version", "MinorVersion", "unknown", tmp, 32, filePath);
  4003. strVersion += tmp;
  4004. strVersion += ".";
  4005. result = atoi(tmp);
  4006. memset(tmp, 0, 33);
  4007. inifile_read_str_s("Version", "OsBuild", "unknown", tmp, 32, filePath);
  4008. strVersion += tmp;
  4009. return result;
  4010. }
  4011. void ResourceWatcherFSM::UploadSysVersionInfo(UINT& ver)
  4012. {
  4013. std::map<std::string, std::string> srcData;
  4014. CSimpleStringA osver;
  4015. ver = GetSystemDisplayVersion(osver);
  4016. srcData.insert(std::make_pair("os-version", osver)); ////当前操作系统版本(系统信息)
  4017. tk_utsname_t t;
  4018. osutil_uname(&t);
  4019. srcData.insert(std::make_pair("sysname", t.sysname)); ////当前操作系统名
  4020. srcData.insert(std::make_pair("release", t.release)); ////当前发布级别
  4021. srcData.insert(std::make_pair("version", t.version)); ////当前发布版本
  4022. srcData.insert(std::make_pair("machine", t.machine)); ////当前硬件体系类型
  4023. do {
  4024. std::string sucContent, failedContent;
  4025. std::string cmd("cat /proc/cpuinfo |grep \"model name\" | awk 'NR==1'");
  4026. bool ret = SP::Module::Util::ShellExecute(cmd, sucContent, failedContent);
  4027. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("{%s}:{%s}{%s}", cmd.c_str(), sucContent.c_str(), failedContent.c_str());
  4028. auto elems = SP::Utility::Split(sucContent, ':');
  4029. if (elems.size() > 1) {
  4030. sucContent = SP::Utility::ToTrim(elems[1]);
  4031. }
  4032. srcData.insert(std::make_pair("cpu-type", sucContent));
  4033. } while (false);
  4034. auto ret = generateJsonStr(srcData);
  4035. LogWarn(Severity_Low, Error_Hardware, LOG_RESOURCEWATCHER_SYSTEMINFO, ret.second.c_str());
  4036. }
  4037. string ResourceWatcherFSM::MemoryProcessStatus()
  4038. {
  4039. CSmartPointer<IEntityFunction> spFunction = this->GetEntityBase()->GetFunction();
  4040. ErrorCodeEnum erroCode = Error_Unexpect;
  4041. int memTop = 10; //10个进程
  4042. map<string, string> nameProcess;
  4043. CSystemRunInfo runInfo = { 0 };
  4044. GetEntityBase()->GetFunction()->GetSystemRunInfo(runInfo);
  4045. for (int i = 0; i < runInfo.strRunningEntityNames.GetCount(); i++)
  4046. {
  4047. string entityName = runInfo.strRunningEntityNames[i].GetData();
  4048. CEntityRunInfo entityInfo = { 0 };
  4049. GetEntityBase()->GetFunction()->GetEntityRunInfo(entityName.c_str(), entityInfo);
  4050. nameProcess[to_string(entityInfo.dwProcessID)] = entityName;
  4051. }
  4052. FILE* fp;
  4053. char buffer[2048];
  4054. string cmd = "ps c -eo pid,%mem,rss,command | sort -k3 -rn | head -" + to_string(memTop);
  4055. fp = popen(cmd.c_str(), "r");
  4056. int i = 0;
  4057. string s;
  4058. string str[4];
  4059. //mem
  4060. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("MEM TOP %d PROCESS!", memTop);
  4061. string topMessage = "";
  4062. while (i < memTop)
  4063. {
  4064. fgets(buffer, sizeof(buffer), fp);
  4065. s = buffer;
  4066. istringstream is(s);
  4067. is >> str[0] >> str[1] >> str[2] >> str[3];
  4068. double temp;
  4069. stringstream ss1;
  4070. ss1 << str[2];
  4071. ss1 >> temp;
  4072. temp = temp / (1024 * 1024);
  4073. stringstream ss2;
  4074. ss2 << std::setiosflags(std::ios::fixed) << std::setprecision(2) << temp;
  4075. str[2] = ss2.str();
  4076. if (nameProcess.find(str[0]) != nameProcess.end())
  4077. {
  4078. str[3] = nameProcess[str[0]];
  4079. }
  4080. topMessage = topMessage + "\"" + str[3] + "\"" + ":" + "\"" + str[1] + "%\"";
  4081. if (i != memTop - 1)
  4082. {
  4083. topMessage += ",";
  4084. }
  4085. ++i;
  4086. }
  4087. topMessage += "}";
  4088. pclose(fp);
  4089. return topMessage;
  4090. }
  4091. long ResourceWatcherFSM::GetCPURunTime(CPUInfo* cpu) //获取CPU的当前信息,同时返回CPU使用时间
  4092. {
  4093. FILE* fd;
  4094. char buff[1024] = { 0 };
  4095. CPUInfo* cpuInfo = cpu;
  4096. fd = fopen("/proc/stat", "r");
  4097. if (!fd) {
  4098. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Read CPU Info FAILED!");
  4099. return -1;
  4100. }
  4101. fgets(buff, sizeof(buff), fd);
  4102. char name[64] = { 0 };
  4103. sscanf(buff, "%s %u %u %u %u %u %u %u",
  4104. cpuInfo->name, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system, &cpuInfo->idle, &cpuInfo->lowait, &cpuInfo->irq, &cpuInfo->softirq);
  4105. fclose(fd);
  4106. return (cpuInfo->user + cpuInfo->nice + cpuInfo->system + cpuInfo->idle + cpuInfo->lowait + cpuInfo->irq + cpuInfo->softirq);
  4107. }
  4108. long ResourceWatcherFSM::ReadProcCPURunTime(DWORD pid, ProcCPUInfo* pInfo) { //根据pid读取进程占用的CPU时间
  4109. char file_name[64] = { 0 };
  4110. FILE* fd;
  4111. char line_buff[1024] = { 0 };
  4112. sprintf(file_name, "/proc/%d/stat", pid);
  4113. fd = fopen(file_name, "r");
  4114. if (nullptr == fd) {
  4115. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Read PROCESS[%d] CPU Info FAILED!", pid);
  4116. return -1;
  4117. }
  4118. fgets(line_buff, sizeof(line_buff), fd);
  4119. sscanf(line_buff, "%u %s", &pInfo->pid, pInfo->pname);
  4120. const char* q = GetItems(line_buff, PROCESS_ITEM);
  4121. sscanf(q, "%ld %ld %ld %ld", &pInfo->utime, &pInfo->stime, &pInfo->cutime, &pInfo->cstime);
  4122. fclose(fd);
  4123. return (pInfo->utime + pInfo->stime + pInfo->cutime + pInfo->cstime);
  4124. }
  4125. //获取第N项开始的指针
  4126. const char* ResourceWatcherFSM::GetItems(const char* buffer, unsigned int item) {
  4127. const char* p = buffer;
  4128. int len = strlen(buffer);
  4129. int count = 0;
  4130. for (int i = 0; i < len; i++) {
  4131. if (' ' == *p) {
  4132. count++;
  4133. if (count == item - 1) {
  4134. p++;
  4135. break;
  4136. }
  4137. }
  4138. p++;
  4139. }
  4140. return p;
  4141. }
  4142. bool cmp(const pair<DWORD, DOUBLE>& a, const pair<DWORD, DOUBLE>& b) {
  4143. return a.second > b.second;
  4144. }
  4145. /* -----------------------
  4146. 根据先后两个时间的CPU信息,
  4147. 计算CPU的总占用量和各个进程的占用量
  4148. ----------------------- */
  4149. void ResourceWatcherFSM::GetSystemCPUStatus()
  4150. {
  4151. //int cpu_num = sysconf(_SC_NPROCESSORS_CONF); //CPU核数
  4152. CPUInfo* cpuOld = new CPUInfo;
  4153. CPUInfo* cpuNew = new CPUInfo;
  4154. const char* tPath = "/proc";
  4155. map<DWORD, string> nameProcess; // <pid, 进程名>
  4156. map<DWORD, DOUBLE> usageProcess; // <pid, CPU占用率>
  4157. long oldTotalTime = GetCPURunTime(cpuOld); //旧CPU运行总时间
  4158. if (oldTotalTime == -1)
  4159. {
  4160. return;
  4161. }
  4162. map<DWORD, long> oldProcCPUTime; // <pid, 旧时刻进程的CPU占用时间>
  4163. struct dirent* oldDirp;
  4164. DIR* oldDp = opendir(tPath);
  4165. if (oldDp != NULL) {
  4166. while ((oldDirp = readdir(oldDp)) != NULL) { //获取旧时刻 每一个进程的pid、CPU运行时间、进程名
  4167. string fileName = oldDirp->d_name;
  4168. BOOL isPid = TRUE;
  4169. for (int i = 0; i < fileName.length(); ++i) //判断进程id的文件夹 是否文件名是否纯数字
  4170. {
  4171. if (!isdigit(fileName[i]))
  4172. {
  4173. isPid = FALSE;
  4174. break;
  4175. }
  4176. }
  4177. if (!isPid) continue;
  4178. DWORD pid;
  4179. long oldTime;
  4180. ProcCPUInfo* oldProcCPU = new ProcCPUInfo;
  4181. sscanf(oldDirp->d_name, "%d", &pid); //读取文件夹名
  4182. oldTime = ReadProcCPURunTime(pid, oldProcCPU);
  4183. if (oldTime == -1)
  4184. {
  4185. return;
  4186. }
  4187. oldProcCPUTime[pid] = oldTime;
  4188. nameProcess[pid] = oldProcCPU->pname;
  4189. delete oldProcCPU;
  4190. }
  4191. closedir(oldDp);
  4192. }
  4193. sleep(1);
  4194. long newTotalTime = GetCPURunTime(cpuNew); //新CPU运行总时间
  4195. if (newTotalTime == -1)
  4196. {
  4197. return;
  4198. }
  4199. map<DWORD, long> newProcCPUTime; // <pid, 新时刻进程的CPU占用时间>
  4200. struct dirent* newDirp;
  4201. DIR* newDp = opendir(tPath);
  4202. if (newDp != NULL) {
  4203. while ((newDirp = readdir(newDp)) != NULL) { //获取新时刻 每一个进程的pid、CPU运行时间、进程名
  4204. string fileName = newDirp->d_name;
  4205. BOOL isPid = TRUE;
  4206. for (int i = 0; i < fileName.length(); ++i) //判断进程id的文件夹 是否文件名是否纯数字
  4207. {
  4208. if (!isdigit(fileName[i]))
  4209. {
  4210. isPid = FALSE;
  4211. break;
  4212. }
  4213. }
  4214. if (!isPid) continue;
  4215. DWORD pid;
  4216. long newTime;
  4217. ProcCPUInfo* newProcCPU = new ProcCPUInfo;
  4218. sscanf(newDirp->d_name, "%d", &pid); //读取文件夹名
  4219. newTime = ReadProcCPURunTime(pid, newProcCPU);
  4220. if (newTime == -1)
  4221. {
  4222. return;
  4223. }
  4224. newProcCPUTime[pid] = newTime;
  4225. string tName = newProcCPU->pname;
  4226. tName.erase(tName.begin());
  4227. tName.erase(tName.begin() + (tName.length() - 1));
  4228. nameProcess[pid] = tName;
  4229. delete newProcCPU;
  4230. }
  4231. closedir(newDp);
  4232. }
  4233. map<DWORD, long>::iterator it;
  4234. for (it = newProcCPUTime.begin(); it != newProcCPUTime.end(); ++it)
  4235. {
  4236. DWORD tPid = it->first;
  4237. //进程的占用率 = 单位时间间隔里进程的CPU时间片占用 / 单位时间间隔里CPU的整体时间片
  4238. DOUBLE tRatio = 100.0 * (newProcCPUTime[tPid] - oldProcCPUTime[tPid]) / (newTotalTime - oldTotalTime);
  4239. usageProcess[tPid] = tRatio;
  4240. }
  4241. CSystemRunInfo runInfo = { 0 };
  4242. GetEntityBase()->GetFunction()->GetSystemRunInfo(runInfo);
  4243. for (int i = 0; i < runInfo.strRunningEntityNames.GetCount(); i++) //实体进程的名称默认全为sphost,需转换为对应实体名
  4244. {
  4245. string entityName = runInfo.strRunningEntityNames[i].GetData();
  4246. CEntityRunInfo entityInfo = { 0 };
  4247. GetEntityBase()->GetFunction()->GetEntityRunInfo(entityName.c_str(), entityInfo);
  4248. nameProcess[entityInfo.dwProcessID] = entityName;
  4249. }
  4250. vector<pair<DWORD, DOUBLE>> vec(usageProcess.begin(), usageProcess.end());
  4251. sort(vec.begin(), vec.end(), cmp); //根据CPU使用率从大到小进行排序
  4252. int cpuTop = 10;
  4253. int len = MIN(cpuTop, vec.size()); //确认要展示的进程数量
  4254. string procWarn = "";
  4255. for (int i = 0; i < len; ++i) //构建进程的CPU使用告警信息
  4256. {
  4257. char* tUsage = new char[20];
  4258. sprintf(tUsage, "%.2lf", vec[i].second);
  4259. procWarn = procWarn + ",\"" + nameProcess[vec[i].first] + "\":\"" + string(tUsage) + "%\"";
  4260. delete tUsage;
  4261. }
  4262. unsigned long oldInfo, newInfo;
  4263. double cUsedRate = 0;
  4264. //第一次(用户+优先级+系统+空闲)的时间
  4265. //oldInfo = (unsigned long)(cpuOld->user + cpuOld->nice + cpuOld->system + cpuOld->idle + cpuOld->lowait + cpuOld->irq + cpuOld->softirq);
  4266. //第二次(用户+优先级+系统+空闲)的时间
  4267. //newInfo = (unsigned long)(cpuNew->user + cpuNew->nice + cpuNew->system + cpuNew->idle + cpuNew->lowait + cpuNew->irq + cpuNew->softirq);
  4268. double totalTime = newTotalTime - oldTotalTime;
  4269. double freeTime = cpuNew->idle - cpuOld->idle;
  4270. cUsedRate = (totalTime - freeTime) / totalTime;
  4271. if (m_cpuHighPercent <= 0)
  4272. {
  4273. m_cpuHighPercent = 80; //默认告警百分比80%
  4274. }
  4275. if (cpuWarnThreshold <= 0)
  4276. {
  4277. cpuWarnThreshold = 10; //默认满10次告一次警
  4278. }
  4279. if ((cUsedRate * 100) > m_cpuHighPercent)
  4280. {
  4281. cpuWarnTime = cpuWarnTime % cpuWarnThreshold;
  4282. if (cpuWarnTime == 0) //每达到一次阈值告警一次
  4283. {
  4284. stringstream tss;
  4285. tss << std::setiosflags(std::ios::fixed) << std::setprecision(2) << cUsedRate * 100;
  4286. string warn = "{ \"total_used\":\"" + tss.str() + "%\"" + procWarn + "}";
  4287. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_TOO_HIGH, CSimpleStringA::Format("%s", warn.c_str()));
  4288. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A03").setAPI("CpuUsedCheck")(warn.c_str());
  4289. }
  4290. cpuWarnTime++;
  4291. }
  4292. delete cpuNew;
  4293. delete cpuOld;
  4294. }
  4295. void ResourceWatcherFSM::GetSystemMemoryStatus()
  4296. {
  4297. MemInfo* memInfo = new MemInfo();
  4298. FILE* fd;
  4299. char buff[256];
  4300. fd = fopen("/proc/meminfo", "r");
  4301. if (!fd) {
  4302. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Read Memory INFO FAILED!");
  4303. return;
  4304. }
  4305. fgets(buff, sizeof(buff), fd);
  4306. sscanf(buff, "%s %lu ", memInfo->infoName1, &memInfo->memTotal);
  4307. fgets(buff, sizeof(buff), fd);
  4308. sscanf(buff, "%s %lu ", memInfo->infoName2, &memInfo->memFree);
  4309. fgets(buff, sizeof(buff), fd);
  4310. sscanf(buff, "%s %lu ", memInfo->infoName3, &memInfo->memAvail);
  4311. fclose(fd);
  4312. double mUsedRate = 0;
  4313. mUsedRate = (double)(memInfo->memTotal - memInfo->memAvail) / (double)memInfo->memTotal;
  4314. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  4315. char szResult2[DEFAULT_OUTPUT_FORMAT_SIZE];
  4316. char szResult3[DEFAULT_OUTPUT_FORMAT_SIZE];
  4317. ByteSprintf(szResult, (double)(memInfo->memTotal) * 1024, 'G'); // 内存信息在 /proc/meminfo 中的单位为 KB
  4318. ByteSprintf(szResult2, (double)(memInfo->memFree) * 1024, 'G');
  4319. ByteSprintf(szResult3, (double)(memInfo->memAvail) * 1024, 'G');
  4320. if (m_memHighPercent <= 0)
  4321. {
  4322. m_memHighPercent = 80; //默认告警百分比80%
  4323. }
  4324. if (memWarnThreshold <= 0)
  4325. {
  4326. memWarnThreshold = 10; //默认告警阈值10次
  4327. }
  4328. if ((mUsedRate * 100) > m_memHighPercent)
  4329. {
  4330. memWarnTime = memWarnTime % memWarnThreshold;
  4331. if (memWarnTime == 0) //每达到阈值告警一次
  4332. {
  4333. char usedResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  4334. ByteSprintf(usedResult, (double)(memInfo->memTotal) * 1024 * mUsedRate, 'G');
  4335. stringstream ss1;
  4336. ss1 << std::setiosflags(std::ios::fixed) << std::setprecision(2) << mUsedRate * 100;
  4337. string warn = "{ \"total\":\"" + string(szResult) + "\"," +
  4338. "\"used\":\"" + ss1.str() + "%\"," + MemoryProcessStatus();
  4339. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_MEMORY_TOO_HIGH, CSimpleStringA::Format("%s", warn.c_str()));
  4340. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A04").setAPI("MemUsedCheck")(warn.c_str());
  4341. }
  4342. memWarnTime++;
  4343. }
  4344. }
  4345. void ResourceWatcherFSM::GetDiskStatusFrom(LPCTSTR path)
  4346. {
  4347. if (m_diskHighPercent <= 0)
  4348. {
  4349. m_diskHighPercent = 90; //默认硬盘告警百分比90%
  4350. }
  4351. unsigned long long uiTotalBytes;
  4352. unsigned long long uiFreeDiskBytes;
  4353. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  4354. char szResult2[DEFAULT_OUTPUT_FORMAT_SIZE];
  4355. BOOL readFlag = DiskInfo::GetDiskSpace(path, uiTotalBytes, uiFreeDiskBytes);
  4356. double dUsedRate = 1 - (uiFreeDiskBytes * kConversion[3]) / (uiTotalBytes * kConversion[3]);
  4357. ByteSprintf(szResult, (double)uiTotalBytes);
  4358. ByteSprintf(szResult2, (double)uiFreeDiskBytes);
  4359. if (readFlag && (dUsedRate * 100 < m_diskHighPercent)) {
  4360. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[Disk# %s] total: %s, free: %s, [Disk] used rate: %.1lf%%.", path, szResult, szResult2, dUsedRate * 100);
  4361. }
  4362. else
  4363. {
  4364. CSimpleStringA warnStr = CSimpleStringA::Format("\"Disk\":\"%s\",\"total\":\"%s\",\"free\":\"%s\",\"used rate\":\"%.1lf%%\"",
  4365. path, szResult, szResult2, dUsedRate * 100);
  4366. LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_HARDDISK_TOO_HIGH, warnStr.GetData());
  4367. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A05").setAPI("DiskUsedCheck")(warnStr.GetData());
  4368. CheckDiskFileSpaceTask* task4 = new CheckDiskFileSpaceTask(this);
  4369. GetEntityBase()->GetFunction()->PostThreadPoolTask(task4);
  4370. }
  4371. }
  4372. void ResourceWatcherFSM::GetSystemDiskStatus()
  4373. {
  4374. GetDiskStatusFrom("/");
  4375. }
  4376. void ResourceWatcherFSM::switchWindowsEffect(const char* cfgFilePath, bool enable)
  4377. {
  4378. char tmp[33];
  4379. memset(tmp, 0, 33);
  4380. inifile_read_str_s("Compositing", "Enabled", "", tmp, 32, cfgFilePath);
  4381. if (strlen(tmp) == 0 || stricmp(tmp, "false") == 0) {
  4382. if (enable) {
  4383. inifile_write_str(cfgFilePath, "Compositing", "Enabled", "true");
  4384. LogWarn(Severity_Low, Error_InvalidState, LOG_RESOURCEWATCHER_COMPOSITING_CHANGE_ON, "to active window effect");
  4385. }
  4386. }
  4387. else if (stricmp(tmp, "true") == 0) {
  4388. if (!enable) {
  4389. inifile_write_str(cfgFilePath, "Compositing", "Enabled", "false");
  4390. LogWarn(Severity_Low, Error_InvalidState, LOG_RESOURCEWATCHER_COMPOSITING_CHANGE_OFF, "to inactive window effect");
  4391. }
  4392. }
  4393. }
  4394. void ResourceWatcherFSM::RecoverDDEClipboardEnable()
  4395. {
  4396. const std::string clipboardPath = "/usr/bin/dde-clipboard";
  4397. const std::string clipboardPathBak = "/usr/bin/dde-clipboard.bak";
  4398. if (!ExistsFileA(clipboardPath.c_str()) && ExistsFileA(clipboardPathBak.c_str())) {
  4399. fileutil_copy_file(clipboardPath.c_str(), clipboardPathBak.c_str());
  4400. //fileutil_delete_file(clipboardPathBak.c_str());
  4401. LogWarn(Severity_Low, Error_Debug, LOG_RESOURCEWATCHER_CLIPBOARD_RECOVER_ENABLE, "recover clipboard succ.");
  4402. }
  4403. else {
  4404. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s exists.", clipboardPath.c_str());
  4405. }
  4406. }
  4407. void ResourceWatcherFSM::ConfirmDDEClipboardDisable()
  4408. {
  4409. const std::string clipboardPath = "/usr/bin/dde-clipboard";
  4410. const std::string clipboardPathBak = "/usr/bin/dde-clipboard.bak";
  4411. char* clipboards[] = { "dde-clipboard", "dde-clipboardloader" };
  4412. if (!ExistsFileA(clipboardPath.c_str())) {
  4413. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("There are no any %s files.", clipboardPath.c_str());
  4414. if (ExistsFileA(clipboardPathBak.c_str())) {
  4415. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s exists.", clipboardPathBak.c_str());
  4416. }
  4417. return;
  4418. }
  4419. if (0 != fileutil_copy_file(clipboardPathBak.c_str(), clipboardPath.c_str())) {
  4420. LogWarn(Severity_Low, Error_Unexpect, LOG_RESOURCEWATCHER_CLIPBOARD_REMOVE_FAILED, "remove clipboard failed");
  4421. }
  4422. else {
  4423. fileutil_delete_file(clipboardPath.c_str());
  4424. osutil_terminate_related_process(clipboards, array_size(clipboards), 0);
  4425. LogWarn(Severity_Low, Error_Process, LOG_RESOURCEWATCHER_CLIPBOARD_REMOVE_SUCC, "remove clipboard succ.");
  4426. }
  4427. }
  4428. void ResourceWatcherFSM::ConfirmNotificationCenterDisable()
  4429. {
  4430. const char* osd_file_path = "/usr/lib/deepin-daemon/dde-osd";
  4431. const char* osd_bak_file_path = "/usr/lib/deepin-daemon/dde-osd.bak";
  4432. CSmartPointer<IConfigInfo> spConfig;
  4433. GetEntityBase()->GetFunction()->OpenConfig(Config_Cache, spConfig);
  4434. int flag = 0;
  4435. spConfig->ReadConfigValueInt("UOSFeatures", "NotifyCenterSupport", flag);
  4436. if (flag == 1) {
  4437. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("allow the dde-osd process alive.");
  4438. if (!ExistsFileA(osd_file_path) && ExistsFileA(osd_bak_file_path)) {
  4439. fileutil_copy_file(osd_file_path, osd_bak_file_path);
  4440. LogWarn(Severity_Low, Error_Debug, LOG_RESOURCEWATCHER_OSD_RECOVER_ENABLE, "recover dde osd succ.");
  4441. }
  4442. }
  4443. else {
  4444. if (ExistsFileA(osd_file_path) && !ExistsFileA(osd_bak_file_path)) {
  4445. char* relates[] = { "dde-osd" };
  4446. if (0 != fileutil_copy_file(osd_bak_file_path, osd_file_path)) {
  4447. LogWarn(Severity_Low, Error_Unexpect, LOG_RESOURCEWATCHER_CLIPBOARD_REMOVE_FAILED, "remove dde osd failed");
  4448. }
  4449. else {
  4450. osutil_terminate_related_process(relates, array_size(relates), 0);
  4451. fileutil_delete_file(osd_file_path);
  4452. LogWarn(Severity_Low, Error_Process, LOG_RESOURCEWATCHER_OSD_REMOVE_SUCC, "remove dde osd succ.");
  4453. }
  4454. }
  4455. }
  4456. }
  4457. void ResourceWatcherFSM::ConfirmWindowEffectHasBeenOpen()
  4458. {
  4459. array_header_t* arr;
  4460. arr = fileutil_get_sub_dirs_a("/home");
  4461. if (arr) {
  4462. int i;
  4463. for (i = 0; i < arr->nelts; ++i) {
  4464. char szDestSubDir[256] = { 0 };
  4465. char* dir = ARRAY_IDX(arr, i, char*);
  4466. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sub dir: %s", dir);
  4467. strcpy(szDestSubDir, dir);
  4468. strcat(szDestSubDir, SPLIT_SLASH_STR);
  4469. strcat(szDestSubDir, ".config/kwinrc");
  4470. if (ExistsFileA(szDestSubDir)) {
  4471. switchWindowsEffect(szDestSubDir, true);
  4472. }
  4473. }
  4474. toolkit_array_free2(arr);
  4475. }
  4476. }
  4477. #endif // RVC_OS_LINUX