Sheeva reloaded

Ma egy kicsit foglalkoztam a sheevaplugommal, ugyanis korabban mar felotlott bennem egy problema, miszerint nem tudok tiszta leallast kezdemenyezni a masinan csak ha pl. laptoprol belepek ssh-val es ugy adok ki egy shutdown -P now parancsot, de ez kenyelmetlen, es csak ezert laptopot inditani nem a legjobb otlet, ugyhogy olloztam es tovabbirtam egy kis C servicet, ami idonkent megnezi az usb-s eszkozok kozott, van e valamelyik rootjaban egy specko file, ha van, akkor lekapcsol. Lehetne finomitani, igy ha valakinek van otlete, nyugodtan alljon elo vele. (Javaban programozom mar jo ideje, c-t reg nem hasznaltam, szoval ovatosan a kritikaval, az indentalasrol meg nem tehetek, kiprobaltam a formazasi lehetosegeket, de nem jott ossze). Ugyis van felesleges pendrivom, amit amugysem hasznalok mar masra, igy kikapcs gombnak is megteszi.

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <dirent.h>

void shutdown() {
system("shutdown -P 1 &");
}

int searchForFile(char* fname, char* parent_dir) {
char filenm[256 * 1024];
int found = 0;
DIR *mydir = opendir(parent_dir);
struct dirent *entry = NULL;
struct dirent *entry2 = NULL;
while ((entry = readdir(mydir))) {
if ((strcmp(entry->d_name, ".") != 0) && (strcmp(entry->d_name, "..")
!= 0) && (entry->d_type == DT_DIR)) {
strcpy(filenm, parent_dir);
strcat(filenm, "/");
strcat(filenm, entry->d_name);

DIR *mydir2 = opendir(filenm);
while ((entry2 = readdir(mydir2))) {
if (strcmp(entry2->d_name, fname) == 0) {
found = 1;
}
}
closedir(mydir2);
}
}
closedir(mydir);
return found;
}

int main(void) {
int dontstop = 1;
pid_t pid, sid;
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
}
umask(0);
sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
}
if ((chdir("/")) > 0) {
exit(EXIT_FAILURE);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while (dontstop) {
int found = searchForFile("letsGoToSleepMySheeva.command", "/media");
if (found > 0) {
shutdown();
dontstop = 0;
}
sleep(10);
}
exit(EXIT_SUCCESS);
}

Hozzászólások

Hat ezt egy sima bash script is meg tudná csinálni. Viszont sokkal viccesebb lenne, ha a file létrehozás eseményét figyelné a service, és amint létrejön a file, azonnal leállna.

Pedig ez shell scriptben joval egyszerubb.


#!/bin/bash

while true
do
  if [ -x /media/bigyo/speckofile ]
  then
    halt
  fi
  sleep 30
done

Ha valami mini rendszer van rajta, akkor a bash helyett valami kisebb shell is elofordulhat - ebben az esetben elkepzelheto, hogy kell alakitani (pl: true helyett /bin/true, a [] helyett test, a -x nem biztos, hogy ismert, de jo helyette a -f is ebben a helyzetben, halt helyett shutdown -h now).
Ezen kivul meg lehetne szepiteni, mondjuk a file-t megkeresheti find-dal (ha nem mindig ugyanabban a konyvtarban van).

--
"You will have to look a long way before you find a bunch of scum-suckers more greedy, humourless and deserving of death than the suits in the music business." - Terry Pratchett

a fajlt inotify vagy linuxon mi van kutyafulevel nezhetned hogy modosul-e es akkor instant reagalna

--
NetBSD - Simplicity is prerequisite for reliability

Egyebkent probaltam beloni a desktopomon egy fordito kornyezetet arm architekturara, de nem sok sikerrel jartam, ugyhogy a forrast masoltam a ket eszkoz kozott, es arm-re vegul a sheeva sajat gcc-jet hasznaltam. Ha esetleg van valaki, aki ebben a temaban jaratos, adhatna nehany tanacsot, a google-ban nem sok aktualis informaciot talaltam, nagyreszt csak elavultat. (Kesobbiekben szeretnek komplexebb szolgaltatasokat is irni a cuccra, es lehetoleg c-ben) (talaltam a gnuarm.org-on binarisokat, letoltottem, kicsomagoltam, futtattam, egyedul arm7-es cpu-ra sikerult, armv5tejl-re nem (sem armv5,arm5-re)).

---
return NEVER;

Ubuntu 8.10
HP nx6110
https://www.getdropbox.com/referrals/NTI3OTI2NzY5
www.tszebeni.hu

Esetleg egy otlet: ha van udev-ed a cuccon, akkor annak meglehet modani, hogy futtasson le egy scriptet amikor megjelenik egy eszkoz.

Igy meg vendorid:productid alapjan csak a te pendriveodat fogja elfogadni.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!