Advertisement
apcehypo

Listen&Eject: Ejecter

Mar 1st, 2014
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 1.66 KB | None | 0 0
  1. import std.stdio;
  2. import std.socket;
  3. import std.conv;
  4. import std.process;
  5.  
  6. enum MAX_ATTEMPTS = 5;
  7. enum TIMEOUT = 5;
  8. enum MAX_WAIT_REBOOT_TIME = 300; //5 минут
  9.  
  10. void main(string[] argv) {
  11.   if (argv.length < 2) { argv ~= "4455"; }
  12.   ushort port = parse!ushort(argv[1]);
  13.   auto addr = new InternetAddress(InternetAddress.ADDR_ANY, 4455);
  14.   auto s = new UdpSocket();
  15.   s.bind(addr);
  16.   void[] buf = new void[1];
  17.   writeln("Receiving datagrams on port ",port);
  18.  
  19.   s.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVTIMEO, dur!"seconds"(TIMEOUT));
  20.   auto attempts = MAX_ATTEMPTS;
  21.   auto attemptsMultiplier = 1;
  22.   while (true) {
  23.     while (attempts > 0) {
  24.       if (s.receiveFrom(buf) != Socket.ERROR) {
  25.         write("\b",progressChar); stdout.flush;
  26.         attempts = MAX_ATTEMPTS;
  27.         attemptsMultiplier = 1;
  28.       }
  29.       else {
  30.         attempts--;
  31.         writeln(" [", currentDateTime, ": FAILED! ", to!string(attempts*TIMEOUT), "s. before eject CD]");
  32.       }
  33.     }
  34.     writeln("[Ejecting CD-ROM]");
  35.     system(`powershell $cds = (New-Object -ComObject "WMPlayer.OCX").cdromCollection; for($i=0;$i -lt $cds.Count;$i++) { $cds.Item($i).Eject() }`);
  36.     attempts = attemptsMultiplier * (MAX_WAIT_REBOOT_TIME / TIMEOUT); //достаточное количество попыток для запуска компа
  37.     attemptsMultiplier++;
  38.   }
  39. }
  40.  
  41. string currentDateTime() {
  42.   import std.datetime;
  43.   import std.algorithm;
  44.   return findSplit(Clock.currTime().toString, ".")[0];
  45. }
  46.  
  47. char progressChar() {
  48.   static char[] chars = [ '-', '\\', '|', '/', ];
  49.   static int index = 0;
  50.   if (index == chars.length) index = 0;
  51.   return chars[index++];
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement