Commit 815a696e authored by Ophélie Gagnard's avatar Ophélie Gagnard

Fix some bugs. Switch to the UEFI main.pyx.

parent 5587749f
...@@ -2,10 +2,11 @@ ...@@ -2,10 +2,11 @@
from libcythonplus.list cimport cyplist from libcythonplus.list cimport cyplist
from libc.stdio cimport fprintf, fopen, fclose, fread, fwrite, FILE, stdout, printf, ferror from libc.stdio cimport fprintf, fopen, fclose, fread, fwrite, FILE, stdout, stderr, printf, ferror, fscanf, fflush
from runtime.runtime cimport SequentialMailBox, BatchMailBox, NullResult, Scheduler from runtime.runtime cimport SequentialMailBox, BatchMailBox, NullResult, Scheduler
from runtime.unistd cimport pid_t, execlp, fork, sleep from runtime.unistd cimport pid_t, execlp, fork, sleep
from runtime.wait cimport wait, waitpid
from stdlib.stat cimport Stat, dev_t from stdlib.stat cimport Stat, dev_t
from stdlib.digest cimport MessageDigest, md5sum, sha1sum, sha256sum, sha512sum from stdlib.digest cimport MessageDigest, md5sum, sha1sum, sha256sum, sha512sum
...@@ -13,6 +14,8 @@ from stdlib.fmt cimport sprintf ...@@ -13,6 +14,8 @@ from stdlib.fmt cimport sprintf
from stdlib.string cimport string from stdlib.string cimport string
from stdlib.dirent cimport DIR, struct_dirent, opendir, readdir, closedir from stdlib.dirent cimport DIR, struct_dirent, opendir, readdir, closedir
from posix.stdlib cimport realpath
from posix.unistd cimport readlink from posix.unistd cimport readlink
...@@ -37,13 +40,7 @@ cdef cypclass Node activable: ...@@ -37,13 +40,7 @@ cdef cypclass Node activable:
pass pass
void format_node(self): void format_node(self):
self.formatted = sprintf("""\ self.formatted = sprintf("""{"path": "%s", "stat": %s}\n""",
{
"%s": {
"stat": %s
}
},
""",
self.path, self.path,
self.st.to_json(), self.st.to_json(),
) )
...@@ -115,6 +112,12 @@ cdef cypclass DirNode(Node): ...@@ -115,6 +112,12 @@ cdef cypclass DirNode(Node):
for active_child in self.children: for active_child in self.children:
active_child.build_node(NULL, dev_whitelist, ignore_paths) active_child.build_node(NULL, dev_whitelist, ignore_paths)
void format_node(self):
self.formatted = sprintf("""{"path": "%s/", "stat": %s}\n""",
self.path,
self.st.to_json(),
)
void write_node(self, FILE * stream): void write_node(self, FILE * stream):
fwrite(self.formatted.data(), 1, self.formatted.size(), stream) fwrite(self.formatted.data(), 1, self.formatted.size(), stream)
while self.children.__len__() > 0: while self.children.__len__() > 0:
...@@ -127,7 +130,6 @@ cdef cypclass DirNode(Node): ...@@ -127,7 +130,6 @@ cdef cypclass DirNode(Node):
cdef enum: cdef enum:
BUFSIZE = 64 * 1024 BUFSIZE = 64 * 1024
cdef cypclass FileNode(Node): cdef cypclass FileNode(Node):
string md5_data string md5_data
string sha1_data string sha1_data
...@@ -191,19 +193,7 @@ cdef cypclass FileNode(Node): ...@@ -191,19 +193,7 @@ cdef cypclass FileNode(Node):
if self.error: if self.error:
Node.format_node(self) Node.format_node(self)
else: else:
self.formatted = sprintf("""\ self.formatted = sprintf("""{"path": "%s", "stat": %s, "hash": {"md5": "%s", "sha1": "%s", "sha256": "%s", "sha512": "%s"}}\n""",
{
"%s": {
"stat": %s,
"digests": {
"md5": "%s",
"sha1": "%s",
"sha256": "%s",
"sha512": "%s"
}
}
},
""",
self.path, self.path,
self.st.to_json(), self.st.to_json(),
self.md5_data, self.md5_data,
...@@ -232,14 +222,7 @@ cdef cypclass SymlinkNode(Node): ...@@ -232,14 +222,7 @@ cdef cypclass SymlinkNode(Node):
if self.error: if self.error:
Node.format_node(self) Node.format_node(self)
else: else:
self.formatted = sprintf("""\ self.formatted = sprintf("""{"path": "%s", "stat": %s, "target": "%s"}\n""",
{
"%s": {
"stat": %s,
"target": "%s"
}
},
""",
self.path, self.path,
self.st.to_json(), self.st.to_json(),
self.target, self.target,
...@@ -249,20 +232,30 @@ cdef cypclass SymlinkNode(Node): ...@@ -249,20 +232,30 @@ cdef cypclass SymlinkNode(Node):
fwrite(self.formatted.data(), 1, self.formatted.size(), stream) fwrite(self.formatted.data(), 1, self.formatted.size(), stream)
cdef int start(string path) nogil: cdef int start(const char *path) nogil:
printf("TEST TEST TEST TEST TEST\n\n") # DEBUG
# TODO replace 4096 by PATH_MAX (yet it will not be perfect)
cdef char resolved_path[4096]
cdef pid_t wait_error = -1 # DEBUG
cdef char* program_name = "fluentbit" cdef char* program_name = "fluentbit"
cdef char* arg1 = "-e" cdef char* arg1 = "-e"
cdef char* arg2 = "/root/metadata-collect-agent/dracut.module/90metadata-collect/fluentbit_wendelin.so" cdef char* arg2 = "flb/fluentbit_wendelin.so"
cdef char* arg3 = "-c" cdef char* arg3 = "-c"
cdef char* arg4 = "/root/metadata-collect-agent/dracut.module/90metadata-collect/flb.conf" cdef char* arg4 = "flb/flb.conf"
cdef pid_t child_pid = -1 # DEBUG cdef pid_t child_pid = -1 # DEBUG
child_pid = fork() # DEBUG child_pid = fork() # DEBUG
cdef int err cdef int err
cdef char ip_address[100]
cdef FILE *address_path = fopen("/sys/class/net/ens3/address", "r")
if child_pid == 0: # CHILD if child_pid == 0: # CHILD
err = execlp("/root/metadata-collect-agent/dracut.module/90metadata-collect/fluent-bit", program_name, arg1, arg2, arg3, arg4, 0) err = execlp("flb/fluent-bit", program_name, arg1, arg2, arg3, arg4, 0)
printf("ERROR with execlp() in CHILD: %d\n", err) fprintf(stderr, "ERROR with execlp() in CHILD: %d\n", err)
else: # PARENT else: # PARENT
printf("WELCOME TO PARENT\n\n") # DEBUG
sleep(2) # TODO error handling ; check if a wait can be made to wait for the child to perform execlp() (instead of the sleep)
global scheduler global scheduler
scheduler = Scheduler() scheduler = Scheduler()
...@@ -282,33 +275,59 @@ cdef int start(string path) nogil: ...@@ -282,33 +275,59 @@ cdef int start(string path) nogil:
if p_stat is not NULL: if p_stat is not NULL:
p_dev = p_stat.st_data.st_dev p_dev = p_stat.st_data.st_dev
dev_whitelist.append(p_dev) dev_whitelist.append(p_dev)
node = make_node(path, path) fprintf(stderr, "test 001\n") # DEBUG
fflush(stderr) # DEBUG
realpath(path, resolved_path)
fprintf(stderr, resolved_path) # DEBUG
fprintf(stderr, "\n") # DEBUG
fflush(stderr) # DEBUG
node = make_node(resolved_path, resolved_path)
if node is NULL: if node is NULL:
return -1 return -1
active_node = activate(consume node) fprintf(stderr, "test 002\n") # DEBUG
fflush(stderr) # DEBUG
active_node = activate(consume node)
fprintf(stderr, 'test 003\n') # DEBUG
fflush(stderr) # DEBUG
active_node.build_node(NULL, consume dev_whitelist, consume ignore_paths) active_node.build_node(NULL, consume dev_whitelist, consume ignore_paths)
fprintf(stderr, 'test 004\n') # DEBUG
fflush(stderr) # DEBUG
scheduler.finish() scheduler.finish()
fprintf(stderr, 'test 005\n') # DEBUG
fflush(stderr) # DEBUG
node = consume active_node node = consume active_node
#""" # DEBUG #""" # DEBUG
result = fopen('/var/log/metadata_collect.log', 'w') result = fopen('/var/log/metadata_collect.log', 'w')
if result is NULL: if result is NULL:
fprintf(stderr, 'Error creating the log file.\n') # DEBUG
fflush(stderr)
return -1 return -1
fprintf(result, '[\n') fprintf(stderr, 'Log opened successfully.\n') # DEBUG
fprintf(stderr, "WRITE_NOTE STAGE\n\n") # DEBUG
fscanf(address_path, "%s", ip_address)
fclose(address_path)
fprintf(result, '{"mac_address": "%s"}\n', ip_address)
node.write_node(result) node.write_node(result)
fprintf(result, ' {}\n]\n') fprintf(result, '{}\n')
fprintf(result, 'fluentbit_end\n') fprintf(result, 'fluentbit_end\n')
fclose(result) fclose(result)
#""" # DEBUG #""" # DEBUG
del scheduler del scheduler
fprintf(stderr, "WAITING for fluent-bit to end\n\n")
wait_error = wait(NULL) # TODO improve this call (error handling, etc.)
#wait_error = waitpid(child_pid, NULL, 1) # TODO improve this call (error handling, etc.)
fprintf(stderr, "WAITING ENDS\n\n")
fflush(stderr) # DEBUG
return 0 return 0
cdef public int main() nogil: cdef public int main() nogil:
......
...@@ -241,16 +241,16 @@ cdef int start(const char *path) nogil: ...@@ -241,16 +241,16 @@ cdef int start(const char *path) nogil:
cdef pid_t wait_error = -1 # DEBUG cdef pid_t wait_error = -1 # DEBUG
cdef char* program_name = "fluentbit" cdef char* program_name = "fluentbit"
cdef char* arg1 = "-e" cdef char* arg1 = "-e"
cdef char* arg2 = "flb/fluentbit_wendelin.so" cdef char* arg2 = "/etc/fluentbit_wendelin.so"
cdef char* arg3 = "-c" cdef char* arg3 = "-c"
cdef char* arg4 = "flb/flb.conf" cdef char* arg4 = "/etc/flb.conf"
cdef pid_t child_pid = -1 # DEBUG cdef pid_t child_pid = -1 # DEBUG
child_pid = fork() # DEBUG child_pid = fork() # DEBUG
cdef int err cdef int err
cdef char ip_address[100] cdef char ip_address[100]
cdef FILE *address_path = fopen("/sys/class/net/ens3/address", "r") cdef FILE *address_path = fopen("/sys/class/net/ens3/address", "r")
if child_pid == 0: # CHILD if child_pid == 0: # CHILD
err = execlp("flb/fluent-bit", program_name, arg1, arg2, arg3, arg4, 0) err = execlp("/sbin/fluent-bit", program_name, arg1, arg2, arg3, arg4, 0)
fprintf(stderr, "ERROR with execlp() in CHILD: %d\n", err) fprintf(stderr, "ERROR with execlp() in CHILD: %d\n", err)
else: # PARENT else: # PARENT
printf("WELCOME TO PARENT\n\n") # DEBUG printf("WELCOME TO PARENT\n\n") # DEBUG
......
...@@ -2,10 +2,11 @@ ...@@ -2,10 +2,11 @@
from libcythonplus.list cimport cyplist from libcythonplus.list cimport cyplist
from libc.stdio cimport fprintf, fopen, fclose, fread, fwrite, FILE, stdout, printf, ferror from libc.stdio cimport fprintf, fopen, fclose, fread, fwrite, FILE, stdout, stderr, printf, ferror, fscanf, fflush
from runtime.runtime cimport SequentialMailBox, BatchMailBox, NullResult, Scheduler from runtime.runtime cimport SequentialMailBox, BatchMailBox, NullResult, Scheduler
from runtime.unistd cimport pid_t, execlp, fork, sleep from runtime.unistd cimport pid_t, execlp, fork, sleep
from runtime.wait cimport wait, waitpid
from stdlib.stat cimport Stat, dev_t from stdlib.stat cimport Stat, dev_t
from stdlib.digest cimport MessageDigest, md5sum, sha1sum, sha256sum, sha512sum from stdlib.digest cimport MessageDigest, md5sum, sha1sum, sha256sum, sha512sum
...@@ -13,6 +14,8 @@ from stdlib.fmt cimport sprintf ...@@ -13,6 +14,8 @@ from stdlib.fmt cimport sprintf
from stdlib.string cimport string from stdlib.string cimport string
from stdlib.dirent cimport DIR, struct_dirent, opendir, readdir, closedir from stdlib.dirent cimport DIR, struct_dirent, opendir, readdir, closedir
from posix.stdlib cimport realpath
from posix.unistd cimport readlink from posix.unistd cimport readlink
...@@ -37,13 +40,7 @@ cdef cypclass Node activable: ...@@ -37,13 +40,7 @@ cdef cypclass Node activable:
pass pass
void format_node(self): void format_node(self):
self.formatted = sprintf("""\ self.formatted = sprintf("""{"path": "%s", "stat": %s}\n""",
{
"%s": {
"stat": %s
}
},
""",
self.path, self.path,
self.st.to_json(), self.st.to_json(),
) )
...@@ -115,6 +112,12 @@ cdef cypclass DirNode(Node): ...@@ -115,6 +112,12 @@ cdef cypclass DirNode(Node):
for active_child in self.children: for active_child in self.children:
active_child.build_node(NULL, dev_whitelist, ignore_paths) active_child.build_node(NULL, dev_whitelist, ignore_paths)
void format_node(self):
self.formatted = sprintf("""{"path": "%s/", "stat": %s}\n""",
self.path,
self.st.to_json(),
)
void write_node(self, FILE * stream): void write_node(self, FILE * stream):
fwrite(self.formatted.data(), 1, self.formatted.size(), stream) fwrite(self.formatted.data(), 1, self.formatted.size(), stream)
while self.children.__len__() > 0: while self.children.__len__() > 0:
...@@ -127,7 +130,6 @@ cdef cypclass DirNode(Node): ...@@ -127,7 +130,6 @@ cdef cypclass DirNode(Node):
cdef enum: cdef enum:
BUFSIZE = 64 * 1024 BUFSIZE = 64 * 1024
cdef cypclass FileNode(Node): cdef cypclass FileNode(Node):
string md5_data string md5_data
string sha1_data string sha1_data
...@@ -191,19 +193,7 @@ cdef cypclass FileNode(Node): ...@@ -191,19 +193,7 @@ cdef cypclass FileNode(Node):
if self.error: if self.error:
Node.format_node(self) Node.format_node(self)
else: else:
self.formatted = sprintf("""\ self.formatted = sprintf("""{"path": "%s", "stat": %s, "hash": {"md5": "%s", "sha1": "%s", "sha256": "%s", "sha512": "%s"}}\n""",
{
"%s": {
"stat": %s,
"digests": {
"md5": "%s",
"sha1": "%s",
"sha256": "%s",
"sha512": "%s"
}
}
},
""",
self.path, self.path,
self.st.to_json(), self.st.to_json(),
self.md5_data, self.md5_data,
...@@ -232,14 +222,7 @@ cdef cypclass SymlinkNode(Node): ...@@ -232,14 +222,7 @@ cdef cypclass SymlinkNode(Node):
if self.error: if self.error:
Node.format_node(self) Node.format_node(self)
else: else:
self.formatted = sprintf("""\ self.formatted = sprintf("""{"path": "%s", "stat": %s, "target": "%s"}\n""",
{
"%s": {
"stat": %s,
"target": "%s"
}
},
""",
self.path, self.path,
self.st.to_json(), self.st.to_json(),
self.target, self.target,
...@@ -249,8 +232,13 @@ cdef cypclass SymlinkNode(Node): ...@@ -249,8 +232,13 @@ cdef cypclass SymlinkNode(Node):
fwrite(self.formatted.data(), 1, self.formatted.size(), stream) fwrite(self.formatted.data(), 1, self.formatted.size(), stream)
cdef int start(string path) nogil: cdef int start(const char *path) nogil:
printf("TEST TEST TEST TEST TEST\n\n") # DEBUG
# TODO replace 4096 by PATH_MAX (yet it will not be perfect)
cdef char resolved_path[4096]
cdef pid_t wait_error = -1 # DEBUG
cdef char* program_name = "fluentbit" cdef char* program_name = "fluentbit"
cdef char* arg1 = "-e" cdef char* arg1 = "-e"
cdef char* arg2 = "/etc/fluentbit_wendelin.so" cdef char* arg2 = "/etc/fluentbit_wendelin.so"
...@@ -259,10 +247,15 @@ cdef int start(string path) nogil: ...@@ -259,10 +247,15 @@ cdef int start(string path) nogil:
cdef pid_t child_pid = -1 # DEBUG cdef pid_t child_pid = -1 # DEBUG
child_pid = fork() # DEBUG child_pid = fork() # DEBUG
cdef int err cdef int err
cdef char ip_address[100]
cdef FILE *address_path = fopen("/sys/class/net/ens3/address", "r")
if child_pid == 0: # CHILD if child_pid == 0: # CHILD
err = execlp("/sbin/fluent-bit", program_name, arg1, arg2, arg3, arg4, 0) err = execlp("/sbin/fluent-bit", program_name, arg1, arg2, arg3, arg4, 0)
printf("ERROR with execlp() in CHILD: %d\n", err) fprintf(stderr, "ERROR with execlp() in CHILD: %d\n", err)
else: # PARENT else: # PARENT
printf("WELCOME TO PARENT\n\n") # DEBUG
sleep(2) # TODO error handling ; check if a wait can be made to wait for the child to perform execlp() (instead of the sleep)
global scheduler global scheduler
scheduler = Scheduler() scheduler = Scheduler()
...@@ -282,33 +275,59 @@ cdef int start(string path) nogil: ...@@ -282,33 +275,59 @@ cdef int start(string path) nogil:
if p_stat is not NULL: if p_stat is not NULL:
p_dev = p_stat.st_data.st_dev p_dev = p_stat.st_data.st_dev
dev_whitelist.append(p_dev) dev_whitelist.append(p_dev)
node = make_node(path, path) fprintf(stderr, "test 001\n") # DEBUG
fflush(stderr) # DEBUG
realpath(path, resolved_path)
fprintf(stderr, resolved_path) # DEBUG
fprintf(stderr, "\n") # DEBUG
fflush(stderr) # DEBUG
node = make_node(resolved_path, resolved_path)
if node is NULL: if node is NULL:
return -1 return -1
active_node = activate(consume node) fprintf(stderr, "test 002\n") # DEBUG
fflush(stderr) # DEBUG
active_node = activate(consume node)
fprintf(stderr, 'test 003\n') # DEBUG
fflush(stderr) # DEBUG
active_node.build_node(NULL, consume dev_whitelist, consume ignore_paths) active_node.build_node(NULL, consume dev_whitelist, consume ignore_paths)
fprintf(stderr, 'test 004\n') # DEBUG
fflush(stderr) # DEBUG
scheduler.finish() scheduler.finish()
fprintf(stderr, 'test 005\n') # DEBUG
fflush(stderr) # DEBUG
node = consume active_node node = consume active_node
#""" # DEBUG #""" # DEBUG
result = fopen('/var/log/metadata_collect.log', 'w') result = fopen('/var/log/metadata_collect.log', 'w')
if result is NULL: if result is NULL:
fprintf(stderr, 'Error creating the log file.\n') # DEBUG
fflush(stderr)
return -1 return -1
fprintf(result, '[\n') fprintf(stderr, 'Log opened successfully.\n') # DEBUG
fprintf(stderr, "WRITE_NOTE STAGE\n\n") # DEBUG
fscanf(address_path, "%s", ip_address)
fclose(address_path)
fprintf(result, '{"mac_address": "%s"}\n', ip_address)
node.write_node(result) node.write_node(result)
fprintf(result, ' {}\n]\n') fprintf(result, '{}\n')
fprintf(result, 'fluentbit_end\n') fprintf(result, 'fluentbit_end\n')
fclose(result) fclose(result)
#""" # DEBUG #""" # DEBUG
del scheduler del scheduler
fprintf(stderr, "WAITING for fluent-bit to end\n\n")
wait_error = wait(NULL) # TODO improve this call (error handling, etc.)
#wait_error = waitpid(child_pid, NULL, 1) # TODO improve this call (error handling, etc.)
fprintf(stderr, "WAITING ENDS\n\n")
fflush(stderr) # DEBUG
return 0 return 0
cdef public int main() nogil: cdef public int main() nogil:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment