<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>shutdown Archives - Tom Barbette</title>
	<atom:link href="https://perso.uclouvain.be/tom.barbette/tag/shutdown/feed/" rel="self" type="application/rss+xml" />
	<link>https://perso.uclouvain.be/tom.barbette/tag/shutdown/</link>
	<description></description>
	<lastBuildDate>Thu, 01 May 2014 15:14:58 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://perso.uclouvain.be/tom.barbette/wp-content/uploads/2022/04/cropped-logo-uclouvain-2021-barbette-32x32.png</url>
	<title>shutdown Archives - Tom Barbette</title>
	<link>https://perso.uclouvain.be/tom.barbette/tag/shutdown/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Home server : auto-shutdown if no other computers are running</title>
		<link>https://perso.uclouvain.be/tom.barbette/home-server-shutdown-computer-if-no-other-computers-are-up-on-the-network/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Mon, 31 Mar 2014 23:49:53 +0000</pubDate>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Server management]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[ping]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[shutdown]]></category>
		<category><![CDATA[unix]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=273</guid>

					<description><![CDATA[<p>I wanted to shutdown my linux home media server if there is no running computer on my network. So I wrote this little programs which reads all known ips from DHCP configuration and lease files and send a ping to them. If the ping respond, one PC of my LAN is up&#8230; To re-start the &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/home-server-shutdown-computer-if-no-other-computers-are-up-on-the-network/" class="more-link">Continue reading<span class="screen-reader-text"> "Home server : auto-shutdown if no other computers are running"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/home-server-shutdown-computer-if-no-other-computers-are-up-on-the-network/">Home server : auto-shutdown if no other computers are running</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I wanted to shutdown my linux home media server if there is no running computer on my network. So I wrote this little programs which reads all known ips from DHCP configuration and lease files and send a ping to them. If the ping respond, one PC of my LAN is up&#8230;</p>
<p>To re-start the computer in the morning, I use the BIOS RTC alarm (the thing you have by pressing F1 or ESC on reboot). You could also add a script/a program on each of your computers to send the magic packet to your home server to wake it by lan (see &#8220;wake on lan&#8221; on google).</p>
<p>This script can take any command. But if you want to do shutdown like proposed in the title, you can use :</p>
<p>[code]sudo ./autoshut &#8220;poweroff&#8221; 10.0.0.1[/code]</p>
<p>Where 10.0.0.1 is your local IP adress. To compile the program, simply use (after saving the code as &#8220;autoshut.c&#8221;) : [code]gcc -o autoshut autoshut.c[/code]</p>
<p>In my case, I wanted to launch the command only after midnight, so I used cron. Cron will launch that command every 5 minutes from midnight to eight o&#8217;clock. So if I stay up late, my server won&#8217;t shutdown if my own computer is not down too. That&#8217;s the whole purpose.</p>
<p>The line in my crontab :</p>
<p>[code]0,10,20,30,40,50 1,2,3,4,5,6,7 * * * root /home/tom/autoshut/autoshut &#8220;poweroff&#8221; 10.0.0.1[/code]</p>
<p>Why do all that ? Energy consumption&#8230;</p>
<p>[code]#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;regex.h&gt;<br />
#include &lt;string.h&gt;</p>
<p>#define LEASE_FILE &#8220;/var/lib/dhcp/dhcpd.leases&#8221;<br />
#define DHCP_CONFIG_FILE &#8220;/etc/dhcp/dhcpd.conf&#8221;</p>
<p>int in_array(char** ar, char* str) {<br />
int i = 0;<br />
while (ar[i] != NULL) {<br />
if (strcmp(ar[i],str) == 0) return 1;<br />
i++;<br />
}<br />
return 0;<br />
}</p>
<p>char* extractIP (char* filename, char** list, int* listNum) {<br />
FILE *pfile;</p>
<p>pfile = fopen(filename, &#8220;rb&#8221;);</p>
<p>if(pfile == NULL){<br />
printf(&#8220;Sorry, can&#8217;t open %s\n&#8221;, filename);<br />
return &#8216;\0&#8217;;<br />
}<br />
regex_t reg;<br />
int err = regcomp (&amp;reg, &#8220;(10\\.[0-1]\\.0\\.([1-9]|[0-9]{2,3}))&#8221;, REG_EXTENDED);<br />
if (err != 0)<br />
{<br />
printf(&#8220;ERREUR\n&#8221;);<br />
return &#8216;\0&#8217;;<br />
}<br />
char ligne[255];</p>
<p>while(!feof(pfile)) {<br />
fgets(ligne, 254 ,pfile);<br />
int match;<br />
size_t nmatch = 0;<br />
regmatch_t *pmatch = NULL;</p>
<p>nmatch = reg.re_nsub;<br />
pmatch = malloc (sizeof (*pmatch) * nmatch);<br />
match = regexec (&amp;reg, ligne, nmatch, pmatch, 0);<br />
if (match == 0)<br />
{<br />
char *ip = NULL;<br />
int start = pmatch-&gt;rm_so;<br />
int end = pmatch-&gt;rm_eo;<br />
size_t size = end &#8211; start;</p>
<p>char* str = malloc(sizeof(char) * 15);<br />
strncpy (str, &amp;ligne[start], size);<br />
str[size] = &#8216;\0&#8217;;</p>
<p>if (!in_array(list, str)) {<br />
list[*listNum] = str;<br />
printf(&#8220;%s\n&#8221;, str);<br />
(*listNum)++;<br />
}</p>
<p>}</p>
<p>}</p>
<p>fclose(pfile);<br />
regfree(&amp;reg);<br />
}</p>
<p>int ping(char* address) {</p>
<p>char cmd[30] = &#8220;ping -W 1 -q -c 1 &#8220;;<br />
strcat(cmd,address);<br />
int ret=system(cmd);<br />
printf(&#8220;\nResultat : %d\n\n&#8221;,ret);<br />
return !ret;<br />
}<br />
/*<br />
TODO : maybe an option?<br />
int checkCableStatus(const char* interface) {<br />
/sys/class/net/eth0/carrier<br />
}*/</p>
<p>int main(int argc, char** argv) {</p>
<p>if (argc &lt;= 2) {<br />
printf(&#8220;Usage : %s Command Local-IP [Local-IP-2]\n\tCommand : a command to execute if ping does not work\n\tLocal-IP : Ip to ignore\n\tLocal-IP-2 : Optional second ip to ignore&#8221;,argv[0]);<br />
return -1;<br />
}<br />
int listNum = 0;<br />
char** list = malloc(sizeof(char*) * 255);<br />
extractIP(DHCP_CONFIG_FILE, list, &amp;listNum);<br />
extractIP(LEASE_FILE, list, &amp;listNum);<br />
int i = 0;<br />
while (list[i] != NULL) {<br />
if (strcmp(list[i],argv[2])!=0 &amp;&amp; (argc==3 ||strcmp(list[i],argv[3])!=0)) {<br />
if (ping (list[i])) {<br />
printf(&#8220;%s responded. Command aborted !\n&#8221;,list[i]);<br />
return EXIT_SUCCESS;<br />
}<br />
}<br />
i++;<br />
}<br />
system(argv[1]);<br />
return EXIT_SUCCESS;<br />
}[/code]</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/home-server-shutdown-computer-if-no-other-computers-are-up-on-the-network/">Home server : auto-shutdown if no other computers are running</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
