Working as a team I like to be aware of the activity of the participants. Therefore, it was decided to write a demon watching new commits to the
git 's repository. Since I work in
Ubuntu , the notification was implemented in a built-in way - the
libnotify library.
Language -
Python !
The article mentions:
1. Demon in
Python ;
2. Logging in
Python ;
3. Storage of configuration files of programs in
Python ;
4. Working with OS commands from
Python scripts;
5. Getting a list of recent changes from
git 'a;
6.
Ubuntu Standard Popup Notifications.
To implement the task, the
Python language was chosen (high-level, interpretable, object-oriented and extensible programming language), because I do not know it.
For a start, two sources helped me a lot:
- official documentation:
http://docs.python.org/tutorial/index.html ;
- a series of
IBM articles in Russian:
https://www.ibm.com/developerworks/ru/library/l-python_part_1/ .
')
While learning the basics, proceed to writing the program.
1. Demon
There are many implementations of demons in the network, chose one of the ready-made with positive reviews and an attractive name:
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ . This daemon had problems
shutting down the command "
daemon.py stop " in this place:
except OSError, err: err = str(err) if err.find("No such process") > 0: if os.path.exists(self.pidfile): os.remove(self.pidfile)
This apparently arose because of the Russian locale, the phrase "
No such process " in my system was returned in Russian. An easy way to fix this is to remove this check:
except OSError, err: if os.path.exists(self.pidfile): os.remove(self.pidfile)
2. Logging
The simplest way to notify you when a program is working is to use the
print () function. But this program will run as a daemon and does not imply the display of information about its state in the launch console. A convenient option in this case is to write the log to a file. In
Python , there is a built-in logging method included in the standard library - the
logging module (
http://docs.python.org/library/logging.html ).
The module has many logging options (
handlers ,
http://docs.python.org/library/logging.handlers.html ):
StreamHandler ,
FileHandler ,
WatchedFileHandler ,
RotatingFileHandler ,
TimedRotatingFileHandler ,
SocketHandler ,
DatagramHandler ,
SysLogHandler ,
NTEENTLENTler ,
SocketHandler ,
DatagramHandler ,
SysLogHandler ,
NTEENTLENTler ,
SocketHandler ,
DatagramHandler ,
SysLogHandler ,
NTEENTLENTler ,
SocketHandler ,
NTEHENTler ,
SocketHandler ,
NTGENTHandler .
HTTPHandler . To control the daemon,
FileHandler was used:
logging.basicConfig(filename = tempfile.gettempdir() + '/gitPushNotify.log', level = logging.DEBUG, format = '%(asctime)s %(levelname)s: %(message)s', datefmt = '%Y-%m-%d %I:%M:%S') logging.info('Daemon start')
3. Storing Python Program Configuration
To store the configuration of applications, the
ini file and the
ConfigParser built-in module for working with them (
http://docs.python.org/library/configparser.html ) are used:
config = ConfigParser.ConfigParser() configPath = os.path.dirname(__file__) + '/config.ini' config.read(configPath)
Getting the values of parameters by functions (in this case getting
integer values):
timeout = config.getint('daemon', 'timeout')
4. Working with OS commands from Python scripts
To execute system commands, use the
check_output () method of the
subprocess module (
http://docs.python.org/library/subprocess.html ):
sourceOutput = subprocess.check_output('cd ' + repositoryPath, shell=True)
You can also use the methods of the
os module:
sourceOutput = os.system(commandString)
Documentation recommends using
subprocess .
5. Getting a list of recent changes from git
To view the latest changes to the repository, it is convenient to use the command
whatchanged (
http://schacon.github.com/git/git-whatchanged.html ). This command allows you to set the format of the displayed log messages, set the number of changes to be output. An example of using the command:
$ git whatchanged master -10 --date=raw --date-order --pretty=format:"%H %n%cn %n%ce %n%ct %n%s"
Arguments in order:
master - repository branch;
-10 - the number of records displayed;
- date-order — sort by change date;
--pretty = format: "..." - output format.
6. Ubuntu Standard Popup Notifications
Working with pop-up notifications in
Ubuntu is done via the
libnotify library (
https://wiki.ubuntu.com/NotificationDevelopmentGuidelines ). Check whether it is installed with the command:
$ dpkg -l | grep libnotify-bin
Or immediately execute:
$ sudo apt-get install libnotify-bin
You can display a notification using the command:
$ notify-send "Habr!"
$ notify-send -i notification-message-email "Title" "Message"
The
-i flag is an image, it indicates the system name or the path to any image in
svg ,
png or
jpg format.
Start daemon
You must make the file executable:
$ chmod +x gitPushNotifyDaemon.py
Before launching in the configuration file, you must specify the path to the repository and the frequency of the survey:
$ vim config.ini
Run:
$ python gitPushNotifyDaemon.py start
If everything went well:
Daemon starting..
Start notification will appear:
Now you can see the daemon in the list of processes by running the command:
$ ps uax | grep gitPushNotifyDaemon.py
The process of the daemon can be monitored using the log:
$ tail -f /tmp/gitPushNotify.log
You can also separately run the
gitPushNotify.py file for debugging:
$ python gitPushNotify.py
Project repository:
https://github.com/antonfisher/gitPushNotify
That's all. Have a good day!
References:
1.
http://docs.python.org/tutorial/index.html - official tutorial;
2.
https://www.ibm.com/developerworks/ru/library/l-python_part_1/ -
IBM article series;
3.
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ - the implementation of the
Sander Marechal daemon;
4.
http://docs.python.org/library/logging.html -
Python ,
Logging module;
5.
http://docs.python.org/library/configparser.html -
Python , module
ConfigParser ;
6.
http://docs.python.org/library/subprocess.html -
Python , module
Subprocess ;
7.
https://wiki.ubuntu.com/NotificationDevelopmentGuidelines - a description of
libnotify ;
8.
http://schacon.github.com/git/git-whatchanged.html description of the
git-whatchanged command .