PerlでIntelサイトよりCPUIDを得る

icon 項目のみ表示/展開表示の切り替え

ダウンロードURL

自作プログラムでCPUの種別・機能を判定したいので手始めにCPUID等をintelのsSpec Numberよりホームページから得るプログラムを作った。
玄箱標準状態のMonta Vista Linuxでテストした。

実行結果のサンプル 実行結果のCSVファイル

ダウンロードURL

http://processorfinder.intel.com/details.aspx?sspec=sSpec Number
上記の部分をSpec Number(たとえば Pentium 4 550J ならsl833)変えれば取得できる。
なお、ページの文字コードはutf-8なので注意。

プログラムの概要

  1. まず、wgetコマンドでホームページをダウンロードしカレントディレクトリへ保存する。
  2. その読み込んだホームページをds.plにリダイレクトし標準出力へCPUID等を出力する。
  3. 1~3.の手順をds.shというファイルに記述する。
  4. bash ss.sh スペックナンバー spec.txt で1個のsSpecに対するCPUID等をspec.txtに保存できる。
  5. sSpecの一覧表をintelの製品情報やサポート等から取得し 4の記述をaa.shに記述する。
  6. 漢字コードをUtf-8からShft-Jisに変換する。
    nkf -Lw -W -s spec.txt > sj.txt
sl1833とsl684を取得する場合の、プログラムの階層は下記のような感じ bash aa.shを実行する
aa.sh
  | + bash ds.sh sl833 spec.txt
  |           |+------------------- wget -O $1.htm http://processorfinder.intel.com/details.aspx?sspec=$1 
  |                                 perl ss.pl < $1.htm >> $2
  | + bash ds.sh sl684 spec.txt

ds.sh ss.plのダウンロード

all.sh

ほしいCPUの数だけ下記の行を繰り返して記述。
bash ss.sh sSpec Number spec.txt

ss.sh

1個のCPUのみの情報がほしい場合はss.shを実行すればよい。
wget -O $1.htm http://processorfinder.intel.com/details.aspx?sspec=$1
perl ss.pl < $1.htm >> $2

ss.pl

はじめた書いたPerlプログラムなのでかなり無駄が多いような気がする。

#! /usr/local/bin/perl
# インテルのページよりCPUスペックを抽出する


$t = 0;
$p = 0;
$tn=0;
$sn=0;
$pn=0;

while(<STDIN>){
        if($t == 1){
                if(/^.*>/){
                        $t=0;
                        s/^.*>//g;
                }
        }
        if(/<span id="ctl00_PSFContentPlaceholder_lblProcessorName" class="pageheader" style="display:inline-block;">/){
                $p=1;
        }
        s/<.*?>//g;               # 1行に収まっているタグを消す
        if(/<.*$/){          # <が見つかった場合、行の最後まで消す
                $t=1;
        }else{
                s/How Do I Use This Tool\?//g;
                s/http:.*$//g;
                if(/Home &gt; Processor Spec Finder Home &gt; sSpec Details/){
                        s/Home &gt; Processor Spec Finder Home &gt; sSpec Details//g;
                }
                if(/Processor Specifications:/){
                        $p=2;
                        s/Processor Specifications://g;
                }
                if(/Package Type:/){
                        $p=3;
                }
                if(/Product Order Codes:/){
                        $p=4;
                        s/Product Order Codes://g;
                }
                if(/Supported Features:/){
                        $p=5;
                        s/Supported Features://g;
                }
                if(/Notes:/){
                        $p=0;
                        s/Notes://g;
                }
                if($p >= 1){
                        s/^\s*//g;
                        $nn=$_;
                        if($nn ne ""){
                                if($p == 1){
                                        s/\r\n//g;
                                        $cpu_name=$_;
                                        $p=0;
                                }
                                if(2<=$p && $p <=4){
                                        if(/:/){
                                                s/://g;
                                                s/\r\n//g;
                                                $titles[$tn++]=$_;
                                        }else{
                                                s/\r\n//g;
                                                $ss[$sn++]=$_;
                                        }
                                }
                                if(5==$p){
                                        s/\r\n//g;
                                        if($_ =~  /\D/){
                                                $pp[$pn++]=$_;
                                        }
                                }
                        }
                }
                
        }
}

$n=0;

if($1 eq "-l"){
        print "CPU,$cpu_name\n";
        while($n < $tn && $n < $sn){
                print "$titles[$n],$ss[$n]\n";
                ++$n;
        }
        foreach $tt (@pp){
                print "Supported Features,$tt\n";
        }
}else{
        print "\"$cpu_name\",";
        while($n < $tn && $n < $sn){
                print "\"$ss[$n]\",";
                ++$n;
        }
        foreach $tt (@pp){
                print "\"$tt\",";
        }
        print "\n";
}