mps2.0.lua 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662
  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. -- paket paket veritabanında bulunamaz ise, veritabanı güncellenmelidir.
  1739. if ret == nil then messages.package_not_found_inpkvt:format(pk):yaz(0) end
  1740. -- indirme işlemi
  1741. -- kurliste ye inen/indirilmiş paketin yolunun kaydı
  1742. pkpath=islem.indir.job(ret)
  1743. if pkpath == nil then
  1744. messages.package_dependency_dl_error:format(pk):yaz(3)
  1745. else
  1746. table.insert(kurliste,pkpath)
  1747. end
  1748. end
  1749. end
  1750. -- 4.gerekler kurulacak (yerelden kur ile cachedir den)
  1751. for _,pkyol in ipairs(kurliste) do
  1752. -- 4.1 indirilecek size bilgi - kurulacak bilgi verilip onay ile
  1753. islem.kur.yerelden(pkyol)
  1754. end
  1755. end
  1756. function islem.kur.yerelden(paket)
  1757. --print (paket) -- belki bu mps.log a atılabilir/nereden talimatlandığına dair
  1758. -- yerelden gelen paketin mevcut kontrolü
  1759. -- gönderen işlevler yapamazsa
  1760. if not paket then
  1761. messages.package_not_found:format(paket):yaz(0)
  1762. end
  1763. assert(paket ~= "","islem.kur.yerelden : paket is empty string")
  1764. -- print (paket,"yerelden")
  1765. -- adımlar: loglanacak, her işlem adımı log dosyasına atacak
  1766. -- önemli not: pcall ile işlemler uygulanacak, eğer break olursa sistem kaynaklı (ctrl+c vs)
  1767. -- işlem adımı ve onu çağıran süreç job dosyası state kayıt edilecek.
  1768. -- -1. paket arşivi kontrol edilir
  1769. local isim,surum,devir=islem.arsiv.kontrol(paket)
  1770. -- -2. logger set
  1771. islem.kur.set_logger(isim)
  1772. -- 0. paket kurulu kontrol yapılır
  1773. islem.kur.kurulu_kontrol(isim)
  1774. -- 1. /tmp altında geçici bir dizine çıkarılır
  1775. local tempdir=islem.arsiv.cikar(paket)
  1776. -- 2. libgerekler kontrol edilir- ldconfig sor
  1777. islem.shlib.kontrol(tempdir) --/ kontrol altına eksik shlibleri içeren paketler kurulabilir.
  1778. -- 3. hedef kurulum dizininde çakışan/var olan dosya kontrolü
  1779. islem.kur.dosya_kontrol(tempdir)
  1780. -- 4. koşkur varsa çalıştırılır 2.madde?
  1781. islem.kosuk.koskur(tempdir)
  1782. -- 5. geçici dizinden hedef dizin altına kopyalanır
  1783. islem.kur.kopyala(tempdir)
  1784. -- 6. kopyalanan dosyalar VT e yazılır, var/lib/mps/DB altına paketismi
  1785. -- tempdir altında kurulan dosyası, .icbilgi, .ustbilgi, kosuklar, libgerekler, pktlibler
  1786. islem.kur.vt_kayit(tempdir,isim,surum,devir)
  1787. -- 7. mtree ile karşılaştırma doğrulanır
  1788. -- 8. ldconfig güncellemesi
  1789. islem.kur.ld_update_handler(tempdir)
  1790. -- 9. kurkos çalıştırılır
  1791. islem.kosuk.kurkos(tempdir)
  1792. -- 10. otokos çalıştırılır
  1793. islem.kosuk.otokos_kur(tempdir)
  1794. -- 11. temizlik, başarı mesaj...
  1795. islem.kur.clean_tempdir(tempdir)
  1796. -- 12. log dosyası kapatılır.
  1797. islem.kur.logger:close();
  1798. -- 13. Paket kurulum sonucu
  1799. islem.kur.bitis(isim)
  1800. end
  1801. function islem.kur.clean_tempdir(tempdir)
  1802. -- kurma işlemleri bittikten sonra paket içeriğinin
  1803. -- geçici çıkarıldığı tempdir silinir.
  1804. local komut="rm -rf %s"
  1805. komut=komut:format(tempdir)
  1806. shell(komut)
  1807. end
  1808. function islem.kur.bitis(paket)
  1809. -- Kurulum adımlarının başarılı bir şekilde tamamlandığını log dosyası ile kontrol eder.
  1810. local logfile=kokdizin..islem.kur.logdir..paket..".log"
  1811. assert(path_exists(logfile),"islem.kur.bitis : logfile is not available")
  1812. if not get_content(logfile):match("ERR@R") then
  1813. messages.package_installed:format(paket):yaz(1)
  1814. else
  1815. messages.package_installation_failed:format(paket):yaz(0)
  1816. end
  1817. end
  1818. function islem.kur.set_logger(paket)
  1819. -- bu assert mps başına konulabilir
  1820. assert(path_exists(kokdizin..islem.paket.logdir),"islem.kur.set_logger : islem.paket.logdir is not available, needs mps --ilk")
  1821. assert(path_exists(kokdizin..islem.kur.logdir),"islem.kur.set_logger : islem.kur.logdir is not availables, needs mps --ilk")
  1822. local logfile=kokdizin..islem.kur.logdir..paket..".log"
  1823. --print("-",logfile)
  1824. islem.kur.logger = assert(io.open(logfile, "w"),"islem.kur.set_logger logfile can not open")
  1825. islem.kur.logger:write(paket.."\t"..os.date("%x %H:%M:%S").."\n");
  1826. islem.kur.logger:write("--------------------------------------\n");
  1827. end
  1828. function islem.kur.ld_update_handler(tempdir)
  1829. local log=""
  1830. if path_exists(tempdir..islem.paket.metadir..islem.paket.pktlib_dosya)
  1831. or path_exists(tempdir..islem.paket.metadir..islem.shlib.dosya) then
  1832. -- libgerek?(kurulu ise cache edilmiş olmalı), shlib varsa ldconfig edilecek.
  1833. islem.kur.ld_update()
  1834. log="ld_up_handler:\tOK";
  1835. islem.kur.logger:write(log.."\n")
  1836. else
  1837. messages.ld_update_pass:yaz()
  1838. log="ld_up_handler:\tPASS";
  1839. islem.kur.logger:write(log.."\n")
  1840. end
  1841. end
  1842. -- kura mahsus olmasın todo!!!
  1843. function islem.kur.ld_update(oper)
  1844. -- hedef kök dizinde ldconfig varsa güncelleme olur.
  1845. local log=""
  1846. if path_exists(kokdizin.."usr/bin/ldconfig")
  1847. or path_exists(kokdizin.."sbin/ldconfig") then
  1848. --print("ldconfig update edilecek")
  1849. local _cachedos="etc/ld.so.cache"
  1850. local komut1=("rm -f %s%s"):format(kokdizin,_cachedos)
  1851. --print(komut1)
  1852. shell(komut1)
  1853. local komut2=("ldconfig -r %s"):format(kokdizin)
  1854. --print(komut2)
  1855. shell(komut2)
  1856. else
  1857. (messages.ld_update_pass..kokdizin):yaz()
  1858. log="ld_update:\tPASS";
  1859. if oper then
  1860. islem[oper].logger:write(log.."\n")
  1861. else
  1862. islem.kur.logger:write(log.."\n")
  1863. end
  1864. end
  1865. end
  1866. function islem.kur.kopyala(tempdir)
  1867. -- geçici çıkarma dizininden sisteme kopyala işlemi
  1868. -- geçerli dizinler kontrol edilerek kopyalama yapılır
  1869. -- tempdir altındaki dizinleri islem.kur.dizinler ile karşılaştır.
  1870. local dirs=get_dirs(tempdir)
  1871. local kurulandos=tempdir..islem.kur.kurulandos
  1872. assert(dirs,"islem.kur.kopyala : dirs is nil")
  1873. --table.insert(dirs,"sbin")
  1874. local log=""
  1875. for _,dir in ipairs(dirs) do
  1876. if not has_value(islem.kur.dizinler,dir) and dir.."/" ~= islem.paket.metadir then
  1877. (messages.invalid_package_content..dir):yaz(3)
  1878. islem.kur.logger:write(messages.invalid_package_content..dir.."\n")
  1879. end
  1880. end
  1881. local komut=""
  1882. for _,dizin in ipairs(islem.kur.dizinler) do
  1883. if path_exists(tempdir..dizin) then
  1884. komut='cp -v -aflr %s %s | awk \'{split($0,a,"-> "); print a[2]}\' | sed \'s#%s#/#g\' >> %s'
  1885. komut=komut:format(tempdir..dizin,kokdizin,kokdizin,kurulandos)
  1886. shell(komut)
  1887. log="kur.kopyala:\tOK";
  1888. islem.debug.yaz(log)
  1889. islem.kur.logger:write(log.."\n")
  1890. end
  1891. end
  1892. end
  1893. function islem.kur.vt_kayit(tempdir,isim,surum,devir)
  1894. -- sisteme kopyalanan paketin paket veritabanı kaydının yapılması
  1895. -- ve kurulum logunun oluşturulması (adımlar loglanacak)
  1896. assert(isim,"islem.kur.vt_kayit : isim is nil")
  1897. local log=""
  1898. local paket_vt_dizin=kokdizin..islem.paket.vt..isim.."/"
  1899. -- linkin oluşturulması - indeksleme için
  1900. local paket_vt_dizin_link=kokdizin..islem.paket.vt..isim.."#"..surum.."-"..devir
  1901. -- paket_vt dizin oluşturma
  1902. local komut0=("rm -rf %s"):format(paket_vt_dizin)
  1903. shell(komut0)
  1904. local komut1=("mkdir -p %s"):format(paket_vt_dizin)
  1905. local komut_link=("ln -s %s %s"):format(paket_vt_dizin,paket_vt_dizin_link)
  1906. --print(komut1)
  1907. shell(komut1)
  1908. shell(komut_link)
  1909. -- / altındakileri silme engeli
  1910. assert(paket_vt_dizin ~= "/","islem.kur.vt_kayit : paket_vt_dizin must not be /")
  1911. -- paket_vt dizin temizlik
  1912. local komut2=("rm -rf %s*"):format(paket_vt_dizin)
  1913. --print(komut2)
  1914. shell(komut2)
  1915. -- paket.vt içerik kopyalama (tek tek bilgi dosyaları yada file olan her obje)
  1916. -- kurulan dosyası da eklenir, islem.kur içinde tanımlandığı için burda ekliyoruz.
  1917. -- kurulan dosyanın oluşması beklenir, oluşmadıysa sisteme dosya ve dizin kopyalama olmamıştır.
  1918. assert(path_exists(tempdir..islem.kur.kurulandos),"islem.kur.vt_kayit : kurulan file is not available -> no files, dirs copied!!!")
  1919. -- kurulan dosyasının paket kayıt dizine kaydı
  1920. shell(("cp -avf %s %s"):format(tempdir..islem.kur.kurulandos,paket_vt_dizin))
  1921. -- .meta dizini kopyala
  1922. shell(("cp -avf %s %s"):format(tempdir..islem.paket.metadir,paket_vt_dizin))
  1923. -- icbilgi dosyası kopyala
  1924. shell(("cp -avf %s %s"):format(tempdir..islem.icbilgi.dosya,paket_vt_dizin))
  1925. log="kur.vt_kayit:\tOK";
  1926. islem.debug.yaz(log)
  1927. islem.kur.logger:write(log.."\n")
  1928. -- vt_kayıt test edilecek!!!
  1929. end
  1930. function islem.kur.dosya_kontrol(tempdir)
  1931. -- sisteme kopyalanacak paket içeriğinin sistemde çakışan karşılık kontrolü
  1932. -- çakışanlar için strateji belirlenmeli: üzerine yaz, koru vs
  1933. local dosyalar=islem.icbilgi.dosyalar(tempdir)
  1934. assert(dosyalar,"islem.kur.dosya_kontrol : dosyalar is nil")
  1935. local ret=true
  1936. local log=""
  1937. local conflict_files={}
  1938. for _,dosya in ipairs(dosyalar) do
  1939. if path_exists(kokdizin..dosya) then
  1940. (messages.file_already_exists:format(kokdizin..dosya)):yaz(3)
  1941. table.insert(conflict_files,kokdizin..dosya)
  1942. ret=false
  1943. end
  1944. end
  1945. -- handling already exist files
  1946. if not ret and islem.kur.zorla == false then
  1947. if islem.diyalog.onay(messages.confirm_files_removing) then
  1948. -- conflict_files tablosundan dosyalar sıralı şekilde silinir
  1949. for _,dosya in ipairs(conflict_files) do
  1950. shell("rm -f "..dosya)
  1951. end
  1952. log="çakışan_dosya:\tOK";
  1953. else
  1954. -- tempdir i sil çıkış yap
  1955. -- print("koskurdan sonra olmalı çakşm,log da silinmeli!!! not yet")
  1956. -- islem.kur.clean_tempdir(tempdir)
  1957. -- os.exit()
  1958. log="çakışan_dosya:\tOVERRIDE";
  1959. end
  1960. islem.debug.yaz(log);
  1961. else
  1962. log="dosya_kontrol:\tOK";
  1963. islem.debug.yaz(log);
  1964. end
  1965. islem.kur.logger:write(log.."\n")
  1966. end
  1967. function islem.kur.kurulu_kontrol(paket)
  1968. -- sistemde kurulu paket kontrolü
  1969. -- burada kurulu pakete uygulanacak seçenek sorulur
  1970. -- sil/silme
  1971. assert(paket,"islem.kur.kurulu_kontrol : paket is nil")
  1972. local log=""
  1973. if islem.paket.kurulu_kontrol(paket) then
  1974. log=messages.package_already_installed;
  1975. messages.package_already_installed:yaz(0);
  1976. else
  1977. log="kurulu_kontrol:\tOK";
  1978. end
  1979. islem.debug.yaz(log)
  1980. islem.kur.logger:write(log.."\n")
  1981. end
  1982. function islem.kur.job(kur)
  1983. -- dikkat ! sıralı kurmayabilir tablo şeklinde geliyor
  1984. -- işlemlerin logu hazırlanacak.
  1985. for tip,tablo in pairs(kur) do
  1986. -- burası sıralı iş
  1987. if kur[tip] then
  1988. for _,job in ipairs(tablo) do
  1989. islem.kur[tip](job)
  1990. end
  1991. end
  1992. end
  1993. end
  1994. function islem.kur.handler(input)
  1995. -- işlem isminden sonra en az bir parametre olmalıdır.
  1996. if #input > 1 then
  1997. -- kurulum işleri tablosu
  1998. local jobs={
  1999. agdan={},
  2000. yerelden={}
  2001. }
  2002. -- 1. girdiyi analiz et
  2003. -- girdiler çoğul kabul edilir boşluğa göre ayrıştırılır.
  2004. for index, girdi in ipairs(input) do
  2005. -- ilk parametre işlem tipi olacak pas geçilir.
  2006. if index == 1 then goto continue end
  2007. --talimat konum bul
  2008. if girdi:match("--kurkos=0") then islem.kur.kurkos=false
  2009. elseif girdi:match("--koskur=0") then islem.kur.koskur=false
  2010. elseif girdi:match("--otokos=0") then islem.kur.otokos=false
  2011. elseif girdi:match("--zorla") or girdi:match("--force") then islem.kur.zorla=true
  2012. elseif path_exists(girdi) and girdi:match("mps.lz") then
  2013. -- yerelden kurulacak
  2014. local _tk=get_abspath(girdi)
  2015. table.insert(jobs.yerelden,_tk)
  2016. -- dosyadan kurulacak
  2017. elseif girdi:match("^-%-dosya=(.*)$") then
  2018. local dosya=girdi:match("^-%-dosya=(.*)$")
  2019. if path_exists(dosya) then
  2020. for pk in (get_content(dosya)):gmatch("[^\r\n]+") do
  2021. local _talimatd=islem.talimat_bul.job(pk)
  2022. if _talimatd then
  2023. table.insert(jobs.agdan,_talimatd)
  2024. --print(_talimatd)
  2025. else
  2026. (messages.talimat_not_found..pk):yaz(0)
  2027. end
  2028. end
  2029. else
  2030. messages.file_not_found:format(dosya):yaz(0)
  2031. end
  2032. else
  2033. if girdi:match("/") then (messages.args_invalid..girdi):yaz(0) end
  2034. local _talimatd=islem.talimat_bul.job(girdi)
  2035. if _talimatd then
  2036. -- ağdan kurulacak
  2037. table.insert(jobs.agdan,_talimatd)
  2038. else
  2039. (messages.talimat_not_found..girdi):yaz(0)
  2040. end
  2041. end
  2042. ::continue::
  2043. end
  2044. islem.kur.job(jobs);
  2045. -- todo!!! işlemlerin logu okunacak
  2046. -- ("işlemlerin logu okunacak"):yaz(2)
  2047. else
  2048. (messages.usage..islem[_islem]["usage"]):yaz();
  2049. end
  2050. end
  2051. --------------------------------------------
  2052. --------Güncelleme İşlemleri-------------------
  2053. islem.guncelle={
  2054. retkey="guncelle:",
  2055. comment=messages.usage_updating_repos,
  2056. usage="mps guncelle",
  2057. betikdepo={isim="betikdepo",tnm="Betik",path=milispath},
  2058. talimatdepo={isim="talimatdepo",tnm="Git",path=talimatname}
  2059. }
  2060. -- apiler kısa_kodlar
  2061. -- -G paket veritabanları güncellenir.
  2062. islem.api.G={
  2063. usage="",
  2064. comment="",
  2065. }
  2066. islem.api.G.job=function (params)
  2067. local sira=params[2];return islem.guncelle.paketvt(sira)
  2068. end
  2069. -- -GG talimat depo güncellenir.
  2070. islem.api.GG={
  2071. usage="",
  2072. comment="",
  2073. }
  2074. islem.api.GG.job=function (params)
  2075. local sira=params[2];
  2076. return islem.guncelle.gitdepo(sira,islem.guncelle.talimatdepo)
  2077. end
  2078. -- -BG betik depo güncellenir.
  2079. islem.api.BG={
  2080. usage="",
  2081. comment="",
  2082. }
  2083. islem.api.BG.job=function (params)
  2084. local sira=params[2];
  2085. return islem.guncelle.gitdepo(sira,islem.guncelle.betikdepo)
  2086. end
  2087. -- -MG mps güncellenir.
  2088. islem.api.MG={
  2089. usage="",
  2090. comment=messages.comment_mps_update_self,
  2091. }
  2092. islem.api.MG.job=function (params)
  2093. return islem.guncelle.mps()
  2094. end
  2095. -- işlevler
  2096. function islem.guncelle.handler(input)
  2097. assert(#input>0,"girdi eksik parametre")
  2098. local sira=nil
  2099. local _islem=input[1]
  2100. if #input > 1 then sira=input[2] end
  2101. -- mps güncelleme
  2102. islem.guncelle.mps()
  2103. -- talimat depolarının güncelleme
  2104. islem.guncelle.gitdepo(sira,islem.guncelle.talimatdepo)
  2105. -- betik depolarının güncelleme
  2106. islem.guncelle.gitdepo(sira,islem.guncelle.betikdepo)
  2107. -- paketvt depoları güncelleme
  2108. islem.guncelle.paketvt(sira)
  2109. end
  2110. function islem.guncelle.mps()
  2111. -- todo!!! mps commit hash tutulacak oradan commit değer değişimi gösterilecek
  2112. -- değişim yoksa güncelleme yok
  2113. assert(path_exists(mps_path),"mps_path not exist")
  2114. assert(path_exists(mps_path.."/.git"),"invalid git directory");
  2115. ("MPS güncelleniyor:"):yaz(2);
  2116. ("------------------------------------"):yaz(2);
  2117. local komut="cd %s && git reset --hard HEAD && git pull && chmod +x bin/mps*"
  2118. local ret=shell(komut:format(mps_path));
  2119. -- ret=shell(git_kont:format(repo,tmp,tmp))
  2120. ("------------------------------------"):yaz(2)
  2121. end
  2122. function islem.guncelle.paketvt(sira)
  2123. ("Paket veritaban(lar)ı güncelleniyor:"):yaz(2);
  2124. ("------------------------------------"):yaz(2);
  2125. if not path_exists(kokdizin..islem.paket.cachedir) then
  2126. local create_cache=("mkdir -p %s%s"):format(kokdizin,islem.paket.cachedir)
  2127. shell(create_cache)
  2128. end
  2129. sira=tonumber(sira)
  2130. local pkvt="paket.vt"
  2131. -- işlev içinde işlev paket.vt i indirmek için
  2132. -- paket.vt.gz gibi sıkıştırılmış gerçekleme yapılacak. todo!!!
  2133. function _indir(sunucu,sira)
  2134. -- io.write(sunucu.."/"..pkvt.."\t")
  2135. local link=sunucu.."/"..pkvt
  2136. local body, code = http.request(link)
  2137. code=tostring(code)
  2138. if code:match("connection refused") then
  2139. messages.server_connection_refused:format(sunucu):yaz(3)
  2140. elseif code=="404" then
  2141. messages.paketvt_not_found:yaz(3)
  2142. elseif code == "200" then
  2143. local kayit=kokdizin..islem.paket.cachedir.."/"..pkvt.."#"..sira
  2144. local f = assert(io.open(kayit, 'wb'))
  2145. f:write(body)
  2146. f:close();
  2147. -- ("+"):yaz(1);
  2148. --kayit:yaz(2);
  2149. if path_exists(kayit) then
  2150. (link):yaz(1);
  2151. else
  2152. messages.redownloading:format(kayit):yaz(2)
  2153. _indir(sunucu,sira);
  2154. end
  2155. elseif not body then
  2156. (link):yaz(3);
  2157. else
  2158. messages.unknown_error:format(link):yaz(0)
  2159. end
  2160. end
  2161. -- eğer sadece bir paket sunucu güncellenmek istenirse
  2162. if sira then
  2163. -- sıra aşımlı paket vt güncelelnmek istenirse
  2164. if #ayar.sunucu < sira then
  2165. messages.package_db_out_of_order:yaz(0)
  2166. end
  2167. if ayar.sunucu[sira] then
  2168. _indir(ayar.sunucu[sira],sira)
  2169. end
  2170. -- çoklu sunucu güncelleme
  2171. else
  2172. for _sira,sunucu in ipairs(ayar.sunucu) do
  2173. _indir(sunucu,_sira)
  2174. end
  2175. end
  2176. ("------------------------------------"):yaz(2);
  2177. end
  2178. function islem.guncelle.gitdepo(sira,depo)
  2179. -- tip=betikdepo, gitdepo
  2180. -- depo={isim="betikdepo",tnm="Betik",path=milispath}
  2181. -- depo={isim="gitdepo",tnm="Git",path=talimatname}
  2182. -- bin, ayarlar lı betikdepo güncelleme yapılacak todo!!!
  2183. assert(depo,"depo is nil!!!");
  2184. (depo.tnm.." depoları güncelleniyor:"):yaz(2);
  2185. ("------------------------------------"):yaz(2);
  2186. function do_clone(repo,path)
  2187. local komut="git clone %s %s"
  2188. local ret=shell(komut:format(repo,path))
  2189. end
  2190. function do_pull(path)
  2191. assert(path_exists(path.."/.git"),"invalid git directory")
  2192. local komut="cd %s && git pull"
  2193. local ret=shell(komut:format(path))
  2194. end
  2195. function esitle(repoyol,altdizin,hedef)
  2196. -- todo!!! eşitlenecek dizinden sadece talimat içeren
  2197. -- dizinleri alarak eşitleme yap veya sonda silme
  2198. local komut="cp -rf %s/%s/* %s/"
  2199. if path_exists(repoyol.."/"..altdizin) then
  2200. shell(komut:format(repoyol, altdizin ,hedef))
  2201. else
  2202. messages.git_repo_subdir_not_found:yaz(0)
  2203. end
  2204. end
  2205. function yedekle(dizin)
  2206. local komut="mv %s %s.old"
  2207. if path_exists(dizin) then
  2208. shell(komut:format(dizin,dizin))
  2209. end
  2210. -- dizin yedeklenerek yeni boş oluşturulur.
  2211. assert(lfs.mkdir(dizin),dizin.." oluşturulamadı.")
  2212. end
  2213. local _repo=""
  2214. local _repoyol=""
  2215. local duzey=""
  2216. local tmp=shell("mktemp")
  2217. local eskisil="rm -rf %s.old"
  2218. -- git repo mevcut kontrol komut
  2219. local git_kont="git ls-remote -q %s > %s 2>&1;cat %s | head -n1 | awk '{print $1}'"
  2220. -- !!! burası farklı ayar.betikdepo
  2221. for bdepo,repolar in pairs(ayar[depo.isim]) do
  2222. -- !!! burası farklı
  2223. duzey=depo.path.."/"..bdepo
  2224. -- her talimat-betik düzeyinde yedekleme-eşitleme-eskiyi silme yapılacak
  2225. yedekle(duzey)
  2226. for repo,dizin in pairs(repolar) do
  2227. -- git repo mevcut kontrolü
  2228. ret=shell(git_kont:format(repo,tmp,tmp))
  2229. io.write(bdepo," ",repo," ",dizin)
  2230. if ret:match("fatal") then
  2231. ("\t-"):yaz(1)
  2232. else
  2233. -- Git işlemleri
  2234. -- repo netde mevcut ise, yerelde yoksa clone varsa pull yapılacak.
  2235. _repo=repo:gsub("https://", "")
  2236. _repo=_repo:gsub("http://", "")
  2237. _repo=_repo:gsub("/", ".")
  2238. print("\t",_repo)
  2239. _repoyol=kokdizin..ayar.repo_dizin.."/".._repo
  2240. if path_exists(_repoyol) then
  2241. do_pull(_repoyol)
  2242. else
  2243. do_clone(repo, _repoyol)
  2244. end
  2245. -- Eşitleme işlemleri
  2246. esitle(_repoyol,dizin,duzey)
  2247. end
  2248. end
  2249. -- sıra-talimat düzeyi işlemler bittikten sonra .old düzey silinir.
  2250. if path_exists(duzey..".old") then
  2251. shell(eskisil:format(duzey))
  2252. end
  2253. end
  2254. shell(("rm -f %s"):format(tmp));
  2255. ("------------------------------------"):yaz(2);
  2256. end
  2257. -- Mps İşlemleri ----------------------------
  2258. -- -v ile mps sürüm no gösterilir.
  2259. islem.api.v={
  2260. usage="",
  2261. comment="",
  2262. }
  2263. islem.api.v.job=function() islem.surum.handler() end
  2264. -- -ayar öntanımlı ayarlar yükler/kopyalar
  2265. islem.ayarla={
  2266. retkey="ayarla:",
  2267. comment=messages.usage_configure,
  2268. usage="mps ayarla",
  2269. }
  2270. function islem.ayarla.handler()
  2271. -- mps için conf.lua yükleme komutu
  2272. local komut="cp -f %s/conf/conf.lua.sablon %s/conf/conf.lua"
  2273. shell(komut:format(mps_path,mps_path))
  2274. end
  2275. islem.mps={
  2276. retkey="mps:",
  2277. version="MPS 2.0.5 - Milis Paket Sistemi milisarge@gmail.com",
  2278. _comment=messages.usage_mps,
  2279. }
  2280. islem.surum={}
  2281. function islem.surum.handler()
  2282. islem.mps.version:yaz(2)
  2283. end
  2284. ------------------------------------------------------------
  2285. -- -h mps yardım gösterilir.
  2286. islem.api.h={
  2287. usage="",
  2288. comment="",
  2289. }
  2290. islem.api.h.job=function() islem.help.handler() end
  2291. islem.help={
  2292. retkey="yardım:",
  2293. usage="mps -h",
  2294. }
  2295. function islem.help.handler()
  2296. local aralik=":"
  2297. print(messages.help)
  2298. print("-----------------")
  2299. for key,_ in pairs(islem) do
  2300. aralik=":"
  2301. if islem[key]["comment"] then
  2302. if #key<7 then aralik="\t:" end
  2303. print(key,aralik.." "..islem[key]["comment"])
  2304. end
  2305. end
  2306. print("-----------------")
  2307. for key,_ in pairs(islem.api) do
  2308. aralik=":"
  2309. if islem.api[key]["comment"] then
  2310. if #key<7 then aralik="\t:" end
  2311. print("-"..key,aralik.." "..islem.api[key]["comment"])
  2312. end
  2313. end
  2314. end
  2315. -----------------------------------------
  2316. -- Debug işlemleri
  2317. islem.debug={
  2318. retkey="debug",
  2319. }
  2320. function islem.debug.yaz(log)
  2321. if debug then
  2322. if log then
  2323. log:yaz()
  2324. else
  2325. messages.empty_log:yaz(0)
  2326. end
  2327. end
  2328. end
  2329. -----------------------------------------
  2330. -- İşlevlerin Test İşlemi ----------------------------
  2331. -- islem.a.b.c işleminin tesit için . karakterine göre ayrıştırıp
  2332. -- dizide öyle çağırmak gerekir.
  2333. islem.test={
  2334. retkey="test:",
  2335. }
  2336. islem.api.test={
  2337. usage="",
  2338. comment="",
  2339. }
  2340. islem.api.test.job=function() islem.test.case1() end
  2341. function islem.test.handler(f1)
  2342. local islev=f1[2]
  2343. assert(islev,"islem.test.handler : f1 is nil")
  2344. print (islev);
  2345. islem.test[islev]()
  2346. _G[islev]()
  2347. end
  2348. function islem.test.case1()
  2349. print(hash_check("/tmp/ttt","sadsfsef"))
  2350. end
  2351. function islem.test.hello()
  2352. print("merhaba")
  2353. end
  2354. function hello()
  2355. print("merhaba2")
  2356. end
  2357. -----------------------------------------
  2358. -- parse arguments / burası sadece ana parsing olsun
  2359. -- her işlemin girdi parseri ayrı olacak
  2360. -- ilk parametre işlem olmalı
  2361. if #arg < 1 then
  2362. -- en az bir parametre belirtilmeli
  2363. --messages.args_at_least_one:yaz(0)
  2364. -- yardım menüsünün gösterilmesi
  2365. print(islem.mps.version)
  2366. print(islem.mps._comment)
  2367. islem.help.handler()
  2368. os.exit();
  2369. end
  2370. -- cli arg to global params variable
  2371. params=arg
  2372. -- bu aşamada --color gibi çıktı tipleri vs opsiyonlar elimine edilmeli
  2373. -- sonra sadeleşmiş hedef işlem ve girdileri kalmalı
  2374. -- global ayarlar analiz edilir
  2375. authorised_check()
  2376. color_check()
  2377. debug_check()
  2378. root_check()
  2379. mps_init_check()
  2380. mps_initfs_check()
  2381. confirm_check()
  2382. -- mps için gerekli init dizinlerin kontrolü
  2383. -- req_dir_check()
  2384. --en son parametreler sadeleştirilir (false paramlar silinir)
  2385. re_param()
  2386. -- ilk paramtre olarak işlem gelmeli
  2387. _islem=params[1]
  2388. if _islem == nil then os.exit() end
  2389. local _api=""
  2390. if _islem:sub(0,1) == "-" then
  2391. _api=_islem:sub(2)
  2392. end
  2393. if islem[_islem] then
  2394. -- print(_islem," işlemi yapılacak")
  2395. -- ilgili işlem kuralı çağıralacak /handler veya handler olabilir.
  2396. -- param analiz ve thread tanımlama işleri için
  2397. -- işlem parseri geri kalan parametreleri analiz edecek
  2398. local key = "handler"
  2399. if islem[_islem][key] then
  2400. islem[_islem]["handler"](params)
  2401. else
  2402. (messages.handler_not_found.._islem):yaz(0)
  2403. end
  2404. -- - ile başlayan parametreleri işleyebilmek için
  2405. -- -kk ı kk ile islem.api içinde kontro edip
  2406. -- ilgili işlevi çağıracak.
  2407. elseif islem.api[_api] then
  2408. islem.api[_api]["job"](params)
  2409. --_G[islem.api[_api]](params)
  2410. else
  2411. (messages.args_invalid.._islem):yaz(0)
  2412. end
  2413. -- todo list
  2414. --[[
  2415. ("---------TODO-LIST------------------"):yaz(1);
  2416. ("mtree s256sum sorun !!!"):yaz();
  2417. ("pktlibler so düzgün tespit edilemiyor/ncurses bknz"):yaz();
  2418. ("talimatın yanndaki dosyalar/yama vs"):yaz();
  2419. ("çakışan dosyaları oto sil-onsistemde lazım oluyor"):yaz();
  2420. ("thash olayı derle.sh gibi dosyalar da olunca mantıklı olmuyor!-talimat dizini kamusun hashle"):yaz();
  2421. ("paket sil.logda harici diizn yerine kokdizinsiz yazdırma"):yaz();
  2422. ("pktlib,libgerek tespitinde eksiklik ve harici dizinle yazılıyor!"):yaz();
  2423. ("kurulumda kurkos pasif ederek kurdurma"):yaz();
  2424. ("-y veya işlem onay parametresi eklenecek-genele/kur-işlem bazlı?"):yaz();
  2425. ("SİLKOŞ - KOŞSİL TEST EDİLECEK"):yaz();
  2426. ("shell komutları uygulandığına dair assert(veya expect) edilmeli -"):yaz();
  2427. ("------------------------------------"):yaz(1);
  2428. ]]--