source: trunk/cluster_status.php @ 1

Last change on this file since 1 was 1, checked in by zollarsd, 10 years ago

Initial import

File size: 6.2 KB
Line 
1<?php
2
3include "/home/us3/bin/listen-config.php";
4
5$xml  = get_data();
6
7if ( $xml == "" ) exit();  // No status available
8
9$data = array();
10parse( $xml );
11
12foreach ( $data as $item )
13{
14   update( $item[ 'cluster' ], $item[ 'queued' ], $item[ 'status' ], $item[ 'running' ] );
15}
16
17exit();
18
19// Get the cluster status
20
21function get_data()
22{
23   global $self;
24   $url = "http://community.ucs.indiana.edu:19444/orps-service/XML/gateway/ultrascan";
25
26   try
27   {
28      $post = new HttpRequest( $url, HttpRequest::METH_GET );
29      $http = $post->send();
30      $xml  = $post->getResponseBody();     
31   }
32   catch ( HttpException $e )
33   {
34      write_log( "$self: Cluster Status not available" );
35      return "";
36   }
37
38   return $xml;
39}
40
41// Parse the xml
42
43function parse( $xml )
44{
45   global $data;
46   
47   $data = array();
48
49   $x = new XML_Array( $xml );
50   $d = $x->ReturnArray();
51
52   if ( ! isset( $d[ 'summaries' ] ) ) exit();  // Bad input
53
54   foreach ( $d[ 'summaries' ] as $item )
55   {
56      $a = Array();
57
58     
59      $a[ 'queued'  ] = $item[ 'waitingJobs' ];
60      $a[ 'running' ] = $item[ 'runningJobs' ];
61
62      if (  $a[ 'queued'  ] == ""  ||  $a[ 'queued'  ] < 0 ) $a[ 'queued'  ] = 0;
63      if (  $a[ 'running' ] == ""  ||  $a[ 'running' ] < 0 ) $a[ 'running' ] = 0;
64
65      $clusterParts  = explode( ".", $item[ 'resourceId' ] );
66      $cluster       = preg_replace( '/\d+$/', "", $clusterParts[ 0 ] );
67
68      if ( $cluster == 'uthscsa-bcf' )   $cluster = 'bcf';
69      if ( $cluster == 'uthscsa-alamo' ) $cluster = 'alamo';
70
71      $a[ 'cluster' ] = $cluster;
72     
73      switch ( $item[ 'resourceStatus' ] )
74      {
75         case 'UP'     :
76            $status = "up";
77            break;
78
79         case 'DOWN'   :
80            $status = "down";
81            break;
82
83         case 'WARN'   :
84            $status = "warn";
85            break;
86
87         case 'FAILED' :
88         default       :
89            $status = "unknown";
90            break;
91      }
92     
93      $a[ 'status' ]  = $status;
94
95      $data[] = $a;
96   }
97}
98
99// Put it in the DB
100
101function update( $cluster, $queued, $status, $running )
102{
103   global $dbhost;
104   global $guser;
105   global $gpasswd;
106   global $gDB;
107   global $self;
108
109   $gfac_link = mysql_connect( $dbhost, $guser, $gpasswd );
110   $result = mysql_select_db( $gDB, $gfac_link );
111
112   if ( ! $result )
113   {
114      write_log( "$self: Could not connect to DB $gDB" );
115      echo "Could not connect to DB $gDB.\n";
116      exit();
117   }
118     
119   $query = "SELECT * FROM cluster_status WHERE cluster='$cluster'";
120   $result = mysql_query( $query, $gfac_link );
121
122   if ( ! $result )
123   {
124      write_log( "$self: Query failed $query - " .  mysql_error( $gfac_link ) );
125      echo "$self: Query failed $query - " .  mysql_error( $gfac_link ) . "\n";
126      exit();
127   }
128
129   $rows = mysql_num_rows( $result );
130
131   if ( $rows == 0 )  // INSERT
132   {
133      $query = "INSERT INTO cluster_status SET " .
134               "cluster='$cluster', " .
135               "queued=$queued, "     .
136               "running=$running, "   .
137               "status='$status'";
138   }
139   else               // UPDATE
140   {
141      $query = "UPDATE cluster_status SET " .
142               "queued=$queued, "     .
143               "running=$running, "   .
144               "status='$status' "    .
145               "WHERE cluster='$cluster'";
146   }
147
148   $result = mysql_query( $query, $gfac_link );
149
150   if ( ! $result )
151   {
152      write_log( "$self: Query failed $query - " .  mysql_error( $gfac_link ) );
153      echo "$self: Query failed $query - " .  mysql_error( $gfac_link ) . "\n";
154   }
155}
156
157class XML_Array 
158{
159    var $_data   = Array();
160    var $_name   = Array();
161    var $_rep    = Array();
162    var $_parser = 0;
163    var $_level  = 0;
164    var $_index  = 0;
165
166    function XML_Array( &$data )
167    {
168        $this->_parser = xml_parser_create();
169
170        xml_set_object                ( $this->_parser, $this );
171        xml_parser_set_option         ( $this->_parser, XML_OPTION_CASE_FOLDING, false );
172        xml_set_element_handler       ( $this->_parser, "_startElement", "_endElement" );
173        xml_set_character_data_handler( $this->_parser, "_cdata" );
174
175        $this->_data  = array();
176        $this->_level = 0;
177
178        if ( ! xml_parse( $this->_parser, $data, true ) )
179           return false;
180
181        xml_parser_free( $this->_parser );
182    }
183
184    function & ReturnArray() 
185    {
186        return $this->_data[ 0 ];
187    }
188
189    function _startElement( $parser, $name, $attrs )
190    {
191        if ( $name == "resourceHealth" ) 
192        {
193           $name .= $this->_index;
194           $this->_index++;
195        }
196
197        if ( ! isset( $this->_rep[ $name ] ) ) $this->_rep[ $name ] = 0;
198       
199        $this->_addElement( $name, $this->_data[ $this->_level ], $attrs );
200        $this->_name[ $this->_level ] = $name;
201        $this->_level++;
202    }
203   
204    function _endElement( $parser, $name ) 
205    {
206       if ( isset( $this->_data[ $this->_level ] ) )
207       {
208          $this->_addElement( $this->_name[ $this->_level - 1 ],
209                              $this->_data[ $this->_level - 1 ],
210                              $this->_data[ $this->_level ]
211                            );
212       }
213
214       unset( $this->_data[ $this->_level ] );
215       $this->_level--; 
216       $this->_rep[ $name ]++; 
217    }
218
219    function _cdata( $parser, $data ) 
220    {
221        if ( $this->_name[ $this->_level - 1 ] ) 
222        {
223           $this->_addElement( $this->_name[ $this->_level - 1 ],
224                               $this->_data[ $this->_level - 1 ],
225                               str_replace( array( "&gt;", "&lt;","&quot;", "&amp;" ), 
226                                            array( ">"   , "<"   , '"'    , "&" ), 
227                                            $data 
228                                          ) 
229                             );
230        }
231    }
232
233    function _addElement( &$name, &$start, $add = array() ) 
234    {
235        if ( ( sizeof( $add ) == 0 && is_array( $add ) ) || ! $add ) 
236        {
237           if ( ! isset( $start[ $name ] ) ) $start[ $name ] = '';
238           $add = '';
239        }
240
241        $update = &$start[ $name ];
242
243        if     ( is_array( $add) && 
244                 is_array( $update ) ) $update += $add;
245        elseif ( is_array( $update ) ) return;
246        elseif ( is_array( $add    ) ) $update  = $add;
247        elseif ( $add              )   $update .= $add;
248    }
249}
250?>
Note: See TracBrowser for help on using the repository browser.