open Frontend
open Printf
-(** Helper functions:
-
-*)
-
(** Turn an absolute path into a relative path. *)
let delete_prefix prefix str =
let len = String.length str in
| [] -> false
| car::cdr -> if (car==elt) then true else list_check cdr elt
-
(** The backendhandler class: defines event handlers for events in
the backend backend directory.
@param dir_root The location of the backend in the server context (eg. root context for vservers)
let mk_rel_path = delete_prefix dir_root in object(this)
(** Regular expression that defines a legal script name. Filter out
- * temporary files using this *)
+ * temporary files using it *)
val file_regexp = Str.regexp "^[a-zA-Z][a-zA-Z0-9_\.\-]*$"
val acl_file_regexp = Str.regexp ".*acl$"
- val dir_regexp = Str.regexp "^dir_";
- val acl_regexp = Str.regexp ".*_.*";
-
(** Somebody created a new directory *)
- (* XXX Race condition here *)
method private new_dir slice_list fqp func =
let s = Unix.stat fqp in
List.iter
Dirwatcher.add_watch fqp [S_Create;S_Delete] func
end
with _ ->
- fprintf logfd "Could not create %s. Looks like a slice shot itself in the foot\n" fqp;flush logfd;
+ logprint "Could not create %s. Looks like a slice shot itself in the foot\n" fqp;
)
slice_list
(** Somebody copied in a new script *)
- (* XXX Race condition here *)
method private new_script slice_list fqp =
let s = Unix.stat fqp in
List.iter (fun frontend->
- frontend#mkentry (mk_rel_path fqp) fqp (s.st_perm)) slice_list
+ frontend#mkentry (mk_rel_path fqp) fqp (s.st_perm))
+ slice_list
method private make_filter acl_fqp =
let filter = Hashtbl.create 16 in
let slice_list =
match acl_filter with
| None -> [] (* No ACL *)
- | Some(filter) -> List.filter (fun fe->Hashtbl.mem filter (fe#get_slice_name ())) frontend_lst
+ | Some(filter) -> List.filter
+ (fun fe->Hashtbl.mem filter (fe#get_slice_name ()))
+ frontend_lst
in
let is_event = list_check evlist in
if (is_event Create) then
else
(* It's a new script *)
begin
- (*
- if (Str.string_match dir_regexp fname 0) then
- let fqp = String.concat "/" [dirname;String.sub fname 4 ((String.length fname)-4+1)] in
- let real_fqp = String.concat "/" [dirname;fname] in
- this#new_dir fqp this#handle_spool_event;
- Hashtbl.add spools fqp real_fqp
- else*)
this#new_script slice_list fqp
end
end
end
end
else (* regex not matched *)
- ()
+ fprintf logfd "Rejected weird entry %s\n" fname
(** Initializer - build the initial tree based on the contents of /vsys *)
initializer
let curfile = readdir dir_handle in
if (not (this#is_acl curfile)) then
begin
- let fqp = String.concat "/" [dir;curfile] in
- let acl_fqp = String.concat "." [fqp;"acl"] in
- let acl_filter = this#make_filter acl_fqp in
- let slice_list =
- match acl_filter with
- | None -> [] (*frontend_lst -> No ACL => No Show *)
- | Some(filter) -> List.filter (fun fe->Hashtbl.mem filter (fe#get_slice_name ())) frontend_lst
- in
- if (Str.string_match file_regexp curfile 0) then
- let s = Unix.stat fqp in
- begin
- match s.st_kind with
- | S_DIR ->
- this#new_dir slice_list fqp this#handle_dir_event;
- build_initial_tree fqp;
- | S_REG ->
- this#new_script slice_list fqp
- | _ ->
- fprintf logfd "Don't know what to do with %s\n" curfile;flush logfd
- end
+ let fqp = String.concat "/" [dir;curfile] in
+ let acl_fqp = String.concat "." [fqp;"acl"] in
+ let acl_filter = this#make_filter acl_fqp in
+ let slice_list =
+ match acl_filter with
+ | None -> [] (*frontend_lst -> No ACL => No Show *)
+ | Some(filter) -> List.filter
+ (fun fe->Hashtbl.mem filter (fe#get_slice_name ()))
+ frontend_lst
+ in
+ if (Str.string_match file_regexp curfile 0) then
+ let s = Unix.stat fqp in
+ begin
+ match s.st_kind with
+ | S_DIR ->
+ this#new_dir slice_list fqp this#handle_dir_event;
+ build_initial_tree fqp;
+ | S_REG ->
+ this#new_script slice_list fqp
+ | _ ->
+ logprint "Don't know what to do with %s\n" curfile
+ end
end
with _
- ->cont:=false;()
+ ->cont:=false;()
done
in
begin