276 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
- define how it should work (doc/braindums/big-picture.text)
 | 
						|
- define service status in one document, so repeatition stops!
 | 
						|
 | 
						|
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
- rename headers/ -> includes/
 | 
						|
- remove client/ from top level
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
- write about shell scripts in system startup
 | 
						|
- write about general behaviour (covering the death)
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Generate automatic asciidoc from conf/*
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Add handler for ctrl+alt+delete
 | 
						|
   * document in paths
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
pre-compile config: conf/*
 | 
						|
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
panic:
 | 
						|
   read configuratio from defaults/panic*
 | 
						|
   -> write execute_something before!
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
comm:
 | 
						|
   tmpnow: search for pid in list,
 | 
						|
           save the pid in the list, so we know whether our executer died!
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Logging / cinit:
 | 
						|
   fuer unsere eigenen ausgaben auch multilog?
 | 
						|
 | 
						|
   Logger: shared memory?
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Implement full starting logic in server?
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Build full dependency tree at start? And begin from the end?
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
comm/*:
 | 
						|
   int read
 | 
						|
   int write
 | 
						|
   --> fuer pipes
 | 
						|
 | 
						|
run_init_svc
 | 
						|
   muss alle services wissen, die gestartet werden
 | 
						|
 | 
						|
   start_services_with_deps
 | 
						|
      gibt pointer auf struktur zurueck
 | 
						|
         -> Anzahl Services (array!)
 | 
						|
         -> Service:
 | 
						|
            Name (Pfad)
 | 
						|
            Ergebniss
 | 
						|
         -> beim fehler, die nachricht, strerror?
 | 
						|
         http://www.opengroup.org/onlinepubs/009695399/functions/strerror.html
 | 
						|
 | 
						|
 | 
						|
Beim starten werden needs und wants als needs behandelt, weil
 | 
						|
jeder starter _alle_ services zurueckgeben muss.
 | 
						|
 | 
						|
   Ein Prozess kann maximal 512 abhaengigkeiten haben.
 | 
						|
      -> open files
 | 
						|
 | 
						|
 | 
						|
Neues cinit:
 | 
						|
   Wenn service fehlschlaegt, wird eine Struktur zurueckgegeben.
 | 
						|
   
 | 
						|
   Diese enhaelt:
 | 
						|
 | 
						|
      int success = 
 | 
						|
         enum { SVC_SUCCESS, SVC_FAILED, SVC_NEED_FAILED, ... }
 | 
						|
      
 | 
						|
      char *reason;
 | 
						|
 | 
						|
   Ausgaben nach Beendigung vom Starten des Services.
 | 
						|
 | 
						|
   [ on  ] %s + Ergebnis
 | 
						|
   [ off ] %s
 | 
						|
 | 
						|
   Rekursives herunter/rauffahren
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
- add error handling to cinit.install.binary
 | 
						|
- remove sigio(), create new functions:
 | 
						|
   - one for cleaning up the socket
 | 
						|
   - one for doing the communication (specify two fd's)
 | 
						|
- put some logic around exec_svc:
 | 
						|
   o put waiting code herein -> waiting code to structure!
 | 
						|
- cleanup serv/sig_reboot.c:7:
 | 
						|
   o implement os-specific reboot function
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
1. Entfernung mount
 | 
						|
2. kommunikation ueber
 | 
						|
   1. einen fork pro service
 | 
						|
      fork(fork)
 | 
						|
3. Socket wird erst nach einem Signal erstellt
 | 
						|
   -> Konfiguration sollte SIGWHATEVER senden
 | 
						|
4. Vielleicht panicen, wenn init fehlschlaegt?
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Als naechstes:
 | 
						|
 | 
						|
- add code do implement stopping / restarting with dependency tree
 | 
						|
   o add used_by to the list of services
 | 
						|
   o used_by should be a simple (double?) linked list
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Documentation:
 | 
						|
   - Installing cinit
 | 
						|
      o compiling cinit from source
 | 
						|
      o debian / gentoo
 | 
						|
   - Configuring
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Add "used" by to each service, so we can track which services to shutdown.
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
- perhaps use dnotify?
 | 
						|
- recheck warm reboot
 | 
						|
- fix cservice
 | 
						|
- print service name or cinit: before _everything_ WE print
 | 
						|
 | 
						|
TESTING:
 | 
						|
   - does cinit eat zombies?
 | 
						|
   - is the reporting ok?
 | 
						|
   - does cservice and ccontrol what's expected?
 | 
						|
 | 
						|
# cinit.create.empty.service: can only be started from the bin directory
 | 
						|
 | 
						|
- compile cinit static and other tools dynamically per default
 | 
						|
 | 
						|
- Fix Switching services off !!
 | 
						|
- Remove RUN_RUN_SVCs, move code to run_svc so one can determine which
 | 
						|
  services failed?
 | 
						|
 --> sequentieller ablauf!
 | 
						|
 --> parallel ablauf, struct-array mit namen und ergebnis?
 | 
						|
 --> for dep in deps/*; do fork(run_svc() ); done
 | 
						|
 -----> while(any_is_running) { sleep }
 | 
						|
 -------> array durchsuchen, ergebnis nutzen.
 | 
						|
 - ueberpruefen von wo aus run_svc() aufgerufen wird
 | 
						|
 | 
						|
- Fix SIGCHILD problem:
 | 
						|
   - exec_svc wants to waitpid() itself, so SIG_CHILD makes problems
 | 
						|
   - respawn_svc: does that need to act on SIGCHLD if the master process
 | 
						|
   is still running?
 | 
						|
   - kill respawn -> sigchild cleans up, we do not get waitpid perhaps?
 | 
						|
- remove umount code?
 | 
						|
- remove zombies, but keep away from SIGCHILD problems
 | 
						|
- remove mount /etc/cinit/tmp code
 | 
						|
   -> how to replace?
 | 
						|
- fix bug in Makefile: linking happens twice
 | 
						|
- do not kill respawing service, if off exists
 | 
						|
- ccontrol
 | 
						|
- manpages
 | 
						|
- Error codes when shutting down a service?
 | 
						|
- Delay dokumentieren
 | 
						|
- no_kill dokumentieren
 | 
						|
- ddoc zuendefuehren
 | 
						|
 | 
						|
- remove umount, swapoff?
 | 
						|
--> to services?
 | 
						|
 | 
						|
- on.out, on.err, on.in?
 | 
						|
   -> reading/writing from/to files
 | 
						|
 | 
						|
--> Wenn kein ReSPAWN und der Prozess beendet sich nicht,
 | 
						|
    dann haengt init!
 | 
						|
- implement "no_kill" until cinit-0.2 or 0.3?
 | 
						|
 | 
						|
Doku!!!
 | 
						|
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
- Source Logic issues
 | 
						|
   - remove FIXME entries (and what should be fixed, too)
 | 
						|
   - memset for timespecs?
 | 
						|
   - move umount, swapoff and remount to off of init?
 | 
						|
      -> cleanup sig_reboot.c
 | 
						|
   - run_svc:
 | 
						|
      o we have many strcat()s, perhaps save length of pathbuf and strncat at
 | 
						|
         pathtmp[strlen(pathbuf)] ?
 | 
						|
   - do we really need swapoff?
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
- Documentation
 | 
						|
   - Write manpages (use doc/* as base for that)
 | 
						|
   - Check Spell and Grammar in documentation
 | 
						|
   - write howto:
 | 
						|
      o Howto-cinit
 | 
						|
      o Howto-cinit-uml
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Things I did not do and I don't know whether we have to care about:
 | 
						|
 | 
						|
- Porting
 | 
						|
   - add porting code to other unices?
 | 
						|
   - like openssh guys do?
 | 
						|
 | 
						|
- close(*>2) before forking / executing
 | 
						|
   -> close fds, clean environment, etc., ...
 | 
						|
   -> do we really need that?
 | 
						|
- logging service!
 | 
						|
   -> write output $somewhere, wait for syslog?
 | 
						|
   -> flush at the end of start-process?
 | 
						|
   -> perhaps pipe logging output to a program?
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
[OLD BUGS]
 | 
						|
- remove cinit watcher?
 | 
						|
   -> sig_child -> cycle through list?
 | 
						|
- DOKU: what happens when a service does not terminate....
 | 
						|
   und er als once drin ist
 | 
						|
- MANPAGE!
 | 
						|
- execve() fails -> no sleep!!
 | 
						|
- multiple zombies sometimes - problemservices
 | 
						|
   -> zombies of respawn watchers are not caught!
 | 
						|
   -> sig_chld also therein
 | 
						|
   -> problematic due to wait for child
 | 
						|
-doubled cinit instance
 | 
						|
   - nur einmal
 | 
						|
- free() everything before starting child
 | 
						|
- cservice!
 | 
						|
   - prozess nur einmal -> WARTET! cinit auch!
 | 
						|
doku:
 | 
						|
  cservice einmal starten -> wartet auf ende
 | 
						|
  cint ersetzt init bei gentoo
 | 
						|
  an error occuerd-> verbose
 | 
						|
  multuicall probleme -> busysbox --> GIBT ES NICHT!!
 | 
						|
  ---> DOKU DAZU! mit links, doppelt links, aus test
 | 
						|
  ---> erklaeren, dass es unproblematisch ist!
 | 
						|
 | 
						|
11:09 < folken23> telmich: zsb. eine grund angabe warum ein dienst nicht gestartet 
 | 
						|
                  werden konnte. 
 | 
						|
11:09 < folken23> telmich: e.g. file nicht gefunden, service hat nicht 0 
 | 
						|
                  zurueckgeworfen. 
 | 
						|
11:09 < folken23> telmich: oder service allready started. 
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
possible BUGS:
 | 
						|
 | 
						|
[14:44] freelsd:cinit-0.2.2% ./sbin/cservice -e ein
 | 
						|
 | 
						|
ein: No such file or directory
 | 
						|
Bad address
 | 
						|
: Service does not exist
 | 
						|
 | 
						|
cinit-0.2.2:
 | 
						|
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
 | 
						|
root         1 96.7  0.0  1580  336 ?        R    18:59   5:49 /sbin/cinit
 | 
						|
root         2  0.0  0.0     0    0 ?        SN   18:59   0:00 [ksoftirqd/0]
 | 
						|
root         3  0.0  0.0     0    0 ?        S    18:59   0:00 [watchdog/0]
 | 
						|
root         4  0.0  0.0     0    0 ?        S<   18:59   0:00 [events/0]
 | 
						|
root         5  0.0  0.0     0    0 ?        S<   18:59   0:00 [khelper]
 | 
						|
root         6  0.0  0.0     0    0 ?        S<   18:59   0:00 [kthread]
 | 
						|
root        10  0.0  0.0     0    0 ?        S<   18:59   0:00  \_ [khubd]
 | 
						|
root        12  0.0  0.0     0    0 ?        S<   18:59   0:00  \_ [kblockd/0]
 | 
						|
root        99  0.0  0.0     0    0 ?        S    18:59   0:00  \_ [pdflush]
 | 
						|
root       100  0.0  0.0     0    0 ?        S    18:59   0:00  \_ [pdflush]
 | 
						|
root       102  0.0  0.0     0    0 ?        S<   18:59   0:00  \_ [aio/0]
 | 
						|
root       727  0.0  0.0     0    0 ?        S<   18:59   0:00  \_ [kseriod]
 | 
						|
root       101  0.0  0.0     0    0 ?        S    18:59   0:00 [kswapd0]
 | 
						|
root       800  0.0  0.0     0    0 ?        S    18:59   0:00 [khpsbpkt]
 | 
						|
root       803  0.0  0.0     0    0 ?        S    18:59   0:00 [pccardd]
 | 
						|
root       838  0.0  0.0     0    0 ?        S    18:59   0:00 [kjournald]
 | 
						|
root      1923  0.0  0.0  1584  200 ?        S    18:59   0:00 /sbin/cinit
 | 
						|
root      1924  0.0  0.3  3624 1936 tty2     Rs   18:59   0:00  \_ -zsh
 | 
						|
root      1969  0.0  0.0  1580  320 tty2     S    19:05   0:00      \_ cservice -e 3
 | 
						|
root      1972  0.0  0.1  2604  828 tty2     R+   19:05   0:00      \_ ps axuwwf
 | 
						|
root      1945  0.0  0.0     0    0 tty2     Z    19:01   0:00 [loadkeys] <defunct>
 | 
						|
cinit: [cprofile:profile]
 | 
						|
cinit should not be started directly, but by your kernel.
 | 
						|
umount raus
 | 
						|
/etc/cinit/specials/... rein
 | 
						|
 | 
						|
1. Doku auf asciidoc umstellen
 | 
						|
2. den signalhandler code fixen
 | 
						|
3. den tempmount entfernen
 | 
						|
 | 
						|
--> cinit-0.3-rc1
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
 | 
						|
Optimisations
 | 
						|
-------------
 | 
						|
 | 
						|
tree_exec
 | 
						|
~~~~~~~~~
 | 
						|
- only check dependencies (=needs) after the basic run?
 |