Class: JSS::PatchSource

Inherits:
APIObject show all
Includes:
Updatable
Defined in:
lib/jss/api_object/patch_source.rb

Overview

A patch source. The abstract parent class of PatchInternalSource and PatchExternalSource

See Also:

Direct Known Subclasses

PatchExternalSource, PatchInternalSource

Constant Summary collapse

HTTP =
'http'.freeze
HTTPS =
'https'.freeze
DFT_ENABLED =
false
DFT_SSL =
true
DFT_SSL_PORT =
443
DFT_NO_SSL_PORT =
80
AVAILABLE_TITLES_RSRC =
'patchavailabletitles/sourceid/'.freeze
AVAILABLE_TITLES_DATA_MAP =

TODO: remove this and adjust parsing when jamf fixes the JSON Data map for PatchReport XML data parsing cuz Borked JSON

See Also:

  • for details
{
  patch_available_titles: {
    available_titles: [
      {
        name_id: JSS::BLANK,
        current_version: JSS::BLANK,
        publisher: JSS::BLANK,
        last_modified: JSS::BLANK,
        app_name: JSS::BLANK
      }
    ]
  }
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**args) ⇒ PatchSource

Init



302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/jss/api_object/patch_source.rb', line 302

def initialize(**args)
  raise JSS::UnsupportedError, 'PatchSource is an abstract metaclass. Please use PatchInternalSource or PatchExternalSource' if self.class == JSS::PatchSource

  super

  @enabled = @init_data[:enabled].to_s.jss_to_bool
  @enabled ||= false

  # derive the data not provided for this source type
  if @init_data[:endpoint]
    @endpoint = @init_data[:endpoint]
    url = URI.parse endpoint
    @host_name = url.host
    @port = url.port
    @ssl_enabled = url.scheme == HTTPS
  else
    @host_name = @init_data[:host_name]
    @port = @init_data[:port].to_i
    @port ||= ssl_enabled? ? DFT_SSL_PORT : DFT_NO_SSL_PORT
    @ssl_enabled = @init_data[:ssl_enabled].to_s.jss_to_bool
    @ssl_enabled ||= false
    @endpoint = "#{ssl_enabled ? HTTPS : HTTP}://#{host_name}:#{port}/"
  end
end

Instance Attribute Details

#enabledBoolean (readonly) Also known as: enabled?

Returns Is this source enabled?

Returns:

  • (Boolean)

    Is this source enabled?



278
279
280
# File 'lib/jss/api_object/patch_source.rb', line 278

def enabled
  @enabled
end

#endpointString (readonly) Also known as: url

Returns The URL from which patch info is retrieved

Returns:

  • (String)

    The URL from which patch info is retrieved



282
283
284
# File 'lib/jss/api_object/patch_source.rb', line 282

def endpoint
  @endpoint
end

#host_nameString (readonly) Also known as: hostname, host

Returns The host name of the patch source

Parameters:

  • newname (String)

    The new host name (external sources only)

Returns:

  • (String)

    The host name of the patch source



288
289
290
# File 'lib/jss/api_object/patch_source.rb', line 288

def host_name
  @host_name
end

#need_to_updateBoolean (readonly) Originally defined in module Updatable

Returns do we have unsaved changes?

Returns:

  • (Boolean)

    do we have unsaved changes?

#portInteger (readonly)

Returns the TCP port of the patch source

Parameters:

  • new_port (Integer)

    The new port (external sources only)

Returns:

  • (Integer)

    the TCP port of the patch source



295
296
297
# File 'lib/jss/api_object/patch_source.rb', line 295

def port
  @port
end

#ssl_enabledBoolean (readonly) Also known as: ssl_enabled?

Returns Is SSL enabled for the patch source?

Returns:

  • (Boolean)

    Is SSL enabled for the patch source?



298
299
300
# File 'lib/jss/api_object/patch_source.rb', line 298

def ssl_enabled
  @ssl_enabled
end

Class Method Details

.all(refresh = false, api: JSS.api) ⇒ Array<Hash{:name=>String, :id=> Integer, :type => Symbol}>

Get names, ids and types for all patch sources

Parameters:

  • refresh (Boolean) (defaults to: false)

    should the data be re-queried from the API?

  • api (JSS::APIConnection)

    an API connection to use for the query. Defaults to the corrently active API. See APIConnection

Returns:



81
82
83
84
85
86
87
88
# File 'lib/jss/api_object/patch_source.rb', line 81

