You can subscribe to this list here.
2009 |
Jan
|
Feb
(6) |
Mar
|
Apr
(1) |
May
(1) |
Jun
(10) |
Jul
|
Aug
|
Sep
(3) |
Oct
(38) |
Nov
(1) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(9) |
Sep
(1) |
Oct
(23) |
Nov
(16) |
Dec
(28) |
2011 |
Jan
(28) |
Feb
(9) |
Mar
(24) |
Apr
(4) |
May
(1) |
Jun
(2) |
Jul
(5) |
Aug
(12) |
Sep
(2) |
Oct
(7) |
Nov
(22) |
Dec
(3) |
2012 |
Jan
(1) |
Feb
(1) |
Mar
(3) |
Apr
(6) |
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
(12) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: John T. <jt...@at...> - 2011-10-13 19:52:35
|
I've still keeping an open mind about it. I'm getting some exposure today on Cobbler as it has been introduced into Ubuntu's new release for cloud management and provisioning. Maybe that's the path in which nVentory can evolve into cloud infrastructure. ________________________________________ From: Matthew Macdonald-Wallace [li...@tr...] Sent: Thursday, October 13, 2011 12:49 PM To: John Tran Cc: nve...@li... Subject: RE: [nventory-devel] Making the case for serving Kickstart/preseed files On Thu, 2011-10-13 at 09:25 -0700, John Tran wrote: > Matthew, wouldn't it make sense for this to be a separate app (from nVentory) that simply pulls the necessary data from nVentory, instead of being integrated in it? Heh, so I've managed to convince the "non-believer" its a good idea and the "supporter" that it should be a stand-alone app... ;) I'll give it some further thought over the weekend as to what I'd want to achieve with it and come back to you all on Monday with a few ideas. Kind regards, Matt |
From: Matthew Macdonald-W. <li...@tr...> - 2011-10-13 19:49:52
|
On Thu, 2011-10-13 at 09:25 -0700, John Tran wrote: > Matthew, wouldn't it make sense for this to be a separate app (from nVentory) that simply pulls the necessary data from nVentory, instead of being integrated in it? Heh, so I've managed to convince the "non-believer" its a good idea and the "supporter" that it should be a stand-alone app... ;) I'll give it some further thought over the weekend as to what I'd want to achieve with it and come back to you all on Monday with a few ideas. Kind regards, Matt |
From: John T. <jt...@at...> - 2011-10-13 16:26:35
|
Matthew, wouldn't it make sense for this to be a separate app (from nVentory) that simply pulls the necessary data from nVentory, instead of being integrated in it? ________________________________________ From: Matthew Macdonald-Wallace [li...@tr...] Sent: Wednesday, October 12, 2011 2:02 PM To: John Tran Cc: nve...@li... Subject: Re: [nventory-devel] Making the case for serving Kickstart/preseed files On Wed, 2011-10-12 at 13:40 -0700, John Tran wrote: > I'm not really familiar w/ cobbler but this does sound interesting to me. What facilities would you have to build into nVentory to do it? It's really just a URL that can be called by the boot image and returns a kickstart/preseed. The code from Edison (python - look away now!) is as follows: ========================================= class KickstartHandler(BaseHandler): allowed_methods = ('GET') def read(self,request): profile = "" mac = request.META["HTTP_X_RHN_PROVISIONING_MAC_0"].split(" ") profile = "Mac Address: " + mac[1] + "\n" results = ConfigurationItem.objects.select_related().filter(NetworkInterface__MacAddress__icontains=mac[1],BuildOnNextBoot=True) for data in results: # get any additional repos specified repo_string = '' for repo in data.Profile.repos.all(): repo_string = repo_string + "repo --name %s --baseurl %s \n" % (repo.Name,repo.url) # A Dict containing the defaults for the basic kickstart templating ksvars = { '<<hostname>>': data.Hostname , # defaults to hostname retrieved for this MAC Address "<<tree>>":"http://"+request.META['SERVER_NAME']+"/media/install_trees/"+data.Profile.Name.lower().replace(' ','_'), # Serve the install tree from the media directory linked to the profile name for this host "<<rootpw>>":data.rootpwhash, '<<bootdev>>': mac[1], '<<repositories>>': repo_string, } profile = replace_words(data.Profile.AutoInstallFile,ksvars) # Switch off the pxeboot by default data.BuildOnNextBoot=False data.save() return profile ================================= It basically (for Redhat-based installs at least) looks at the value of HTTP_X_RHN_PROVISIONING_MAC_0 and uses that as a lookup in the database to get the appropriate kickstart file which it then "templates" based upon various items in the database. It also requires an "install tree" which is effectively a copy of the install CD/DVD that is accessible over HTTP, however this does not need to be part of nventory (although Cobbler requires that you import this before you create the kickstart, actually you just need to point the tree to the correct location). More information on how I added it to Edison is on my blog: http://www.threedrunkensysadsonthe.net/2010/11/edison-gets-rudimentary-templating-for-kickstarts/ http://www.threedrunkensysadsonthe.net/2010/11/kicking-the-hamster-edison-gets-support-for-kickstart-fai-etc/ Let me know if you need any more information. Matt ________________________________________ > From: Matthew Macdonald-Wallace [li...@tr...] > Sent: Wednesday, October 12, 2011 1:15 PM > To: nve...@li... > Subject: [nventory-devel] Making the case for serving Kickstart/preseed files > > Hi all, > > At present we use Cobbler for our build system and a bespoke in-house > system for inventory. > > My proposal is that NVentory is given the ability to serve > Kickstart/Preseed files based upon the following existing groupings: > > * Node Group (puppet class) > * Datacentre > * Hardware Profile > * Operating System > > This would mean that you could assign a kickstart/preseed to a system > based upon any of the above and it would be built accordingly. > > I am *not* suggesting that NVentory takes over DHCP or DNS Management on > the network in the way that cobbler does, nor am I suggesting that > NVentory should manage PXE images/TFTP, that would be left as "an > exercise for the reader". > > I feel that it would not be a great deal of work to add this feature to > the system and that it would enable nventory to provide not only an > excellent API but also the ability to build the systems it is > responsible for managing. > > I look forward to hearing your thoughts, > > Matt > > > ------------------------------------------------------------------------------ > All the data continuously generated in your IT infrastructure contains a > definitive record of customers, application performance, security > threats, fraudulent activity and more. Splunk takes this data and makes > sense of it. Business sense. IT sense. Common sense. > http://p.sf.net/sfu/splunk-d2d-oct > _______________________________________________ > nventory-devel mailing list > nve...@li... > https://lists.sourceforge.net/lists/listinfo/nventory-devel > ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense. http://p.sf.net/sfu/splunk-d2d-oct _______________________________________________ nventory-devel mailing list nve...@li... https://lists.sourceforge.net/lists/listinfo/nventory-devel |
From: Pat O'B. <obr...@gm...> - 2011-10-12 21:17:56
|
Hmmmm, I like the idea, although I don't think I would use it mainly because it would require new hardware to have node entries populated by a human beforehand which is always error prone. I also am not too fond of storing the rootpw hash and the other variables in nventory like that. I am curious as to how complicated this would be to maintain and still a little uneasy of changes that make nventory a "kitchen sink solution," although I am probably wrong. -pat On Wed, Oct 12, 2011 at 2:02 PM, Matthew Macdonald-Wallace < li...@tr...> wrote: > On Wed, 2011-10-12 at 13:40 -0700, John Tran wrote: > > I'm not really familiar w/ cobbler but this does sound interesting to me. > What facilities would you have to build into nVentory to do it? > > It's really just a URL that can be called by the boot image and returns > a kickstart/preseed. > > The code from Edison (python - look away now!) is as follows: > > ========================================= > > class KickstartHandler(BaseHandler): > allowed_methods = ('GET') > def read(self,request): > profile = "" > mac = request.META["HTTP_X_RHN_PROVISIONING_MAC_0"].split(" ") > profile = "Mac Address: " + mac[1] + "\n" > results = > > ConfigurationItem.objects.select_related().filter(NetworkInterface__MacAddress__icontains=mac[1],BuildOnNextBoot=True) > for data in results: > # get any additional repos specified > repo_string = '' > for repo in data.Profile.repos.all(): > repo_string = repo_string + "repo --name %s --baseurl %s > \n" % (repo.Name,repo.url) > # A Dict containing the defaults for the basic kickstart > templating > ksvars = { > '<<hostname>>': data.Hostname , # defaults to > hostname retrieved for this MAC Address > > "<<tree>>":"http://"+request.META['SERVER_NAME']+"/media/install_trees/"+data.Profile.Name.lower().replace(' > ','_'), # Serve the install tree from the media directory linked to the > profile name for this host > "<<rootpw>>":data.rootpwhash, > '<<bootdev>>': mac[1], > '<<repositories>>': repo_string, > } > profile = replace_words(data.Profile.AutoInstallFile,ksvars) > # Switch off the pxeboot by default > data.BuildOnNextBoot=False > data.save() > return profile > > ================================= > > It basically (for Redhat-based installs at least) looks at the value of > HTTP_X_RHN_PROVISIONING_MAC_0 and uses that as a lookup in the database > to get the appropriate kickstart file which it then "templates" based > upon various items in the database. > > It also requires an "install tree" which is effectively a copy of the > install CD/DVD that is accessible over HTTP, however this does not need > to be part of nventory (although Cobbler requires that you import this > before you create the kickstart, actually you just need to point the > tree to the correct location). > > More information on how I added it to Edison is on my blog: > > > http://www.threedrunkensysadsonthe.net/2010/11/edison-gets-rudimentary-templating-for-kickstarts/ > > http://www.threedrunkensysadsonthe.net/2010/11/kicking-the-hamster-edison-gets-support-for-kickstart-fai-etc/ > > Let me know if you need any more information. > > Matt > ________________________________________ > > From: Matthew Macdonald-Wallace [li...@tr...] > > Sent: Wednesday, October 12, 2011 1:15 PM > > To: nve...@li... > > Subject: [nventory-devel] Making the case for serving Kickstart/preseed > files > > > > Hi all, > > > > At present we use Cobbler for our build system and a bespoke in-house > > system for inventory. > > > > My proposal is that NVentory is given the ability to serve > > Kickstart/Preseed files based upon the following existing groupings: > > > > * Node Group (puppet class) > > * Datacentre > > * Hardware Profile > > * Operating System > > > > This would mean that you could assign a kickstart/preseed to a system > > based upon any of the above and it would be built accordingly. > > > > I am *not* suggesting that NVentory takes over DHCP or DNS Management on > > the network in the way that cobbler does, nor am I suggesting that > > NVentory should manage PXE images/TFTP, that would be left as "an > > exercise for the reader". > > > > I feel that it would not be a great deal of work to add this feature to > > the system and that it would enable nventory to provide not only an > > excellent API but also the ability to build the systems it is > > responsible for managing. > > > > I look forward to hearing your thoughts, > > > > Matt > > > > > > > ------------------------------------------------------------------------------ > > All the data continuously generated in your IT infrastructure contains a > > definitive record of customers, application performance, security > > threats, fraudulent activity and more. Splunk takes this data and makes > > sense of it. Business sense. IT sense. Common sense. > > http://p.sf.net/sfu/splunk-d2d-oct > > _______________________________________________ > > nventory-devel mailing list > > nve...@li... > > https://lists.sourceforge.net/lists/listinfo/nventory-devel > > > > > > > > ------------------------------------------------------------------------------ > All the data continuously generated in your IT infrastructure contains a > definitive record of customers, application performance, security > threats, fraudulent activity and more. Splunk takes this data and makes > sense of it. Business sense. IT sense. Common sense. > http://p.sf.net/sfu/splunk-d2d-oct > _______________________________________________ > nventory-devel mailing list > nve...@li... > https://lists.sourceforge.net/lists/listinfo/nventory-devel > |
From: Matthew Macdonald-W. <li...@tr...> - 2011-10-12 21:02:42
|
On Wed, 2011-10-12 at 13:40 -0700, John Tran wrote: > I'm not really familiar w/ cobbler but this does sound interesting to me. What facilities would you have to build into nVentory to do it? It's really just a URL that can be called by the boot image and returns a kickstart/preseed. The code from Edison (python - look away now!) is as follows: ========================================= class KickstartHandler(BaseHandler): allowed_methods = ('GET') def read(self,request): profile = "" mac = request.META["HTTP_X_RHN_PROVISIONING_MAC_0"].split(" ") profile = "Mac Address: " + mac[1] + "\n" results = ConfigurationItem.objects.select_related().filter(NetworkInterface__MacAddress__icontains=mac[1],BuildOnNextBoot=True) for data in results: # get any additional repos specified repo_string = '' for repo in data.Profile.repos.all(): repo_string = repo_string + "repo --name %s --baseurl %s \n" % (repo.Name,repo.url) # A Dict containing the defaults for the basic kickstart templating ksvars = { '<<hostname>>': data.Hostname , # defaults to hostname retrieved for this MAC Address "<<tree>>":"http://"+request.META['SERVER_NAME']+"/media/install_trees/"+data.Profile.Name.lower().replace(' ','_'), # Serve the install tree from the media directory linked to the profile name for this host "<<rootpw>>":data.rootpwhash, '<<bootdev>>': mac[1], '<<repositories>>': repo_string, } profile = replace_words(data.Profile.AutoInstallFile,ksvars) # Switch off the pxeboot by default data.BuildOnNextBoot=False data.save() return profile ================================= It basically (for Redhat-based installs at least) looks at the value of HTTP_X_RHN_PROVISIONING_MAC_0 and uses that as a lookup in the database to get the appropriate kickstart file which it then "templates" based upon various items in the database. It also requires an "install tree" which is effectively a copy of the install CD/DVD that is accessible over HTTP, however this does not need to be part of nventory (although Cobbler requires that you import this before you create the kickstart, actually you just need to point the tree to the correct location). More information on how I added it to Edison is on my blog: http://www.threedrunkensysadsonthe.net/2010/11/edison-gets-rudimentary-templating-for-kickstarts/ http://www.threedrunkensysadsonthe.net/2010/11/kicking-the-hamster-edison-gets-support-for-kickstart-fai-etc/ Let me know if you need any more information. Matt ________________________________________ > From: Matthew Macdonald-Wallace [li...@tr...] > Sent: Wednesday, October 12, 2011 1:15 PM > To: nve...@li... > Subject: [nventory-devel] Making the case for serving Kickstart/preseed files > > Hi all, > > At present we use Cobbler for our build system and a bespoke in-house > system for inventory. > > My proposal is that NVentory is given the ability to serve > Kickstart/Preseed files based upon the following existing groupings: > > * Node Group (puppet class) > * Datacentre > * Hardware Profile > * Operating System > > This would mean that you could assign a kickstart/preseed to a system > based upon any of the above and it would be built accordingly. > > I am *not* suggesting that NVentory takes over DHCP or DNS Management on > the network in the way that cobbler does, nor am I suggesting that > NVentory should manage PXE images/TFTP, that would be left as "an > exercise for the reader". > > I feel that it would not be a great deal of work to add this feature to > the system and that it would enable nventory to provide not only an > excellent API but also the ability to build the systems it is > responsible for managing. > > I look forward to hearing your thoughts, > > Matt > > > ------------------------------------------------------------------------------ > All the data continuously generated in your IT infrastructure contains a > definitive record of customers, application performance, security > threats, fraudulent activity and more. Splunk takes this data and makes > sense of it. Business sense. IT sense. Common sense. > http://p.sf.net/sfu/splunk-d2d-oct > _______________________________________________ > nventory-devel mailing list > nve...@li... > https://lists.sourceforge.net/lists/listinfo/nventory-devel > |
From: John T. <jt...@at...> - 2011-10-12 20:41:01
|
I'm not really familiar w/ cobbler but this does sound interesting to me. What facilities would you have to build into nVentory to do it? ________________________________________ From: Matthew Macdonald-Wallace [li...@tr...] Sent: Wednesday, October 12, 2011 1:15 PM To: nve...@li... Subject: [nventory-devel] Making the case for serving Kickstart/preseed files Hi all, At present we use Cobbler for our build system and a bespoke in-house system for inventory. My proposal is that NVentory is given the ability to serve Kickstart/Preseed files based upon the following existing groupings: * Node Group (puppet class) * Datacentre * Hardware Profile * Operating System This would mean that you could assign a kickstart/preseed to a system based upon any of the above and it would be built accordingly. I am *not* suggesting that NVentory takes over DHCP or DNS Management on the network in the way that cobbler does, nor am I suggesting that NVentory should manage PXE images/TFTP, that would be left as "an exercise for the reader". I feel that it would not be a great deal of work to add this feature to the system and that it would enable nventory to provide not only an excellent API but also the ability to build the systems it is responsible for managing. I look forward to hearing your thoughts, Matt ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense. http://p.sf.net/sfu/splunk-d2d-oct _______________________________________________ nventory-devel mailing list nve...@li... https://lists.sourceforge.net/lists/listinfo/nventory-devel |
From: Matthew Macdonald-W. <li...@tr...> - 2011-10-12 20:18:17
|
Hi all, At present we use Cobbler for our build system and a bespoke in-house system for inventory. My proposal is that NVentory is given the ability to serve Kickstart/Preseed files based upon the following existing groupings: * Node Group (puppet class) * Datacentre * Hardware Profile * Operating System This would mean that you could assign a kickstart/preseed to a system based upon any of the above and it would be built accordingly. I am *not* suggesting that NVentory takes over DHCP or DNS Management on the network in the way that cobbler does, nor am I suggesting that NVentory should manage PXE images/TFTP, that would be left as "an exercise for the reader". I feel that it would not be a great deal of work to add this feature to the system and that it would enable nventory to provide not only an excellent API but also the ability to build the systems it is responsible for managing. I look forward to hearing your thoughts, Matt |
From: <dar...@us...> - 2011-09-28 23:27:14
|
Revision: 316 http://nventory.svn.sourceforge.net/nventory/?rev=316&view=rev Author: darrendao Date: 2011-09-28 23:27:08 +0000 (Wed, 28 Sep 2011) Log Message: ----------- Update nventory to support JSON format for querying nodes Modified Paths: -------------- trunk/client/ruby/nventory.rb trunk/server/app/controllers/application_controller.rb trunk/server/app/controllers/nodes_controller.rb trunk/server/app/models/search.rb Modified: trunk/client/ruby/nventory.rb =================================================================== --- trunk/client/ruby/nventory.rb 2011-09-26 20:18:47 UTC (rev 315) +++ trunk/client/ruby/nventory.rb 2011-09-28 23:27:08 UTC (rev 316) @@ -14,6 +14,15 @@ require 'rexml/document' require 'yaml' +# Only use json gem if its there +begin + require 'rubygems' + require 'json' + HAS_JSON_GEM = true +rescue LoadError + HAS_JSON_GEM = false +end + # fix for ruby http bug where it encodes the params incorrectly class Net::HTTP::Put def set_form_data(params, sep = '&') @@ -302,7 +311,18 @@ # Send the query to the server # - uri = URI::join(@server, "#{objecttype}.xml?#{querystring}") + if parms[:format] == 'json' + if HAS_JSON_GEM + uri = URI::join(@server, "#{objecttype}.json?#{querystring}") + else + warn "Warning: Cannot use json format because json gem is not installed. Using xml format instead." + parms[:format] = 'xml' + uri = URI::join(@server, "#{objecttype}.xml?#{querystring}") + end + else + uri = URI::join(@server, "#{objecttype}.xml?#{querystring}") + end + req = Net::HTTP::Get.new(uri.request_uri) warn "GET URL: #{uri}" if (@debug) response = send_request(req, uri, login, password_callback) @@ -316,26 +336,28 @@ response.error! end - # - # Parse the XML data from the server - # This tries to render the XML into the best possible representation - # as a Perl hash. It may need to evolve over time. - # - - puts response.body if (@debug) - results_xml = REXML::Document.new(response.body) - results = {} - if results_xml.root.elements["/#{objecttype}"] - results_xml.root.elements["/#{objecttype}"].each do |elem| - # For some reason Elements[] is returning things other than elements, - # like text nodes - next if elem.node_type != :element - data = xml_to_ruby(elem) - name = data['name'] || data['id'] - if !results[name].nil? - warn "Duplicate entries for #{name}. Only one will be shown." + if parms[:format] == 'json' + results = JSON.parse(response.body) + else + # + # Parse the XML data from the server + # This tries to render the XML into the best possible representation + # as a Perl hash. It may need to evolve over time. + puts response.body if (@debug) + results_xml = REXML::Document.new(response.body) + results = {} + if results_xml.root.elements["/#{objecttype}"] + results_xml.root.elements["/#{objecttype}"].each do |elem| + # For some reason Elements[] is returning things other than elements, + # like text nodes + next if elem.node_type != :element + data = xml_to_ruby(elem) + name = data['name'] || data['id'] + if !results[name].nil? + warn "Duplicate entries for #{name}. Only one will be shown." + end + results[name] = data end - results[name] = data end end Modified: trunk/server/app/controllers/application_controller.rb =================================================================== --- trunk/server/app/controllers/application_controller.rb 2011-09-26 20:18:47 UTC (rev 315) +++ trunk/server/app/controllers/application_controller.rb 2011-09-28 23:27:08 UTC (rev 316) @@ -35,7 +35,7 @@ # already authenticated if they want to make a change. This # provides for a more seamless user experience. XML users # don't have to authenticate unless they're making a change. - if params[:format] && params[:format] == 'xml' + if params[:format] && (params[:format] == 'xml' or params[:format] == 'json') unless params[:controller] == 'accounts' return true if request.get? end Modified: trunk/server/app/controllers/nodes_controller.rb =================================================================== --- trunk/server/app/controllers/nodes_controller.rb 2011-09-26 20:18:47 UTC (rev 315) +++ trunk/server/app/controllers/nodes_controller.rb 2011-09-28 23:27:08 UTC (rev 316) @@ -46,6 +46,14 @@ :dasherize => false) end end + format.json do + if @objects.kind_of?(WillPaginate::Collection) + ret = {:offset => @objects.offset, :total_entries => @objects.total_entries, :per_page => @objects.per_page, :objects => @objects} + else + ret = @objects + end + render :json => ret.to_json(:include => convert_includes(includes)) + end format.csv do if params[:inline] == "off" send_data(@objects) Modified: trunk/server/app/models/search.rb =================================================================== --- trunk/server/app/models/search.rb 2011-09-26 20:18:47 UTC (rev 315) +++ trunk/server/app/models/search.rb 2011-09-28 23:27:08 UTC (rev 316) @@ -163,6 +163,8 @@ results[:csvobj] = csvobj if (params[:format] && params[:format] == 'xml') results[:search_results] = search_results + elsif (params[:format] && params[:format] == 'json') + results[:search_results] = search_results elsif (params[:format] && params[:format] == 'csv') results[:search_results] = search_results.as(:csv) else @@ -201,7 +203,19 @@ page = find_data[:page] sort = find_data[:sort] RAILS_DEFAULT_LOGGER.info "FIND INCLUDES:\n" + includes.to_yaml - if format && format == 'csv' + if (format && format == 'json') + options = { :select => select, + :joins => joins, + :include => includes, + :conditions => [ conditions_string, *conditions_values ], + :order => sort } + if page + options[:page] = page + search_results = mainmodel.def_scope.paginate(:all, options) + else + search_results = mainmodel.def_scope.find(:all, options) + end + elsif format && format == 'csv' search_results = mainmodel.def_scope.report_table(:all, :select => select, :joins => joins, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-09-26 20:18:53
|
Revision: 315 http://nventory.svn.sourceforge.net/nventory/?rev=315&view=rev Author: jhtran Date: 2011-09-26 20:18:47 +0000 (Mon, 26 Sep 2011) Log Message: ----------- on some nodes, i've experienced a situation in which the search model wasn't geenrating the correct association path when looking for node_groups that have nodes with a certain name pattern. Instead of looking at the node_group_node_assignment association, it would venture down the lb_profile->blah->some->other->recursive->path and create a sql problem on joisn. Adding these lines helps the process along to ensure it gets the right association path. Modified Paths: -------------- trunk/server/app/models/node_group.rb Modified: trunk/server/app/models/node_group.rb =================================================================== --- trunk/server/app/models/node_group.rb 2011-08-25 17:27:09 UTC (rev 314) +++ trunk/server/app/models/node_group.rb 2011-09-26 20:18:47 UTC (rev 315) @@ -327,6 +327,10 @@ :include => {:taggings=>{:tag=>{}}}} incls[:tags] = { :assoc => Tagging.reflect_on_association(:tag), :include => {:taggings=>{:tag=>{}}}} + prefnode = { :assoc => NodeGroupNodeAssignment.reflect_on_association(:node), + :include => {:node_group_node_assignments=>{:node=>{}}}} + incls[:nodes] = prefnode + incls[:node] = prefnode return incls end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-25 17:27:15
|
Revision: 314 http://nventory.svn.sourceforge.net/nventory/?rev=314&view=rev Author: jhtran Date: 2011-08-25 17:27:09 +0000 (Thu, 25 Aug 2011) Log Message: ----------- more centos6 install script improvements Modified Paths: -------------- trunk/server/install_centos6.sh Modified: trunk/server/install_centos6.sh =================================================================== --- trunk/server/install_centos6.sh 2011-08-25 04:25:10 UTC (rev 313) +++ trunk/server/install_centos6.sh 2011-08-25 17:27:09 UTC (rev 314) @@ -15,18 +15,23 @@ echo "INSTALLING... (this will take awhile, but tail -f install.log to follow)" #### OPERATING SYSTEM PRE-REQUISITES +echo "- installing system dependencies via yum..." sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm >> $LOGF 2>&1 sudo yum groupinstall "Development Tools" -y >> $LOGF 2>&1 sudo yum install mysql-server -y >> $LOGF 2>&1 -sudo service mysqld start >> $LOGF 2>&1 sudo yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc >> $LOGF 2>&1 sudo yum install -y rubygems >> $LOGF 2>&1 -sudo gem update --system && sudo gem update --system $RUBYGEMS_VER >> $LOGF 2>&1 +sudo gem update --system >> $LOGF 2>&1 +echo "- downgrading rubygems to version $RUBYGEMS_VER ..." +sudo gem update --system $RUBYGEMS_VER >> $LOGF 2>&1 sudo yum install -y graphviz >> $LOGF 2>&1 sudo yum install -y nginx >> $LOGF 2>&1 +echo "- starting mysql server..." +sudo service mysqld start >> $LOGF 2>&1 #### DEFAULT copy fake certs and keys for SSL echo "*** USING FAKE SSL KEYS AND CERTS ***" +echo "!! To install your own certs & keys, refer to $NGINX_CONFD/nginx.conf !!" if [ ! -d $NGINX_CONFD ]; then sudo mkdir -p $NGINX_CONFD fi @@ -44,12 +49,11 @@ if [ ! -d $NVENTORY_DIR ]; then sudo mkdir -p $NVENTORY_DIR fi +echo "- installing nVentory to $NVENTORY_DIR..." sudo cp -r $BASE_DIR $NVENTORY_DIR sudo cp $NVENTORY_DIR/config/nginx.conf $NGINX_CONFD user=`whoami` sudo chown -R $user $NVENTORY_DIR - -#### startup nginx sudo service nginx start if [ $? != 0 ]; then echo "Nginx failed to start - see $LOGF. Exiting" @@ -57,6 +61,7 @@ fi ### RUBYGEMS ## +echo "- installing gems (this will be long) ..." sudo gem install rails -v $RAILS_VER >> $LOGF 2>&1 sudo gem install RedCloth -v 4.2.2 >> $LOGF 2>&1 sudo gem install ruby-net-ldap -v 0.0.4 >> $LOGF 2>&1 @@ -85,6 +90,7 @@ done ### create nventory database +echo "- creating db and running db:migrate ..." mysql -u root -e 'create database nventory;' >> $LOGF 2>&1 if [ $? != 0 ]; then echo "!! unable to create nventory db in MySQL - see $LOGF. EXITING" @@ -99,11 +105,12 @@ fi ### Startup Rails +echo "- starting up unicorn..." unicorn_rails --daemonize -if [ $? == 0 ]; then - echo "*** UNICORN STARTED ###" -else +if [ $? != 0 ]; then echo "Unicorn failed to start - see $LOGF. EXITING" exit fi echo "*** NVENTORY SUCCESSFULLY INSTALLED ***" +echo "!! Make sure your iptables allows traffic to port 80 and 443 !!" +echo "Reminder - default username & password to login: admin/admin" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-25 04:25:16
|
Revision: 313 http://nventory.svn.sourceforge.net/nventory/?rev=313&view=rev Author: jhtran Date: 2011-08-25 04:25:10 +0000 (Thu, 25 Aug 2011) Log Message: ----------- spoke too soon. Rails 2.3.9 has known issues w/ broken session support ; Breaks local authentication (non-ldap/non-sso) such as fresh install logging in as user admin/admin fails. Modified Paths: -------------- trunk/server/config/environment.rb trunk/server/install_centos6.sh Modified: trunk/server/config/environment.rb =================================================================== --- trunk/server/config/environment.rb 2011-08-24 21:30:47 UTC (rev 312) +++ trunk/server/config/environment.rb 2011-08-25 04:25:10 UTC (rev 313) @@ -5,12 +5,23 @@ # ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.3.9' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') CONFIGFILE = RAILS_ROOT + '/' + 'config/nventory.conf' +if Gem::VERSION >= "1.3.6" + module Rails + class GemDependency + def requirement + r = super + (r == Gem::Requirement.default) ? nil : r + end + end + end +end + Rails::Initializer.run do |config| # Settings in config/environments/* take precedence over those specified here Modified: trunk/server/install_centos6.sh =================================================================== --- trunk/server/install_centos6.sh 2011-08-24 21:30:47 UTC (rev 312) +++ trunk/server/install_centos6.sh 2011-08-25 04:25:10 UTC (rev 313) @@ -8,7 +8,7 @@ # Sample installation script for CentOS6 MYSQL_CONFIG_FILE="/usr/bin/mysql_config" -RAILS_VER="2.3.9" +RAILS_VER="2.3.2" RUBY_VER="1.8.7" RUBYGEMS_VER="1.5.3" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-24 21:30:54
|
Revision: 312 http://nventory.svn.sourceforge.net/nventory/?rev=312&view=rev Author: jhtran Date: 2011-08-24 21:30:47 +0000 (Wed, 24 Aug 2011) Log Message: ----------- more improvement to install script Modified Paths: -------------- trunk/server/install_centos6.sh Modified: trunk/server/install_centos6.sh =================================================================== --- trunk/server/install_centos6.sh 2011-08-24 19:44:03 UTC (rev 311) +++ trunk/server/install_centos6.sh 2011-08-24 21:30:47 UTC (rev 312) @@ -3,6 +3,7 @@ BASE_DIR='./' NVENTORY_DIR='/opt/nventory' NGINX_CONFD='/etc/nginx' +LOGF=install.log # Sample installation script for CentOS6 @@ -11,35 +12,35 @@ RUBY_VER="1.8.7" RUBYGEMS_VER="1.5.3" -## install epel repo -sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm +echo "INSTALLING... (this will take awhile, but tail -f install.log to follow)" -sudo yum groupinstall "Development Tools" -y -sudo yum install mysql-server -y -sudo service mysqld start +#### OPERATING SYSTEM PRE-REQUISITES +sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm >> $LOGF 2>&1 +sudo yum groupinstall "Development Tools" -y >> $LOGF 2>&1 +sudo yum install mysql-server -y >> $LOGF 2>&1 +sudo service mysqld start >> $LOGF 2>&1 +sudo yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc >> $LOGF 2>&1 +sudo yum install -y rubygems >> $LOGF 2>&1 +sudo gem update --system && sudo gem update --system $RUBYGEMS_VER >> $LOGF 2>&1 +sudo yum install -y graphviz >> $LOGF 2>&1 +sudo yum install -y nginx >> $LOGF 2>&1 - -### OPERATING SYSTEM PRE-REQUISITES -sudo yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc -sudo yum install -y rubygems -sudo gem update --system && sudo gem update --system $RUBYGEMS_VER -sudo yum install -y graphviz -sudo yum install -y nginx - -### DEFAULT copy fake certs and keys for SSL +#### DEFAULT copy fake certs and keys for SSL echo "*** USING FAKE SSL KEYS AND CERTS ***" if [ ! -d $NGINX_CONFD ]; then sudo mkdir -p $NGINX_CONFD fi sudo cp $BASE_DIR/fakecerts/* $NGINX_CONFD -### uncomment the following, if you want to generate self signed keys & certs for nginx ssl +################################################################################################ +#### uncomment the following, if you want to generate self signed keys & certs for nginx ssl ### +################################################################################################ #sudo openssl genrsa -des3 -out $NGINX_CONFD/server.key 1024 #sudo openssl req -new -key $NGINX_CONFD/server.key -out $NGINX_CONFD/server.csr #sudo openssl rsa -in $NGINX_CONFD/server.key -out $NGINX_CONFD/cert.key #sudo openssl x509 -req -days 365 -in $NGINX_CONFD/server.csr -signkey $NGINX_CONFD/cert.key -out $NGINX_CONFD/cert.pem -### INSTALL NVENTORY ### +#### INSTALL NVENTORY ### if [ ! -d $NVENTORY_DIR ]; then sudo mkdir -p $NVENTORY_DIR fi @@ -48,43 +49,61 @@ user=`whoami` sudo chown -R $user $NVENTORY_DIR -### startup nginx +#### startup nginx sudo service nginx start +if [ $? != 0 ]; then + echo "Nginx failed to start - see $LOGF. Exiting" + exit +fi -## RUBYGEMS ## -sudo gem install rails -v $RAILS_VER -sudo gem install RedCloth -v 4.2.2 -sudo gem install ruby-net-ldap -v 0.0.4 -sudo gem install hoe -v 2.3.2 -sudo gem install ruport -v 1.6.1 -sudo gem install acts_as_reportable -v 1.1.1 -sudo gem install starling -v 0.9.8 -sudo gem install fast_xs -v 0.7.3 -sudo gem install fastercsv -v 1.2.3 -sudo gem install facter -v 1.5.6 -sudo gem install hpricot -v 0.8.1 -sudo gem install mislav-will_paginate -v 2.3.8 -sudo gem install ruby-mysql -v 2.9.4 -sudo gem install ruby-graphviz -v 0.9.0 -sudo gem install unicorn -v 0.91.0 -sudo gem install workling -v 0.4.9.9 -sudo gem install ruby-debug -v 0.10.3 -sudo gem install is_graffitiable -v 0.1.4 +### RUBYGEMS ## +sudo gem install rails -v $RAILS_VER >> $LOGF 2>&1 +sudo gem install RedCloth -v 4.2.2 >> $LOGF 2>&1 +sudo gem install ruby-net-ldap -v 0.0.4 >> $LOGF 2>&1 +sudo gem install hoe -v 2.3.2 >> $LOGF 2>&1 +sudo gem install ruport -v 1.6.1 >> $LOGF 2>&1 +sudo gem install acts_as_reportable -v 1.1.1 >> $LOGF 2>&1 +sudo gem install starling -v 0.9.8 >> $LOGF 2>&1 +sudo gem install fast_xs -v 0.7.3 >> $LOGF 2>&1 +sudo gem install fastercsv -v 1.2.3 >> $LOGF 2>&1 +sudo gem install facter -v 1.5.6 >> $LOGF 2>&1 +sudo gem install hpricot -v 0.8.1 >> $LOGF 2>&1 +sudo gem install mislav-will_paginate -v 2.3.8 --source http://gems.github.com/ >> $LOGF 2>&1 +sudo gem install ruby-mysql -v 2.9.4 >> $LOGF 2>&1 +sudo gem install ruby-graphviz -v 0.9.0 >> $LOGF 2>&1 +sudo gem install unicorn -v 0.91.0 >> $LOGF 2>&1 +sudo gem install workling -v 0.4.9.9 >> $LOGF 2>&1 +sudo gem install ruby-debug -v 0.10.3 >> $LOGF 2>&1 +sudo gem install is_graffitiable -v 0.1.4 >> $LOGF 2>&1 for i in rails RedCloth ruby-net-ldap ruport acts_as_reportable starling fast_xs fastercsv facter hpricot mislav-will_paginate ruby-mysql ruby-graphviz unicorn workling is_graffitiable; do gem list $i |grep $i > /dev/null 2>&1 - if [ $? != 0 ]; then echo "!! $i not installed." ; fi + if [ $? != 0 ]; then + echo "!! $i did not successfully install - see $LOGF. EXITING" + exit + fi done -## create nventory database -mysql -u root -e 'create database nventory;' +### create nventory database +mysql -u root -e 'create database nventory;' >> $LOGF 2>&1 +if [ $? != 0 ]; then + echo "!! unable to create nventory db in MySQL - see $LOGF. EXITING" + exit +fi -## run nventory's initial db migration to create database schema -cd $NVENTORY_DIR && rake db:migrate +### run nventory's initial db migration to create database schema +cd $NVENTORY_DIR && rake db:migrate >> $LOGF 2>&1 +if [ $? != 0 ]; then + echo "!! db migrate failed - see $LOGF. EXITING" + exit +fi -## Startup Rails +### Startup Rails unicorn_rails --daemonize if [ $? == 0 ]; then echo "*** UNICORN STARTED ###" - echo "*** NVENTORY SUCCESSFULLY INSTALLED ***" +else + echo "Unicorn failed to start - see $LOGF. EXITING" + exit fi +echo "*** NVENTORY SUCCESSFULLY INSTALLED ***" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-24 19:44:10
|
Revision: 311 http://nventory.svn.sourceforge.net/nventory/?rev=311&view=rev Author: jhtran Date: 2011-08-24 19:44:03 +0000 (Wed, 24 Aug 2011) Log Message: ----------- adding installation instructions for CentOS6 Added Paths: ----------- trunk/server/fakecerts/ trunk/server/fakecerts/cert.key trunk/server/fakecerts/cert.pem trunk/server/fakecerts/server.csr trunk/server/fakecerts/server.key trunk/server/install_centos6.sh Added: trunk/server/fakecerts/cert.key =================================================================== --- trunk/server/fakecerts/cert.key (rev 0) +++ trunk/server/fakecerts/cert.key 2011-08-24 19:44:03 UTC (rev 311) @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQC2HRb7Hn9oT0hRmnyhdfxQ9At/SGhcP9aaRbKOuMI+e0szicRi +y1ocDUcRvpDHwHw2CGCrV+s24t0ofry9QkWomO62+VEhb5L2qnqfDehyEggh6kY8 +S2pi8H2Efl5QzYzISft3/1NLKkpRgbfrS0VGAn8XOu230b2TYM1VavdcvwIDAQAB +AoGBAI+w+Db/40tscwVgPcIwE/vT81ZkzWMsQ6nKII8YHLusELQDmd7R0LGdkFvh +3t6dc+Q2TAAmCMNv0UxoY4d5SPffRqyBUknbXTxAl3k6cQ7TqJK72QYWqfo172Ll +afiMY9XUJ7LMiT1dQD/u8ASh5F6VMLyUOD/xrk2qpz2YnDkRAkEA4lNPbdKS3Cya +mfTLPLRCSRzkdVdN1h7axDFtiYq3tW6szw/X2WX517T8DOcSbYWQfR7er5QodzXr +zn3PDjbmrQJBAM39y6XWhll2JPHHxX2Go5Z26CoM6cQ389xdjTRZdvtw+xKw5VPw +QkUjoWdjyR+bmzcZVoz4NXgkyF662sCgupsCQDyEclS3XbWp550LK90Lhj3uj9gg +hBuhHHYhkVyZzw2gjmy/m8Px1KCtMEhy8SZ/9GbAfmMMhtV5gZgxY9A1NfECQCSA +TX7UdbgSjFdfm+ozWneGGHujECVZ+NdaqHPXSpMhoQvd1rU6BLQ1rRsh/nigXS+1 +SLXwIaFpeyv2Fl892/MCQQDZIXseks6ksabdiKNSRJjibwWSCH0HP2I6cr73KfF+ +GSYQ8ka3RD24e0T96PO2SJUbAo4LKBTx0OrHOS79g5UU +-----END RSA PRIVATE KEY----- Added: trunk/server/fakecerts/cert.pem =================================================================== --- trunk/server/fakecerts/cert.pem (rev 0) +++ trunk/server/fakecerts/cert.pem 2011-08-24 19:44:03 UTC (rev 311) @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICZTCCAc4CCQD6ahz0lmr8FzANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRww +GgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMR4wHAYDVQQDDBVudmVudG9yeS5t +eXNlcnZlci5jb20wHhcNMTEwODI0MTkyODU3WhcNMTIwODIzMTkyODU3WjB3MQsw +CQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMRGVmYXVs +dCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMR4wHAYDVQQDDBVu +dmVudG9yeS5teXNlcnZlci5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB +ALYdFvsef2hPSFGafKF1/FD0C39IaFw/1ppFso64wj57SzOJxGLLWhwNRxG+kMfA +fDYIYKtX6zbi3Sh+vL1CRaiY7rb5USFvkvaqep8N6HISCCHqRjxLamLwfYR+XlDN +jMhJ+3f/U0sqSlGBt+tLRUYCfxc67bfRvZNgzVVq91y/AgMBAAEwDQYJKoZIhvcN +AQEFBQADgYEAC8RHFdA2iHEbw3szN4gswE8tu28oGKpOlf9kqPMayBCOAlAyxuZf +yql2yoh7MDB5pWTJPrSe6dxf4vSJVpTV7a6ZJTybo/Lcx5h7vrvaR74Ioa+3dJj3 +F04gr8bRN7hlc1oImi2AOKorK7YJ80QAVSheXdSRuXa0GJvFoSu1viQ= +-----END CERTIFICATE----- Added: trunk/server/fakecerts/server.csr =================================================================== --- trunk/server/fakecerts/server.csr (rev 0) +++ trunk/server/fakecerts/server.csr 2011-08-24 19:44:03 UTC (rev 311) @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBtzCCASACAQAwdzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx +FTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55 +IEx0ZDEeMBwGA1UEAwwVbnZlbnRvcnkubXlzZXJ2ZXIuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQC2HRb7Hn9oT0hRmnyhdfxQ9At/SGhcP9aaRbKOuMI+ +e0szicRiy1ocDUcRvpDHwHw2CGCrV+s24t0ofry9QkWomO62+VEhb5L2qnqfDehy +Eggh6kY8S2pi8H2Efl5QzYzISft3/1NLKkpRgbfrS0VGAn8XOu230b2TYM1Vavdc +vwIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEANuLWiV4BU9Ugbpvn2DHUIWuCPqa/ +hP6bWLcO63pFvPnb400hhj1eSlQxbfXAaYETZUsAyaMZKgpx+sF5xvFyJZZjz2nv +AccqBRdkpKdzWOZG4idrep1t1XT48sq0G4Wy7hMixHN5BFan0V42n/mHT3QkFS9/ +62SKrcYgIrMfW7k= +-----END CERTIFICATE REQUEST----- Added: trunk/server/fakecerts/server.key =================================================================== --- trunk/server/fakecerts/server.key (rev 0) +++ trunk/server/fakecerts/server.key 2011-08-24 19:44:03 UTC (rev 311) @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,8B6415C36F8CCEBB + +eVh8cXlnkwHs2bxMqLJ3TX8mT9gnrrYVGOXl3Qe3Mlrxw2HRv1xHDSN6Yw3wb36Q +Z5YQru1KU04aURytqOYQ4h5w76iGJLqyo+O6S64iNgUKwPh27Y+4ZaNcvH5d4p5T +LNYPljhy++T1bH45B2JS4e1jzJx1CcYNnQmO9WFf2xG+LTb0J1GIeQsrhtFQ4if4 +6d5CQ3gHmdUawr5HOk9RXTtdLroknGFiX2Antwx3QUD/i9FJM3B2j0/EKpevvKxQ +CtfGmheFGb7AbfZIEObVQ3SIYrixk7Ge4M/TnHE049J5oHR1gU4MOvxLtAw+TWgN +bafsbfkTUh0Q08tiZVO7eK0GVKDfTSA/Cp+j49GB4rFjk1Er1FOt128DzQIEPYw1 +TpXtHEWvSPeYpRnCaAfK5tRubac6Sf8vzYIVxlA3awMJ/7dZ6MukzN6uy4b+Z+NE +8y+2xO91Lnq/IVsEWtwazSO5HuosYQBA+RiksUXop3+zCrKMza/hscZ6gsPa9Z1d +blGfZBo1BG1i0DmSg5GiIpCVo0bDbWSLeOK0lAIxr0w0lO1N8v5JsN8CalzA5S0W +IP1WjZhoF1ldiADxgjFUBZBn9bgoIh5OIU84kxVuLTQ011AQvXMTiBQvQ0BWR+Pg +MJXWZl9EW+E/k9+W0tJ9KQoo6qJ7+CKuhRsdwZbaUmcZCHri6HGU/saSDktqL2sd +Odck11uc2EmFn5oBgORTuyFfjJwBS0T3cjBSbzPBA9gq/FaIBhsIp1jtr69ht7TO +3+hYYyTaArZeWAT5ZaLa3VblhUnlNuyvI+gbeXYzvYYmhoAMAo4Ynw== +-----END RSA PRIVATE KEY----- Added: trunk/server/install_centos6.sh =================================================================== --- trunk/server/install_centos6.sh (rev 0) +++ trunk/server/install_centos6.sh 2011-08-24 19:44:03 UTC (rev 311) @@ -0,0 +1,90 @@ +#!/bin/sh + +BASE_DIR='./' +NVENTORY_DIR='/opt/nventory' +NGINX_CONFD='/etc/nginx' + +# Sample installation script for CentOS6 + +MYSQL_CONFIG_FILE="/usr/bin/mysql_config" +RAILS_VER="2.3.9" +RUBY_VER="1.8.7" +RUBYGEMS_VER="1.5.3" + +## install epel repo +sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm + +sudo yum groupinstall "Development Tools" -y +sudo yum install mysql-server -y +sudo service mysqld start + + +### OPERATING SYSTEM PRE-REQUISITES +sudo yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc +sudo yum install -y rubygems +sudo gem update --system && sudo gem update --system $RUBYGEMS_VER +sudo yum install -y graphviz +sudo yum install -y nginx + +### DEFAULT copy fake certs and keys for SSL +echo "*** USING FAKE SSL KEYS AND CERTS ***" +if [ ! -d $NGINX_CONFD ]; then + sudo mkdir -p $NGINX_CONFD +fi +sudo cp $BASE_DIR/fakecerts/* $NGINX_CONFD + +### uncomment the following, if you want to generate self signed keys & certs for nginx ssl +#sudo openssl genrsa -des3 -out $NGINX_CONFD/server.key 1024 +#sudo openssl req -new -key $NGINX_CONFD/server.key -out $NGINX_CONFD/server.csr +#sudo openssl rsa -in $NGINX_CONFD/server.key -out $NGINX_CONFD/cert.key +#sudo openssl x509 -req -days 365 -in $NGINX_CONFD/server.csr -signkey $NGINX_CONFD/cert.key -out $NGINX_CONFD/cert.pem + +### INSTALL NVENTORY ### +if [ ! -d $NVENTORY_DIR ]; then + sudo mkdir -p $NVENTORY_DIR +fi +sudo cp -r $BASE_DIR $NVENTORY_DIR +sudo cp $NVENTORY_DIR/config/nginx.conf $NGINX_CONFD +user=`whoami` +sudo chown -R $user $NVENTORY_DIR + +### startup nginx +sudo service nginx start + +## RUBYGEMS ## +sudo gem install rails -v $RAILS_VER +sudo gem install RedCloth -v 4.2.2 +sudo gem install ruby-net-ldap -v 0.0.4 +sudo gem install hoe -v 2.3.2 +sudo gem install ruport -v 1.6.1 +sudo gem install acts_as_reportable -v 1.1.1 +sudo gem install starling -v 0.9.8 +sudo gem install fast_xs -v 0.7.3 +sudo gem install fastercsv -v 1.2.3 +sudo gem install facter -v 1.5.6 +sudo gem install hpricot -v 0.8.1 +sudo gem install mislav-will_paginate -v 2.3.8 +sudo gem install ruby-mysql -v 2.9.4 +sudo gem install ruby-graphviz -v 0.9.0 +sudo gem install unicorn -v 0.91.0 +sudo gem install workling -v 0.4.9.9 +sudo gem install ruby-debug -v 0.10.3 +sudo gem install is_graffitiable -v 0.1.4 + +for i in rails RedCloth ruby-net-ldap ruport acts_as_reportable starling fast_xs fastercsv facter hpricot mislav-will_paginate ruby-mysql ruby-graphviz unicorn workling is_graffitiable; do + gem list $i |grep $i > /dev/null 2>&1 + if [ $? != 0 ]; then echo "!! $i not installed." ; fi +done + +## create nventory database +mysql -u root -e 'create database nventory;' + +## run nventory's initial db migration to create database schema +cd $NVENTORY_DIR && rake db:migrate + +## Startup Rails +unicorn_rails --daemonize +if [ $? == 0 ]; then + echo "*** UNICORN STARTED ###" + echo "*** NVENTORY SUCCESSFULLY INSTALLED ***" +fi Property changes on: trunk/server/install_centos6.sh ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-24 17:36:00
|
Revision: 310 http://nventory.svn.sourceforge.net/nventory/?rev=310&view=rev Author: jhtran Date: 2011-08-24 17:33:08 +0000 (Wed, 24 Aug 2011) Log Message: ----------- reverting to rev 303 bundle gem might not be best approach Revision Links: -------------- http://nventory.svn.sourceforge.net/nventory/?rev=303&view=rev Modified Paths: -------------- trunk/server/config/environment.rb trunk/server/db/migrate/20100208234231_create_roles.rb Added Paths: ----------- trunk/server/install.sh Removed Paths: ------------- trunk/server/Gemfile trunk/server/Gemfile.lock trunk/server/INSTALL Deleted: trunk/server/Gemfile =================================================================== --- trunk/server/Gemfile 2011-08-24 00:20:39 UTC (rev 309) +++ trunk/server/Gemfile 2011-08-24 17:33:08 UTC (rev 310) @@ -1,19 +0,0 @@ -source "http://rubygems.org" -source "http://gems.github.com" -gem "ruby-mysql" -gem "rails", "2.3.9" -gem "RedCloth", "4.2.2" -gem "ruby-net-ldap", "0.0.4" -gem "ruport", "1.6.1" -gem "acts_as_reportable", "1.1.1" -gem "starling", "0.9.8" -gem "fast_xs", "0.7.3" -gem "fastercsv", "1.2.3" -gem "facter", "1.5.6" -gem "hpricot", "0.8.1" -gem "mislav-will_paginate", "2.3.8" -gem "ruby-graphviz", "0.9.0" -gem "unicorn", "0.91.0" -gem "workling" -gem "ruby-debug", "0.10.3" -gem "is_graffitiable" Deleted: trunk/server/Gemfile.lock =================================================================== --- trunk/server/Gemfile.lock 2011-08-24 00:20:39 UTC (rev 309) +++ trunk/server/Gemfile.lock 2011-08-24 17:33:08 UTC (rev 310) @@ -1,87 +0,0 @@ -GEM - remote: http://rubygems.org/ - remote: http://gems.github.com/ - specs: - RedCloth (4.2.2) - SyslogLogger (1.4.0) - hoe (>= 1.2.0) - actionmailer (2.3.2) - actionpack (= 2.3.2) - actionpack (2.3.2) - activesupport (= 2.3.2) - activerecord (2.3.2) - activesupport (= 2.3.2) - activeresource (2.3.2) - activesupport (= 2.3.2) - activesupport (2.3.2) - acts_as_reportable (1.1.1) - ruport (>= 1.6.0) - color (1.4.1) - columnize (0.3.4) - eventmachine (0.12.10) - facter (1.5.6) - fast_xs (0.7.3) - fastercsv (1.2.3) - hoe (2.12.1) - rake (~> 0.8) - hpricot (0.8.1) - is_graffitiable (0.1.4) - linecache (0.46) - rbx-require-relative (> 0.0.4) - memcache-client (1.8.5) - mislav-will_paginate (2.3.8) - pdf-writer (1.1.8) - color (>= 1.4.0) - transaction-simple (~> 1.3) - rack (1.3.2) - rails (2.3.2) - actionmailer (= 2.3.2) - actionpack (= 2.3.2) - activerecord (= 2.3.2) - activeresource (= 2.3.2) - activesupport (= 2.3.2) - rake (>= 0.8.3) - rake (0.9.2) - rbx-require-relative (0.0.5) - ruby-debug (0.10.3) - columnize (>= 0.1) - ruby-debug-base (~> 0.10.3.0) - ruby-debug-base (0.10.3) - linecache (>= 0.3) - ruby-graphviz (0.9.0) - ruby-mysql (2.9.4) - ruby-net-ldap (0.0.4) - ruport (1.6.1) - fastercsv (= 1.2.3) - pdf-writer (= 1.1.8) - starling (0.9.8) - SyslogLogger - eventmachine (>= 0.12.0) - memcache-client - transaction-simple (1.4.0) - hoe (>= 1.1.7) - unicorn (0.91.0) - rack - workling (0.4.9.9) - -PLATFORMS - ruby - -DEPENDENCIES - RedCloth (= 4.2.2) - acts_as_reportable (= 1.1.1) - facter (= 1.5.6) - fast_xs (= 0.7.3) - fastercsv (= 1.2.3) - hpricot (= 0.8.1) - is_graffitiable - mislav-will_paginate (= 2.3.8) - rails (= 2.3.2) - ruby-debug (= 0.10.3) - ruby-graphviz (= 0.9.0) - ruby-mysql - ruby-net-ldap (= 0.0.4) - ruport (= 1.6.1) - starling (= 0.9.8) - unicorn (= 0.91.0) - workling Deleted: trunk/server/INSTALL =================================================================== --- trunk/server/INSTALL 2011-08-24 00:20:39 UTC (rev 309) +++ trunk/server/INSTALL 2011-08-24 17:33:08 UTC (rev 310) @@ -1,27 +0,0 @@ -PRE_REQUISITES - -1) MySQL Server - * Install it and create a blank 'nventory' database - * Default db user & password is 'root' & no password. - - (optional) Edit config/database.yaml to customize authentication info - -INSTALL - -1) Install rvm (http://beginrescueend.com/) - * use whichever method appropriate for your OS -2) Install bundler (http://gembundler.com/) - $ sudo gem install bundler -3) $ sudo rvm install 1.8.7 -4) $ bundle exec gem update --system 1.5.3 -5) $ bundle install -6) $ rake db:migrate -7) $ bundle exec script/server -e production -8) Open your browser: http://yourserver:3000 - - (optional) to run on port 80, do a web search on setting up "nginx rails proxy server" - -NOTES: - -- If bundle install has problems insalling the MySQL gem, try: - - $ bundle config build.mysql --with-mysql-config=/path/to/mysql_config - * example: bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config Modified: trunk/server/config/environment.rb =================================================================== --- trunk/server/config/environment.rb 2011-08-24 00:20:39 UTC (rev 309) +++ trunk/server/config/environment.rb 2011-08-24 17:33:08 UTC (rev 310) @@ -11,17 +11,6 @@ require File.join(File.dirname(__FILE__), 'boot') CONFIGFILE = RAILS_ROOT + '/' + 'config/nventory.conf' -if Gem::VERSION >= "1.3.6" - module Rails - class GemDependency - def requirement - r = super - (r == Gem::Requirement.default) ? nil : r - end - end - end -end - Rails::Initializer.run do |config| # Settings in config/environments/* take precedence over those specified here Modified: trunk/server/db/migrate/20100208234231_create_roles.rb =================================================================== --- trunk/server/db/migrate/20100208234231_create_roles.rb 2011-08-24 00:20:39 UTC (rev 309) +++ trunk/server/db/migrate/20100208234231_create_roles.rb 2011-08-24 17:33:08 UTC (rev 310) @@ -14,7 +14,6 @@ add_index :roles_users, :account_group_id add_index :roles, :name add_index :roles, :authorizable_id - admin = Account.find_by_login('admin') end def self.down Added: trunk/server/install.sh =================================================================== --- trunk/server/install.sh (rev 0) +++ trunk/server/install.sh 2011-08-24 17:33:08 UTC (rev 310) @@ -0,0 +1,89 @@ +#!/bin/sh + +# Sample installation script for CentOS5 + +MYSQL_CONFIG_DIR="/usr/bin/mysql_config" +RAILS_VER="2.3.2" + +## OPERATING SYSTEM PRE-REQUISITES +# yum install ruby -y +# yum install mysql-server -y +### for rubygems +# yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc +### for gems (hpricot & fastthread) +# yum install -y gcc make +### for graphviz gem +# yum install graphviz -y +### for mysql gem +# yum install mysql-devel -y +### for nginx +# yum install -y openssl-devel +# yum install -y gcc-c++ +# yum install -y zlib-devel +# yum install -y pcre-devel + +## goto rubygems.org to download and install rubygems (example below but you want the latest source) +# wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz +# tar zxvf rubygems-1.3.5.tgz +# cd rubygems-1.3.5 +# ruby setup.rb + +## get nginx installation package (example below but you want the latest source) +# wget http://www.nginx.eu/download/sources/nginx-0.8.9.tar.gz +# tar zxvf nginx-0.8.9.tar.gz +# cd nginx-0.8.9 +# ./configure --sbin-path=/sbin/nginx --prefix=/opt/nginx --with-http_ssl_module +# make && make install + +## generate self signed keys & certs for nginx ssl +# openssl genrsa -des3 -out server.key 1024 +# openssl req -new -key server.key -out server.csr +# openssl rsa -in server.key -out cert.key +# openssl x509 -req -days 365 -in server.csr -signkey cert.key -out cert.pem + +## move your nventory-0.<version>/server directory to /opt/nventory (this is your rails app) +# mv /home/user/nventory-0.83/server /opt/nventory + +## copy nginx.conf template overwriting original +# cp /opt/nventory/config/nginx.conf /opt/nginx/conf + +## startup nginx +# /sbin/nginx + +### install gems +# gem install rails -v $RAILS_VER +# gem install RedCloth -v 3.0.4 +# gem install ruby-net-ldap -v 0.0.4 +# gem install ruport +# gem install acts_as_reportable +# gem install starling +# gem install fast_xs +# gem install fastercsv +# gem install facter +# ### If hpricot gem install fails, try lower version +# ### Example: gem install hpricot -v 0.7 +# gem install hpricot +# gem install mongrel +# gem install mislav-will_paginate --source http://gems.github.com/ -v 2.3.2 +# gem install mongrel -v 1.1.5 +# gem install mysql -- --with-mysql-config=$MYSQL_CONFIG_DIR +# gem install ruby-graphviz +# gem install unicorn +# gem install workling +# gem install ruby-debug + +# for i in rails RedCloth ruby-net-ldap ruport acts_as_reportable starling fast_xs fastercsv facter hpricot mongrel mislav-will_paginate mongrel mysql ruby-graphviz unicorn workling; do +# gem list $i |grep $i > /dev/null 2>&1 +# if [ $? != 0 ]; then echo "!! $i not installed." ; fi +# done + +## create nventory database +# service mysqld start +# mysql -u root nventory -e 'create database nventory;' + +## run nventory's initial db migration to create database schema +# cd /opt/nventory && rake db:migrate + +## Startup Rails +# cd /opt/nventory && unicorn_rails --daemonize + Property changes on: trunk/server/install.sh ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-24 00:20:45
|
Revision: 309 http://nventory.svn.sourceforge.net/nventory/?rev=309&view=rev Author: jhtran Date: 2011-08-24 00:20:39 +0000 (Wed, 24 Aug 2011) Log Message: ----------- upgrade RAILS_GEM_VERSION to 2.3.9 tested Modified Paths: -------------- trunk/server/Gemfile trunk/server/INSTALL trunk/server/config/environment.rb Modified: trunk/server/Gemfile =================================================================== --- trunk/server/Gemfile 2011-08-23 22:43:22 UTC (rev 308) +++ trunk/server/Gemfile 2011-08-24 00:20:39 UTC (rev 309) @@ -1,7 +1,7 @@ source "http://rubygems.org" source "http://gems.github.com" gem "ruby-mysql" -gem "rails", "2.3.2" +gem "rails", "2.3.9" gem "RedCloth", "4.2.2" gem "ruby-net-ldap", "0.0.4" gem "ruport", "1.6.1" Modified: trunk/server/INSTALL =================================================================== --- trunk/server/INSTALL 2011-08-23 22:43:22 UTC (rev 308) +++ trunk/server/INSTALL 2011-08-24 00:20:39 UTC (rev 309) @@ -1,3 +1,10 @@ +PRE_REQUISITES + +1) MySQL Server + * Install it and create a blank 'nventory' database + * Default db user & password is 'root' & no password. + - (optional) Edit config/database.yaml to customize authentication info + INSTALL 1) Install rvm (http://beginrescueend.com/) @@ -7,7 +14,10 @@ 3) $ sudo rvm install 1.8.7 4) $ bundle exec gem update --system 1.5.3 5) $ bundle install -6) $ bundle exec script/server +6) $ rake db:migrate +7) $ bundle exec script/server -e production +8) Open your browser: http://yourserver:3000 + - (optional) to run on port 80, do a web search on setting up "nginx rails proxy server" NOTES: Modified: trunk/server/config/environment.rb =================================================================== --- trunk/server/config/environment.rb 2011-08-23 22:43:22 UTC (rev 308) +++ trunk/server/config/environment.rb 2011-08-24 00:20:39 UTC (rev 309) @@ -5,7 +5,7 @@ # ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.3.9' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-23 22:43:28
|
Revision: 308 http://nventory.svn.sourceforge.net/nventory/?rev=308&view=rev Author: jhtran Date: 2011-08-23 22:43:22 +0000 (Tue, 23 Aug 2011) Log Message: ----------- some more install instruction update Modified Paths: -------------- trunk/server/INSTALL Modified: trunk/server/INSTALL =================================================================== --- trunk/server/INSTALL 2011-08-23 22:42:03 UTC (rev 307) +++ trunk/server/INSTALL 2011-08-23 22:43:22 UTC (rev 308) @@ -1,8 +1,10 @@ INSTALL 1) Install rvm (http://beginrescueend.com/) + * use whichever method appropriate for your OS 2) Install bundler (http://gembundler.com/) -3) $ rvm install 1.8.7 + $ sudo gem install bundler +3) $ sudo rvm install 1.8.7 4) $ bundle exec gem update --system 1.5.3 5) $ bundle install 6) $ bundle exec script/server This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-23 22:42:09
|
Revision: 307 http://nventory.svn.sourceforge.net/nventory/?rev=307&view=rev Author: jhtran Date: 2011-08-23 22:42:03 +0000 (Tue, 23 Aug 2011) Log Message: ----------- update instruction to ensure rubygems v 1.5.3 is installed Modified Paths: -------------- trunk/server/INSTALL Modified: trunk/server/INSTALL =================================================================== --- trunk/server/INSTALL 2011-08-23 22:13:01 UTC (rev 306) +++ trunk/server/INSTALL 2011-08-23 22:42:03 UTC (rev 307) @@ -3,8 +3,9 @@ 1) Install rvm (http://beginrescueend.com/) 2) Install bundler (http://gembundler.com/) 3) $ rvm install 1.8.7 -3) $ bundle install -4) $ bundle exec script/server +4) $ bundle exec gem update --system 1.5.3 +5) $ bundle install +6) $ bundle exec script/server NOTES: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-23 22:13:09
|
Revision: 306 http://nventory.svn.sourceforge.net/nventory/?rev=306&view=rev Author: jhtran Date: 2011-08-23 22:13:01 +0000 (Tue, 23 Aug 2011) Log Message: ----------- updated files, installation wasn't working Modified Paths: -------------- trunk/server/config/environment.rb Added Paths: ----------- trunk/server/Gemfile trunk/server/Gemfile.lock trunk/server/INSTALL Removed Paths: ------------- trunk/server/install.sh Added: trunk/server/Gemfile =================================================================== --- trunk/server/Gemfile (rev 0) +++ trunk/server/Gemfile 2011-08-23 22:13:01 UTC (rev 306) @@ -0,0 +1,19 @@ +source "http://rubygems.org" +source "http://gems.github.com" +gem "ruby-mysql" +gem "rails", "2.3.2" +gem "RedCloth", "4.2.2" +gem "ruby-net-ldap", "0.0.4" +gem "ruport", "1.6.1" +gem "acts_as_reportable", "1.1.1" +gem "starling", "0.9.8" +gem "fast_xs", "0.7.3" +gem "fastercsv", "1.2.3" +gem "facter", "1.5.6" +gem "hpricot", "0.8.1" +gem "mislav-will_paginate", "2.3.8" +gem "ruby-graphviz", "0.9.0" +gem "unicorn", "0.91.0" +gem "workling" +gem "ruby-debug", "0.10.3" +gem "is_graffitiable" Added: trunk/server/Gemfile.lock =================================================================== --- trunk/server/Gemfile.lock (rev 0) +++ trunk/server/Gemfile.lock 2011-08-23 22:13:01 UTC (rev 306) @@ -0,0 +1,87 @@ +GEM + remote: http://rubygems.org/ + remote: http://gems.github.com/ + specs: + RedCloth (4.2.2) + SyslogLogger (1.4.0) + hoe (>= 1.2.0) + actionmailer (2.3.2) + actionpack (= 2.3.2) + actionpack (2.3.2) + activesupport (= 2.3.2) + activerecord (2.3.2) + activesupport (= 2.3.2) + activeresource (2.3.2) + activesupport (= 2.3.2) + activesupport (2.3.2) + acts_as_reportable (1.1.1) + ruport (>= 1.6.0) + color (1.4.1) + columnize (0.3.4) + eventmachine (0.12.10) + facter (1.5.6) + fast_xs (0.7.3) + fastercsv (1.2.3) + hoe (2.12.1) + rake (~> 0.8) + hpricot (0.8.1) + is_graffitiable (0.1.4) + linecache (0.46) + rbx-require-relative (> 0.0.4) + memcache-client (1.8.5) + mislav-will_paginate (2.3.8) + pdf-writer (1.1.8) + color (>= 1.4.0) + transaction-simple (~> 1.3) + rack (1.3.2) + rails (2.3.2) + actionmailer (= 2.3.2) + actionpack (= 2.3.2) + activerecord (= 2.3.2) + activeresource (= 2.3.2) + activesupport (= 2.3.2) + rake (>= 0.8.3) + rake (0.9.2) + rbx-require-relative (0.0.5) + ruby-debug (0.10.3) + columnize (>= 0.1) + ruby-debug-base (~> 0.10.3.0) + ruby-debug-base (0.10.3) + linecache (>= 0.3) + ruby-graphviz (0.9.0) + ruby-mysql (2.9.4) + ruby-net-ldap (0.0.4) + ruport (1.6.1) + fastercsv (= 1.2.3) + pdf-writer (= 1.1.8) + starling (0.9.8) + SyslogLogger + eventmachine (>= 0.12.0) + memcache-client + transaction-simple (1.4.0) + hoe (>= 1.1.7) + unicorn (0.91.0) + rack + workling (0.4.9.9) + +PLATFORMS + ruby + +DEPENDENCIES + RedCloth (= 4.2.2) + acts_as_reportable (= 1.1.1) + facter (= 1.5.6) + fast_xs (= 0.7.3) + fastercsv (= 1.2.3) + hpricot (= 0.8.1) + is_graffitiable + mislav-will_paginate (= 2.3.8) + rails (= 2.3.2) + ruby-debug (= 0.10.3) + ruby-graphviz (= 0.9.0) + ruby-mysql + ruby-net-ldap (= 0.0.4) + ruport (= 1.6.1) + starling (= 0.9.8) + unicorn (= 0.91.0) + workling Added: trunk/server/INSTALL =================================================================== --- trunk/server/INSTALL (rev 0) +++ trunk/server/INSTALL 2011-08-23 22:13:01 UTC (rev 306) @@ -0,0 +1,14 @@ +INSTALL + +1) Install rvm (http://beginrescueend.com/) +2) Install bundler (http://gembundler.com/) +3) $ rvm install 1.8.7 +3) $ bundle install +4) $ bundle exec script/server + +NOTES: + +- If bundle install has problems insalling the MySQL gem, try: + + $ bundle config build.mysql --with-mysql-config=/path/to/mysql_config + * example: bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config Modified: trunk/server/config/environment.rb =================================================================== --- trunk/server/config/environment.rb 2011-08-05 23:02:25 UTC (rev 305) +++ trunk/server/config/environment.rb 2011-08-23 22:13:01 UTC (rev 306) @@ -11,6 +11,17 @@ require File.join(File.dirname(__FILE__), 'boot') CONFIGFILE = RAILS_ROOT + '/' + 'config/nventory.conf' +if Gem::VERSION >= "1.3.6" + module Rails + class GemDependency + def requirement + r = super + (r == Gem::Requirement.default) ? nil : r + end + end + end +end + Rails::Initializer.run do |config| # Settings in config/environments/* take precedence over those specified here Deleted: trunk/server/install.sh =================================================================== --- trunk/server/install.sh 2011-08-05 23:02:25 UTC (rev 305) +++ trunk/server/install.sh 2011-08-23 22:13:01 UTC (rev 306) @@ -1,89 +0,0 @@ -#!/bin/sh - -# Sample installation script for CentOS5 - -MYSQL_CONFIG_DIR="/usr/bin/mysql_config" -RAILS_VER="2.3.2" - -## OPERATING SYSTEM PRE-REQUISITES -# yum install ruby -y -# yum install mysql-server -y -### for rubygems -# yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc -### for gems (hpricot & fastthread) -# yum install -y gcc make -### for graphviz gem -# yum install graphviz -y -### for mysql gem -# yum install mysql-devel -y -### for nginx -# yum install -y openssl-devel -# yum install -y gcc-c++ -# yum install -y zlib-devel -# yum install -y pcre-devel - -## goto rubygems.org to download and install rubygems (example below but you want the latest source) -# wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz -# tar zxvf rubygems-1.3.5.tgz -# cd rubygems-1.3.5 -# ruby setup.rb - -## get nginx installation package (example below but you want the latest source) -# wget http://www.nginx.eu/download/sources/nginx-0.8.9.tar.gz -# tar zxvf nginx-0.8.9.tar.gz -# cd nginx-0.8.9 -# ./configure --sbin-path=/sbin/nginx --prefix=/opt/nginx --with-http_ssl_module -# make && make install - -## generate self signed keys & certs for nginx ssl -# openssl genrsa -des3 -out server.key 1024 -# openssl req -new -key server.key -out server.csr -# openssl rsa -in server.key -out cert.key -# openssl x509 -req -days 365 -in server.csr -signkey cert.key -out cert.pem - -## move your nventory-0.<version>/server directory to /opt/nventory (this is your rails app) -# mv /home/user/nventory-0.83/server /opt/nventory - -## copy nginx.conf template overwriting original -# cp /opt/nventory/config/nginx.conf /opt/nginx/conf - -## startup nginx -# /sbin/nginx - -### install gems -# gem install rails -v $RAILS_VER -# gem install RedCloth -v 3.0.4 -# gem install ruby-net-ldap -v 0.0.4 -# gem install ruport -# gem install acts_as_reportable -# gem install starling -# gem install fast_xs -# gem install fastercsv -# gem install facter -# ### If hpricot gem install fails, try lower version -# ### Example: gem install hpricot -v 0.7 -# gem install hpricot -# gem install mongrel -# gem install mislav-will_paginate --source http://gems.github.com/ -v 2.3.2 -# gem install mongrel -v 1.1.5 -# gem install mysql -- --with-mysql-config=$MYSQL_CONFIG_DIR -# gem install ruby-graphviz -# gem install unicorn -# gem install workling -# gem install ruby-debug - -# for i in rails RedCloth ruby-net-ldap ruport acts_as_reportable starling fast_xs fastercsv facter hpricot mongrel mislav-will_paginate mongrel mysql ruby-graphviz unicorn workling; do -# gem list $i |grep $i > /dev/null 2>&1 -# if [ $? != 0 ]; then echo "!! $i not installed." ; fi -# done - -## create nventory database -# service mysqld start -# mysql -u root nventory -e 'create database nventory;' - -## run nventory's initial db migration to create database schema -# cd /opt/nventory && rake db:migrate - -## Startup Rails -# cd /opt/nventory && unicorn_rails --daemonize - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-08-05 23:02:33
|
Revision: 305 http://nventory.svn.sourceforge.net/nventory/?rev=305&view=rev Author: jhtran Date: 2011-08-05 23:02:25 +0000 (Fri, 05 Aug 2011) Log Message: ----------- nventory client fixes redirect loop when auth local Added Paths: ----------- tags/client-1.66.3/ tags/client-1.66.3/perl/nVentory/Client.pm Removed Paths: ------------- tags/client-1.66.3/perl/nVentory/Client.pm Deleted: tags/client-1.66.3/perl/nVentory/Client.pm =================================================================== --- branches/client-1.66.3/perl/nVentory/Client.pm 2011-08-02 22:42:25 UTC (rev 303) +++ tags/client-1.66.3/perl/nVentory/Client.pm 2011-08-05 23:02:25 UTC (rev 305) @@ -1,1433 +0,0 @@ -package nVentory::Client; - -use strict; -use warnings; -use POSIX qw/strftime/; -use nVentory::HardwareInfo; -use nVentory::OSInfo; -use LWP::UserAgent; -use File::stat; -use URI; -use HTTP::Cookies; -use HTTP::Request::Common; # GET, PUT, POST -use HTTP::Status; # RC_* constants -use File::stat; # Improved stat -use XML::LibXML; - -my $debug; -my $dryrun; - -my $SERVER = 'http://nventory'; -my $PROXY_SERVER; -my $AUTOREG_PW; -#my $PROXY_SERVER = 'https://proxy.example.local:8080'; - -######################################################################################## -## specify which external modules based on lshw's controller 'product' string ## -## Note: should look into Module::Load or Module::Plugin or UNIVERSAL::require ## -######################################################################################## -use nVentory::CompaqSmartArray; - -# dir location where xen/kvm img files held at the moment -# it would be nice to figure this out but I only see getting this from virsh dumpxml -my $VM_IMGDIR = '/home/xen/disks'; - -# If user manually specifies server other than the default -sub setserver -{ - $SERVER = 'http://' . $_[0]; - warn "** nVentory server: $SERVER **\n"; -} -CONFIGFILE: foreach my $configfile ('/etc/nventory.conf', $ENV{HOME}.'/.nventory.conf') -{ - if (-f $configfile) - { - open my $configfh, '<', $configfile or next CONFIGFILE; - while (<$configfh>) - { - next if (/^\s*$/); # Skip blank lines - next if (/^\s*#/); # Skip comments - chomp; - my ($key, $value) = split /\s*=\s*/, $_, 2; - if ($key eq 'server') - { - $SERVER = $value; - - # Warn the user, as this could potentially be confusing - # if they don't realize there's a config file lying - # around - #warn "Using server $SERVER from $configfile\n"; - } - elsif ($key eq 'proxy_server') - { - $PROXY_SERVER = $value; - #warn "Using proxy server $PROXY_SERVER from $configfile\n" if $debug; - } - elsif ($key eq 'ca_file' && -f $value) - { - # This currently executes before anyone could call setdebug, - # so the debug message is never printed. - #warn "Using CA file $value from $configfile\n" if ($debug); - $ENV{HTTPS_CA_FILE} = $value; - } - elsif ($key eq 'ca_path' && -d $value) - { - # This currently executes before anyone could call setdebug, - # so the debug message is never printed. - #warn "Using CA directory $value from $configfile\n" if ($debug); - $ENV{HTTPS_CA_DIR} = $value; - } - elsif ($key eq 'autoreg_password') - { - $AUTOREG_PW = $value; - } - } - close $configfh; - } -} - -my $_read_ua; -my $_write_ua; -sub _get_ua -{ - my ($login, $password_callback) = @_; - - if ($login) - { - return $_write_ua if ($_write_ua); - } - else - { - return $_read_ua if ($_read_ua); - } - - my $cookiefile; - my $password; - if ($login && $login eq 'autoreg') - { - $cookiefile = '/root/.nventory_cookie_autoreg'; - unless ($AUTOREG_PW) - { - warn "WARNING: autoreg_password not defined in nventory.conf. Defaulting to 'mypassword'\n" if ($debug); - } - $password = ($AUTOREG_PW ? $AUTOREG_PW : 'mypassword'); - warn "* AUTOREG PASSWORD: $password\n" if ($debug); - if (! -d '/root') - { - mkdir '/root' or die "mkdir: $!"; - } - } - else - { - $cookiefile = $ENV{HOME} . '/.nventory_cookie'; - } - - # Create the cookie file if it doesn't already exist - if (! -f $cookiefile) - { - warn "Creating $cookiefile\n"; - open my $cookiefh, '>', $cookiefile or die "open: $!"; - close $cookiefh; - } - # Ensure the permissions on the cookie file are appropriate, - # as it will contain a session key that could be used by others - # to impersonate this user to the server. - my $st = stat $cookiefile or die "stat: $!"; - if ($st->mode & 07177) - { - warn "Correcting permissions on $cookiefile\n"; - chmod $st->mode & 0600, $cookiefile or die "chmod: $!"; - } - - warn "Using cookies from $cookiefile\n" if ($debug); - my $cookie_jar = HTTP::Cookies->new( - file => $cookiefile, - autosave => 1, - ignore_discard => 1, - ); - - my $ua = LWP::UserAgent->new; - $ua->cookie_jar($cookie_jar); - - if ($login) - { - # User wants to be able to write to the server - - # First check if any existing session id works by sending - # an empty POST to the accounts controller. We will get - # back a 302 redirect if we need to authenticate. There's - # nothing special about accounts, we could use any controller, - # accounts just seemed appropriate. - # We include some bogus content in the post to work around - # a bug in HTTP::Request::Common::POST prior to version 5.72 of - # libwww-perl that wouldn't set a Content-Length header when the - # content is empty. RHEL 3 includes a broken version. - - ## proxing - this format doesn't work for some reason - #$ua->proxy('https', $PROXY_SERVER); - if ($PROXY_SERVER) { $ENV{HTTPS_PROXY} = $PROXY_SERVER; } - - my $response = $ua->request(POST "$SERVER/accounts.xml", { 'foo' => 'bar' }); - # NON-autoreg user logins should be redirected to SSO naturally. - if ( ($response->is_redirect) && ( $login ne 'autoreg' ) ) - { - # nventory nginx will redirect all NONfqdn (https://nventory) to FQDN. This logic will handle that, as POST will - # not follow redirect. LWP::UserAgent claims the requests_redirectable would work w/ POST but can't get to work - while (($response->is_redirect) && ($response->header('location') !~ /^https:\/\/sso.*/)) { - my $location = $response->header('location'); - $response = $ua->request(POST $location, { 'foo' => 'bar' }); - } - # encountered an sso request. this is specific to our sso implementation and our sso does a lot of redirecting on POSTs - if (($response->is_redirect) && ($response->header('location') =~ /^https:\/\/sso.*/)) { - warn "POST to $SERVER/accounts.xml was redirected, authenticating to SSO\n" if ($debug); - print "Login: $login\n"; - if (!$password) - { - # depending on what $password_callback var is, scalar or is it a subroutine - if (ref(\$password_callback) eq 'SCALAR') - { - $password = $password_callback; - } - elsif (ref(\$password_callback) eq 'REF') - { - if ( ref($password_callback) eq 'CODE' ) - { - $password = &$password_callback() ; - } - } - } - my $redirflag = 0; - my $redircount = 0; - while ($redirflag != 1 && $redircount < 7) - { - $response->header('location') =~ /^https:\/\/(sso.*)/; - my $SSO_SERVER=$1; - warn "SSO_SERVER: $SSO_SERVER\n" if ($debug); - # Logins need to go to HTTPS - my $url = URI->new("https://$SSO_SERVER/login?noredirects=1"); - $url->scheme('https'); - print "Authenticating to $url...\n"; - $response = $ua->request(POST $url, {'login' => $login, 'password' => $password}); - - if (($response->is_success) || (($response->is_redirect) && ($response->header('location') =~ /^(http|https):\/\/(sso.*)\/session\/tokens/))) - { - print "Authentication Successful\n"; - $redirflag = 1; - } elsif ($response->is_redirect) { - print "Redirected to " . $response->header('location') . "\n" if $debug; - } else { - if ($response->content =~ /Can't connect .* Invalid argument/) - { - warn "Looks like you're missing Crypt::SSLeay" - } - die "Authentication failed:\n", $response->content, "\n"; - } - print "REDIRECT COUNT: ${redircount}\n" if $debug; - $redircount++; - } # while ($redirflag != 1 && $redircount < 7) - if ($redircount == 7) { die "SSO redirect loop"; } - } - if (($response->is_redirect) && ($response->header('location') =~ /^(http|https):\/\/(sso.*)\/session\/tokens/)) { - my $location = URI->new($response->header('location')); - # SSO tries to redirect u multiple times to find the right domain but we only need the first redirect and then grab cookie - $ua->max_redirect(2); - $ua->timeout(10); - $response = $ua->get($location); - } - elsif ($response->code != '422') - { - unless ($response->code == '200') - { - die "Unable to get SSO session token. Might be authentication failure or SSO problem\n"; - } - } - $ua->max_redirect(7); - } - - sub auth_login_login - { - my $ua = $_[0]; - my $authbase = $_[1]; - my $login = $_[2]; - my $password = $_[3]; - - my $login_login_uri = URI->new("$authbase/login/login"); - $login_login_uri->scheme('https'); - my $host = $login_login_uri->host; - warn "Attempting to POST to $login_login_uri for autoreg\n" if ($debug); - my $response = $ua->request(POST $login_login_uri, {'login' => $login, 'password' => $password}); - unless (($response->is_redirect) && ($response->header('location') =~ /$host\/(accounts.xml)?$/)) - { - die "\n!!! Authentication failed !!!!\n\n" . $response->message . "\n"; - } - warn "+ Authentication Successful (autoreg /login/login) +\n" if ($debug); - return $ua; - } - - # Autoreg user should NOT be redirected to SSO even if it wants to. Autoreg auths to uri '/login/login' (which will allow LOCAL and LDAP account logins) - if ( ($response->is_redirect) && ( $login eq 'autoreg' ) ) - { - my $location; - $password = &$password_callback() if (!$password); - # if it's a redirect BUT NOT sso url, then we should follow the redirect and keep trying the post - # if the redirect is a sso url, then we know we need to authenticate by bypassing sso via the url path '/login/login' - if ($response->is_redirect) - { - $location = $response->header('location'); - my $location_uri = URI->new($location); - if ($location_uri->path =~ /login\/login/) - { - warn "UA (autoreg) - redirected to /login/login\n" if ($debug); - warn "POST to $SERVER/accounts.xml ( ** for user 'autoreg' ** ) was redirected. - \nAuthenticating to local login path: '/login/login'\n" if ($debug); - my $authbase = 'https://' . $location_uri->authority; - $ua = auth_login_login($ua, $authbase, $login, $password); - } - elsif ($location =~ /http.*:\/\/sso.*\/login/) - { - warn "UA (autoreg) - requested redirect to SSO - bypass to /login/login\n" if ($debug); - my $authbase = "$SERVER"; - $ua = auth_login_login($ua, $authbase, $login, $password); - } - else - { - warn "UA (autoreg) - 302 - following redirect ($location)\n" if ($debug); - while ($location_uri->path !~ /login\/login/) - { - $response = $ua->request(POST $location_uri->path, { 'foo' => 'bar' }); - $location_uri = URI->new($response->header('location')); - } - my $authbase = 'https://' . $location_uri->authority; - $ua = auth_login_login($ua, $authbase, $login, $password); - } - } - } - - # Cache UA - $_write_ua = $ua; - $_read_ua = $ua; - } - else - { - # Cache UA - $_read_ua = $ua; - } - - return $ua; -} - -# Sets flag for search results of deleted (hidden & reserved) objects -my $delete; -sub setdelete -{ - ($delete) = @_; - warn "** You have requested to delete object(s) **\n"; -} - -sub _xml_to_perl -{ - my ($xmlnode) = @_; - - # The server includes a hint as to the type of data structure - # in the XML - if ($xmlnode->getAttribute('type') && - $xmlnode->getAttribute('type') eq 'array') - { - my @array = (); - foreach my $child ($xmlnode->findnodes('*')) - { - push @array, _xml_to_perl($child); - } - return \@array; - } - elsif ($xmlnode->childNodes->size <= 1) - { - return $xmlnode->string_value; - } - else - { - my %hash = (); - foreach my $child ($xmlnode->findnodes('*')) - { - my $field = $child->nodeName; - $hash{$field} = _xml_to_perl($child); - } - return \%hash; - } -} - -sub get_objects -{ - # PS-544 include legacy backward support for long list of params - my ($objecttype, %get, %exactget, %regexget, %excludeget, %andget, $includesref, $login); - if (ref($_[0]) eq 'HASH') - { - die "Syntax error" if ( scalar @_ > 1 ); - my %getdata = %{$_[0]}; - die "Syntax error" unless $getdata{'objecttype'}; - $objecttype = $getdata{'objecttype'}; - %get = %{$getdata{'get'}} if defined($getdata{'get'}); - %exactget = %{$getdata{'exactget'}} if defined($getdata{'exactget'}); - %regexget = %{$getdata{'regexget'}} if defined($getdata{'regexget'}); - %excludeget = %{$getdata{'exclude'}} if defined($getdata{'exclude'}); - %andget = %{$getdata{'and'}} if defined($getdata{'and'}); - $includesref = $getdata{'includes'} if defined($getdata{'includes'}); - $login = $getdata{'login'} if defined($getdata{'login'}); - } else { - my ($getref, $exactgetref, $regexgetref, $excluderef, $andref); - ($objecttype, $getref, $exactgetref, $regexgetref, $excluderef, $andref, $includesref, $login) = @_; - %get = %$getref; - %exactget = %$exactgetref; - %regexget = %$regexgetref; - %excludeget = %$excluderef; - %andget = %$andref; - } - die "Syntax error" if ((!scalar %exactget) && (!scalar %get) && (!scalar %regexget)); - - # - # Package up the search parameters in the format the server expects - # - - my %metaget; - while (my ($key, $values) = each %get) - { - if (scalar @$values > 1) - { - $metaget{$key . '[]'} = $values; - } - else - { - # This isn't strictly necessary, specifying a single value via - # 'key[]=[value]' would work fine, but this makes for a cleaner URL - # and slightly reduced processing on the backend - my $value = @{$values}[0]; - $metaget{$key} = $value; - } - } - while (my ($key, $values) = each %exactget) - { - if (scalar @$values > 1) - { - $metaget{'exact_' . $key . '[]'} = $values; - } - else - { - # This isn't strictly necessary, specifying a single value via - # 'key[]=[value]' would work fine, but this makes for a cleaner URL - # and slightly reduced processing on the backend - my $value = @{$values}[0]; - $metaget{'exact_' . $key} = $value; - } - } - while (my ($key, $values) = each %regexget) - { - if (scalar @$values > 1) - { - $metaget{'regex_' . $key . '[]'} = $values; - } - else - { - # This isn't strictly necessary, specifying a single value via - # 'key[]=[value]' would work fine, but this makes for a cleaner URL - # and slightly reduced processing on the backend - my $value = @{$values}[0]; - $metaget{'regex_' . $key} = $value; - } - } - while (my ($key, $values) = each %excludeget) - { - if (scalar @$values > 1) - { - $metaget{'exclude_' . $key . '[]'} = $values; - } - else - { - # This isn't strictly necessary, specifying a single value via - # 'key[]=[value]' would work fine, but this makes for a cleaner URL - # and slightly reduced processing on the backend - my $value = @{$values}[0]; - $metaget{'exclude_' . $key} = $value; - } - } - while (my ($key, $values) = each %andget) - { - if (scalar @$values > 1) - { - $metaget{'and_' . $key . '[]'} = $values; - } - else - { - # This isn't strictly necessary, specifying a single value via - # 'key[]=[value]' would work fine, but this makes for a cleaner URL - # and slightly reduced processing on the backend - my $value = @{$values}[0]; - $metaget{'and_' . $key} = $value; - } - } - - if ($includesref) - { - # includes = ['status', 'rack:datacenter'] - # maps to - # include[status]=&include[rack]=datacenter - foreach my $inc (@$includesref) - { - if ($inc =~ /:/) - { - my $incstring = ''; - my @incparts = split(/:/, $inc); - my $lastpart = pop(@incparts); - $incstring = 'include'; - foreach my $part (@incparts) - { - $incstring .= "[$part]"; - } - $metaget{$incstring} = $lastpart; - } - else - { - $metaget{"include[$inc]"} = ''; - } - } - } - - # - # Send the query to the server - # - my $url = URI->new("$SERVER/$objecttype.xml"); - $url->query_form(%metaget); - my $ua = _get_ua($login); - die "Authentication failed" unless $ua; - warn "GET URL: $url\n" if ($debug); - my $response = $ua->get($url); - if (!$response->is_success) - { - die $response->status_line; - } - - # - # Parse the XML data from the server - # This tries to render the XML into the best possible representation - # as a Perl hash. It may need to evolve over time. - # - - my $parser = XML::LibXML->new(); - print $response->content if ($debug); - my $doc = $parser->parse_string($response->content); - my %results; - foreach my $xmlnode ($doc->findnodes("/$objecttype/*")) - { - my $dataref = _xml_to_perl($xmlnode); - my %data = %$dataref; - my $name = $data{name} || $data{id}; - $results{$name} = \%data; - } - - if ($debug) - { - use Data::Dumper; - print Dumper(\%results); - } - return %results; -} - -sub get_field_names -{ - my ($objecttype) = @_; - my $url = URI->new("$SERVER/$objecttype/field_names.xml"); - my $ua = _get_ua(); - warn "GET URL: $url\n" if ($debug); - my $response = $ua->get($url); - if (!$response->is_success) - { - die $response->status_line; - } - - my $parser = XML::LibXML->new(); - print $response->content if ($debug); - my $doc = $parser->parse_string($response->content); - my @field_names; - foreach my $xmlnode ($doc->findnodes("/field_names/*")) - { - push @field_names, $xmlnode->string_value; - } - return @field_names; -} - -sub get_expanded_nodegroup -{ - my ($nodegroup) = @_; - - my %getdata; - $getdata{'objecttype'} = 'node_groups'; - $getdata{'exactget'} ={ 'name' => [$nodegroup] }; - $getdata{'includes'} = ['nodes', 'child_groups']; - my %results = get_objects(\%getdata); - my %nodes; - foreach my $node (@{$results{$nodegroup}->{nodes}}) - { - $nodes{$node->{name}} = 1; - } - foreach my $child_group (@{$results{$nodegroup}->{child_groups}}) - { - foreach my $child_group_node (get_expanded_nodegroup($child_group->{name})) - { - $nodes{$child_group_node} = 1; - } - } - return sort keys %nodes; -} - -# FIXME: Would be really nice to figure out a way to use the Rails inflector -sub singularize -{ - my ($word) = @_; - my $singular; - # statuses -> status - # ip_addresses -> ip_address - if ($word =~ /(.*s)es$/) - { - $singular = $1; - } - # nodes -> node - # vips -> vip - elsif ($word =~ /(.*)s$/) - { - $singular = $1; - } - else - { - $singular = $word; - } - return $singular; -} - -# The results argument can be a reference to a hash returned by a -# call to get_objects, in which case the data will be PUT to each object -# there, thus updating them. Or it can be 'undef', in which case the -# data will be POSTed to create a new entry. -sub set_objects -{ - my ($objecttypes, $resultsref, $dataref, $login, $password_callback) = @_; - my %results; - if ($resultsref) - { - %results = %$resultsref; - } - my %data = %$dataref; - - # Convert any keys which don't already specify a model - # from 'foo' to 'objecttype[foo]' - my %cleandata; - my $objecttype = singularize($objecttypes); - - if ($dryrun) { - use Data::Dumper; - print Dumper(\%data); - exit; - } - - while (my ($key, $value) = each %data) - { - if ($key !~ /\[.+\]/) - { - $cleandata{$objecttype."[$key]"} = $value; - } - else - { - $cleandata{$key} = $value; - } - } - - if ($debug) - { - use Data::Dumper; - print Dumper(\%cleandata); - } - - my $response; - if (%results) - { - foreach my $result (keys %results) - { - my $id = $results{$result}->{id}; - - # PUT to update an existing object - if ($id && $delete) - { - my $ua = _get_ua($login, $password_callback); - warn "DELETE to URL: $SERVER/$objecttypes/$id.xml\n" if ($debug); - $response = $ua->request(POST "$SERVER/$objecttypes/$id.xml", [ _method => 'delete' ]); - while ($response->is_redirect) { - my $newlo = $response->header('location'); - print "Redirected attempt to post: $newlo\n" if $debug; - $response = $ua->request(POST $newlo, [ _method => 'delete' ]); - } - } - elsif ($id && !$delete) - { - # HTTP::Request::Common doesn't support taking form data - # and encoding it into the content field for PUT requests, - # only POST. So fake it out by asking it for a POST request - # and then converting that to PUT. - my $request = POST("$SERVER/$objecttypes/$id.xml", \%cleandata); - $request->method('PUT'); - my $ua = _get_ua($login, $password_callback); - warn "PUT to URL: $SERVER/$objecttypes/$id.xml\n" if ($debug); - $response = $ua->request($request); - # due to nginx redirect from shortname (http://nventory) to fqdn, needs to handle POST redirects - # lwp::useragent has a 'requests_redirectable' allowable for POSTS but can't get it working - while ($response->is_redirect) { - my $newlo = $response->header('location'); - $request = POST($newlo, \%cleandata); - $request->method('PUT'); - warn "PUT to URL: $newlo" if ($debug); - $response = $ua->request($request); - } - my (@output) = split("\n",$response->content); - foreach my $line (@output) { - if ($line !~ /</) { print "** INFO **: $line\n"; } - } - print "Command completed successfully\n"; - } - else - { - warn "set_objects passed a bogus \%results hash, $result has no id field\n"; - } - - # FIXME: Aborting partway through a multi-node action is probably - # not ideal behavior - if (!$response->is_success) - { - warn "Response: ", $response->status_line, "\n"; - warn "Response content:\n", $response->content, "\n"; - return $response; - } - } - } - else - { - # POST to create a new node - my $ua = _get_ua($login, $password_callback); - warn "POST to URL: $SERVER/$objecttypes.xml\n" if ($debug); - $response = $ua->request(POST "$SERVER/$objecttypes.xml", \%cleandata); - while ($response->is_redirect) { - my $newlo = $response->header('location'); - $response = $ua->request(POST $newlo, \%cleandata); - } - if ($response->code != RC_CREATED) - { - warn "Response: ", $response->status_line, "\n"; - warn "Response content:\n", $response->content, "\n"; - return $response; - } - } - return $response; -} - -sub register -{ - my %params; - %params = %{$_[0]} if $_[0]; - my %data; - - # - # Gather software-related information - # - ## NIC ## - my %nicdata = nVentory::HardwareInfo::getnicdata(\%params); - my $niccounter = 0; - while (my ($nic, $valueref) = each %nicdata) - { - $data{"network_interfaces[$niccounter][name]"} = $nic; - while (my ($field, $value) = each %$valueref) - { - if ($field eq 'ip_addresses') - { - my $ipcounter = 0; - foreach my $ipref (@$value) - { - while (my ($ipfield, $ipvalue) = each %$ipref) - { - if ($ipfield eq 'network_ports') - { - my $portcounter = 0; - while (my ($protocol, $portvalue) = each %$ipvalue) - { - while (my ($port, $app) = each %$portvalue) - { - $data{"network_interfaces[$niccounter][ip_addresses][$ipcounter][network_ports][$portcounter][protocol]"} = $protocol; - $data{"network_interfaces[$niccounter][ip_addresses][$ipcounter][network_ports][$portcounter][number]"} = $port; - $data{"network_interfaces[$niccounter][ip_addresses][$ipcounter][network_ports][$portcounter][apps]"} = $app; - $portcounter++; - } - } - } - else - { - $data{"network_interfaces[$niccounter][ip_addresses][$ipcounter][$ipfield]"} = $ipvalue; - } - } - $ipcounter++; - } - } - else - { - # The library gathers a few bits of data that the server - # doesn't support. Filter those out. - next if ($field eq 'txerrs'); - next if ($field eq 'rxerrs'); - - $data{"network_interfaces[$niccounter][$field]"} = $value; - } - } - $niccounter++; - } - # Mark our NIC data as authoritative so that the server properly - # updates its records (removing any NICs and IPs we don't specify) - $data{"network_interfaces[authoritative]"} = 1; - - $data{name} = nVentory::OSInfo::getfqdn(); - $data{updated_at} = strftime("%Y-%m-%d %H:%M:%S",localtime); - $data{'name_aliases[name]'} = join(',', nVentory::OSInfo::getaliases()); - $data{'operating_system[variant]'} = nVentory::OSInfo::getos(); - $data{'operating_system[version_number]'} = nVentory::OSInfo::getosversion(); - $data{'operating_system[architecture]'} = nVentory::OSInfo::getosarch(); - $data{kernel_version} = nVentory::OSInfo::getkernelversion(); - $data{os_memory} = nVentory::OSInfo::getosmemory(); - $data{swap} = nVentory::OSInfo::getswapmemory(); - my %oscpus = nVentory::OSInfo::get_os_cpu_count(); - $data{os_processor_count} = $oscpus{physical} if $oscpus{physical}; - $data{os_virtual_processor_count} = $oscpus{virtual} if $oscpus{virtual}; - $data{timezone} = nVentory::OSInfo::get_timezone(); - my $temp_cpu_percent = nVentory::OSInfo::getcpupercent(); - if (($temp_cpu_percent =~ /\S/) && ($temp_cpu_percent ne 'false')) { - $data{'utilization_metric[percent_cpu][value]'} = $temp_cpu_percent; - } - $data{'utilization_metric[login_count][value]'} = nVentory::OSInfo::getlogincount(); - my %disk_usage = nVentory::OSInfo::getdiskusage(); - $data{used_space} = $disk_usage{used_space}; - $data{avail_space} = $disk_usage{avail_space}; - my %volumes = nVentory::OSInfo::getvolumes(); - foreach my $key (keys(%volumes)) { - $data{$key} = $volumes{$key}; - } - - # - # Gather hardware-related information - # - - $data{'hardware_profile[manufacturer]'} = nVentory::HardwareInfo::get_host_manufacturer() || 'Unknown'; - $data{'hardware_profile[model]'} = nVentory::HardwareInfo::get_host_model() || 'Unknown'; - $data{serial_number} = nVentory::HardwareInfo::get_host_serial(); - - $data{processor_manufacturer} = nVentory::HardwareInfo::get_cpu_manufacturer(); - $data{processor_model} = nVentory::HardwareInfo::get_cpu_model(); - $data{processor_speed} = nVentory::HardwareInfo::get_cpu_speed(); - $data{processor_count} = nVentory::HardwareInfo::get_cpu_count(); - $data{processor_core_count} = nVentory::HardwareInfo::get_cpu_core_count(); - $data{processor_socket_count} = nVentory::HardwareInfo::get_cpu_socket_count(); - $data{power_supply_count} = nVentory::HardwareInfo::get_power_supply_count(); - - my $physical_memory = nVentory::HardwareInfo::get_physical_memory(); - $data{physical_memory} = $physical_memory unless (!$physical_memory); - # The library returns an array of the sizes of each of the DIMMs in the - # system. We want to condense that into an easier to read format for - # storage in the database. So "1024,1024,1024,1024" becomes "4@1024" - # and "512,512,1024,1024" becomes "2@512,2@1024" - my %physical_memory_sizes; - foreach my $size (nVentory::HardwareInfo::get_physical_memory_sizes()) - { - $physical_memory_sizes{$size}++; - } - my @physical_memory_sizes; - sub numerically_if_possible - { - if ($a =~ /^\d+$/ && $b =~ /^\d+$/) - { - $a <=> $b; - } - else - { - $a cmp $b; - } - } - foreach my $size (sort numerically_if_possible keys %physical_memory_sizes) - { - push @physical_memory_sizes, $physical_memory_sizes{$size} . 'x' . $size; - } - my $temp_physical_memory_sizes = join ',', @physical_memory_sizes; - $data{physical_memory_sizes} = $temp_physical_memory_sizes unless (!$temp_physical_memory_sizes); - # Switchport detection depends on if virtual or not - - ## KVM/XEN HOST <=> GUEST REGISTRATION - my $virtual_status = nVentory::OSInfo::getvirtualstatus(); - ## GUESTS - ## some facter versions prior to 1.5.8 fail to report a xen guest as virtual so switching to checking for the module - if (($virtual_status eq 'kvm') || (-e '/proc/modules' && (system("grep -q ^xen /proc/modules") == 0))) - { - if ($virtual_status eq 'kvm') - { - $data{virtualarch} = 'kvm'; - } - else - { - $data{virtualarch} = 'xen'; - $data{'hardware_profile[manufacturer]'} = 'Xen' if ($data{'hardware_profile[manufacturer]'} eq 'Unknown'); - $data{'hardware_profile[model]'} = 'VM' if ($data{'hardware_profile[model]'} eq 'Unknown'); - } - print "$data{virtualarch} GUEST VM\n"; - $data{virtualmode} = 'guest'; - } - ## MASTER HOSTS - elsif ((-e '/dev/kvm') || ($virtual_status =~ /xen0/)) - { - if (-e '/dev/kvm') - { - $data{virtualarch} = 'kvm'; - } - else - { - $data{virtualarch} = 'xen'; - } - my %virtualhostinfo = nVentory::OSInfo::getvirtualhostinfo; - print "$data{virtualarch} MASTER HOST\n"; - $data{virtualmode} = 'host'; - - foreach my $valuedguest (@{$virtualhostinfo{'guests'}}) - { - next unless $valuedguest; - print "$valuedguest\n"; - my $size; - my $sparse_size; - if (-e "$VM_IMGDIR/$valuedguest.img") - { - $size = -s "$VM_IMGDIR/$valuedguest.img"; - $size = round($size / 1024); - my $st = stat("$VM_IMGDIR/$valuedguest.img"); - my $blocks = $st->blocks; - $sparse_size = $blocks * 512; - $sparse_size = round($sparse_size / 1024); - } - print " IMG SIZE: $size KB\n" if $size ; - print " SPARSE SIZE: $sparse_size KB\n" if $sparse_size; - $data{"vmguest[$valuedguest][vmimg_size]"} = $size; - $data{"vmguest[$valuedguest][vmspace_used]"} = $sparse_size; - ## subroutine to round the integer when divided - sub round - { - my($number) = shift; - return int($number + .5); - } - } - } - - ## VMWARE HOST <=> GUEST REGISTRATION - my $vmware_status = nVentory::OSInfo::getvmwarestatus(); - if ($vmware_status eq 'vmware_server') - { - $data{virtualarch} = 'vmware'; - print "VMWARE MASTER HOST. Listing all guest vm data:\n"; - $data{virtualmode} = 'host'; - my %vmwarehostdata = nVentory::OSInfo::getvmwarehostinfo; - unless (scalar(keys %vmwarehostdata) == 0) - { - foreach my $key (sort(keys %vmwarehostdata)) - { - $data{$key} = $vmwarehostdata{$key}; - print "$key = $vmwarehostdata{$key}\n"; - } - } - } - elsif ($vmware_status eq 'vmware') - { - $data{virtualarch} = 'vmware'; - print "VMWARE GUEST\n"; - } - - $params{virtualarch} = $data{virtualarch} if $data{virtualarch}; - $params{virtualmode} = $data{virtualmode} if $data{virtualmode}; - - ## STORAGE - convert storage hash to RESTful format ## - my %storage = nVentory::HardwareInfo::getstoragedata(\%params); - my $strg_counter = 0; - my $drivecounter = 0; - my $volumecounter = 0; - # note that controllers, drives and volumes each have different @exceptions (fields to ignore) from each other - while (my ($ctrlrkey, $ctrlrref) = each %storage) - { - my %ctrlrhash = %{$ctrlrref}; - if ($ctrlrhash{'description'}) - { - $data{"storage_controllers[$strg_counter][name]"} = $ctrlrhash{'description'}; - } - else - { - $data{"storage_controllers[$strg_counter][name]"} = $ctrlrhash{'logicalname'}; - } - ###################################################################### - ## if needs external modules due to custom raid controller commands ## - ###################################################################### - if (($ctrlrhash{'product'}) && ($ctrlrhash{'product'} =~ /Smart Array/)) - { - my %result = nVentory::CompaqSmartArray::parse_storage(); - foreach my $key (keys %result) - { - $data{"storage_controllers[$strg_counter]$key"} = $result{$key}; - } - } - #### END CUSTOM RAID ARRAY MODULE #### - - while (my ($ctrlrkey, $ctrlrvalue) = each %ctrlrhash) - { - if (ref($ctrlrvalue) eq "HASH") - { - my %drivehash = %{$ctrlrvalue}; - unless ($drivehash{'class'} eq 'disk') - { - %drivehash = find_classhash(\%drivehash, 'disk'); - } - next unless %drivehash; - while (my ($drivefield, $drivevalue) = each %drivehash) - { - if (ref($drivevalue) eq "HASH") - { - my %volumehash = %{$drivevalue}; - unless ($volumehash{'class'} eq 'volume') - { - %volumehash = find_classhash(\%volumehash, 'volume'); - } - next unless %volumehash; - while (my ($volumefield, $volumevalue) = each %volumehash) - { - if ($volumefield eq 'id') - { - $data{"storage_controllers[$strg_counter][drives][$drivecounter][volumes][$volumecounter][name]"} = $volumevalue; - next; - } - $data{"storage_controllers[$strg_counter][drives][$drivecounter][volumes][$volumecounter][$volumefield]"} = $volumevalue; - } - $volumecounter++; - } else { - if ($drivefield eq 'id') - { - $data{"storage_controllers[$strg_counter][drives][$drivecounter][name]"} = $drivevalue; - next; - } - $data{"storage_controllers[$strg_counter][drives][$drivecounter][$drivefield]"} = $drivevalue; - } # if (ref($drivevalue) eq "HASH") - } # while (my ($drivefield, $drivevalue) = each %drivehash) - $drivecounter++; - } else { - $data{"storage_controllers[$strg_counter][$ctrlrkey]"} = $ctrlrvalue; - } # if (ref($ctrlrvalue) eq "HASH") - } # while (my ($ctrlrkey, $ctrlrvalue) = each %ctrlrhash) - $strg_counter++; - } # while (my ($ctrlrkey, $ctrlrref) = each %storage) - $data{"storage_controllers[authoritative]"} = 1; - - $data{uniqueid} = nVentory::HardwareInfo::get_uniqueid(); - - ## recursive subroutine used by above - sub find_classhash { - my %tmphash = %{$_[0]}; - my $class = $_[1]; - my %results; - if (($tmphash{'class'}) && ($tmphash{'class'} eq $class)) - { - return %tmphash; - } else { - while (my ($k,$v) = each %tmphash) - { - if (ref($v) eq 'HASH') - { - %results = find_classhash(\%{$v}, $class); - } - } - } - return %results; - } - - # - # Report data to server - # - - # Check to see if there's an existing entry for this host that matches - # our unique id. If so we want to update it, even if the hostname - # doesn't match our current hostname (as it probably indicates this - # host was renamed). - my %results; - if ($data{uniqueid}) - { - my %getdata; - $getdata{'objecttype'} = 'nodes'; - $getdata{'exactget'} = {'uniqueid' => [$data{uniqueid}]}; - $getdata{'login'} = 'autoreg'; - %results = get_objects(\%getdata); - # - # Check for a match of the reverse uniqueid. - # Background: - # Dmidecode versions earlier than 2.10 display - # the first three fields of the UUID in reverse order - # due to the use of Big-endian rather than Little-endian - # byte encoding. - # Starting with version 2.10, dmidecode uses Little-endian - # when it finds an SMBIOS >= 2.6. UUID's reported from SMBIOS' - # earlier than 2.6 are considered "incorrect". - # - # After a rebuild/upgrade, rather than creating a new node - # entry for an existing asset, we'll check for the flipped - # version of the uniqueid. - # - if (!%results) - { - if ( $data{uniqueid} =~ /(.*)\-(.*)\-(.*)\-(.*)\-(.*)/ ) - { - my @reverse_uniqueid; - foreach ($1, $2, $3) - { - push (@reverse_uniqueid, (reverse (split((/(\w{2})/), $_)))); - push (@reverse_uniqueid, "-"); - } - push (@reverse_uniqueid, $4, "-", $5); - @reverse_uniqueid = join("", @reverse_uniqueid); - $getdata{'exactget'} = {'uniqueid' => [@reverse_uniqueid]}; - %results = get_objects(\%getdata); - } - } - } - - # If we failed to find an existing entry based on the unique id - # fall back to the hostname. This may still fail to find an entry, - # if this is a new host, but that's OK as it will leave %results - # as undef, which triggers set_objects to create a new entry on the - # server. - if (!%results && $data{name}) - { - my %getdata; - $getdata{'objecttype'} = 'nodes'; - $getdata{'exactget'} = {'name' => [$data{name}]}; - $getdata{'login'} = 'autoreg'; - %results = get_objects(\%getdata); - } - - set_objects('nodes', \%results, \%data, 'autoreg'); -} - -# The first argument is a reference to a hash returned by a 'nodes' call -# to get_objects -# The second argument is a reference to a hash returned by a 'node_groups' -# call to get_objects -# NOTE: For the node groups you must have requested that the server include 'nodes' in the result -sub add_nodes_to_nodegroups -{ - my ($nodesref, $nodegroupsref, $login, $password_callback) = @_; - my %nodes = %$nodesref; - my %nodegroups = %$nodegroupsref; - - # The server only supports setting a complete list of members of - # a node group. So we need to retreive the current list of members - # for each group, merge in the additional nodes that the user wants - # added, and pass that off to set_nodegroup_assignments to perform - # the update. - # FIXME: This should talk directly to the node_group_node_assignments - # controller, so that we aren't exposed to the race conditions this - # method currently suffers from. - foreach my $nodegroup (keys %nodegroups) - { - my %real_nodes; - foreach my $realnode (split(',', $nodegroups{$nodegroup}->{real_nodes_names})) - { - $real_nodes{$realnode} = 1; - } - - # Use a hash to merge the current and new members and - # eliminate duplicates - my %merged_nodes; - - %merged_nodes = %nodes; - - # now merge in the pre-existing nodes from that ng - foreach my $node (@{$nodegroups{$nodegroup}->{nodes}}) - { - my $name = $node->{name}; - # unless the node is a virtual - $merged_nodes{$name} = $node if $real_nodes{$name}; - } - - set_nodegroup_node_assignments(\%merged_nodes, {$nodegroup => $nodegroups{$nodegroup}}, $login, $password_callback); - } -} - -sub add_comment_to_obj -{ - my ($objecttypes, $objref, $comment, $login, $password_callback) = @_; - my %objects = %$objref; - foreach my $key (keys %objects) { - my @under = split(/_/,$objecttypes); - my @upper = map(ucfirst, @under); - my $camelized_objecttype = singularize(join('',@upper)); - set_objects('comments', undef, - { 'comment' => $comment, - 'commentable_id' => ${${objects}{$key}}{"id"}, - 'commentable_type' => $camelized_objecttype, - }, - $login, $password_callback); - } -} -# The first argument is a reference to a hash returned by a 'nodes' call -# to get_objects -# The second argument is a reference to a hash returned by a 'node_groups' -# call to get_objects -# NOTE: For the node groups you must have requested that the server include 'nodes' in the result -sub remove_nodes_from_nodegroups -{ - my ($nodesref, $nodegroupsref, $login, $password_callback) = @_; - my %nodes = %$nodesref; - my %nodegroups = %$nodegroupsref; - - # The server only supports setting a complete list of members of - # a node group. So we need to retreive the current list of members - # for each group, remove the nodes that the user wants - # removed, and pass that off to set_nodegroup_assignments to perform - # the update. - # FIXME: This should talk directly to the node_group_node_assignments - # controller, so that we aren't exposed to the race conditions this - # method currently suffers from. - foreach my $nodegroup (keys %nodegroups) - { - - # build the list of ALL nodes minus the nodes to be deleted - my %real_nodes; - foreach my $realnode (split(',', $nodegroups{$nodegroup}->{real_nodes_names})) - { - $real_nodes{$realnode} = 1; - } - my %desired_nodes; - - foreach my $node (@{$nodegroups{$nodegroup}->{nodes}}) - { - if (my $name = $node->{name}) { - # don't process virtuals - $desired_nodes{$name} = $node if ( (!$nodes{$name}) && ($real_nodes{$name}) ) - } - } - - set_nodegroup_node_assignments(\%desired_nodes, {$nodegroup => $nodegroups{$nodegroup}}, $login, $password_callback); - } -} -# The first argument is a reference to a hash returned by a 'nodes' call -# to get_objects -# The second argument is a reference to a hash returned by a 'node_groups' -# call to get_objects -sub set_nodegroup_node_assignments -{ - my ($nodesref, $nodegroupsref, $login, $password_callback) = @_; - my %nodes = %$nodesref; - my @node_ids; - if ( (scalar %nodes) eq 0 ) - { - push(@node_ids, 'nil'); - } - else - { - foreach my $node (keys %nodes) - { - my $id = $nodes{$node}->{id}; - - if ($id) - { - push(@node_ids, $id); - } - else - { - # Of course it may not have a name field either... :) - warn "set_nodegroup_node_assignments passed a bogus nodes hash, ", $node->{name}, " has no id field\n"; - } - } - } - - my %nodegroupdata; - $nodegroupdata{'node_group_node_assignments[nodes][]'} = \@node_ids; - - set_objects('node_groups', $nodegroupsref, \%nodegroupdata, $login, $password_callback); -} - -# Both arguments are references to a hash returned by a 'node_groups' -# call to get_objects -# NOTE: For the parent groups you must have requested that the server include 'child_groups' in the result -sub add_nodegroups_to_nodegroups -{ - my ($child_groupsref, $parent_groupsref, $login, $password_callback) = @_; - my %child_groups = %$child_groupsref; - my %parent_groups = %$parent_groupsref; - - # The server only supports setting a complete list of assignments for - # a node group. So we need to retreive the current list of assignments - # for each group, merge in the additional node groups that the user wants - # added, and pass that off to set_nodegroup_nodegroup_assignments to perform - # the update. - # FIXME: This should talk directly to the node_group_node_groups_assignments - # controller, so that we aren't exposed to the race conditions this - # method currently suffers from. - foreach my $parent_group (keys %parent_groups) - { - # Use a hash to merge the current and new members and - # eliminate duplicates - my %merged_nodegroups; - - %merged_nodegroups = %child_groups; - - foreach my $current_child (@{$parent_groups{$parent_group}->{child_groups}}) - { - my $name = $current_child->{name}; - $merged_nodegroups{$name} = $current_child; - } - - set_nodegroup_nodegroup_assignments(\%merged_nodegroups, {$parent_group => $parent_groups{$parent_group}}, $login, $password_callback); - } -} -# Both arguments are references to a hash returned by a 'node_groups' -# call to get_objects -# NOTE: For the parent groups you must have requested that the server include 'child_groups' in the result -sub remove_nodegroups_from_nodegroups -{ - my ($child_groupsref, $parent_groupsref, $login, $password_callback) = @_; - my %child_groups = %$child_groupsref; - my %parent_groups = %$parent_groupsref; - - # The server only supports setting a complete list of assignments for - # a node group. So we need to retrieve the current list of assignments - # for each group, remove the node groups that the user wants - # removed, and pass that off to set_nodegroup_nodegroup_assignments to perform - # the update. - # FIXME: This should talk directly to the node_group_node_groups_assignments - # controller, so that we aren't exposed to the race conditions this - # method currently suffers from. - foreach my $parent_group (keys %parent_groups) - { - my %desired_child_groups; - - foreach my $current_child (@{$parent_groups{$parent_group}->{child_groups}}) - { - my $name = $current_child->{name}; - if (!grep($_ eq $name, keys %child_groups)) - { - $desired_child_groups{$name} = $current_child; - } - } - - set_nodegroup_nodegroup_assignments(\%desired_child_groups, {$parent_group => $parent_groups{$parent_group}}, $login, $password_callback); - } -} -# Both arguments are references to a hash returned by a 'node_groups' -# call to get_objects -sub set_nodegroup_nodegroup_assignments -{ - my ($child_groupsref, $parent_groupsref, $login, $password_callback) = @_; - my %child_groups = %$child_groupsref; - - my @child_ids; - foreach my $child_group (keys %child_groups) - { - my $id = $child_groups{$child_group}->{id}; - - if ($id) - { - push(@child_ids, $id); - } - else - { - # Of course it may not have a name field either... :) - warn "set_nodegroup_nodegroup_assignments passed a bogus child groups hash, ", $child_group->{name}, " has no id field\n"; - } - } - # if there are NO child_groups, HTTP::Common::Request will discard the empty hash instead of url encoding it. - # Added code to server NodeGroupsController#update to watch for the 'nil' token and convert accordingly - if (!@child_ids) { push(@child_ids, 'nil') } - - my %nodegroupdata; - $nodegroupdata{'node_group_node_group_assignments[child_groups][]'} = \@child_ids; - - set_objects('node_groups', $parent_groupsref, \%nodegroupdata, $login, $password_callback); -} - -sub add_tags_to_node_groups -{ - my ($node_groups_ref, $tag_string, $login, $password_callback) = @_; - my %node_groups = %$node_groups_ref; - my %getdata; - $getdata{'objecttype'} = 'tags'; - $getdata{'exactget'} ={ 'name' => [$tag_string] }; - my %tags_found = get_objects(\%getdata); - if (!scalar keys %tags_found) - { - my %tagset_data; - $tagset_data{'name'} = $tag_string; - # create new tag with the $tag_string - set_objects('tags', undef, \%tagset_data, $login, $password_callback); - %tags_found = get_objects(\%getdata); - } - my $tag_id = $tags_found{$tag_string}{'id'}; - foreach my $ng (keys %node_groups) - { - my %taggingset_data; - $taggingset_data{'taggable_type'} = 'NodeGroup'; - $taggingset_data{'taggable_id'} = $node_groups{$ng}{'id'} ; - $taggingset_data{'tag_id'} = $tag_id ; - set_objects('taggings', undef, \%taggingset_data, $login, $password_callback); - } -} - -sub remove_tags_from_node_groups -{ - my ($node_groups_ref, $tag_string, $login, $password_callback) = @_; - my %node_groups = %$node_groups_ref; - my %getdata; - $getdata{'objecttype'} = 'tags'; - $getdata{'exactget'} ={ 'name' => [$tag_string] }; - my %tags_found = get_objects(\%getdata); - if (!scalar keys %tags_found) - { - die "ERROR: Could not find any tags with the name $tag_string" - } - my $tag_id = $tags_found{$tag_string}{'id'}; - my %taggings_to_delete; - # iterate through each node_group, find the tagging associated to it thatneeds to be removed - foreach my $ng_name (keys %node_groups) - { - my %tmpdata; - $tmpdata{'objecttype'} = 'taggings'; - $tmpdata{'exactget'} = { 'taggable_type' => ['NodeGroup'], - 'taggable_id' => [$node_groups{$ng_name}{'id'}], - 'tag_id' => [$tag_id] }; - my %tmpresults = get_objects(\%tmpdata); - if (scalar keys %tmpresults) - { - my @tmparr = keys %tmpresults; - my $key = $tmparr[0]; - $taggings_to_delete{$key} = $tmpresults{$key}; - } - } - setdelete(1); - if (scalar keys %taggings_to_delete) - { - set_objects('taggings', \%taggings_to_delete, {}, $login, $password_callback); - } -} - -sub setdebug -{ - my ($newdebug) = @_; - $debug = $newdebug; - nVentory::HardwareInfo::setdebug($newdebug); - nVentory::OSInfo::setdebug($newdebug); -} - -sub setdryrun -{ - ($dryrun) = @_; - warn "Enabling dry-run mode\n"; -} - -1; Copied: tags/client-1.66.3/perl/nVentory/Client.pm (from rev 304, branches/client-1.66.3/perl/nVentory/Client.pm) =================================================================== --- tags/client-1.66.3/perl/nVentory/Client.pm (rev 0) +++ tags/client-1.66.3/perl/nVentory/Client.pm 2011-08-05 23:02:25 UTC (rev 305) @@ -0,0 +1,1433 @@ +package nVentory::Client; + +use strict; +use warnings; +use POSIX qw/strftime/; +use nVentory::HardwareInfo; +use nVentory::OSInfo; +use LWP::UserAgent; +use File::stat; +use URI; +use HTTP::Cookies; +use HTTP::Request::Common; # GET, PUT, POST +use HTTP::Status; # RC_* constants +use File::stat; # Improved stat +use XML::LibXML; + +my $debug; +my $dryrun; + +my $SERVER = 'http://nventory'; +my $PROXY_SERVER; +my $AUTOREG_PW; +#my $PROXY_SERVER = 'https://proxy.example.local:8080'; + +######################################################################################## +## specify which external modules based on lshw's controller 'product' string ## +## Note: should look into Module::Load or Module::Plugin or UNIVERSAL::require ## +######################################################################################## +use nVentory::CompaqSmartArray; + +# dir location where xen/kvm img files held at the moment +# it would be nice to figure this out but I only see getting this from virsh dumpxml +my $VM_IMGDIR = '/home/xen/disks'; + +# If user manually specifies server other than the default +sub setserver +{ + $SERVER = 'http://' . $_[0]; + warn "** nVentory server: $SERVER **\n"; +} +CONFIGFILE: foreach my $configfile ('/etc/nventory.conf', $ENV{HOME}.'/.nventory.conf') +{ + if (-f $configfile) + { + open my $configfh, '<', $configfile or next CONFIGFILE; + while (<$configfh>) + { + next if (/^\s*$/); # Skip blank lines + next if (/^\s*#/); # Skip comments + chomp; + my ($key, $value) = split /\s*=\s*/, $_, 2; + if ($key eq 'server') + { + $SERVER = $value; + + # Warn the user, as this could potentially be confusing + # if they don't realize there's a config file lying + # around + #warn "Using server $SERVER from $configfile\n"; + } + elsif ($key eq 'proxy_server') + { + $PROXY_SERVER = $value; + #warn "Using proxy server $PROXY_SERVER from $configfile\n" if $debug; + } + elsif ($key eq 'ca_file' && -f $value) + { + # This currently executes before anyone could call setdebug, + # so the debug message is never printed. + #warn "Using CA file $value from $configfile\n" if ($debug); + $ENV{HTTPS_CA_FILE} = $value; + } + elsif ($key eq 'ca_path' && -d $value) + { + # This currently executes before anyone could call setdebug, + # so the debug message is never printed. + #warn "Using CA directory $value from $configfile\n" if ($debug); + $ENV{HTTPS_CA_DIR} = $value; + } + elsif ($key eq 'autoreg_password') + { + $AUTOREG_PW = $value; + } + } + close $configfh; + } +} + +my $_read_ua; +my $_write_ua; +sub _get_ua +{ + my ($login, $password_callback) = @_; + + if ($login) + { + return $_write_ua if ($_write_ua); + } + else + { + return $_read_ua if ($_read_ua); + } + + my $cookiefile; + my $password; + if ($login && $login eq 'autoreg') + { + $cookiefile = '/root/.nventory_cookie_autoreg'; + unless ($AUTOREG_PW) + { + warn "WARNING: autoreg_password not defined in nventory.conf. Defaulting to 'mypassword'\n" if ($debug); + } + $password = ($AUTOREG_PW ? $AUTOREG_PW : 'mypassword'); + warn "* AUTOREG PASSWORD: $password\n" if ($debug); + if (! -d '/root') + { + mkdir '/root' or die "mkdir: $!"; + } + } + else + { + $cookiefile = $ENV{HOME} . '/.nventory_cookie'; + } + + # Create the cookie file if it doesn't already exist + if (! -f $cookiefile) + { + warn "Creating $cookiefile\n"; + open my $cookiefh, '>', $cookiefile or die "open: $!"; + close $cookiefh; + } + # Ensure the permissions on the cookie file are appropriate, + # as it will contain a session key that could be used by others + # to impersonate this user to the server. + my $st = stat $cookiefile or die "stat: $!"; + if ($st->mode & 07177) + { + warn "Correcting permissions on $cookiefile\n"; + chmod $st->mode & 0600, $cookiefile or die "chmod: $!"; + } + + warn "Using cookies from $cookiefile\n" if ($debug); + my $cookie_jar = HTTP::Cookies->new( + file => $cookiefile, + autosave => 1, + ignore_discard => 1, + ); + + my $ua = LWP::UserAgent->new; + $ua->cookie_jar($cookie_jar); + + if ($login) + { + # User wants to be able to write to the server + + # First check if any existing session id works by sending + # an empty POST to the accounts controller. We will get + # back a 302 redirect if we need to authenticate. There's + # nothing special about accounts, we could use any controller, + # accounts just seemed appropriate. + # We include some bogus content in the post to work around + # a bug in HTTP::Request::Common::POST prior to version 5.72 of + # libwww-perl that wouldn't set a Content-Length header when the + # content is empty. RHEL 3 includes a broken version. + + ## proxing - this format doesn't work for some reason + #$ua->proxy('https', $PROXY_SERVER); + if ($PROXY_SERVER) { $ENV{HTTPS_PROXY} = $PROXY_SERVER; } + + my $response = $ua->request(POST "$SERVER/accounts.xml", { 'foo' => 'bar' }); + # NON-autoreg user logins should be redirected to SSO naturally. + if ( ($response->is_redirect) && ( $login ne 'autoreg' ) ) + { + # nventory nginx will redirect all NONfqdn (https://nventory) to FQDN. This logic will handle that, as POST will + # not follow redirect. LWP::UserAgent claims the requests_redirectable would work w/ POST but can't get to work + while (($response->is_redirect) && ($response->header('location') !~ /^https:\/\/sso.*/)) { + my $location = $response->header('location'); + $response = $ua->request(POST $location, { 'foo' => 'bar' }); + } + # encountered an sso request. this is specific to our sso implementation and our sso does a lot of redirecting on POSTs + if (($response->is_redirect) && ($response->header('location') =~ /^https:\/\/sso.*/)) { + warn "POST to $SERVER/accounts.xml was redirected, authenticating to SSO\n" if ($debug); + print "Login: $login\n"; + if (!$password) + { + # depending on what $password_callback var is, scalar or is it a subroutine + if (ref(\$password_callback) eq 'SCALAR') + { + $password = $password_callback; + } + elsif (ref(\$password_callback) eq 'REF') + { + if ( ref($password_callback) eq 'CODE' ) + { + $password = &$password_callback() ; + } + } + } + my $redirflag = 0; + my $redircount = 0; + while ($redirflag != 1 && $redircount < 7) + { + $response->header('location') =~ /^https:\/\/(sso.*)/; + my $SSO_SERVER=$1; + warn "SSO_SERVER: $SSO_SERVER\n" if ($debug); + # Logins need to go to HTTPS + my $url = URI->new("https://$SSO_SERVER/login?noredirects=1"); + $url->scheme('https'); + print "Authenticating to $url...\n"; + $response = $ua->request(POST $url, {'login' => $login, 'password' => $password}); + + if (($response->is_success) || (($response->is_redirect) && ($response->header('location') =~ /^(http|https):\/\/(sso.*)\/session\/tokens/))) + { + print "Authentication Successful\n"; + $redirflag = 1; + } elsif ($response->is_redirect) { + print "Redirected to " . $response->header('location') . "\n" if $debug; + } else { + if ($response->content =~ /Can't connect .* Invalid argument/) + { + warn "Looks like you're missing Crypt::SSLeay" + } + die "Authentication failed:\n", $response->content, "\n"; + } + print "REDIRECT COUNT: ${redircount}\n" if $debug; + $redircount++; + } # while ($redirflag != 1 && $redircount < 7) + if ($redircount == 7) { die "SSO redirect loop"; } + } + if (($response->is_redirect) && ($response->header('location') =~ /^(http|https):\/\/(sso.*)\/session\/tokens/)) { + my $location = URI->new($response->header('location')); + # SSO tries to redirect u multiple times to find the right domain but we only need the first redirect and then grab cookie + $ua->max_redirect(2); + $ua->timeout(10); + $response = $ua->get($location); + } + elsif ($response->code != '422') + { + unless ($response->code == '200') + { + die "Unable to get SSO session token. Might be authentication failure or SSO problem\n"; + } + } + $ua->max_redirect(7); + } + + sub auth_login_login + { + my $ua = $_[0]; + my $authbase = $_[1]; + my $login = $_[2]; + my $password = $_[3]; + + my $login_login_uri = URI->new("$authbase/login/login"); + $login_login_uri->scheme('https'); + my $host = $login_login_uri->host; + warn "Attempting to POST to $login_login_uri for autoreg\n" if ($debug); + my $response = $ua->request(POST $login_login_uri, {'login' => $login, 'password' => $password}); + unless (($response->is_redirect) && ($response->header('location') =~ /$host\/(accounts.xml)?$/)) + { + die "\n!!! Authentication failed !!!!\n\n" . $response->message . "\n"; + } + warn "+ Authentication Successful (autoreg /login/login) +\n" if ($debug); + return $ua; + } + + # Autoreg user should NOT be redirected to SSO even if it wants to. Autoreg auths to uri '/login/login' (which will allow LOCAL and LDAP account logins) + if ( ($response->is_redirect) && ( $login eq 'autoreg' ) ) + { + my $location; + $password = &$password_callback() if (!$password); + # if it's a redirect BUT NOT sso url, then we should follow the redirect and keep trying the post + # if the redirect is a sso url, then we know we need to authenticate by bypassing sso via the url path '/login/login' + if ($response->is_redirect) + { + $location = $response->header('location'); + my $location_uri = URI->new($location); + if ($location_uri->path =~ /login\/login/) + { + warn "UA (autoreg) - redirected to /login/login\n" if ($debug); + warn "POST to $SERVER/accounts.xml ( ** for user 'autoreg' ** ) was redirected. + \nAuthenticating to local login path: '/login/login'\n" if ($debug); + my $authbase = 'https://' . $location_uri->authority; + $ua = auth_login_login($ua, $authbase, $login, $password); + } + elsif ($location =~ /http.*:\/\/sso.*\/login/) + { + warn "UA (autoreg) - requested redirect to SSO - bypass to /login/login\n" if ($d... [truncated message content] |
From: <jh...@us...> - 2011-08-05 23:01:09
|
Revision: 304 http://nventory.svn.sourceforge.net/nventory/?rev=304&view=rev Author: jhtran Date: 2011-08-05 23:01:03 +0000 (Fri, 05 Aug 2011) Log Message: ----------- bug fix needed instance Modified Paths: -------------- branches/client-1.66.3/perl/nVentory/Client.pm Modified: branches/client-1.66.3/perl/nVentory/Client.pm =================================================================== --- branches/client-1.66.3/perl/nVentory/Client.pm 2011-08-02 22:42:25 UTC (rev 303) +++ branches/client-1.66.3/perl/nVentory/Client.pm 2011-08-05 23:01:03 UTC (rev 304) @@ -890,7 +890,7 @@ { $data{virtualarch} = 'xen'; } - my %virtualhostinfo = nVentory::OSInfo::getvirtualhostinfo; + my %virtualhostinfo = nVentory::OSInfo::getvirtualhostinfo(); print "$data{virtualarch} MASTER HOST\n"; $data{virtualmode} = 'host'; @@ -929,7 +929,7 @@ $data{virtualarch} = 'vmware'; print "VMWARE MASTER HOST. Listing all guest vm data:\n"; $data{virtualmode} = 'host'; - my %vmwarehostdata = nVentory::OSInfo::getvmwarehostinfo; + my %vmwarehostdata = nVentory::OSInfo::getvmwarehostinfo(); unless (scalar(keys %vmwarehostdata) == 0) { foreach my $key (sort(keys %vmwarehostdata)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2011-08-02 22:42:32
|
Revision: 303 http://nventory.svn.sourceforge.net/nventory/?rev=303&view=rev Author: darrendao Date: 2011-08-02 22:42:25 +0000 (Tue, 02 Aug 2011) Log Message: ----------- Sort the drop down list for ip addresses and network interfaces new view Modified Paths: -------------- trunk/server/app/views/ip_addresses/_ip_address.html.erb trunk/server/app/views/network_interfaces/_network_interface.html.erb Modified: trunk/server/app/views/ip_addresses/_ip_address.html.erb =================================================================== --- trunk/server/app/views/ip_addresses/_ip_address.html.erb 2011-07-12 17:54:06 UTC (rev 302) +++ trunk/server/app/views/ip_addresses/_ip_address.html.erb 2011-08-02 22:42:25 UTC (rev 303) @@ -3,7 +3,7 @@ <p><strong><%= tooltip(IpAddress,:address_type) %>:</strong> <em>*</em> <br /><%= f.select :address_type, $address_types%></p> -<p><strong><%= tooltip(IpAddress,:network_interface) %></strong> <br /> <%= select 'ip_address', 'network_interface_id', NetworkInterface.all.collect { |n| ["#{n.node.name} #{n.name}", n.id] },:include_blank => true %></p> +<p><strong><%= tooltip(IpAddress,:network_interface) %></strong> <br /> <%= select 'ip_address', 'network_interface_id', NetworkInterface.all.collect { |n| ["#{n.node.name} #{n.name}", n.id] }.sort,:include_blank => true %></p> <p><strong><%= tooltip(IpAddress,:netmask) %></strong> <br /> <%= f.text_field :netmask %></p> Modified: trunk/server/app/views/network_interfaces/_network_interface.html.erb =================================================================== --- trunk/server/app/views/network_interfaces/_network_interface.html.erb 2011-07-12 17:54:06 UTC (rev 302) +++ trunk/server/app/views/network_interfaces/_network_interface.html.erb 2011-08-02 22:42:25 UTC (rev 303) @@ -3,7 +3,7 @@ <p><strong><%= tooltip(NetworkInterface,:interface_type) %></strong> <br /> <%= f.text_field :interface_type %></p> -<p><strong><%= tooltip(NetworkInterface,:node) %></strong> <br /> <%= select 'network_interface', 'node_id', Node.all.collect { |n| [n.name, n.id] } %></p> +<p><strong><%= tooltip(NetworkInterface,:node) %></strong> <br /> <%= select 'network_interface', 'node_id', Node.all.collect { |n| [n.name, n.id] }.sort %></p> <p><strong><%= tooltip(NetworkInterface,:physical) %></strong> <br /> <%= f.check_box :physical %></p> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2011-07-12 17:54:12
|
Revision: 302 http://nventory.svn.sourceforge.net/nventory/?rev=302&view=rev Author: darrendao Date: 2011-07-12 17:54:06 +0000 (Tue, 12 Jul 2011) Log Message: ----------- Add missing file Added Paths: ----------- trunk/server/app/views/graffitis/version_table.html.erb Added: trunk/server/app/views/graffitis/version_table.html.erb =================================================================== --- trunk/server/app/views/graffitis/version_table.html.erb (rev 0) +++ trunk/server/app/views/graffitis/version_table.html.erb 2011-07-12 17:54:06 UTC (rev 302) @@ -0,0 +1,3 @@ +<%- @tooltips = [] %> +<%= render :partial => 'shared/version_table', :locals => { :master_object => @graffiti} %> +<%= @tooltips %> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Jason H. <jh...@ap...> - 2011-07-07 00:46:49
|
FYI I've just committed a basic client for registering Windows boxes, written in C#: http://nventory.svn.sourceforge.net/viewvc/nventory/trunk/client/windows/nVentoryRegisterClient/ This code has been tested and seems to create or update entries as appropriate. Here are a few things it needs before becoming really usable in a production sense: - The server URL should be configurable. The .NET System.Configuration API seems to be the recommended approach for application configuration, but I'm completely baffled by how to use it and have run out of time/interest/steam. - It seems like it ought to be a Windows service so that it just runs continually in the background. Although the current command line client could be run as a scheduled job as we do with cron on the Unix side. Hopefully someone else will be interested and able to finish this up. Jason |
From: <jh...@us...> - 2011-07-07 00:37:18
|
Revision: 301 http://nventory.svn.sourceforge.net/nventory/?rev=301&view=rev Author: jheiss Date: 2011-07-07 00:37:11 +0000 (Thu, 07 Jul 2011) Log Message: ----------- Modified Paths: -------------- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj Modified: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs =================================================================== --- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs 2011-07-07 00:32:12 UTC (rev 300) +++ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs 2011-07-07 00:37:11 UTC (rev 301) @@ -1,7 +1,14 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Text; +using System.Text.RegularExpressions; +using System.Collections; +using System.Management; +using System.Threading; +using System.Net; +using System.Net.Security; +using System.IO; +using System.Security.Cryptography.X509Certificates; +using System.Xml.XPath; namespace nVentoryRegisterClient { @@ -9,6 +16,302 @@ { static void Main(string[] args) { + register(); } + + static void register() + { + // The key=value parts of the HTTP body that we will POST/PUT to nVentory + ArrayList bodyParts = new ArrayList(); + + ManagementObjectSearcher searcher; + ManagementObjectCollection collection; + IEnumerator enumerator; + + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_SystemEnclosure"); + collection = searcher.Get(); + enumerator = collection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject win32SystemEnclosure = (ManagementObject)enumerator.Current; + + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem"); + collection = searcher.Get(); + enumerator = collection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject win32ComputerSystem = (ManagementObject)enumerator.Current; + + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystemProduct"); + collection = searcher.Get(); + enumerator = collection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject win32ComputerSystemProduct = (ManagementObject)enumerator.Current; + + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"); + collection = searcher.Get(); + enumerator = collection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject win32BaseBoard = (ManagementObject)enumerator.Current; + + // There will be multiple Win32_Processor results on multi-CPU boxes + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"); + ManagementObjectCollection processorCollection = searcher.Get(); + enumerator = processorCollection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject firstWin32Processor = (ManagementObject)enumerator.Current; + + // There's a Win32_PhysicalMemory result for each memory stick + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory"); + ManagementObjectCollection memoryCollection = searcher.Get(); + + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); + collection = searcher.Get(); + enumerator = collection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject win32OperatingSystem = (ManagementObject)enumerator.Current; + + searcher = new ManagementObjectSearcher("SELECT * FROM Win32_TimeZone"); + collection = searcher.Get(); + enumerator = collection.GetEnumerator(); + enumerator.MoveNext(); + ManagementObject win32TimeZone = (ManagementObject)enumerator.Current; + + // Hostname + String name = win32OperatingSystem["CSName"].ToString(); + if ((bool) win32ComputerSystem["PartOfDomain"]) + { + name = name + "." + win32ComputerSystem["Domain"].ToString(); + } + bodyParts.Add("node[name]=" + Uri.EscapeDataString(name)); + + // Operating system + String osManufacturer = win32OperatingSystem["Manufacturer"].ToString(); + osManufacturer = Regex.Replace(osManufacturer, "Microsoft Corporation", "Microsoft"); + bodyParts.Add("operating_system[vendor]=" + Uri.EscapeDataString(osManufacturer)); + String osCaption = win32OperatingSystem["Caption"].ToString(); + if (osCaption.StartsWith("Microsoft Windows ")) + { + bodyParts.Add("operating_system[variant]=Windows"); + String osVersion = Regex.Replace(osCaption, "Microsoft Windows ", ""); + bodyParts.Add("operating_system[version_number]=" + Uri.EscapeDataString(osVersion)); + } + else + { + bodyParts.Add("operating_system[variant]=" + Uri.EscapeDataString(osCaption)); + } + bodyParts.Add("operating_system[architecture]=" + Uri.EscapeDataString(win32OperatingSystem["OSArchitecture"].ToString())); + bodyParts.Add("node[kernel_version]=" + Uri.EscapeDataString(win32OperatingSystem["BuildNumber"].ToString())); + + // General hardware info + String hwManufacturer = "Unknown"; + // It isn't clear to me which order of preference to use between + // Win32_SystemEnclosure and Win32_ComputerSystem. Order here + // chosen mostly at random. So far I haven't seen them return + // different answers, but I have seen one have data and the other + // not have data. + if (win32SystemEnclosure["Manufacturer"] != null) + { + hwManufacturer = win32SystemEnclosure["Manufacturer"].ToString(); + } + else if (win32ComputerSystem["Manufacturer"] != null) + { + hwManufacturer = win32ComputerSystem["Manufacturer"].ToString(); + } + bodyParts.Add("hardware_profile[manufacturer]=" + Uri.EscapeDataString(hwManufacturer)); + String hwModel = "Unknown"; + if (win32SystemEnclosure["Model"] != null) + { + hwModel = win32SystemEnclosure["Model"].ToString(); + } + else if (win32ComputerSystem["Model"] != null) + { + hwModel = win32ComputerSystem["Model"].ToString(); + } + bodyParts.Add("hardware_profile[model]=" + Uri.EscapeDataString(hwModel)); + bodyParts.Add("node[serial_number]=" + Uri.EscapeDataString(win32SystemEnclosure["SerialNumber"].ToString())); + String uniqueID = win32ComputerSystemProduct["UUID"].ToString(); + bodyParts.Add("node[uniqueid]=" + Uri.EscapeDataString(uniqueID)); + if (win32SystemEnclosure["NumberOfPowerCords"] != null) + { + bodyParts.Add("node[power_supply_count]=" + Uri.EscapeDataString(win32SystemEnclosure["NumberOfPowerCords"].ToString())); + } + + // CPUs + bodyParts.Add("node[processor_manufacturer]=" + Uri.EscapeDataString(firstWin32Processor["Manufacturer"].ToString())); + bodyParts.Add("node[processor_model]=" + Uri.EscapeDataString(firstWin32Processor["Name"].ToString())); + // CurrentClockSpeed isn't ideal because it can vary if dynamic + // frequency scaling is in use. However in my experience the + // MaxClockSpeed reported by the hardware has no relation to + // reality. + bodyParts.Add("node[processor_speed]=" + Uri.EscapeDataString(firstWin32Processor["CurrentClockSpeed"].ToString()) + " MHz"); + bodyParts.Add("node[processor_count]=" + Uri.EscapeDataString(processorCollection.Count.ToString())); + UInt32 coreCount = 0; + foreach (ManagementObject win32Processor in processorCollection) + { + coreCount += (UInt32)win32Processor["NumberOfCores"]; + } + bodyParts.Add("node[processor_core_count]=" + Uri.EscapeDataString(coreCount.ToString())); + // Haven't yet figured out a way to get the CPU socket count + // node[processor_socket_count] + bodyParts.Add("node[os_processor_count]=" + Uri.EscapeDataString(win32ComputerSystem["NumberOfProcessors"].ToString())); + bodyParts.Add("node[os_virtual_processor_count]=" + Uri.EscapeDataString(win32ComputerSystem["NumberOfLogicalProcessors"].ToString())); + + // Memory + UInt64 totalMemory = 0; + ArrayList memorySizes = new ArrayList(); + foreach (ManagementObject win32Memory in memoryCollection) + { + // Exclude types that aren't RAM + UInt16 memoryType = (UInt16)win32Memory["MemoryType"]; + if (memoryType == 10 || // ROM + memoryType == 11 || // Flash + memoryType == 12 || // EEPROM + memoryType == 13 || // FEPROM + memoryType == 14) // EPROM + { + continue; + } + UInt64 capacityInMegs = (UInt64)win32Memory["Capacity"] / 1024 / 1024; + totalMemory += capacityInMegs; + memorySizes.Add(capacityInMegs.ToString()); + } + bodyParts.Add("node[physical_memory]=" + Uri.EscapeDataString(totalMemory.ToString())); + // FIXME: Coalesce like the unix perl client so this doesn't become a long, hard to view string on boxes with lots of sticks of memory + // I.e. 1024,1024,1024,1024,2048,2048 becomes 4@1024,2@2048 + bodyParts.Add("node[physical_memory_sizes]=" + Uri.EscapeDataString(String.Join(",", (String[])memorySizes.ToArray(typeof(String))))); + UInt64 osMemoryInMegs = (UInt64)win32OperatingSystem["TotalVisibleMemorySize"] / 1024; + bodyParts.Add("node[os_memory]=" + Uri.EscapeDataString(osMemoryInMegs.ToString())); + bodyParts.Add("node[swap]=" + Uri.EscapeDataString(win32OperatingSystem["SizeStoredInPagingFiles"].ToString())); + + bodyParts.Add("node[timezone]=" + Uri.EscapeDataString(win32TimeZone["Caption"].ToString())); + + // node[virtualarch] + // node[virtualmode] + + // NICs and IPs? + + String body = String.Join("&", (String[])bodyParts.ToArray(typeof(String))); + Console.WriteLine("body: " + body); + + // If we load this from a config file we need to make sure it ends in a / + String server = "http://nventory/"; + WebRequest request; + + // FIXME: just for testing + System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + // Return true to force the certificate to be accepted. + return true; + }; + + String nodeID = null; + + // Search server for entry matching unique ID + if (uniqueID != null && uniqueID != "") + { + request = WebRequest.Create(server + "nodes.xml?exact_node[uniqueid]=" + Uri.EscapeUriString(uniqueID)); + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + if (response.StatusCode == HttpStatusCode.OK) + { + XPathDocument document = new XPathDocument(response.GetResponseStream()); + XPathNavigator navigator = document.CreateNavigator(); + XPathNavigator node = navigator.SelectSingleNode("/nodes/node/id"); + if (node != null) + { + nodeID = node.Value; + Console.WriteLine("Node ID from unique ID search: " + nodeID); + } + } + } + + // Search server for entry matching hostname + if (nodeID == null && name != null && name != "") + { + request = WebRequest.Create(server + "nodes.xml?exact_node[name]=" + Uri.EscapeUriString(name)); + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + if (response.StatusCode == HttpStatusCode.OK) + { + XPathDocument document = new XPathDocument(response.GetResponseStream()); + XPathNavigator navigator = document.CreateNavigator(); + XPathNavigator node = navigator.SelectSingleNode("/nodes/node/id"); + if (node != null) + { + nodeID = node.Value; + Console.WriteLine("Node ID from name search: " + nodeID); + } + } + } + + // Authenticate to get cookie + request = WebRequest.Create(Regex.Replace(server, "^http", "https") + "login/login"); + CookieContainer cookieContainer = new CookieContainer(); + ((HttpWebRequest)request).CookieContainer = cookieContainer; + // There's no reason to chase the redirect we'll get in response + ((HttpWebRequest)request).AllowAutoRedirect = false; + request.Method = "POST"; + request.ContentType = "application/x-www-form-urlencoded"; + String username = "autoreg"; + String password = "qq8Erkee&T"; + String authBody = "login=" + Uri.EscapeDataString(username) + "&password=" + Uri.EscapeDataString(password); + byte[] authBodyBytes = Encoding.UTF8.GetBytes(authBody); + request.ContentLength = authBodyBytes.Length; + using (Stream writeStream = request.GetRequestStream()) + { + writeStream.Write(authBodyBytes, 0, authBodyBytes.Length); + } + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + // If we were redirected to / then authentication was successful. + // If we were redirected back to /login/login then authentication failed. + if (response.StatusCode != HttpStatusCode.Found || + (new Uri(response.Headers["Location"])).AbsolutePath == "/login/login") + { + Console.WriteLine("Authentication failed"); + Environment.Exit(1); + } + Console.WriteLine("Authentication successful"); + CookieCollection cookieCollection = cookieContainer.GetCookies(new Uri(server)); + } + + // Submit entry + if (nodeID != null) + { + // There's an existing entry. PUT to it to update. + Console.WriteLine("Updating existing entry"); + request = WebRequest.Create(server + "nodes/" + nodeID + ".xml"); + request.Method = "PUT"; + } + else + { + // There is no existing entry. POST to make one. + Console.WriteLine("Creating new entry"); + request = WebRequest.Create(server + "nodes.xml"); + request.Method = "POST"; + } + ((HttpWebRequest)request).CookieContainer = cookieContainer; + request.ContentType = "application/x-www-form-urlencoded"; + byte[] bodyBytes = Encoding.UTF8.GetBytes(body); + request.ContentLength = bodyBytes.Length; + using (Stream writeStream = request.GetRequestStream()) + { + writeStream.Write(bodyBytes, 0, bodyBytes.Length); + } + // FIXME: This can go away after development. We don't particularly care if it failed, nothing we can do about it. Although logging an error would be nice. + using (WebResponse response = request.GetResponse()) + { + Console.WriteLine(((HttpWebResponse)response).StatusDescription); + // Get the stream containing content returned by the server. + using (Stream responseStream = response.GetResponseStream()) + { + using (StreamReader reader = new StreamReader(responseStream)) + { + string responseFromServer = reader.ReadToEnd(); + // Display the content. + Console.WriteLine(responseFromServer); + } + } + } + + Thread.Sleep(30000); + } } } Modified: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj =================================================================== --- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj 2011-07-07 00:32:12 UTC (rev 300) +++ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj 2011-07-07 00:37:11 UTC (rev 301) @@ -36,6 +36,7 @@ <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> + <Reference Include="System.Management" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jh...@us...> - 2011-07-07 00:32:20
|
Revision: 300 http://nventory.svn.sourceforge.net/nventory/?rev=300&view=rev Author: jheiss Date: 2011-07-07 00:32:12 +0000 (Thu, 07 Jul 2011) Log Message: ----------- Added Paths: ----------- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Properties/ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Properties/AssemblyInfo.cs trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient.sln Added: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs =================================================================== --- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs (rev 0) +++ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Program.cs 2011-07-07 00:32:12 UTC (rev 300) @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace nVentoryRegisterClient +{ + class Program + { + static void Main(string[] args) + { + } + } +} Added: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Properties/AssemblyInfo.cs =================================================================== --- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Properties/AssemblyInfo.cs (rev 0) +++ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/Properties/AssemblyInfo.cs 2011-07-07 00:32:12 UTC (rev 300) @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("nVentoryRegisterClient")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("nVentoryRegisterClient")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d6145afe-c60d-4b37-8236-d55191bb8718")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] Added: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj =================================================================== --- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj (rev 0) +++ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient/nVentoryRegisterClient.csproj 2011-07-07 00:32:12 UTC (rev 300) @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">x86</Platform> + <ProductVersion>8.0.30703</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{4A48C14F-CBF5-41F4-ADD2-F28B82BED6B1}</ProjectGuid> + <OutputType>Exe</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>nVentoryRegisterClient</RootNamespace> + <AssemblyName>nVentoryRegisterClient</AssemblyName> + <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> + <TargetFrameworkProfile>Client</TargetFrameworkProfile> + <FileAlignment>512</FileAlignment> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> + <PlatformTarget>x86</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> + <PlatformTarget>x86</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Program.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file Added: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient.sln =================================================================== --- trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient.sln (rev 0) +++ trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient.sln 2011-07-07 00:32:12 UTC (rev 300) @@ -0,0 +1,24 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nVentoryRegisterClient", "nVentoryRegisterClient\nVentoryRegisterClient.csproj", "{4A48C14F-CBF5-41F4-ADD2-F28B82BED6B1}" +EndProject +Global + GlobalSection(SubversionScc) = preSolution + Svn-Managed = True + Manager = AnkhSVN - Subversion Support for Visual Studio + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A48C14F-CBF5-41F4-ADD2-F28B82BED6B1}.Debug|x86.ActiveCfg = Debug|x86 + {4A48C14F-CBF5-41F4-ADD2-F28B82BED6B1}.Debug|x86.Build.0 = Debug|x86 + {4A48C14F-CBF5-41F4-ADD2-F28B82BED6B1}.Release|x86.ActiveCfg = Release|x86 + {4A48C14F-CBF5-41F4-ADD2-F28B82BED6B1}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Property changes on: trunk/client/windows/nVentoryRegisterClient/nVentoryRegisterClient.sln ___________________________________________________________________ Added: vs:project-root + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |