mps.lua 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660
  1. #!/usr/bin/env lua
  2. -- mps lua kodlaması
  3. -- IMPORT --
  4. local milispath=os.getenv("MILIS_PATH")
  5. if not milispath then milispath="/usr/milis" end
  6. local talimatname=os.getenv("TALIMATNAME")
  7. if not talimatname then talimatname=milispath.."/".."talimatname" end
  8. local mps_path=os.getenv("MPS_PATH")
  9. if not mps_path then mps_path=milispath.."/".."mps" end
  10. package.cpath = package.cpath .. ";"..mps_path.."/lua/?.so"
  11. package.path = package.path .. ";"..mps_path.."/lua/?.lua"
  12. package.cpath = package.cpath .. ";"..mps_path.."/lua/ext/?.so"
  13. package.path = package.path .. ";"..mps_path.."/lua/ext/?.lua"
  14. package.path = package.path .. ";"..mps_path.."/lang/?.lua"
  15. package.path = package.path .. ";"..mps_path.."/conf/?.lua"
  16. -- local socket = require("socket")
  17. local lip= require("LIP")
  18. local lfs = require("lfs")
  19. -- socket src e eklenecek todo!!!
  20. local http = require("socket.http")
  21. -- local tparser= require("tparser")
  22. -- mpsd talimat modülüne aktarılacak todo!!!
  23. local t=require ("talimat")
  24. local util=require ("mps_helper")
  25. local yaz=util.yaz
  26. local _assert=util._assert
  27. local has_value=util.has_value
  28. local find=util.find
  29. local path_exists=util.path_exists
  30. local shell=util.shell
  31. local get_abspath=util.get_abspath
  32. local get_basename=util.get_basename
  33. local get_dirname=util.get_dirname
  34. local get_size=util.get_size
  35. local get_content=util.get_content
  36. local get_dirs=util.get_dirs
  37. local has_line=util.has_line
  38. local tprint=util.tprint
  39. local hash_check=util.hash_check
  40. -- dil tespiti / sonra mps-helper den çağrılabilir.
  41. local _langenv=os.getenv("LANG")
  42. if not _langenv then _langenv="tr_TR" end
  43. local _langvar,_=_langenv:match("(.*)_(.*)")
  44. local messages = require ("lang_".. _langvar)
  45. --------------------------------------------------
  46. -- mps ile ilgili ayarların conf/conf.lua dan yüklenmesi
  47. if not path_exists(mps_path.."/conf/conf.lua") then
  48. shell("cp "..mps_path.."/conf/conf.lua.sablon "..mps_path.."/conf/conf.lua")
  49. messages.default_configs_loaded:yaz(2)
  50. messages.relaunch_mps:yaz(2)
  51. os.exit()
  52. end
  53. local ayar= require ("conf")
  54. -------------------------------------------------------
  55. -- DIZIN OLUŞTURMA - KONTROL --
  56. -- Paketleme dizini, yürürlük dosyasının oluşturulduğu konum
  57. local paketleme_dizin=os.getenv("PAKETLEME_DIZIN")
  58. if not paketleme_dizin then paketleme_dizin=lfs.currentdir() end
  59. -- GLOBAL VARIABLES --
  60. local arsivci="bsdtar"
  61. local params={}
  62. local islem={}
  63. islem.api={}
  64. -- local talimatname="/usr/milis/talimatname"
  65. local kokdizin=""
  66. local sil_onay=false
  67. local paket_arsiv_pattern="([%a%d-_+]+)#([%d%a.]+)-([%d]+)-([%a%d_]+)" -- paket_isim#surum-devir-mimari : abc#1.2.3-1-x86_64
  68. -- paket arşiv format -paket_isim#surum-devir-mimari.mps.lz
  69. local paf="%s#%s-%s-%s.mps.lz"
  70. -- paket gösterim formatı
  71. local pgf="%s#%s-%s"
  72. -- paket depo link formatı - depo_adres/paket_isim#surum-devir-mimari.mps.lz / paf kullan
  73. local plf="%s/%s"
  74. -- hata takip -debug modu
  75. debug=false
  76. -- GLOBAL İŞLEVLER
  77. -- root yetkili kontrolü
  78. function authorised_check()
  79. if not os.getenv("MPS_NOROOT") then
  80. local me=os.getenv("USER")
  81. if me ~= "root" then
  82. messages.need_root:yaz(0)
  83. end
  84. end
  85. end
  86. -- parametre analiz/ color option check
  87. function color_check()
  88. for index, a in ipairs(params) do
  89. if a then
  90. local var = a:match("^-%-color=(.*)$")
  91. if var then
  92. if var =="0" then util.renkli=false end
  93. if var =="1" then util.renkli=true end
  94. params[index]=false
  95. break
  96. end
  97. end
  98. end
  99. end
  100. -- parametre analiz/ debug mode
  101. function debug_check()
  102. for index, a in ipairs(params) do
  103. if a then
  104. local var = a:match("^-%-debug(.*)$")
  105. if var then
  106. debug=true
  107. params[index]=false
  108. break
  109. end
  110. end
  111. end
  112. end
  113. -- parametre analiz/ package management root check
  114. function root_check()
  115. -- öntanımlı olarak / altına paket işlemlerini yapar.
  116. kokdizin="/"
  117. for index, a in ipairs(params) do
  118. if a then
  119. local var = a:match("^-%-kok=(.*)$")
  120. if var then
  121. -- kokdizin sonunda / yoksa eklenir, altdizinlerde lazım
  122. if var:sub(-1) ~= "/" then var=var.."/" end
  123. kokdizin=var
  124. params[index]=false
  125. break
  126. end
  127. end
  128. end
  129. -- kok dizin kontrolü yapıldıktan sonra alt dizin kontrolleri
  130. -- milis dizini yoksa oluşturuyoruz.
  131. if path_exists(milispath) == false then
  132. shell("mkdir -p "..kokdizin..milispath)
  133. end
  134. -- talimat dizini yoksa oluşturuyoruz.
  135. if path_exists(talimatname) == false then
  136. shell("mkdir -p "..kokdizin..talimatname)
  137. end
  138. end
  139. function mps_init()
  140. -- mps için gerekli dizinlerin oluşturulması
  141. -- /var/lib/mps/db
  142. local create_tmp=("mkdir -p %s"):format(kokdizin.."tmp")
  143. local create_db=("mkdir -p %s"):format(kokdizin..islem.paket.vt)
  144. local create_logs=("mkdir -p %s%s"):format(kokdizin,islem.paket.logdir)
  145. local create_log_k=("mkdir -p %s%s"):format(kokdizin,islem.kur.logdir)
  146. local create_log_s=("mkdir -p %s%s"):format(kokdizin,islem.sil.logdir)
  147. local create_cache=("mkdir -p %s%s"):format(kokdizin,islem.paket.cachedir)
  148. shell(create_tmp)
  149. shell(create_db)
  150. shell(create_logs)
  151. shell(create_log_k)
  152. shell(create_log_s);
  153. shell(create_cache);
  154. (messages.init_is_ok..kokdizin):yaz()
  155. end
  156. -- parametre analiz/ mps vt dir structure check
  157. function mps_init_check()
  158. -- öntanımlı olarak / altına paket işlemlerini yapar.
  159. for index, a in ipairs(params) do
  160. if a then
  161. local var = a:match("^-%-ilk")
  162. if var then
  163. mps_init()
  164. params[index]=false
  165. break
  166. end
  167. end
  168. end
  169. end
  170. -- mps dosya sistemi ilkleme
  171. function mps_initfs()
  172. -- Milis için gerekli dizinlerin oluşturulması
  173. local initfs_komut=("bash %s/conf/init_rootfs.sh %s"):format(mps_path,kokdizin)
  174. shell(initfs_komut);
  175. --print(initfs_komut);
  176. (messages.initfs_is_ok..kokdizin):yaz()
  177. end
  178. -- parametre analiz/ mps dosya sistemi ilkleme
  179. function mps_initfs_check()
  180. -- öntanımlı olarak / altına paket işlemlerini yapar.
  181. for index, a in ipairs(params) do
  182. if a then
  183. local var = a:match("^-%-initfs")
  184. if var then
  185. mps_initfs()
  186. params[index]=false
  187. break
  188. end
  189. end
  190. end
  191. end
  192. -- mps işlemlerindeki onay değerini kontrol eder.
  193. function confirm_check()
  194. -- --yes, --ona değerlerini kontrol eder.
  195. for index, a in ipairs(params) do
  196. if a then
  197. local var = a:match("^-%-yes")
  198. local var = a:match("^-%-ona")
  199. if var then
  200. sil_onay=true
  201. params[index]=false
  202. break
  203. end
  204. end
  205. end
  206. end
  207. -- parametrelerden işşlenmiş olanları silerek hedef işleve kalanı gönderir.
  208. function re_param()
  209. _param={}
  210. for _, val in ipairs(params) do
  211. if val then table.insert(_param,val) end
  212. end
  213. params=_param
  214. end
  215. function sleep(n)
  216. -- waits for the passed time, letting the coroutine world spin
  217. local t0 = os.clock()
  218. while os.clock() - t0 <= n do
  219. coroutine.yield()
  220. end
  221. end
  222. -- Diyalog İşlemleri
  223. islem.diyalog={}
  224. function islem.diyalog.onay(mesaj)
  225. local answer="-"
  226. if mesaj == nil then mesaj="?(y/n)" end
  227. repeat
  228. io.write(mesaj)
  229. io.flush()
  230. answer=io.read()
  231. until answer=="y" or answer=="n" or answer=="e" or answer=="h"
  232. if answer=="y" or answer=="e" then return true
  233. else return false end
  234. end
  235. -- MPS İŞLEMLER
  236. -- talimat bul
  237. islem.talimat_bul={
  238. retkey="talimat_bul:",
  239. }
  240. islem.bul={usage="mps bul talimat_isim",}
  241. function islem.talimat_bul.job(paket,tip)
  242. -- alfanumerik arama yapılır.
  243. -- 2.parametere tip=hepsi gönderilirse bütün arama sonuçları çevirilir.
  244. local komut=('find %s -name "%s#*" | sort -n | head -1'):format(talimatname,paket)
  245. if tip=="hepsi" then
  246. komut=('find %s -name "*%s*" -type d | sort -n'):format(talimatname,paket)
  247. end
  248. --print(komut)
  249. ret=shell(komut)
  250. if ret == "" then
  251. return false
  252. else
  253. return ret
  254. end
  255. end
  256. -- talimat bulma işlevi (mps bul talimat_isim)
  257. function islem.bul.handler(input)
  258. -- todo!!! talimat bul a diğer talimatlar varsa da ek parametre ile gösterilecek
  259. -- veya mps ara(tanım-paket ismi) içine yapılacak. !
  260. if #input == 2 then
  261. -- 1 is talimat_bul işlemi
  262. local _islem=input[1]
  263. local talimat=input[2]
  264. -- bütün eşleşen talimatlar bulunacak
  265. local ret=islem.talimat_bul.job(talimat,"hepsi")
  266. if ret then
  267. print(ret)
  268. else
  269. messages.talimat_not_found:yaz(0)
  270. end
  271. else
  272. (messages.usage..islem[_islem]["usage"]):yaz();
  273. end
  274. end
  275. --
  276. -- Kaynak işlemleri
  277. islem.kaynak={
  278. usage="mps kaynak talimat_ismi",
  279. kontrol=false,
  280. }
  281. -- kaynak talimatın içerdiği kaynakları gösterecek
  282. function islem.kaynak.handler(input)
  283. local liste={}
  284. if #input > 1 then
  285. -- 1 is talimat_bul işlemi
  286. local _islem=input[1]
  287. local girdi=input[2]
  288. local param=input[3]
  289. local dosya = girdi:match("^-%-dosya=(.*)$")
  290. if param and param:match("--kontrol") then islem.kaynak.kontrol=true end
  291. if dosya then
  292. if path_exists(dosya) then
  293. islem.kaynak.liste_dosyadan(dosya)
  294. else
  295. messages.file_not_found:format(dosya):yaz(0)
  296. end
  297. else
  298. -- girdi parametresi talimat olarak değerlendirelecek.
  299. local ret=islem.talimat_bul.job(girdi)
  300. if ret then
  301. -- kaynaklar kontrol edilecekse
  302. if islem.kaynak.kontrol then
  303. islem.kaynak.url_kontrol(islem.kaynak.liste(ret))
  304. -- kontrol yoksa sadece listeleme
  305. else
  306. tprint(islem.kaynak.liste(ret))
  307. end
  308. else
  309. messages.talimat_not_found:yaz(0)
  310. end
  311. end
  312. else
  313. (messages.usage..islem[_islem]["usage"]):yaz();
  314. end
  315. end
  316. -- talimata ait kaynakların listelenme işlevi
  317. function islem.kaynak.liste(talimatd)
  318. assert(path_exists(talimatd),"talimat dizin not found!")
  319. local talimatf=talimatd.."/talimat"
  320. assert(path_exists(talimatf),talimatf.." file not found!")
  321. -- talimat dosyasından alınan kaynaklar bash ile yorumlanıp
  322. -- açık değerlerine çevirlecektir.
  323. local kliste={}
  324. local talimat=t.get(talimatd)
  325. local komut='url=%s && isim=%s && surum=%s && devir=%s && echo '
  326. komut=komut:format(talimat.paket.url,talimat.isim,talimat.surum,talimat.devir)
  327. for _,val in ipairs (t.kaynaklar(talimat)) do
  328. table.insert(kliste,shell(komut..val))
  329. end
  330. return kliste
  331. end
  332. -- dosyadaki talimata ait kaynakların listelenme işlevi
  333. function islem.kaynak.liste_dosyadan(dosya)
  334. local ret=nil
  335. for pk in (get_content(dosya)):gmatch("[^\r\n]+") do
  336. ret=islem.talimat_bul.job(pk)
  337. if ret then
  338. -- kaynaklar kontrol edilecekse
  339. if islem.kaynak.kontrol then
  340. islem.kaynak.url_kontrol(islem.kaynak.liste(ret))
  341. -- kontrol yoksa sadece listeleme
  342. else
  343. tprint(islem.kaynak.liste(ret))
  344. end
  345. else
  346. messages.talimat_not_found:yaz(0)
  347. end
  348. end
  349. end
  350. -- talimata ait kaynakların url aktif kontrolü
  351. function islem.kaynak.url_kontrol(kaynaklar)
  352. local komut="wget -q --spider %s && echo $?"
  353. local ret=""
  354. for _,kaynak in ipairs(kaynaklar) do
  355. if kaynak:match("http") or kaynak:match("https") then
  356. ret=shell(komut:format(kaynak))
  357. if ret == "0" then
  358. print(kaynak, "OK")
  359. else
  360. print(kaynak, "NOT")
  361. end
  362. else
  363. print(kaynak, "PASS")
  364. end
  365. end
  366. end
  367. -------
  368. ---------- Gerekler İşlemler ----------
  369. islem.gerek={
  370. retkey="gerek:",
  371. usage="mps gerek paket_ismi tip",
  372. -- aktif gerek listesi
  373. liste={},
  374. -- aktif gereklerin eklenme kontrol listesi
  375. list={},
  376. }
  377. function islem.gerek.job(talimatd,tip)
  378. assert(talimatd,"talimatd is nil!")
  379. local talimat=t.get(talimatd)
  380. --todo!!! sonsuz gerek döngüsü engellenecek.
  381. -- gereklerin toplanan listeye eklenmesi
  382. local function ekle(talimatd)
  383. if islem.gerek.list[talimatd] == nil then
  384. islem.gerek.list[talimatd]=talimatd
  385. --print("e",talimatd)
  386. table.insert(islem.gerek.liste,talimatd)
  387. end
  388. end
  389. -- talimatın libgerekler dosyasının analiz edilmesi
  390. local function oto_rdeps(talimatd)
  391. if path_exists(talimatd.."/"..islem.shlib.dosya) then
  392. local sh_tal=""
  393. local shlibs=get_content(talimatd.."/"..islem.shlib.dosya)
  394. for sh in shlibs:gmatch("[^\r\n]+") do
  395. sh_tal=islem.shlib.bul(sh,"-t","ilk")
  396. if sh_tal and sh_tal ~= talimatd then
  397. --print("3",sh_tal)
  398. islem.gerek.job(sh_tal,"c")
  399. end
  400. end
  401. end
  402. end
  403. -- alt gereklerin dolaşılması
  404. local function gerek_dolas(dep,talimatd)
  405. local _td=islem.talimat_bul.job(dep)
  406. -- bir önceki paketin kurulabilir değeri iptal ediliyor
  407. local kurulabilir=false
  408. if _td then
  409. -- bir paketin depodaki bulunma durumuna göre
  410. -- derleme ve çalışma gereklerinin araştırılması yapılmaktadır.
  411. -- çalışma gerek araşırılmasında da aynı durum kontrol edilmektedir.
  412. -- todo!!! alt işleve alınacak alttaki operasyon
  413. tsd=get_basename(_td)
  414. for _,b in ipairs(islem.paket.pkvt_bilgi(dep)) do
  415. pksd=pgf:format(b.isim,b.surum,b.devir)
  416. if tsd == pksd then
  417. kurulabilir=b
  418. break
  419. end
  420. end
  421. if kurulabilir then
  422. tip="c"
  423. else
  424. tip="d"
  425. end
  426. islem.gerek.job(_td,tip)
  427. else
  428. (messages.talimat_not_found..talimatd..":"..dep):yaz(0)
  429. end
  430. end
  431. -- ikincil dolasma engelleme
  432. if islem.gerek.list[talimatd] == nil then
  433. -- talimatdaki gerek kısmının analiz edilmesi - ana iskelet
  434. if talimat["gerek"] then
  435. local rdeps=talimat["gerek"]["calisma"]
  436. local bdeps=talimat["gerek"]["derleme"]
  437. local kurulabilir=false
  438. if tip == "d" and bdeps then
  439. for dep in bdeps:gmatch('([^%s]+)') do
  440. gerek_dolas(dep,talimatd)
  441. end
  442. elseif rdeps then
  443. for dep in rdeps:gmatch('([^%s]+)') do
  444. gerek_dolas(dep,talimatd)
  445. end
  446. end
  447. oto_rdeps(talimatd)
  448. ekle(talimatd)
  449. else
  450. oto_rdeps(talimatd)
  451. ekle(talimatd)
  452. end
  453. end
  454. end
  455. function islem.gerek.handler(input)
  456. if #input > 2 then
  457. -- 1 is derle işlemi
  458. local _islem=input[1]
  459. local girdi=input[2]
  460. local tip=input[3]
  461. -- tip (d)erleme veya (c)alışma olmalı
  462. if tip ~= "d" and tip ~="c" then
  463. ("invalid dependency type"):yaz(0)
  464. end
  465. local talimatd=islem.talimat_bul.job(girdi)
  466. if talimatd then
  467. islem.gerek.job(talimatd,tip)
  468. print("gerekler")
  469. print("-------------------")
  470. tprint(islem.gerek.liste)
  471. print("-------------------")
  472. else
  473. (messages.args_invalid..girdi):yaz(0)
  474. end
  475. else
  476. (messages.usage..islem[_islem]["usage"]):yaz();
  477. end
  478. end
  479. islem.tgerek={
  480. retkey="tgerek:",
  481. usage="mps tgerek paket_ismi tip",
  482. comment=messages.comment_mps_rev_dep,
  483. }
  484. function islem.tgerek.handler(input)
  485. --todo!!! derleme ve calisma ayrılacak
  486. -- input>2 olacak tip te eklenirse
  487. if #input > 1 then
  488. -- 1 is derle işlemi
  489. local _islem=input[1]
  490. local girdi=input[2]
  491. local tip=input[3]
  492. -- tip (d)erleme veya (c)alışma olmalı
  493. if tip ~= "d" and tip ~="c" then
  494. ("Geçersiz gekelilik tipi!"):yaz(0)
  495. end
  496. local talimatd=islem.talimat_bul.job(girdi)
  497. if talimatd then
  498. islem.tgerek.job(girdi, tip)
  499. else
  500. (messages.args_invalid..girdi):yaz(0)
  501. end
  502. else
  503. (messages.usage..islem[_islem]["usage"]):yaz();
  504. end
  505. end
  506. function islem.tgerek.job(paket, tip)
  507. print("Ters gerekler:");
  508. print("-------------------")
  509. local local_paketler={}
  510. if tip == "d" then
  511. -- derleme
  512. local komut="grep -r ' *derleme *= *' %s | grep ' %s$\\| %s \\|=%s$\\|=%s ' | cut -d':' -f1 | xargs -I {} dirname {} | xargs -I {} basename {} | cut -d'#' -f1"
  513. ret=shell(komut:format(talimatname,paket,paket,paket,paket))
  514. for line in ret:gmatch("[^\r\n]+") do
  515. table.insert(local_paketler, line)
  516. end
  517. else
  518. -- calistirma
  519. -- talimat dosyasindan
  520. local komut="grep -r ' *calisma *= *' %s | grep ' %s$\\| %s \\|=%s$\\|=%s ' | cut -d':' -f1 | xargs -I {} dirname {} | xargs -I {} basename {} | cut -d'#' -f1"
  521. ret=shell(komut:format(talimatname,paket,paket,paket,paket))
  522. for line in ret:gmatch("[^\r\n]+") do
  523. table.insert(local_paketler, line)
  524. end
  525. -- libgerek dosyasindan
  526. local talimatd=islem.talimat_bul.job(paket)
  527. if path_exists(talimatd.."/".."pktlibler") then
  528. local sh_tal=""
  529. local shlibs=get_content(talimatd.."/".."pktlibler")
  530. for sh in shlibs:gmatch("[^\r\n]+") do
  531. local komut=("grep -ril --include=libgerekler '%s$' %s | xargs -I {} dirname {} | xargs -I {} basename {} | cut -d'#' -f1"):format(sh,talimatname)
  532. sh_tal=shell(komut)
  533. for line in sh_tal:gmatch("[^\r\n]+") do
  534. if not has_value(local_paketler, line) then
  535. table.insert(local_paketler, line)
  536. end
  537. end
  538. end
  539. end
  540. end
  541. tprint(local_paketler)
  542. print("-------------------")
  543. end
  544. ------------------------------------------
  545. -- Derle işlemi
  546. islem.derle={
  547. retkey="derle:",
  548. usage="mps derle paket_ismi",
  549. }
  550. --api
  551. -- -d tekli paket derlemesi
  552. islem.api.d={
  553. usage="",
  554. comment="",
  555. }
  556. islem.api.d.job=function (params)
  557. local pk=params[2];return islem.derle.tekli(pk)
  558. end
  559. function islem.derle.handler(input)
  560. if #input > 1 then
  561. -- 1 is derle işlemi
  562. -- todo!!! genel param analiz yer değiştirmeli
  563. local _islem=input[1]
  564. local talimat=input[2]
  565. local hedefkur=input[3]
  566. islem.derle.job(talimat,hedefkur)
  567. else
  568. (messages.usage..islem[_islem]["usage"]):yaz();
  569. end
  570. end
  571. function islem.derle.job(paket,hedefkur)
  572. --talimat konum bul
  573. local ret=islem.talimat_bul.job(paket)
  574. local retq=nil
  575. -- pk = paket isim
  576. -- pksd = ağdaki paket sürüm-devir
  577. -- tsd = talimat sürüm-devir
  578. -- ksd = kurulu sürüm-devir
  579. local pk,pksd,tsd,ksd=""
  580. local derlet=false
  581. local kurulabilir=false
  582. local eski_sil=false
  583. if ret then
  584. -- derleme işlemi
  585. -- todo!!! mpsd.lua lib olarak çağrılacak sonra, şu an shell
  586. -- 1. Derleme gerekleri bul.
  587. islem.gerek.job(ret,"d")
  588. --tprint(islem.gerek.liste)
  589. -- 2. Döngüde gerekler incelenir.
  590. for _,talimatd in ipairs(islem.gerek.liste) do
  591. -- her gerekte derletme ve kurulma durumları sıfırlanacak.
  592. derlet=false
  593. kurulabilir=false
  594. -- 2.1 kurulu kontrol
  595. tsd=get_basename(talimatd)
  596. pk,_=tsd:match("([%a%d-_+]+)#+")
  597. -- kurulu kontrol , link dizin dönüşü ile
  598. ksd=islem.paket.kurulu_kontrol(pk)
  599. -- 2.1.1 paket kurulu ise sürüm-devir uyum kontrolü yapılır.
  600. if ksd then
  601. -- ksd kurulu yol, sadece talimat isim formatı
  602. ksd=get_basename(ksd)
  603. if tsd ~= ksd then
  604. print("kurulu sürümd ile derlenmesi gereken sürümd farklı-derlenecek!")
  605. -- paket kurulu sd uyumsuzluğu var
  606. -- paketi sildir(onaylı?) ve derlet
  607. -- önemli !!!-eski paketi derleme başarılı olursa sildir.
  608. derlet=true
  609. eski_sil=true
  610. else
  611. messages.package_already_installed_and_uptodate:format(pk):yaz(2)
  612. goto continue
  613. end
  614. -- 2.1.2 paket kurulu değilse ağdan indirilip kurulacak
  615. end
  616. -- ağdaki paketin surumdeviri incelenecek
  617. -- tsd ile pksd karşılaştır
  618. -- paket.vt lerdeki paket sürüm-devir bilgileri taranacak.
  619. -- tsd e eşleşen bulunursa eşleşen! indirilecek yoksa derletilecek.
  620. -- pakete ait depolarda bulduğu pkvt bilgisini getirecek.
  621. for _,b in ipairs(islem.paket.pkvt_bilgi(pk)) do
  622. pksd=pgf:format(b.isim,b.surum,b.devir)
  623. if tsd == pksd then
  624. print(pk,b.depo,"bulundu.")
  625. kurulabilir=b
  626. break
  627. end
  628. end
  629. -- kurulabilir nesnesine ağdaki paket bilgisi atılacak.
  630. if kurulabilir then
  631. -- paket önbellekte varsa
  632. -- shasum kontrolü yapılıp yerelden kurulma yapılacak.
  633. -- ağdan indirmeden önce önbellekte kontrol edecek
  634. local _pkt=paf:format(pk,kurulabilir.surum,kurulabilir.devir,kurulabilir.mimari)
  635. local kur_onay=false
  636. local _indir=false
  637. local _pktyol=kokdizin..islem.paket.cachedir.."/".._pkt
  638. if path_exists(_pktyol) then
  639. print("hash kontrol")
  640. if hash_check(_pktyol,kurulabilir.shasum) == false then
  641. --delete file
  642. shell("rm -f ".._pktyol)
  643. end
  644. _indir=true
  645. else
  646. -- önbellekte yoksa veya hash uyumsuzsa indirilecek
  647. _indir=true
  648. end
  649. if _indir then
  650. print(_pkt,"indirilecek")
  651. islem.indir.handler({nil,pk})
  652. end
  653. -- indirilememe veya herhangi bir nedenden paketin önbellekte hazır olmaması durumu
  654. if not path_exists(_pktyol) then
  655. messages.package_not_found:format(_pktyol):yaz(0)
  656. else
  657. -- ağdan inen veya önbellekteki paket kurulabilir
  658. -- ayrıca eski paket kurulu ise kaldırılacak.
  659. if eski_sil then
  660. print("eski sürüm paket tespit edildi, kaldırılacak")
  661. islem.sil.handler({"",pk})
  662. end
  663. print(_pktyol,"kurulacak")
  664. islem.kur.yerelden(_pktyol)
  665. -- paket kurulduysa eğer eski sürümden dolayı onay verilen derletme
  666. -- işlemi iptal edilecektir.
  667. derlet=false
  668. end
  669. else
  670. derlet=true
  671. end
  672. -- 2.2 derleme
  673. if derlet then
  674. -- aktif oluşan paket arşiv
  675. local mimari=shell("uname -m")
  676. local pkarsiv=tsd.."-"..mimari..".mps.lz"
  677. -- hedef paket isimleri
  678. local hpksd=get_basename(ret)
  679. local hdarsiv=hpksd.."-"..mimari..".mps.lz"
  680. -- 2.2.1 talimat derle
  681. print(talimatd,"tl derlenecek")
  682. -- print(ret.." derlenecek")
  683. retq=shell("mpsd.lua "..talimatd)
  684. -- paketleme dizinine geçilir.
  685. lfs.chdir(paketleme_dizin)
  686. assert(path_exists(pk..".yur"),"islem.derle.job : "..pk..".yur not found")
  687. os.execute(("bash ./%s.yur"):format(pk))
  688. -- 2.2.2 üretilen paketi kur
  689. -- hedef üretilmek istenen pakete gelindiğinde
  690. -- bu noktada derleme başarılı olup paket üretildiği
  691. -- kontrol edilerek eski sürüm paket kaldırılır.
  692. if pk == paket then
  693. -- mps derle paket --kur seçeneğine bakılacak.
  694. if hedefkur=="--kur" then
  695. -- hedef paket arşivi
  696. if path_exists(paketleme_dizin.."/"..hdarsiv) then
  697. if eski_sil then islem.sil.handler({"",pk}) end
  698. print(paket.." hedef paket de kurulacak.")
  699. islem.kur.yerelden(paketleme_dizin.."/"..hdarsiv)
  700. else
  701. messages.package_not_found:format(hdarsiv):yaz(0)
  702. end
  703. end
  704. else
  705. -- altgereklerin oluşan paketleri zorunlu kurulacak
  706. if path_exists(paketleme_dizin.."/"..pkarsiv) then
  707. if eski_sil then islem.sil.handler({"",pk}) end
  708. islem.kur.yerelden(paketleme_dizin.."/"..pkarsiv)
  709. else
  710. messages.package_not_found:format(pkarsiv):yaz(0)
  711. end
  712. end
  713. end
  714. ::continue::
  715. -- for bitiş
  716. end
  717. --print(paket.." derleme bitti")
  718. else
  719. (messages.talimat_not_found..paket):yaz(0)
  720. end
  721. end
  722. function islem.derle.tekli(paket)
  723. --talimat konum bul
  724. ret=islem.talimat_bul.job(paket)
  725. if ret then
  726. print(ret.." derlenecek")
  727. retq=shell("mpsd.lua "..ret)
  728. --print (retq)
  729. -- paketleme dizinine geçilir.
  730. lfs.chdir(paketleme_dizin)
  731. -- os.exit()
  732. assert(path_exists(paket..".yur"),"islem.derle.job : talimat.yur not found")
  733. os.execute(("bash ./%s.yur"):format(paket))
  734. else
  735. (messages.talimat_not_found..paket):yaz(0)
  736. end
  737. end
  738. ------------------------------
  739. -- Paket Arşiv işlemleri
  740. islem.arsiv={
  741. retkey="arşiv:",
  742. }
  743. -- Milis paketi ön kontrolleri
  744. function islem.arsiv.kontrol(paket)
  745. -- kullanıcı hedefli de çıktı verilebilinir.
  746. assert(path_exists(paket),"islem.arsiv.kontrol : paket is not found")
  747. assert(paket:match("mps.lz"),"islem.arsiv.kontrol : paket suffix is not mps.lz")
  748. assert(get_size(paket) ~=0,"islem.arsiv.kontrol : paket size equals zero")
  749. local isd = get_basename(paket)
  750. local isim,surum,devir,mimari=isd:match(paket_arsiv_pattern)
  751. if not (isim and surum and devir and mimari) then
  752. print(messages.valid_format..paf:format(isim,surum,devir,mimari));
  753. (messages.package_name_format_not_valid..isd):yaz(0)
  754. end
  755. -- bir kontrol de tar ile içeriden paket bilgi dosyası çekilebilir
  756. -- bu kontrol extract den sonra yapılabilir, aynı işlemi tekrarlamamak için
  757. --("arşiv_kontrol:\tOK"):yaz();
  758. islem.debug.yaz(messages.package_archive_check_ok)
  759. return isim,surum,devir
  760. end
  761. function islem.arsiv.tempdir(paket)
  762. -- paket arşivinin açılacağı temp dizin ayarlanması
  763. assert(paket,"islem.arsiv.cikar : paket is nil")
  764. local tempdir=kokdizin.."tmp/"..(get_basename(paket))..".tmpdir"
  765. assert(tempdir ~= "/tmp","islem.arsiv.cikar : tempdir must not be /tmp")
  766. assert(tempdir ~= "/","islem.arsiv.cikar : tempdir must not be /")
  767. -- paketin açılacağı tempdir oluşturma
  768. local tempdir_komut=("rm -rf %s && mkdir -p %s"):format(tempdir,tempdir)
  769. shell(tempdir_komut)
  770. return tempdir.."/"
  771. end
  772. -- Milis paketi dışarı çıkarma/extract
  773. function islem.arsiv.cikar(paket)
  774. -- ön kontrollerin yapıldığı varsayılıyor/handler func ile ?
  775. -- extract komutu
  776. local tempdir=islem.arsiv.tempdir(paket)
  777. assert(tempdir,"islem.arsiv.cikar : tempdir is nil")
  778. -- paketin açılması
  779. local komut=("%s xf %s -C %s"):format(arsivci,paket,tempdir)
  780. ret=shell(komut);
  781. -- arşiv çıkarılması test edilecek!!!
  782. local log="arşiv_çıkar:\tOK";
  783. islem.debug.yaz(log);
  784. islem.kur.logger:write(log.."\n")
  785. return tempdir
  786. end
  787. ------------------------------
  788. -- Shared Libs(Paylaşılan kütüphaneler) işlemleri
  789. islem.shlib={
  790. retkey="shlib:",
  791. dosya="libgerekler",
  792. }
  793. -- -libbul
  794. islem.api.libbul={
  795. usage="",
  796. comment="Bir .so dosyasını içeren paket veya talimatı bulur."
  797. }
  798. islem.api.libbul.job=function (params)
  799. local shlib=nil
  800. local param=params[2]
  801. if param == "-t" then
  802. shlib=params[3]
  803. else
  804. shlib=param
  805. end
  806. if shlib then
  807. print(islem.shlib.bul(shlib,param,"hepsi"))
  808. else
  809. messages.args_at_least_one:yaz(0)
  810. end
  811. end
  812. function islem.shlib.kontrol(tempdir)
  813. -- shlib kontrolü / altına kurulumlarda yapılabilir
  814. -- farklı bir kök altına kurulumlar için
  815. -- shlib dosya arama yoluyla olabilir.
  816. local log=""
  817. local ldconfig_bin="/usr/bin/ldconfig"
  818. if kokdizin == "/" and path_exists(ldconfig_bin) then
  819. assert(tempdir,"islem.shlib.kontrol : tempdir is nil")
  820. local shlibdos=tempdir..islem.paket.metadir..islem.shlib.dosya
  821. local pklibdos=tempdir..islem.paket.metadir..islem.paket.pktlib_dosya
  822. local iclib_kontrol=false
  823. if path_exists(pklibdos) then iclib_kontrol=true end
  824. if path_exists(shlibdos) and get_size(shlibdos) > 0 then
  825. local shlibs=get_content(shlibdos)
  826. for sh in shlibs:gmatch("[^\r\n]+") do
  827. if iclib_kontrol and has_line(pklibdos,sh) then
  828. log="shlib.kontrol\tOK";
  829. elseif not islem.shlib.exist(sh) then
  830. (messages.shlib_not_exits..sh):yaz(3)
  831. end
  832. end
  833. end
  834. log="shlib.kontrol\tOK";
  835. islem.debug.yaz(log);
  836. islem.kur.logger:write(log.."\n")
  837. else
  838. log="shlib.kontrol\tPASS";
  839. islem.debug.yaz(log);
  840. islem.kur.logger:write(log.."\n")
  841. end
  842. end
  843. function islem.shlib.exist(shlib)
  844. assert(shlib,"islem.shlib.exist : shlib is nil")
  845. local komut="ldconfig -p | grep "..shlib.." > /dev/null;echo $?"
  846. --local komut='ldconfig -p | grep '..shlib..' | awk \'{split($0,a,"=> "); print a[2]}\' | xargs -r ls > /dev/null 2>&1;echo $?'
  847. ret=shell(komut)
  848. assert(ret~="","islem.shlib.exist : ret is empty")
  849. --print (ret,komut)
  850. if ret == "0" then return true end
  851. return false
  852. end
  853. function islem.shlib.bul(shlib,param,show_opt)
  854. assert(shlib,"islem.shlib.bul : shlib is nil")
  855. local opt=" | head -n1"
  856. if show_opt=="hepsi" then
  857. opt=""
  858. end
  859. if param=="-t" then
  860. local komut=("grep -r -i -l --include=\\%s '%s$' %s | xargs -I {} dirname {} %s "):format(islem.paket.pktlib_dosya,shlib,talimatname,opt)
  861. ret=shell(komut)
  862. if ret ~= "" then
  863. return ret
  864. end
  865. else
  866. -- todo!!! kurulu paketler için yapılacak
  867. return nil
  868. end
  869. end
  870. ------------------------------
  871. -- İçbilgi(mtree) işlemleri
  872. -- içbilgi içindeki dosyaları yazdırmak
  873. islem.api.ib={
  874. usage="",
  875. comment="",
  876. }
  877. islem.api.ib.job=function (params)
  878. local paket=params[2]
  879. local ibdos=islem.icbilgi.dosyalar(kokdizin..islem.paket.vt..paket.."/")
  880. if ibdos then
  881. for _,dos in ipairs(ibdos) do
  882. print(dos)
  883. end
  884. end
  885. end
  886. islem.icbilgi={
  887. retkey="icbilgi:",
  888. dosya=".icbilgi",
  889. }
  890. function islem.icbilgi.dosyalar(tempdir)
  891. assert(tempdir,"islem.icbilgi.dosyalar : tempdir is nil")
  892. -- bu hata kullanıcı tanımlı olabilir.
  893. local icdosya=tempdir..islem.icbilgi.dosya
  894. assert(path_exists(icdosya),"islem.kur.dosya_kontrol : icbilgi is not found")
  895. assert(get_size(icdosya) > 0,"islem.kur.dosya_kontrol : icbilgi size equals zero")
  896. local tmpdos=shell("mktemp")
  897. local komut="zgrep -i './' "..icdosya.."| grep -v 'type=dir' | cut -d' ' -f1 > "..tmpdos
  898. shell(komut)
  899. local pdoslar=get_content(tmpdos)
  900. local dosyalar={}
  901. -- .icbilgi içindeki dosyalar döngüde tabloya eklenir.
  902. -- diğer dosyalar elenerek.
  903. for dos in pdoslar:gmatch("[^\r\n]+") do
  904. if dos:match(".ustbilgi") then
  905. elseif dos:match("libgerekler") then
  906. elseif dos:match("pktlibler") then
  907. elseif dos:match(".meta") then
  908. else
  909. --print(dos:sub(3))
  910. table.insert(dosyalar,dos:sub(3))
  911. end
  912. end
  913. shell("rm "..tmpdos)
  914. return dosyalar
  915. end
  916. -- sha256digest eşitliğinden match edip değer karşılaştırma
  917. function islem.icbilgi.hash_kontrol(dir,dosya)
  918. assert(dir,"islem.icbilgi.hash_kontrol : dir is nil")
  919. local icdosya=dir..islem.icbilgi.dosya
  920. local komut=("zgrep -i '%s ' %s | grep -v 'type=dir' | grep -v 'type=link'"):format(dosya,icdosya)
  921. local ret=shell(komut)
  922. local hash_pattern="sha256digest=(.*)"
  923. local ic_hash=ret:match(hash_pattern)
  924. local komut2=("sha256sum %s"):format(kokdizin..dosya)
  925. local ret2=shell(komut2)
  926. local d_hash=ret2:match("%S+")
  927. if ic_hash == d_hash then
  928. --print(dosya)
  929. --print(ic_hash,d_hash)
  930. return true
  931. end
  932. return false
  933. end
  934. ------------------Paket ve Veritabanı İşlemleri-----------------------
  935. islem.paket={
  936. retkey="paket:",
  937. vt="var/lib/mps/db/",
  938. logdir="var/log/mps/",
  939. --cachedir="tmp",
  940. cachedir="var/cache/mps/depo",
  941. pktlib_dosya="pktlibler",
  942. ustbildos=".ustbilgi",
  943. metadir=".meta/",
  944. }
  945. ------------------Bilgi İşlemleri-----------------------
  946. islem.bilgi={
  947. retkey="bilgi:",
  948. usage="mps bilgi paket_ismi",
  949. comment=messages.comment_mps_info,
  950. }
  951. function islem.bilgi.job(talimat)
  952. --talimatnameden bilgileri al.
  953. print(("ADI : %s"):format(talimat.isim))
  954. print(("TANIM : %s"):format(talimat.paket.tanim))
  955. print(("GRUP : %s"):format(talimat.paket.grup))
  956. print(("URL : %s"):format(talimat.paket.url))
  957. print(("PAKETÇİ : %s"):format(talimat.paket.paketci))
  958. --paket.vt'den bilgileri al
  959. local pbs = islem.paket.pkvt_bilgi(talimat.isim)
  960. --paket.vt dosyasindaki gerekli girdileri al
  961. local pb = pbs[1]
  962. ---[[
  963. print(("SÜRÜM : %s"):format(pb.surum))
  964. print(("DEVİR : %s"):format(pb.devir))
  965. print(("MİMARİ : %s"):format(pb.mimari))
  966. print(("ARŞİV BOYUT : %s"):format(pb.aboyut))
  967. print(("KURULUM BOYUT : %s"):format(pb.kboyut))
  968. --]]
  969. end
  970. function islem.bilgi.handler(input)
  971. -- işlem isminden sonra en az bir parametre olmalıdır.
  972. if #input > 1 then
  973. --islemden sonraki ilk parametreyi tek al (paket ismi)
  974. local path = islem.talimat_bul.job(input[2])
  975. if not path then
  976. messages.package_not_found:format(input[2]):yaz(0)
  977. end
  978. --talimati bul ve joba gonder
  979. local talimat = t.get(path)
  980. islem.bilgi.job(talimat)
  981. else
  982. (messages.usage..islem[_islem]["usage"]):yaz();
  983. end
  984. end
  985. -- -kk kurulu kontrol
  986. islem.api.kk={
  987. usage="",
  988. comment="bir paketin kurulu olma durumunu verir.",
  989. }
  990. islem.api.kk.job=function (params)
  991. local pk=params[2];
  992. --- todo!!!! değerlere çıktı verilecek.
  993. -- nil : tanımsız
  994. -- true : kurulu
  995. -- false : kurulu değil
  996. if islem.paket.kurulu_kontrol(pk) then
  997. messages.installed:yaz(1)
  998. else
  999. messages.not_installed:yaz(3)
  1000. end
  1001. end
  1002. -- -kdl kurulu dosya listele
  1003. islem.api.kdl={
  1004. usage="",
  1005. comment="bir paketin kurulu dosyalarını listeler."
  1006. }
  1007. islem.api.kdl.job=function (params)
  1008. local pk=params[2];return islem.paket.kurulu_icerik(pk)
  1009. end
  1010. -- -pkd paket kurulum doğrula
  1011. islem.api.pkd={
  1012. usage="",
  1013. comment="",
  1014. }
  1015. islem.api.pkd.job=function (params)
  1016. local pk=params[2];return islem.paket.kurulum_dogrula(pk)
  1017. end
  1018. -- -pktlib kurulu paket pktlibler
  1019. islem.api.pktlib={
  1020. usage="",
  1021. comment="bir paketin sağladığı .so dosyalarını listeler."
  1022. }
  1023. islem.api.pktlib.job=function (params)
  1024. -- bir paketin pktliblerini gösterilmesi
  1025. -- mps -pktlib = kurulu paketin vy kaydından bakılır.
  1026. -- mps -pktlib -t = talimatın pktlibler dosyasından bakılır.
  1027. local pk=nil
  1028. local param=params[2]
  1029. if param == "-t" then
  1030. pk=params[3]
  1031. else
  1032. pk=param
  1033. end
  1034. if pk then
  1035. return islem.paket.pktlibler(pk,param)
  1036. else
  1037. messages.args_at_least_one:yaz(0)
  1038. end
  1039. end
  1040. -- -libgerek kurulu paket libgerekler
  1041. islem.api.libgerek={
  1042. usage="",
  1043. comment="bir paketin ihtiyaç duyduğu .so dosyalarını listeler."
  1044. }
  1045. islem.api.libgerek.job=function (params)
  1046. local pk=nil
  1047. local param=params[2]
  1048. if param == "-t" then
  1049. pk=params[3]
  1050. else
  1051. pk=param
  1052. end
  1053. if pk then
  1054. return islem.paket.libgerekler(pk,param)
  1055. else
  1056. messages.args_at_least_one:yaz(0)
  1057. end
  1058. end
  1059. -----
  1060. function islem.paket.pktlibler(paket,param)
  1061. -- kurulu olan bir paketin pktliblerini gösterir.(shlibs)
  1062. -- önce kurulu kontrol edilir
  1063. assert(paket,"paket param is nil")
  1064. local icerik=""
  1065. -- talimatnameden bakılması istenirse
  1066. if param == "-t" then
  1067. local _talimatd=islem.talimat_bul.job(paket)
  1068. if _talimatd then
  1069. if path_exists(_talimatd.."/"..islem.paket.pktlib_dosya) then
  1070. icerik=get_content(_talimatd.."/"..islem.paket.pktlib_dosya)
  1071. end
  1072. print(icerik)
  1073. else
  1074. (messages.talimat_not_found..paket):yaz(0)
  1075. end
  1076. else
  1077. if islem.paket.kurulu_kontrol(paket) then
  1078. local _file=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.paket.pktlib_dosya
  1079. assert(path_exists(_file),"file not found "..islem.paket.pktlib_dosya)
  1080. icerik=get_content(_file)
  1081. print(icerik)
  1082. else
  1083. messages.package_not_installed:format(paket):yaz(0)
  1084. end
  1085. end
  1086. end
  1087. function islem.paket.libgerekler(paket,param)
  1088. -- kurulu olan bir paketin gerek duyduğu libleri gösterir.(needed shlibs)
  1089. -- önce kurulu kontrol edilir
  1090. assert(paket,"paket param is nil")
  1091. local icerik=""
  1092. -- talimatnameden bakılması istenirse
  1093. if param == "-t" then
  1094. local _talimatd=islem.talimat_bul.job(paket)
  1095. if _talimatd then
  1096. if path_exists(_talimatd.."/"..islem.shlib.dosya) then
  1097. icerik=get_content(_talimatd.."/"..islem.shlib.dosya)
  1098. end
  1099. print(icerik)
  1100. else
  1101. (messages.talimat_not_found..paket):yaz(0)
  1102. end
  1103. else
  1104. if islem.paket.kurulu_kontrol(paket) then
  1105. local _file=kokdizin..islem.paket.vt..paket.."/"..islem.paket.metadir..islem.shlib.dosya
  1106. assert(path_exists(_file),"file not found "..islem.shlib.dosya)
  1107. icerik=get_content(_file)
  1108. print(icerik)
  1109. else
  1110. messages.package_not_installed:format(paket):yaz(0)
  1111. end
  1112. end
  1113. end
  1114. function islem.paket.pkvt_bilgi(paket)
  1115. -- bir paket hakkında pkvt leri tarayarak bilgi toplar.
  1116. local paketler={}
  1117. local i=0
  1118. -- isim,surum,devir,mimari,aboyut,kboyut,shasum içeriği olacak.
  1119. local fields={"isim","surum","devir","mimari","aboyut","kboyut","shasum","depo"}
  1120. local ret=""
  1121. local komut='find %s -name "paket.vt#%s" -exec grep -i "^%s " {} \\; | sort -n'
  1122. -- islem.paket.cachedir altında paketleri arayacak.
  1123. -- {} /dev/null \; olursa eşleşen dosya ismi de gelir.
  1124. -- en azından paket.vt#1 dosyası bulunmalıdır ki tarama yapılabilsin
  1125. --if path_exists(islem.paket.cachedir.."/paket.vt#1") then
  1126. for sira=1,#ayar.sunucu do
  1127. if path_exists(kokdizin..islem.paket.cachedir.."/paket.vt#"..sira) then
  1128. ret=shell(komut:format(kokdizin..islem.paket.cachedir,sira,paket))
  1129. for satir in ret:gmatch("[^\r\n]+") do
  1130. local _paket={}
  1131. for bilgi in satir:gmatch("%S+") do
  1132. i = i + 1
  1133. _paket[fields[i]]=bilgi
  1134. end
  1135. -- depo bilgisi conf.lua dan alınıp eklenecek.
  1136. _paket.depo=ayar.sunucu[sira]
  1137. table.insert(paketler,_paket)
  1138. i=0
  1139. end
  1140. else
  1141. (sira..". "..messages.paketvt_not_found):yaz(0)
  1142. end
  1143. end
  1144. if #ayar.sunucu == 0 then
  1145. messages.package_server_not_defined:yaz(3)
  1146. end
  1147. return paketler
  1148. end
  1149. function islem.paket.kurulu_kontrol(paket)
  1150. -- bir paketin kurulu olup olmadığını vt e bakarak kontrol eder
  1151. -- /var/lib/mps/DB/paket_ismi dizin kontrol eder
  1152. -- dönüş olarak kurulu değilse nil kurulu ise link dizini döndürür.
  1153. assert(paket,"islem.paket.kurulu_kontrol : paket is nil")
  1154. local ret=""
  1155. local komut='find %s -name "%s#*" -type l'
  1156. if path_exists(kokdizin..islem.paket.vt..paket.."/"..islem.kur.kurulandos) then
  1157. ret=shell(komut:format(kokdizin..islem.paket.vt,paket))
  1158. assert(ret,paket.." link dizini yok!")
  1159. return ret
  1160. end
  1161. return nil
  1162. end
  1163. function islem.paket.kurulu_icerik(paket)
  1164. -- kurulu olan bir paketin kurulum içeriğini gösterir
  1165. -- önce kontrol edilir
  1166. assert(paket,"islem.paket.kurulu_kontrol : paket is nil")
  1167. if islem.paket.kurulu_kontrol(paket) then
  1168. local _kurulan=kokdizin..islem.paket.vt..paket.."/"..islem.kur.kurulandos
  1169. assert(path_exists(_kurulan),"islem.paket.kurulu_icerik : kurulan file not found")
  1170. local icerik=get_content(_kurulan)
  1171. print(icerik)
  1172. -- clear screen
  1173. --io.write("\27[2J")
  1174. else
  1175. messages.package_not_installed:format(paket):yaz(0)
  1176. end
  1177. end
  1178. function islem.paket.kurulum_dogrula(paket)
  1179. -- kurulu olan bir paketin dosyaları incelenerek kurulum doğrulaması yapılır
  1180. -- mevcutluk ve hash kontrolü + izinler ! todo!!!
  1181. assert(paket,"islem.paket.kurulum_dogrula : paket is nil")
  1182. if islem.paket.kurulu_kontrol(paket) then
  1183. -- paket dizin kaydı
  1184. local pdk=kokdizin..islem.paket.vt..paket.."/"
  1185. local dosyalar=islem.icbilgi.dosyalar(pdk)
  1186. for _,dosya in ipairs(dosyalar) do
  1187. -- 1. dosya mevcut kontrolü
  1188. if not path_exists(kokdizin..dosya) then
  1189. messages.file_not_found:format(kokdizin..dosya):yaz(3)
  1190. end
  1191. -- 2. hash kontrolü
  1192. if lfs.symlinkattributes(kokdizin..dosya, "mode") ~= "directory" and
  1193. lfs.symlinkattributes(kokdizin..dosya, "mode") ~= "link" then
  1194. if not islem.icbilgi.hash_kontrol(pdk,dosya) then
  1195. messages.hash_not_match:format(kokdizin..dosya):yaz(3)
  1196. end
  1197. end
  1198. end
  1199. else
  1200. messages.package_not_installed:format(paket):yaz(0)
  1201. end
  1202. end
  1203. ------------------------------
  1204. ------------------İndirme İşlemleri-----------------------
  1205. -- handler parametre analiz ve linki hazırlayacak
  1206. -- job direk linki hash kontrollü indirecek
  1207. islem.indir={
  1208. retkey="indir",
  1209. usage="mps indir paket_ismi",
  1210. comment=messages.comment_mps_download
  1211. }
  1212. function islem.indir.handler(input)
  1213. -- işlem isminden sonra en az bir parametre olmalıdır.
  1214. if #input > 1 then
  1215. local _islem=input[1]
  1216. local pkt=input[2]
  1217. -- ek parametreler olabilir, araştıralacak
  1218. local sira=1
  1219. if input[3] then sira=tonumber(input[3]) end
  1220. -- depolarda ilk bulduğu depodan pkvt bilgisini getirecek
  1221. local ret=islem.paket.pkvt_bilgi(pkt)
  1222. if ret then
  1223. -- indir işlemi paket bilgi tablosunu kullanacak.
  1224. if ret[sira] then
  1225. islem.indir.job(ret[sira])
  1226. else
  1227. messages.package_not_found_inrepo:format(pkt):yaz(0)
  1228. end
  1229. else
  1230. print(pak,"depolarda bulunamadı")
  1231. end
  1232. else
  1233. (messages.usage..islem[_islem]["usage"]):yaz();
  1234. end
  1235. end
  1236. function islem.indir.job(pb)
  1237. -- girdi olarak paket bilgi tablosu alır.
  1238. -- Link ve paket arşiv formatlarına ayrıştırır.
  1239. assert(pb,"paket bilgi tablosu nil")
  1240. -- indirilecek link ve kayıt yolu+dosya ismiyle
  1241. function _indir(link,kayit)
  1242. local body, code = http.request(link)
  1243. code=tostring(code)
  1244. if code:match("connection refused") then
  1245. messages.server_connection_refused:format(link):yaz(3)
  1246. elseif code=="404" then
  1247. messages.paketvt_not_found:yaz(3)
  1248. elseif code == "200" then
  1249. local f = assert(io.open(kayit, 'wb'))
  1250. f:write(body)
  1251. f:close();
  1252. if path_exists(kayit) then
  1253. (link):yaz(1);
  1254. else
  1255. messages.redownloading:format(kayit):yaz(2)
  1256. _indir(link,kayit);
  1257. end
  1258. elseif not body then
  1259. (link):yaz(3);
  1260. else
  1261. messages.unknown_error:format(link):yaz(0)
  1262. end
  1263. end
  1264. -- arşiv formatında # , web için %23 olauyor.
  1265. -- Bu nedenle global arşiv formatını kullanmıyoruz.
  1266. local larsiv=("%s%%23%s-%s-%s.mps.lz"):format(pb.isim,pb.surum,pb.devir,pb.mimari)
  1267. local arsiv=paf:format(pb.isim,pb.surum,pb.devir,pb.mimari)
  1268. local indirilecek=true
  1269. -- link oluşturulur
  1270. local link=plf:format(pb.depo,larsiv)
  1271. local kayit=kokdizin..islem.paket.cachedir.."/"..arsiv
  1272. -- print(link,"indirilecek")
  1273. -- indirme işlemi; indirme yöneticisine link ve kayıt yeri belirtilir.
  1274. if path_exists(kayit) then
  1275. -- eğer paket önbellekte var ise hash kontrolü yapılıp
  1276. -- hatalı ise silinip tekrar indirilir.
  1277. if hash_check(kayit,pb.shasum) then
  1278. indirilecek=false;
  1279. messages.package_incache:format(pb.isim):yaz(2)
  1280. -- paketin zaten indirilmiş olduğu-doğrulanması, dönüş kayit yol.
  1281. return kayit
  1282. else
  1283. messages.package_shasum_error:format(pb.isim):yaz(3)
  1284. messages.package_redownloading:format(pb.isim):yaz(2)
  1285. shell("rm -f "..kayit)
  1286. end
  1287. end
  1288. if indirilecek then
  1289. _indir(link,kayit)
  1290. -- shasum kontrol; indirilen dosya mevcut ve hash kontrolü yapılır.
  1291. if path_exists(kayit) then
  1292. if hash_check(kayit,pb.shasum) then
  1293. messages.package_downloaded:format(pb.isim):yaz(1)
  1294. -- paketin indirilmesi-doğrulanması, dönüş kayit yol.
  1295. return kayit
  1296. else
  1297. messages.package_shasum_error:format(pb.isim):yaz(0)
  1298. end
  1299. else
  1300. messages.package_download_error:format(pb.isim):yaz(0)
  1301. end
  1302. end
  1303. -- diğer durumlar için nil değerin döndürülmesi
  1304. return nil
  1305. end
  1306. ------------------------------------------------------------
  1307. -- Koşuk işlemleri - kurkos,koskur,silkos, kossil
  1308. islem.kosuk={
  1309. retkey="kosuk:",
  1310. predos=".koskur",
  1311. postdos=".kurkos",
  1312. postrm=".silkos",
  1313. prerm=".kossil",
  1314. }
  1315. -- kurmadan önce çalıştırılacak kod
  1316. function islem.kosuk.koskur(tempdir)
  1317. local log=""
  1318. if islem.kur.koskur then
  1319. assert(path_exists(tempdir),"islem.kosuk.koskur : tempdir is nil")
  1320. local kos=tempdir..islem.paket.metadir..islem.kosuk.predos
  1321. if path_exists(kos) then
  1322. -- koskur u çalıştıma sonuçları logla
  1323. -- koşuklara çalıştırma izni verme
  1324. shell("chmod +x "..kos)
  1325. os.execute(kos)
  1326. log="kosuk.koskur:\tOK"
  1327. else
  1328. log="kosuk.koskur:\tPASS"
  1329. end
  1330. else
  1331. log="kosuk.koskur:\tDISABLE"
  1332. end
  1333. islem.debug.yaz(log);
  1334. islem.kur.logger:write(log.."\n")
  1335. end
  1336. -- kurmadan sonra çalıştırılacak kod
  1337. function islem.kosuk.kurkos(tempdir)
  1338. local log=""
  1339. if islem.kur.kurkos then
  1340. assert(path_exists(tempdir),"islem.kosuk.kurkos : tempdir is nil")
  1341. local kos=tempdir..islem.paket.metadir..islem.kosuk.postdos
  1342. if path_exists(kos) then
  1343. -- kurkos u çalıştıma sonuçları logla
  1344. -- koşuklara çalıştırma izni verme
  1345. shell("chmod +x "..kos)
  1346. os.execute(kos)
  1347. log="kosuk.kurkos:\tOK"
  1348. else
  1349. log="kosuk.kurkos:\tPASS"
  1350. end
  1351. else
  1352. log="kosuk.kurkos:\tDISABLE"
  1353. end
  1354. islem.debug.yaz(log);
  1355. islem.kur.logger:write(log.."\n")
  1356. end
  1357. -- kurulumda dosya-dizin tetiklemeli otomatik çalıştırılacak kod
  1358. function islem.kosuk.otokos_kur(tempdir)
  1359. local log=""
  1360. if islem.kur.otokos then
  1361. assert(path_exists(tempdir),"islem.kosuk.otokos : tempdir is nil")
  1362. local curdir=lfs.currentdir()
  1363. lfs.chdir(tempdir)
  1364. -- todo!!! değişkene atılacak
  1365. kos=mps_path.."/conf/otokos.sh"
  1366. if path_exists(kos) then
  1367. -- kurkos u çalıştıma sonuçları logla
  1368. -- koşuklara çalıştırma izni verme
  1369. shell("chmod +x "..kos)
  1370. shell(kos.." kur")
  1371. log="kosuk.otokos_kur:\tOK"
  1372. else
  1373. log="kosuk.otokos_kur:\tPASS"
  1374. end
  1375. lfs.chdir(curdir)
  1376. else
  1377. log="kosuk.otokos_kur:\tDISABLE"
  1378. end
  1379. islem.debug.yaz(log);
  1380. islem.kur.logger:write(log.."\n")
  1381. end
  1382. -- silmeden önce çalıştırılacak kod
  1383. function islem.kosuk.kossil(paket)
  1384. assert(path_exists(kokdizin..islem.paket.vt..paket),"islem.kosuk.kossil : paketdir is nil")
  1385. local _betik=kokdizin..islem.paket.vt..paket.."/"..islem.kosuk.prerm
  1386. local log=""
  1387. if path_exists(_betik) then
  1388. -- kossil u çalıştıma sonuçları logla
  1389. -- koşuklara çalıştırma izni verme
  1390. shell("chmod +x ".._betik)
  1391. os.execute(_betik)
  1392. log="kosuk.kossil:\tOK"
  1393. else
  1394. log="kosuk.kossil:\tPASS"
  1395. end
  1396. islem.debug.yaz(log)
  1397. islem.sil.logger:write(log.."\n")
  1398. end
  1399. -- sildikten sonra çalıştırılacak kod
  1400. function islem.kosuk.silkos(paket)
  1401. assert(path_exists(kokdizin..islem.paket.vt..paket),"islem.kosuk.kossil : paketdir is nil")
  1402. local _betik=kokdizin..islem.paket.vt..paket.."/"..islem.kosuk.postrm
  1403. local log=""
  1404. if path_exists(_betik) then
  1405. -- silkos u çalıştıma sonuçları logla
  1406. -- koşuklara çalıştırma izni verme
  1407. shell("chmod +x ".._betik)
  1408. os.execute(_betik)
  1409. log="kosuk.silkos:\tOK"
  1410. else
  1411. log="kosuk.silkos:\tPASS"
  1412. end
  1413. islem.debug.yaz(log)
  1414. islem.sil.logger:write(log.."\n")
  1415. end
  1416. ------------------------------
  1417. -- Sil işlemleri
  1418. islem.sil={
  1419. retkey="sil:",
  1420. usage="mps sil paket_ismi",
  1421. dlistfile="%stmp/%s.del.list",
  1422. keeplist=".silme",
  1423. logdir=islem.paket.logdir.."sil/",
  1424. logger=nil,
  1425. }
  1426. function islem.sil.handler(input)
  1427. -- işlem isminden sonra en az bir parametre olmalıdır.
  1428. if #input > 1 then
  1429. -- sil işleri tablosu
  1430. local remlist={}
  1431. -- 1. girdiyi analiz et
  1432. -- girdiler çoğul kabul edilir boşluğa göre ayrıştırılır.
  1433. for index, _paket in ipairs(input) do
  1434. -- ilk parametre işlem tipi olacak pas geçilir.
  1435. if index == 1 then goto continue end
  1436. --talimat konum bul
  1437. local _durum=islem.paket.kurulu_kontrol(_paket)
  1438. if _durum then
  1439. if sil_onay then
  1440. table.insert(remlist,_paket)
  1441. else
  1442. if islem.diyalog.onay(messages.confirm_package_uninstallation:format(_paket)) then
  1443. table.insert(remlist,_paket)
  1444. end
  1445. end
  1446. else
  1447. messages.package_not_installed:format(_paket):yaz(0)
  1448. end
  1449. ::continue::
  1450. end
  1451. -- eğer toplu silme yapılacaksa paket sistemine uygun sırada silinmeli
  1452. -- re_order_delete_sensible
  1453. --islem.sil.job(remlist);
  1454. -- işlemlerin logu okunacak
  1455. --islem.sil.job(remlist)
  1456. for _,rpaket in ipairs(remlist) do
  1457. -- todo!!! ters gereklerini kontrol et / silinecek pakete bağlı olan paketler
  1458. islem.sil.job(rpaket)
  1459. end
  1460. else
  1461. (messages.usage..islem[_islem]["usage"]):yaz();
  1462. end
  1463. end
  1464. function islem.sil.job(paket)
  1465. -- tek bir paketi siler
  1466. assert(paket,"islem.sil.paket : paket is nil")
  1467. -- sed "s/^'/\/mnt/" kurulan.s | sed "s/'//"
  1468. -- sil adımları
  1469. -- 0. logger set
  1470. islem.sil.set_logger(paket)
  1471. -- 1. silinecek dosya listesi hazırla
  1472. islem.sil.prepare_list(paket)
  1473. -- 2. silinecekleri filtrele(keeplist)
  1474. islem.sil.filter_list(paket)
  1475. -- 3. kos-sil betiğini kontrol et / çalıştır
  1476. islem.kosuk.kossil(paket)
  1477. -- 4. Dosyaları güvenli! sil ve logla
  1478. islem.sil.uygula(paket)
  1479. -- 5. sil-kos betiğini kontrol et / çalıştır
  1480. islem.kosuk.silkos(paket)
  1481. -- 6. paket veritabanı güncelle sil
  1482. islem.sil.paket_vt(paket)
  1483. -- silmeden sonra ld.so.cache güncellemesi için
  1484. islem.kur.ld_update("sil");
  1485. -- log dosyası kapatılır.
  1486. islem.sil.logger:close();
  1487. -- Silme işlemi sonuç kontrol
  1488. islem.sil.bitis(paket)
  1489. end
  1490. function islem.sil.set_logger(paket)
  1491. -- bu assert mps başına konulabilir
  1492. assert(path_exists(kokdizin..islem.paket.logdir),"islem.sil.set_logger : islem.paket.logdir is not availables, needs mps --ilk")
  1493. assert(path_exists(kokdizin..islem.sil.logdir),"islem.sil.set_logger : islem.sil.logdir is not availables, needs mps --ilk")
  1494. local logfile=kokdizin..islem.sil.logdir..paket..".log"
  1495. islem.sil.logger = assert(io.open(logfile, "w"),"islem.sil.set_logger logfile can not open")
  1496. islem.sil.logger:write(paket.."\t"..os.date("%x %H:%M:%S").."\n");
  1497. islem.sil.logger:write("--------------------------------------\n");
  1498. end
  1499. function islem.sil.bitis(paket)
  1500. -- Silme adımlarının başarılı bir şekilde tamamlandığını log dosyası ile kontrol eder.
  1501. local logfile=kokdizin..islem.sil.logdir..paket..".log"
  1502. assert(path_exists(logfile),"islem.sil.bitis : logfile is not available")
  1503. if not get_content(logfile):match("ERR@R") then
  1504. messages.package_uninstalled:format(paket):yaz(1)
  1505. else
  1506. messages.package_uninstallation_failed:format(paket):yaz(0)
  1507. end
  1508. end
  1509. function islem.sil.prepare_list(paket)
  1510. local sildos=islem.sil.dlistfile:format(kokdizin,paket)
  1511. local _kurulan=kokdizin..islem.paket.vt..paket.."/"..islem.kur.kurulandos
  1512. -- todo!!! silinecek dosyaların başına kök diizn ekleyerek gerçek yollu silineceklerin oluşturulması
  1513. --local komut='sed "s~^\'~%s~g" %s | sed "s/\'//" > %s'
  1514. -- silinecek dosyalardan ' karakterinin kaldirilmasi
  1515. local komut="sed 's/'\\''//g' %s > %s"
  1516. komut=komut:format(_kurulan,sildos)
  1517. shell(komut)
  1518. assert(get_size(sildos) > 0,"islem.sil.prepare_list : del.list is empty");
  1519. local log="prepare_list:\tOK"
  1520. islem.debug.yaz(log)
  1521. islem.sil.logger:write(log.."\n")
  1522. end
  1523. function islem.sil.filter_list(paket)
  1524. -- eğer paket dizin kaydında .silme isimli dosya varsa
  1525. -- o dosya içindeki alt alta sıralı dosyalar silinecekler listesinden elenecektir.
  1526. -- silinecekler başka dosya isimle içindekilerle karşılaştırılıp filtre edilenler silinir.
  1527. local keeplistfile=kokdizin..islem.paket.vt..paket.."/"..islem.sil.keeplist
  1528. local sildos=islem.sil.dlistfile:format(kokdizin,paket)
  1529. local log=""
  1530. if path_exists(keeplistfile) then
  1531. local komut_k='sed "s~^~%s~g" %s > %s'
  1532. komut_k=komut_k:format(kokdizin,keeplistfile,sildos..".keep")
  1533. shell(komut)
  1534. local komut_move="mv %s %s"
  1535. shell(komut_move:format(sildos,sildos.."f"))
  1536. local komut_f="sort %s %s |uniq -u > %s"
  1537. komut_f=komut_f:format(sildos..".f",keeplistfile,sildos)
  1538. shell(komut_f)
  1539. log="filter_list:\tOK"
  1540. else
  1541. log="filter_list:\tPASS"
  1542. end
  1543. islem.debug.yaz(log)
  1544. islem.sil.logger:write(log.."\n")
  1545. end
  1546. function islem.sil.uygula(paket)
  1547. local sildos=islem.sil.dlistfile:format(kokdizin,paket)
  1548. local sil_content=get_content(sildos);
  1549. -- Once tum paket *dosya*lari silinecek
  1550. -- Ardindan klasorler bos mu diye kontrol edilecek
  1551. -- Bos olan klasorler kaldirilacak
  1552. local exist=true
  1553. local delete=true
  1554. local log=""
  1555. local sil_komut="rm -rf %s"
  1556. local ret=nil
  1557. islem.sil.logger:write("---------------\n")
  1558. function smart_delete(file_list, no_check)
  1559. -- smart delete bir doysa+dizin listesi alir
  1560. -- Ilk olarak tum dosyalari kaldirir ve dizinleri arar
  1561. -- Ardindan bos olan dizinler kaldirilir
  1562. -- Son olarak bos olmayan dizinleri return eder
  1563. -- file_list bir string arrayi olmali
  1564. -- no_check bir boolean olmali
  1565. -- eget no_check 1 ise, tum dizinler
  1566. -- bos olup olmasina bakilmadan kalirilacak
  1567. to_remove={
  1568. files={},
  1569. dirs={}
  1570. }
  1571. for dos in file_list:gmatch("[^\r\n]+") do
  1572. file_attr = lfs.attributes(dos)
  1573. if file_attr then
  1574. if file_attr.mode == "file" then
  1575. table.insert(to_remove.files, dos)
  1576. else
  1577. _, count = dos:gsub('/', '/')
  1578. table.insert(to_remove.dirs, {dos, count})
  1579. end
  1580. end
  1581. end
  1582. -- tabloyu dizin hiyerasisine gore sirala
  1583. -- alttaki dizin tabloda uste gelir
  1584. function compare(a,b)
  1585. return a[2] > b[2]
  1586. end
  1587. table.sort(to_remove.dirs, compare)
  1588. -- once tum dosyalari kaldir
  1589. for _,v in pairs(to_remove.files) do
  1590. local result, reason = os.remove(v)
  1591. -- todo!!! dosya silinmemesine karsin error-check yap
  1592. if result then
  1593. else
  1594. end
  1595. end
  1596. nonempty_dirs={}
  1597. -- to_remove.dirs'i iterate et ve bos olan dizinleri kaldir
  1598. for i=1, #to_remove.dirs do
  1599. status, message, code = lfs.rmdir(to_remove.dirs[i][1])
  1600. if status == nil then
  1601. if code == 39 then
  1602. if no_check then
  1603. -- no_check set edilmisse, dizini recursive olarak kaldir
  1604. deletedir(to_remove.dirs[i])
  1605. else
  1606. -- Dizin bos degil, silme!, nonempty_dirs'e ekle
  1607. table.insert(nonempty_dirs, to_remove.dirs[i])
  1608. end
  1609. else
  1610. -- Hata yakala ve yazdir
  1611. hata_msg="Klasör silinemedi!".."\n"..message
  1612. hata_msg:yaz(0)
  1613. end
  1614. end
  1615. end
  1616. -- dizinleri recursive silmek icin yardimci function
  1617. function deletedir(dir)
  1618. for file in lfs.dir(dir) do
  1619. local file_path = dir..'/'..file
  1620. if file ~= "." and file ~= ".." then
  1621. if lfs.attributes(file_path, 'mode') == 'file' then
  1622. os.remove(file_path)
  1623. elseif lfs.attributes(file_path, 'mode') == 'directory' then
  1624. deletedir(file_path)
  1625. end
  1626. end
  1627. end
  1628. lfs.rmdir(dir)
  1629. end
  1630. return nonempty_dirs
  1631. end
  1632. -- sildos dosyasindaki entryleri smart_delete function'i ile sil
  1633. protected_dirs = smart_delete(sil_content)
  1634. -- Kullaniciya silinmeyen klasorleri goster
  1635. -- todo!!! bu ozelligi tamamla
  1636. -- kullanicidan input alip sil
  1637. delete_list={}
  1638. if #protected_dirs > 0 then
  1639. messages.confirm_dir_removing_msg:format(sildos_by_user):yaz(3)
  1640. sildos_by_user=islem.sil.dlistfile:format(kokdizin, paket)..".kor"
  1641. sildos_file = io.open(sildos_by_user, "w")
  1642. for i=1, #protected_dirs do
  1643. -- eger protected_dirs te varsa ancak kullanicinin degistirdigi dosyada yoksa
  1644. -- girdinin silinmesi gerekiyor
  1645. local dir ={}
  1646. dir.dir = protected_dirs[i][1]
  1647. dir.level =protected_dirs[i][2]
  1648. dir.children = {}
  1649. for j=i-1, 1, -1 do
  1650. if protected_dirs[j][2] == dir.level + 1 then
  1651. table.insert(dir.children, protected_dirs[j][1])
  1652. end
  1653. end
  1654. for file in lfs.dir(dir.dir) do
  1655. if file ~= "." and file ~= ".." then
  1656. file_path = dir.dir.."/"..file
  1657. if find(dir.children, file_path) < 0 then
  1658. sildos_file:write(file_path.."\n")
  1659. end
  1660. end
  1661. end
  1662. end
  1663. sildos_file:close()
  1664. messages.confirm_dir_removing_info:format(sildos_by_user):yaz(3)
  1665. local entries_from_user = {}
  1666. for line in io.lines(sildos_by_user) do
  1667. print(line)
  1668. table.insert(entries_from_user, line)
  1669. end
  1670. end
  1671. ----------
  1672. islem.sil.logger:write("---------------\n")
  1673. if exist and delete then
  1674. log="sil.uygula: \tOK";
  1675. islem.debug.yaz(log);
  1676. islem.sil.logger:write(log.."\n")
  1677. else
  1678. log="sil.uygula:\tERR@R";
  1679. log:yaz(3);
  1680. islem.sil.logger:write(log.."\n")
  1681. end
  1682. end
  1683. function islem.sil.paket_vt(paket)
  1684. local dizin=kokdizin..islem.paket.vt..paket
  1685. assert(path_exists(dizin),"islem.sil.paket_vt : dizin is not available")
  1686. local log=""
  1687. local komut_vt="rm -rf %s"
  1688. komut_vt=komut_vt:format(dizin)
  1689. shell(komut_vt);
  1690. -- linkin de silinmesi
  1691. shell(komut_vt.."#*");
  1692. if not path_exists(dizin) then
  1693. log="sil.paket_vt:\tOK";
  1694. islem.debug.yaz(log);
  1695. islem.sil.logger:write(log.."\n")
  1696. else
  1697. log="sil.paket_vt:\tERR@R";
  1698. log:yaz(3);
  1699. islem.sil.logger:write(log.."\n")
  1700. end
  1701. end
  1702. ------------------------------
  1703. -- Kur işlemleri
  1704. islem.kur={
  1705. retkey="kur:",
  1706. kurulandos="kurulan",
  1707. dizinler={"boot","etc","usr","opt","var","tools"}, -- paket içi desteklenen dizinler
  1708. usage="mps kur paket_ismi | paket_yolu",
  1709. logdir=islem.paket.logdir.."kur/",
  1710. logger=nil,
  1711. kurkos=true,
  1712. koskur=true,
  1713. otokos=true,
  1714. zorla=false,
  1715. comment=messages.comment_mps_install,
  1716. }
  1717. function islem.kur.agdan(paket)
  1718. --print ("ağdan kurma TEST AŞAMASINDA!")
  1719. assert(paket,"islem.kur.agdan : paket is nil")
  1720. -- 1.çalışma gerekleri tespit edilecek tablo=gerek paket c
  1721. -- islem gerek listesi global olduğu için sıfırlanması gerekir.
  1722. islem.gerek.liste={}
  1723. islem.gerek.job(paket,"c")
  1724. --print(paket,#islem.gerek.liste)
  1725. -- 2.paketvt ler den döngüde paket#surum-devir
  1726. local ret, pk=""
  1727. local kurliste={}
  1728. local pkpath=nil
  1729. -- 3. gereklerin sıralı indirme
  1730. for _,tsd in ipairs(islem.gerek.liste) do
  1731. -- 3.1 indirilecek size bilgi - kurulacak bilgi verilip onay ile
  1732. pk,_=tsd:match("([%a%d-+]+)#+")
  1733. -- paket kurulu ise atlanacak
  1734. if islem.paket.kurulu_kontrol(pk) then
  1735. (messages.package_already_installed..":"..pk):yaz(2);
  1736. else
  1737. ret=islem.paket.pkvt_bilgi(pk)[1]
  1738. -- indirme işlemi
  1739. -- kurliste ye inen/indirilmiş paketin yolunun kaydı
  1740. pkpath=islem.indir.job(ret)
  1741. if pkpath == nil then
  1742. messages.package_dependency_dl_error:format(pk):yaz(3)
  1743. else
  1744. table.insert(kurliste,pkpath)
  1745. end
  1746. end
  1747. end
  1748. -- 4.gerekler kurulacak (yerelden kur ile cachedir den)
  1749. for _,pkyol in ipairs(kurliste) do
  1750. -- 4.1 indirilecek size bilgi - kurulacak bilgi verilip onay ile
  1751. islem.kur.yerelden(pkyol)
  1752. end
  1753. end
  1754. function islem.kur.yerelden(paket)
  1755. --print (paket) -- belki bu mps.log a atılabilir/nereden talimatlandığına dair
  1756. -- yerelden gelen paketin mevcut kontrolü
  1757. -- gönderen işlevler yapamazsa
  1758. if not paket then
  1759. messages.package_not_found:format(paket):yaz(0)
  1760. end
  1761. assert(paket ~= "","islem.kur.yerelden : paket is empty string")
  1762. -- print (paket,"yerelden")
  1763. -- adımlar: loglanacak, her işlem adımı log dosyasına atacak
  1764. -- önemli not: pcall ile işlemler uygulanacak, eğer break olursa sistem kaynaklı (ctrl+c vs)
  1765. -- işlem adımı ve onu çağıran süreç job dosyası state kayıt edilecek.
  1766. -- -1. paket arşivi kontrol edilir
  1767. local isim,surum,devir=islem.arsiv.kontrol(paket)
  1768. -- -2. logger set
  1769. islem.kur.set_logger(isim)
  1770. -- 0. paket kurulu kontrol yapılır
  1771. islem.kur.kurulu_kontrol(isim)
  1772. -- 1. /tmp altında geçici bir dizine çıkarılır
  1773. local tempdir=islem.arsiv.cikar(paket)
  1774. -- 2. libgerekler kontrol edilir- ldconfig sor
  1775. islem.shlib.kontrol(tempdir) --/ kontrol altına eksik shlibleri içeren paketler kurulabilir.
  1776. -- 3. hedef kurulum dizininde çakışan/var olan dosya kontrolü
  1777. islem.kur.dosya_kontrol(tempdir)
  1778. -- 4. koşkur varsa çalıştırılır 2.madde?
  1779. islem.kosuk.koskur(tempdir)
  1780. -- 5. geçici dizinden hedef dizin altına kopyalanır
  1781. islem.kur.kopyala(tempdir)
  1782. -- 6. kopyalanan dosyalar VT e yazılır, var/lib/mps/DB altına paketismi
  1783. -- tempdir altında kurulan dosyası, .icbilgi, .ustbilgi, kosuklar, libgerekler, pktlibler
  1784. islem.kur.vt_kayit(tempdir,isim,surum,devir)
  1785. -- 7. mtree ile karşılaştırma doğrulanır
  1786. -- 8. ldconfig güncellemesi
  1787. islem.kur.ld_update_handler(tempdir)
  1788. -- 9. kurkos çalıştırılır
  1789. islem.kosuk.kurkos(tempdir)
  1790. -- 10. otokos çalıştırılır
  1791. islem.kosuk.otokos_kur(tempdir)
  1792. -- 11. temizlik, başarı mesaj...
  1793. islem.kur.clean_tempdir(tempdir)
  1794. -- 12. log dosyası kapatılır.
  1795. islem.kur.logger:close();
  1796. -- 13. Paket kurulum sonucu
  1797. islem.kur.bitis(isim)
  1798. end
  1799. function islem.kur.clean_tempdir(tempdir)
  1800. -- kurma işlemleri bittikten sonra paket içeriğinin
  1801. -- geçici çıkarıldığı tempdir silinir.
  1802. local komut="rm -rf %s"
  1803. komut=komut:format(tempdir)
  1804. shell(komut)
  1805. end
  1806. function islem.kur.bitis(paket)
  1807. -- Kurulum adımlarının başarılı bir şekilde tamamlandığını log dosyası ile kontrol eder.
  1808. local logfile=kokdizin..islem.kur.logdir..paket..".log"
  1809. assert(path_exists(logfile),"islem.kur.bitis : logfile is not available")
  1810. if not get_content(logfile):match("ERR@R") then
  1811. messages.package_installed:format(paket):yaz(1)
  1812. else
  1813. messages.package_installation_failed:format(paket):yaz(0)
  1814. end
  1815. end
  1816. function islem.kur.set_logger(paket)
  1817. -- bu assert mps başına konulabilir
  1818. assert(path_exists(kokdizin..islem.paket.logdir),"islem.kur.set_logger : islem.paket.logdir is not available, needs mps --ilk")
  1819. assert(path_exists(kokdizin..islem.kur.logdir),"islem.kur.set_logger : islem.kur.logdir is not availables, needs mps --ilk")
  1820. local logfile=kokdizin..islem.kur.logdir..paket..".log"
  1821. --print("-",logfile)
  1822. islem.kur.logger = assert(io.open(logfile, "w"),"islem.kur.set_logger logfile can not open")
  1823. islem.kur.logger:write(paket.."\t"..os.date("%x %H:%M:%S").."\n");
  1824. islem.kur.logger:write("--------------------------------------\n");
  1825. end
  1826. function islem.kur.ld_update_handler(tempdir)
  1827. local log=""
  1828. if path_exists(tempdir..islem.paket.metadir..islem.paket.pktlib_dosya)
  1829. or path_exists(tempdir..islem.paket.metadir..islem.shlib.dosya) then
  1830. -- libgerek?(kurulu ise cache edilmiş olmalı), shlib varsa ldconfig edilecek.
  1831. islem.kur.ld_update()
  1832. log="ld_up_handler:\tOK";
  1833. islem.kur.logger:write(log.."\n")
  1834. else
  1835. messages.ld_update_pass:yaz()
  1836. log="ld_up_handler:\tPASS";
  1837. islem.kur.logger:write(log.."\n")
  1838. end
  1839. end
  1840. -- kura mahsus olmasın todo!!!
  1841. function islem.kur.ld_update(oper)
  1842. -- hedef kök dizinde ldconfig varsa güncelleme olur.
  1843. local log=""
  1844. if path_exists(kokdizin.."usr/bin/ldconfig")
  1845. or path_exists(kokdizin.."sbin/ldconfig") then
  1846. --print("ldconfig update edilecek")
  1847. local _cachedos="etc/ld.so.cache"
  1848. local komut1=("rm -f %s%s"):format(kokdizin,_cachedos)
  1849. --print(komut1)
  1850. shell(komut1)
  1851. local komut2=("ldconfig -r %s"):format(kokdizin)
  1852. --print(komut2)
  1853. shell(komut2)
  1854. else
  1855. (messages.ld_update_pass..kokdizin):yaz()
  1856. log="ld_update:\tPASS";
  1857. if oper then
  1858. islem[oper].logger:write(log.."\n")
  1859. else
  1860. islem.kur.logger:write(log.."\n")
  1861. end
  1862. end
  1863. end
  1864. function islem.kur.kopyala(tempdir)
  1865. -- geçici çıkarma dizininden sisteme kopyala işlemi
  1866. -- geçerli dizinler kontrol edilerek kopyalama yapılır
  1867. -- tempdir altındaki dizinleri islem.kur.dizinler ile karşılaştır.
  1868. local dirs=get_dirs(tempdir)
  1869. local kurulandos=tempdir..islem.kur.kurulandos
  1870. assert(dirs,"islem.kur.kopyala : dirs is nil")
  1871. --table.insert(dirs,"sbin")
  1872. local log=""
  1873. for _,dir in ipairs(dirs) do
  1874. if not has_value(islem.kur.dizinler,dir) and dir.."/" ~= islem.paket.metadir then
  1875. (messages.invalid_package_content..dir):yaz(3)
  1876. islem.kur.logger:write(messages.invalid_package_content..dir.."\n")
  1877. end
  1878. end
  1879. local komut=""
  1880. for _,dizin in ipairs(islem.kur.dizinler) do
  1881. if path_exists(tempdir..dizin) then
  1882. komut='cp -v -aflr %s %s | awk \'{split($0,a,"-> "); print a[2]}\' | sed \'s#%s#/#g\' >> %s'
  1883. komut=komut:format(tempdir..dizin,kokdizin,kokdizin,kurulandos)
  1884. shell(komut)
  1885. log="kur.kopyala:\tOK";
  1886. islem.debug.yaz(log)
  1887. islem.kur.logger:write(log.."\n")
  1888. end
  1889. end
  1890. end
  1891. function islem.kur.vt_kayit(tempdir,isim,surum,devir)
  1892. -- sisteme kopyalanan paketin paket veritabanı kaydının yapılması
  1893. -- ve kurulum logunun oluşturulması (adımlar loglanacak)
  1894. assert(isim,"islem.kur.vt_kayit : isim is nil")
  1895. local log=""
  1896. local paket_vt_dizin=kokdizin..islem.paket.vt..isim.."/"
  1897. -- linkin oluşturulması - indeksleme için
  1898. local paket_vt_dizin_link=kokdizin..islem.paket.vt..isim.."#"..surum.."-"..devir
  1899. -- paket_vt dizin oluşturma
  1900. local komut0=("rm -rf %s"):format(paket_vt_dizin)
  1901. shell(komut0)
  1902. local komut1=("mkdir -p %s"):format(paket_vt_dizin)
  1903. local komut_link=("ln -s %s %s"):format(paket_vt_dizin,paket_vt_dizin_link)
  1904. --print(komut1)
  1905. shell(komut1)
  1906. shell(komut_link)
  1907. -- / altındakileri silme engeli
  1908. assert(paket_vt_dizin ~= "/","islem.kur.vt_kayit : paket_vt_dizin must not be /")
  1909. -- paket_vt dizin temizlik
  1910. local komut2=("rm -rf %s*"):format(paket_vt_dizin)
  1911. --print(komut2)
  1912. shell(komut2)
  1913. -- paket.vt içerik kopyalama (tek tek bilgi dosyaları yada file olan her obje)
  1914. -- kurulan dosyası da eklenir, islem.kur içinde tanımlandığı için burda ekliyoruz.
  1915. -- kurulan dosyanın oluşması beklenir, oluşmadıysa sisteme dosya ve dizin kopyalama olmamıştır.
  1916. assert(path_exists(tempdir..islem.kur.kurulandos),"islem.kur.vt_kayit : kurulan file is not available -> no files, dirs copied!!!")
  1917. -- kurulan dosyasının paket kayıt dizine kaydı
  1918. shell(("cp -avf %s %s"):format(tempdir..islem.kur.kurulandos,paket_vt_dizin))
  1919. -- .meta dizini kopyala
  1920. shell(("cp -avf %s %s"):format(tempdir..islem.paket.metadir,paket_vt_dizin))
  1921. -- icbilgi dosyası kopyala
  1922. shell(("cp -avf %s %s"):format(tempdir..islem.icbilgi.dosya,paket_vt_dizin))
  1923. log="kur.vt_kayit:\tOK";
  1924. islem.debug.yaz(log)
  1925. islem.kur.logger:write(log.."\n")
  1926. -- vt_kayıt test edilecek!!!
  1927. end
  1928. function islem.kur.dosya_kontrol(tempdir)
  1929. -- sisteme kopyalanacak paket içeriğinin sistemde çakışan karşılık kontrolü
  1930. -- çakışanlar için strateji belirlenmeli: üzerine yaz, koru vs
  1931. local dosyalar=islem.icbilgi.dosyalar(tempdir)
  1932. assert(dosyalar,"islem.kur.dosya_kontrol : dosyalar is nil")
  1933. local ret=true
  1934. local log=""
  1935. local conflict_files={}
  1936. for _,dosya in ipairs(dosyalar) do
  1937. if path_exists(kokdizin..dosya) then
  1938. (messages.file_already_exists:format(kokdizin..dosya)):yaz(3)
  1939. table.insert(conflict_files,kokdizin..dosya)
  1940. ret=false
  1941. end
  1942. end
  1943. -- handling already exist files
  1944. if not ret and islem.kur.zorla == false then
  1945. if islem.diyalog.onay(messages.confirm_files_removing) then
  1946. -- conflict_files tablosundan dosyalar sıralı şekilde silinir
  1947. for _,dosya in ipairs(conflict_files) do
  1948. shell("rm -f "..dosya)
  1949. end
  1950. log="çakışan_dosya:\tOK";
  1951. else
  1952. -- tempdir i sil çıkış yap
  1953. -- print("koskurdan sonra olmalı çakşm,log da silinmeli!!! not yet")
  1954. -- islem.kur.clean_tempdir(tempdir)
  1955. -- os.exit()
  1956. log="çakışan_dosya:\tOVERRIDE";
  1957. end
  1958. islem.debug.yaz(log);
  1959. else
  1960. log="dosya_kontrol:\tOK";
  1961. islem.debug.yaz(log);
  1962. end
  1963. islem.kur.logger:write(log.."\n")
  1964. end
  1965. function islem.kur.kurulu_kontrol(paket)
  1966. -- sistemde kurulu paket kontrolü
  1967. -- burada kurulu pakete uygulanacak seçenek sorulur
  1968. -- sil/silme
  1969. assert(paket,"islem.kur.kurulu_kontrol : paket is nil")
  1970. local log=""
  1971. if islem.paket.kurulu_kontrol(paket) then
  1972. log=messages.package_already_installed;
  1973. messages.package_already_installed:yaz(0);
  1974. else
  1975. log="kurulu_kontrol:\tOK";
  1976. end
  1977. islem.debug.yaz(log)
  1978. islem.kur.logger:write(log.."\n")
  1979. end
  1980. function islem.kur.job(kur)
  1981. -- dikkat ! sıralı kurmayabilir tablo şeklinde geliyor
  1982. -- işlemlerin logu hazırlanacak.
  1983. for tip,tablo in pairs(kur) do
  1984. -- burası sıralı iş
  1985. if kur[tip] then
  1986. for _,job in ipairs(tablo) do
  1987. islem.kur[tip](job)
  1988. end
  1989. end
  1990. end
  1991. end
  1992. function islem.kur.handler(input)
  1993. -- işlem isminden sonra en az bir parametre olmalıdır.
  1994. if #input > 1 then
  1995. -- kurulum işleri tablosu
  1996. local jobs={
  1997. agdan={},
  1998. yerelden={}
  1999. }
  2000. -- 1. girdiyi analiz et
  2001. -- girdiler çoğul kabul edilir boşluğa göre ayrıştırılır.
  2002. for index, girdi in ipairs(input) do
  2003. -- ilk parametre işlem tipi olacak pas geçilir.
  2004. if index == 1 then goto continue end
  2005. --talimat konum bul
  2006. if girdi:match("--kurkos=0") then islem.kur.kurkos=false
  2007. elseif girdi:match("--koskur=0") then islem.kur.koskur=false
  2008. elseif girdi:match("--otokos=0") then islem.kur.otokos=false
  2009. elseif girdi:match("--zorla") or girdi:match("--force") then islem.kur.zorla=true
  2010. elseif path_exists(girdi) and girdi:match("mps.lz") then
  2011. -- yerelden kurulacak
  2012. local _tk=get_abspath(girdi)
  2013. table.insert(jobs.yerelden,_tk)
  2014. -- dosyadan kurulacak
  2015. elseif girdi:match("^-%-dosya=(.*)$") then
  2016. local dosya=girdi:match("^-%-dosya=(.*)$")
  2017. if path_exists(dosya) then
  2018. for pk in (get_content(dosya)):gmatch("[^\r\n]+") do
  2019. local _talimatd=islem.talimat_bul.job(pk)
  2020. if _talimatd then
  2021. table.insert(jobs.agdan,_talimatd)
  2022. --print(_talimatd)
  2023. else
  2024. (messages.talimat_not_found..pk):yaz(0)
  2025. end
  2026. end
  2027. else
  2028. messages.file_not_found:format(dosya):yaz(0)
  2029. end
  2030. else
  2031. if girdi:match("/") then (messages.args_invalid..girdi):yaz(0) end
  2032. local _talimatd=islem.talimat_bul.job(girdi)
  2033. if _talimatd then
  2034. -- ağdan kurulacak
  2035. table.insert(jobs.agdan,_talimatd)
  2036. else
  2037. (messages.talimat_not_found..girdi):yaz(0)
  2038. end
  2039. end
  2040. ::continue::
  2041. end
  2042. islem.kur.job(jobs);
  2043. -- todo!!! işlemlerin logu okunacak
  2044. -- ("işlemlerin logu okunacak"):yaz(2)
  2045. else
  2046. (messages.usage..islem[_islem]["usage"]):yaz();
  2047. end
  2048. end
  2049. --------------------------------------------
  2050. --------Güncelleme İşlemleri-------------------
  2051. islem.guncelle={
  2052. retkey="guncelle:",
  2053. comment=messages.usage_updating_repos,
  2054. usage="mps guncelle",
  2055. betikdepo={isim="betikdepo",tnm="Betik",path=milispath},
  2056. talimatdepo={isim="talimatdepo",tnm="Git",path=talimatname}
  2057. }
  2058. -- apiler kısa_kodlar
  2059. -- -G paket veritabanları güncellenir.
  2060. islem.api.G={
  2061. usage="",
  2062. comment="",
  2063. }
  2064. islem.api.G.job=function (params)
  2065. local sira=params[2];return islem.guncelle.paketvt(sira)
  2066. end
  2067. -- -GG talimat depo güncellenir.
  2068. islem.api.GG={
  2069. usage="",
  2070. comment="",
  2071. }
  2072. islem.api.GG.job=function (params)
  2073. local sira=params[2];
  2074. return islem.guncelle.gitdepo(sira,islem.guncelle.talimatdepo)
  2075. end
  2076. -- -BG betik depo güncellenir.
  2077. islem.api.BG={
  2078. usage="",
  2079. comment="",
  2080. }
  2081. islem.api.BG.job=function (params)
  2082. local sira=params[2];
  2083. return islem.guncelle.gitdepo(sira,islem.guncelle.betikdepo)
  2084. end
  2085. -- -MG mps güncellenir.
  2086. islem.api.MG={
  2087. usage="",
  2088. comment=messages.comment_mps_update_self,
  2089. }
  2090. islem.api.MG.job=function (params)
  2091. return islem.guncelle.mps()
  2092. end
  2093. -- işlevler
  2094. function islem.guncelle.handler(input)
  2095. assert(#input>0,"girdi eksik parametre")
  2096. local sira=nil
  2097. local _islem=input[1]
  2098. if #input > 1 then sira=input[2] end
  2099. -- mps güncelleme
  2100. islem.guncelle.mps()
  2101. -- talimat depolarının güncelleme
  2102. islem.guncelle.gitdepo(sira,islem.guncelle.talimatdepo)
  2103. -- betik depolarının güncelleme
  2104. islem.guncelle.gitdepo(sira,islem.guncelle.betikdepo)
  2105. -- paketvt depoları güncelleme
  2106. islem.guncelle.paketvt(sira)
  2107. end
  2108. function islem.guncelle.mps()
  2109. -- todo!!! mps commit hash tutulacak oradan commit değer değişimi gösterilecek
  2110. -- değişim yoksa güncelleme yok
  2111. assert(path_exists(mps_path),"mps_path not exist")
  2112. assert(path_exists(mps_path.."/.git"),"invalid git directory");
  2113. ("MPS güncelleniyor:"):yaz(2);
  2114. ("------------------------------------"):yaz(2);
  2115. local komut="cd %s && git reset --hard HEAD && git pull && chmod +x bin/mps*"
  2116. local ret=shell(komut:format(mps_path));
  2117. -- ret=shell(git_kont:format(repo,tmp,tmp))
  2118. ("------------------------------------"):yaz(2)
  2119. end
  2120. function islem.guncelle.paketvt(sira)
  2121. ("Paket veritaban(lar)ı güncelleniyor:"):yaz(2);
  2122. ("------------------------------------"):yaz(2);
  2123. if not path_exists(kokdizin..islem.paket.cachedir) then
  2124. local create_cache=("mkdir -p %s%s"):format(kokdizin,islem.paket.cachedir)
  2125. shell(create_cache)
  2126. end
  2127. sira=tonumber(sira)
  2128. local pkvt="paket.vt"
  2129. -- işlev içinde işlev paket.vt i indirmek için
  2130. -- paket.vt.gz gibi sıkıştırılmış gerçekleme yapılacak. todo!!!
  2131. function _indir(sunucu,sira)
  2132. -- io.write(sunucu.."/"..pkvt.."\t")
  2133. local link=sunucu.."/"..pkvt
  2134. local body, code = http.request(link)
  2135. code=tostring(code)
  2136. if code:match("connection refused") then
  2137. messages.server_connection_refused:format(sunucu):yaz(3)
  2138. elseif code=="404" then
  2139. messages.paketvt_not_found:yaz(3)
  2140. elseif code == "200" then
  2141. local kayit=kokdizin..islem.paket.cachedir.."/"..pkvt.."#"..sira
  2142. local f = assert(io.open(kayit, 'wb'))
  2143. f:write(body)
  2144. f:close();
  2145. -- ("+"):yaz(1);
  2146. --kayit:yaz(2);
  2147. if path_exists(kayit) then
  2148. (link):yaz(1);
  2149. else
  2150. messages.redownloading:format(kayit):yaz(2)
  2151. _indir(sunucu,sira);
  2152. end
  2153. elseif not body then
  2154. (link):yaz(3);
  2155. else
  2156. messages.unknown_error:format(link):yaz(0)
  2157. end
  2158. end
  2159. -- eğer sadece bir paket sunucu güncellenmek istenirse
  2160. if sira then
  2161. -- sıra aşımlı paket vt güncelelnmek istenirse
  2162. if #ayar.sunucu < sira then
  2163. messages.package_db_out_of_order:yaz(0)
  2164. end
  2165. if ayar.sunucu[sira] then
  2166. _indir(ayar.sunucu[sira],sira)
  2167. end
  2168. -- çoklu sunucu güncelleme
  2169. else
  2170. for _sira,sunucu in ipairs(ayar.sunucu) do
  2171. _indir(sunucu,_sira)
  2172. end
  2173. end
  2174. ("------------------------------------"):yaz(2);
  2175. end
  2176. function islem.guncelle.gitdepo(sira,depo)
  2177. -- tip=betikdepo, gitdepo
  2178. -- depo={isim="betikdepo",tnm="Betik",path=milispath}
  2179. -- depo={isim="gitdepo",tnm="Git",path=talimatname}
  2180. -- bin, ayarlar lı betikdepo güncelleme yapılacak todo!!!
  2181. assert(depo,"depo is nil!!!");
  2182. (depo.tnm.." depoları güncelleniyor:"):yaz(2);
  2183. ("------------------------------------"):yaz(2);
  2184. function do_clone(repo,path)
  2185. local komut="git clone %s %s"
  2186. local ret=shell(komut:format(repo,path))
  2187. end
  2188. function do_pull(path)
  2189. assert(path_exists(path.."/.git"),"invalid git directory")
  2190. local komut="cd %s && git pull"
  2191. local ret=shell(komut:format(path))
  2192. end
  2193. function esitle(repoyol,altdizin,hedef)
  2194. -- todo!!! eşitlenecek dizinden sadece talimat içeren
  2195. -- dizinleri alarak eşitleme yap veya sonda silme
  2196. local komut="cp -rf %s/%s/* %s/"
  2197. if path_exists(repoyol.."/"..altdizin) then
  2198. shell(komut:format(repoyol, altdizin ,hedef))
  2199. else
  2200. messages.git_repo_subdir_not_found:yaz(0)
  2201. end
  2202. end
  2203. function yedekle(dizin)
  2204. local komut="mv %s %s.old"
  2205. if path_exists(dizin) then
  2206. shell(komut:format(dizin,dizin))
  2207. end
  2208. -- dizin yedeklenerek yeni boş oluşturulur.
  2209. assert(lfs.mkdir(dizin),dizin.." oluşturulamadı.")
  2210. end
  2211. local _repo=""
  2212. local _repoyol=""
  2213. local duzey=""
  2214. local tmp=shell("mktemp")
  2215. local eskisil="rm -rf %s.old"
  2216. -- git repo mevcut kontrol komut
  2217. local git_kont="git ls-remote -q %s > %s 2>&1;cat %s | head -n1 | awk '{print $1}'"
  2218. -- !!! burası farklı ayar.betikdepo
  2219. for bdepo,repolar in pairs(ayar[depo.isim]) do
  2220. -- !!! burası farklı
  2221. duzey=depo.path.."/"..bdepo
  2222. -- her talimat-betik düzeyinde yedekleme-eşitleme-eskiyi silme yapılacak
  2223. yedekle(duzey)
  2224. for repo,dizin in pairs(repolar) do
  2225. -- git repo mevcut kontrolü
  2226. ret=shell(git_kont:format(repo,tmp,tmp))
  2227. io.write(bdepo," ",repo," ",dizin)
  2228. if ret:match("fatal") then
  2229. ("\t-"):yaz(1)
  2230. else
  2231. -- Git işlemleri
  2232. -- repo netde mevcut ise, yerelde yoksa clone varsa pull yapılacak.
  2233. _repo=repo:gsub("https://", "")
  2234. _repo=_repo:gsub("http://", "")
  2235. _repo=_repo:gsub("/", ".")
  2236. print("\t",_repo)
  2237. _repoyol=kokdizin..ayar.repo_dizin.."/".._repo
  2238. if path_exists(_repoyol) then
  2239. do_pull(_repoyol)
  2240. else
  2241. do_clone(repo, _repoyol)
  2242. end
  2243. -- Eşitleme işlemleri
  2244. esitle(_repoyol,dizin,duzey)
  2245. end
  2246. end
  2247. -- sıra-talimat düzeyi işlemler bittikten sonra .old düzey silinir.
  2248. if path_exists(duzey..".old") then
  2249. shell(eskisil:format(duzey))
  2250. end
  2251. end
  2252. shell(("rm -f %s"):format(tmp));
  2253. ("------------------------------------"):yaz(2);
  2254. end
  2255. -- Mps İşlemleri ----------------------------
  2256. -- -v ile mps sürüm no gösterilir.
  2257. islem.api.v={
  2258. usage="",
  2259. comment="",
  2260. }
  2261. islem.api.v.job=function() islem.surum.handler() end
  2262. -- -ayar öntanımlı ayarlar yükler/kopyalar
  2263. islem.ayarla={
  2264. retkey="ayarla:",
  2265. comment=messages.usage_configure,
  2266. usage="mps ayarla",
  2267. }
  2268. function islem.ayarla.handler()
  2269. -- mps için conf.lua yükleme komutu
  2270. local komut="cp -f %s/conf/conf.lua.sablon %s/conf/conf.lua"
  2271. shell(komut:format(mps_path,mps_path))
  2272. end
  2273. islem.mps={
  2274. retkey="mps:",
  2275. version="MPS 2.0.5 - Milis Paket Sistemi milisarge@gmail.com",
  2276. _comment=messages.usage_mps,
  2277. }
  2278. islem.surum={}
  2279. function islem.surum.handler()
  2280. islem.mps.version:yaz(2)
  2281. end
  2282. ------------------------------------------------------------
  2283. -- -h mps yardım gösterilir.
  2284. islem.api.h={
  2285. usage="",
  2286. comment="",
  2287. }
  2288. islem.api.h.job=function() islem.help.handler() end
  2289. islem.help={
  2290. retkey="yardım:",
  2291. usage="mps -h",
  2292. }
  2293. function islem.help.handler()
  2294. local aralik=":"
  2295. print(messages.help)
  2296. print("-----------------")
  2297. for key,_ in pairs(islem) do
  2298. aralik=":"
  2299. if islem[key]["comment"] then
  2300. if #key<7 then aralik="\t:" end
  2301. print(key,aralik.." "..islem[key]["comment"])
  2302. end
  2303. end
  2304. print("-----------------")
  2305. for key,_ in pairs(islem.api) do
  2306. aralik=":"
  2307. if islem.api[key]["comment"] then
  2308. if #key<7 then aralik="\t:" end
  2309. print("-"..key,aralik.." "..islem.api[key]["comment"])
  2310. end
  2311. end
  2312. end
  2313. -----------------------------------------
  2314. -- Debug işlemleri
  2315. islem.debug={
  2316. retkey="debug",
  2317. }
  2318. function islem.debug.yaz(log)
  2319. if debug then
  2320. if log then
  2321. log:yaz()
  2322. else
  2323. messages.empty_log:yaz(0)
  2324. end
  2325. end
  2326. end
  2327. -----------------------------------------
  2328. -- İşlevlerin Test İşlemi ----------------------------
  2329. -- islem.a.b.c işleminin tesit için . karakterine göre ayrıştırıp
  2330. -- dizide öyle çağırmak gerekir.
  2331. islem.test={
  2332. retkey="test:",
  2333. }
  2334. islem.api.test={
  2335. usage="",
  2336. comment="",
  2337. }
  2338. islem.api.test.job=function() islem.test.case1() end
  2339. function islem.test.handler(f1)
  2340. local islev=f1[2]
  2341. assert(islev,"islem.test.handler : f1 is nil")
  2342. print (islev);
  2343. islem.test[islev]()
  2344. _G[islev]()
  2345. end
  2346. function islem.test.case1()
  2347. print(hash_check("/tmp/ttt","sadsfsef"))
  2348. end
  2349. function islem.test.hello()
  2350. print("merhaba")
  2351. end
  2352. function hello()
  2353. print("merhaba2")
  2354. end
  2355. -----------------------------------------
  2356. -- parse arguments / burası sadece ana parsing olsun
  2357. -- her işlemin girdi parseri ayrı olacak
  2358. -- ilk parametre işlem olmalı
  2359. if #arg < 1 then
  2360. -- en az bir parametre belirtilmeli
  2361. --messages.args_at_least_one:yaz(0)
  2362. -- yardım menüsünün gösterilmesi
  2363. print(islem.mps.version)
  2364. print(islem.mps._comment)
  2365. islem.help.handler()
  2366. os.exit();
  2367. end
  2368. -- cli arg to global params variable
  2369. params=arg
  2370. -- bu aşamada --color gibi çıktı tipleri vs opsiyonlar elimine edilmeli
  2371. -- sonra sadeleşmiş hedef işlem ve girdileri kalmalı
  2372. -- global ayarlar analiz edilir
  2373. authorised_check()
  2374. color_check()
  2375. debug_check()
  2376. root_check()
  2377. mps_init_check()
  2378. mps_initfs_check()
  2379. confirm_check()
  2380. -- mps için gerekli init dizinlerin kontrolü
  2381. -- req_dir_check()
  2382. --en son parametreler sadeleştirilir (false paramlar silinir)
  2383. re_param()
  2384. -- ilk paramtre olarak işlem gelmeli
  2385. _islem=params[1]
  2386. if _islem == nil then os.exit() end
  2387. local _api=""
  2388. if _islem:sub(0,1) == "-" then
  2389. _api=_islem:sub(2)
  2390. end
  2391. if islem[_islem] then
  2392. -- print(_islem," işlemi yapılacak")
  2393. -- ilgili işlem kuralı çağıralacak /handler veya handler olabilir.
  2394. -- param analiz ve thread tanımlama işleri için
  2395. -- işlem parseri geri kalan parametreleri analiz edecek
  2396. local key = "handler"
  2397. if islem[_islem][key] then
  2398. islem[_islem]["handler"](params)
  2399. else
  2400. (messages.handler_not_found.._islem):yaz(0)
  2401. end
  2402. -- - ile başlayan parametreleri işleyebilmek için
  2403. -- -kk ı kk ile islem.api içinde kontro edip
  2404. -- ilgili işlevi çağıracak.
  2405. elseif islem.api[_api] then
  2406. islem.api[_api]["job"](params)
  2407. --_G[islem.api[_api]](params)
  2408. else
  2409. (messages.args_invalid.._islem):yaz(0)
  2410. end
  2411. -- todo list
  2412. --[[
  2413. ("---------TODO-LIST------------------"):yaz(1);
  2414. ("mtree s256sum sorun !!!"):yaz();
  2415. ("pktlibler so düzgün tespit edilemiyor/ncurses bknz"):yaz();
  2416. ("talimatın yanndaki dosyalar/yama vs"):yaz();
  2417. ("çakışan dosyaları oto sil-onsistemde lazım oluyor"):yaz();
  2418. ("thash olayı derle.sh gibi dosyalar da olunca mantıklı olmuyor!-talimat dizini kamusun hashle"):yaz();
  2419. ("paket sil.logda harici diizn yerine kokdizinsiz yazdırma"):yaz();
  2420. ("pktlib,libgerek tespitinde eksiklik ve harici dizinle yazılıyor!"):yaz();
  2421. ("kurulumda kurkos pasif ederek kurdurma"):yaz();
  2422. ("-y veya işlem onay parametresi eklenecek-genele/kur-işlem bazlı?"):yaz();
  2423. ("SİLKOŞ - KOŞSİL TEST EDİLECEK"):yaz();
  2424. ("shell komutları uygulandığına dair assert(veya expect) edilmeli -"):yaz();
  2425. ("------------------------------------"):yaz(1);
  2426. ]]--