cd-rom állapot lekérés

Sziasztok!

Olyan kérdésem lenne hogy hogyan tudnám lekérdezni/feldolgozni azt hogy melyik cdrom egység tartalmaz lemezt.
A gépben több cd egység is található. Az eredményt parancsfájlban szeretném feldolgozni.
Én kezdőként a hwinfo awk párossal próbálkozom. Bármely más vagy konkrét használható megoldást szívesen veszek.
itt tartok:
xxxx:/home/user # hwinfo --cdrom | awk '/CD-ROM/ {print $1} ; /\/dev\/cdrom/ {print $3} ; /Drive status:/ {print $3}'
47:
/dev/sr0,
48:
/dev/sr1,
no

az építő válaszokat előre is köszönöm!

Hozzászólások

Ubuntu allatt automatikusan csatolja a CD -t ha be van helyezve egy lemez. Innen is kiindulhatsz, egyszerubbnek tunik.

az aktuális rendszer egy nagyon "kopasz" oSuse 11.3
az udevből kerül meghívásra egy szkript
az usereknek nincs automount ill. mount joga
azzal nem is lenne gondom amely cdket/cdformátumokat alapból felismer a rendszer mert azokat blkid vel megoldom de amennyiben pl. olyan formátumú cd kerül bele amit nem támogatott, azonban valamely formában még is behozható róla adat, azt szeretném kiküszöbölni ... ill. hogy ha üresen záródik a cd akkor az udev által indított szkriptet exitre futtathassam ....

CD-ROM az az, amit még az iTunes előtt használtak? :P :)

Ha tudsz várni 1-2 napot akkor megírom az én 1999-ből származó
'scriptemet' :) Ha nem akkor keress valamit a linuxhogyanok környékén a parancssoros cd írók paraméterezése körül.
Úgy tűnik hogy én is olyasmiből ollóztam anno.
( talán egy szolnoki szerveren találtam a leírást? )

Az elve az volt hogy néhány karakternyit olvasott az eszközről és a végén kiadta a kötet cimkéjét és az írás időpontját ha volt bent éppen lemez.
Nekem az összes cd eszközhöz volt külön külön egy.

Update :D
Közben találtam itt valamit.... ehhez hasonló volt ez én forrásom is: vagyis a törzsanya g)

http://hup.hu/old/cd-iras/CD-Iras-HOGYAN-4.html#ss4.5

"...
4.17 Hogyan olvasható ki a CD-info?

Valahol az elsõ 32 k után szerepel a CD-n egy blokk, amely információkat tartalmaz a lemezrõl. Ez az információ megszerezhetõ a következõ parancsfájl segítségével:

#! /bin/bash

RD=/dev/cdrom
for i in 32768,7 32776,32 32808,32 32958,128 33086,128 33214,128 \
33342,128 33470,32 33581,16 33598,16 33615,16 33632,16
do
old_IFS="$IFS"
IFS=","
set -- $i
IFS="$old_IFS"
OFFSET=$1
LENGTH=$2
echo "*`dd if=$RD bs=1 skip=$OFFSET count=$LENGTH 2> /dev/null`#"
done
..."

Sziasztok!

Ez nekem is eszembe jutott ... de
ahogy néztem ezen bejegyzések nem szabványok s akár lehet / tudok olyan imaget -is írni amiben üres az listázott szektorok tartalma ....
én elsőre nem is pontosan erre hanem a cd lemez gyári információira gondoltam (még utána kéne néznem hogy a cd típus v sebesség v bármi van e gyárilag szabványosan a cd -ken)
4 eset van ami megkülönböztetésre kerül:
- nincs cd a meghajtóban
- van cd de nem olvasható az adat róla
- van olvasható adat de nem értelmezhető
- van adat mely olvasható és értelmezhető is

Nekem egyenlőre az első különválasztása a lényeg ....

sajnos annyira "kopaszak" a telepített rendszerek hogy cd-info sincs rajtuk ... s a telepítés a gépek nagy száma s elszórtsága miatt nem vagy nehezen megoldható lenne ...

na miközben olvasgattam/keresgéltem az optikai média referenciákat rátaláltam egy egyszerű (remélem) megoldásra:

file -s /dev/sr0

úgy néz ki ez szépen visszaadja a kívánt infókat ... ha tudja értelmezni a lemezt akkor a labellel és a formátummal visszatér .. ha nem tudja értelmezni akkor sima "data" -t ad vissza .. ha pl üres a lemez akkor "empty" -t ... s nincs lemez a meghajtóban akkor egyszerűen "couldn't open file" -t


/* Begin C code. Put this in a file called cdstatus.c and do "gcc -o
* cdstatus cdstatus.c" . No error checking, no looping, no
* documentation, if it breaks, you get to keep both pieces. */

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/mtio.h>
#include <linux/types.h>
#include <linux/cdrom.h>

int main(int argc, char **argv) {
	char buff[256];
	/* ioctl() needs a 3rd arg but it doesn't really use it here. */
	int fd,status;
	int ec=1;

	if(argc!=2) {
		fprintf(stderr,"Usage: cdstatus <CD-ROM device name>\n");
		exit(1);
	}

	fd=open(argv[1], O_RDONLY | O_NONBLOCK); /* need NONBLOCK! */
	if(fd < 0) {
		snprintf(buff,64,"%s cannot be opened\n",argv[1]);
		perror(buff);
		exit(1);
	}
	status=ioctl(fd,CDROM_DRIVE_STATUS,buff);
	close(fd);

	switch(status) {
	case CDS_NO_INFO:
		printf("Whoa. Huh?");
		ec=2;
		break;
	case CDS_NO_DISC:
		printf("No disc is in the drive.");
		ec=3;
		break;
	case CDS_TRAY_OPEN:
		printf("Tray is open, or tray is closed and no CD is present.");
		ec=4;
		break;
	case CDS_DRIVE_NOT_READY:
		printf("Drive is not ready.");
		ec=5;
		break;
	case CDS_DISC_OK:
		printf("A disc is in the drive.");
		ec=0;
		break;
	default:
		printf("Um, we shouldn't be here!");
		ec=1;
	}
        printf("\n");
	
	return ec;
}

/* end of C code */

Hogy szoktam örülni, mikor egy kernel frissítés után egy korábban működő kód "Um, we shouldn't be here!" jellegű hibaüzeneteket kezd el dobálni. Hiába, az ioctl könnyeket tud csalni az ember szemeibe. Csak épp nem örömkönnyeket...
--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "