soal-shift-sisop-modul-2-C09-2021
Diminta untuk membuat nama folder sesuai dengan ketentuan yaitu Musyik untuk mp3, Fylm untuk mp4, dan Pyoto untuk jpg.
child1 = fork();
if (child1 < 0) exit(0);
if (child1 == 0){
char *argv[] = {"mkdir", "-p", "/home/fajrinam/modul2/soal1/Musyik", NULL};
execv("/bin/mkdir", argv);
}
child2 = fork();
if (child2 < 0) exit(0);
if (child2 == 0){
char *argv[] = {"mkdir", "-p", "/home/fajrinam/modul2/soal1/Fylm", NULL};
execv("/bin/mkdir", argv);
}
child3 = fork();
if (child3 < 0) exit(0);
if (child3 == 0){
char *argv[] = {"mkdir", "-p", "/home/fajrinam/modul2/soal1/Pyoto", NULL};
execv("/bin/mkdir", argv);
}
Diminta untuk mendownload Musik, Film dan Foto dari link yang telah disediakan.
while (wait(&status) > 0);
child4 = fork();
if (child4 < 0) exit(0);
if (child4 == 0){
char *arg[] = {"wget", "--no-check-certificate", "https://drive.google.com/uc?id=1ZG8nRBRPquhYXq_sISdsVcXx5VdEgi-J&export=download", "-O", "Musik_for_Stevany.zip", "-o", "/dev/null", NULL};
execv("/usr/bin/wget", arg);
}
while (wait(&status1) > 0);
child5 = fork();
if (child5 < 0) exit(0);
if (child5 == 0){
char *arg[] = {"wget", "--no-check-certificate", "https://drive.google.com/uc?id=1ktjGgDkL0nNpY-vT7rT7O6ZI47Ke9xcp&export=download", "-O", "Film_for_Stevany.zip", "-o", "/dev/null", NULL};
execv("/usr/bin/wget", arg);
}
while (wait(&status2) > 0);
child6 = fork();
if (child6 < 0) exit(0);
if (child6 == 0){
char *arg[] = {"wget", "--no-check-certificate", "https://drive.google.com/uc?id=1FsrAzb9B5ixooGUs0dGiBr-rC7TS9wTD&export=download", "-O", "Foto_for_Stevany.zip", "-o", "/dev/null", NULL};
execv("/usr/bin/wget", arg);
}
Diminta agar folder yang dibuat tidak berisikan zip, maka perlu untuk meng-extract terlebih dahulu.
while (wait(&status3) > 0);
child7 = fork();
if (child7 < 0) exit(0);
if (child7 == 0){
char *arg[] = {"unzip", "-o", "-q", "./Musik_for_Stevany.zip", NULL};
execv("/usr/bin/unzip", arg);
}
while (wait(&status4) > 0);
child8 = fork();
if (child8 < 0)exit(0);
if (child8 == 0){
char *arg[] = {"unzip", "-o", "-q", "./Film_for_Stevany.zip", NULL};
execv("/usr/bin/unzip", arg);
}
while (wait(&status5) > 0);
child9 = fork();
if (child9 < 0) exit(0);
if (child9 == 0){
char *arg[] = {"unzip", "-o", "-q", "./Foto_for_Stevany.zip", NULL};
execv("/usr/bin/unzip", arg);
}
Diminta hanya memindahkan file ke dalam folder yang telah dibuat sebelumnya.
while (wait(&status6) > 0);
child10 = fork();
if (child10 < 0) exit(0);
if (child10 == 0){
char *argv[] = {"find", "./MUSIK", "-mindepth", "1", "-type", "f", "-exec", "mv", "-t", "./Musyik", "{}", "+", NULL};
execv("/usr/bin/find", argv);
}
while (wait(&status7) > 0);
child11 = fork();
if (child11 < 0) exit(0);
if (child11 == 0){
char *argv[] = {"find", "./FILM", "-mindepth", "1", "-type", "f", "-exec", "mv", "-t", "./Fylm", "{}", "+", NULL};
execv("/usr/bin/find", argv);
}
while (wait(&status8) > 0);
child12 = fork();
if (child12 < 0) exit(0);
if (child12 == 0) {
char *argv[] = {"find", "./FOTO", "-mindepth", "1", "-type", "f", "-exec", "mv", "-t", "./Pyoto", "{}", "+", NULL};
execv("/usr/bin/find", argv);
}
Diminta untuk menjalankan semua hal diatas secara otomatis 6 jam sebelum waktu ulang tahun dari Stevany.
Ulang Tahun Stevany : 09 April Pukul 22.22 WIB
if (t->tm_mon+1 == 4 && t->tm_mday == 9 && t->tm_hour == 16 && t->tm_min == 22 && t->tm_sec == 0){
...
...
}
Pada waktu ulang tahun Stevany, semua folder akan di zip dengan format nama Lopyu_Stevany.zip
Ulang Tahun Stevany : 09 April Pukul 22.22 WIB
if (t->tm_mon+1 == 4 && t->tm_mday == 9 && t->tm_hour == 22 && t->tm_min == 22 && t->tm_sec == 0){
child14 = fork();
if (child14 == 0){
child15 = fork();
if (child15 < 0) exit(0);
if (child15 == 0){
char *arg[] = {"zip", "-q", "-rm", "Lopyu_Stevany.zip", "./Musyik", "./Fylm", "./Pyoto", NULL};
execv("/usr/bin/zip", arg);
}
}
Kemudian semua folder akan di delete sehingga hanya menyisakan file Lopyu_Stevany.zip
while (wait(&status11) > 0);
child16 = fork();
if (child16 < 0) exit(0);
if (child16 == 0){
char *arg[] = {"rm", "-r", "./MUSIK", "./FILM", "./FOTO", NULL};
execv("/bin/rm", arg);
}
Diminta untuk mengekstrak zip ke yang diberikan kedalam "/home/[user]/modul2/petshop" dan menghapus folder-folder yang tidak perlukan
Dibuat dulu folder petshop jika belum ada, kemudian unzip folder pets.zip dengan pengecualian folder apex_cheats, musics, dan unimportant_files:
if (child_id == 0) {
// this is child
char *argv[] = {"mkdir", "-p", "petshop", NULL};
execv("/bin/mkdir", argv);
}
while ((wait(&status)) > 0);
char *argv2[] = {"unzip", "pets.zip", "-d", "/home/naufaldillah/modul2/petshop", "-x", "*apex_cheats/*", "*musics/*", "*unimportant_files/*", NULL};
execv("/bin/unzip", argv2);
Dokumentasi:
Diminta untuk membuat folder setiap jenis peliharaan yang ada di dalam zip
Siapkan dulu struct data untuk mengambil file
struct dirent *de;
DIR *dr = opendir("/modul2/petshop");
Copy name file yang ada di folder lalu dipisahkan dengan strtok dan ambil nama peliharaan. Kemudian buat folder dengan nama peliharaan:
while((de = readdir(dr)) != NULL)
{
printf("Folder berhasil dibuat\n");
strcpy(animal_name_folder, "/modul2/petshop");
strcat(animal_name_folder, strtok(de->d_name, ";"));
child_id2 = fork();
if (child_id2 == 0) {
char *argv4[] = {"mkdir", "-p", animal_name_folder, NULL};
execv("/bin/mkdir", argv4);
}
char *argv5[] = {"touch", "Keterangan.txt", NULL};
execv("usr/bin/touch", argv5);
}
Kendala: Kode tidak bisa dijalankan
Diminta untuk memindahkan foto ke folder dengan kategori yang sesuai kemudian direnam dengan nama peliharaan
Kendala: Mengalami masalah dalam pengerjaan
Diminta untuk memindahkan foto ke masing-masing kategori yang sesuai jika terdapat lebih dari satu peliharaan dalam foto
Kendala: Mengalami masalah dalam pengerjaan
Diminta untuk membuat file "keterangan.txt" yang berisi nama dan umur semuar peliharaan dalam folder tersebut.
Fungsi yang dijalankan:
char *argv5[] = {"touch", "Keterangan.txt", NULL};
execv("usr/bin/touch", argv5);
Kendala: Kode tidak bisa dijalankan
Diminta untuk membuat sebuah folder tiap 40s dengan format nama timestamp sekarang
Fungsi yang dijalankan =
void createDir(char awowo[])
{
pid_t child_id, child_id2;
time_t rawtime;
struct tm * timenow;
time (&rawtime);
timenow = localtime(&rawtime);
// char awowo[40];
strftime(awowo, 40, "%Y-%m-%d_%H:%M:%S" , timenow);
child_id = fork();
if (child_id < 0)
{
exit(0);
}
if(child_id==0)
{
char *argv[] = {"mkdir", awowo, NULL};
execv("/bin/mkdir", argv);
}
}
Untuk pemanggilan tiap 40s maka di main dijalankan fungsi tersebut =
int main(int argc, char* argv[])
{
int status;
while(wait(&status) > 0);
daemonLurr(); //fungsi pemanggilan daemon
while(1)
{
char foldname[40];
createDir(foldname);
sleep(40);
}
}
Dokumentasi =
Diminta mendownload gambar pada website picsum.photos tiap 5 detik dan diberi nama sesuai timestamp
Fungsi yang dijalankan =
void downloadPic(char awowo[])
{
int statuslur;
pid_t child_id;
child_id = fork();
if(child_id<0)
{
exit(0);
}
if(child_id == 0)
{
chdir(awowo);
for(int i=0;i<10;i++){
time_t rawtime;
struct tm * timenow;
time (&rawtime);
timenow = localtime(&rawtime);
char picname[100];
char link[100];
strftime(picname, 100, "%Y-%m-%d_%H:%M:%S", timenow);
sprintf(link , "https://picsum.photos/%ld", (rawtime % 1000) + 50);
pid_t child_id_pic;
child_id_pic = fork();
if(child_id_pic<0)
{
exit(0);
}
if(child_id_pic==0)
{
char *argv[]= {"wget", link, "-O", picname, "-o", "/dev/null", NULL};
execv("/usr/bin/wget", argv);
}
sleep(5);
}
chdir("..");
}
}
Fungsi tersebut meminta sebuah variabel 'awowo' yang berarti meminta dimana folder tempat kita akan mendownload gambar yang diinginkan
Seperti pada pembuatan folder, kita menggunakan fungsi sleep(5) yang berarti akan mengulang fungsi tersebut dengan delay 5 detik
Pemanggilan fungsi download terdapat didalam fungsi pembuatan folder =
void createDir(char awowo[])
{
pid_t child_id, child_id2;
time_t rawtime;
struct tm * timenow;
int statDir;
time (&rawtime);
timenow = localtime(&rawtime);
strftime(awowo, 40, "%Y-%m-%d_%H:%M:%S" , timenow);
child_id = fork();
if (child_id < 0)
{
exit(0);
}
if(child_id==0)
{
if(fork() == 0)
{
char *argv[] = {"mkdir", awowo, NULL};
execv("/bin/mkdir", argv);
}
else
{
while(wait(&statDir)>0);
downloadPic(awowo);
}
}
}
dokumentasi =
Membuat sebuah file status.txt yang didalamnya tertulis "Download Success" yang terenskripsi dengan metode cipher, setelah itu folder tersebut di zip dan di delete
Untuk fungsi pembuatan file status.txt =
char msg_info[100] = "Download Success";
cipherCrypt(msg_info, 5); // 5 karena kita akan men-shift tiap huruf sebanyak 5
FILE* downloadstatus = fopen("status.txt", "w");
fprintf(downloadstatus,"%s", msg_info);
Untuk fungsi enkripsi cipher =
void cipherCrypt(char msg[], int key)
{
for(int j = 0; msg[j] != '\0'; ++j)
{
char ch = msg[j];
if(ch >= 'a' && ch <= 'z')
{
ch = ch + key;
if(ch > 'z')
{
ch = ch - 'z' + 'a' - 1;
}
msg[j] = ch;
}
else if(ch >= 'A' && ch <= 'Z')
{
ch = ch + key;
if(ch > 'Z')
{
ch = ch - 'Z' + 'A' - 1;
}
msg[j] = ch;
}
}
}
Fungsi untuk pembuatan zip file =
void createZip(char awowo[]) // awowo sebagai nama file yang akan di zip
{
char zipname[100];
strcpy(zipname, awowo);
strcat(zipname, ".zip");
pid_t child_id;
child_id = fork();
if(child_id < 0) exit(0);
if(child_id == 0)
{
char *argv[] = {"zip", "-r", zipname, awowo, NULL};
execv("/usr/bin/zip", argv);
}
}
Fungsi untuk menghapus file =
void createZip(char awowo[]) // awowo sebagai nama file yang akan di zip
{
char zipname[100];
strcpy(zipname, awowo);
strcat(zipname, ".zip");
pid_t child_id;
child_id = fork();
if(child_id < 0) exit(0);
if(child_id == 0)
{
char *argv[] = {"zip", "-r", zipname, awowo, NULL};
execv("/usr/bin/zip", argv);
}
}
Untuk pemanggilan fungsi terdapat didalam fungsi pembuatan folder dibawah pemanggilan fungsi download gambar =
void createDir(char awowo[])
{
pid_t child_id, child_id2;
time_t rawtime;
struct tm * timenow;
int statDir, statEnc, statZip;
time (&rawtime);
timenow = localtime(&rawtime);
strftime(awowo, 40, "%Y-%m-%d_%H:%M:%S" , timenow);
child_id = fork();
if (child_id < 0)
{
exit(0);
}
if(child_id==0)
{
if(fork() == 0)
{
char *argv[] = {"mkdir", awowo, NULL};
execv("/bin/mkdir", argv);
}
else
{
while(wait(&statDir)>0);
downloadPic(awowo);
while(wait(&statEnc)>0);
createZip(awowo);
while(wait(&statZip)>0);
deleteDir(awowo);
}
}
}
Dokumentaasi =
Membuat killer program yang akan menghentikan seluruh proses soal3 dan merupakan program bash
Fungsi yang dijalankan =
void createKiller()
{
FILE* killer;
killer = fopen("killer.sh", "w");
fprintf(killer, "#!/bin/bash\npkill -f soal3\necho \'Proccess have been killed!\'\nrm killer.sh");
fclose(killer);
}
Pemanggilan dilakukan pada main =
int main(int argc, char* argv[])
{
createKiller();
...
}
Dokumentassi =
Mmebuat argumen jika z maka proccess harus langsung dimatikan, jika x maka menunggu penghapusan file selesai baru mematikan proccess
Fungsi yang dijalankan =
int main(int argc, char* argv[])
{
if(argv[1][1] == 'z')
{
createKiller(1);
}
if(argv[1][1] == 'x')
{
createKiller(2);
}
...
Disini kita memodifikasi fungsi createKiller() dengan menambahkan sebuah passingan value, jika argumen z maka pass value 1, jika x maka 2
Fungsi createKiller setelah dimodifikasi =
void createKiller(int x)
{
if(x == 1)
{
FILE* killer;
killer = fopen("killer.sh", "w");
fprintf(killer, "#!/bin/bash\npkill -f soal3\necho \'Proccess have been killed!\'\nrm killer.sh");
fclose(killer);
}
if(x == 2)
{
FILE* killer;
killer = fopen("killer.sh", "w");
fprintf(killer, "#!/bin/bash\nkillall -15 soal3\necho \'Proccess have been killed!\'\nrm killer.sh");
fclose(killer);
signal(SIGTERM, changeSign);
}
}
Kita juga mendefinisikan sebuah signal untuk menghentikan proccess sebagai variable global dan mendeklarasikan fungsi untuk mengubah signal =
int sign;
void changeSign()
{
sign = 0;
}
Lalu pada main kita mengedit beberapa code menjadi =
int main(int argc, char* argv[])
{
if(argv[1][1] == 'z')
{
createKiller(1);
}
if(argv[1][1] == 'x')
{
createKiller(2);
}
int status;
while(wait(&status) > 0);
daemonLurr();
sign = 1;
while(sign)
{
char foldname[40];
createDir(foldname);
if(sign == 0) break;
sleep(40);
}
}
Dokumentasi =