def self.all(refresh = false, api: JSS.api)
  if self == JSS::PatchSource
    int = JSS::PatchInternalSource.all(refresh, api: api).each { |s| s[:type] = :internal }
    ext = JSS::PatchExternalSource.all(refresh, api: api).each { |s| s[:type] = :external }
    return (int + ext).sort! { |s1, s2| s1[:id] <=> s2[:id] }
  end
  super
end

.all_external(refresh = false, api: JSS.api) ⇒ Object

Get names, ids for all patch internal sources

the same as JSS::PatchExternalSource.all refresh, api: api

@see  JSS::PatchExternalSource.all


106
107
108
# File 'lib/jss/api_object/patch_source.rb', line 106

def self.all_external(refresh = false, api: JSS.api)
  JSS::PatchExternalSource.all refresh, api: api
end

.all_internal(refresh = false, api: JSS.api) ⇒ Object

Get names, ids for all patch internal sources

the same as JSS::PatchInternalSource.all refresh, api: api

See Also:

  • JSS::PatchInternalSource.all


96
97
98
# File 'lib/jss/api_object/patch_source.rb', line 96

def self.all_internal(refresh = false, api: JSS.api)
  JSS::PatchInternalSource.all refresh, api: api
end

.all_objects(refresh = false, api: JSS.api) ⇒ Object



112
113
114
115
116
117
118
119
# File 'lib/jss/api_object/patch_source.rb', line 112

def self.all_objects(refresh = false, api: JSS.api)
  if self == JSS::PatchSource
    int = JSS::PatchInternalSource.all_objects refresh, api: api
    ext = JSS::PatchExternalSource.all_objects refresh, api: api
    return (int + ext).sort! { |s1, s2| s1.id <=> s2.id }
  end
  super
end

.available_name_ids(source, api: JSS.api) ⇒ Array<String>

FOr a given patch source, an array of available 'name_id's which are uniq identifiers for titles available on that source.

Returns:

  • (Array<String>)

    the name_ids available on the source

See Also:



230
231
232
# File 'lib/jss/api_object/patch_source.rb', line 230

def self.available_name_ids(source, api: JSS.api)
  available_titles(source, api: api).map { |t| t[:name_id] }
end

.available_titles(source, api: JSS.api) ⇒ Array<Hash{Symbol:String}>

Get a list of patch titles available from a Patch Source (either internal or external, since they have unique ids )

get the available titles

Parameters:

  • source (String, Integer)

    name or id of the Patch Source for which to

  • api (JSS::APIConnection)

    The api connection to use for the query Defaults to the currently active connection

Returns:

  • (Array<Hash{Symbol:String}>)

    One hash for each available title, with these keys:

    :name_id String
    :current_version String
    :publisher String
    :last_modified Time
    :app_name  String
    

Raises:



198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/jss/api_object/patch_source.rb', line 198

def self.available_titles(source, api: JSS.api)
  src_id = valid_patch_source_id source, api: api
  raise JSS::NoSuchItemError, "No Patch Source found matching: #{source}" unless src_id

  rsrc_base =
    if valid_patch_source_type(src_id, api: api) == :internal
      JSS::PatchInternalSource::AVAILABLE_TITLES_RSRC
    else
      JSS::PatchExternalSource::AVAILABLE_TITLES_RSRC
    end

  rsrc = "#{rsrc_base}#{src_id}"

  begin
    # TODO: remove this and adjust parsing when jamf fixes the JSON
    raw = JSS::XMLWorkaround.data_via_xml(rsrc, AVAILABLE_TITLES_DATA_MAP, api)
  rescue RestClient::ResourceNotFound
    return []
  end

  titles = raw[:patch_available_titles][:available_titles]
  titles.each { |t| t[:last_modified] = Time.parse t[:last_modified] }
  titles
end

.delete(victims, api: JSS.api) ⇒ Object

Only JSS::PatchExternalSources can be deleted

See Also:



170
171
172
173
174
175
176
177
178
179
# File 'lib/jss/api_object/patch_source.rb', line 170

def self.delete(victims, api: JSS.api)
  case self.name
  when 'JSS::PatchSource'
    JSS::PatchExternalSource victims, api: api
  when 'JSS::PatchExternalSource'
    super
  when 'JSS::PatchInternalSource'
    raise JSS::UnsupportedError, 'PatchInteralSources cannot be deleted.'
  end
end

.fetch(arg, api: JSS.api) ⇒ Object

Fetch either an internal or external patch source

BUG: there's an API bug: fetching a non-existent ids which is why we rescue internal server errors.

See Also:



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/jss/api_object/patch_source.rb', line 128

