mps-2.2.lua 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020
  1. #!/usr/bin/env slua
  2. -- mps slua kodlaması
  3. local milispath=os.getenv("MILIS_PATH")
  4. if not milispath then milispath="/usr/milis" end
  5. local talimatname=os.getenv("TALIMATNAME")
  6. if not talimatname then talimatname=milispath.."/".."talimatname" end
  7. local mps_path=os.getenv("MPS_PATH")
  8. if not mps_path then mps_path=milispath.."/".."mps" end
  9. local l5 = require("l5")
  10. package.path = mps_path.."/lua/?.lua" .. ";".. package.path
  11. package.path = mps_path.."/lang/?.lua" .. ";".. package.path
  12. package.path = mps_path.."/conf/?.lua" .. ";".. package.path
  13. local argparse = require ("argparse")
  14. local color = require ("ansicolors")
  15. local t=require ("talimat")
  16. local util={}
  17. util.renkli=true
  18. local shell_log="/tmp/mps_helper-shell.log"
  19. local static=mps_path.."/static/"
  20. local busybox=static.."busybox "
  21. --local busybox="/usr/bin/busybox "
  22. -- harici komut tanımları
  23. local cmd={
  24. lzip=function (paket) return (static.."lzip -d -k %s"):format(paket) end,
  25. tarx=function (arsiv,hedef) return (static.."tar xf %s -C %s"):format(arsiv,hedef) end,
  26. gzipd=function (arsiv) return (busybox.."gzip -dc %s"):format(arsiv) end,
  27. copy=function (kaynak,hedef) return (busybox.."cp -af %s %s"):format(kaynak,hedef) end,
  28. remove=function (dosya) return (busybox.."rm -rf %s"):format(dosya) end,
  29. mkdir=function (dizin) return (busybox.."mkdir -p %s"):format(dizin) end,
  30. readlink=function (dosya) return (busybox.."readlink -f %s"):format(dosya) end,
  31. xargs=function (komut) return (busybox.."xargs -I {} %s {}"):format(komut) end,
  32. dirname=function (dosya) return (busybox.."dirname %s"):format(dosya) end,
  33. basename=function (dosya) return (busybox.."basename %s"):format(dosya) end,
  34. chmodx=function (dosya) return (busybox.."chmod +x %s"):format(dosya) end,
  35. head=function (sira) return (busybox.."awk 'NR==1 {print}'"):format(sira) end,
  36. sed=function (ayar) return (busybox.."sed %s"):format(ayar) end,
  37. move=function (kaynak,hedef) return (busybox.."mv %s %s"):format(kaynak,hedef) end,
  38. http_code=function (link) return (static.."curl -ILs %s"):format(link) end,
  39. http_body=function (progress,link) return (static.."curl %s -L %s"):format(progress,link) end,
  40. cut=function (bol,sira) return (busybox.."cut -d'%s' -f%s"):format(bol,sira) end,
  41. sha256sum=function (hash,dosya) return (busybox..'echo "%s %s" | '..busybox..'sha256sum -c ;[ $? -eq 1 ] && printf "err@r"'):format(hash,dosya) end,
  42. grep=function (param,ayar,yol)
  43. if ayar ~= "" then
  44. ayar=ayar:gsub("+","\\+")
  45. ayar='"'..ayar..'"'
  46. end
  47. return (static..'rg %s %s %s'):format(param,ayar,yol)
  48. end,
  49. paste=function (ayrac,ayar) return (busybox..'paste -d"%s" %s'):format(ayrac,ayar) end,
  50. awk=function (param,ayar) return (busybox.."awk %s '%s'"):format(param,ayar) end,
  51. cat=function (dosya) return (busybox.."cat %s"):format(dosya) end,
  52. cat2=function (dosya,dosya2) return (busybox.."cat %s %s"):format(dosya,dosya2) end,
  53. sortp=function () return busybox.."sort" end,
  54. uniq=function (param) return (busybox.."uniq %s"):format(param) end,
  55. ls=function (param,dosya) return (busybox.."ls %s %s"):format(param,dosya) end,
  56. diff=function (dosya1,dosya2) return (busybox.."diff %s %s"):format(dosya1,dosya2) end,
  57. pipe=function(...)
  58. local pc=""
  59. for i,ar in ipairs({...}) do
  60. pc=pc..ar
  61. if i ~= #{...} then pc=pc.." | " end
  62. end
  63. return pc
  64. end,
  65. }
  66. -- cmd kısaltma
  67. local xdirname=cmd.xargs(cmd.dirname(""))
  68. local xbasename=cmd.xargs(cmd.basename(""))
  69. -- yaz = farklı tipte çıktıları ekrana renkli yazan işlev
  70. -- codes: 0=error, 1=success, 2=info 3=warning
  71. getmetatable("").__index.yaz = function(msg,code)
  72. --print("*",msg,code,color)
  73. tip={'%{red}','%{green}','%{blue}','%{lred}'}
  74. if code == nil then code=2 end
  75. if util.renkli then
  76. --print(tip[code+1](msg))
  77. print(color(('%s%s'):format(tip[code+1],msg)))
  78. else
  79. print(msg)
  80. end
  81. if code == 0 then
  82. os.exit()
  83. end
  84. end
  85. --split string
  86. function string:split(delimiter)
  87. local result = {}
  88. if delimiter == "." then
  89. for i in string.gmatch(self, "[^%.]+") do
  90. table.insert(result,i)
  91. end
  92. else
  93. local from = 1
  94. local delim_from, delim_to = string.find( self, delimiter, from )
  95. while delim_from do
  96. table.insert( result, string.sub( self, from , delim_from-1 ) )
  97. from = delim_to + 1
  98. delim_from, delim_to = string.find( self, delimiter, from )
  99. end
  100. table.insert( result, string.sub( self, from ) )
  101. end
  102. return result
  103. end
  104. function string:run(log)
  105. -- Open log file in append mode
  106. if log ~= "log" then
  107. local logger = io.open(shell_log, "a")
  108. logger:write(self.."\n");
  109. logger:close();
  110. end
  111. local handle=io.popen(self)
  112. local result=handle:read('*all')
  113. handle:close()
  114. -- komut çıktısı sonu yeni satır karakterin silinmesi - en sondaki \n
  115. if result:sub(-1) == "\n" then
  116. --result=result:gsub("\n", "")
  117. result=result:sub(1,-2)
  118. end
  119. return result
  120. end
  121. -- check a variable in an array
  122. -- todo!!! has_value kullanilan islevler find ile revize edilecek
  123. function util.has_value (tab, val)
  124. for _, value in ipairs(tab) do
  125. if value == val then
  126. return true
  127. end
  128. end
  129. return false
  130. end
  131. -- get the index of an item in a table
  132. function util.find(tab, val)
  133. for index, value in pairs(tab) do
  134. if value == val then
  135. return index
  136. end
  137. end
  138. return -1
  139. end
  140. -- print elements of a table-array
  141. function util.tprint(tablo)
  142. for _, value in ipairs(tablo) do
  143. print (value)
  144. end
  145. end
  146. function shell(command,log)
  147. -- Open log file in append mode
  148. if log ~= "log!" then
  149. local logger = io.open(shell_log, "a")
  150. logger:write(command.."\n");
  151. logger:close();
  152. end
  153. local handle=io.popen(command)
  154. local result=handle:read('*all')
  155. handle:close()
  156. -- komut çıktısı sonu yeni satır karakterin silinmesi - en sondaki \n
  157. if result:sub(-1) == "\n" then
  158. --result=result:gsub("\n", "")
  159. result=result:sub(1,-2)
  160. end
  161. return result
  162. end
  163. -- get content of a file
  164. function util.get_content(filename)
  165. assert(l5.lstat3(filename),"util.get_content : invalid path: "..filename)
  166. local f = assert(io.open(filename, "r"))
  167. local t = f:read('*all')
  168. f:close()
  169. return t
  170. end
  171. -- check a file has a line
  172. function util.has_line(filename,line)
  173. assert(l5.lstat3(filename),"util.has_line : invalid path: "..filename)
  174. local cnt=util.get_content(filename)
  175. for linein in cnt:gmatch("[^\r\n]+") do
  176. if linein == line then
  177. return true
  178. end
  179. end
  180. return false
  181. end
  182. -- check sha256sum of a file
  183. function util.hash_check(filepath,hash_value)
  184. assert(l5.lstat3(filepath),"util invalid path: "..filepath)
  185. --local komut='busybox echo "%s %s" | busybox sha256sum -c ;[ $? -eq 1 ] && printf "err@r"'
  186. --local ret=shell(komut:format(hash_value,filepath))
  187. local ret=cmd.sha256sum(hash_value,filepath):run()
  188. if ret:match("err@r") then
  189. return false
  190. end
  191. return true
  192. end
  193. -- convert byte to kilobyte,megabyte
  194. function util.byte_convert(value)
  195. --test
  196. if value == "@test" then
  197. assert(util.byte_convert(1023) == "1023 B")
  198. assert(util.byte_convert(1025) == "1.0 KB")
  199. assert(util.byte_convert(1024*1025) == "1.00 MB")
  200. assert(util.byte_convert(1024*1025*1024) == "1.001 GB")
  201. return 1
  202. end
  203. local _kb=1024
  204. local _mb=1024*_kb
  205. local _gb=1024*_mb
  206. local result=""
  207. if type(value) == "string" then value=tonumber(value) end
  208. if value > _gb then result=("%.3f GB"):format(value/_gb)
  209. elseif value > _mb then result=("%.2f MB"):format(value/_mb)
  210. elseif value > _kb then result=("%.1f KB"):format(value/_kb)
  211. else result=("%.0f B"):format(value) end
  212. return result
  213. end
  214. local has_value=util.has_value
  215. local find=util.find
  216. local get_content=util.get_content
  217. local has_line=util.has_line
  218. local tprint=util.tprint
  219. local hash_check=util.hash_check
  220. local byte_convert=util.byte_convert
  221. -- dil tespiti
  222. local _langenv=os.getenv("LANG")
  223. local def_lang="en"
  224. if not _langenv then _langenv="en_US" end
  225. local _langvar,_=_langenv:match("(.*)_(.*)")
  226. local status_lang, messages = pcall(require, "lang_".. _langvar)
  227. if not status_lang then
  228. messages = require ("lang_"..def_lang)
  229. end
  230. --------------------------------------------------
  231. function stat(path)
  232. return l5.lstat3(path)
  233. end
  234. -- mps ile ilgili ayarların conf/conf.lua dan yüklenmesi
  235. if not stat(mps_path.."/conf/conf.lua") then
  236. cmd.copy(mps_path.."/conf/conf.lua.sablon", mps_path.."/conf/conf.lua"):run()
  237. messages.default_configs_loaded:yaz(2)
  238. messages.relaunch_mps:yaz(2)
  239. os.exit()
  240. end
  241. local ayar= require ("conf")
  242. -------------------------------------------------------
  243. -- Genel işlevler
  244. function getcwd()
  245. return l5.getcwd()
  246. end
  247. function chdir(path)
  248. return l5.chdir(path)
  249. end
  250. function isdir(file)
  251. local dh,eno=l5.opendir(file)
  252. if dh then
  253. return true
  254. end
  255. return nil
  256. end
  257. function link(source,target)
  258. if not stat(source) then exit(source.." is not exist") end
  259. return l5.symlink(source,target)
  260. end
  261. function mkdir(path,mode)
  262. if not mode then mode=775 end
  263. return l5.mkdir(path,tonumber(tostring(mode),8))
  264. end
  265. function get_size(path)
  266. local _,size,_ = stat(path)
  267. return size
  268. end
  269. function rmdir(path)
  270. return l5.rmdir(path)
  271. end
  272. function http_request(link,progress)
  273. local pb="-s"
  274. if progress == "progress" then
  275. pb="--progress-bar"
  276. end
  277. local code=cmd.http_code(link):run()
  278. local body=""
  279. if code:match("200") then
  280. body=cmd.http_body(pb,link):run()
  281. return body,"200"
  282. elseif code:match("404") then
  283. return body,"404"
  284. else
  285. return body,"can't connect"
  286. end
  287. end
  288. -- DIZIN OLUŞTURMA - KONTROL --
  289. -- Paketleme dizini, yürürlük dosyasının oluşturulduğu konum
  290. local paketleme_dizin=os.getenv("PAKETLEME_DIZIN")
  291. if not paketleme_dizin then paketleme_dizin=getcwd() end
  292. local islem={}
  293. islem.api={}
  294. -- local talimatname="/usr/milis/talimatname"
  295. local kokdizin=""
  296. local paket_arsiv_pattern="([%a%d-_+]+)#([%d%a.]+)-([%d]+)-([%a%d_]+)" -- paket_isim#surum-devir-mimari : abc#1.2.3-1-x86_64
  297. -- paket arşiv format -paket_isim#surum-devir-mimari.mps.lz
  298. local paf="%s#%s-%s-%s.mps.lz"
  299. -- paket gösterim formatı
  300. local pgf="%s#%s-%s"
  301. -- paket depo link formatı - depo_adres/paket_isim#surum-devir-mimari.mps.lz / paf kullan
  302. local plf="%s/%s"
  303. local rotator_sym={"\\","/"}
  304. -- GLOBAL İŞLEVLER
  305. -- genel parametre inceleme ve düzenlenmesi
  306. function args_handler()
  307. -- parametrelere dönük özel işler yapılır.
  308. color_check()
  309. rootfs_check()
  310. --mps init kontrolü
  311. if args.ilk then mps_init() end
  312. if args.ilkds then mps_initfs() end
  313. local komut_islev={["in"]="indir",der="derle",kur="kur",
  314. sil="sil",gun="guncelle",ara="ara",
  315. sor="sorgu",bil="bilgi",kos="kos"}
  316. if args.command then
  317. local islev=komut_islev[args.command]
  318. if islev then
  319. if islem[islev] then
  320. islem[islev]["handler"](args)
  321. else
  322. print("not implemented yet")
  323. end
  324. --islem[args.command]["handler"](args)
  325. else
  326. print("not implemented yet")
  327. end
  328. end
  329. end
  330. -- root yetkili kontrolü
  331. function authorised_check()
  332. if not os.getenv("MPS_NOROOT") then
  333. local me=os.getenv("USER")
  334. if me ~= "root" then
  335. messages.need_root:yaz(0)
  336. end
  337. end
  338. end
  339. -- parametre analiz/ color option check
  340. function color_check()
  341. if args.renk == "0" then util.renkli=false end
  342. if args.renk == "1" then util.renkli=true end
  343. end
  344. -- parametre analiz/ package management root check
  345. function rootfs_check()
  346. if args.kok:sub(-1) ~= "/" then args.kok=args.kok.."/" end
  347. kokdizin=args.kok
  348. end
  349. function mps_init()
  350. -- mps için gerekli dizinlerin oluşturulması
  351. -- /var/lib/mps/db
  352. cmd.mkdir(kokdizin.."tmp"):run()
  353. cmd.mkdir(kokdizin..islem.paket.vt):run()
  354. cmd.mkdir(kokdizin..islem.paket.logdir):run()
  355. cmd.mkdir(kokdizin..islem.kur.logdir):run()
  356. cmd.mkdir(kokdizin..islem.sil.logdir):run()
  357. cmd.mkdir(kokdizin..islem.paket.cachedir):run();
  358. (messages.init_is_ok..kokdizin):yaz()
  359. end
  360. -- mps dosya sistemi ilkleme
  361. function mps_initfs()
  362. -- Milis için gerekli dizinlerin oluşturulması
  363. local initfs_komut=("bash %s/conf/init_rootfs.sh %s"):format(mps_path,kokdizin)
  364. initfs_komut:run();
  365. --print(initfs_komut);
  366. (messages.initfs_is_ok..kokdizin):yaz()
  367. end
  368. -- Diyalog İşlemleri
  369. islem.diyalog={}
  370. function islem.diyalog.onay(mesaj)
  371. local answer="-"
  372. if mesaj == nil then mesaj="?(y/n)" end
  373. repeat
  374. io.write(mesaj)
  375. io.flush()
  376. answer=io.read()
  377. until answer=="y" or answer=="n" or answer=="e" or answer=="h"
  378. if answer=="y" or answer=="e" then return true
  379. else return false end
  380. end
  381. -- MPS İŞLEMLER
  382. -- talimat bul
  383. islem.talimat_bul={
  384. retkey="talimat_bul:",
  385. }
  386. function islem.talimat_bul.job(paket,hepsi)
  387. -- alfanumerik arama yapılır.
  388. -- 2.parametere tip=hepsi gönderilirse bütün arama sonuçları çevirilir.
  389. --local komut=('busybox find %s -name "%s#*" | busybox sort -n | busybox head -1'):format(talimatname,paket)
  390. -- "rg --sort path --files %s -g talimat | rg '/%s#'"
  391. local komut=cmd.grep("--sort path --files","",talimatname).." -g talimat"
  392. local ret=""
  393. if hepsi=="1" then
  394. ret=cmd.pipe(komut,cmd.grep("",paket,""),xdirname):run()
  395. else
  396. ret=cmd.pipe(komut,cmd.grep("",'/'..paket..'#',""),xdirname,cmd.head()):run()
  397. end
  398. if ret == "" then
  399. return false
  400. else
  401. return ret
  402. end
  403. end
  404. islem.ara={usage="",}
  405. -- talimat bulma işlevi (mps bul talimat_isim)
  406. function islem.ara.handler(input)
  407. local hepsi = input.hepsi
  408. local arlist={}
  409. -- konsoldan girilen paket girdi analiz
  410. if input.arama then
  411. for _,pk in ipairs(input.arama) do table.insert(arlist,pk) end
  412. end
  413. -- arama test işlevi
  414. if input.test then
  415. for _,pk in ipairs(arlist) do print("ar",pk) end
  416. end
  417. local ret=""
  418. for _,arama in ipairs(arlist) do
  419. -- talimat araması ise
  420. if input.talimat then
  421. ret=islem.talimat_bul.job(arama,hepsi)
  422. if ret then print(ret)
  423. else messages.talimat_not_found:yaz(0)
  424. end
  425. -- tanım araması ise
  426. elseif input.tanim then
  427. --local kom='rg "^tanim*" %s |busybox sed \'s/\\/talimat:tanim//\' | rg -i "%s"'
  428. local komut=cmd.pipe(cmd.grep("","^tanim*",talimatname),cmd.sed("\'s/\\/talimat:tanim//\'"),cmd.grep("-i",arama,""))
  429. --print(kom:format(talimatname,arama))
  430. ret=komut:run()
  431. if ret and ret ~= "" then print(ret)
  432. else print(messages.desc_not_found:format(arama))
  433. end
  434. -- parametre belirtilmediyse öntanımlı olarak paket araması uygulanır.
  435. else
  436. -- 2021-12 çoklu paket.vt ile denenecek
  437. -- sürüm-devir eklenecek
  438. local kom=cmd.grep("-iN -g paket.vt#*",arama, kokdizin..islem.paket.cachedir)
  439. kom=cmd.pipe(kom,cmd.cut('#',2),cmd.cut(' ',"1-3"),"column -t")
  440. ret=kom:run()
  441. if ret and ret ~= "" then print(ret)
  442. else print(messages.package_not_found:format(arama))
  443. end
  444. end
  445. end
  446. end
  447. --
  448. -- Kaynak işlemleri
  449. -- kaynak talimatın içerdiği kaynakları gösterecek
  450. -- todo!!! bil altına alınacak
  451. -- todo!!! talimat.lua ya göre güncel
  452. islem.kaynak={
  453. usage="mps kaynak talimat_ismi",
  454. kontrol=false,
  455. }
  456. function islem.kaynak.handler(input)
  457. local liste={}
  458. if #input > 1 then
  459. -- 1 is talimat_bul işlemi
  460. local _islem=input[1]
  461. local girdi=input[2]
  462. local param=input[3]
  463. local dosya = girdi:match("^-%-dosya=(.*)$")
  464. if param and param:match("--kontrol") then islem.kaynak.kontrol=true end
  465. if dosya then
  466. if stat(dosya) then
  467. islem.kaynak.liste_dosyadan(dosya)
  468. else
  469. messages.file_not_found:format(dosya):yaz(0)
  470. end
  471. else
  472. -- girdi parametresi talimat olarak değerlendirelecek.
  473. local ret=islem.talimat_bul.job(girdi)
  474. if ret then
  475. -- kaynaklar kontrol edilecekse
  476. if islem.kaynak.kontrol then
  477. islem.kaynak.url_kontrol(islem.kaynak.liste(ret))
  478. -- kontrol yoksa sadece listeleme
  479. else
  480. tprint(islem.kaynak.liste(ret))
  481. end
  482. else
  483. messages.talimat_not_found:yaz(0)
  484. end
  485. end
  486. else
  487. (messages.usage..islem[_islem]["usage"]):yaz();
  488. end
  489. end
  490. -- talimata ait kaynakların listelenme işlevi
  491. function islem.kaynak.liste(talimatd)
  492. assert(stat(talimatd),"talimat dizin not found!")
  493. local talimatf=talimatd.."/talimat"
  494. assert(stat(talimatf),talimatf.." file not found!")
  495. -- talimat dosyasından alınan kaynaklar bash ile yorumlanıp
  496. -- açık değerlerine çevirlecektir.
  497. local kliste={}
  498. local talimat=t.get(talimatd)
  499. local komut='url=%s && isim=%s && surum=%s && devir=%s && echo '
  500. komut=komut:format(talimat.paket.url,talimat.isim,talimat.surum,talimat.devir)
  501. for _,val in ipairs (t.kaynaklar(talimat)) do
  502. table.insert(kliste,(komut..val):run())
  503. end
  504. return kliste
  505. end
  506. -- dosyadaki talimata ait kaynakların listelenme işlevi
  507. function islem.kaynak.liste_dosyadan(dosya)
  508. local ret=nil
  509. for pk in (get_content(dosya)):gmatch("[^\r\n]+") do
  510. ret=islem.talimat_bul.job(pk)
  511. if ret then
  512. -- kaynaklar kontrol edilecekse
  513. if islem.kaynak.kontrol then
  514. islem.kaynak.url_kontrol(islem.kaynak.liste(ret))
  515. -- kontrol yoksa sadece listeleme
  516. else
  517. tprint(islem.kaynak.liste(ret))
  518. end
  519. else
  520. messages.talimat_not_found:yaz(0)
  521. end
  522. end
  523. end
  524. -- talimata ait kaynakların url aktif kontrolü
  525. function islem.kaynak.url_kontrol(kaynaklar)
  526. local komut="%s -q --spider %s && echo $?"
  527. local ret=""
  528. for _,kaynak in ipairs(kaynaklar) do
  529. if kaynak:match("http") or kaynak:match("https") then
  530. ret=komut:format(wget_prog,kaynak):run()
  531. if ret == "0" then
  532. print(kaynak, "OK")
  533. else
  534. print(kaynak, "NOT")
  535. end
  536. else
  537. print(kaynak, "PASS")
  538. end
  539. end
  540. end
  541. -------
  542. ---------- Gerekler İşlemler ----------
  543. islem.gerek={
  544. retkey="gerek:",
  545. usage="mps gerek paket_ismi tip",
  546. -- aktif gerek listesi
  547. liste={},
  548. -- aktif gereklerin eklenme kontrol listesi
  549. list={},
  550. sh_list={},
  551. }
  552. function islem.gerek.job(talimatd,tip)
  553. assert(talimatd,"talimatd is nil!")
  554. local talimat=t.load(talimatd.."/talimat",{"derle","pakur","kaynak"})
  555. --todo!!! sonsuz gerek döngüsü engellenecek.
  556. -- gereklerin toplanan listeye eklenmesi
  557. -- işlem yapıldığına dair imleç hareketi
  558. io.write(rotator_sym[ math.random( #rotator_sym) ].."\b")
  559. io.flush()
  560. local function ekle(talimatd)
  561. tisim = cmd.basename(talimatd:split("#")[1]):run()
  562. if islem.gerek.list[tisim] == nil then
  563. islem.gerek.list[tisim]=talimatd
  564. --print("e",talimatd)
  565. table.insert(islem.gerek.liste,talimatd)
  566. end
  567. end
  568. -- talimatın libgerekler dosyasının analiz edilmesi
  569. local function oto_rdeps(talimatd)
  570. if stat(talimatd.."/"..islem.shlib.dosya) then
  571. local sh_tal=""
  572. local shlibs=get_content(talimatd.."/"..islem.shlib.dosya)
  573. for sh in shlibs:gmatch("[^\r\n]+") do
  574. --sh_tal=islem.shlib.bul(sh,"-t","ilk")
  575. if islem.gerek.sh_list[sh] then
  576. sh_tal=islem.gerek.sh_list[sh]
  577. --print(sh,sh_tal,"cache")
  578. else
  579. sh_tal=islem.shlib.bul(sh,"-t","ilk")
  580. if not sh_tal then sh_tal=0 end
  581. islem.gerek.sh_list[sh]=sh_tal
  582. --print(sh,sh_tal,"once")
  583. end
  584. if sh_tal and sh_tal ~= talimatd and sh_tal ~= 0 then
  585. --print("3",sh_tal)
  586. islem.gerek.job(sh_tal,"c")
  587. end
  588. end
  589. end
  590. end
  591. -- alt gereklerin dolaşılması
  592. local function gerek_dolas(dep,talimatd)
  593. local _td=islem.talimat_bul.job(dep)
  594. -- bir önceki paketin kurulabilir değeri iptal ediliyor
  595. local kurulabilir=false
  596. if _td then
  597. -- bir paketin depodaki bulunma durumuna göre
  598. -- derleme ve çalışma gereklerinin araştırılması yapılmaktadır.
  599. -- çalışma gerek araşırılmasında da aynı durum kontrol edilmektedir.
  600. -- todo!!! alt işleve alınacak alttaki operasyon
  601. tsd=cmd.basename(_td):run()
  602. for _,b in ipairs(islem.paket.pkvt_bilgi(dep)) do
  603. pksd=pgf:format(b.isim,b.surum,b.devir)
  604. if tsd == pksd then
  605. kurulabilir=b
  606. break
  607. end
  608. end
  609. if kurulabilir then
  610. tip="c"
  611. else
  612. tip="d"
  613. end
  614. islem.gerek.job(_td,tip)
  615. else
  616. (messages.talimat_not_found..talimatd..":"..dep):yaz(0)
  617. end
  618. end
  619. -- ikincil dolasma engelleme
  620. tisim = cmd.basename(talimatd:split("#")[1]):run()
  621. if islem.gerek.list[tisim] == nil then
  622. -- talimatdaki gerek kısmının analiz edilmesi - ana iskelet
  623. if talimat["gerek"] then
  624. local rdeps=talimat["gerek"]["calisma"]
  625. local bdeps=talimat["gerek"]["derleme"]
  626. local kurulabilir=false
  627. if tip == "d" and bdeps then
  628. for dep in bdeps:gmatch('([^%s]+)') do
  629. gerek_dolas(dep,talimatd)
  630. end
  631. elseif rdeps then
  632. for dep in rdeps:gmatch('([^%s]+)') do
  633. gerek_dolas(dep,talimatd)
  634. end
  635. end
  636. oto_rdeps(talimatd)
  637. ekle(talimatd)
  638. else
  639. oto_rdeps(talimatd)
  640. ekle(talimatd)
  641. end
  642. end
  643. end
  644. islem.tgerek={comment=messages.comment_mps_rev_dep,}
  645. function islem.tgerek.job(paket, tip)
  646. print("Ters gerekler:");
  647. print("-------------------")
  648. local local_paketler={}
  649. --local dirbase1_cmd="busybox xargs -I {} busybox dirname {} | busybox xargs -I {} busybox basename {} | cut -d'#' -f1"
  650. --local tgkomut="busybox grep -r ' *%s *= *' %s | busybox grep ' %s$\\| %s \\|=%s$\\|=%s ' | busybox cut -d':' -f1 | "..dirbase1_cmd
  651. local paket_filter=cmd.grep("",(' %s$| %s |=%s$|=%s '):format(paket,paket,paket,paket),"")
  652. if tip == "d" then
  653. -- derleme
  654. ret=cmd.pipe(cmd.grep(""," *derleme *= *",talimatname),paket_filter,cmd.cut(':',1),xdirname,xbasename,cmd.cut('#',1)):run()
  655. for line in ret:gmatch("[^\r\n]+") do
  656. table.insert(local_paketler, line)
  657. end
  658. else
  659. -- calistirma
  660. ret=cmd.pipe(cmd.grep(""," *calisma *= *",talimatname),paket_filter,cmd.cut(':',1),xdirname,xbasename,cmd.cut('#',1)):run()
  661. for line in ret:gmatch("[^\r\n]+") do
  662. table.insert(local_paketler, line)
  663. end
  664. -- libgerek dosyasindan
  665. local talimatd=islem.talimat_bul.job(paket)
  666. if stat(talimatd.."/".."pktlibler") then
  667. local sh_tal=""
  668. local shlibs=get_content(talimatd.."/".."pktlibler")
  669. for sh in shlibs:gmatch("[^\r\n]+") do
  670. -- 2021-12 sort edilecek
  671. --local komut=("rg -l '%s$' %s -g libgerekler | "..dirbase1_cmd):format(sh,talimatname)
  672. local komut=cmd.grep("--sort path -l -g libgerekler",sh..'$', talimatname)
  673. --sh_tal=shell(komut)
  674. sh_tal=cmd.pipe(komut,xdirname,xbasename,cmd.cut('#',1)):run()
  675. for line in sh_tal:gmatch("[^\r\n]+") do
  676. if not has_value(local_paketler, line) then
  677. table.insert(local_paketler, line)
  678. end
  679. end
  680. end
  681. end
  682. end
  683. tprint(local_paketler)
  684. print("-------------------")
  685. end
  686. ------------------------------------------
  687. -- Derle işlemi
  688. islem.derle={
  689. retkey="derle:",
  690. usage="mps derle paket_ismi",
  691. }
  692. function islem.derle.handler(input)
  693. local derlist={}
  694. local hedefkur=false
  695. if input.kur then
  696. hedefkur=true
  697. end
  698. local function pk_analiz(talimat)
  699. local _durum=islem.talimat_bul.job(talimat)
  700. if _durum then
  701. table.insert(derlist,talimat)
  702. else
  703. (messages.talimat_not_found..talimat):yaz(0)
  704. end
  705. end
  706. -- konsoldan girilen paket girdi analiz
  707. if input.paket then
  708. for _,pk in ipairs(input.paket) do pk_analiz(pk) end
  709. end
  710. -- dosya parametresi içerik girdi analiz
  711. if input.dosya then
  712. if stat(input.dosya) then
  713. for pk in (get_content(input.dosya)):gmatch("[^\r\n]+") do
  714. pk_analiz(pk)
  715. end
  716. else
  717. messages.file_not_found:format(dosya):yaz(0)
  718. end
  719. end
  720. -- derle test işlevi
  721. if input.test then
  722. for _,pk in ipairs(derlist) do print("d",pk) end
  723. else
  724. -- test yoksa derle işlemi yapacak
  725. for _,dpaket in ipairs(derlist) do
  726. if input.tek then
  727. islem.derle.tek(dpaket)
  728. else
  729. islem.derle.job(dpaket,hedefkur)
  730. end
  731. end
  732. end
  733. end
  734. function islem.derle.job(paket,hedefkur)
  735. --talimatın konumu bulunarak gelecek handler den
  736. local ret=islem.talimat_bul.job(paket)
  737. local retq=nil
  738. -- pk = paket isim
  739. -- pksd = ağdaki paket sürüm-devir
  740. -- tsd = talimat sürüm-devir
  741. -- ksd = kurulu sürüm-devir
  742. local pk,pksd,tsd,ksd=""
  743. local derlet=false
  744. local kurulabilir=false
  745. local eski_sil=false
  746. -- derleme işlemi
  747. -- todo!!! mpsd.lua lib olarak çağrılacak sonra, şu an shell
  748. -- 1. Derleme gerekleri bul.
  749. islem.gerek.job(ret,"d")
  750. --tprint(islem.gerek.liste)
  751. -- 2. Döngüde gerekler incelenir.
  752. local pb={}
  753. local ksd=nil
  754. for _,talimatd in ipairs(islem.gerek.liste) do
  755. -- her gerekte derletme ve kurulma durumları sıfırlanacak.
  756. derlet=false
  757. kurulabilir=false
  758. -- 2.1 kurulu kontrol
  759. tsd=cmd.basename(talimatd):run()
  760. pk,_=tsd:match("([%a%d-_+]+)#+")
  761. -- kurulu kontrol , link dizin dönüşü ile
  762. if islem.paket.kurulu_kontrol(pk) then
  763. pb=islem.paket.kurulum_bilgileri(pk)
  764. ksd=pb.isim.."#"..pb.surum.."-"..pb.devir
  765. else
  766. ksd=nil
  767. end
  768. -- 2.1.1 paket kurulu ise sürüm-devir uyum kontrolü yapılır.
  769. if ksd then
  770. -- ksd kurulu yol, sadece talimat isim formatı
  771. --ksd=get_basename(ksd)
  772. if tsd ~= ksd then
  773. print("kurulu sürümd ile derlenmesi gereken sürümd farklı-derlenecek!")
  774. -- paket kurulu sd uyumsuzluğu var
  775. -- paketi sildir(onaylı?) ve derlet
  776. -- önemli !!!-eski paketi derleme başarılı olursa sildir.
  777. derlet=true
  778. eski_sil=true
  779. else
  780. messages.package_already_installed_and_uptodate:format(pk):yaz(2)
  781. goto continue
  782. end
  783. -- 2.1.2 paket kurulu değilse ağdan indirilip kurulacak
  784. end
  785. -- ağdaki paketin surumdeviri incelenecek
  786. -- tsd ile pksd karşılaştır
  787. -- paket.vt lerdeki paket sürüm-devir bilgileri taranacak.
  788. -- tsd e eşleşen bulunursa eşleşen! indirilecek yoksa derletilecek.
  789. -- pakete ait depolarda bulduğu pkvt bilgisini getirecek.
  790. for _,b in ipairs(islem.paket.pkvt_bilgi(pk)) do
  791. pksd=pgf:format(b.isim,b.surum,b.devir)
  792. if tsd == pksd then
  793. --print(pk,b.depo,"bulundu.")
  794. kurulabilir=b
  795. break
  796. end
  797. end
  798. -- kurulabilir nesnesine ağdaki paket bilgisi atılacak.
  799. if kurulabilir then
  800. -- paket önbellekte varsa
  801. -- shasum kontrolü yapılıp yerelden kurulma yapılacak.
  802. -- ağdan indirmeden önce önbellekte kontrol edecek
  803. local _pkt=paf:format(pk,kurulabilir.surum,kurulabilir.devir,kurulabilir.mimari)
  804. local kur_onay=false
  805. local _indir=false
  806. local _pktyol=kokdizin..islem.paket.cachedir.."/".._pkt
  807. if stat(_pktyol) then
  808. if hash_check(_pktyol,kurulabilir.shasum) == false then
  809. --delete file
  810. cmd.remove(pktyol):run()
  811. _indir=true
  812. end
  813. else
  814. -- önbellekte yoksa veya hash uyumsuzsa indirilecek
  815. _indir=true
  816. end
  817. if _indir == true then
  818. islem.indir.handler({paket={pk}})
  819. end
  820. -- todo!!! paket önbellekte ise hash kontrolü yapılıyor - indikten sonra da yapılmalı.
  821. -- indirilememe veya herhangi bir nedenden paketin önbellekte hazır olmaması durumu
  822. if not stat(_pktyol) then
  823. messages.package_not_found:format(_pktyol):yaz(0)
  824. else
  825. -- ağdan inen veya önbellekteki paket kurulabilir
  826. -- ayrıca eski paket kurulu ise kaldırılacak.
  827. if eski_sil == true then
  828. print("eski sürüm paket tespit edildi, kaldırılacak")
  829. islem.sil.handler({paket={pk}})
  830. end
  831. --print(_pktyol,"kurulacak")
  832. islem.kur.yerelden(_pktyol)
  833. -- paket kurulduysa eğer eski sürümden dolayı onay verilen derletme
  834. -- işlemi iptal edilecektir.
  835. derlet=false
  836. end
  837. else
  838. derlet=true
  839. end
  840. -- 2.2 derleme
  841. if derlet == true then
  842. -- aktif oluşan paket arşiv
  843. local mimari=("uname -m"):run()
  844. local pkarsiv=tsd.."-"..mimari..".mps.lz"
  845. -- hedef paket isimleri
  846. local hpksd=cmd.basename(ret):run()
  847. local hdarsiv=hpksd.."-"..mimari..".mps.lz"
  848. -- 2.2.1 talimat derle
  849. print(talimatd,"tl derlenecek")
  850. local komut="%s/bin/mpsd %s 2>&1 | tee %s.log"
  851. os.execute(komut:format(mps_path, talimatd, pk))
  852. -- 2.2.2 üretilen paketi kur
  853. -- hedef üretilmek istenen pakete gelindiğinde
  854. -- bu noktada derleme başarılı olup paket üretildiği
  855. -- kontrol edilerek eski sürüm paket kaldırılır.
  856. if pk == paket then
  857. -- mps derle paket --kur seçeneğine bakılacak.
  858. if hedefkur == true then
  859. -- hedef paket arşivi
  860. if stat(paketleme_dizin.."/"..hdarsiv) then
  861. if eski_sil then islem.sil.handler({paket={pk}}) end
  862. print(paket.." hedef paket de kurulacak.")
  863. islem.kur.yerelden(paketleme_dizin.."/"..hdarsiv)
  864. else
  865. messages.package_not_found:format(hdarsiv):yaz(0)
  866. end
  867. end
  868. else
  869. -- altgereklerin oluşan paketleri zorunlu kurulacak
  870. if stat(paketleme_dizin.."/"..pkarsiv) then
  871. if eski_sil then islem.sil.handler({paket={pk}}) end
  872. islem.kur.yerelden(paketleme_dizin.."/"..pkarsiv)
  873. else
  874. messages.package_not_found:format(pkarsiv):yaz(0)
  875. end
  876. end
  877. end
  878. ::continue::
  879. -- for bitiş
  880. end
  881. --print(paket.." derleme bitti")
  882. end
  883. function islem.derle.tek(paket)
  884. --talimat konum bul
  885. ret=islem.talimat_bul.job(paket)
  886. if ret then
  887. print(ret.." derlenecek")
  888. local komut="%s/bin/mpsd %s 2>&1 | tee %s.log"
  889. os.execute(komut:format(mps_path, ret, paket))
  890. else
  891. (messages.talimat_not_found..paket):yaz(0)
  892. end
  893. end
  894. ------------------------------
  895. -- Paket Arşiv işlemleri
  896. islem.arsiv={
  897. retkey="arşiv:",
  898. }
  899. -- Milis paketi ön kontrolleri
  900. function islem.arsiv.kontrol(paket)
  901. -- kullanıcı hedefli de çıktı verilebilinir.
  902. assert(stat(paket),"islem.arsiv.kontrol : paket is not found")
  903. assert(paket:match("mps.lz"),"islem.arsiv.kontrol : paket suffix is not mps.lz")
  904. assert(get_size(paket) ~=0,"islem.arsiv.kontrol : paket size equals zero")
  905. local isd = cmd.basename(paket):run()
  906. local isim,surum,devir,mimari=isd:match(paket_arsiv_pattern)
  907. if not (isim and surum and devir and mimari) then
  908. print(messages.valid_format..paf:format(isim,surum,devir,mimari));
  909. (messages.package_name_format_not_valid..isd):yaz(0)
  910. end
  911. -- bir kontrol de tar ile içeriden paket bilgi dosyası çekilebilir
  912. -- bu kontrol extract den sonra yapılabilir, aynı işlemi tekrarlamamak için
  913. --("arşiv_kontrol:\tOK"):yaz();
  914. islem.debug.yaz(messages.package_archive_check_ok)
  915. return isim,surum,devir
  916. end
  917. function islem.arsiv.tempdir(paket)
  918. -- paket arşivinin açılacağı temp dizin ayarlanması
  919. assert(paket,"islem.arsiv.tempdir : paket is nil")
  920. local tempdir=kokdizin.."tmp/"..cmd.basename(paket):run()..".tmpdir"
  921. assert(tempdir ~= "/tmp","islem.arsiv.tempdir : tempdir must not be /tmp")
  922. assert(tempdir ~= "/","islem.arsiv.tempdir : tempdir must not be /")
  923. -- paketin açılacağı tempdir oluşturma
  924. rmdir(tempdir)
  925. mkdir(tempdir)
  926. return tempdir.."/"
  927. end
  928. -- Milis paketi dışarı çıkarma/extract
  929. function islem.arsiv.cikar(paket)
  930. -- ön kontrollerin yapıldığı varsayılıyor/handler func ile ?
  931. -- paketin açılması
  932. local tempdir=islem.arsiv.tempdir(paket)
  933. local tar_file=paket:split("%.lz")[1]
  934. -- lzip çıkarma
  935. cmd.lzip(paket):run()
  936. if not stat(tempdir) then
  937. mkdir(tempdir)
  938. end
  939. -- tar çıkarma
  940. cmd.tarx(tar_file,tempdir):run()
  941. cmd.remove(tar_file):run()
  942. -- arşiv çıkarılması test edilecek!!!
  943. -- gnu sparse kontrolü (https://www.gnu.org/software/tar/utils/xsparse.html)
  944. local log=messages.package_archive_extract_ok;
  945. islem.debug.yaz(log);
  946. islem.kur.logger:write(log.."\n")
  947. return tempdir
  948. end
  949. ------------------------------
  950. -- Shared Libs(Paylaşılan kütüphaneler) işlemleri
  951. islem.shlib={
  952. retkey="shlib:",
  953. dosya="libgerekler",
  954. }
  955. -- -libbul
  956. islem.api.libbul={
  957. usage="",
  958. comment="Bir .so dosyasını içeren paket veya talimatı bulur."
  959. }
  960. islem.api.libbul.job=function (params)
  961. local shlib=nil
  962. local param=params[2]
  963. if param == "-t" then
  964. shlib=params[3]
  965. else
  966. shlib=param
  967. end
  968. if shlib then
  969. print(islem.shlib.bul(shlib,param,"hepsi"))
  970. else
  971. messages.args_at_least_one:yaz(0)
  972. end
  973. end
  974. function islem.shlib.kontrol(tempdir)
  975. -- shlib kontrolü / altına kurulumlarda yapılabilir
  976. -- farklı bir kök altına kurulumlar için
  977. -- shlib dosya arama yoluyla olabilir.
  978. local log=""
  979. local ldconfig_bin="/usr/bin/ldconfig"
  980. if kokdizin == "/" and stat(ldconfig_bin) then
  981. assert(tempdir,"islem.shlib.kontrol : tempdir is nil")
  982. local shlibdos=tempdir..islem.paket.metadir..islem.shlib.dosya
  983. local pklibdos=tempdir..islem.paket.metadir..islem.paket.pktlib_dosya
  984. local iclib_kontrol=false
  985. if stat(pklibdos) then iclib_kontrol=true end
  986. if stat(shlibdos) and get_size(shlibdos) > 0 then
  987. local shlibs=get_content(shlibdos)
  988. for sh in shlibs:gmatch("[^\r\n]+") do
  989. if iclib_kontrol and has_line(pklibdos,sh) then
  990. log="shlib.kontrol\tOK";
  991. elseif not islem.shlib.exist(sh) then
  992. (messages.shlib_not_exits..sh):yaz(3)
  993. end
  994. end
  995. end
  996. log="shlib.kontrol\tOK";
  997. islem.debug.yaz(log);
  998. islem.kur.logger:write(log.."\n")
  999. else
  1000. log="shlib.kontrol\tPASS";
  1001. islem.debug.yaz(log);
  1002. islem.kur.logger:write(log.."\n")
  1003. end
  1004. end
  1005. function islem.shlib.exist(shlib)
  1006. assert(shlib,"islem.shlib.exist : shlib is nil")
  1007. local komut=cmd.pipe("ldconfig -p",cmd.grep("",shlib,"")).." > /dev/null;echo $?"
  1008. --local komut='ldconfig -p | grep '..shlib..' | awk \'{split($0,a,"=> "); print a[2]}\' | xargs -r ls > /dev/null 2>&1;echo $?'
  1009. ret=komut:run()
  1010. assert(ret~="","islem.shlib.exist : ret is empty")
  1011. --print (ret,komut)
  1012. if ret == "0" then return true end
  1013. return false
  1014. end
  1015. function islem.shlib.bul(shlib,param,show_opt)
  1016. assert(shlib,"islem.shlib.bul : shlib is nil")
  1017. --local opt=" | head -n1"
  1018. local opt=cmd.head()
  1019. if show_opt=="hepsi" then
  1020. opt=""
  1021. end
  1022. if param=="-t" then
  1023. --local komut=("busybox grep -r -i -l --include=\\%s '%s$' %s | xargs -I {} dirname {} %s "):format(islem.paket.pktlib_dosya,shlib,talimatname,opt)
  1024. --local komut=("rg -l '%s$' %s -g %s"):format(shlib,talimatname,islem.paket.pktlib_dosya)
  1025. local komut=cmd.grep("--sort path -l",shlib.."$",talimatname).." -g "..islem.paket.pktlib_dosya
  1026. --ret=shell(komut,"log!")
  1027. --print(cmd.pipe(komut,xdirname,opt))
  1028. ret=cmd.pipe(komut,xdirname,opt):run()
  1029. if ret ~= "" then
  1030. return ret
  1031. end
  1032. else
  1033. -- todo!!! kurulu paketler için yapılacak
  1034. return nil
  1035. end
  1036. end
  1037. ------------------------------
  1038. -- İçbilgi(mtree) işlemleri
  1039. -- içbilgi içindeki dosyaları yazdırmak
  1040. islem.api.ib={
  1041. usage="",
  1042. comment="",
  1043. }
  1044. islem.api.ib.job=function (params)
  1045. local paket=params[2]
  1046. local list,_=islem.icbilgi.dosyalar(kokdizin..islem.paket.vt..paket.."/")
  1047. if next(list) then
  1048. for _,dos in ipairs(list) do
  1049. print(dos)
  1050. end
  1051. end
  1052. end
  1053. islem.icbilgi={
  1054. retkey="icbilgi:",
  1055. dosya=".icbilgi",
  1056. }
  1057. ------------------Paket ve Veritabanı İşlemleri-----------------------
  1058. islem.paket={
  1059. retkey="paket:",
  1060. vt="var/lib/mps/db/",
  1061. logdir="var/log/mps/",
  1062. --cachedir="tmp",
  1063. cachedir="var/cache/mps/depo",
  1064. pktlib_dosya="pktlibler",
  1065. ustbildos=".ustbilgi",
  1066. metadir=".meta/",
  1067. }
  1068. ------------------Bilgi İşlemleri-----------------------
  1069. islem.bilgi={retkey="bilgi:",}
  1070. function islem.bilgi.job(info)
  1071. -- todo!!! kurulu paket ve talimatnamedeki talimat özbilgileri ayrılacak
  1072. -- parametrelerle ayrılacak...
  1073. -- bu işlev yeniden değerlendirilecek
  1074. -- önce kurulu kontrol yapılıp kurulu ise yerel vt den bilgi alınacak.
  1075. local isim,surum,devir,tanim,paketci,url,grup,mimari,aboyut,kboyut,durum=""
  1076. -- todo!!! diğer durumlarda incelenebilir talimat, paketvt den bilgi alımı?
  1077. if info.durum == "kurulu" then
  1078. local kpb=islem.paket.kurulum_bilgileri(info.paket)
  1079. isim,surum,devir,tanim=kpb.isim,kpb.surum,kpb.devir,kpb.tanim
  1080. url,paketci,grup,mimari=kpb.url,kpb.paketci,kpb.grup,kpb.mimari
  1081. kboyut=byte_convert(kpb.boyut)
  1082. aboyut=nil
  1083. if info.talimatdir == false then info.durum= info.durum.." (talimatı yok)" end
  1084. durum=info.durum
  1085. else
  1086. --talimat ayrıştırıcı kullanılarak talimat bilgileri alınır.
  1087. local talimat_dir=cmd.readlink(info.talimatdir):run()
  1088. local isd=cmd.basename(talimat_dir):run()
  1089. local input=t.load(talimat_dir.."/talimat",{"derle","pakur","kaynak"})
  1090. input.paket.isim=isd:split("#")[1]
  1091. input.paket.surum=isd:split("#")[2]:split("-")[1]
  1092. input.paket.devir=isd:split("#")[2]:split("-")[2]
  1093. -- genel değişken atamaları
  1094. isim=input.paket.isim
  1095. tanim=input.paket.tanim
  1096. grup=input.paket.grup
  1097. url=input.paket.url
  1098. paketci=input.paket.paketci
  1099. -- kurulu değil ise paket.vt'den bilgileri al
  1100. local pbs = islem.paket.pkvt_bilgi(isim)
  1101. -- todo!!! nil değer gelmeme kontrol edilecek
  1102. --paket.vt dosyasindaki gerekli girdileri al
  1103. local pb = pbs[1]
  1104. if pb == nil then
  1105. surum=input.paket.surum
  1106. devir=input.paket.devir
  1107. else
  1108. aboyut=byte_convert(pb.aboyut)
  1109. kboyut=byte_convert(pb.kboyut)
  1110. surum=pb.surum
  1111. devir=pb.devir
  1112. mimari=pb.mimari
  1113. end
  1114. durum=messages.not_installed
  1115. end
  1116. print(("%-13s : %s"):format(messages.package_info_name,isim))
  1117. print(("%-13s : %s"):format(messages.package_info_desc,tanim))
  1118. print(("%-13s : %s"):format(messages.package_info_group,grup))
  1119. print(("%-13s : %s"):format(messages.package_info_url,url))
  1120. print(("%-13s : %s"):format(messages.package_info_packager,paketci))
  1121. print(("%-13s : %s"):format(messages.package_info_version,surum))
  1122. print(("%-13s : %s"):format(messages.package_info_release,devir))
  1123. print(("%-13s : %s"):format(messages.package_info_arch,mimari))
  1124. print(("%-13s : %s"):format(messages.package_info_pack_size,aboyut))
  1125. print(("%-13s : %s"):format(messages.package_info_inst_size,kboyut))
  1126. print(("%-13s : %s"):format(messages.package_info_status,durum))
  1127. print("-----------------------------------------")
  1128. end
  1129. function islem.bilgi.handler(input)
  1130. local blist={}
  1131. local durum=""
  1132. -- todo!!! farklı bilgi parametreleri olacak
  1133. local function pk_analiz(_paket)
  1134. local path = islem.talimat_bul.job(_paket)
  1135. if islem.paket.kurulu_kontrol(_paket) then
  1136. blist[_paket]={durum="kurulu",talimatdir=path}
  1137. elseif path then
  1138. blist[_paket]={durum="talimat",talimatdir=path}
  1139. else
  1140. messages.package_not_found:format(_paket):yaz(0)
  1141. end
  1142. end
  1143. local function status_print(tdir)
  1144. local _pk,_=tdir:match("([%a%d-_+]+)#+")
  1145. if islem.paket.kurulu_kontrol(_pk) then
  1146. print(("%-25s : %s"):format(cmd.basename(tdir):run(),"+"))
  1147. else
  1148. print(("%-25s : %s"):format(cmd.basename(tdir):run(),"-"))
  1149. end
  1150. end
  1151. -- konsoldan girilen paket girdi analiz
  1152. if input.paket then
  1153. for _,pk in ipairs(input.paket) do pk_analiz(pk) end
  1154. end
  1155. -- bilgi test işlevi
  1156. if input.test then
  1157. for pk,info in pairs(blist) do print(pk,info.durum,info.talimatdir) end
  1158. else
  1159. -- test olmadığı durumdaki işleyiş
  1160. for paket,info in pairs(blist) do
  1161. if input.gerek == "d" or input.gerek == "c" then
  1162. islem.gerek.job(info.talimatdir,input.gerek)
  1163. print("-------")
  1164. for _,tdir in ipairs(islem.gerek.liste) do
  1165. status_print(tdir)
  1166. end
  1167. elseif input.gerek == "td" or input.gerek == "tc" then
  1168. islem.tgerek.job(paket,input.gerek:sub(2))
  1169. -- bu api erişimleri tablodan sağlanacak
  1170. elseif input.kk then
  1171. islem.api.kk.job(paket)
  1172. elseif input.kdl then
  1173. print(islem.paket.kurulu_icerik(paket))
  1174. elseif input.pl then
  1175. print(islem.paket.shlib(paket,"pl"))
  1176. elseif input.lg then
  1177. print(islem.paket.shlib(paket,"lg"))
  1178. elseif input.pkd then
  1179. print(islem.paket.kurulum_dogrula(paket))
  1180. else
  1181. info.paket=paket
  1182. islem.bilgi.job(info)
  1183. end
  1184. end
  1185. end
  1186. end
  1187. -- -kk kurulu kontrol
  1188. islem.api.kk={
  1189. usage="",
  1190. comment="bir paketin kurulu olma durumunu verir.",
  1191. }
  1192. islem.api.kk.job=function (pk)
  1193. --- todo!!!! değerlere çıktı verilecek.
  1194. -- nil : tanımsız
  1195. -- true : kurulu
  1196. -- false : kurulu değil
  1197. if islem.paket.kurulu_kontrol(pk) then
  1198. messages.installed:yaz(1)
  1199. else
  1200. messages.not_installed:yaz(3)
  1201. end
  1202. end
  1203. -- -pkd paket kurulum doğrula
  1204. islem.api.pkd={
  1205. usage="",
  1206. comment="",
  1207. }
  1208. -----
  1209. function islem.paket.shlib(paket,tip)
  1210. -- kurulu olan bir paketin paket ve gerekli shliblerini gösterir.
  1211. -- todo 2021-12 td ve kd farkı incelenecek
  1212. assert(paket,"paket param is nil")
  1213. local icerik=""
  1214. local kd=""
  1215. local td=""
  1216. local fark=""
  1217. local _talimatd=islem.talimat_bul.job(paket)
  1218. if _talimatd then
  1219. if tip== "lg" then
  1220. td=_talimatd.."/"..islem.shlib.dosya
  1221. elseif tip== "pl" then
  1222. td=_talimatd.."/"..islem.paket.pktlib_dosya
  1223. else
  1224. ("geçersiz shlib tipi:"..tip):yaz(0)
  1225. end
  1226. if stat(td) then
  1227. icerik=get_content(td)
  1228. end
  1229. else
  1230. (messages.talimat_not_found..paket):yaz(0)
  1231. end
  1232. -- paket kurulu ise onun da sh bilgisi incelenecek
  1233. if islem.paket.kurulu_kontrol(paket) then
  1234. if tip== "lg" then
  1235. kd=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.shlib.dosya
  1236. elseif tip== "pl" then
  1237. kd=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.paket.pktlib_dosya
  1238. else
  1239. ("geçersiz shlib tipi:"..tip):yaz(0)
  1240. end
  1241. -- kurulu lib
  1242. print(get_content(kd))
  1243. else
  1244. -- talimat lib
  1245. print(icerik)
  1246. end
  1247. end
  1248. function islem.paket.pkvt_bilgi(paket)
  1249. -- bir paket hakkında pkvt leri tarayarak bilgi toplar.
  1250. local paketler={}
  1251. local i=0
  1252. -- isim,surum,devir,mimari,aboyut,kboyut,shasum içeriği olacak.
  1253. local fields={"isim","surum","devir","mimari","aboyut","kboyut","shasum","depo"}
  1254. local ret=""
  1255. --local komut='busybox find %s -name "paket.vt#%s" -exec grep -i "^%s " {} \\; | sort -n'
  1256. -- 2021-12 sort edilecek
  1257. --local komut='rg -IN "^%s " %s -g paket.vt#%s'
  1258. local komut=cmd.grep("-IN","^"..paket.." ",kokdizin..islem.paket.cachedir)
  1259. -- islem.paket.cachedir altında paketleri arayacak.
  1260. -- {} /dev/null \; olursa eşleşen dosya ismi de gelir.
  1261. -- en azından paket.vt#1 dosyası bulunmalıdır ki tarama yapılabilsin
  1262. --if path_exists(islem.paket.cachedir.."/paket.vt#1") then
  1263. for sira=1,#ayar.sunucu do
  1264. if stat(kokdizin..islem.paket.cachedir.."/paket.vt#"..sira) then
  1265. --ret=(komut:format(paket, kokdizin..islem.paket.cachedir,sira)):run()
  1266. ret=(komut..(" -g paket.vt#%s"):format(sira)):run()
  1267. for satir in ret:gmatch("[^\r\n]+") do
  1268. local _paket={}
  1269. for bilgi in satir:gmatch("%S+") do
  1270. i = i + 1
  1271. _paket[fields[i]]=bilgi
  1272. end
  1273. -- depo bilgisi conf.lua dan alınıp eklenecek.
  1274. _paket.depo=ayar.sunucu[sira]
  1275. table.insert(paketler,_paket)
  1276. i=0
  1277. end
  1278. else
  1279. (sira..". "..messages.paketvt_not_found):yaz(0)
  1280. end
  1281. end
  1282. if #ayar.sunucu == 0 then
  1283. messages.package_server_not_defined:yaz(3)
  1284. end
  1285. return paketler
  1286. end
  1287. function islem.paket.pkvt_bilgi_2(talimatdir)
  1288. local pk,_=talimatdir:match("([%a%d-_+]+)#+")
  1289. local i = 0
  1290. -- bir paket hakkında pkvt leri tarayarak bilgi toplar.
  1291. local paketler={}
  1292. local i=0
  1293. -- isim,surum,devir,mimari,aboyut,kboyut,shasum içeriği olacak.
  1294. local fields={"isim","surum","devir","mimari","aboyut","kboyut","shasum","depo","cid"}
  1295. local ret=""
  1296. local komut=cmd.grep("-IN","^"..pk.." ",talimatdir)
  1297. if stat(talimatdir.."/paket") then
  1298. ret=(komut.." -g paket"):run()
  1299. for satir in ret:gmatch("[^\r\n]+") do
  1300. local _paket={}
  1301. for bilgi in satir:gmatch("%S+") do
  1302. i = i + 1
  1303. _paket[fields[i]]=bilgi
  1304. end
  1305. table.insert(paketler,_paket)
  1306. i=0
  1307. end
  1308. end
  1309. return paketler
  1310. end
  1311. function islem.paket.kurulu_kontrol(paket)
  1312. -- bir paketin kurulu olup olmadığını vt e bakarak kontrol eder
  1313. -- /var/lib/mps/DB/paket_ismi dizin kontrol eder
  1314. assert(paket,"islem.paket.kurulu_kontrol : paket is nil")
  1315. if stat(kokdizin..islem.paket.vt..paket.."/"..islem.kur.kurulandos) then
  1316. return true
  1317. end
  1318. return nil
  1319. end
  1320. function islem.paket.kurulu_icerik(paket)
  1321. -- kurulu olan bir paketin kurulum içeriğini gösterir
  1322. -- önce kontrol edilir
  1323. assert(paket,"islem.paket.kurulu_kontrol : paket is nil")
  1324. if islem.paket.kurulu_kontrol(paket) then
  1325. local _kurulan=kokdizin..islem.paket.vt..paket.."/"..islem.kur.kurulandos
  1326. assert(stat(_kurulan),"islem.paket.kurulu_icerik : kurulan file not found")
  1327. local icerik=get_content(_kurulan)
  1328. print(icerik)
  1329. -- clear screen
  1330. --io.write("\27[2J")
  1331. else
  1332. messages.package_not_installed:format(paket):yaz(0)
  1333. end
  1334. end
  1335. function islem.paket.kurulum_dogrula(paket)
  1336. -- kurulu olan bir paketin dosyaları incelenerek kurulum doğrulaması yapılır
  1337. -- mevcutluk ve hash kontrolü + izinler ! todo!!!
  1338. assert(paket,"islem.paket.kurulum_dogrula : paket is nil")
  1339. if islem.paket.kurulu_kontrol(paket) then
  1340. -- paket dizin kaydı
  1341. local _file=kokdizin..islem.paket.vt..paket.."/kurulan"
  1342. if stat(_file) then
  1343. for line in (get_content(_file)):gmatch("[^\r\n]+") do
  1344. if not stat(kokdizin..line) then
  1345. messages.file_not_found:format(line):yaz(1)
  1346. end
  1347. end
  1348. else
  1349. messages.file_not_found:format(_file):yaz(0)
  1350. end
  1351. else
  1352. messages.package_not_installed:format(paket):yaz(0)
  1353. end
  1354. end
  1355. function islem.paket.kurulum_bilgileri(paket)
  1356. -- kurulu olan bir paketin üstbilgi dosyası incelenerek bilgiler döndürülür.
  1357. assert(paket,"islem.paket.kurulum_bilgileri : paket is nil")
  1358. local _pb={}
  1359. local sahalar={"isim","surum","devir","tanim","url","paketci","grup","boyut","derzaman","thash","mimari"}
  1360. local _file=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.paket.ustbildos
  1361. if stat(_file) then
  1362. for line in (get_content(_file)):gmatch("[^\r\n]+") do
  1363. for _,saha in ipairs(sahalar) do
  1364. val=line:match(saha.."=(.*)")
  1365. if val then _pb[saha]=val end
  1366. end
  1367. end
  1368. else
  1369. messages.file_not_found:format(_file):yaz(0)
  1370. end
  1371. return _pb
  1372. end
  1373. ------------------------------
  1374. ------------------Sorgu İşlemleri-----------------------
  1375. islem.sorgu={retkey="sorgu:",}
  1376. function islem.sorgu.handler(input)
  1377. -- todo!!! farklı sorgu parametreleri olacak
  1378. -- sorgu test işlevi
  1379. if input.test then
  1380. print("sorgu işlevi testleri...")
  1381. end
  1382. -- kurulu paketlerin listesi
  1383. if input.kpl then
  1384. local pvt=kokdizin..islem.paket.vt
  1385. local komut=cmd.pipe(cmd.grep("-IN --hidden -U --multiline-dotall -e 'isim.*surum.*devir' -g .ustbilgi","",pvt),cmd.paste("^","- - -"))
  1386. local cikti=komut:run()
  1387. local isim,surum,devir="","",""
  1388. for line in cikti:gmatch("[^\r\n]+") do
  1389. isim,surum,devir=line:match("isim=([%a%d-_+]+)^surum=([%d%a.]+)^devir=([%d]+)")
  1390. print(("%-20s %-9s %-3s"):format(isim,surum,devir))
  1391. end
  1392. end
  1393. -- depolardaki paketlerin listesi
  1394. if input.dpl then
  1395. local komut=cmd.pipe(cmd.cat(kokdizin..islem.paket.cachedir.."/paket.vt#*"),cmd.awk("","{print $1,$2,$3}"),"column -t")
  1396. print(komut:run())
  1397. end
  1398. -- temel paketlerin listesi
  1399. if input.tpl then
  1400. print(cmd.pipe(cmd.ls("-d",talimatname.."/1/*#*"),xbasename,cmd.cut('#',1)):run())
  1401. end
  1402. -- arama girdisinin hangi pakette geçtiğini bulur
  1403. if input.hp then
  1404. local aranan=input.hp
  1405. local pvt=kokdizin..islem.paket.vt
  1406. local komut=cmd.grep("-iN",aranan,pvt).." -g kurulan"
  1407. print(komut:run())
  1408. end
  1409. -- arama girdisinin altındaki talimatları listeler
  1410. if input.gtl then
  1411. local aranan=input.gtl
  1412. local komut=cmd.pipe(cmd.grep("--sort path --files", "", talimatname).." -g talimat", cmd.grep("", "/"..aranan.."/", ""), xdirname, xbasename, cmd.cut('#',1))
  1413. print(komut:run())
  1414. end
  1415. end
  1416. ------------------İndirme İşlemleri-----------------------
  1417. -- handler parametre analiz ve linki hazırlayacak
  1418. -- job direk linki hash kontrollü indirecek
  1419. islem.indir={
  1420. retkey="indir",
  1421. usage="mps indir paket_ismi",
  1422. comment=messages.comment_mps_download
  1423. }
  1424. function islem.indir.handler(input)
  1425. -- paket bilgileri yer alacak
  1426. local inlist={}
  1427. -- öntanımlı 1.depodan çekmektedir.
  1428. local sira=1
  1429. -- girdi olarak varsa depo sırası güncellenecek
  1430. if input.sira then sira=tonumber(input.sira) end
  1431. local function pk_analiz(pkt)
  1432. local ret=islem.paket.pkvt_bilgi(pkt)
  1433. if ret then
  1434. -- indir işlemi paket bilgi tablosunu kullanacak.
  1435. if ret[sira] then
  1436. table.insert(inlist,ret[sira])
  1437. else
  1438. messages.package_not_found_inrepo:format(pkt):yaz(0)
  1439. end
  1440. else
  1441. print(pak,"depolarda bulunamadı")
  1442. end
  1443. end
  1444. -- konsoldan girilen paket girdi analiz
  1445. if input.paket then
  1446. for _,pk in ipairs(input.paket) do pk_analiz(pk) end
  1447. end
  1448. -- dosya parametresi içerik girdi analiz
  1449. if input.dosya then
  1450. if stat(input.dosya) then
  1451. for pk in (get_content(input.dosya)):gmatch("[^\r\n]+") do
  1452. pk_analiz(pk)
  1453. end
  1454. else
  1455. messages.file_not_found:format(dosya):yaz(0)
  1456. end
  1457. end
  1458. -- indirme test işlevi
  1459. if input.test then
  1460. for _,pk in ipairs(inlist) do print("s",pk) end
  1461. else
  1462. -- test yoksa indirme işlemi yapacak
  1463. for _,pb in ipairs(inlist) do
  1464. islem.indir.job(pb)
  1465. end
  1466. end
  1467. end
  1468. function islem.indir.job(pb)
  1469. -- girdi olarak paket bilgi tablosu alır.
  1470. -- Link ve paket arşiv formatlarına ayrıştırır.
  1471. assert(pb,"paket bilgi tablosu nil")
  1472. -- indirilecek link ve kayıt yolu+dosya ismiyle
  1473. function _indir(link,kayit)
  1474. local body, code = http_request(link,"progress")
  1475. code=tostring(code)
  1476. if code=="can't connect" then
  1477. messages.server_connection_refused:format(link):yaz(3)
  1478. elseif code=="404" then
  1479. messages.paketvt_not_found:yaz(3)
  1480. elseif code == "200" then
  1481. local f = assert(io.open(kayit, 'wb'))
  1482. f:write(body)
  1483. f:close();
  1484. if stat(kayit) then
  1485. (link):yaz(1);
  1486. else
  1487. messages.redownloading:format(kayit):yaz(2)
  1488. _indir(link,kayit);
  1489. end
  1490. elseif not body then
  1491. (link):yaz(3);
  1492. else
  1493. messages.unknown_error:format(link):yaz(0)
  1494. end
  1495. end
  1496. -- arşiv formatında # , web için %23 olauyor.
  1497. -- Bu nedenle global arşiv formatını kullanmıyoruz.
  1498. local larsiv=("%s%%23%s-%s-%s.mps.lz"):format(pb.isim,pb.surum,pb.devir,pb.mimari)
  1499. local arsiv=paf:format(pb.isim,pb.surum,pb.devir,pb.mimari)
  1500. local indirilecek=true
  1501. -- link oluşturulur
  1502. if pb.depo:find("ipfs") then
  1503. larsiv=pb.cid
  1504. end
  1505. local link=plf:format(pb.depo,larsiv)
  1506. local kayit=kokdizin..islem.paket.cachedir.."/"..arsiv
  1507. -- print(link,"indirilecek")
  1508. -- indirme işlemi; indirme yöneticisine link ve kayıt yeri belirtilir.
  1509. if stat(kayit) then
  1510. -- eğer paket önbellekte var ise hash kontrolü yapılıp
  1511. -- hatalı ise silinip tekrar indirilir.
  1512. if hash_check(kayit,pb.shasum) then
  1513. indirilecek=false;
  1514. messages.package_incache:format(pb.isim):yaz(2)
  1515. -- paketin zaten indirilmiş olduğu-doğrulanması, dönüş kayit yol.
  1516. return kayit
  1517. else
  1518. messages.package_shasum_error:format(pb.isim):yaz(3)
  1519. messages.package_redownloading:format(pb.isim):yaz(2)
  1520. cmd.remove(kayit):run()
  1521. end
  1522. end
  1523. if indirilecek then
  1524. --messages.package_downloading:format(pb.isim):yaz(1)
  1525. (pb.isim.." indiriliyor"):yaz(1)
  1526. _indir(link,kayit)
  1527. -- shasum kontrol; indirilen dosya mevcut ve hash kontrolü yapılır.
  1528. if stat(kayit) then
  1529. if hash_check(kayit,pb.shasum) then
  1530. messages.package_downloaded:format(pb.isim):yaz(1)
  1531. -- paketin indirilmesi-doğrulanması, dönüş kayit yol.
  1532. return kayit
  1533. else
  1534. messages.package_shasum_error:format(pb.isim):yaz(0)
  1535. end
  1536. else
  1537. messages.package_download_error:format(pb.isim):yaz(0)
  1538. end
  1539. end
  1540. -- diğer durumlar için nil değerin döndürülmesi
  1541. return nil
  1542. end
  1543. ------------------------------------------------------------
  1544. -- Koşuk işlemleri - kurkos,koskur,silkos, kossil
  1545. islem.kosuk={
  1546. retkey="kosuk:",
  1547. predos=".koskur",
  1548. postdos=".kurkos",
  1549. postrm=".silkos",
  1550. prerm=".kossil",
  1551. }
  1552. -- koşuklar için çalıştırma işlevi
  1553. function islem.kosuk.kos(kosuk)
  1554. if stat(kosuk) then
  1555. cmd.chmodx(kosuk):run()
  1556. if os.execute(kosuk) then
  1557. return "OK"
  1558. else
  1559. return "FAIL"
  1560. end
  1561. else
  1562. return "PASS"
  1563. end
  1564. end
  1565. -- kurmadan önce çalıştırılacak kod
  1566. function islem.kosuk.koskur(tempdir)
  1567. local log="kosuk.koskur:"
  1568. if islem.kur.koskur then
  1569. assert(stat(tempdir),"islem.kosuk.koskur : tempdir is nil")
  1570. local kos=tempdir..islem.paket.metadir..islem.kosuk.predos
  1571. log=log.."\t"..islem.kosuk.kos(kos)
  1572. else
  1573. log=log.."\tDISABLE"
  1574. end
  1575. islem.debug.yaz(log);
  1576. islem.kur.logger:write(log.."\n")
  1577. end
  1578. -- kurmadan sonra çalıştırılacak kod
  1579. function islem.kosuk.kurkos(tempdir)
  1580. local log="kosuk.kurkos:"
  1581. if islem.kur.kurkos then
  1582. assert(stat(tempdir),"islem.kosuk.kurkos : tempdir is nil")
  1583. local kos=tempdir..islem.paket.metadir..islem.kosuk.postdos
  1584. log=log.."\t"..islem.kosuk.kos(kos)
  1585. else
  1586. log=log.."\tDISABLE"
  1587. end
  1588. islem.debug.yaz(log);
  1589. islem.kur.logger:write(log.."\n")
  1590. end
  1591. -- kurulumda dosya-dizin tetiklemeli otomatik çalıştırılacak kod
  1592. -- buna daha farklı yol bulunmalı - talimatta açıkça belirtilebilir.
  1593. -- 2021-12 todo!!!
  1594. function islem.kosuk.otokos_kur(tempdir)
  1595. local log="kosuk.otokos:"
  1596. if islem.kur.otokos then
  1597. assert(stat(tempdir),"islem.kosuk.otokos : tempdir is nil")
  1598. local curdir=getcwd()
  1599. chdir(tempdir)
  1600. kos=mps_path.."/conf/otokos.sh"
  1601. cmd.chmodx(kos):run()
  1602. os.execute(kos.." kur")
  1603. log=log.."\tOK"
  1604. chdir(curdir)
  1605. else
  1606. log=log.."\tDISABLE"
  1607. end
  1608. islem.debug.yaz(log);
  1609. islem.kur.logger:write(log.."\n")
  1610. end
  1611. -- silmeden önce çalıştırılacak kod
  1612. function islem.kosuk.kossil(paket)
  1613. assert(stat(kokdizin..islem.paket.vt..paket),"islem.kosuk.kossil : paketdir is nil")
  1614. local kos=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.kosuk.prerm
  1615. local log="kosuk.kossil:"
  1616. log=log.."\t"..islem.kosuk.kos(kos)
  1617. islem.debug.yaz(log)
  1618. islem.sil.logger:write(log.."\n")
  1619. end
  1620. -- sildikten sonra çalıştırılacak kod
  1621. function islem.kosuk.silkos(paket)
  1622. assert(stat(kokdizin..islem.paket.vt..paket),"islem.kosuk.silkos : paketdir is nil")
  1623. local kos=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.kosuk.postrm
  1624. local log="kosuk.silkos:"
  1625. log=log.."\t"..islem.kosuk.kos(kos)
  1626. islem.debug.yaz(log)
  1627. islem.sil.logger:write(log.."\n")
  1628. end
  1629. ------------------------------
  1630. -- Sil işlemleri
  1631. islem.sil={
  1632. retkey="sil:",
  1633. usage="mps sil paket_ismi",
  1634. dlistfile="%stmp/%s.del.list",
  1635. keeplist=".silme",
  1636. logdir=islem.paket.logdir.."sil/",
  1637. force_remove_dirs={"__pycache__"},
  1638. logger=nil,
  1639. silkos=true,
  1640. kossil=true,
  1641. }
  1642. function islem.sil.handler(input)
  1643. local remlist={}
  1644. --for k,pk in pairs(input) do print(k,pk) end
  1645. --print(input.paket)
  1646. if input.silkos == "0" then islem.sil.silkos=false end
  1647. if input.kossil == "0" then islem.sil.kossil=false end
  1648. local function pk_analiz(_paket)
  1649. local _durum=""
  1650. -- paketin kurulu kontrolünün atlanması için
  1651. if input.kksiz then
  1652. _durum=true
  1653. else
  1654. _durum=islem.paket.kurulu_kontrol(_paket)
  1655. end
  1656. if _durum then
  1657. if input.ona then
  1658. table.insert(remlist,_paket)
  1659. else
  1660. if islem.diyalog.onay(messages.confirm_package_uninstallation:format(_paket)) then
  1661. table.insert(remlist,_paket)
  1662. end
  1663. end
  1664. else
  1665. messages.package_not_installed:format(_paket):yaz(3)
  1666. end
  1667. end
  1668. -- konsoldan girilen paket girdi analiz
  1669. if input.paket then
  1670. for _,pk in ipairs(input.paket) do pk_analiz(pk) end
  1671. end
  1672. -- dosya parametresi içerik girdi analiz
  1673. if input.dosya then
  1674. if stat(input.dosya) then
  1675. for pk in (get_content(input.dosya)):gmatch("[^\r\n]+") do
  1676. pk_analiz(pk)
  1677. end
  1678. else
  1679. messages.file_not_found:format(dosya):yaz(0)
  1680. end
  1681. end
  1682. -- silme test işlevi
  1683. if input.test then
  1684. for _,pk in ipairs(remlist) do print("s",pk) end
  1685. else
  1686. -- test yoksa bu işlem yapılacak
  1687. for _,rpaket in ipairs(remlist) do
  1688. -- todo!!! ters gereklerini kontrol et / silinecek pakete bağlı olan paketler
  1689. if input.db then
  1690. islem.sil.only_vt(rpaket)
  1691. else
  1692. islem.sil.job(rpaket)
  1693. end
  1694. end
  1695. end
  1696. -- silmesi onaylanmış paket sayı bilgisi
  1697. -- sistem güncellemede kullanılacak.
  1698. return #remlist
  1699. end
  1700. function islem.sil.job(paket)
  1701. -- tek bir paketi siler
  1702. assert(paket,"islem.sil.paket : paket is nil")
  1703. -- sil adımları
  1704. -- 0. logger set
  1705. islem.sil.set_logger(paket)
  1706. -- 1. silinecek dosya listesi hazırla
  1707. islem.sil.prepare_list(paket)
  1708. -- 2. silinecekleri filtrele(keeplist)
  1709. islem.sil.filter_list(paket)
  1710. -- 3. kos-sil betiğini kontrol et / çalıştır
  1711. islem.kosuk.kossil(paket)
  1712. -- 4. Dosyaları güvenli! sil ve logla
  1713. islem.sil.uygula(paket)
  1714. -- 5. sil-kos betiğini kontrol et / çalıştır
  1715. islem.kosuk.silkos(paket)
  1716. -- 6. paket veritabanı güncelle sil
  1717. islem.sil.paket_vt(paket)
  1718. -- silmeden sonra ld.so.cache güncellemesi için
  1719. islem.kur.ld_update("sil");
  1720. -- log dosyası kapatılır.
  1721. islem.sil.logger:close();
  1722. -- Silme işlemi sonuç kontrol
  1723. islem.sil.bitis(paket)
  1724. end
  1725. function islem.sil.set_logger(paket)
  1726. -- bu assert mps başına konulabilir
  1727. assert(stat(kokdizin..islem.paket.logdir),"islem.sil.set_logger : islem.paket.logdir is not availables, needs mps --ilk")
  1728. assert(stat(kokdizin..islem.sil.logdir),"islem.sil.set_logger : islem.sil.logdir is not availables, needs mps --ilk")
  1729. local logfile=kokdizin..islem.sil.logdir..paket..".log"
  1730. islem.sil.logger = assert(io.open(logfile, "w"),"islem.sil.set_logger logfile can not open")
  1731. islem.sil.logger:write(paket.."\t"..os.date("%x %H:%M:%S").."\n");
  1732. islem.sil.logger:write("--------------------------------------\n");
  1733. end
  1734. function islem.sil.bitis(paket)
  1735. -- Silme adımlarının başarılı bir şekilde tamamlandığını log dosyası ile kontrol eder.
  1736. local logfile=kokdizin..islem.sil.logdir..paket..".log"
  1737. assert(stat(logfile),"islem.sil.bitis : logfile is not available")
  1738. if not get_content(logfile):match("ERR@R") then
  1739. messages.package_uninstalled:format(paket):yaz(1)
  1740. else
  1741. messages.package_uninstallation_failed:format(paket):yaz(0)
  1742. end
  1743. end
  1744. function islem.sil.prepare_list(paket)
  1745. local sildos=islem.sil.dlistfile:format(kokdizin,paket)
  1746. local _kurulan=kokdizin..islem.paket.vt..paket.."/"..islem.kur.kurulandos
  1747. -- todo!!! silinecek dosyaların başına kök diizn ekleyerek gerçek yollu silineceklerin oluşturulması
  1748. --local komut='sed "s~^\'~%s~g" %s | sed "s/\'//" > %s'
  1749. -- silinecek dosyalardan ' karakterinin kaldirilmasi
  1750. --local komut="busybox sed 's/'\\''//g' %s > %s"
  1751. local komut="%s > %s"
  1752. komut=komut:format(cmd.pipe(cmd.cat(_kurulan),cmd.sed("'s/'\\''//g'")),sildos)
  1753. komut:run()
  1754. assert(get_size(sildos) > 0,"islem.sil.prepare_list : del.list is empty");
  1755. local log="prepare_list:\tOK"
  1756. islem.debug.yaz(log)
  1757. islem.sil.logger:write(log.."\n")
  1758. end
  1759. function islem.sil.filter_list(paket)
  1760. -- eğer paket dizin kaydında .silme isimli dosya varsa
  1761. -- o dosya içindeki alt alta sıralı dosyalar silinecekler listesinden elenecektir.
  1762. -- silinecekler başka dosya isimle içindekilerle karşılaştırılıp filtre edilenler silinir.
  1763. local keeplistfile=kokdizin..islem.paket.vt..paket.."/"..islem.sil.keeplist
  1764. local sildos=islem.sil.dlistfile:format(kokdizin,paket)
  1765. local log=""
  1766. if stat(keeplistfile) then
  1767. --local komut_k='busybox sed "s~^~%s~g" %s > %s'
  1768. local komut_k="%s > %s"
  1769. komut_k:format(cmd.pipe(cmd.cat(keeplistfile),cmd.sed(("s~^~%s~g"):format(kokdizin))),sildos..".keep")
  1770. komut_k:run()
  1771. cmd.move(sildos,sildos.."f"):run()
  1772. local komut_f="%s > %s"
  1773. komut_f:format(cmd.pipe(cmd.cat2(sildos..".f",keeplistfile),cmd.sortp(),cmd.uniq("-u")),sildos)
  1774. komut_f:run()
  1775. log="filter_list:\tOK"
  1776. else
  1777. log="filter_list:\tPASS"
  1778. end
  1779. islem.debug.yaz(log)
  1780. islem.sil.logger:write(log.."\n")
  1781. end
  1782. function islem.sil.uygula(paket)
  1783. local sildos=islem.sil.dlistfile:format(kokdizin,paket)
  1784. local sil_content=get_content(sildos);
  1785. -- Once tum paket *dosya*lari silinecek
  1786. -- Ardindan klasorler bos mu diye kontrol edilecek
  1787. -- Bos olan klasorler kaldirilacak
  1788. local exist=true
  1789. local delete=true
  1790. local log=""
  1791. local ret=nil
  1792. function smart_delete(file_list)
  1793. -- smart delete bir dosya+dizin listesi alir
  1794. -- Ilk olarak tum dosyalari kaldirir ve dizinleri arar
  1795. -- Ardindan bos olan dizinler kaldirilir
  1796. -- Son olarak bos olmayan dizinleri return eder
  1797. -- file_list bir string arrayi olmali
  1798. to_remove={
  1799. files={},
  1800. dirs={}
  1801. }
  1802. for dos in file_list:gmatch("[^\r\n]+") do
  1803. --file_attr = lfs.attributes(dos)
  1804. if stat(dos) then
  1805. --if file_attr.mode == "file" then
  1806. if not isdir(dos) then
  1807. table.insert(to_remove.files, dos)
  1808. else
  1809. _, count = dos:gsub('/', '/')
  1810. table.insert(to_remove.dirs, {dos, count})
  1811. end
  1812. end
  1813. end
  1814. -- tabloyu dizin hiyerasisine gore sirala
  1815. -- alttaki dizin tabloda uste gelir
  1816. function compare(a,b)
  1817. return a[2] > b[2]
  1818. end
  1819. table.sort(to_remove.dirs, compare)
  1820. -- once tum dosyalari kaldir
  1821. for _,v in pairs(to_remove.files) do
  1822. local result, reason = os.remove(v)
  1823. -- todo!!! dosya silinmemesine karsin error-check yap
  1824. if result then
  1825. else
  1826. end
  1827. end
  1828. nonempty_dirs={}
  1829. -- to_remove.dirs'i iterate et ve bos olan dizinleri kaldir
  1830. -- todo !!! buranın yenilenmesi gerek lfs. linklerde sorunlu.?
  1831. -- 2021-12 todo!!!
  1832. for i=1, #to_remove.dirs do
  1833. -- zorla silinecek dizin kontrolü
  1834. -- __pycache__ gibi, temel dizin adı ile kontrol edilmektedir.
  1835. if has_value(islem.sil.force_remove_dirs,cmd.basename(to_remove.dirs[i][1]):run()) then
  1836. cmd.remove(to_remove.dirs[i][1]):run()
  1837. else
  1838. --status, message, code = lfs.rmdir(to_remove.dirs[i][1])
  1839. status, code = rmdir(to_remove.dirs[i][1])
  1840. if status == nil then
  1841. if code == 39 then
  1842. -- Dizin bos degil, silme!, nonempty_dirs'e ekle
  1843. table.insert(nonempty_dirs, to_remove.dirs[i])
  1844. elseif code == 20 then
  1845. -- bir dizinin linki durumundadır
  1846. -- todo!!! link ise zorla silinecektir. farklı durumlar gözlemlenecek.
  1847. cmd.remove(to_remove.dirs[i][1]):run()
  1848. else
  1849. -- Hata yakala ve yazdir
  1850. hata_msg="Klasör silinemedi!".."\n"..message..
  1851. hata_msg:yaz(0)
  1852. end
  1853. end
  1854. end
  1855. end
  1856. return nonempty_dirs
  1857. end
  1858. -- sildos dosyasindaki entryleri smart_delete function'i ile sil
  1859. protected_dirs = smart_delete(sil_content)
  1860. -- Kullaniciya silinmeyen klasorleri goster
  1861. -- todo!!! bu ozelligi tamamla - kullanicidan input alip sil
  1862. if #protected_dirs > 0 then
  1863. log="sil.korunan: \tOK";
  1864. sildos_by_user=islem.sil.dlistfile:format(kokdizin, paket)..".kor"
  1865. messages.confirm_dir_removing_msg:format(sildos_by_user):yaz(3)
  1866. messages.confirm_dir_removing_info:format(sildos_by_user):yaz(3)
  1867. sildos_file = io.open(sildos_by_user, "w")
  1868. local ne_dir=""
  1869. for i=1, #protected_dirs do
  1870. -- kullanıcı girdilerine sahip dizinler
  1871. ne_dir = protected_dirs[i][1]
  1872. for fl in (cmd.grep("--files","",ne_dir):run()):gmatch("[^\r\n]+") do
  1873. print(fl)
  1874. sildos_file:write(fl.."\n")
  1875. end
  1876. end
  1877. sildos_file:close()
  1878. islem.debug.yaz(log);
  1879. islem.sil.logger:write(log.."\n")
  1880. end
  1881. ----------
  1882. if exist and delete then
  1883. log="sil.uygula: \tOK";
  1884. islem.debug.yaz(log);
  1885. islem.sil.logger:write(log.."\n")
  1886. else
  1887. log="sil.uygula:\tERR@R";
  1888. log:yaz(3);
  1889. islem.sil.logger:write(log.."\n")
  1890. end
  1891. end
  1892. function islem.sil.paket_vt(paket)
  1893. local dizin=kokdizin..islem.paket.vt..paket
  1894. assert(stat(dizin),"islem.sil.paket_vt : dizin is not available")
  1895. local log=""
  1896. -- link dizinin sislinmesi
  1897. cmd.remove(dizin):run()
  1898. cmd.remove(dizin.."#*"):run()
  1899. if not stat(dizin) then
  1900. log="sil.paket_vt:\tOK";
  1901. islem.debug.yaz(log);
  1902. islem.sil.logger:write(log.."\n")
  1903. else
  1904. log="sil.paket_vt:\tERR@R";
  1905. log:yaz(3);
  1906. islem.sil.logger:write(log.."\n")
  1907. end
  1908. end
  1909. function islem.sil.only_vt(paket)
  1910. islem.sil.set_logger(paket)
  1911. islem.sil.paket_vt(paket)
  1912. islem.sil.logger:close()
  1913. islem.sil.bitis(paket)
  1914. end
  1915. ------------------------------
  1916. -- Kur işlemleri
  1917. islem.kur={
  1918. retkey="kur:",
  1919. kurulandos="kurulan",
  1920. dizinler={"boot","etc","usr","opt","var","tools"}, -- paket içi desteklenen dizinler
  1921. usage="mps kur paket_ismi | paket_yolu",
  1922. logdir=islem.paket.logdir.."kur/",
  1923. logger=nil,
  1924. kurkos=true,
  1925. koskur=true,
  1926. otokos=true,
  1927. zorla=false,
  1928. comment=messages.comment_mps_install,
  1929. }
  1930. function islem.kur.agdan(paket)
  1931. assert(paket,"islem.kur.agdan : paket is nil")
  1932. -- 1.çalışma gerekleri tespit edilecek tablo=gerek paket c
  1933. -- islem gerek listesi global olduğu için sıfırlanması gerekir.
  1934. islem.gerek.liste={}
  1935. islem.gerek.list={}
  1936. if type(paket) == "table" then
  1937. for _,p in ipairs(paket) do
  1938. islem.gerek.job(p,"c")
  1939. end
  1940. else
  1941. islem.gerek.job(paket,"c")
  1942. end
  1943. --print(paket,#islem.gerek.liste)
  1944. -- 2.paketvt ler den döngüde paket#surum-devir
  1945. local ret, pk=""
  1946. local kurliste={}
  1947. local pkpath=nil
  1948. -- 3. gereklerin sıralı indirme
  1949. function controller(tsd)
  1950. -- gerekli paket kurulu kontrolü yapılıp indirilir
  1951. local pk,_=tsd:match("([%a%d-_+]+)#+")
  1952. -- paket kurulu ise atlanacak
  1953. if islem.paket.kurulu_kontrol(pk) then
  1954. (messages.package_already_installed..":"..pk):yaz(2);
  1955. else
  1956. ret=islem.paket.pkvt_bilgi(pk)[1]
  1957. -- paket paket veritabanında bulunamaz ise, veritabanı güncellenmelidir.
  1958. if ret == nil then
  1959. -- talimat dizininde yer alan paket bilgisine bakılır.
  1960. ret=islem.paket.pkvt_bilgi_2(tsd)[1]
  1961. -- print("t_paket:",ret.depo,ret.cid)
  1962. end
  1963. if ret == nil then messages.package_not_found_inpkvt:format(pk):yaz(0) end
  1964. -- indirme işlemi
  1965. -- kurliste ye inen/indirilmiş paketin yolunun kaydı
  1966. -- ...
  1967. pkpath=islem.indir.job(ret)
  1968. if pkpath == nil then
  1969. messages.package_dependency_dl_error:format(pk):yaz(3)
  1970. else
  1971. table.insert(kurliste,pkpath)
  1972. end
  1973. end
  1974. end
  1975. -- controller için görev tablosu
  1976. local threads = {}
  1977. function co_adder (tsd)
  1978. -- create coroutine
  1979. local co = coroutine.create(
  1980. function ()
  1981. controller(tsd)
  1982. end)
  1983. -- görev tablosuna işin(thread) eklenmesi
  1984. table.insert(threads, co)
  1985. end
  1986. for _,tsd in ipairs(islem.gerek.liste) do
  1987. -- 3.1 indirilecek size bilgi - kurulacak bilgi verilip onay ile
  1988. -- eski kod için controller i aç dispatcher i kapat.
  1989. --controller(tsd)
  1990. co_adder(tsd)
  1991. end
  1992. function dispatcher()
  1993. while true do
  1994. local n = #threads
  1995. if n == 0 then break end -- no more threads to run
  1996. for i=1,n do
  1997. local status, res = coroutine.resume(threads[i])
  1998. if not res then -- thread finished its task?
  1999. table.remove(threads, i)
  2000. break
  2001. end
  2002. end
  2003. end
  2004. end
  2005. -- multithread kontrol ve indirme işlemi
  2006. dispatcher()
  2007. -- 4.gerekler kurulacak (yerelden kur ile cachedir den)
  2008. for _,pkyol in ipairs(kurliste) do
  2009. -- 4.1 indirilecek size bilgi - kurulacak bilgi verilip onay ile
  2010. islem.kur.yerelden(pkyol)
  2011. end
  2012. end
  2013. function islem.kur.yerelden(paket)
  2014. --print (paket) -- belki bu mps.log a atılabilir/nereden talimatlandığına dair
  2015. -- yerelden gelen paketin mevcut kontrolü
  2016. -- gönderen işlevler yapamazsa
  2017. if not paket then
  2018. messages.package_not_found:format(paket):yaz(0)
  2019. end
  2020. assert(paket ~= "","islem.kur.yerelden : paket is empty string")
  2021. -- print (paket,"yerelden")
  2022. -- adımlar: loglanacak, her işlem adımı log dosyasına atacak
  2023. -- önemli not: pcall ile işlemler uygulanacak, eğer break olursa sistem kaynaklı (ctrl+c vs)
  2024. -- işlem adımı ve onu çağıran süreç job dosyası state kayıt edilecek.
  2025. -- 0. paket arşivi kontrol edilir
  2026. local isim,surum,devir=islem.arsiv.kontrol(paket)
  2027. local isd=pgf:format(isim,surum,devir)
  2028. -- 1. logger set
  2029. islem.kur.set_logger(isim)
  2030. -- 2. paket kurulu kontrol yapılır
  2031. islem.kur.kurulu_kontrol(isim)
  2032. -- 3. /tmp altında geçici bir dizine çıkarılır
  2033. local tempdir=islem.arsiv.cikar(paket)
  2034. -- 4. libgerekler kontrol edilir- ldconfig sor
  2035. islem.shlib.kontrol(tempdir) --/ kontrol altına eksik shlibleri içeren paketler kurulabilir.
  2036. -- 5. hedef kurulum dizininde çakışan/var olan dosya kontrolü - kurulacak ve çakışan liste döndürür.
  2037. local klist,clist=islem.kur.dosya_kontrol(tempdir)
  2038. -- 6. koşkur varsa çalıştırılır 2.madde?
  2039. islem.kosuk.koskur(tempdir)
  2040. -- 7. kopyalanan dosyalar VT e yazılır, var/lib/mps/DB altına paketismi
  2041. -- tempdir altında kurulan dosyası, .icbilgi, .ustbilgi, kosuklar, libgerekler, pktlibler
  2042. islem.kur.vt_kayit(tempdir,klist,isd)
  2043. -- 8. geçici dizinden hedef dizin altına kopyalanır-cakışan liste gönderilir onlar kopyalanmaz.
  2044. islem.kur.kopyala(tempdir,clist)
  2045. -- 9. mtree ile karşılaştırma doğrulanır
  2046. -- 10. ldconfig güncellemesi
  2047. islem.kur.ld_update_handler(tempdir)
  2048. -- 11. kurkos çalıştırılır
  2049. islem.kosuk.kurkos(tempdir)
  2050. -- 12. otokos çalıştırılır
  2051. islem.kosuk.otokos_kur(tempdir)
  2052. -- 13. temizlik, başarı mesaj...
  2053. islem.kur.clean_tempdir(tempdir)
  2054. -- 14. log dosyası kapatılır.
  2055. islem.kur.logger:close();
  2056. -- 15. Paket kurulum sonucu
  2057. islem.kur.bitis(isim)
  2058. end
  2059. function islem.kur.clean_tempdir(tempdir)
  2060. -- kurulum içeriğinin geçici çıkarıldığı tempdir silinir.
  2061. cmd.remove(tempdir):run()
  2062. end
  2063. function islem.kur.bitis(paket)
  2064. -- Kurulum adımlarının başarılı bir şekilde tamamlandığını log dosyası ile kontrol eder.
  2065. local logfile=kokdizin..islem.kur.logdir..paket..".log"
  2066. assert(stat(logfile),"islem.kur.bitis : logfile is not available")
  2067. if not get_content(logfile):match("ERR@R") then
  2068. messages.package_installed:format(paket):yaz(1)
  2069. else
  2070. messages.package_installation_failed:format(paket):yaz(0)
  2071. end
  2072. end
  2073. function islem.kur.set_logger(paket)
  2074. -- bu assert mps başına konulabilir
  2075. assert(stat(kokdizin..islem.paket.logdir),"islem.kur.set_logger : islem.paket.logdir is not available, needs mps --ilk")
  2076. assert(stat(kokdizin..islem.kur.logdir),"islem.kur.set_logger : islem.kur.logdir is not availables, needs mps --ilk")
  2077. local logfile=kokdizin..islem.kur.logdir..paket..".log"
  2078. --print("-",logfile)
  2079. islem.kur.logger = assert(io.open(logfile, "w"),"islem.kur.set_logger logfile can not open")
  2080. islem.kur.logger:write(paket.."\t"..os.date("%x %H:%M:%S").."\n");
  2081. islem.kur.logger:write("--------------------------------------\n");
  2082. end
  2083. function islem.kur.ld_update_handler(tempdir)
  2084. local log=""
  2085. if stat(tempdir..islem.paket.metadir..islem.paket.pktlib_dosya)
  2086. or stat(tempdir..islem.paket.metadir..islem.shlib.dosya) then
  2087. -- libgerek?(kurulu ise cache edilmiş olmalı), shlib varsa ldconfig edilecek.
  2088. islem.kur.ld_update()
  2089. log="ld_up_handler:\tOK";
  2090. islem.kur.logger:write(log.."\n")
  2091. else
  2092. messages.ld_update_pass:yaz()
  2093. log="ld_up_handler:\tPASS";
  2094. islem.kur.logger:write(log.."\n")
  2095. end
  2096. end
  2097. -- kura mahsus olmasın todo!!!
  2098. function islem.kur.ld_update(oper)
  2099. -- hedef kök dizinde ldconfig varsa güncelleme olur.
  2100. local log=""
  2101. if stat(kokdizin.."usr/bin/ldconfig")
  2102. or stat(kokdizin.."sbin/ldconfig") then
  2103. --print("ldconfig update edilecek")
  2104. local cachedos="etc/ld.so.cache"
  2105. cmd.remove(kokdizin..cachedos):run()
  2106. local komut2=("ldconfig -r %s"):format(kokdizin)
  2107. --print(komut2)
  2108. komut2:run()
  2109. else
  2110. (messages.ld_update_pass..kokdizin):yaz()
  2111. log="ld_update:\tPASS";
  2112. if oper then
  2113. islem[oper].logger:write(log.."\n")
  2114. else
  2115. islem.kur.logger:write(log.."\n")
  2116. end
  2117. end
  2118. end
  2119. function islem.kur.kopyala(dir,nclist)
  2120. -- geçici çıkarma dizininden sisteme kopyala işlemi
  2121. -- geçerli dizinler kontrol edilerek kopyalama yapılır
  2122. -- tempdir altındaki dizinleri islem.kur.dizinler ile karşılaştır.
  2123. -- kopyalanmayacaklar silinir.
  2124. if next(nclist) then
  2125. for _,f in ipairs(nclist) do
  2126. cmd.remove(dir.."/"..f):run()
  2127. end
  2128. end
  2129. -- kalan dizin yapısı ile hedef altına kopyalama yapılır.
  2130. for _,d in ipairs(islem.kur.dizinler) do
  2131. if stat(dir.."/"..d) then
  2132. cmd.copy(dir.."/"..d, kokdizin.."/"):run()
  2133. end
  2134. end
  2135. log="kur.kopyala:\tOK";
  2136. --log="kur.kopyala:\tFAIL";
  2137. islem.debug.yaz(log)
  2138. islem.kur.logger:write(log.."\n")
  2139. end
  2140. function islem.kur.vt_kayit(dir,list,isd)
  2141. -- sisteme kopyalanan paketin paket veritabanı kaydının yapılması
  2142. -- ve kurulum logunun oluşturulması (adımlar loglanacak)
  2143. -- dir abc#1.2-1.dir
  2144. local pack_name=isd:split("#")[1]
  2145. local link_name=isd
  2146. mkdir(kokdizin..islem.paket.vt.."/"..pack_name)
  2147. cmd.copy(dir.."/.icbilgi", kokdizin..islem.paket.vt.."/"..pack_name.."/"):run()
  2148. cmd.copy(dir.."/.meta", kokdizin..islem.paket.vt.."/"..pack_name.."/"):run()
  2149. local file=io.open(kokdizin..islem.paket.vt.."/"..pack_name.."/kurulan","w")
  2150. for _,f in ipairs(list) do
  2151. file:write("/"..f.."\n")
  2152. end
  2153. file:close()
  2154. -- mps hızlı bulma için vt linklemesi
  2155. link(kokdizin..islem.paket.vt.."/"..pack_name,kokdizin..islem.paket.vt.."/"..link_name)
  2156. log="kur.vt_kayit:\tOK";
  2157. islem.debug.yaz(log)
  2158. islem.kur.logger:write(log.."\n")
  2159. -- vt_kayıt test edilecek!!!
  2160. end
  2161. function islem.icbilgi.dosyalar(dir)
  2162. assert(stat(dir.."/.icbilgi"),dir.."/.icbilgi".." is not exist")
  2163. local cnt=cmd.gzipd(dir.."/.icbilgi"):run()
  2164. assert(cnt,"content is empty")
  2165. install_list={}
  2166. overwrite_list={}
  2167. for _,line in ipairs(cnt:split("\n")) do
  2168. if line:sub(1,2) == "./" then
  2169. ifile=line:split(" ")[1]:sub(3,-1)
  2170. is_dir=line:match("type=dir")
  2171. --dizin ve dosya yok ise kurulan listeye ekle
  2172. -- dosya ve var ise çakışan listeye ekle
  2173. if not stat(kokdizin..ifile) then
  2174. table.insert(install_list,ifile)
  2175. elseif not is_dir and stat(kokdizin..ifile) then
  2176. table.insert(overwrite_list,ifile)
  2177. end
  2178. end
  2179. end
  2180. return install_list, overwrite_list
  2181. end
  2182. function islem.kur.dosya_kontrol(tempdir)
  2183. -- sisteme kopyalanacak paket içeriğinin sistemde çakışan karşılık kontrolü
  2184. -- çakışanlar için strateji belirlenmeli: üzerine yaz, koru vs
  2185. -- clist conflict files
  2186. local clist_sil = true
  2187. local list,clist=islem.icbilgi.dosyalar(tempdir)
  2188. -- handling already exist files
  2189. if islem.kur.zorla == false then
  2190. -- list kurulacaklar
  2191. if #clist > 0 then
  2192. for _,cfile in ipairs(clist) do
  2193. (messages.file_already_exists:format(kokdizin..cfile)):yaz(3)
  2194. end
  2195. if islem.diyalog.onay(messages.confirm_files_removing) == false then
  2196. clist_sil = false
  2197. end
  2198. end
  2199. log="çakışan_dosya:\tOK";
  2200. else
  2201. log="dosya_kontrol:\tOK";
  2202. end
  2203. if clist_sil then
  2204. for _,cfile in ipairs(clist) do
  2205. table.insert(list,cfile)
  2206. if cfile == "usr/bin/bash" or cfile == "usr/bin/sh" then
  2207. cmd.copy(tempdir..cfile, kokdizin..cfile):run()
  2208. else
  2209. cmd.remove(kokdizin..cfile):run()
  2210. end
  2211. end
  2212. clist={}
  2213. end
  2214. islem.debug.yaz(log);
  2215. islem.kur.logger:write(log.."\n")
  2216. return list,clist
  2217. end
  2218. function islem.kur.kurulu_kontrol(paket)
  2219. -- sistemde kurulu paket kontrolü
  2220. -- burada kurulu pakete uygulanacak seçenek sorulur
  2221. -- sil/silme
  2222. assert(paket,"islem.kur.kurulu_kontrol : paket is nil")
  2223. local log=""
  2224. if islem.paket.kurulu_kontrol(paket) then
  2225. log=messages.package_already_installed;
  2226. messages.package_already_installed:yaz(0);
  2227. else
  2228. log="kurulu_kontrol:\tOK";
  2229. end
  2230. islem.debug.yaz(log)
  2231. islem.kur.logger:write(log.."\n")
  2232. end
  2233. function islem.kur.job(kur)
  2234. -- işlemlerin logu hazırlanacak.
  2235. for tip,paketler in pairs(kur) do
  2236. if kur[tip] then
  2237. --tek tek paketleri işliyoruz
  2238. if tip == "yerelden" then
  2239. for _,paket in ipairs(paketler) do
  2240. islem.kur.yerelden(paket)
  2241. end
  2242. elseif tip == "agdan" then
  2243. islem.kur.agdan(paketler)
  2244. else
  2245. ("bilinmeyen kurulum tipi"):yaz(0)
  2246. end
  2247. end
  2248. end
  2249. end
  2250. function islem.kur.handler(input)
  2251. -- işlem isminden sonra en az bir parametre olmalıdır.
  2252. if input.kurkos == "0" then islem.kur.kurkos=false end
  2253. if input.koskur == "0" then islem.kur.koskur=false end
  2254. if input.otokos == "0" then islem.kur.otokos=false end
  2255. if input.zorla == true then islem.kur.zorla=true end
  2256. local jobs={
  2257. agdan={},
  2258. yerelden={}
  2259. }
  2260. -- paketin yerel/ağ kaynak tespiti ve ilgili listeye eklenmesi
  2261. function pk_analiz(pkt)
  2262. local _paket=""
  2263. if pkt:match("mps.lz") then
  2264. -- yerelden kurulacak listeye eklenir
  2265. --print("yerelden kurulacak",pkt)
  2266. table.insert(jobs.yerelden,cmd.readlink(pkt):run())
  2267. _paket,_,_,_=pkt:match(paket_arsiv_pattern)
  2268. else
  2269. local _talimatd=islem.talimat_bul.job(pkt)
  2270. if _talimatd then
  2271. -- ağdan kurulacak listeye eklenir
  2272. table.insert(jobs.agdan,_talimatd)
  2273. else
  2274. (messages.talimat_not_found..pkt):yaz(0)
  2275. end
  2276. _paket=pkt
  2277. end
  2278. -- tekrar parametresi verildiyse paketi silecek.
  2279. if input.tekrar == true then
  2280. islem.sil.handler({paket={_paket}})
  2281. end
  2282. end
  2283. -- konsoldan girilen paket girdi analiz
  2284. if input.paket then
  2285. for _,pk in ipairs(input.paket) do pk_analiz(pk) end
  2286. end
  2287. -- dosya parametresi içerik girdi analiz
  2288. if input.dosya then
  2289. if stat(input.dosya) then
  2290. for pk in (get_content(input.dosya)):gmatch("[^\r\n]+") do
  2291. pk_analiz(pk)
  2292. end
  2293. else
  2294. messages.file_not_found:format(dosya):yaz(0)
  2295. end
  2296. end
  2297. -- handler işlevinin test işlemi
  2298. if input.test then
  2299. for _,v in ipairs(jobs.agdan) do print("a",v) end
  2300. for _,v in ipairs(jobs.yerelden) do print("y",v) end
  2301. else
  2302. -- test yoksa bu işem yapılacak
  2303. islem.kur.job(jobs);
  2304. end
  2305. -- todo!!! işlemlerin logu okunacak
  2306. -- ("işlemlerin logu okunacak"):yaz(2)
  2307. end
  2308. --------------------------------------------
  2309. --------Güncelleme İşlemleri-------------------
  2310. islem.guncelle={
  2311. retkey="guncelle:",
  2312. comment=messages.usage_updating_repos,
  2313. usage="mps guncelle",
  2314. betikdepo={isim="betikdepo",tnm="Betik",path=milispath},
  2315. talimatdepo={isim="talimatdepo",tnm="Git",path=talimatname},
  2316. paketlist={},
  2317. }
  2318. -- işlevler
  2319. function islem.guncelle.handler(input)
  2320. local sira=tonumber(input.sira)
  2321. -- mps güncelleme
  2322. if input.mps then
  2323. islem.guncelle.mps()
  2324. end
  2325. -- talimat depolarının güncelleme
  2326. if input.git then
  2327. islem.guncelle.gitdepo(sira,islem.guncelle.talimatdepo)
  2328. end
  2329. -- betik depolarının güncelleme
  2330. if input.betik then
  2331. islem.guncelle.gitdepo(sira,islem.guncelle.betikdepo)
  2332. end
  2333. -- paketvt depoları güncelleme
  2334. if input.depo then
  2335. islem.guncelle.paketvt(sira)
  2336. end
  2337. -- sistem güncelleme
  2338. if input.sistem then
  2339. islem.guncelle.sistem(input)
  2340. end
  2341. -- paket güncelleme
  2342. if input.paket then
  2343. islem.guncelle.paket(input)
  2344. end
  2345. if not input.mps and not input.git and
  2346. not input.betik and not input.depo and
  2347. not input.sistem and not input.paket then
  2348. islem.guncelle.mps()
  2349. islem.guncelle.gitdepo(sira,islem.guncelle.talimatdepo)
  2350. islem.guncelle.gitdepo(sira,islem.guncelle.betikdepo)
  2351. islem.guncelle.paketvt(sira)
  2352. end
  2353. end
  2354. function islem.guncelle.hesapla()
  2355. local k_pak={}
  2356. -- kpl işlevi
  2357. local pvt=kokdizin..islem.paket.vt
  2358. local komut=cmd.pipe(cmd.grep("-IN --hidden -U --multiline-dotall -e 'isim.*surum.*devir' -g .ustbilgi","",pvt),cmd.paste("^","- - -"))
  2359. local cikti=komut:run()
  2360. local paket,surum,devir="","",""
  2361. local sd,pb,psd="",""
  2362. for line in cikti:gmatch("[^\r\n]+") do
  2363. paket,surum,devir=line:match("isim=([%a%d-_+]+)^surum=([%d%a.]+)^devir=([%d]+)")
  2364. sd=surum.."-"..devir
  2365. pb=islem.paket.pkvt_bilgi(paket)[1]
  2366. if pb == nil then psd=nil
  2367. else psd=pb.surum.."-"..pb.devir end
  2368. if psd ~= sd then
  2369. islem.guncelle.paketlist[paket]={mevcut=sd,guncel=pb}
  2370. end
  2371. end
  2372. end
  2373. function islem.guncelle.sistem(input)
  2374. -- ilk önce talimatname ve paket depo eşitliğine bakılacak
  2375. -- talimat ile paket sürümleri aynı olmak zorundadır yoksa derleyerek üretim gerekir.
  2376. -- bu durum garantilendikten sonra ikili depodan güncelleme tespiti yapılıp sistem güncellenebilir.
  2377. local esgeclist=input.esgec
  2378. islem.guncelle.hesapla()
  2379. local dppk=""
  2380. for _paket,bilgi in pairs(islem.guncelle.paketlist) do
  2381. if bilgi.guncel == nil then dppk="depoda olmayan paket"
  2382. else dppk=bilgi.guncel.surum.."-"..bilgi.guncel.devir end
  2383. if has_value(esgeclist,_paket) == true then
  2384. print(_paket,"güncellemesi es geçildi.")
  2385. else
  2386. -- güncelleme işlemi - durum sorgulanacaksa işlem yaptırılmaz.
  2387. if input.durum == true then
  2388. -- güncelleme bilgisi
  2389. print(string.format("%-15s %-10s -> %s",_paket,bilgi["mevcut"],dppk))
  2390. else
  2391. islem.guncelle.paket({paket={_paket},ona=input.ona})
  2392. end
  2393. end
  2394. end
  2395. -- not islem.guncelle.paketlist key-value şeklinde # ile length alınamaz
  2396. end
  2397. function islem.guncelle.paket(input)
  2398. -- 1 güncellenecek paket listesi için güncelleme hesaplanacak
  2399. -- 2 guncellenecek paket listesinde yer alıyor mu
  2400. -- 3 paket depodan güncel paketi indir, doğrula
  2401. -- 4 eski paketi kaldır. (geri kurtarma için eski paket depo?)
  2402. -- 5 paketdepo inen yeni paketi kur.
  2403. -- -S ile guncellemeler hesaplanmış olabilir değilse hesaplanacak
  2404. local paketgirdi=input.paket
  2405. if next(islem.guncelle.paketlist) == nil then
  2406. islem.guncelle.hesapla()
  2407. end
  2408. local pb,par,pyol=""
  2409. -- silme onay değişkeni
  2410. local s_onay=0
  2411. -- döngü halinde paket listesindeki paketler güncellenecek.
  2412. for _,paket in ipairs(paketgirdi) do
  2413. if islem.guncelle.paketlist[paket] == nil then
  2414. print(paket,"için güncelleme mevcut değil!")
  2415. else
  2416. pb=islem.guncelle.paketlist[paket]
  2417. if pb.guncel == nil then
  2418. print(paket,pb.mevcut,"depoda olmayan paket")
  2419. else
  2420. print(paket,pb.mevcut,pb.guncel.surum.."-"..pb.guncel.devir)
  2421. islem.indir.handler({paket={paket}})
  2422. par=paf:format(paket,pb.guncel.surum,pb.guncel.devir,pb.guncel.mimari)
  2423. pyol=kokdizin..islem.paket.cachedir.."/"..par
  2424. if stat(pyol) then
  2425. s_onay=islem.sil.handler({paket={paket},ona=input.ona})
  2426. if s_onay == 1 and islem.paket.kurulu_kontrol(paket) ~= true then
  2427. --islem.kur.yerelden(pyol)
  2428. -- gerekler tekrar hesaplanacak
  2429. islem.kur.agdan(islem.talimat_bul.job(paket))
  2430. end
  2431. else
  2432. print(pyol,"güncellenecek paket yolu bulunamadı")
  2433. end
  2434. end
  2435. end
  2436. s_onay=0
  2437. end
  2438. --print("paket güncellemesi deneme kullanımındadır!")
  2439. end
  2440. function islem.guncelle.mps()
  2441. -- todo!!! mps commit hash tutulacak oradan commit değer değişimi gösterilecek
  2442. -- değişim yoksa güncelleme yok
  2443. assert(stat(mps_path),"mps_path not exist")
  2444. assert(stat(mps_path.."/.git"),"invalid git directory");
  2445. ("MPS güncelleniyor:"):yaz(2);
  2446. ("------------------------------------"):yaz(2);
  2447. local komut="cd %s && git reset --hard HEAD && git pull --rebase; chmod +x bin/mps*"
  2448. local ret=komut:format(mps_path):run();
  2449. ("------------------------------------"):yaz(2);
  2450. end
  2451. function islem.guncelle.paketvt(sira)
  2452. -- todo!!! eskiden inen paketvt#x ler old a taşınacak
  2453. -- başarılı indirmeler olunca silinecek şekilde ayarlanacak
  2454. -- şu an bağlantı yoksa mevcutu da silimiş oluyor- bağlantı olmadan
  2455. -- paket te inemez olarak kabul edildi.
  2456. -- todo!!! bir önceki sürüm paketler için depo tahsisi ve güncellemelerde geri kurtarma deposu olarak kullanılması?
  2457. local onbellek_depo=kokdizin..islem.paket.cachedir.."/"
  2458. ("Paket veritaban(lar)ı güncelleniyor:"):yaz(2);
  2459. ("------------------------------------"):yaz(2);
  2460. -- paket önbellek depo yoksa oluşturulur.
  2461. if not stat(kokdizin..islem.paket.cachedir) then
  2462. cmd.mkdir(onbellek_depo):run()
  2463. end
  2464. -- Eski kalıntı paket.vt# dosyaları temizlenmesi
  2465. cmd.remove(onbellek_depo.."paket.vt#*"):run()
  2466. sira=tonumber(sira)
  2467. local pkvt="paket.vt"
  2468. -- işlev içinde işlev paket.vt i indirmek için
  2469. -- paket.vt.gz gibi sıkıştırılmış gerçekleme yapılacak. todo!!!
  2470. function _indir(sunucu,sira)
  2471. -- io.write(sunucu.."/"..pkvt.."\t")
  2472. local link=sunucu.."/"..pkvt
  2473. local body, code = http_request(link)
  2474. code=tostring(code)
  2475. if code=="can't connect" then
  2476. messages.server_connection_refused:format(sunucu):yaz(3)
  2477. elseif code=="404" then
  2478. messages.paketvt_not_found:yaz(3)
  2479. elseif code == "200" then
  2480. local kayit=onbellek_depo..pkvt.."#"..sira
  2481. local f = assert(io.open(kayit, 'wb'))
  2482. f:write(body)
  2483. f:close();
  2484. if stat(kayit) then
  2485. (link):yaz(1);
  2486. else
  2487. messages.redownloading:format(kayit):yaz(2)
  2488. _indir(sunucu,sira);
  2489. end
  2490. elseif not body then
  2491. (link):yaz(3);
  2492. else
  2493. messages.unknown_error:format(link):yaz(0)
  2494. end
  2495. end
  2496. -- eğer sadece bir paket sunucu güncellenmek istenirse
  2497. if sira > 0 then
  2498. -- sıra aşımlı paket vt güncellenmek istenirse
  2499. if #ayar.sunucu < sira then
  2500. messages.package_db_out_of_order:yaz(0)
  2501. end
  2502. if ayar.sunucu[sira] then
  2503. _indir(ayar.sunucu[sira],sira)
  2504. end
  2505. -- çoklu sunucu güncelleme - sıra 0 ve 0dan küçük ise
  2506. else
  2507. for _sira,sunucu in ipairs(ayar.sunucu) do
  2508. _indir(sunucu,_sira)
  2509. end
  2510. end
  2511. ("------------------------------------"):yaz(2);
  2512. end
  2513. function islem.guncelle.gitdepo(sira,depo)
  2514. -- tip=betikdepo, gitdepo
  2515. -- depo={isim="betikdepo",tnm="Betik",path=milispath}
  2516. -- depo={isim="gitdepo",tnm="Git",path=talimatname}
  2517. -- bin, ayarlar lı betikdepo güncelleme yapılacak todo!!!
  2518. assert(depo,"depo is nil!!!");
  2519. (depo.tnm.." depoları güncelleniyor:"):yaz(2);
  2520. ("------------------------------------"):yaz(2);
  2521. -- iç işlevler
  2522. function do_clone(repo,path)
  2523. local komut="git clone --depth 1 %s %s"
  2524. local ret=komut:format(repo,path):run()
  2525. end
  2526. function do_pull(path)
  2527. assert(stat(path.."/.git"),"invalid git directory")
  2528. local komut="cd %s && git pull --ff-only"
  2529. local ret=komut:format(path):run()
  2530. end
  2531. function esitle(repoyol,altdizin,hedef)
  2532. -- todo!!! eşitlenecek dizinden sadece talimat içeren
  2533. -- dizinleri alarak eşitleme yap veya sonda silme
  2534. local komut="%s -rf %s/%s/* %s/"
  2535. if stat(repoyol.."/"..altdizin) then
  2536. cmd.mkdir(hedef):run()
  2537. cmd.copy(repoyol.."/"..altdizin.."/*" ,hedef.."/"):run()
  2538. else
  2539. messages.git_repo_subdir_not_found:yaz(0)
  2540. end
  2541. end
  2542. function yedekle(dizin)
  2543. local komut="mv %s %s.ydk"
  2544. assert(stat(dizin),dizin.." dizini yok!")
  2545. komut:format(dizin,dizin):run()
  2546. -- dizin yedeklenerek yeni boş oluşturulur.
  2547. assert(mkdir(dizin),dizin.." oluşturulamadı.")
  2548. end
  2549. -- yedeklenen dizin güncellenemediğinden geri yedeklenir.
  2550. function geri_yedekle(dizin)
  2551. local komut="mv %s.ydk %s"
  2552. assert(stat(dizin..".ydk"),dizin..".ydk dizini yok!")
  2553. komut:format(dizin,dizin):run()
  2554. end
  2555. -- yedeklenen dizinin silinmesi
  2556. function yedek_sil(dizin)
  2557. assert(stat(dizin..".ydk"),dizin..".ydk dizini yok!")
  2558. cmd.remove(dizin..".ydk"):run()
  2559. end
  2560. local _repo=""
  2561. local _repoyol=""
  2562. local duzey=""
  2563. local tmp=("mktemp"):run()
  2564. -- git repo mevcut kontrol komut
  2565. local git_kont="git ls-remote -q %s > %s 2>&1;cat %s | head -n1 | awk '{print $1}'"
  2566. -- !!! burası farklı ayar.betikdepo
  2567. for bdepo,repolar in pairs(ayar[depo.isim]) do
  2568. -- !!! burası farklı
  2569. duzey=depo.path.."/"..bdepo
  2570. -- her talimat-betik düzeyinde yedekleme-eşitleme-eskiyi silme yapılacak
  2571. if stat(duzey) then
  2572. yedekle(duzey)
  2573. end
  2574. for repo,dizin in pairs(repolar) do
  2575. -- git repo mevcut kontrolü
  2576. local ret=git_kont:format(repo,tmp,tmp):run()
  2577. --io.write(bdepo," ",repo)
  2578. print(("%-10s : %s"):format(bdepo,repo))
  2579. if ret:match("fatal") then
  2580. ("\t-"):yaz(1)
  2581. else
  2582. -- Git işlemleri
  2583. -- repo netde mevcut ise, yerelde yoksa clone varsa pull yapılacak.
  2584. _repo=repo:gsub("https://", "")
  2585. _repo=_repo:gsub("http://", "")
  2586. _repo=_repo:gsub("/", ".")
  2587. --print("\t",_repo)
  2588. _repoyol=kokdizin..ayar.repo_dizin.."/".._repo
  2589. if stat(_repoyol) then
  2590. do_pull(_repoyol)
  2591. else
  2592. do_clone(repo, _repoyol)
  2593. end
  2594. -- Eşitleme işlemleri
  2595. esitle(_repoyol,dizin,duzey)
  2596. end
  2597. end
  2598. -- sıra-talimat düzeyi işlemler bittikten sonra .ydk düzey silinir.
  2599. if stat(duzey..".ydk") then
  2600. if rmdir(duzey) == true then
  2601. geri_yedekle(duzey)
  2602. else
  2603. yedek_sil(duzey)
  2604. end
  2605. end
  2606. end
  2607. cmd.remove(tmp):run();
  2608. ("------------------------------------"):yaz(2);
  2609. end
  2610. -- Mps İşlemleri ----------------------------
  2611. -- -ayar öntanımlı ayarlar yükler/kopyalar
  2612. -- todo!!! mps kos altına alınacak
  2613. islem.ayarla={
  2614. retkey="ayarla:",
  2615. comment=messages.usage_configure,
  2616. usage="mps ayarla",
  2617. }
  2618. function islem.ayarla.handler()
  2619. -- mps için conf.lua yükleme komutu
  2620. cmd.copy(mps_path.."/conf/conf.lua.sablon",mps_path.."/conf/conf.lua"):run()
  2621. end
  2622. ------------------------------------------------------------
  2623. -----------------------------------------
  2624. -- Debug işlemleri
  2625. islem.debug={
  2626. retkey="debug",
  2627. }
  2628. function islem.debug.yaz(log)
  2629. if args.debug then
  2630. if log then
  2631. log:yaz()
  2632. else
  2633. messages.empty_log:yaz(0)
  2634. end
  2635. end
  2636. end
  2637. -----------------------------------------
  2638. ----------------------------------------
  2639. -- Yetkili çalıştırma kontrolü
  2640. authorised_check()
  2641. ---PARAMETRE ANALİZ
  2642. -- komutlar
  2643. -- kur, sil, in, gun, der, bil, ara, sor, kos
  2644. local parser = argparse("mps", "Milis Linux Paket Yöneticisi") :require_command(false)
  2645. --seçili olan komutu tespit etmek için
  2646. parser:command_target("command")
  2647. -- genel seçenekler
  2648. parser:flag "-v" "--version" :description "Sürüm bilgisi gösterir"
  2649. :action(function() print("MPS 2.2.1 - Milis Paket Yöneticisi - Milisarge") ;os.exit(0) end)
  2650. parser:option "--renk" :default(1) :description "Çıktının renkli olup olmama durumunu belirler"
  2651. parser:option "--kok" :default "/" :description "Mps işlemleri için hedef kök dizini belirtir"
  2652. parser:option "--ilkds" :args(0) :description "Milis dosya sistemi için hedef kök dizinde ilk yapılandırmaları yapar"
  2653. parser:option "--ilk" :args(0) :description "Mps nin hedef kök dizinde ilk yapılandırmaları yapar"
  2654. parser:flag "--ona" :description "Yapılacak mps işlemi için onay verir"
  2655. parser:flag "--debug" :description "Yapılan işlemlerin ayrıntılı çıktısını verir"
  2656. parser:flag "--test" :description "Yapılan işlemlerin sadece test işlevini çalıştırır"
  2657. -- komut parametreleri
  2658. local install = parser:command "kur" :description "paket kurma işlemi" -- :action(handler)
  2659. install:argument "paket" :args("*") :description "yerel/ağ paket girdileri"
  2660. install:option "-d" "--dosya" :description "dosyadan paketleri kurar"
  2661. install:option "--kurkos" :argname "<0/1>" :default "1" :description "paket kurulum sürecince kurkos betiklerinin çalıştırma durumunu belirler"
  2662. install:option "--koskur" :argname "<0/1>" :default "1" :description "paket kurulum sürecince kurkos betiklerinin çalıştırma durumunu belirler"
  2663. install:option "--otokos" :argname "<0/1>" :default "1" :description "paket kurulum sürecince kurkos betiklerinin çalıştırma durumunu belirler"
  2664. install:option "--zorla" :args(0) :description "zorla kurulum durumunu belirler"
  2665. install:option "--tekrar" :args(0) :description "paketin yeniden kurulur"
  2666. local delete = parser:command "sil" :description "paket silme işlemi"
  2667. delete:argument "paket" :args("*") :description "paket girdileri (abc def ghi)"
  2668. delete:option "-d" "--dosya" :description "dosyadan paketleri siler"
  2669. delete:option "--kksiz" :args(0) :description "kurulu kontrolü yapılmaz"
  2670. delete:option "--db" :args(0) :description "sadece vt kaydı silinir."
  2671. local update = parser:command "gun" :description "güncelleme işlemleri"
  2672. update:option "-M" "--mps" :args(0) :description "mps i günceller"
  2673. update:option "-G" "--git" :args(0) :description "git depoları günceller"
  2674. update:option "-B" "--betik" :args(0) :description "betik depoları günceller"
  2675. update:option "-P" "--depo" :args(0) :description "paket depoları günceller"
  2676. update:option "-S" "--sistem" :args(0) :description "sistemi günceller"
  2677. update:option "--sira" :default "0" :description "depo sırasını belirtilir"
  2678. update:option "--paket" :args("*") :description "ilgili paketi günceller"
  2679. update:option "--esgec" :args("*") :default "{}" :description "esgeçilecek paketleri belirtir"
  2680. update:option "--durum" :args(0) :description "Güncelleme durum bilgisi verir. Güncelleme yapmaz."
  2681. local build = parser:command "der" :description "paket derleme işlemi"
  2682. build:argument "paket" :args("*") :description "paket girdileri (abc def ghi)"
  2683. build:option "-d" "--dosya" :description "dosyadan paketleri derler"
  2684. build:option "--kur" :args(0) :description "derledikten sonra kurar"
  2685. build:option "-t --tek" :args(0) :description "gerek kontrolü yapılmadan tek paket derlenir"
  2686. local fetch = parser:command "in" :description "paket indirme işlemi"
  2687. fetch:argument "paket" :args("*") :description "paket girdileri (abc def ghi)"
  2688. fetch:option "-d" "--dosya" :description "dosyadan paketleri indirir"
  2689. fetch:option "--sira" :default "1" :description "paketin indirileceği depo sırası belirtilir"
  2690. local search = parser:command "ara" :description "paket/talimat/tanım arama işlemi"
  2691. search:argument "arama" :args("+") :description "arama girdisi"
  2692. search:option "-t --talimat" :args(0) :description "talimat araması"
  2693. search:option "-a --tanim" :args(0) :description "tanım araması"
  2694. search:option "--hepsi" :default "1" :description "talimat aramada hepsinin getirilmesi"
  2695. local info = parser:command "bil" :description "paket bilgi işlemleri"
  2696. info:argument "paket" :args("+") :description "paket girdileri"
  2697. info:option "-g --gerek" :description "gerek bilgileri -gc=çalışma -gd=derleme -gct=ters çalışma -gdt= ters derleme gereklerini verir"
  2698. info:option "--kk" :args(0) :description "paketin kurulu olma durumu"
  2699. info:option "--kdl" :args(0) :description "pakete ait kurulu dosya listesi"
  2700. info:option "--pl" :args(0) :description "pakete ait paylaşım kütüphane listesi"
  2701. info:option "--lg" :args(0) :description "paketin ihtiyaç duyduğu paylaşım kütüphane listesi"
  2702. info:option "--pkd" :args(0) :description "paketin kurulum doğrulaması yapılır"
  2703. local query = parser:command "sor" :description "genel sorgu işlemleri"
  2704. query:option "-L --kpl" :args(0) :description "kurulu paket listesini verir"
  2705. query:option "--dpl" :args(0) :description "depolardaki paket listesini verir"
  2706. query:option "--tpl" :args(0) :description "temel paket listesini verir"
  2707. query:option "--hp" :argname "<aranan>" :args(1) :description "arama girdisinin kurulu hangi pakette olduğunu verir"
  2708. query:option "--gtl" :argname "<aranan>" :args(1) :description "arama girdisinin grubu olduğu talimat listesini verir."
  2709. local script = parser:command "kos" :description "paket için kur/sil/servis koşuk işlemleri"
  2710. script:argument "paket" :args("+") :description "paket girdileri"
  2711. script:option "--baskur" :description "başlama betiğini(servis) kurar"
  2712. script:option "--bassil" :description "başlama betiğini(servis) siler"
  2713. script:option "--kurkos" :description "kurulum sonrası betiklerini çalıştırır"
  2714. script:option "--koskur" :description "kurulum öncesi betiklerini çalıştırır"
  2715. script:option "--silkos" :description "silme sonrası betiklerini çalıştırır"
  2716. script:option "--kossil" :description "silme öncesi betiklerini çalıştırır"
  2717. -- parametrleri tabloya al
  2718. args=parser:parse()
  2719. args_handler()
  2720. -----------------------------------------