Class: RosettAi::PackageManager::Apt

Inherits:
Base
  • Object
show all
Defined in:
lib/rosett_ai/package_manager/apt.rb

Overview

APT package manager backend for Debian-based systems.

Uses pkexec for privilege escalation (install/remove). All commands use array-form system() for security.

Author:

  • hugo

  • claude

Constant Summary collapse

DPKG_QUERY =

Returns Path to the dpkg-query binary.

Returns:

  • (String)

    Path to the dpkg-query binary.

'dpkg-query'
APT_CACHE =

Returns Path to the apt-cache binary.

Returns:

  • (String)

    Path to the apt-cache binary.

'apt-cache'
PKEXEC =

Returns Path to the pkexec binary for privilege escalation.

Returns:

  • (String)

    Path to the pkexec binary for privilege escalation.

'pkexec'
APT_GET =

Returns Path to the apt-get binary.

Returns:

  • (String)

    Path to the apt-get binary.

'apt-get'

Instance Method Summary collapse

Instance Method Details

#available?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/rosett_ai/package_manager/apt.rb', line 32

def available?
  system(DPKG_QUERY, '--version', out: File::NULL, err: File::NULL) == true
end

#available_packages(pattern) ⇒ Array<Hash>

Search for available .deb packages via apt-cache.

Parameters:

  • pattern (String)

Returns:

  • (Array<Hash>)


68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rosett_ai/package_manager/apt.rb', line 68

def available_packages(pattern)
  validate_package_name!(pattern)
  output = run_command(APT_CACHE, 'search', pattern)
  return [] unless output

  output.each_line.filter_map do |line|
    name, description = line.strip.split(' - ', 2)
    next unless name && description

    { name: name.strip, description: description.strip }
  end
end

#backend_nameString

Returns:

  • (String)


27
28
29
# File 'lib/rosett_ai/package_manager/apt.rb', line 27

def backend_name
  'apt'
end

#install(package_name) ⇒ Boolean

Install a .deb package via pkexec + apt-get.

Parameters:

  • package_name (String)

Returns:

  • (Boolean)


40
41
42
43
# File 'lib/rosett_ai/package_manager/apt.rb', line 40

def install(package_name)
  validate_package_name!(package_name)
  system(PKEXEC, APT_GET, 'install', '-y', package_name, out: File::NULL)
end

#installed?(package_name) ⇒ Boolean

Check if a .deb package is installed via dpkg-query.

Parameters:

  • package_name (String)

Returns:

  • (Boolean)


58
59
60
61
62
# File 'lib/rosett_ai/package_manager/apt.rb', line 58

def installed?(package_name)
  validate_package_name!(package_name)
  system(DPKG_QUERY, '-W', '-f', '${Status}', package_name,
         out: File::NULL, err: File::NULL) == true
end

#remove(package_name) ⇒ Boolean

Remove a .deb package via pkexec + apt-get.

Parameters:

  • package_name (String)

Returns:

  • (Boolean)


49
50
51
52
# File 'lib/rosett_ai/package_manager/apt.rb', line 49

def remove(package_name)
  validate_package_name!(package_name)
  system(PKEXEC, APT_GET, 'remove', '-y', package_name, out: File::NULL)
end

#update_indexBoolean

Update APT index via pkexec + apt-get.

Returns:

  • (Boolean)


84
85
86
# File 'lib/rosett_ai/package_manager/apt.rb', line 84

def update_index
  system(PKEXEC, APT_GET, 'update', out: File::NULL)
end