slack-utils 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +77 -0
- data/bin/slf +41 -0
- data/bin/slfindlinked +7 -0
- data/bin/sll +38 -0
- data/bin/slo +15 -0
- data/bin/slp +36 -0
- data/bin/slt +40 -0
- data/examples/before_then.rb +11 -0
- data/examples/list_packages.rb +17 -0
- data/examples/repo.rb +14 -0
- data/examples/repo_difference.rb +17 -0
- data/lib/slackware/package.rb +193 -0
- data/lib/slackware/repo.rb +142 -0
- data/lib/slackware/system.rb +165 -0
- data/lib/slackware/utils.rb +264 -0
- data/lib/slackware.rb +3 -0
- metadata +105 -0
data/README.rdoc
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
= slackware utilities
|
2
|
+
|
3
|
+
== Summary
|
4
|
+
|
5
|
+
A ruby library to access information on the Slackware Linux distribution
|
6
|
+
|
7
|
+
== Description
|
8
|
+
|
9
|
+
slack-utils
|
10
|
+
|
11
|
+
slp - shows installed slackware packages
|
12
|
+
with no args, it will show all.
|
13
|
+
or for each arg it will search the package names.
|
14
|
+
|
15
|
+
slf - search installed slackware packages for a file
|
16
|
+
this expects an arg(s), and will output, in grep fashion
|
17
|
+
packages matching your search args.
|
18
|
+
|
19
|
+
slt - mtime/install time of slackware packages
|
20
|
+
with no args, it will show all.
|
21
|
+
or for each arg it will search the package names.
|
22
|
+
|
23
|
+
sll - list the contents of packages matching the
|
24
|
+
|
25
|
+
slo - find files in /etc/, that have been orphaned and left behind
|
26
|
+
by unistalled/upgraded packages
|
27
|
+
|
28
|
+
slfindlinked - finds what is linked to your argument, and it's package
|
29
|
+
expects 1 argument passed.
|
30
|
+
|
31
|
+
|
32
|
+
TODO:
|
33
|
+
* 2010-08-20 09:16 <bailey> which is that I need to run a query to show
|
34
|
+
me what packages I'm running are different than the slack-current
|
35
|
+
versions, since I make local ones and forget about it
|
36
|
+
* enable `slf` to a relative path, and it determine the absolute path
|
37
|
+
|
38
|
+
== Installation
|
39
|
+
|
40
|
+
To install the gem
|
41
|
+
sudo gem install pkg/slack-utils-0.5.0.gem
|
42
|
+
|
43
|
+
== Quick Start
|
44
|
+
|
45
|
+
Install the gem as above.
|
46
|
+
|
47
|
+
Start using the library
|
48
|
+
|
49
|
+
$ irb
|
50
|
+
>> require 'rubygems'
|
51
|
+
>> require 'slackware'
|
52
|
+
>> pkg = Slackware::Packware.new()
|
53
|
+
>> pkg.name = "hello-kitty"
|
54
|
+
>> pkg.version = "1.0"
|
55
|
+
|
56
|
+
or
|
57
|
+
>> require 'rubygems'
|
58
|
+
>> require 'slackware'
|
59
|
+
>> tags = Slackware::System.tags_used
|
60
|
+
=> ["SBo","alien","rlw"]
|
61
|
+
|
62
|
+
== Usage
|
63
|
+
=== Show data
|
64
|
+
|
65
|
+
<b>Note: </b>
|
66
|
+
|
67
|
+
==== Examples
|
68
|
+
see the exmamples/ files
|
69
|
+
|
70
|
+
== Help
|
71
|
+
There are many more methods than are documented on this page. Please explore
|
72
|
+
the RDOC to find more functionality.
|
73
|
+
|
74
|
+
For more complex examples, please see the examples directory
|
75
|
+
(GEM_ROOT/gems/slack-utils-<version>/examples/).
|
76
|
+
|
77
|
+
You can also contact me for more help or suggestions.
|
data/bin/slf
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'trollop'
|
5
|
+
require 'slackware/utils'
|
6
|
+
|
7
|
+
opts = Trollop::options do
|
8
|
+
banner <<-EOS
|
9
|
+
|
10
|
+
search for a file within installed Slackware package's FILE LIST.
|
11
|
+
|
12
|
+
Usage:
|
13
|
+
slf [options] [pkg search flags] <one of more files>
|
14
|
+
|
15
|
+
one or more files must be list
|
16
|
+
if no search flags, only names, then those only those matching entries are listed
|
17
|
+
EOS
|
18
|
+
opt :pkg, "Package PKGNAME (loose match)", :type => :string
|
19
|
+
opt :Version, "Package VERSION (loose match)", :type => :string
|
20
|
+
opt :arch, "Package ARCH (exact match)", :type => :string
|
21
|
+
opt :build, "Package BUILD (exact match)", :type => :string
|
22
|
+
opt :tag, "Package TAG (loose match)", :type => :string
|
23
|
+
end
|
24
|
+
|
25
|
+
if (ARGV.count > 0)
|
26
|
+
opts[:all] = true
|
27
|
+
end
|
28
|
+
|
29
|
+
if (ARGV.count == 0)
|
30
|
+
Trollop::die("one or more files must be provided")
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
print_package_searched_files(build_packages(opts, []), ARGV)
|
35
|
+
rescue Interrupt
|
36
|
+
exit 0
|
37
|
+
rescue Exception => e
|
38
|
+
puts "ERROR: #{e.message}"
|
39
|
+
exit 1
|
40
|
+
end
|
41
|
+
|
data/bin/slfindlinked
ADDED
data/bin/sll
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'trollop'
|
5
|
+
require 'slackware/utils'
|
6
|
+
|
7
|
+
opts = Trollop::options do
|
8
|
+
banner <<-EOS
|
9
|
+
|
10
|
+
List owned files for a given Slackware package.
|
11
|
+
|
12
|
+
Usage:
|
13
|
+
sll [options] [search flags] [list of names]
|
14
|
+
|
15
|
+
if no search flags, only names, then those only those matching entries are listed
|
16
|
+
|
17
|
+
EOS
|
18
|
+
opt :pkg, "Package PKGNAME (loose match)", :type => :string
|
19
|
+
opt :Version, "Package VERSION (loose match)", :type => :string
|
20
|
+
opt :arch, "Package ARCH (exact match)", :type => :string
|
21
|
+
opt :build, "Package BUILD (exact match)", :type => :string
|
22
|
+
opt :tag, "Package TAG (loose match)", :type => :string
|
23
|
+
opt :force, "force me to show all files", :type => :boolean
|
24
|
+
end
|
25
|
+
|
26
|
+
# handing through that we are listing owned files
|
27
|
+
opts[:list_files] = true
|
28
|
+
|
29
|
+
if (opts.keys.grep(/[pkg|Version|arch|build|tag]_given$/).count == 0 && not(opts[:force]))
|
30
|
+
Trollop::die("force me if you really want to see all files ...")
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
print_package_file_list(build_packages(opts, ARGV))
|
35
|
+
rescue Interrupt
|
36
|
+
exit 0
|
37
|
+
end
|
38
|
+
|
data/bin/slo
ADDED
data/bin/slp
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'trollop'
|
5
|
+
require 'slackware/utils'
|
6
|
+
|
7
|
+
opts = Trollop::options do
|
8
|
+
banner <<-EOS
|
9
|
+
|
10
|
+
List installed Slackware packages.
|
11
|
+
|
12
|
+
Usage:
|
13
|
+
slp [options] [search flags] [list of names]
|
14
|
+
|
15
|
+
if no flags are used, then all entries are listed
|
16
|
+
if no search flags, only names, then those only those matching entries are listed
|
17
|
+
|
18
|
+
EOS
|
19
|
+
opt :color, "Colorize output", :type => :boolean
|
20
|
+
opt :pkg, "Package PKGNAME (loose match)", :type => :string
|
21
|
+
opt :Version, "Package VERSION (loose match)", :type => :string
|
22
|
+
opt :arch, "Package ARCH (exact match)", :type => :string
|
23
|
+
opt :build, "Package BUILD (exact match)", :type => :string
|
24
|
+
opt :tag, "Package TAG (loose match)", :type => :string
|
25
|
+
end
|
26
|
+
|
27
|
+
if (ARGV.count > 0)
|
28
|
+
opts[:all] = true
|
29
|
+
end
|
30
|
+
|
31
|
+
begin
|
32
|
+
print_packages(build_packages(opts, ARGV))
|
33
|
+
rescue Interrupt
|
34
|
+
exit 0
|
35
|
+
end
|
36
|
+
|
data/bin/slt
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'trollop'
|
5
|
+
require 'slackware/utils'
|
6
|
+
|
7
|
+
opts = Trollop::options do
|
8
|
+
banner <<-EOS
|
9
|
+
|
10
|
+
List (and search) installed Slackware package's times.
|
11
|
+
|
12
|
+
Usage:
|
13
|
+
slt [options] [search flags] [list of names]
|
14
|
+
|
15
|
+
if no flags are used, then all entries are listed
|
16
|
+
if no search flags, only names, then those only those matching entries are listed
|
17
|
+
|
18
|
+
EOS
|
19
|
+
opt :color, "Colorize output", :default => false, :type => :boolean
|
20
|
+
opt :epoch, "show time in seconds since 1970-01-01 00:00:00 UTC", :type => :boolean
|
21
|
+
opt :pkg, "Package PKGNAME (loose match)", :type => :string
|
22
|
+
opt :Version, "Package VERSION (loose match)", :type => :string
|
23
|
+
opt :arch, "Package ARCH (exact match)", :type => :string
|
24
|
+
opt :build, "Package BUILD (exact match)", :type => :string
|
25
|
+
opt :tag, "Package TAG (loose match)", :type => :string
|
26
|
+
end
|
27
|
+
|
28
|
+
# handing through that we are gathering times too
|
29
|
+
opts[:time] = true
|
30
|
+
|
31
|
+
if (opts.keys.grep(/[pkg|Version|arch|build|tag]_given$/).count == 0)
|
32
|
+
opts[:all] = true
|
33
|
+
end
|
34
|
+
|
35
|
+
begin
|
36
|
+
print_packages_times(build_packages(opts, ARGV), opts[:epoch])
|
37
|
+
rescue Interrupt
|
38
|
+
exit 0
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
$: << File.absolute_path(File.dirname(__FILE__) + "/../lib")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'slackware'
|
7
|
+
|
8
|
+
puts "tags used are: " + Slackware::System.tags_used.to_s
|
9
|
+
|
10
|
+
pkg = "kernel-modules"
|
11
|
+
if (Slackware::System.is_upgraded?(pkg))
|
12
|
+
puts pkg + " has been upgraded before"
|
13
|
+
Slackware::System.upgrades(pkg).each {|up| printf("%s upgraded from version %s\n", up.upgrade_time, up.version) }
|
14
|
+
else
|
15
|
+
puts pkg + " apparently has not ever been upgraded before"
|
16
|
+
end
|
17
|
+
|
data/examples/repo.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
$: << File.absolute_path(File.dirname(__FILE__) + "/../lib")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'slackware/repo'
|
7
|
+
|
8
|
+
sr = Slackware::Repo.new
|
9
|
+
sr.version = "current"
|
10
|
+
|
11
|
+
sr.set_packages
|
12
|
+
|
13
|
+
printf("%d packages in the slackware%s-%s repo\n", sr.packages.count, sr.arch, sr.version)
|
14
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
$: << File.absolute_path(File.dirname(__FILE__) + "/../lib")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'slackware'
|
7
|
+
|
8
|
+
pkgs = Slackware::System.installed_packages.map {|p| p.name }
|
9
|
+
sr = Slackware::Repo.new
|
10
|
+
sr.version = "current"
|
11
|
+
c = sr.get_changelog
|
12
|
+
|
13
|
+
printf("difference between current installation and %s...\n", sr.version)
|
14
|
+
printf("%d should be removed\n", (pkgs & c[:removed].map {|p| p.name }).count)
|
15
|
+
#p pkgs & c[:removed].map {|p| p.name }
|
16
|
+
ca = c[:added].map {|p| p.name }
|
17
|
+
printf("%d should be added\n", (ca.count - (pkgs & ca).count))
|
@@ -0,0 +1,193 @@
|
|
1
|
+
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Slackware
|
5
|
+
class Package
|
6
|
+
attr_accessor :time, :path, :file, :name, :version, :arch, :build, :tag, :tag_sep, :upgrade_time, :owned_files
|
7
|
+
def initialize(name = nil)
|
8
|
+
self.name = name
|
9
|
+
end
|
10
|
+
|
11
|
+
# pkg.parse instance method for parsing the package information
|
12
|
+
def parse(name)
|
13
|
+
if name.include?("/")
|
14
|
+
self.path = File.dirname(name)
|
15
|
+
name = File.basename(name)
|
16
|
+
end
|
17
|
+
if (name =~ RE_REMOVED_NAMES)
|
18
|
+
name = $1
|
19
|
+
self.upgrade_time = Time.strptime($2 + ' ' + $3, fmt='%F %H:%M:%S')
|
20
|
+
end
|
21
|
+
arr = name.split('-').reverse
|
22
|
+
build = arr.shift
|
23
|
+
if (build.include?("_"))
|
24
|
+
self.tag_sep = "_"
|
25
|
+
self.build = build.split(self.tag_sep)[0]
|
26
|
+
self.tag = build.split(self.tag_sep)[1..-1].join(self.tag_sep)
|
27
|
+
elsif (build =~ RE_BUILD_TAG)
|
28
|
+
self.build = $1
|
29
|
+
self.tag = $2
|
30
|
+
else
|
31
|
+
self.build = build
|
32
|
+
end
|
33
|
+
self.arch = arr.shift
|
34
|
+
self.version = arr.shift
|
35
|
+
self.name = arr.reverse.join('-')
|
36
|
+
end
|
37
|
+
|
38
|
+
# Package.parse class method
|
39
|
+
def self::parse(name)
|
40
|
+
p = self.new()
|
41
|
+
p.parse(name)
|
42
|
+
return p
|
43
|
+
end
|
44
|
+
|
45
|
+
# Reassemble the package name as it would be in file form
|
46
|
+
def fullname
|
47
|
+
if (self.upgrade_time)
|
48
|
+
time = self.upgrade_time.strftime("%F,%H:%M:%S")
|
49
|
+
return [self.name, self.version, self.arch, [self.build, self.tag].join(self.tag_sep), "upgraded", time].join("-")
|
50
|
+
else
|
51
|
+
return [self.name, self.version, self.arch, [self.build, self.tag].join(self.tag_sep)].join("-")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Accessor for the PACKAGE DESCRIPTION from the package file
|
56
|
+
def package_description
|
57
|
+
if not(@package_description.nil?)
|
58
|
+
return @package_description
|
59
|
+
end
|
60
|
+
|
61
|
+
f = File.open(self.path + '/' + self.fullname)
|
62
|
+
while true
|
63
|
+
if (f.readline =~ /^PACKAGE DESCRIPTION:\s+(.*)$/)
|
64
|
+
desc = f.take_while {|l| not(l =~ /FILE LIST:/) }.map {|l| l.sub(/^#{self.name}:\s*/, '').chomp }
|
65
|
+
return desc
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Setter for the PACKAGE DESCRIPTION, in the event you are parsing a repo file
|
71
|
+
def package_description=(desc)
|
72
|
+
@package_description = desc
|
73
|
+
end
|
74
|
+
|
75
|
+
# Accessor for the PACKAGE LOCATION from the package file
|
76
|
+
def package_location
|
77
|
+
if not(@package_location.nil?)
|
78
|
+
return @package_location
|
79
|
+
end
|
80
|
+
|
81
|
+
f = File.open(self.path + '/' + self.fullname)
|
82
|
+
while true
|
83
|
+
if (f.readline =~ /^PACKAGE LOCATION:\s+(.*)$/)
|
84
|
+
return $1
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Setter for the PACKAGE LOCATION, in the event you are parsing a repo file
|
90
|
+
def package_location=(path)
|
91
|
+
@package_location = path
|
92
|
+
end
|
93
|
+
|
94
|
+
# Accessor for the UNCOMPRESSED PACKAGE SIZE from the package file
|
95
|
+
def uncompressed_size
|
96
|
+
if not(@uncompressed_size.nil?)
|
97
|
+
return @uncompressed_size
|
98
|
+
end
|
99
|
+
|
100
|
+
f = File.open(self.path + '/' + self.fullname)
|
101
|
+
while true
|
102
|
+
if (f.readline =~ /^UNCOMPRESSED PACKAGE SIZE:\s+(.*)$/)
|
103
|
+
return $1
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Setter for the UNCOMPRESSED PACKAGE SIZE, in the event you are parsing a repo file
|
109
|
+
def uncompressed_size=(size)
|
110
|
+
@uncompressed_size = size
|
111
|
+
end
|
112
|
+
|
113
|
+
# Accessor for the COMPRESSED PACKAGE SIZE from the package file
|
114
|
+
def compressed_size
|
115
|
+
if not(@compressed_size.nil?)
|
116
|
+
return @compressed_size
|
117
|
+
end
|
118
|
+
|
119
|
+
f = File.open(self.path + '/' + self.fullname)
|
120
|
+
while true
|
121
|
+
if (f.readline =~ /^COMPRESSED PACKAGE SIZE:\s+(.*)$/)
|
122
|
+
return $1
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Setter for the COMPRESSED PACKAGE SIZE, in the event you are parsing a repo file
|
128
|
+
def compressed_size=(size)
|
129
|
+
@compressed_size = size
|
130
|
+
end
|
131
|
+
|
132
|
+
# Accessor for the FILE LIST from the package file
|
133
|
+
# unless the :owned_files symbol is populated
|
134
|
+
def get_owned_files
|
135
|
+
if not(@owned_files.nil?)
|
136
|
+
return @owned_files
|
137
|
+
else
|
138
|
+
f = File.open(self.path + '/' + self.fullname)
|
139
|
+
files = f.drop_while {|l| not( l =~ /^FILE LIST:/) }[2..-1].map {|l| l.chomp }
|
140
|
+
f.close
|
141
|
+
return files
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Set the file list in the package object in memory
|
146
|
+
def set_owned_files
|
147
|
+
if @owned_files.nil?
|
148
|
+
@owned_files = self.get_owned_files
|
149
|
+
return true
|
150
|
+
else
|
151
|
+
return false
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# populates and returns self.time
|
156
|
+
def get_time
|
157
|
+
if (self.time.nil? && self.path)
|
158
|
+
if (File.exist?(self.path + "/" + self.fullname))
|
159
|
+
self.time = File.mtime(self.path + "/" + self.fullname)
|
160
|
+
end
|
161
|
+
elsif (self.time.nil? && not(self.path))
|
162
|
+
if (File.exist?(DIR_INSTALLED_PACKAGES + "/" + self.fullname))
|
163
|
+
self.time = File.mtime(DIR_INSTALLED_PACKAGES + "/" + self.fullname)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
return self.time
|
167
|
+
end
|
168
|
+
|
169
|
+
# Fill in the path information
|
170
|
+
def get_path
|
171
|
+
if (self.path.nil? && File.exist?(DIR_INSTALLED_PACKAGES + "/" + self.name))
|
172
|
+
self.path = DIR_INSTALLED_PACKAGE
|
173
|
+
return DIR_INSTALLED_PACKAGE
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
class Script < Package
|
180
|
+
attr_accessor :script
|
181
|
+
|
182
|
+
def initialize(name = nil)
|
183
|
+
self.script = true
|
184
|
+
super
|
185
|
+
end
|
186
|
+
|
187
|
+
def parse(name)
|
188
|
+
super
|
189
|
+
self.script = true
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
|
2
|
+
require 'slackware/package'
|
3
|
+
require 'slackware/system'
|
4
|
+
require 'net/http'
|
5
|
+
require 'net/ftp'
|
6
|
+
require 'rbconfig'
|
7
|
+
|
8
|
+
module Slackware
|
9
|
+
|
10
|
+
# Stub
|
11
|
+
class Repo
|
12
|
+
RE_PACKAGE_NAME = Regexp.new(/^PACKAGE NAME:\s+(.*)\.t[gbx]z\s*/)
|
13
|
+
RE_PACKAGE_LOCATION = Regexp.new(/^PACKAGE LOCATION:\s+(.*)$/)
|
14
|
+
RE_COMPRESSED_SIZE = Regexp.new(/^PACKAGE SIZE \(compressed\):\s+(.*)$/)
|
15
|
+
RE_UNCOMPRESSED_SIZE = Regexp.new(/^PACKAGE SIZE \(uncompressed\):\s+(.*)$/)
|
16
|
+
|
17
|
+
attr_accessor :proto, :mirror, :path, :version, :arch, :changelog, :packages
|
18
|
+
|
19
|
+
def initialize(repo = nil)
|
20
|
+
@packages = nil
|
21
|
+
if (repo.nil?)
|
22
|
+
self.proto = "ftp://"
|
23
|
+
self.mirror = "ftp.osuosl.org"
|
24
|
+
self.path = "/pub/slackware/"
|
25
|
+
self.version = begin
|
26
|
+
v = Slackware::System.version
|
27
|
+
if v =~ /(\d+)\.(\d+)\.\d+/
|
28
|
+
v = $1 + "." + $2
|
29
|
+
end
|
30
|
+
v
|
31
|
+
end
|
32
|
+
self.arch = begin
|
33
|
+
a = RbConfig::CONFIG["arch"]
|
34
|
+
if a =~ /x86_64/
|
35
|
+
a = "64"
|
36
|
+
else
|
37
|
+
a = ""
|
38
|
+
end
|
39
|
+
a
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def fetch(file = nil)
|
45
|
+
if file.nil?
|
46
|
+
url = URI.parse(self.proto + self.mirror + self.path)
|
47
|
+
else
|
48
|
+
url = URI.parse(self.proto + self.mirror + self.path + file)
|
49
|
+
end
|
50
|
+
if self.proto =~ /ftp/
|
51
|
+
ftp = Net::FTP.open(self.mirror)
|
52
|
+
ftp.login
|
53
|
+
ftp.chdir(self.path + "slackware" + self.arch + "-" + self.version)
|
54
|
+
if (file.nil?)
|
55
|
+
data = ftp.list('*')
|
56
|
+
else
|
57
|
+
data = ftp.gettextfile(file, nil)
|
58
|
+
end
|
59
|
+
ftp.close
|
60
|
+
return data
|
61
|
+
elsif self.proto =~ /http/
|
62
|
+
# XXX this is not working yet
|
63
|
+
req = Net::HTTP::Get.new(url.path)
|
64
|
+
res = Net::HTTP.start(url.host, url.port) {|http| http.request(req) }
|
65
|
+
return res
|
66
|
+
else
|
67
|
+
return nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Pkg count that _should_ be removed
|
72
|
+
# pkgs = Slackware::System.installed_packages
|
73
|
+
# sr = Slackware::Repo.new
|
74
|
+
# sr.version = "current"
|
75
|
+
# c = get_changelog
|
76
|
+
#(pkgs.map {|p| p.fullname } & c[:removed].map {|p| p.fullname }).count
|
77
|
+
def get_changelog
|
78
|
+
if (@changelog.nil?)
|
79
|
+
changelog = {}
|
80
|
+
changelog_date = fetch("ChangeLog.txt").split(/\n/)
|
81
|
+
actions = %w{removed added upgraded rebuilt}
|
82
|
+
actions.each {|action|
|
83
|
+
changelog[:"#{action}"] = changelog_date.map {|line|
|
84
|
+
if line =~ /^\w+\/(.*)\.t[gx]z:\s+#{action}\.?$/i
|
85
|
+
Slackware::Package.parse($1)
|
86
|
+
end
|
87
|
+
}.compact
|
88
|
+
}
|
89
|
+
return changelog
|
90
|
+
else
|
91
|
+
return @changelog
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def set_changelog
|
96
|
+
@changelog = get_changelog
|
97
|
+
return nil
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_packages
|
101
|
+
if (@packages.nil?)
|
102
|
+
pkgs = []
|
103
|
+
fetch("PACKAGES.TXT").split(/\n\n/).each {|p_block|
|
104
|
+
p_block = p_block.split(/\n/).reject {|cell| cell if cell == "" }
|
105
|
+
if (p_block.shift =~ RE_PACKAGE_NAME)
|
106
|
+
pkg = Slackware::Package.parse($1)
|
107
|
+
|
108
|
+
p_block.shift =~ RE_PACKAGE_LOCATION
|
109
|
+
pkg.package_location = $1
|
110
|
+
|
111
|
+
p_block.shift =~ RE_COMPRESSED_SIZE
|
112
|
+
pkg.compressed_size = $1
|
113
|
+
|
114
|
+
p_block.shift =~ RE_UNCOMPRESSED_SIZE
|
115
|
+
pkg.uncompressed_size = $1
|
116
|
+
|
117
|
+
# This is the empty PACKAGE DESCRIPTON: tag
|
118
|
+
p_block.shift
|
119
|
+
|
120
|
+
pkg.package_description = p_block.map {|cell|
|
121
|
+
cell.sub(/^#{pkg.name}:\s*/, '')
|
122
|
+
}
|
123
|
+
|
124
|
+
pkgs << pkg
|
125
|
+
end
|
126
|
+
}
|
127
|
+
return pkgs
|
128
|
+
else
|
129
|
+
return @packages
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def set_packages
|
134
|
+
@packages = get_packages
|
135
|
+
return nil
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
end
|
142
|
+
|
@@ -0,0 +1,165 @@
|
|
1
|
+
|
2
|
+
require 'slackware/package'
|
3
|
+
|
4
|
+
module Slackware
|
5
|
+
|
6
|
+
VERSION = begin
|
7
|
+
data = File.read("/etc/slackware-version")
|
8
|
+
data =~ /Slackware\s(.*)/
|
9
|
+
$1
|
10
|
+
rescue
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
|
14
|
+
DIR_INSTALLED_PACKAGES = "/var/log/packages"
|
15
|
+
DIR_REMOVED_PACKAGES = "/var/log/removed_packages"
|
16
|
+
DIR_INSTALLED_SCRIPTS = "/var/log/scripts"
|
17
|
+
DIR_REMOVED_SCRIPTS = "/var/log/removed_scripts"
|
18
|
+
RE_REMOVED_NAMES = /^(.*)-upgraded-(\d{4}-\d{2}-\d{2}),(\d{2}:\d{2}:\d{2})$/
|
19
|
+
RE_BUILD_TAG = /^([[:digit:]]+)([[:alpha:]]+)$/
|
20
|
+
|
21
|
+
def self::version
|
22
|
+
VERSION
|
23
|
+
end
|
24
|
+
|
25
|
+
class System
|
26
|
+
|
27
|
+
def self::installed_packages
|
28
|
+
return Dir.glob(DIR_INSTALLED_PACKAGES + "/*").sort.map {|p| Slackware::Package.parse(p) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def self::removed_packages
|
32
|
+
return Dir.glob(DIR_REMOVED_PACKAGES + "/*").sort.map {|p| Slackware::Package.parse(p) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def self::installed_scripts
|
36
|
+
return Dir.glob(DIR_INSTALLED_SCRIPTS + "/*").sort.map {|s| Script.parse(s) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def self::removed_scripts
|
40
|
+
return Dir.glob(DIR_REMOVED_SCRIPTS + "/*").sort.map {|s| Script.parse(s) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def self::tags_used
|
44
|
+
return installed_packages.map {|p| p.tag }.uniq.compact
|
45
|
+
end
|
46
|
+
|
47
|
+
def self::with_tag(tag)
|
48
|
+
return installed_packages.map {|pkg| pkg if pkg.tag == tag }.compact
|
49
|
+
end
|
50
|
+
|
51
|
+
def self::arch_used
|
52
|
+
return installed_packages.map {|p| p.arch }.uniq.compact
|
53
|
+
end
|
54
|
+
|
55
|
+
def self::with_arch(arch)
|
56
|
+
return installed_packages.map {|pkg| pkg if pkg.arch == arch }.compact
|
57
|
+
end
|
58
|
+
|
59
|
+
def self::find_installed(name)
|
60
|
+
d = Dir.new(DIR_INSTALLED_PACKAGES)
|
61
|
+
return d.map {|p| Package.parse(p) if p.include?(name) }.compact
|
62
|
+
end
|
63
|
+
|
64
|
+
def self::find_removed(name)
|
65
|
+
d = Dir.new(DIR_REMOVED_PACKAGES)
|
66
|
+
return d.map {|p| Package.parse(p) if p.include?(name) }.compact
|
67
|
+
end
|
68
|
+
|
69
|
+
def self::upgrades(pkg)
|
70
|
+
if (m = find_removed(pkg).map {|p| p if (p.name == pkg) }.compact )
|
71
|
+
return m
|
72
|
+
else
|
73
|
+
return nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Return an Array of packages, that were installed after provided +time+
|
78
|
+
def self::installed_after(time)
|
79
|
+
arr = []
|
80
|
+
di = Dir.new(DIR_INSTALLED_PACKAGES)
|
81
|
+
di.each {|p|
|
82
|
+
if (File.mtime(DIR_INSTALLED_PACKAGES + "/" + p) >= time)
|
83
|
+
pkg = Package.parse(p)
|
84
|
+
pkg.get_time
|
85
|
+
arr << pkg
|
86
|
+
end
|
87
|
+
}
|
88
|
+
return arr
|
89
|
+
end
|
90
|
+
|
91
|
+
# Return an Array of packages, that were installed before provided +time+
|
92
|
+
def self::installed_before(time)
|
93
|
+
arr = []
|
94
|
+
di = Dir.new(DIR_INSTALLED_PACKAGES)
|
95
|
+
di.each {|p|
|
96
|
+
if (File.mtime(DIR_INSTALLED_PACKAGES + "/" + p) <= time)
|
97
|
+
pkg = Package.parse(p)
|
98
|
+
pkg.get_time
|
99
|
+
arr << pkg
|
100
|
+
end
|
101
|
+
}
|
102
|
+
return arr
|
103
|
+
end
|
104
|
+
|
105
|
+
# Return an Array of packages, that were removed after provided +time+
|
106
|
+
def self::removed_after(time)
|
107
|
+
arr = []
|
108
|
+
dr = Dir.new(DIR_REMOVED_PACKAGES)
|
109
|
+
dr.each {|p|
|
110
|
+
if (DIR_INSTALLED_PACKAGES + "/" + p =~ RE_REMOVED_NAMES)
|
111
|
+
if (Time.strptime($2 + ' ' + $3, fmt='%F %H:%M:%S') >= time)
|
112
|
+
arr << Package.parse(p)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
}
|
116
|
+
return arr
|
117
|
+
end
|
118
|
+
|
119
|
+
# Return an Array of packages, that were removed before provided +time+
|
120
|
+
def self::removed_before(time)
|
121
|
+
arr = []
|
122
|
+
dr = Dir.new(DIR_REMOVED_PACKAGES)
|
123
|
+
dr.each {|p|
|
124
|
+
if (DIR_INSTALLED_PACKAGES + "/" + p =~ RE_REMOVED_NAMES)
|
125
|
+
if (Time.strptime($2 + ' ' + $3, fmt='%F %H:%M:%S') <= time)
|
126
|
+
arr << Package.parse(p)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
}
|
130
|
+
return arr
|
131
|
+
end
|
132
|
+
|
133
|
+
# Check whether a given Slackware::Package has been upgraded before
|
134
|
+
def self::is_upgraded?(pkg)
|
135
|
+
if (find_removed(pkg).map {|p| p.name if p.upgrade_time }.include?(pkg) )
|
136
|
+
return true
|
137
|
+
else
|
138
|
+
return false
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# Search installation of Slackware::Package's for what owns the questioned file
|
143
|
+
def self::owns_file(file)
|
144
|
+
pkgs = installed_packages
|
145
|
+
found_files = []
|
146
|
+
file = file.sub(/^\//, "") # clean off the leading '/'
|
147
|
+
re = Regexp::new(/#{file}/)
|
148
|
+
pkgs.each {|pkg|
|
149
|
+
if (found = pkg.owned_files.map {|f| f if f =~ re}.compact)
|
150
|
+
found.each {|f|
|
151
|
+
found_files << [pkg, f]
|
152
|
+
}
|
153
|
+
end
|
154
|
+
}
|
155
|
+
return found_files
|
156
|
+
end
|
157
|
+
|
158
|
+
# Return the version of Slackware Linux currently installed
|
159
|
+
def self::version
|
160
|
+
VERSION
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
@@ -0,0 +1,264 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# started - Fri Oct 9 15:48:43 CDT 2009
|
3
|
+
# updated for args - Tue Mar 23 14:54:19 CDT 2010
|
4
|
+
# Copyright 2009, 2010 Vincent Batts, http://hashbangbash.com/
|
5
|
+
|
6
|
+
require 'slackware'
|
7
|
+
|
8
|
+
# Variables
|
9
|
+
@st = "\033[31;1m"
|
10
|
+
@en = "\033[0m"
|
11
|
+
|
12
|
+
# Classes
|
13
|
+
|
14
|
+
|
15
|
+
# Functions
|
16
|
+
def build_packages(opts = {}, args = [])
|
17
|
+
pkgs = Slackware::System.installed_packages
|
18
|
+
|
19
|
+
if (opts[:time])
|
20
|
+
pkgs = pkgs.each {|p| p.get_time }
|
21
|
+
end
|
22
|
+
if (opts[:all])
|
23
|
+
if (args.count > 0)
|
24
|
+
selected_pkgs = []
|
25
|
+
args.each {|arg|
|
26
|
+
pkgs.each {|pkg|
|
27
|
+
if pkg.fullname =~ /#{arg}/
|
28
|
+
selected_pkgs << pkg
|
29
|
+
end
|
30
|
+
}
|
31
|
+
}
|
32
|
+
pkgs = selected_pkgs.uniq
|
33
|
+
selected_pkgs = nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
if (opts[:pkg_given])
|
37
|
+
pkgs = pkgs.map {|p|
|
38
|
+
re = /#{opts[:pkg]}/i
|
39
|
+
if p.name =~ re
|
40
|
+
if (opts[:color])
|
41
|
+
p.name = p.name.gsub(re, "#{@st}\\&#{@en}")
|
42
|
+
end
|
43
|
+
p
|
44
|
+
end
|
45
|
+
}.compact
|
46
|
+
end
|
47
|
+
if (opts[:Version_given])
|
48
|
+
pkgs = pkgs.map {|p|
|
49
|
+
re = Regexp.new(Regexp.escape(opts[:Version]))
|
50
|
+
if p.version =~ re
|
51
|
+
if (opts[:color])
|
52
|
+
p.version = p.version.gsub(re, "#{@st}\\&#{@en}")
|
53
|
+
end
|
54
|
+
p
|
55
|
+
end
|
56
|
+
}.compact
|
57
|
+
end
|
58
|
+
if (opts[:arch_given])
|
59
|
+
pkgs = pkgs.map {|p|
|
60
|
+
re = /#{opts[:arch]}/
|
61
|
+
if p.arch =~ re
|
62
|
+
if (opts[:color])
|
63
|
+
p.arch = p.arch.gsub(re, "#{@st}\\&#{@en}")
|
64
|
+
end
|
65
|
+
p
|
66
|
+
end
|
67
|
+
}.compact
|
68
|
+
end
|
69
|
+
if (opts[:build_given])
|
70
|
+
pkgs = pkgs.map {|p|
|
71
|
+
re = /#{opts[:build]}/
|
72
|
+
if p.build =~ re
|
73
|
+
if (opts[:color])
|
74
|
+
p.build = p.build.gsub(re, "#{@st}\\&#{@en}")
|
75
|
+
end
|
76
|
+
p
|
77
|
+
end
|
78
|
+
}.compact
|
79
|
+
end
|
80
|
+
if (opts[:tag_given])
|
81
|
+
pkgs = pkgs.map {|p|
|
82
|
+
re = /#{opts[:tag]}/i
|
83
|
+
if p.tag =~ re
|
84
|
+
if (opts[:color])
|
85
|
+
p.tag = p.tag.gsub(re, "#{@st}\\&#{@en}")
|
86
|
+
end
|
87
|
+
p
|
88
|
+
end
|
89
|
+
}.compact
|
90
|
+
end
|
91
|
+
|
92
|
+
return pkgs
|
93
|
+
end
|
94
|
+
|
95
|
+
def print_packages(pkgs)
|
96
|
+
if (pkgs.count > 0 && pkgs.first.class == Slackware::Package)
|
97
|
+
pkgs.each {|pkg|
|
98
|
+
printf("%s\n", pkg.fullname )
|
99
|
+
}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def print_packages_times(pkgs, epoch = false)
|
104
|
+
if (epoch == true)
|
105
|
+
pkgs.each {|pkg| printf("%s : %s\n", pkg.fullname, pkg.time.to_i) }
|
106
|
+
else
|
107
|
+
pkgs.each {|pkg| printf("%s : %s\n", pkg.fullname, pkg.time.to_s) }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# package file listing
|
112
|
+
def print_package_file_list(pkgs)
|
113
|
+
if (pkgs.count > 1)
|
114
|
+
pkgs.each {|pkg|
|
115
|
+
pkg.get_owned_files.each {|line|
|
116
|
+
puts pkg.name + ": " + line
|
117
|
+
}
|
118
|
+
}
|
119
|
+
else
|
120
|
+
pkgs.each {|pkg| puts pkg.get_owned_files }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# search Array of Slackware::Package's for files
|
125
|
+
# and print the items found
|
126
|
+
def print_package_searched_files(pkgs, files)
|
127
|
+
found_files = []
|
128
|
+
files.each {|file|
|
129
|
+
found_files = found_files.concat(Slackware::System.owns_file(file))
|
130
|
+
}
|
131
|
+
found_files.each {|file|
|
132
|
+
puts file[0].fullname + ": " + file[1]
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
# find orpaned files from /etc/
|
137
|
+
# * build a list of files from removed_packages
|
138
|
+
# * check the list to see if they are currently owned by a package
|
139
|
+
# * check the unowned members, to see if they still exist on the filesystem
|
140
|
+
# * return existing files
|
141
|
+
def find_orphaned_config_files
|
142
|
+
# build a list of config files currently installed
|
143
|
+
installed_config_files = Slackware::System.installed_packages.map {|pkg|
|
144
|
+
pkg.get_owned_files.map {|file|
|
145
|
+
file if (file =~ /^etc\// && not(file =~ /\/$/))
|
146
|
+
}
|
147
|
+
}.flatten.compact
|
148
|
+
|
149
|
+
# this Array is where we'll stash removed packages that have config file to check
|
150
|
+
pkgs = Array.new
|
151
|
+
Slackware::System.removed_packages.each {|r_pkg|
|
152
|
+
# find config files for this removed package
|
153
|
+
config = r_pkg.get_owned_files.grep(/^etc\/.*[\w|\d]$/)
|
154
|
+
# continue if there are none
|
155
|
+
if (config.count > 0)
|
156
|
+
# remove config files that are owned by a currently installed package
|
157
|
+
config = config.map {|file|
|
158
|
+
if (not(installed_config_files.include?(file)) && not(installed_config_files.include?(file + ".new")))
|
159
|
+
file
|
160
|
+
end
|
161
|
+
}.compact
|
162
|
+
# check again, and continue if there are no config files left
|
163
|
+
if (config.count > 0)
|
164
|
+
# otherwise add this package, and its files, to the stack
|
165
|
+
pkgs << {:pkg => r_pkg, :files => config}
|
166
|
+
end
|
167
|
+
end
|
168
|
+
}
|
169
|
+
|
170
|
+
# setup list of files to check whether they still exist on the filesystem
|
171
|
+
files = []
|
172
|
+
pkgs.map {|pkg| files << pkg[:files] }
|
173
|
+
files.flatten!.uniq!
|
174
|
+
|
175
|
+
orphaned_config_files = []
|
176
|
+
files.each {|file|
|
177
|
+
if (File.exist?("/" + file))
|
178
|
+
orphaned_config_files << file
|
179
|
+
end
|
180
|
+
}
|
181
|
+
|
182
|
+
return orphaned_config_files
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
def print_orphaned_files(files)
|
187
|
+
puts files
|
188
|
+
end
|
189
|
+
|
190
|
+
# XXX This is a work in progress
|
191
|
+
# It _works_, but is pretty darn slow ...
|
192
|
+
# It would be more efficient to break this out to a separate Class,
|
193
|
+
# and use a sqlite database for caching linked dependencies.
|
194
|
+
# Categorized by pkg, file, links. based on mtime of the package file,
|
195
|
+
# or maybe even mtime of the shared objects themselves.
|
196
|
+
# That way, those entries alone could be updated if they are newer,
|
197
|
+
# otherwise it's just a query.
|
198
|
+
def find_linked(file_to_find)
|
199
|
+
require 'find'
|
200
|
+
|
201
|
+
dirs = %w{ /lib /lib64 /usr/lib /usr/lib64 /bin /sbin /usr/bin /usr/sbin }
|
202
|
+
re_so = Regexp.new(/ELF.*shared object/)
|
203
|
+
re_exec = Regexp.new(/ELF.*executable/)
|
204
|
+
|
205
|
+
if File.exist?(file_to_find)
|
206
|
+
file_to_find = File.expand_path(file_to_find)
|
207
|
+
end
|
208
|
+
if not(filemagic(File.dirname(file_to_find) + "/" + File.readlink(file_to_find)) =~ re_so)
|
209
|
+
printf("%s is not a shared object\n",file_to_find)
|
210
|
+
return nil
|
211
|
+
end
|
212
|
+
|
213
|
+
includes_linked = []
|
214
|
+
printf("Searching through ... ")
|
215
|
+
dirs.each {|dir|
|
216
|
+
printf("%s ", dir)
|
217
|
+
Find.find(dir) {|file|
|
218
|
+
if File.directory?(file)
|
219
|
+
next
|
220
|
+
end
|
221
|
+
file_magic = filemagic(file)
|
222
|
+
if (file_magic =~ re_so || file_magic =~ re_exec)
|
223
|
+
l = `/usr/bin/ldd #{file} 2>/dev/null `
|
224
|
+
if l.include?(file_to_find)
|
225
|
+
printf(".")
|
226
|
+
l = l.sub(/\t/, '').split(/\n/)
|
227
|
+
includes_linked << {:file => file, :links => l}
|
228
|
+
end
|
229
|
+
end
|
230
|
+
}
|
231
|
+
}
|
232
|
+
printf("\n")
|
233
|
+
return includes_linked
|
234
|
+
end
|
235
|
+
|
236
|
+
# This is intended to take the return of the find_linked() method
|
237
|
+
def packages_of_linked_files(linked_files_arr)
|
238
|
+
pkgs = Slackware::System.installed_packages
|
239
|
+
owned_pkgs = []
|
240
|
+
pkgs.map {|pkg|
|
241
|
+
files.each {|file|
|
242
|
+
if pkg.owned_files.include?(file)
|
243
|
+
owned_pkgs << {:pkg => pkg, :file => file}
|
244
|
+
end
|
245
|
+
}
|
246
|
+
}
|
247
|
+
return owned_pkgs
|
248
|
+
end
|
249
|
+
|
250
|
+
# Pretty print the output of find_linked()
|
251
|
+
def print_find_linked(file_to_find)
|
252
|
+
files = find_linked(file_to_find)
|
253
|
+
printf("files linked to '%s' include:\n", file_to_find)
|
254
|
+
files.each {|file|
|
255
|
+
printf(" %s\n", file)
|
256
|
+
}
|
257
|
+
end
|
258
|
+
|
259
|
+
private
|
260
|
+
|
261
|
+
def filemagic(file)
|
262
|
+
return `/usr/bin/file "#{file}"`.chomp
|
263
|
+
end
|
264
|
+
|
data/lib/slackware.rb
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: slack-utils
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 9
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
- 1
|
10
|
+
version: 0.5.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Vincent Batts
|
14
|
+
autorequire: slack-utils
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-11-19 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: trollop
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: " slack-utils is a means by which to access \n\
|
36
|
+
package information on the Slackware Linux OS. \n\
|
37
|
+
See the examples/ for more information.\n "
|
38
|
+
email: vbatts@hashbangbash.com
|
39
|
+
executables:
|
40
|
+
- slf
|
41
|
+
- slo
|
42
|
+
- sll
|
43
|
+
- slp
|
44
|
+
- slt
|
45
|
+
- slfindlinked
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README.rdoc
|
50
|
+
files:
|
51
|
+
- README.rdoc
|
52
|
+
- bin/slf
|
53
|
+
- bin/slt
|
54
|
+
- bin/slp
|
55
|
+
- bin/slo
|
56
|
+
- bin/sll
|
57
|
+
- bin/slfindlinked
|
58
|
+
- examples/list_packages.rb
|
59
|
+
- examples/repo_difference.rb
|
60
|
+
- examples/before_then.rb
|
61
|
+
- examples/repo.rb
|
62
|
+
- lib/slackware.rb
|
63
|
+
- lib/slackware/utils.rb
|
64
|
+
- lib/slackware/package.rb
|
65
|
+
- lib/slackware/repo.rb
|
66
|
+
- lib/slackware/system.rb
|
67
|
+
has_rdoc: true
|
68
|
+
homepage: https://github.com/vbatts/slack-utils/
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options:
|
73
|
+
- --main=README.rdoc
|
74
|
+
- --line-numbers
|
75
|
+
- --inline-source
|
76
|
+
- --title=Slackware utils (slack-utils) 0.5.1 Documentation
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 1.3.7
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: Accessing information for the Slackware Linux distribution
|
104
|
+
test_files: []
|
105
|
+
|