def self.fetch(arg, api: JSS.api)
  if self == JSS::PatchSource
    begin
      fetched = JSS::PatchInternalSource.fetch arg, api: api
    rescue RestClient::ResourceNotFound, RestClient::InternalServerError, JSS::NoSuchItemError
      fetched = nil
    end
    unless fetched
      begin
        fetched = JSS::PatchExternalSource.fetch arg, api: api
      rescue RestClient::ResourceNotFound, RestClient::InternalServerError, JSS::NoSuchItemError
        raise JSS::NoSuchItemError, 'No matching PatchSource found'
      end
    end
    return fetched
  end # if self == JSS::PatchSource
  begin
    super
  rescue RestClient::ResourceNotFound, RestClient::InternalServerError, JSS::NoSuchItemError
    raise JSS::NoSuchItemError, "No matching #{self::RSRC_OBJECT_KEY} found"
  end
end

.make(**args) ⇒ Object

Only JSS::PatchExternalSources can be created

See Also:



155
156
157
158
159
160
161
162
163
164
# File 'lib/jss/api_object/patch_source.rb', line 155

def self.make(**args)
  case self.name
  when 'JSS::PatchSource'
    JSS::PatchExternalSource.make args
  when 'JSS::PatchExternalSource'
    super
  when 'JSS::PatchInternalSource'
    raise JSS::UnsupportedError, 'PatchInteralSources cannot be created.'
  end
end

.valid_patch_source_id(ident, refresh = false, api: JSS.api) ⇒ Integer?

Given a name or id for a Patch Source (internal or external) return the id if it exists, or nil if it doesn't.

NOTE: does not indicate which kind of source it is, just that it exists and can be used as a source_id for a patch title.

Parameters:

  • ident (String, Integer)

    the name or id to validate

  • refresh (Boolean) (defaults to: false)

    Should the data be re-read from the server

  • api (JSS::APIConnection)

    an API connection to use for the query. Defaults to the corrently active API. See APIConnection

Returns:

  • (Integer, nil)

    the valid id or nil if it doesn't exist.

See Also:



250
251
252
253
254
# File 'lib/jss/api_object/patch_source.rb', line 250

def self.valid_patch_source_id(ident, refresh = false, api: JSS.api)
  id = JSS::PatchInternalSource.valid_id ident, refresh, api: api
  id ||= JSS::PatchExternalSource.valid_id ident, refresh, api: api
  id
end

.valid_patch_source_type(ident, refresh = false, api: JSS.api) ⇒ Symbol?

Given a name or id for a Patch Source return :internal or :external if it exists, or nil if it doesnt.

Parameters:

  • ident (String, Integer)

    the name or id to validate

  • refresh (Boolean) (defaults to: false)

    Should the data be re-read from the server

  • api (JSS::APIConnection)

    an API connection to use for the query. Defaults to the corrently active API. See APIConnection

Returns:

  • (Symbol, nil)

    :internal, :external, or nil if it doesn't exist.



268
269
270
271
272
# File 'lib/jss/api_object/patch_source.rb', line 268

def self.valid_patch_source_type(ident, refresh = false, api: JSS.api)
  return :internel if JSS::PatchInternalSource.valid_id ident, refresh, api: api
  return :external if JSS::PatchExternalSource.valid_id ident, refresh, api: api
  nil
end

Instance Method Details

#available_name_idsObject

Get a list of available name_id's for this patch source

See Also:



337
338
339
# File 'lib/jss/api_object/patch_source.rb', line 337

def available_name_ids
  self.class.available_name_ids id, api: api
end

#available_titlesObject

Get a list of patch titles available from this Patch Source

See Also:



330
331
332
# File 'lib/jss/api_object/patch_source.rb', line 330

def available_titles
  self.class.available_titles id, api: api
end

#deleteObject

Delete this instance This method is needed to override APIObject#delete



343
344
345
346
347
348
349
350
# File 'lib/jss/api_object/patch_source.rb', line 343

def delete
  case self.class.name
  when 'JSS::PatchExternalSource'
    super
  when 'JSS::PatchInternalSource'
    raise JSS::UnsupportedError, 'PatchInteralSources cannot be deleted.'
  end
end

#name=(newname) ⇒ void Originally defined in module Updatable

This method returns an undefined value.

Change the name of this item Remember to #update to push changes to the server.

Parameters:

  • newname (String)

    the new name

Raises:

#updateBoolean Originally defined in module Updatable

Save changes to the JSS

Returns:

  • (Boolean)

    success

Raises: