1 (edytowany przez alossek 2014-04-25 22:47:09)

Temat: [Skrypt] wyznaczanie dni wolnych (święta stałe/ruchome, soboty itp.)

Cześć!

Nuda, więc machnąłem skrypt (python), nic specjalnego, ale może się komuś przyda.

W skrócie uruchamia komendy uwzględniając dni wolne
- soboty
- niedziele
- święta stałe (np. Trzech Króli)
- święta ruchome (np. Wielkanoc)

Co potrzebne
- python (być może wystarczy python-mini)
- https://pypi.python.org/pypi/holiday/0.0.1
- https://pypi.python.org/pypi/six
- https://pypi.python.org/pypi/nine

Do zainstalowania pakietow holiday, six, nine, można posłużyć się:

pip install holiday 
pip install six
pip install nine

Info jak zainstalować pip (http://eko.one.pl/forum/viewtopic.php?id=1165)

Przykładowe użycia:
np. zatrzymanie wifi gdy jest dzień wolny

runIfHoliday.py -i stopWifi.sh

np. zatrzymanie wifi gdy jutro jest dzień wolny

runIfHoliday.py -d 1 -i stopWifi.sh

np. zatrzymanie wifi gdy jutro jest dzień pracujący

runIfHoliday.py -n -d 1 -i stopWifi.sh

Skrypt:

#!/usr/bin/python

# -*- coding: utf-8 -*-

from holiday import get_holidays
from datetime import date, timedelta
from subprocess import call
import sys, getopt
import subprocess

def pmsg(msg):
        #print msg
        subprocess.Popen(['logger', '-s', msg])

def num(s):
    try:
        return int(s)
    except ValueError as err:
        pmsg(err)
        sys.exit(2)

def start(inputFile,dayshift,negate):
        now = date.today() + timedelta(days=dayshift)
        currYear = now.year
        holidays = get_holidays(year=currYear, place='Poland')
        isholiday = now in holidays
        weekday = now.weekday()
        isSaturday = weekday == 5
        isSunday = weekday == 6
        isFree = isholiday or isSunday or isSaturday
        if isholiday:
                hmsg = ", " + holidays[now] + ")"
        else:
                hmsg = ")"
        fhmsg = str(now) + " (" + now.strftime("%A") + hmsg
        run = isFree
        if negate:
                run = not(isFree)
        if run:
                pmsg(fhmsg + " run: " + inputFile)
                call(inputFile)
        else:
                pmsg(fhmsg)

def main(argv):
        inputFile = ''
        valid = False
        negate = False
        dayshift = 0
        pmsg(str(sys.argv))
        try:
                opts, args = getopt.getopt(argv,"d:ni:",["ifile=","dayshift=","negate="])
        except getopt.GetoptError as err:
                pmsg(str(err))
                sys.exit(2)
        for opt, arg in opts:
                if opt in ("-i", "--ifile"):
                        inputFile = arg
                        valid = True
                elif opt in ("-d", "--dayshift"):
                        dayshift = num(arg)
                elif opt in ("-n", "--negate"):
                        negate = True
        if valid:
                start(inputFile,dayshift,negate)
        else:
                pmsg("Invalid call")

if __name__ == "__main__":
        main(sys.argv[1:])

Wiadomo można to jeszcze upiększyć i ulepszyć,
więc kto ma ochotę, zapraszam do poprawek i uwag.

TP-Link TL-WDR4300 v1, Reboot (17.01-SNAPSHOT, r3876-efb6ca1)