https://github.com/wiliamhw/soal-shift-sisop-modul-3-e09-2021
https://github.com/wiliamhw/soal-shift-sisop-modul-3-e09-2021
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/wiliamhw/soal-shift-sisop-modul-3-e09-2021
- Owner: wiliamhw
- Created: 2021-05-05T06:31:58.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2021-05-22T08:31:30.000Z (about 4 years ago)
- Last Synced: 2025-01-21T06:12:54.705Z (5 months ago)
- Language: C
- Size: 43.9 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Kelompok E09
* 05111940000074 - Nur Ahmad Khatim
* 05111940000087 - William Handi Wijaya
* 05111940000212 - Fadhil Dimas Sucahyo# Soal 1
* Soal ini dikerjakan oleh 05111940000087 - William Handi Wijaya.
* Dilarang menggunakan `system()` dan `execv()`. Silahkan dikerjakan sepenuhnya dengan thread dan socket programming.
* Untuk download dan upload silahkan menggunakan file teks dengan ekstensi dan isi bebas (yang ada isinya bukan touch saja dan tidak kosong) dan requirement untuk benar adalah percobaan dengan minimum 5 data.## Subsoal a
### Penjelasan Soal
* Client bisa register dan login pada server.
* Saat register, client akan diminta input id dan passwordnya.
* Login dinyatakan berhasil jika id dan password yang dikirim client sesuai dengan list akun pada server.
* Sistem dapat menerima multi-connections.
* Jika ada satu client yang sudah login, maka client yang ingin login berikutnya harus menunggu hingga client yang sudah login tersebut logout.
* Data id dan password akun disimpan di file bernama **akun.txt** dengan format:
```
id:password
id2:password2
```
### Penyelesaian Soal
1. Buat server yang dapat menerima multi-connections.
2. Buat thread untuk mengatur IO.
3. Buat dua pilihan input, yaitu "register" dam "login".
4. Buat fitur register.
1. Dapatkan input client
2. Simpan input client di **akun.txt** sesuai format yang ditentukan.
5. Buat fitur login.
1. Pastikan tidak ada client yang sedang terkoneksi.
1. Jika client memilih login saat ada client lain yang sudah terloggin, kirim pesan **Server is busy. Wait other client to logout** ke client.
2. Kembali ke menu pilihan input.
2. Dapatkan input client.
3. Pastikan data akun yang diinput client ada di **akun.txt**
* Jika tidak ada, batalkan login
4. Sambungkan client dengan server.### Output
## Subsoal b & c
### Penjelasan Soal
* Sistem memiliki file bernama **files.tsv** yang dengan format:
`\t\t`
* File **files.tsv** merupakan database dari input file yang disimpan di folder **FILES**.
* Struktur dari direktori **FILES** adalah sebagai berikut:
```
File1.ekstensi
File2.ekstensi
```
* Client dapat mengirim input file text ke server dengan command `add` dengan format prompt message sebagai berikut.
```
Publisher:
Tahun Publikasi:
Filepath:
```
* Simpan file yang baru di upload ke folder **FILES** dan update **files.tsv**.
### Penyelesaian Soal
1. Pastikan client sudah login ke server.
2. Saat client menggunakan command `add`, dapatkan input sesuai format prompt message di atas.
3. Pastikan folder **FILES** dan file **files.tsv** sudah terbuat.
4. Kirim file dari *client's local filepath* ke folder **FILES** di server.
* Jika file tidak ada di *client's local filepath*
1. Tampilkan pesan **Error, file not found** ke client.
2. Kembali ke menu pemilihan perintah.
* Jika file sudah ada di **files.tsv**
1. Tampilkan pesan **Error, file is already uploaded** ke client.
2. Kembali ke menu pemilihan perintah.
5. Tulis data file yang baru terinput ke file **files.tsv** sesuai format di atas.## Subsoal d
### Penjelasan Soal
* Client dapat mendownload file text yang ada di folder **FILES**.
* Perintah untuk mendownload file text adalah `download .`.### Penyelesaian Soal
1. Pastikan client sudah login ke server.
2. Dapatkan namafile dan ekstensi dari file yang ingin didownload.
3. Pastikan file tersebut ada di **files.tsv**.
1. Jika tidak ada, tampilkan pesan **Error, file hasn't been downloaded** ke client.
2. Kembali ke menu pemilihan perintah.
4. Kirim file ke client.## Subsoal e
### Penjelasan Soal
* Perintah pada subsoal ini adalah `delete .`.
* Saat perintah ini dijalankan:
* Nama file pada server akan berubah menjadi `old-.`.
* Hapus row dari file tersebut di **file.tsv**.### Pennyelesaian Soal
1. Pastikan client sudah login ke server.
2. Dapatkan nama file dan ekstensi dari file yang ingin dihapus.
3. Pastikan file tersebut ada di **files.tsv**.
1. Jika tidak ada, tampilkan pesan **Error, file hasn't been downloaded** ke client.
2. Kembali ke menu pemilihan perintah.
4. Hapus kolom dari file tersebut di **file.tsv**.
1. Copy setiap baris dari **file.tsv** ke file baru bernama **temp**.
* Nama file yang ingin dihapus tidak ikut dicopy.
2. Hapus **file.tsv** .
3. Ganti nama **temp** menjadi **file.tsv**.
5. Ganti nama file.## Subsoal f
### Penjelasan Soal
* Perintah pada subsoal ini adalah `see`.
* Saat perintah ini dijalankan, akan tampil isi **files.tsv** di terminal client dengan format berikut:
```
Nama:
Publisher:
Tahun publishing:
Ekstensi File:
Filepath:Nama:
Publisher:
Tahun publishing:
Ekstensi File:
Filepath:```
### Penyelesaian Soal
1. Pastikan client sudah login ke server.
2. Scan isi **files.tsv** dengan perintah `fscanf`.
3. Parse setiap baris dari **files.tsv** untuk mendapatkan lima data yang akan diprint.
4. Print kelima data tersebut ke terminal client dengan perintah `send` atau `write`.### Output
## Subsoal g
### Penjelasan Soal
* Perintah pada subsoal ini adalah `find `
* Hasilnya adalah semua nama file yang mengantung `` yang ditulis pada perintah `find`.
* Format output sama dengan format pada subsoal f.### Penyelesaian Soal
1. Pastikan client sudah login ke server.
2. Dapatkan ``.
3. Lakukan modifikasi berikut ini pada penyelesaian soal 1f.
4. Setelah langkah 3 pada penyelesaian soal 1f, cek apakah nama file mengandung ``.
5. Jika iya, print detail dari file tersebut ke terminal client.### Output
## Subsoal h
### Penjelasan Soal
* Buat log untuk perintah `add` dan `delete` di file `running.log`.
* Format log:
```
Tambah : File1.ektensi (id:pass)
Hapus : File2.ektensi (id:pass)
```### Penyelesaian Soal
1. Simpan id dan pass user yang ter-login ke dalam array `auth_user`.
2. Catat log setelah perintah berhasil dijalankan.### Output
# Soal 2
* Soal ini dikerjakan oleh 05111940000074 - Nur Ahmad Khatim.
* Semua matriks berasal dari input ke program.
* Dilarang menggunakan system().## Subsoal a
### Penjelasan
* Membuat program perkalian matrix (4x3 dengan 3x6) dan menampilkan hasilnya.
* Matriks nantinya akan berisi angka 1-20 (tidak perlu dibuat filter angka).### Penyelesaian
* Membuat program input matriks 4x3 menggunakan for looping
* Membuat program input matriks 3x6 menggunakan for looping
* Hasil dari perkalian matriks distore ke variabel value yang akan digunakan bersama untuk soal2b
* Menampilkan Hasil perkalian sebelum matriks digunakan oleh program soal2b## Subsoal b
### Penjelasan
* Membuat program dengan menggunakan matriks output dari program soal2a (menggunakan shared memory)
* Matriks akan dilakukan perhitungan dengan matrix baru (input user).
* Perhitungannya adalah setiap cel yang berasal dari matriks A menjadi angka untuk faktorial, lalu cel dari matriks B menjadi batas maksimal faktorialnya (dari paling besar ke paling kecil) (menggunakan thread).### Penyelesaian
* Menerima input matriks value dari program soal2a menggunakan shared memory
* Membuat program input untuk matriks baru dengan ukuran 4x6
* Menggunakan thread untuk melakukan operasi di setiap cell pada matriks value
* Di setiap thread menjalankan fungsi factorial untuk menghasilkan matriks yang diinginkan
* Di setiap thread, dijoinkan yang kemudian semua hasilnya digabung dan dipassing untuk diprint## Subsoal c
### Penjelasan
* Membuat program untuk mengecek 5 proses teratas apa saja yang memakan resource di komputer
* Menggunakan command "ps aux | sort -nrk 3,3 | head -5"
* Menggunakan IPC Pipes### Penyelesaian
* Fork pertama : Menerima input dari stdin ps aux kemudian dikirim ke pipe1
* Fork kedua : Menerima input dari pipe1 kemudian kemudian diconcatenated dengan sort -nrk 3,3 dan dituliskan pada pipe2
* Fork ketiga : Menerima input dari pipe2 kemudian diconcatenated dengan head -5 dan dikirim ke stdout# Soal 3
* Soal ini dikerjakan oleh 05111940000087 - William Handi Wijaya dan 05111940000212 - Fadhil Dimas Sucahyo.
* Kategori folder harus dibuat melalui program C.
* Program ini tidak case sensitive (**JPG" == **jpg**).
* Jika ekstensi lebih dari satu (**.tar.gz**), maka file akan masuk ke folder dengan titik terdepan (**tar.gz**).
* Dilarang menggunakan `for-exec` dan `system()`.
* Subsoal b dan c bersifat **rekursif**.## Subsoal a
### Penjelasan
* Program bisa mengelompokan file dengan flag `-f`.
* Format dari perintah adalah `./soal3 -f [.]`.
* `[]` menandakan sebuah array/himpunan.
* Perintah ini akan mengelompokan file di dalam `[.]` ke folder yang sesuai dengan extensinya.
* Jika terdapat lebih dari satu ekstensi (**.tar.gz**), file dimasukan ke dalam folder titik terdepan (**tar.gz**).
* Jika pengelompokan suatu file berhasil, tampilkan `File : Berhasil Dikategorisasikan`.
* Jika gagal, tampilkan `File : Sad, gagal :(`.
* Variabel `` dimulai dari 1.### Penyelesaian
1. Pastikan bahwa perintah memiliki flag yang valid dan minimal 1 file yang akan dikelompokkan.
* Jika jumlah kata pada perintah < 3, print `Tidak ada flag/file yang akan dikelompokan`.
* Jika flag tidak valid, print `Flag tidak valid`.
* Flag dalam subsoal ini adalah `-f`.
2. Dapatkan banyak file dan path milik setiap file yang akan dikelompokan.
3. Untuk setiap file, lakukan hal berikut:
1. Pastikan bahwa input file ada pada path yang tertera dan bukan merupakan folder.
* Jika tidak sesuai, gagalkan operasi dan lanjut ke input file berikutnya.
2. Dapatkan ekstensi dari file dan simpan ke dalam variabel `ext`.
* Jika terdapat lebih dari satu ekstensi (**.tar.gz**), file dimasukan ke dalam folder titik terdepan (**tar.gz**).
3. Jika belum ada folder bernama `ext`, buat folder tersebut.
4. Pindahkan file ke folder `ext`.
5. Jika berhasil, tampilkan `File : Berhasil Dikategorisasikan`.
6. Jika gagal, tampilkan `File : Sad, gagal :(`.## Subsoal b
### Penjelasan
* Program dapat melakukan pengkategorisasian direktori dengan flag `-d`.
* Format dari perintah adalah: `./soal3 -d `.
* Jika berhasil, tampilkan `Direktori sukses disimpan!`.
* Jika gagal, tampilkan `Yah, gagal disimpan :(`.### Penyelesaian
1. Traverse semua file yang ada di dalam direktori secara rekursif.
2. Kategorisasikan setiap file dan simpan pada working directory program C.## Subsoal c
### Penjelasan
* Program dapat menerima flag `*`.
* Perintah ini akan mengkategorikan seluruh file yg ada di working directory.### Penyelesaian
* Jalankan fungsi pada subsoal b di current working directory.## Subsoal d
### Penjelasan
* File yang tidak memiliki ekstensi disimpan di folder `Unknown`.
* File hidden disimpan di folder `Hidden`.
* File hidden adalah file yang namanya diawali oleh `.`.### Penyelesaian
* Pada fungsi `getExtension`, return string `Hidden` dan `Unknown` sesuai ketentuan yang berlaku.## Subsoal e
### Penjelasan
* Setiap 1 file dikategorikan dalam 1 thread.### Penyelesaian
* Pada penyelesaian subsoal a, lakukan penyelesaian no.3 dalam thread.# Kendala
* Pada soal1, debug pada `thread`, `server.c`, dan `client.c` sulit untuk dilakukan.