[CentOS] Szelektiv updater YUM-hoz

 ( hrgy84 | 2016. október 6., csütörtök - 17:12 )

Szegyen, nem szegyen, nagyon hianyzik egy aptitude szintu CLI csomagfrontend a CentOS-ekrol, ami megtalalhato az alapertelmezett tarolokban. Mivel ilyen nincs, es nem is hiszem, hogy lesz, ezert osszeutottem egy teljesen basic, csak a praktikumra torekvo scriptet, hogy szelektiven is lehessen frissiteni a csomagokat, ha valamiert nem akarunk egyben mindent.

A hasznalata rem egyszeru, kilistazza a frissitheto csomagokat, es nekunk vagy a csomag elott levo szamot, vagy pedig egy tol-ig erteket kell megadnunk, ket ponttal elvalasztva (tehat 5..15). Ezutan elindul egy "yum install", ami fellistazza, hogy mi fog rendszerunkkel tortenni, es megkerdezi, hogy mehet-e. Ha igen, a telepitesek megtortennek.

Amik ismert problemak:

- A kod egy ponton ruby eval-t futtat minimalis sanitization mellett. A range-ok ertelmes kezelese bonyolultabb lett volna. Gonosz, gonosz eval.
- CentOS 5-on kiakadhat a script, mert az ottani yum-nak problemai vannak a -d / -e / -q kapcsolok kezelesevel. Nem probaltam ki, nem is tervezem, egy darab ilyen gepunk van, ami tobbszorosen is halalra van itelve, a magam reszerol nem itelem fontosnak a megoldasat a problemanak. Patches are welcome.

Akkor tehat a script:

#!/usr/bin/env ruby

require 'pp'

packages = %x{yum -d 0 -e 0 -q list updates}.split(/[\r\n]+/).map { |l| l.split(/\s+/).first }
packages = packages.compact.sort.uniq.find_all { |p| p != '' and p != 'Updated' }



puts " * Choose updateable packages:"
puts
packages.each_with_index do |pkg, i|
  puts "#{sprintf "%3d", i}) #{pkg}"
end
puts ' ' + '=' * 40
print "Selection (e.g. 0 5..15): "

ans = STDIN.readline.strip

sels = ans.split(/\s+/).find_all { |a| a.match(/\A\d+(\.\.\d+)?/) }

if sels.empty?
  puts "Nothing to do or invalid input, exiting"
  exit
end

indexes = sels.collect do |sel|
  s=eval(sel) rescue nil
  s.is_a?(Range) ? s.to_a : s unless s.nil?
end.flatten.sort.uniq

doing = indexes.map { |i| "#{packages[i]}" }

puts "yum install #{doing.join(' ')}"
system "yum install #{doing.join(' ')}"