
    Z'iT                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ  G d	 d
e      Zd Zd Zy)    N)BlockingScheduler)BaseCommand)transaction
connectionconnections)settings)Counter)opdsScanner)configc                   D    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)CommandzScan Books Collection.Fc                     |j                  dd       |j                  ddddd	       |j                  d
dddd	       y )Ncommandz%Use [ scan | start | stop | restart ])helpz	--verbose
store_trueverboseFz.Set verbosity level for books collection scan.)actiondestdefaultr   z--daemon	daemonizezDaemonize server)add_argument)selfparsers     </opt/sopds/opds_catalog/management/commands/sopds_scanner.pyadd_argumentszCommand.add_arguments   sS    I,STK|)UZ  bR  	SJlV[btu    c                 Z   t         j                  j                  t        j                  t
        j                        | _        |d   }t        j                  d      | _
        | j                  j                  t        j                         t        j                  d      }t        j                  t        j                   k7  rnt        j"                  t
        j$                        }|j                  t        j                         |j'                  |       | j                  j)                  |       |d   r_t        j*                         }|j                  t        j                         |j'                  |       | j                  j)                  |       |d   r=|dv r9t,        j.                  dk(  r| j0                  j3                  d       n
t5                |d	k(  rG| j0                  j3                  d
       | j7                          | j0                  j3                  d       y |dk(  r| j9                          y |dk(  r6t;        | j                  d      j=                         }| j?                  |       y |dk(  r6t;        | j                  d      j=                         }| jA                  |       y y )Nr    z'%(asctime)s %(levelname)-8s %(message)sr   r   )startscanwin32z*On Windows platform Daemonize not working.r    zStartup once book-scan.zComplete book-scan.r   stoprrestart)!ospathjoinmain_settingsBASE_DIRr   SOPDS_SCANNER_PIDpidfilelogging	getLoggerloggersetLevelDEBUG	Formatterr   LOGLEVELNOTSETFileHandlerSOPDS_SCANNER_LOGsetFormatter
addHandlerStreamHandlersysplatformstdoutwriter   r    r   openreadr"   r$   )r   argsoptionsr   	formatterfhchpids           r   handlezCommand.handle   s   ww||M$:$:F<T<TU#''+W]]+##$MN	gnn,$$V%=%=>BKK))*OOI&KK""2&9&&(BKK&OOI&KK""2&K f0A&A||w&!!"NO6>KK78IIKKK34wJJLvt||S)..0CIIcNy t||S)..0CLL !r   c                    | j                   r| j                  j                  d       y d| _         t        j                  r$t        j                         st
        j                  `t        | j                        }t        j                         5  |j                          d d d        t        j                  j                          d| _         y # 1 sw Y   /xY w)Nz.Scan process already active. Skip currend job.TF)scan_is_activer;   r<   r   	is_usabler   _connectionsr   r
   r.   r   atomicscan_allr	   objectsupdate_known_counters)r   scanners     r   r    zCommand.scanD   s    KKNO"  )=)=)?((0DKK(! 		--/#	 	s   CCc                    t         j                  | _        t         j                  | _        t         j
                  | _        t         j                  | _        | j                  j                  d| j                  d| j                  d| j                  d| j                  d	       | j                  j                  dd| j                  | j                  | j                  | j                         y )	Nz%Reconfigure scheduled book-scan (min=, hour=, day_of_week=, day=).r    cron)triggerdayday_of_weekhourminute)r   SOPDS_SCAN_SHED_DAYSCAN_SHED_DAYSOPDS_SCAN_SHED_DOWSCAN_SHED_DOWSOPDS_SCAN_SHED_HOURSCAN_SHED_HOURSOPDS_SCAN_SHED_MINSCAN_SHED_MINr;   r<   schedreschedule_jobr   s    r   update_shedulezCommand.update_sheduleT   s    #77#77$99#77hlhzhz{  |O  |O  PT  Pb  Pb  cg  cu  cu  v  	w

!!&&d>P>P^b^p^pw{  xK  xK  TX  Tf  Tf!  	gr   c                 X   t         j                   r$t        j                         st        j                  `t        j                          | j                  t        j                  k(  rW| j                  t        j                  k(  r:| j                  t        j                  k(  r| j                  t        j                  k(  s| j!                          t        j"                  rNdt        _        | j$                  j'                  d       | j(                  j+                  | j,                  d       y y )NFz<Startup scannyng directly by SOPDS_SCAN_START_DIRECTLY flag.scan_directly)id)r   rH   r   rI   r   r   constance_update_allra   r   r`   r_   r^   r]   r\   r[   rZ   re   SOPDS_SCAN_START_DIRECTLYr;   r<   rb   add_jobr    rd   s    r   check_settingszCommand.check_settings\   s      )=)=)?((0%%'""F$>$>> ; ;;v999v999!++/4F,KK\]JJtyy_= ,r   c                 X   t        | j                         t        j                  | _        t        j
                  | _        t        j                  | _        t        j                  | _
        | j                  j                  d| j                  d| j                  d| j                  d| j                  d	       t               | _        | j                  j                  | j                   d| j                  | j                  | j                  | j                  d       | j                  j                  | j"                  dd	d
       t$        j&                  dk(  rdnd}| j                  j                  d|z         	 | j                  j)                          y # t*        t,        f$ r Y y w xY w)Nz!Startup scheduled book-scan (min=rP   rQ   rR   rS   rT   r    )rV   rW   rX   rY   rh   z*/10check)rY   rh   r!   z
CTRL-BREAKz	CONTROL-CzQuit the server with %s.
)writepidr+   r   rZ   r[   r\   r]   r^   r_   r`   ra   r;   r<   r   rb   rk   r    rl   r9   r:   r   KeyboardInterrupt
SystemExit)r   quit_commands     r   r   zCommand.startj   sx   #77#77$99#77dhdvdvw{  xK  xK  LP  L^  L^  _c  _q  _q  r  	s&(


499f$2D2DRVRdRdkok~k~  HL  HZ  HZ  _e  	f

4..v'R'*||w'>|K6|CD	JJ!:. 		s   <F F)(F)c                     	 t        j                  t        |      t        j                         y # t
        $ r1}| j                  j                  dt        |      z         Y d }~y d }~ww xY w)Nz Error stopping sopds_scanner: %s)	r%   killintsignalSIGTERMOSErrorr;   r<   str)r   rD   es      r   r"   zCommand.stop{   sO    	IGGCHfnn- 	IKK@QGHH	Is   -0 	A*'A%%A*c                 F    | j                  |       | j                          y )N)r"   r   )r   rD   s     r   r$   zCommand.restart   s    		#

r   N)__name__
__module____qualname__r   rG   r   rE   r    re   rl   r   r"   r$    r   r   r   r      s8    #DNv
&P$ g>"Ir   r   c                     t        | d      }|j                  t        t        j                                      |j                          y)z'
    Write the process ID to disk.
    wN)r=   r<   ry   r%   getpidclose)pid_filefps     r   ro   ro      s0     
h	BHHSHHJr   c                  R   t        j                         rt        j                  d       t        j                          t        j                         rt        j                  d       t        j                  d       t        dd      } t        t        j                  d      }t        j                  | j                         t        j                  j                                t        j                  |j                         t        j                  j                                t        j                  |j                         t        j                  j                                t        j                  | j                                t        j                  |j                                y)z<
    Detach from the terminal and continue as a daemon.
    r   z	/dev/nullr#   za+N)r%   fork_exitsetsidumaskr=   r   r5   dup2filenor9   stdinr;   stderrr   )std_instd_outs     r   r   r      s     
wwy
IIK	wwy
HHQK+s#F6++T2GGGFMMOSYY--/0GGGNNcjj//12GGGNNcjj//12 HHV]]_HHW^^r   )r%   rv   r9   r,   apscheduler.schedulers.blockingr   django.core.management.baser   	django.dbr   r   r   django.confr   r(   opds_catalog.modelsr	   opds_catalog.sopdscanr
   opds_catalog	constancer   r   ro   r   r   r   r   <module>r      sG    	  
  = 4 : : 1 ' - ! pk pdr   